mirror of
				https://gitee.com/technical-laohu/mpay.git
				synced 2025-11-04 16:53:44 +08:00 
			
		
		
		
	添加引导安装程序
This commit is contained in:
		@@ -22,17 +22,7 @@ class IndexController
 | 
			
		||||
    }
 | 
			
		||||
    public function test()
 | 
			
		||||
    {
 | 
			
		||||
        $info = request()->post();
 | 
			
		||||
        $action = isset($info['action']) ? $info['action'] : '';
 | 
			
		||||
        if ($action === 'mpay') {
 | 
			
		||||
            $data = json_decode($info['data'], true);
 | 
			
		||||
            $config = \think\facade\Config::load("payconfig/{$data['pid']}_{$data['aid']}", 'payconfig');
 | 
			
		||||
            $payclient_path = "\\payclient\\{$config['pay']['payclass']}";
 | 
			
		||||
            $Payclient = new $payclient_path($info, $config);
 | 
			
		||||
            $res = $Payclient->notify();
 | 
			
		||||
            return $res;
 | 
			
		||||
        } else {
 | 
			
		||||
            return 202;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            return app()->getBasePath();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										196
									
								
								app/controller/InstallController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								app/controller/InstallController.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,196 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace app\controller;
 | 
			
		||||
 | 
			
		||||
use think\facade\Db;
 | 
			
		||||
use think\Request;
 | 
			
		||||
use think\facade\View;
 | 
			
		||||
 | 
			
		||||
class InstallController
 | 
			
		||||
{
 | 
			
		||||
    public function index()
 | 
			
		||||
    {
 | 
			
		||||
        // 检查是否已经安装过
 | 
			
		||||
        if ($this->checkLock()) {
 | 
			
		||||
            return redirect('User/login');
 | 
			
		||||
        };
 | 
			
		||||
        return View::fetch();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function install(Request $request)
 | 
			
		||||
    {
 | 
			
		||||
        // 检查是否已经安装过
 | 
			
		||||
        if ($this->checkLock()) {
 | 
			
		||||
            return backMsg(1, '已经安装');
 | 
			
		||||
        };
 | 
			
		||||
        // 获取表单提交的数据库配置信息
 | 
			
		||||
        $dbConfig = $request->post();
 | 
			
		||||
 | 
			
		||||
        // 保存数据库配置信息到配置文件
 | 
			
		||||
        $this->saveDbConfig($dbConfig);
 | 
			
		||||
 | 
			
		||||
        // 连接数据库并建表
 | 
			
		||||
        $is_succ_tb = $this->createTables();
 | 
			
		||||
 | 
			
		||||
        // 初始化数据记录
 | 
			
		||||
        $is_succ_data = $this->initData($dbConfig);
 | 
			
		||||
 | 
			
		||||
        // 安装检测
 | 
			
		||||
        if (!$is_succ_tb) {
 | 
			
		||||
            return json(backMsg(1, '数据表创建失败'));
 | 
			
		||||
        }
 | 
			
		||||
        if (!$is_succ_data) {
 | 
			
		||||
            return json(backMsg(1, '数据初始化失败'));
 | 
			
		||||
        }
 | 
			
		||||
        // 安装成功,写入安装锁文件
 | 
			
		||||
        $this->setLock();
 | 
			
		||||
        return json(backMsg(0, '安装成功'));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function saveDbConfig($dbConfig)
 | 
			
		||||
    {
 | 
			
		||||
        $envPath = app()->getRootPath() . '.env';
 | 
			
		||||
        $envContent = <<<EOT
 | 
			
		||||
APP_DEBUG = true
 | 
			
		||||
 | 
			
		||||
DB_TYPE = mysql
 | 
			
		||||
DB_HOST = {$dbConfig['host']}
 | 
			
		||||
DB_NAME = {$dbConfig['name']}
 | 
			
		||||
DB_USER = {$dbConfig['user']}
 | 
			
		||||
DB_PASS = {$dbConfig['pass']}
 | 
			
		||||
DB_PORT = {$dbConfig['port']}
 | 
			
		||||
DB_CHARSET = {$dbConfig['charset']}
 | 
			
		||||
DB_PREFIX = mpay_
 | 
			
		||||
 | 
			
		||||
DEFAULT_LANG = zh-cn
 | 
			
		||||
EOT;
 | 
			
		||||
        file_put_contents($envPath, $envContent);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function createTables()
 | 
			
		||||
    {
 | 
			
		||||
        // 连接数据库
 | 
			
		||||
        $db = Db::connect();
 | 
			
		||||
        if ($db === false) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        // 创建order表的 SQL 语句
 | 
			
		||||
        $sql = "CREATE TABLE `mpay_order` (
 | 
			
		||||
  `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
			
		||||
  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '商户ID',
 | 
			
		||||
  `order_id` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '订单号',
 | 
			
		||||
  `type` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '支付类型',
 | 
			
		||||
  `out_trade_no` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '商户订单号',
 | 
			
		||||
  `notify_url` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '异步通知地址',
 | 
			
		||||
  `return_url` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '跳转通知地址',
 | 
			
		||||
  `name` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '商品名称',
 | 
			
		||||
  `really_price` float NOT NULL DEFAULT '0' COMMENT '实际支付金额',
 | 
			
		||||
  `money` float NOT NULL DEFAULT '0' COMMENT '订单价格',
 | 
			
		||||
  `clientip` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '用户IP地址',
 | 
			
		||||
  `device` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '设备类型',
 | 
			
		||||
  `param` varchar(720) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '扩展参数',
 | 
			
		||||
  `state` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态',
 | 
			
		||||
  `patt` tinyint(4) NOT NULL DEFAULT '0' COMMENT '开启回调监听',
 | 
			
		||||
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单创建时间',
 | 
			
		||||
  `close_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单关闭时间',
 | 
			
		||||
  `pay_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '支付时间',
 | 
			
		||||
  `platform_order` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '收款平台订单号',
 | 
			
		||||
  `aid` int(11) NOT NULL DEFAULT '0' COMMENT '收款账号ID',
 | 
			
		||||
  `cid` int(11) NOT NULL DEFAULT '0' COMMENT '收款码ID',
 | 
			
		||||
  `delete_time` timestamp NULL DEFAULT NULL COMMENT '软删除',
 | 
			
		||||
  PRIMARY KEY (`id`) USING BTREE
 | 
			
		||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;";
 | 
			
		||||
 | 
			
		||||
        // 执行 SQL 语句创建表
 | 
			
		||||
        $db->execute("DROP TABLE IF EXISTS `mpay_order`;");
 | 
			
		||||
        $db->execute($sql);
 | 
			
		||||
 | 
			
		||||
        // 创建pay_account表的 SQL 语句
 | 
			
		||||
        $sql = "CREATE TABLE `mpay_pay_account` (
 | 
			
		||||
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '收款平台ID',
 | 
			
		||||
  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
 | 
			
		||||
  `platform` varchar(255) NOT NULL DEFAULT '' COMMENT '收款平台',
 | 
			
		||||
  `account` varchar(255) NOT NULL DEFAULT '' COMMENT '账号',
 | 
			
		||||
  `password` varchar(255) NOT NULL DEFAULT '' COMMENT '密码',
 | 
			
		||||
  `state` tinyint(4) NOT NULL DEFAULT '1' COMMENT '启用',
 | 
			
		||||
  `pattern` tinyint(4) NOT NULL DEFAULT '1' COMMENT '账号监听模式',
 | 
			
		||||
  `params` varchar(255) NOT NULL DEFAULT '' COMMENT '自定义查询',
 | 
			
		||||
  `delete_time` timestamp NULL DEFAULT NULL COMMENT '软删除',
 | 
			
		||||
  PRIMARY KEY (`id`) USING BTREE
 | 
			
		||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;";
 | 
			
		||||
 | 
			
		||||
        // 执行 SQL 语句创建表
 | 
			
		||||
        $db->execute("DROP TABLE IF EXISTS `mpay_pay_account`;");
 | 
			
		||||
        $db->execute($sql);
 | 
			
		||||
 | 
			
		||||
        // 创建pay_channel表的 SQL 语句
 | 
			
		||||
        $sql = "CREATE TABLE `mpay_pay_channel` (
 | 
			
		||||
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '渠道ID',
 | 
			
		||||
  `account_id` int(11) NOT NULL DEFAULT '0' COMMENT '收款平台ID',
 | 
			
		||||
  `channel` varchar(255) NOT NULL DEFAULT '' COMMENT '收款通道',
 | 
			
		||||
  `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '保存类型',
 | 
			
		||||
  `qrcode` varchar(255) NOT NULL DEFAULT '' COMMENT '二维码',
 | 
			
		||||
  `last_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最近使用',
 | 
			
		||||
  `state` tinyint(4) NOT NULL DEFAULT '1' COMMENT '启用',
 | 
			
		||||
  `delete_time` timestamp NULL DEFAULT NULL COMMENT '软删除',
 | 
			
		||||
  PRIMARY KEY (`id`) USING BTREE
 | 
			
		||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;";
 | 
			
		||||
 | 
			
		||||
        // 执行 SQL 语句创建表
 | 
			
		||||
        $db->execute("DROP TABLE IF EXISTS `mpay_pay_channel`;");
 | 
			
		||||
        $db->execute($sql);
 | 
			
		||||
 | 
			
		||||
        // 创建user表的 SQL 语句
 | 
			
		||||
        $sql = "CREATE TABLE `mpay_user` (
 | 
			
		||||
  `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
			
		||||
  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '商户ID',
 | 
			
		||||
  `secret_key` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '商户秘钥',
 | 
			
		||||
  `nickname` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '用户昵称',
 | 
			
		||||
  `username` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '账号',
 | 
			
		||||
  `password` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '密码',
 | 
			
		||||
  `state` tinyint(4) NOT NULL DEFAULT '1' COMMENT '启用状态 0:禁用 1:启用',
 | 
			
		||||
  `role` tinyint(4) NOT NULL DEFAULT '0' COMMENT '用户角色 0:普通用户 1:管理员',
 | 
			
		||||
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
 | 
			
		||||
  `delete_time` timestamp NULL DEFAULT NULL COMMENT '软删除',
 | 
			
		||||
  PRIMARY KEY (`id`) USING BTREE
 | 
			
		||||
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;";
 | 
			
		||||
 | 
			
		||||
        // 执行 SQL 语句创建表
 | 
			
		||||
        $db->execute("DROP TABLE IF EXISTS `mpay_user`;");
 | 
			
		||||
        $db->execute($sql);
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function initData($dbConfig)
 | 
			
		||||
    {
 | 
			
		||||
        // 连接数据库
 | 
			
		||||
        $db = Db::connect();
 | 
			
		||||
        $info = [
 | 
			
		||||
            'secret_key' => md5(1000 . time() . mt_rand()),
 | 
			
		||||
            'nickname' => $dbConfig['nickname'],
 | 
			
		||||
            'username' => $dbConfig['username'],
 | 
			
		||||
            'password' => password_hash($dbConfig['password'], PASSWORD_DEFAULT),
 | 
			
		||||
        ];
 | 
			
		||||
        // 初始化数据的 SQL 语句
 | 
			
		||||
        $sql = "INSERT INTO `mpay_user` (`id`, `pid`, `secret_key`, `nickname`, `username`, `password`, `state`, `role`) VALUES (1, 1000, :secret_key, :nickname, :username, :password, 1, 1);";
 | 
			
		||||
 | 
			
		||||
        // 执行 SQL 语句插入初始数据
 | 
			
		||||
        $is_succ = $db->execute($sql, $info);
 | 
			
		||||
        if (!$is_succ) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    private function checkLock()
 | 
			
		||||
    {
 | 
			
		||||
        $path = runtime_path() . 'install.lock';
 | 
			
		||||
        return file_exists($path);
 | 
			
		||||
    }
 | 
			
		||||
    private function setLock()
 | 
			
		||||
    {
 | 
			
		||||
        $path = runtime_path() . 'install.lock';
 | 
			
		||||
        file_put_contents($path, time());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -32,7 +32,7 @@ class UserController extends BaseController
 | 
			
		||||
    // 修改用户
 | 
			
		||||
    public function setUser()
 | 
			
		||||
    {
 | 
			
		||||
        $userinfo = User::find(\session('userid'))->toArray();
 | 
			
		||||
        $userinfo = User::find(session('userid'))->toArray();
 | 
			
		||||
        View::assign($userinfo);
 | 
			
		||||
        return View::fetch();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ class UserController extends BaseController
 | 
			
		||||
            Session::set('nickname', $userinfo['data']->nickname);
 | 
			
		||||
            Session::set('userrole', $userinfo['data']->role);
 | 
			
		||||
            Session::set('islogin', true);
 | 
			
		||||
            return json(\backMsg(0, 'ok'));
 | 
			
		||||
            return json(backMsg(0, 'ok'));
 | 
			
		||||
        } else {
 | 
			
		||||
            return json($userinfo);
 | 
			
		||||
        }
 | 
			
		||||
@@ -30,26 +30,42 @@ class UserController extends BaseController
 | 
			
		||||
    public function logout()
 | 
			
		||||
    {
 | 
			
		||||
        Session::clear();
 | 
			
		||||
        return json(\backMsg(0, '注销成功'));
 | 
			
		||||
        return json(backMsg(0, '注销成功'));
 | 
			
		||||
    }
 | 
			
		||||
    public function editUser()
 | 
			
		||||
    {
 | 
			
		||||
        $userid = \session('userid');
 | 
			
		||||
        $userid = session('userid');
 | 
			
		||||
        $info = $this->request->post();
 | 
			
		||||
        $res = User::update($info, ['id' => $userid]);
 | 
			
		||||
        if (!$res) {
 | 
			
		||||
            return json(\backMsg(1, '修改失败'));
 | 
			
		||||
            return json(backMsg(1, '修改失败'));
 | 
			
		||||
        }
 | 
			
		||||
        return json(backMsg(0, '重置成功'));
 | 
			
		||||
    }
 | 
			
		||||
    public function changePassword()
 | 
			
		||||
    {
 | 
			
		||||
        $userid = session('userid');
 | 
			
		||||
        $user_info = User::find($userid);
 | 
			
		||||
        $post_info = $this->request->post();
 | 
			
		||||
        if (password_verify($post_info['old_password'], $user_info->password)) {
 | 
			
		||||
            $new_password = password_hash($post_info['new_password'], PASSWORD_DEFAULT);
 | 
			
		||||
            $res = User::update(['password' => $new_password], ['id' => $userid]);
 | 
			
		||||
            if (!$res) {
 | 
			
		||||
                return json(backMsg(1, '修改失败'));
 | 
			
		||||
            }
 | 
			
		||||
            return json(backMsg(0, '修改成功'));
 | 
			
		||||
        } else {
 | 
			
		||||
            return json(backMsg(1, '原密码错误'));
 | 
			
		||||
        }
 | 
			
		||||
        return json(\backMsg(0, '重置成功'));
 | 
			
		||||
    }
 | 
			
		||||
    public function resetKey()
 | 
			
		||||
    {
 | 
			
		||||
        $userid = \session('userid');
 | 
			
		||||
        $userid = session('userid');
 | 
			
		||||
        $res = User::update(['secret_key' => $this->generateKey()], ['id' => $userid]);
 | 
			
		||||
        if (!$res) {
 | 
			
		||||
            return json(\backMsg(1, '重置失败'));
 | 
			
		||||
            return json(backMsg(1, '重置失败'));
 | 
			
		||||
        }
 | 
			
		||||
        return json(\backMsg(0, '重置成功'));
 | 
			
		||||
        return json(backMsg(0, '重置成功'));
 | 
			
		||||
    }
 | 
			
		||||
    private function checkUser(array $login_info): array
 | 
			
		||||
    {
 | 
			
		||||
@@ -57,16 +73,16 @@ class UserController extends BaseController
 | 
			
		||||
        $password = $login_info['password'];
 | 
			
		||||
        $userinfo = User::where('username', $username)->find();
 | 
			
		||||
        if ($userinfo) {
 | 
			
		||||
            if ($password === $userinfo->password) {
 | 
			
		||||
            if (password_verify($password, $userinfo->password)) {
 | 
			
		||||
                return ['code' => 0, 'data' => $userinfo];
 | 
			
		||||
            } else {
 | 
			
		||||
                return \backMsg(1, '登陆密码错误');
 | 
			
		||||
                return backMsg(1, '登陆密码错误');
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            return \backMsg(2, '用户不存在');
 | 
			
		||||
            return backMsg(2, '用户不存在');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    private function generateKey()
 | 
			
		||||
    private function generateKey(bool $strong = true)
 | 
			
		||||
    {
 | 
			
		||||
        $bytes = openssl_random_pseudo_bytes(16, $strong);
 | 
			
		||||
        if ($strong) {
 | 
			
		||||
 
 | 
			
		||||
@@ -59,7 +59,7 @@ return array (
 | 
			
		||||
    'price' => '49.00',
 | 
			
		||||
    'describe' => '数字门店',
 | 
			
		||||
    'website' => 'https://store.zhihuijingyingba.com/',
 | 
			
		||||
    'state' => 1,
 | 
			
		||||
    'state' => 0,
 | 
			
		||||
    'query' => 
 | 
			
		||||
    array (
 | 
			
		||||
      'pageNo' => 1,
 | 
			
		||||
@@ -79,7 +79,7 @@ return array (
 | 
			
		||||
    'price' => '59.00',
 | 
			
		||||
    'describe' => '为商户和消费者提供安全、便捷、高效的支付产品与服务助力商户提升运营效率,实现数字化运营',
 | 
			
		||||
    'website' => 'https://xym.ysepay.com/',
 | 
			
		||||
    'state' => 1,
 | 
			
		||||
    'state' => 0,
 | 
			
		||||
    'query' => 
 | 
			
		||||
    array (
 | 
			
		||||
      'storeNo' => '',
 | 
			
		||||
@@ -102,7 +102,7 @@ return array (
 | 
			
		||||
    'price' => '49.00',
 | 
			
		||||
    'describe' => '码钱商管平台',
 | 
			
		||||
    'website' => 'https://m.hkrt.cn/',
 | 
			
		||||
    'state' => 1,
 | 
			
		||||
    'state' => 0,
 | 
			
		||||
    'query' => 
 | 
			
		||||
    array (
 | 
			
		||||
      'terminalType' => '',
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										135
									
								
								view/Install/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								view/Install/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,135 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <title>程序安装</title>
 | 
			
		||||
    <link rel="stylesheet" href="/component/pear/css/pear.css" />
 | 
			
		||||
    <style>
 | 
			
		||||
 | 
			
		||||
    </style>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
 | 
			
		||||
    <div class="layui-container" style="margin-top: 50px;">
 | 
			
		||||
        <div class="layui-row">
 | 
			
		||||
            <div class="layui-col-md8 layui-col-md-offset2">
 | 
			
		||||
                <form class="layui-form">
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <label class="layui-form-label">数据库地址</label>
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <input type="text" name="host" required lay-verify="required" placeholder="请输入数据库地址"
 | 
			
		||||
                                autocomplete="off" class="layui-input" value="localhost">
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <label class="layui-form-label">端口</label>
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <input type="text" name="port" required lay-verify="required" placeholder="请输入数据库名称"
 | 
			
		||||
                                autocomplete="off" class="layui-input" value="3306">
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <label class="layui-form-label">编码</label>
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <input type="text" name="charset" required lay-verify="required" placeholder="请输入数据库名称"
 | 
			
		||||
                                autocomplete="off" class="layui-input" value="utf8mb4">
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <label class="layui-form-label">数据库</label>
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <input type="text" name="name" required lay-verify="required" placeholder="请输入数据库名称"
 | 
			
		||||
                                autocomplete="off" class="layui-input" value="">
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <label class="layui-form-label">用户名</label>
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <input type="text" name="user" required lay-verify="required" placeholder="请输入数据库用户名"
 | 
			
		||||
                                autocomplete="off" class="layui-input" value="root">
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <label class="layui-form-label">密码</label>
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <input type="password" name="pass" required lay-verify="required" placeholder="请输入数据库密码"
 | 
			
		||||
                                autocomplete="off" class="layui-input">
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <hr style="margin: 24px 0px;" />
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <label class="layui-form-label">管理员昵称</label>
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <input type="text" name="nickname" required lay-verify="required" placeholder="请输入管理员昵称"
 | 
			
		||||
                                autocomplete="off" class="layui-input" value="管理大大">
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <label class="layui-form-label">管理员账号</label>
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <input type="text" name="username" required lay-verify="required" placeholder="请输入管理员用户名"
 | 
			
		||||
                                autocomplete="off" class="layui-input" value="admin">
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <label class="layui-form-label">管理员密码</label>
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <input type="password" name="password" required lay-verify="required" placeholder="请输入管理员密码"
 | 
			
		||||
                                autocomplete="off" class="layui-input">
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="layui-form-item">
 | 
			
		||||
                        <div class="layui-input-block">
 | 
			
		||||
                            <button class="layui-btn" lay-submit lay-filter="formSubmit">立即安装</button>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </form>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <script src="/component/layui/layui.js"></script>
 | 
			
		||||
    <script src="/component/pear/pear.js"></script>
 | 
			
		||||
    <script>
 | 
			
		||||
        layui.use(['form'], function () {
 | 
			
		||||
            var form = layui.form;
 | 
			
		||||
            var layer = layui.layer;
 | 
			
		||||
 | 
			
		||||
            // 监听提交
 | 
			
		||||
            form.on('submit(formSubmit)', function (data) {
 | 
			
		||||
                const field = data.field;
 | 
			
		||||
                // 提交表单
 | 
			
		||||
                fetch('/install/install', {
 | 
			
		||||
                    method: 'POST',
 | 
			
		||||
                    headers: {
 | 
			
		||||
                        'Content-Type': 'application/json'
 | 
			
		||||
                    },
 | 
			
		||||
                    body: JSON.stringify(field)
 | 
			
		||||
                }).then(res => {
 | 
			
		||||
                    if (res.ok) {
 | 
			
		||||
                        return res.json();
 | 
			
		||||
                    }
 | 
			
		||||
                    throw new Error('数据库配置错误');
 | 
			
		||||
                }).then(res => {
 | 
			
		||||
                    if (res.code == 0) {
 | 
			
		||||
                        layer.msg(res.msg, {
 | 
			
		||||
                            time: 1000,
 | 
			
		||||
                            end: () => {
 | 
			
		||||
                                window.location.href = '/User/login';
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
                    } else {
 | 
			
		||||
                        layer.msg(res.msg);
 | 
			
		||||
                    }
 | 
			
		||||
                }).catch(err => {
 | 
			
		||||
                    layer.msg(err.message);
 | 
			
		||||
                })
 | 
			
		||||
                return false;
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    </script>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
@@ -16,14 +16,6 @@
 | 
			
		||||
    <form id="set-user" class="layui-form layui-form-pane" action="" lay-filter="set-user">
 | 
			
		||||
        <div class="mainBox">
 | 
			
		||||
            <div class="main-container">
 | 
			
		||||
                <div class="layui-form-item" pane>
 | 
			
		||||
                    <label class="layui-form-label">ID</label>
 | 
			
		||||
                    <div class="layui-input-block">
 | 
			
		||||
                        <div class="layui-form-mid inputTxt">
 | 
			
		||||
                            <?php echo $pid ?>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="layui-form-item" pane>
 | 
			
		||||
                    <label class="layui-form-label">账号</label>
 | 
			
		||||
                    <div class="layui-input-block">
 | 
			
		||||
@@ -35,13 +27,18 @@
 | 
			
		||||
                <div class="layui-form-item">
 | 
			
		||||
                    <label class="layui-form-label">昵称</label>
 | 
			
		||||
                    <div class="layui-input-block">
 | 
			
		||||
                        <input type="text" name="nickname" autocomplete="off" class="layui-input">
 | 
			
		||||
                        <input type="text" name="nickname" autocomplete="off" class="layui-input"
 | 
			
		||||
                            value="<?php echo $nickname ?>">
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="layui-form-item">
 | 
			
		||||
                <div class="layui-form-item" pane>
 | 
			
		||||
                    <label class="layui-form-label">密码</label>
 | 
			
		||||
                    <div class="layui-input-block">
 | 
			
		||||
                        <input type="text" name="password" autocomplete="off" class="layui-input">
 | 
			
		||||
                        <div class="layui-form-mid inputTxt" style="float: none;">
 | 
			
		||||
                            ********
 | 
			
		||||
                            <a href="javascript:;" lay-on="changePw" style="float: right;" title="修改密码"><span
 | 
			
		||||
                                    class="icon pear-icon pear-icon-edit"></span></a>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
@@ -60,24 +57,51 @@
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </form>
 | 
			
		||||
 | 
			
		||||
    <script type="text/html" id="changePassWord">
 | 
			
		||||
        <div class="main-container">
 | 
			
		||||
            <form class="layui-form layui-form-pane">
 | 
			
		||||
              <div class="layui-form-item">
 | 
			
		||||
                <label class="layui-form-label">原密码</label>
 | 
			
		||||
                <div class="layui-input-block">
 | 
			
		||||
                  <input type="password" name="old_password" required lay-verify="required" placeholder="请输入原密码"
 | 
			
		||||
                    autocomplete="off" class="layui-input">
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
              <div class="layui-form-item">
 | 
			
		||||
                <label class="layui-form-label">新密码</label>
 | 
			
		||||
                <div class="layui-input-block">
 | 
			
		||||
                  <input type="password" name="new_password" required lay-verify="required" placeholder="请输入新密码"
 | 
			
		||||
                    autocomplete="off" class="layui-input">
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
              <div class="layui-form-item">
 | 
			
		||||
                <label class="layui-form-label">确认密码</label>
 | 
			
		||||
                <div class="layui-input-block">
 | 
			
		||||
                  <input type="password" name="confirm_password" required lay-verify="required" placeholder="请再次输入新密码"
 | 
			
		||||
                    autocomplete="off" class="layui-input">
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
              <div class="layui-form-item">
 | 
			
		||||
                <div class="layui-input-block">
 | 
			
		||||
                  <button class="layui-btn" lay-submit lay-filter="changePassWord">确认修改</button>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </form>
 | 
			
		||||
          </div>
 | 
			
		||||
    </script>
 | 
			
		||||
    <script src="/component/layui/layui.js"></script>
 | 
			
		||||
    <script src="/component/pear/pear.js"></script>
 | 
			
		||||
    <script>
 | 
			
		||||
        layui.use(['form'], function () {
 | 
			
		||||
            let form = layui.form;
 | 
			
		||||
 | 
			
		||||
            form.val('set-user', {
 | 
			
		||||
                "nickname": "<?php echo $nickname ?>",
 | 
			
		||||
                "password": "<?php echo $password ?>",
 | 
			
		||||
            });
 | 
			
		||||
            let util = layui.util;
 | 
			
		||||
 | 
			
		||||
            form.on('submit(user-save)', function (obj) {
 | 
			
		||||
                let field = obj.field;
 | 
			
		||||
                (async () => {
 | 
			
		||||
                    const url = '/api/User/editUser';
 | 
			
		||||
                    const info = field;
 | 
			
		||||
                    const res = await fetch(url, { method: 'post', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(info) });
 | 
			
		||||
                    const res = await fetch(url, { method: 'post', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ nickname: info.nickname }) });
 | 
			
		||||
                    if (res.status !== 200) {
 | 
			
		||||
                        layer.msg('请求失败,请重试!', { tips: 2, time: 1200 });
 | 
			
		||||
                        return false;
 | 
			
		||||
@@ -94,10 +118,55 @@
 | 
			
		||||
                })()
 | 
			
		||||
                return false;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            util.on({
 | 
			
		||||
                'changePw': (ele) => {
 | 
			
		||||
                    layer.open({
 | 
			
		||||
                        type: 1,
 | 
			
		||||
                        area: '350px',
 | 
			
		||||
                        resize: false,
 | 
			
		||||
                        shadeClose: true,
 | 
			
		||||
                        title: '修改密码',
 | 
			
		||||
                        content: document.getElementById('changePassWord').innerHTML,
 | 
			
		||||
                        success: () => {
 | 
			
		||||
                            form.on('submit(changePassWord)', (data) => {
 | 
			
		||||
                                var field = data.field;
 | 
			
		||||
                                // 检查新密码和确认密码是否一致
 | 
			
		||||
                                if (field.new_password !== field.confirm_password) {
 | 
			
		||||
                                    layer.msg('新密码和确认密码不一致,请重新输入', { icon: 2 });
 | 
			
		||||
                                    return false;
 | 
			
		||||
                                }
 | 
			
		||||
                                // 密码修改
 | 
			
		||||
                                (async () => {
 | 
			
		||||
                                    const url = '/api/User/changePassword';
 | 
			
		||||
                                    const info = { old_password: field.old_password, new_password: field.new_password };
 | 
			
		||||
                                    const res = await fetch(url, {
 | 
			
		||||
                                        method: 'post',
 | 
			
		||||
                                        headers: { 'Content-Type': 'application/json' },
 | 
			
		||||
                                        body: JSON.stringify(info)
 | 
			
		||||
                                    });
 | 
			
		||||
                                    if (res.status !== 200) {
 | 
			
		||||
                                        layer.msg('请求失败,请重试!', { tips: 2, time: 1200 });
 | 
			
		||||
                                        return false;
 | 
			
		||||
                                    }
 | 
			
		||||
                                    const rec_info = await res.json();
 | 
			
		||||
                                    if (rec_info.code === 0) {
 | 
			
		||||
                                        layer.msg(rec_info.msg, { icon: 1, time: 1200 }, () => {
 | 
			
		||||
                                            parent.layer.close(parent.layer.getFrameIndex(window.name)); //关闭当前页
 | 
			
		||||
                                            parent.location.reload();
 | 
			
		||||
                                        });
 | 
			
		||||
                                    } else {
 | 
			
		||||
                                        layer.msg(rec_info.msg, { icon: 2, time: 1200 });
 | 
			
		||||
                                    }
 | 
			
		||||
                                })()
 | 
			
		||||
                                return false;
 | 
			
		||||
                            });
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        })
 | 
			
		||||
    </script>
 | 
			
		||||
    <script>
 | 
			
		||||
    </script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
		Reference in New Issue
	
	Block a user