Browse Source

Merge remote-tracking branch 'origin/gva_gormv2_dev' into gva_gormv2_dev

pixel 4 years ago
parent
commit
910c857e43

+ 0 - 730
.docker-compose/docker-entrypoint-initdb.d/init.sql

@@ -1,730 +0,0 @@
-/*
- Navicat MySQL Data Transfer
-
- Source Server         : localhost
- Source Server Type    : MySQL
- Source Server Version : 80019
- Source Host           : localhost:3306
- Source Schema         : a
-
- Target Server Type    : MySQL
- Target Server Version : 80019
- File Encoding         : 65001
-
- Date: 11/09/2020 11:15:48
-*/
-
-SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
-
--- ----------------------------
--- Table structure for casbin_rule
--- ----------------------------
-DROP TABLE IF EXISTS `casbin_rule`;
-CREATE TABLE `casbin_rule` (
-  `p_type` varchar(100) DEFAULT NULL,
-  `v0` varchar(100) DEFAULT NULL,
-  `v1` varchar(100) DEFAULT NULL,
-  `v2` varchar(100) DEFAULT NULL,
-  `v3` varchar(100) DEFAULT NULL,
-  `v4` varchar(100) DEFAULT NULL,
-  `v5` varchar(100) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of casbin_rule
--- ----------------------------
-BEGIN;
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/base/login', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/base/register', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/api/createApi', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/api/getApiList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/api/getApiById', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/api/deleteApi', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/api/updateApi', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/api/getAllApis', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/authority/createAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/authority/deleteAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/authority/getAuthorityList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/authority/setDataAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/authority/updateAuthority', 'PUT', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/authority/copyAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/menu/getMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/menu/getMenuList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/menu/addBaseMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/menu/getBaseMenuTree', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/menu/addMenuAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/menu/getMenuAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/menu/deleteBaseMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/menu/updateBaseMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/menu/getBaseMenuById', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/user/changePassword', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/user/getUserList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/user/setUserAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/user/deleteUser', 'DELETE', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/fileUploadAndDownload/upload', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/fileUploadAndDownload/getFileList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/fileUploadAndDownload/deleteFile', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/casbin/updateCasbin', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/casbin/getPolicyPathByAuthorityId', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/casbin/casbinTest/:pathParam', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/jwt/jsonInBlacklist', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/system/getSystemConfig', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/system/setSystemConfig', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/customer/customer', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/customer/customer', 'PUT', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/customer/customer', 'DELETE', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/customer/customer', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/customer/customerList', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/autoCode/createTemp', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/autoCode/getTables', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/autoCode/getDB', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/autoCode/getColume', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionaryDetail/createSysDictionaryDetail', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionaryDetail/deleteSysDictionaryDetail', 'DELETE', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionaryDetail/updateSysDictionaryDetail', 'PUT', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionaryDetail/findSysDictionaryDetail', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionaryDetail/getSysDictionaryDetailList', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionary/createSysDictionary', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionary/deleteSysDictionary', 'DELETE', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionary/updateSysDictionary', 'PUT', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionary/findSysDictionary', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysDictionary/getSysDictionaryList', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysOperationRecord/createSysOperationRecord', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysOperationRecord/deleteSysOperationRecord', 'DELETE', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysOperationRecord/updateSysOperationRecord', 'PUT', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysOperationRecord/findSysOperationRecord', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysOperationRecord/getSysOperationRecordList', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/sysOperationRecord/deleteSysOperationRecordByIds', 'DELETE', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '888', '/user/setUserInfo', 'PUT', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/base/login', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/base/register', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/api/createApi', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/api/getApiList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/api/getApiById', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/api/deleteApi', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/api/updateApi', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/api/getAllApis', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/authority/createAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/authority/deleteAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/authority/getAuthorityList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/authority/setDataAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/menu/getMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/menu/getMenuList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/menu/addBaseMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/menu/getBaseMenuTree', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/menu/addMenuAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/menu/getMenuAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/menu/deleteBaseMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/menu/updateBaseMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/menu/getBaseMenuById', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/user/changePassword', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/user/getUserList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/user/setUserAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/fileUploadAndDownload/upload', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/fileUploadAndDownload/getFileList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/fileUploadAndDownload/deleteFile', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/casbin/updateCasbin', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/casbin/getPolicyPathByAuthorityId', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/jwt/jsonInBlacklist', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/system/getSystemConfig', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/system/setSystemConfig', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/customer/customer', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/customer/customer', 'PUT', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/customer/customer', 'DELETE', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/customer/customer', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '8881', '/customer/customerList', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/base/login', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/base/register', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/api/createApi', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/api/getApiList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/api/getApiById', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/api/deleteApi', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/api/updateApi', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/api/getAllApis', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/authority/createAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/authority/deleteAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/authority/getAuthorityList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/authority/setDataAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/menu/getMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/menu/getMenuList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/menu/addBaseMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/menu/getBaseMenuTree', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/menu/addMenuAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/menu/getMenuAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/menu/deleteBaseMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/menu/updateBaseMenu', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/menu/getBaseMenuById', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/user/changePassword', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/user/getUserList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/user/setUserAuthority', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/fileUploadAndDownload/upload', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/fileUploadAndDownload/getFileList', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/fileUploadAndDownload/deleteFile', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/casbin/updateCasbin', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/casbin/getPolicyPathByAuthorityId', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/jwt/jsonInBlacklist', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/system/getSystemConfig', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/system/setSystemConfig', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/customer/customer', 'POST', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/customer/customer', 'PUT', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/customer/customer', 'DELETE', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/customer/customer', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/customer/customerList', 'GET', NULL, NULL, NULL);
-INSERT INTO `casbin_rule` VALUES ('p', '9528', '/autoCode/createTemp', 'POST', NULL, NULL, NULL);
-COMMIT;
-
--- ----------------------------
--- Table structure for exa_customers
--- ----------------------------
-DROP TABLE IF EXISTS `exa_customers`;
-CREATE TABLE `exa_customers` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `customer_name` varchar(191) DEFAULT NULL COMMENT '''客户名''',
-  `customer_phone_data` varchar(191) DEFAULT NULL COMMENT '''客户手机号''',
-  `sys_user_id` bigint unsigned DEFAULT NULL COMMENT '''管理ID''',
-  `sys_user_authority_id` varchar(191) DEFAULT NULL COMMENT '''管理角色ID''',
-  PRIMARY KEY (`id`),
-  KEY `idx_exa_customers_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of exa_customers
--- ----------------------------
-BEGIN;
-INSERT INTO `exa_customers` VALUES (1, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '测试客户', '1761111111', 1, '888');
-COMMIT;
-
--- ----------------------------
--- Table structure for exa_file_chunks
--- ----------------------------
-DROP TABLE IF EXISTS `exa_file_chunks`;
-CREATE TABLE `exa_file_chunks` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `exa_file_id` bigint unsigned DEFAULT NULL,
-  `file_chunk_number` bigint DEFAULT NULL,
-  `file_chunk_path` varchar(191) DEFAULT NULL,
-  PRIMARY KEY (`id`),
-  KEY `idx_exa_file_chunks_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Table structure for exa_file_upload_and_downloads
--- ----------------------------
-DROP TABLE IF EXISTS `exa_file_upload_and_downloads`;
-CREATE TABLE `exa_file_upload_and_downloads` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `name` varchar(191) DEFAULT NULL COMMENT '''文件名''',
-  `url` varchar(191) DEFAULT NULL COMMENT '''文件地址''',
-  `tag` varchar(191) DEFAULT NULL COMMENT '''文件标签''',
-  `key` varchar(191) DEFAULT NULL COMMENT '''编号''',
-  PRIMARY KEY (`id`),
-  KEY `idx_exa_file_upload_and_downloads_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of exa_file_upload_and_downloads
--- ----------------------------
-BEGIN;
-INSERT INTO `exa_file_upload_and_downloads` VALUES (1, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '10.png', 'http://qmplusimg.henrongyi.top/gvalogo.png', 'png', '158787308910.png');
-INSERT INTO `exa_file_upload_and_downloads` VALUES (2, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'logo.png', 'http://qmplusimg.henrongyi.top/1576554439myAvatar.png', 'png', '1587973709logo.png');
-COMMIT;
-
--- ----------------------------
--- Table structure for exa_files
--- ----------------------------
-DROP TABLE IF EXISTS `exa_files`;
-CREATE TABLE `exa_files` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `file_name` varchar(191) DEFAULT NULL,
-  `file_md5` varchar(191) DEFAULT NULL,
-  `file_path` varchar(191) DEFAULT NULL,
-  `chunk_total` bigint DEFAULT NULL,
-  `is_finish` tinyint(1) DEFAULT NULL,
-  PRIMARY KEY (`id`),
-  KEY `idx_exa_files_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Table structure for exa_simple_uploaders
--- ----------------------------
-DROP TABLE IF EXISTS `exa_simple_uploaders`;
-CREATE TABLE `exa_simple_uploaders` (
-  `chunk_number` varchar(191) DEFAULT NULL COMMENT '''当前切片标记''',
-  `current_chunk_size` varchar(191) DEFAULT NULL COMMENT '''当前切片容量''',
-  `current_chunk_path` varchar(191) DEFAULT NULL COMMENT '''切片本地路径''',
-  `total_size` varchar(191) DEFAULT NULL COMMENT '''总容量''',
-  `identifier` varchar(191) DEFAULT NULL COMMENT '''文件标识(md5)''',
-  `filename` varchar(191) DEFAULT NULL COMMENT '''文件名''',
-  `total_chunks` varchar(191) DEFAULT NULL COMMENT '''切片总数''',
-  `is_done` tinyint(1) DEFAULT NULL COMMENT '''是否上传完成''',
-  `file_path` varchar(191) DEFAULT NULL COMMENT '''文件本地路径'''
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Table structure for jwt_blacklists
--- ----------------------------
-DROP TABLE IF EXISTS `jwt_blacklists`;
-CREATE TABLE `jwt_blacklists` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `jwt` text COMMENT '''jwt''',
-  PRIMARY KEY (`id`),
-  KEY `idx_jwt_blacklists_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Table structure for sys_apis
--- ----------------------------
-DROP TABLE IF EXISTS `sys_apis`;
-CREATE TABLE `sys_apis` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `path` varchar(191) DEFAULT NULL COMMENT '''api路径''',
-  `description` varchar(191) DEFAULT NULL COMMENT '''api中文描述''',
-  `api_group` varchar(191) DEFAULT NULL COMMENT '''api组''',
-  `method` varchar(191) DEFAULT 'POST',
-  PRIMARY KEY (`id`),
-  KEY `idx_sys_apis_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of sys_apis
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_apis` VALUES (1, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/base/login', '用户登录', 'base', 'POST');
-INSERT INTO `sys_apis` VALUES (2, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/base/register', '用户注册', 'base', 'POST');
-INSERT INTO `sys_apis` VALUES (3, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/api/createApi', '创建api', 'api', 'POST');
-INSERT INTO `sys_apis` VALUES (4, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/api/getApiList', '获取api列表', 'api', 'POST');
-INSERT INTO `sys_apis` VALUES (5, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/api/getApiById', '获取api详细信息', 'api', 'POST');
-INSERT INTO `sys_apis` VALUES (6, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/api/deleteApi', '删除Api', 'api', 'POST');
-INSERT INTO `sys_apis` VALUES (7, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/api/updateApi', '更新Api', 'api', 'POST');
-INSERT INTO `sys_apis` VALUES (8, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/api/getAllApis', '获取所有api', 'api', 'POST');
-INSERT INTO `sys_apis` VALUES (9, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/authority/createAuthority', '创建角色', 'authority', 'POST');
-INSERT INTO `sys_apis` VALUES (10, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/authority/deleteAuthority', '删除角色', 'authority', 'POST');
-INSERT INTO `sys_apis` VALUES (11, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/authority/getAuthorityList', '获取角色列表', 'authority', 'POST');
-INSERT INTO `sys_apis` VALUES (12, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/menu/getMenu', '获取菜单树', 'menu', 'POST');
-INSERT INTO `sys_apis` VALUES (13, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/menu/getMenuList', '分页获取基础menu列表', 'menu', 'POST');
-INSERT INTO `sys_apis` VALUES (14, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/menu/addBaseMenu', '新增菜单', 'menu', 'POST');
-INSERT INTO `sys_apis` VALUES (15, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/menu/getBaseMenuTree', '获取用户动态路由', 'menu', 'POST');
-INSERT INTO `sys_apis` VALUES (16, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/menu/addMenuAuthority', '增加menu和角色关联关系', 'menu', 'POST');
-INSERT INTO `sys_apis` VALUES (17, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/menu/getMenuAuthority', '获取指定角色menu', 'menu', 'POST');
-INSERT INTO `sys_apis` VALUES (18, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/menu/deleteBaseMenu', '删除菜单', 'menu', 'POST');
-INSERT INTO `sys_apis` VALUES (19, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/menu/updateBaseMenu', '更新菜单', 'menu', 'POST');
-INSERT INTO `sys_apis` VALUES (20, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/menu/getBaseMenuById', '根据id获取菜单', 'menu', 'POST');
-INSERT INTO `sys_apis` VALUES (21, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/user/changePassword', '修改密码', 'user', 'POST');
-INSERT INTO `sys_apis` VALUES (23, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/user/getUserList', '获取用户列表', 'user', 'POST');
-INSERT INTO `sys_apis` VALUES (24, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/user/setUserAuthority', '修改用户角色', 'user', 'POST');
-INSERT INTO `sys_apis` VALUES (25, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/fileUploadAndDownload/upload', '文件上传示例', 'fileUploadAndDownload', 'POST');
-INSERT INTO `sys_apis` VALUES (26, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/fileUploadAndDownload/getFileList', '获取上传文件列表', 'fileUploadAndDownload', 'POST');
-INSERT INTO `sys_apis` VALUES (27, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/casbin/updateCasbin', '更改角色api权限', 'casbin', 'POST');
-INSERT INTO `sys_apis` VALUES (28, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/casbin/getPolicyPathByAuthorityId', '获取权限列表', 'casbin', 'POST');
-INSERT INTO `sys_apis` VALUES (29, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/fileUploadAndDownload/deleteFile', '删除文件', 'fileUploadAndDownload', 'POST');
-INSERT INTO `sys_apis` VALUES (30, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/jwt/jsonInBlacklist', 'jwt加入黑名单', 'jwt', 'POST');
-INSERT INTO `sys_apis` VALUES (31, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/authority/setDataAuthority', '设置角色资源权限', 'authority', 'POST');
-INSERT INTO `sys_apis` VALUES (32, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/system/getSystemConfig', '获取配置文件内容', 'system', 'POST');
-INSERT INTO `sys_apis` VALUES (33, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/system/setSystemConfig', '设置配置文件内容', 'system', 'POST');
-INSERT INTO `sys_apis` VALUES (34, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/customer/customer', '创建客户', 'customer', 'POST');
-INSERT INTO `sys_apis` VALUES (35, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/customer/customer', '更新客户', 'customer', 'PUT');
-INSERT INTO `sys_apis` VALUES (36, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/customer/customer', '删除客户', 'customer', 'DELETE');
-INSERT INTO `sys_apis` VALUES (37, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/customer/customer', '获取单一客户', 'customer', 'GET');
-INSERT INTO `sys_apis` VALUES (38, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/customer/customerList', '获取客户列表', 'customer', 'GET');
-INSERT INTO `sys_apis` VALUES (39, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/casbin/casbinTest/:pathParam', 'RESTFUL模式测试', 'casbin', 'GET');
-INSERT INTO `sys_apis` VALUES (40, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/autoCode/createTemp', '自动化代码', 'autoCode', 'POST');
-INSERT INTO `sys_apis` VALUES (41, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/authority/updateAuthority', '更新角色信息', 'authority', 'PUT');
-INSERT INTO `sys_apis` VALUES (42, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/authority/copyAuthority', '拷贝角色', 'authority', 'POST');
-INSERT INTO `sys_apis` VALUES (43, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/user/deleteUser', '删除用户', 'user', 'DELETE');
-INSERT INTO `sys_apis` VALUES (44, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionaryDetail/createSysDictionaryDetail', '新增字典内容', 'sysDictionaryDetail', 'POST');
-INSERT INTO `sys_apis` VALUES (45, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionaryDetail/deleteSysDictionaryDetail', '删除字典内容', 'sysDictionaryDetail', 'DELETE');
-INSERT INTO `sys_apis` VALUES (46, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionaryDetail/updateSysDictionaryDetail', '更新字典内容', 'sysDictionaryDetail', 'PUT');
-INSERT INTO `sys_apis` VALUES (47, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionaryDetail/findSysDictionaryDetail', '根据ID获取字典内容', 'sysDictionaryDetail', 'GET');
-INSERT INTO `sys_apis` VALUES (48, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionaryDetail/getSysDictionaryDetailList', '获取字典内容列表', 'sysDictionaryDetail', 'GET');
-INSERT INTO `sys_apis` VALUES (49, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionary/createSysDictionary', '新增字典', 'sysDictionary', 'POST');
-INSERT INTO `sys_apis` VALUES (50, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionary/deleteSysDictionary', '删除字典', 'sysDictionary', 'DELETE');
-INSERT INTO `sys_apis` VALUES (51, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionary/updateSysDictionary', '更新字典', 'sysDictionary', 'PUT');
-INSERT INTO `sys_apis` VALUES (52, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionary/findSysDictionary', '根据ID获取字典', 'sysDictionary', 'GET');
-INSERT INTO `sys_apis` VALUES (53, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysDictionary/getSysDictionaryList', '获取字典列表', 'sysDictionary', 'GET');
-INSERT INTO `sys_apis` VALUES (54, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysOperationRecord/createSysOperationRecord', '新增操作记录', 'sysOperationRecord', 'POST');
-INSERT INTO `sys_apis` VALUES (55, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysOperationRecord/deleteSysOperationRecord', '删除操作记录', 'sysOperationRecord', 'DELETE');
-INSERT INTO `sys_apis` VALUES (56, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysOperationRecord/findSysOperationRecord', '根据ID获取操作记录', 'sysOperationRecord', 'GET');
-INSERT INTO `sys_apis` VALUES (57, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysOperationRecord/getSysOperationRecordList', '获取操作记录列表', 'sysOperationRecord', 'GET');
-INSERT INTO `sys_apis` VALUES (58, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/autoCode/getTables', '获取数据库表', 'autoCode', 'GET');
-INSERT INTO `sys_apis` VALUES (59, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/autoCode/getDB', '获取所有数据库', 'autoCode', 'GET');
-INSERT INTO `sys_apis` VALUES (60, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/autoCode/getColume', '获取所选table的所有字段', 'autoCode', 'GET');
-INSERT INTO `sys_apis` VALUES (61, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/sysOperationRecord/deleteSysOperationRecordByIds', '批量删除操作历史', 'sysOperationRecord', 'DELETE');
-INSERT INTO `sys_apis` VALUES (62, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/simpleUploader/upload', '插件版分片上传', 'simpleUploader', 'POST');
-INSERT INTO `sys_apis` VALUES (63, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/simpleUploader/checkFileMd5', '文件完整度验证', 'simpleUploader', 'GET');
-INSERT INTO `sys_apis` VALUES (64, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/simpleUploader/mergeFileMd5', '上传完成合并文件', 'simpleUploader', 'GET');
-INSERT INTO `sys_apis` VALUES (65, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '/user/setUserInfo', '设置用户信息', 'user', 'PUT');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_authorities
--- ----------------------------
-DROP TABLE IF EXISTS `sys_authorities`;
-CREATE TABLE `sys_authorities` (
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `authority_id` varchar(90) NOT NULL COMMENT '''角色ID''',
-  `authority_name` varchar(191) DEFAULT NULL COMMENT '''角色名''',
-  `parent_id` varchar(191) DEFAULT NULL COMMENT '''父角色ID''',
-  PRIMARY KEY (`authority_id`),
-  UNIQUE KEY `authority_id` (`authority_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of sys_authorities
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_authorities` VALUES ('2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '888', '普通用户', '0');
-INSERT INTO `sys_authorities` VALUES ('2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '8881', '普通用户子角色', '888');
-INSERT INTO `sys_authorities` VALUES ('2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '9528', '测试角色', '0');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_authority_menus
--- ----------------------------
-DROP TABLE IF EXISTS `sys_authority_menus`;
-CREATE TABLE `sys_authority_menus` (
-  `sys_base_menu_id` bigint unsigned NOT NULL,
-  `sys_authority_authority_id` varchar(90) NOT NULL COMMENT '''角色ID''',
-  PRIMARY KEY (`sys_base_menu_id`,`sys_authority_authority_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of sys_authority_menus
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_authority_menus` VALUES (1, '888');
-INSERT INTO `sys_authority_menus` VALUES (1, '8881');
-INSERT INTO `sys_authority_menus` VALUES (1, '9528');
-INSERT INTO `sys_authority_menus` VALUES (2, '888');
-INSERT INTO `sys_authority_menus` VALUES (2, '8881');
-INSERT INTO `sys_authority_menus` VALUES (2, '9528');
-INSERT INTO `sys_authority_menus` VALUES (3, '888');
-INSERT INTO `sys_authority_menus` VALUES (3, '9528');
-INSERT INTO `sys_authority_menus` VALUES (4, '888');
-INSERT INTO `sys_authority_menus` VALUES (4, '9528');
-INSERT INTO `sys_authority_menus` VALUES (5, '888');
-INSERT INTO `sys_authority_menus` VALUES (5, '9528');
-INSERT INTO `sys_authority_menus` VALUES (6, '888');
-INSERT INTO `sys_authority_menus` VALUES (6, '9528');
-INSERT INTO `sys_authority_menus` VALUES (7, '888');
-INSERT INTO `sys_authority_menus` VALUES (7, '9528');
-INSERT INTO `sys_authority_menus` VALUES (8, '888');
-INSERT INTO `sys_authority_menus` VALUES (8, '8881');
-INSERT INTO `sys_authority_menus` VALUES (8, '9528');
-INSERT INTO `sys_authority_menus` VALUES (9, '888');
-INSERT INTO `sys_authority_menus` VALUES (9, '9528');
-INSERT INTO `sys_authority_menus` VALUES (10, '888');
-INSERT INTO `sys_authority_menus` VALUES (10, '9528');
-INSERT INTO `sys_authority_menus` VALUES (11, '888');
-INSERT INTO `sys_authority_menus` VALUES (11, '9528');
-INSERT INTO `sys_authority_menus` VALUES (12, '888');
-INSERT INTO `sys_authority_menus` VALUES (12, '9528');
-INSERT INTO `sys_authority_menus` VALUES (13, '888');
-INSERT INTO `sys_authority_menus` VALUES (13, '9528');
-INSERT INTO `sys_authority_menus` VALUES (14, '888');
-INSERT INTO `sys_authority_menus` VALUES (14, '9528');
-INSERT INTO `sys_authority_menus` VALUES (15, '888');
-INSERT INTO `sys_authority_menus` VALUES (15, '9528');
-INSERT INTO `sys_authority_menus` VALUES (16, '888');
-INSERT INTO `sys_authority_menus` VALUES (17, '888');
-INSERT INTO `sys_authority_menus` VALUES (17, '8881');
-INSERT INTO `sys_authority_menus` VALUES (17, '9528');
-INSERT INTO `sys_authority_menus` VALUES (18, '888');
-INSERT INTO `sys_authority_menus` VALUES (18, '8881');
-INSERT INTO `sys_authority_menus` VALUES (18, '9528');
-INSERT INTO `sys_authority_menus` VALUES (19, '888');
-INSERT INTO `sys_authority_menus` VALUES (19, '8881');
-INSERT INTO `sys_authority_menus` VALUES (19, '9528');
-INSERT INTO `sys_authority_menus` VALUES (20, '888');
-INSERT INTO `sys_authority_menus` VALUES (20, '8881');
-INSERT INTO `sys_authority_menus` VALUES (20, '9528');
-INSERT INTO `sys_authority_menus` VALUES (21, '888');
-INSERT INTO `sys_authority_menus` VALUES (22, '888');
-INSERT INTO `sys_authority_menus` VALUES (23, '888');
-INSERT INTO `sys_authority_menus` VALUES (24, '888');
-INSERT INTO `sys_authority_menus` VALUES (25, '888');
-INSERT INTO `sys_authority_menus` VALUES (26, '888');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_base_menu_parameters
--- ----------------------------
-DROP TABLE IF EXISTS `sys_base_menu_parameters`;
-CREATE TABLE `sys_base_menu_parameters` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `sys_base_menu_id` bigint unsigned DEFAULT NULL,
-  `type` varchar(191) DEFAULT NULL,
-  `key` varchar(191) DEFAULT NULL,
-  `value` varchar(191) DEFAULT NULL,
-  PRIMARY KEY (`id`),
-  KEY `idx_sys_base_menu_parameters_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Table structure for sys_base_menus
--- ----------------------------
-DROP TABLE IF EXISTS `sys_base_menus`;
-CREATE TABLE `sys_base_menus` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `menu_level` bigint unsigned DEFAULT NULL,
-  `parent_id` varchar(191) DEFAULT NULL COMMENT '''父菜单ID''',
-  `path` varchar(191) DEFAULT NULL COMMENT '''路由path''',
-  `name` varchar(191) DEFAULT NULL COMMENT '''路由name''',
-  `hidden` tinyint(1) DEFAULT NULL COMMENT '''是否在列表隐藏''',
-  `component` varchar(191) DEFAULT NULL COMMENT '''对应前端文件路径''',
-  `sort` bigint DEFAULT NULL COMMENT '''排序标记''',
-  `keep_alive` tinyint(1) DEFAULT NULL COMMENT '''附加属性''',
-  `default_menu` tinyint(1) DEFAULT NULL COMMENT '''附加属性''',
-  `title` varchar(191) DEFAULT NULL COMMENT '''附加属性''',
-  `icon` varchar(191) DEFAULT NULL COMMENT '''附加属性''',
-  PRIMARY KEY (`id`),
-  KEY `idx_sys_base_menus_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of sys_base_menus
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_base_menus` VALUES (1, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '0', 'dashboard', 'dashboard', 0, 'view/dashboard/index.vue', 1, 0, 0, '仪表盘', 'setting');
-INSERT INTO `sys_base_menus` VALUES (2, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '0', 'about', 'about', 0, 'view/about/index.vue', 7, 0, 0, '关于我们', 'info');
-INSERT INTO `sys_base_menus` VALUES (3, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '0', 'admin', 'superAdmin', 0, 'view/superAdmin/index.vue', 3, 0, 0, '超级管理员', 'user-solid');
-INSERT INTO `sys_base_menus` VALUES (4, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '3', 'authority', 'authority', 0, 'view/superAdmin/authority/authority.vue', 1, 0, 0, '角色管理', 's-custom');
-INSERT INTO `sys_base_menus` VALUES (5, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '3', 'menu', 'menu', 0, 'view/superAdmin/menu/menu.vue', 2, 1, 0, '菜单管理', 's-order');
-INSERT INTO `sys_base_menus` VALUES (6, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '3', 'api', 'api', 0, 'view/superAdmin/api/api.vue', 3, 1, 0, 'api管理', 's-platform');
-INSERT INTO `sys_base_menus` VALUES (7, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '3', 'user', 'user', 0, 'view/superAdmin/user/user.vue', 4, 0, 0, '用户管理', 'coordinate');
-INSERT INTO `sys_base_menus` VALUES (8, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '0', 'person', 'person', 1, 'view/person/person.vue', 4, 0, 0, '个人信息', 'message-solid');
-INSERT INTO `sys_base_menus` VALUES (9, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '0', 'example', 'example', 0, 'view/example/index.vue', 6, 0, 0, '示例文件', 's-management');
-INSERT INTO `sys_base_menus` VALUES (10, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '9', 'table', 'table', 0, 'view/example/table/table.vue', 1, 0, 0, '表格示例', 's-order');
-INSERT INTO `sys_base_menus` VALUES (11, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '9', 'form', 'form', 0, 'view/example/form/form.vue', 2, 0, 0, '表单示例', 'document');
-INSERT INTO `sys_base_menus` VALUES (12, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '9', 'rte', 'rte', 0, 'view/example/rte/rte.vue', 3, 0, 0, '富文本编辑器', 'reading');
-INSERT INTO `sys_base_menus` VALUES (13, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '9', 'excel', 'excel', 0, 'view/example/excel/excel.vue', 4, 0, 0, 'excel导入导出', 's-marketing');
-INSERT INTO `sys_base_menus` VALUES (14, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '9', 'upload', 'upload', 0, 'view/example/upload/upload.vue', 5, 0, 0, '上传下载', 'upload');
-INSERT INTO `sys_base_menus` VALUES (15, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '9', 'breakpoint', 'breakpoint', 0, 'view/example/breakpoint/breakpoint.vue', 6, 0, 0, '断点续传', 'upload');
-INSERT INTO `sys_base_menus` VALUES (16, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '9', 'customer', 'customer', 0, 'view/example/customer/customer.vue', 7, 0, 0, '客户列表(资源示例)', 's-custom');
-INSERT INTO `sys_base_menus` VALUES (17, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '0', 'systemTools', 'systemTools', 0, 'view/systemTools/index.vue', 5, 0, 0, '系统工具', 's-cooperation');
-INSERT INTO `sys_base_menus` VALUES (18, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '17', 'autoCode', 'autoCode', 0, 'view/systemTools/autoCode/index.vue', 1, 1, 0, '代码生成器', 'cpu');
-INSERT INTO `sys_base_menus` VALUES (19, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '17', 'formCreate', 'formCreate', 0, 'view/systemTools/formCreate/index.vue', 2, 1, 0, '表单生成器', 'magic-stick');
-INSERT INTO `sys_base_menus` VALUES (20, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '17', 'system', 'system', 0, 'view/systemTools/system/system.vue', 3, 0, 0, '系统配置', 's-operation');
-INSERT INTO `sys_base_menus` VALUES (21, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '0', 'iconList', 'iconList', 0, 'view/iconList/index.vue', 2, 0, 0, '图标集合', 'star-on');
-INSERT INTO `sys_base_menus` VALUES (22, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '3', 'dictionary', 'dictionary', 0, 'view/superAdmin/dictionary/sysDictionary.vue', 5, 0, 0, '字典管理', 'notebook-2');
-INSERT INTO `sys_base_menus` VALUES (23, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '3', 'dictionaryDetail/:id', 'dictionaryDetail', 1, 'view/superAdmin/dictionary/sysDictionaryDetail.vue', 1, 0, 0, '字典详情', 's-order');
-INSERT INTO `sys_base_menus` VALUES (24, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '3', 'operation', 'operation', 0, 'view/superAdmin/operation/sysOperationRecord.vue', 6, 0, 0, '操作历史', 'time');
-INSERT INTO `sys_base_menus` VALUES (25, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '9', 'simpleUploader', 'simpleUploader', 0, 'view/example/simpleUploader/simpleUploader', 6, 0, 0, '断点续传(插件版)', 'upload');
-INSERT INTO `sys_base_menus` VALUES (26, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 0, '0', 'https://www.gin-vue-admin.com', 'https://www.gin-vue-admin.com', 0, '/', 0, 0, 0, '官方网站', 's-home');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_data_authority_ids
--- ----------------------------
-DROP TABLE IF EXISTS `sys_data_authority_ids`;
-CREATE TABLE `sys_data_authority_ids` (
-  `sys_authority_authority_id` varchar(90) NOT NULL COMMENT '''角色ID''',
-  `data_authority_id_authority_id` varchar(90) NOT NULL COMMENT '''角色ID''',
-  PRIMARY KEY (`sys_authority_authority_id`,`data_authority_id_authority_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of sys_data_authority_ids
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_data_authority_ids` VALUES ('888', '888');
-INSERT INTO `sys_data_authority_ids` VALUES ('888', '8881');
-INSERT INTO `sys_data_authority_ids` VALUES ('888', '9528');
-INSERT INTO `sys_data_authority_ids` VALUES ('9528', '8881');
-INSERT INTO `sys_data_authority_ids` VALUES ('9528', '9528');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_dictionaries
--- ----------------------------
-DROP TABLE IF EXISTS `sys_dictionaries`;
-CREATE TABLE `sys_dictionaries` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `name` varchar(191) DEFAULT NULL COMMENT '''字典名(中)''',
-  `type` varchar(191) DEFAULT NULL COMMENT '''字典名(英)''',
-  `status` tinyint(1) DEFAULT NULL COMMENT '''状态''',
-  `desc` varchar(191) DEFAULT NULL COMMENT '''描述''',
-  PRIMARY KEY (`id`),
-  KEY `idx_sys_dictionaries_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of sys_dictionaries
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_dictionaries` VALUES (1, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '性别', 'sex', 1, '性别字典');
-INSERT INTO `sys_dictionaries` VALUES (2, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '数据库int类型', 'int', 1, 'int类型对应的数据库类型');
-INSERT INTO `sys_dictionaries` VALUES (3, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '数据库时间日期类型', 'time.Time', 1, '数据库时间日期类型');
-INSERT INTO `sys_dictionaries` VALUES (4, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '数据库浮点型', 'float64', 1, '数据库浮点型');
-INSERT INTO `sys_dictionaries` VALUES (5, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '数据库字符串', 'string', 1, '数据库字符串');
-INSERT INTO `sys_dictionaries` VALUES (6, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, '数据库bool类型', 'bool', 1, '数据库bool类型');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_dictionary_details
--- ----------------------------
-DROP TABLE IF EXISTS `sys_dictionary_details`;
-CREATE TABLE `sys_dictionary_details` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `label` varchar(191) DEFAULT NULL COMMENT '''展示值''',
-  `value` bigint DEFAULT NULL COMMENT '''字典值''',
-  `status` tinyint(1) DEFAULT NULL COMMENT '''启用状态''',
-  `sort` bigint DEFAULT NULL COMMENT '''排序标记''',
-  `sys_dictionary_id` bigint unsigned DEFAULT NULL COMMENT '''关联标记''',
-  PRIMARY KEY (`id`),
-  KEY `idx_sys_dictionary_details_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of sys_dictionary_details
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_dictionary_details` VALUES (1, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'smallint', 1, 1, 1, 2);
-INSERT INTO `sys_dictionary_details` VALUES (2, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'mediumint', 2, 1, 2, 2);
-INSERT INTO `sys_dictionary_details` VALUES (3, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'int', 3, 1, 3, 2);
-INSERT INTO `sys_dictionary_details` VALUES (4, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'bigint', 4, 1, 4, 2);
-INSERT INTO `sys_dictionary_details` VALUES (5, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'data', 0, 1, 0, 3);
-INSERT INTO `sys_dictionary_details` VALUES (6, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'time', 1, 1, 1, 3);
-INSERT INTO `sys_dictionary_details` VALUES (7, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'year', 2, 1, 2, 3);
-INSERT INTO `sys_dictionary_details` VALUES (8, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'datetime', 3, 1, 3, 3);
-INSERT INTO `sys_dictionary_details` VALUES (9, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'timestamp', 5, 1, 5, 3);
-INSERT INTO `sys_dictionary_details` VALUES (10, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'float', 0, 1, 0, 4);
-INSERT INTO `sys_dictionary_details` VALUES (11, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'double', 1, 1, 1, 4);
-INSERT INTO `sys_dictionary_details` VALUES (12, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'decimal', 2, 1, 2, 4);
-INSERT INTO `sys_dictionary_details` VALUES (13, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'char', 0, 1, 0, 5);
-INSERT INTO `sys_dictionary_details` VALUES (14, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'varchar', 1, 1, 1, 5);
-INSERT INTO `sys_dictionary_details` VALUES (15, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'tinyblob', 2, 1, 2, 5);
-INSERT INTO `sys_dictionary_details` VALUES (16, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'tinytext', 3, 1, 3, 5);
-INSERT INTO `sys_dictionary_details` VALUES (17, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'text', 4, 1, 4, 5);
-INSERT INTO `sys_dictionary_details` VALUES (18, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'blob', 5, 1, 5, 5);
-INSERT INTO `sys_dictionary_details` VALUES (19, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'mediumblob', 6, 1, 6, 5);
-INSERT INTO `sys_dictionary_details` VALUES (20, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'mediumtext', 7, 1, 7, 5);
-INSERT INTO `sys_dictionary_details` VALUES (21, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'longblob', 8, 1, 8, 5);
-INSERT INTO `sys_dictionary_details` VALUES (22, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'longtext', 9, 1, 9, 5);
-INSERT INTO `sys_dictionary_details` VALUES (23, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'tinyint', 0, 1, 0, 6);
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_operation_records
--- ----------------------------
-DROP TABLE IF EXISTS `sys_operation_records`;
-CREATE TABLE `sys_operation_records` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `ip` varchar(191) DEFAULT NULL COMMENT '''请求ip''',
-  `method` varchar(191) DEFAULT NULL COMMENT '''''',
-  `path` varchar(191) DEFAULT NULL COMMENT '''''',
-  `status` bigint DEFAULT NULL COMMENT '''''',
-  `latency` bigint DEFAULT NULL COMMENT '''''',
-  `agent` varchar(191) DEFAULT NULL COMMENT '''''',
-  `error_message` varchar(191) DEFAULT NULL COMMENT '''''',
-  `body` varchar(191) DEFAULT NULL COMMENT '''请求Body''',
-  `resp` longtext COMMENT '''响应Body''',
-  `user_id` bigint unsigned DEFAULT NULL COMMENT '''''',
-  PRIMARY KEY (`id`),
-  KEY `idx_sys_operation_records_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Table structure for sys_users
--- ----------------------------
-DROP TABLE IF EXISTS `sys_users`;
-CREATE TABLE `sys_users` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `uuid` varchar(191) DEFAULT NULL COMMENT '''用户UUID''',
-  `username` varchar(191) DEFAULT NULL COMMENT '''用户登录名''',
-  `password` varchar(191) DEFAULT NULL COMMENT '''用户登录密码''',
-  `nick_name` varchar(191) DEFAULT '系统用户' COMMENT '''用户昵称''',
-  `header_img` varchar(191) DEFAULT 'http://qmplusimg.henrongyi.top/head.png' COMMENT '''用户头像''',
-  `authority_id` varchar(191) DEFAULT '888' COMMENT '''用户角色ID''',
-  PRIMARY KEY (`id`),
-  KEY `idx_sys_users_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Records of sys_users
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_users` VALUES (1, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'e0375086-c7fd-48f9-818b-044f3d83dac0', 'admin', 'e10adc3949ba59abbe56e057f20f883e', '超级管理员', 'http://qmplusimg.henrongyi.top/1571627762timg.jpg', '888');
-INSERT INTO `sys_users` VALUES (2, '2020-09-11 11:14:42', '2020-09-11 11:14:42', NULL, 'acdd9a43-4d82-44ce-9b6e-8b70bd89d651', 'a303176530', '3ec063004a6f31642261936a379fde3d', 'QMPlusUser', 'http://qmplusimg.henrongyi.top/1572075907logo.png', '9528');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_workflow_step_infos
--- ----------------------------
-DROP TABLE IF EXISTS `sys_workflow_step_infos`;
-CREATE TABLE `sys_workflow_step_infos` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `sys_workflow_id` bigint unsigned DEFAULT NULL COMMENT '''所属工作流ID''',
-  `is_strat` tinyint(1) DEFAULT NULL COMMENT '''是否是开始流节点''',
-  `step_name` varchar(191) DEFAULT NULL COMMENT '''工作流节点名称''',
-  `step_no` double DEFAULT NULL COMMENT '''步骤id (第几步)''',
-  `step_authority_id` varchar(191) DEFAULT NULL COMMENT '''操作者级别id''',
-  `is_end` tinyint(1) DEFAULT NULL COMMENT '''是否是完结流节点''',
-  PRIMARY KEY (`id`),
-  KEY `idx_sys_workflow_step_infos_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- Table structure for sys_workflows
--- ----------------------------
-DROP TABLE IF EXISTS `sys_workflows`;
-CREATE TABLE `sys_workflows` (
-  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
-  `created_at` datetime DEFAULT NULL,
-  `updated_at` datetime DEFAULT NULL,
-  `deleted_at` datetime DEFAULT NULL,
-  `workflow_nick_name` varchar(191) DEFAULT NULL COMMENT '''工作流中文名称''',
-  `workflow_name` varchar(191) DEFAULT NULL COMMENT '''工作流英文名称''',
-  `workflow_description` varchar(191) DEFAULT NULL COMMENT '''工作流描述''',
-  PRIMARY KEY (`id`),
-  KEY `idx_sys_workflows_deleted_at` (`deleted_at`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
--- ----------------------------
--- View structure for authority_menu
--- ----------------------------
-DROP VIEW IF EXISTS `authority_menu`;
-CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `authority_menu` AS select `sys_base_menus`.`id` AS `id`,`sys_base_menus`.`created_at` AS `created_at`,`sys_base_menus`.`updated_at` AS `updated_at`,`sys_base_menus`.`deleted_at` AS `deleted_at`,`sys_base_menus`.`menu_level` AS `menu_level`,`sys_base_menus`.`parent_id` AS `parent_id`,`sys_base_menus`.`path` AS `path`,`sys_base_menus`.`name` AS `name`,`sys_base_menus`.`hidden` AS `hidden`,`sys_base_menus`.`component` AS `component`,`sys_base_menus`.`title` AS `title`,`sys_base_menus`.`icon` AS `icon`,`sys_base_menus`.`sort` AS `sort`,`sys_authority_menus`.`sys_authority_authority_id` AS `authority_id`,`sys_authority_menus`.`sys_base_menu_id` AS `menu_id`,`sys_base_menus`.`keep_alive` AS `keep_alive`,`sys_base_menus`.`default_menu` AS `default_menu` from (`sys_authority_menus` join `sys_base_menus` on((`sys_authority_menus`.`sys_base_menu_id` = `sys_base_menus`.`id`)));
-
-SET FOREIGN_KEY_CHECKS = 1;

+ 1 - 1
.docker-compose/nginx/conf.d/my.conf

@@ -1,5 +1,5 @@
 server {
-    listen       8000;
+    listen       8080;
     server_name localhost;
 
     #charset koi8-r;

+ 90 - 66
.docker-compose/shell/server-handle.sh

@@ -7,87 +7,111 @@ filename="./config.yaml"
 cat>"${filename}"<<EOF
 # Gin-Vue-Admin Global Configuration
 
-# casbin configuration
-casbin:
-    model-path: './resource/rbac_model.conf'
-
 # jwt configuration
 jwt:
-    signing-key: 'qmPlus'
-
-# mysql connect configuration
-mysql:
-    username: root
-    password: 'Aa@6447985'
-    path: mysql
-    db-name: 'qmPlus'
-    config: 'charset=utf8mb4&parseTime=True&loc=Local'
-    max-idle-conns: 10
-    max-open-conns: 10
-    log-mode: true
-
-#sqlite 配置
-sqlite:
-    path: db.db
-    log-mode: true
-    config: 'loc=Asia/Shanghai'
-
-# oss configuration
-
-# 切换本地与七牛云上传,分配头像和文件路径
-localupload:
-  local: false
-  avatar-path: uploads/avatar
-  file-path: uploads/file
-
-# 请自行七牛申请对应的 公钥 私钥 bucket 和 域名地址
-qiniu:
-    access-key: '25j8dYBZ2wuiy0yhwShytjZDTX662b8xiFguwxzZ'
-    secret-key: 'pgdbqEsf7ooZh7W3xokP833h3dZ_VecFXPDeG5JY'
-    bucket: 'qm-plus-img'
-    img-path: 'http://qmplusimg.henrongyi.top'
-
-# redis configuration
-redis:
-    addr: redis:6379
-    password: ''
-    db: 0
-
-# system configuration
-system:
-    use-multipoint: true
-    env: 'public'  # Change to "develop" to skip authentication for development mode
-    addr: 8888
-    db-type: "mysql"  # support mysql/sqlite
-
-# captcha configuration
-captcha:
-    key-long: 6
-    img-width: 240
-    img-height: 80
+  signing-key: 'qmPlus'
 
 # zap logger configuration
 zap:
-  # 可使用 "debug", "info", "warn", "error", "dpanic", "panic", "fatal",
   level: 'info'
-  # console: 控制台, json: json格式输出
   format: 'console'
   prefix: '[GIN-VUE-ADMIN]'
   director: 'log'
   link-name: 'latest_log'
   show-line: true
-  # LowercaseLevelEncoder:小写, LowercaseColorLevelEncoder:小写带颜色,CapitalLevelEncoder: 大写, CapitalColorLevelEncoder: 大写带颜色,
   encode-level: 'LowercaseColorLevelEncoder'
   stacktrace-key: 'stacktrace'
   log-in-console: true
 
+# redis configuration
+redis:
+  db: 0
+  addr: '177.7.0.14:6379'
+  password: ''
+
+# email configuration
 email:
-  email-from: '[email protected]'
-  email-nickname: 'test'
-  email-secret: 'xxx'
-  email-to: '[email protected]'
-  email-host: 'smtp.163.com'
-  email-port: 465
-  email-isSSL: true
+  to: '[email protected]'
+  port: 465
+  from: '[email protected]'
+  host: 'smtp.163.com'
+  is-ssl: true
+  secret: 'xxx'
+  nickname: 'test'
+
+# casbin configuration
+casbin:
+  model-path: './resource/rbac_model.conf'
+
+# system configuration
+system:
+  env: 'public'  # Change to "develop" to skip authentication for development mode
+  addr: 8888
+  db-type: 'mysql'
+  oss-type: 'local'
+  config-env: 'GVA_CONFIG'
+  need-init-data: true
+  use-multipoint: false
+
+# captcha configuration
+captcha:
+  key-long: 6
+  img-width: 240
+  img-height: 80
+
+# mysql connect configuration
+mysql:
+  path: '177.7.0.13:3306'
+  config: 'charset=utf8mb4&parseTime=True&loc=Local'
+  db-name: 'qmPlus'
+  username: 'root'
+  password: 'Aa@6447985'
+  max-idle-conns: 10
+  max-open-conns: 10
+  log-mode: false
+
+# sqlite connect configuration (sqlite需要gcc支持 windows用户需要自行安装gcc)
+sqlite:
+  path: 'db.db'
+  max-idle-conns: 10
+  max-open-conns: 10
+  logger: true
+
+# Sqlserver connect configuration
+sqlserver:
+  path: 'localhost:9930'
+  db-name: 'gorm'
+  username: 'gorm'
+  password: 'LoremIpsum86'
+  max-idle-conns: 10
+  max-open-conns: 10
+  logger: true
+
+# Postgresql connect configuration
+postgresql:
+  host: '127.0.0.1'
+  port: '9920'
+  config: 'sslmode=disable TimeZone=Asia/Shanghai'
+  db-name: 'gorm'
+  username: 'gorm'
+  password: 'gorm'
+  max-idle-conns: 10
+  max-open-conns: 10
+  prefer-simple-protocol: true
+  logger: false
+
+# local configuration
+local:
+  path: 'uploads/file'
+
+# qiniu configuration (请自行七牛申请对应的 公钥 私钥 bucket 和 域名地址)
+qiniu:
+  zone: 'ZoneHuadong'
+  bucket: 'qm-plus-img'
+  img-path: 'http://qmplusimg.henrongyi.top'
+  use-https: false
+  access-key: '25j8dYBZ2wuiy0yhwShytjZDTX662b8xiFguwxzZ'
+  secret-key: 'pgdbqEsf7ooZh7W3xokP833h3dZ_VecFXPDeG5JY'
+  use-cdn-domains: false
 EOF
 

+ 44 - 46
.github/workflows/build_test.yml

@@ -1,66 +1,64 @@
 name: gin-vue-admin build test
 
 on:
-    push:
-      branches: 
-        - '*'
-      paths-ignore:
-        - './db/**'
-        - '**.md'
-    pull_request:
-      branches: 
-        - '*'
-      paths-ignore:
-        - './db/**'
-        - '**.md'
+  push:
+    branches:
+      - "*"
+    paths-ignore:
+      - "./db/**"
+      - "**.md"
+  pull_request:
+    branches:
+      - "*"
+    paths-ignore:
+      - "./db/**"
+      - "**.md"
 
 jobs:
   frontend:
-    name: Frontend build 
+    name: Frontend build
     runs-on: ubuntu-latest
     strategy:
       matrix:
         node-version: [12.x]
     steps:
-      
-    - name: Check out branch
-      uses: actions/checkout@v2
+      - name: Check out branch
+        uses: actions/checkout@v2
 
-    - name: Use Node.js ${{ matrix.node-version }}
-      uses: actions/setup-node@v1
-      with:
-        node-version: ${{ matrix.node-version }}
+      - name: Use Node.js ${{ matrix.node-version }}
+        uses: actions/setup-node@v1
+        with:
+          node-version: ${{ matrix.node-version }}
+
+      - name: Build test
+        run: |
+          npm install
+          npm run build
+        working-directory: ./web
 
-    - name: Build test 
-      run: |
-        npm install
-        npm run build
-      working-directory: ./web
-    
   backend:
     name: Backend build
     runs-on: ubuntu-latest
     steps:
+      - name: Set up Go 1.14
+        uses: actions/setup-go@v1
+        with:
+          go-version: 1.14
+        id: go
 
-    - name: Set up Go 1.13
-      uses: actions/setup-go@v1
-      with:
-        go-version: 1.13
-      id: go
-
-    - name: Check out branch
-      uses: actions/checkout@v2
+      - name: Check out branch
+        uses: actions/checkout@v2
 
-    - name: Download dependencies
-      run: |
-        go get -v -t -d ./...
-        if [ -f Gopkg.toml ]; then
-            curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
-            dep ensure
-        fi
-      working-directory: ./server
+      - name: Download dependencies
+        run: |
+          go get -v -t -d ./...
+          if [ -f Gopkg.toml ]; then
+              curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
+              dep ensure
+          fi
+        working-directory: ./server
 
-    - name: Test and Build
-      run: |
-        go build -v -race
-      working-directory: ./server
+      - name: Test and Build
+        run: |
+          go build -v -race
+        working-directory: ./server

+ 5 - 4
docker-compose.yaml

@@ -15,7 +15,7 @@ services:
     container_name: gva-web
     restart: always
     ports:
-      - '8000:8000'
+      - '8080:8080'
     depends_on:
       - server
     command: [ 'nginx-debug', '-g', 'daemon off;' ]
@@ -34,6 +34,9 @@ services:
     depends_on:
       - mysql
       - redis
+    links:
+      - mysql
+      - redis
     networks:
       network:
         ipv4_address: 177.7.0.12
@@ -48,8 +51,6 @@ services:
     environment:
       MYSQL_DATABASE: 'qmPlus' # 初始化启动时要创建的数据库的名称
       MYSQL_ROOT_PASSWORD: 'Aa@6447985' # root管理员用户密码
-    volumes:
-      - '.docker-compose/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d'
     networks:
       network:
         ipv4_address: 177.7.0.13
@@ -59,7 +60,7 @@ services:
     container_name: gva-redis # 容器名
     restart: always
     ports:
-      - '6379:6379'
+      - '16379:6379'
     networks:
       network:
         ipv4_address: 177.7.0.14

+ 2 - 0
dockerfile_server

@@ -24,6 +24,8 @@ COPY --from=0 /go/src/gin-vue-admin/server ./
 COPY --from=0 /go/src/gin-vue-admin/config.yaml ./
 COPY --from=0 /go/src/gin-vue-admin/resource ./resource
 
+EXPOSE 8888
+
 ENTRYPOINT ./server
 
 # 根据Dockerfile生成Docker镜像

+ 16 - 0
server/api/v1/sys_system.go

@@ -60,3 +60,19 @@ func ReloadSystem(c *gin.Context) {
 		response.OkWithMessage("设置成功", c)
 	}
 }
+
+// @Tags system
+// @Summary 获取服务器信息
+// @Security ApiKeyAuth
+// @Produce  application/json
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
+// @Router /system/getServerInfo [post]
+func GetServerInfo(c *gin.Context) {
+	server, err := service.GetServerInfo()
+	if err != nil {
+		response.FailWithMessage(fmt.Sprintf("获取失败,%v", err), c)
+		return
+	}
+	response.OkDetailed(gin.H{"server":server}, "获取成功",c)
+
+}

+ 74 - 77
server/config.yaml

@@ -1,40 +1,70 @@
 # Gin-Vue-Admin Global Configuration
 
+# jwt configuration
+jwt:
+  signing-key: 'qmPlus'
+
+# zap logger configuration
+zap:
+  level: 'info'
+  format: 'console'
+  prefix: '[GIN-VUE-ADMIN]'
+  director: 'log'
+  link-name: 'latest_log'
+  show-line: true
+  encode-level: 'LowercaseColorLevelEncoder'
+  stacktrace-key: 'stacktrace'
+  log-in-console: true
+
+# redis configuration
+redis:
+  db: 0
+  addr: '127.0.0.1:6379'
+  password: ''
+
+# email configuration
+email:
+  to: '[email protected]'
+  port: 465
+  from: '[email protected]'
+  host: 'smtp.163.com'
+  is-ssl: true
+  secret: 'xxx'
+  nickname: 'test'
+
 # casbin configuration
 casbin:
   model-path: './resource/rbac_model.conf'
 
-# jwt configuration
-jwt:
-  signing-key: 'qmPlus'
+# system configuration
+system:
+  env: 'public'  # Change to "develop" to skip authentication for development mode
+  addr: 8888
+  db-type: 'mysql'
+  oss-type: 'local'
+  config-env: 'GVA_CONFIG'
+  need-init-data: false
+  use-multipoint: false
+
+# captcha configuration
+captcha:
+  key-long: 6
+  img-width: 240
+  img-height: 80
 
 # mysql connect configuration
 mysql:
-  username: root
-  password: 'Aa@6447985'
   path: '127.0.0.1:3306'
-  db-name: 'qmPlus'
   config: 'charset=utf8mb4&parseTime=True&loc=Local'
+  db-name: 'qmPlus'
+  username: 'root'
+  password: 'Aa@6447985'
   max-idle-conns: 10
   max-open-conns: 10
   log-mode: false
 
-# Postgresql connect configuration
-postgresql:
-  username: 'gorm'
-  password: 'gorm'
-  db-name: 'gorm'
-  port: '9920'
-  config: 'sslmode=disable TimeZone=Asia/Shanghai'
-  max-idle-conns: 10
-  max-open-conns: 10
-  logger: false
-  prefer-simple-protocol: true
-
-# sqlite connect configuration
-# sqlite需要gcc支持 windows用户需要自行安装gcc
+# sqlite connect configuration (sqlite需要gcc支持 windows用户需要自行安装gcc)
 sqlite:
-  # path: 'file::memory:?cache=shared' # 内存模式
   path: 'db.db'
   max-idle-conns: 10
   max-open-conns: 10
@@ -42,70 +72,37 @@ sqlite:
 
 # Sqlserver connect configuration
 sqlserver:
+  path: 'localhost:9930'
+  db-name: 'gorm'
   username: 'gorm'
   password: 'LoremIpsum86'
-  db-name: 'gorm'
-  path: 'localhost:9930'
   max-idle-conns: 10
   max-open-conns: 10
   logger: true
 
-# oss configuration
+# Postgresql connect configuration
+postgresql:
+  host: '127.0.0.1'
+  port: '9920'
+  config: 'sslmode=disable TimeZone=Asia/Shanghai'
+  db-name: 'gorm'
+  username: 'gorm'
+  password: 'gorm'
+  max-idle-conns: 10
+  max-open-conns: 10
+  prefer-simple-protocol: true
+  logger: false
 
-# 切换本地与七牛云上传,分配头像和文件路径
-localupload:
-  local: false
-  file-path: uploads/file
+# local configuration
+local:
+  path: 'uploads/file'
 
-# 请自行七牛申请对应的 公钥 私钥 bucket 和 域名地址
+# qiniu configuration (请自行七牛申请对应的 公钥 私钥 bucket 和 域名地址)
 qiniu:
-  access-key: '25j8dYBZ2wuiy0yhwShytjZDTX662b8xiFguwxzZ'
-  secret-key: 'pgdbqEsf7ooZh7W3xokP833h3dZ_VecFXPDeG5JY'
+  zone: 'ZoneHuadong'
   bucket: 'qm-plus-img'
   img-path: 'http://qmplusimg.henrongyi.top'
-
-# redis configuration
-redis:
-  addr: '127.0.0.1:6379'
-  password: ''
-  db: 0
-
-# system configuration
-system:
-  use-multipoint: false
-  env: 'public'  # Change to "develop" to skip authentication for development mode
-  addr: 8888
-  db-type: "mysql"  # support mysql/postgresql/sqlite/sqlserver
-  need-init-data: false
-  error-to-email: false
-  config-env: "GVA_CONFIG"
-
-# captcha configuration
-captcha:
-  key-long: 6
-  img-width: 240
-  img-height: 80
-
-# zap logger configuration
-zap:
-  # 可使用 "debug", "info", "warn", "error", "dpanic", "panic", "fatal",
-  level: 'info'
-  # console: 控制台, json: json格式输出
-  format: 'console'
-  prefix: '[GIN-VUE-ADMIN]'
-  director: 'log'
-  link-name: 'latest_log'
-  show-line: true
-  # LowercaseLevelEncoder:小写, LowercaseColorLevelEncoder:小写带颜色,CapitalLevelEncoder: 大写, CapitalColorLevelEncoder: 大写带颜色,
-  encode-level: 'LowercaseColorLevelEncoder'
-  stacktrace-key: 'stacktrace'
-  log-in-console: true
-
-email:
-  email-from: '[email protected]'
-  email-nickname: 'test'
-  email-secret: 'xxx'
-  email-to: '[email protected]'
-  email-host: 'smtp.163.com'
-  email-port: 465
-  email-is-ssl: true
+  use-https: false
+  access-key: '25j8dYBZ2wuiy0yhwShytjZDTX662b8xiFguwxzZ'
+  secret-key: 'pgdbqEsf7ooZh7W3xokP833h3dZ_VecFXPDeG5JY'
+  use-cdn-domains: false

+ 7 - 0
server/config/captcha.go

@@ -0,0 +1,7 @@
+package config
+
+type Captcha struct {
+	KeyLong   int `mapstructure:"key-long" json:"keyLong" yaml:"key-long"`
+	ImgWidth  int `mapstructure:"img-width" json:"imgWidth" yaml:"img-width"`
+	ImgHeight int `mapstructure:"img-height" json:"imgHeight" yaml:"img-height"`
+}

+ 5 - 0
server/config/casbin.go

@@ -0,0 +1,5 @@
+package config
+
+type Casbin struct {
+	ModelPath string `mapstructure:"model-path" json:"modelPath" yaml:"model-path"`
+}

+ 15 - 118
server/config/config.go

@@ -1,122 +1,19 @@
 package config
 
 type Server struct {
-	Mysql       Mysql       `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
-	Postgresql  Postgresql  `mapstructure:"postgresql" json:"postgresql" yaml:"postgresql"`
-	Sqlite      Sqlite      `mapstructure:"sqlite" json:"sqlite" yaml:"sqlite"`
-	Sqlserver   Sqlserver   `mapstructure:"sqlserver" json:"sqlserver" yaml:"sqlserver"`
-	Qiniu       Qiniu       `mapstructure:"qiniu" json:"qiniu" yaml:"qiniu"`
-	Casbin      Casbin      `mapstructure:"casbin" json:"casbin" yaml:"casbin"`
-	Redis       Redis       `mapstructure:"redis" json:"redis" yaml:"redis"`
-	System      System      `mapstructure:"system" json:"system" yaml:"system"`
-	JWT         JWT         `mapstructure:"jwt" json:"jwt" yaml:"jwt"`
-	Captcha     Captcha     `mapstructure:"captcha" json:"captcha" yaml:"captcha"`
-	Zap         Zap         `mapstructure:"zap" json:"zap" yaml:"zap"`
-	LocalUpload LocalUpload `mapstructure:"localUpload" json:"localUpload" yaml:"localUpload"`
-	Email       Email       `mapstructure:"email" json:"email" yaml:"email"`
-}
-
-type System struct {
-	UseMultipoint bool   `mapstructure:"use-multipoint" json:"useMultipoint" yaml:"use-multipoint"`
-	Env           string `mapstructure:"env" json:"env" yaml:"env"`
-	Addr          int    `mapstructure:"addr" json:"addr" yaml:"addr"`
-	DbType        string `mapstructure:"db-type" json:"dbType" yaml:"db-type"`
-	NeedInitData  bool   `mapstructure:"need-init-data" json:"needInitData" yaml:"need-init-data"`
-	ErrorToEmail  bool   `mapstructure:"error-to-email" json:"errorToEmail" yaml:"error-to-email"`
-	ConfigEnv     string `mapstructure:"config-env" json:"configEnv" yaml:"config-env"`
-}
-
-type JWT struct {
-	SigningKey string `mapstructure:"signing-key" json:"signingKey" yaml:"signing-key"`
-}
-
-type Casbin struct {
-	ModelPath string `mapstructure:"model-path" json:"modelPath" yaml:"model-path"`
-}
-
-type Mysql struct {
-	Username     string `mapstructure:"username" json:"username" yaml:"username"`
-	Password     string `mapstructure:"password" json:"password" yaml:"password"`
-	Path         string `mapstructure:"path" json:"path" yaml:"path"`
-	Dbname       string `mapstructure:"db-name" json:"dbname" yaml:"db-name"`
-	Config       string `mapstructure:"config" json:"config" yaml:"config"`
-	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
-	MaxOpenConns int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
-	LogMode      bool   `mapstructure:"log-mode" json:"logMode" yaml:"log-mode"`
-}
-
-type Postgresql struct {
-	Host                 string `mapstructure:"host" json:"host" yaml:"host"`
-	Username             string `mapstructure:"username" json:"username" yaml:"username"`
-	Password             string `mapstructure:"password" json:"password" yaml:"password"`
-	Dbname               string `mapstructure:"db-name" json:"dbname" yaml:"db-name"`
-	Port                 string `mapstructure:"port" json:"port" yaml:"port"`
-	Config               string `mapstructure:"config" json:"config" yaml:"config"`
-	MaxIdleConns         int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
-	MaxOpenConns         int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
-	Logger               bool   `mapstructure:"logger" json:"logger" yaml:"logger"`
-	PreferSimpleProtocol bool   `mapstructure:"prefer-simple-protocol" json:"preferSimpleProtocol" yaml:"prefer-simple-protocol"`
-}
-
-type Sqlite struct {
-	Path         string `mapstructure:"path" json:"path" yaml:"path"`
-	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
-	MaxOpenConns int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
-	Logger       bool   `mapstructure:"logger" json:"logger" yaml:"logger"`
-}
-
-type Sqlserver struct {
-	Username     string `mapstructure:"username" json:"username" yaml:"username"`
-	Password     string `mapstructure:"password" json:"password" yaml:"password"`
-	Path         string `mapstructure:"path" json:"path" yaml:"path"`
-	Dbname       string `mapstructure:"db-name" json:"dbname" yaml:"db-name"`
-	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
-	MaxOpenConns int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
-	Logger       bool   `mapstructure:"logger" json:"logger" yaml:"logger"`
-}
-
-type Redis struct {
-	Addr     string `mapstructure:"addr" json:"addr" yaml:"addr"`
-	Password string `mapstructure:"password" json:"password" yaml:"password"`
-	DB       int    `mapstructure:"db" json:"db" yaml:"db"`
-}
-
-type LocalUpload struct {
-	Local    bool   `mapstructure:"local" json:"local" yaml:"local"`
-	FilePath string `mapstructure:"file-path" json:"filePath" yaml:"file-path"`
-}
-
-type Qiniu struct {
-	AccessKey string `mapstructure:"access-key" json:"accessKey" yaml:"access-key"`
-	SecretKey string `mapstructure:"secret-key" json:"secretKey" yaml:"secret-key"`
-	Bucket    string `mapstructure:"bucket" json:"bucket" yaml:"bucket"`
-	ImgPath   string `mapstructure:"img-path" json:"imgPath" yaml:"img-path"`
-}
-
-type Captcha struct {
-	KeyLong   int `mapstructure:"key-long" json:"keyLong" yaml:"key-long"`
-	ImgWidth  int `mapstructure:"img-width" json:"imgWidth" yaml:"img-width"`
-	ImgHeight int `mapstructure:"img-height" json:"imgHeight" yaml:"img-height"`
-}
-
-type Zap struct {
-	Level         string `mapstructure:"level" json:"level" yaml:"level"`
-	Format        string `mapstructure:"format" json:"format" yaml:"format"`
-	Prefix        string `mapstructure:"prefix" json:"prefix" yaml:"prefix"`
-	Director      string `mapstructure:"director" json:"director"  yaml:"director"`
-	LinkName      string `mapstructure:"link-name" json:"linkName" yaml:"link-name"`
-	ShowLine      bool   `mapstructure:"show-line" json:"showLine" yaml:"showLine"`
-	EncodeLevel   string `mapstructure:"encode-level" json:"encodeLevel" yaml:"encode-level"`
-	StacktraceKey string `mapstructure:"stacktrace-key" json:"stacktraceKey" yaml:"stacktrace-key"`
-	LogInConsole  bool   `mapstructure:"log-in-console" json:"logInConsole" yaml:"log-in-console"`
-}
-
-type Email struct {
-	EmailFrom     string `mapstructure:"email-from" json:"emailFrom" yaml:"email-from"`
-	EmailNickname string `mapstructure:"email-nickname" json:"emailNickname" yaml:"email-nickname"`
-	EmailSecret   string `mapstructure:"email-secret" json:"emailSecret" yaml:"email-secret"`
-	EmailTo       string `mapstructure:"email-to" json:"emailTo" yaml:"email-to"`
-	EmailHost     string `mapstructure:"email-host" json:"emailHost" yaml:"email-host"`
-	EmailPort     int    `mapstructure:"email-port" json:"emailPort" yaml:"email-port"`
-	EmailIsSSL    bool   `mapstructure:"email-is-ssl" json:"emailIsSSL" yaml:"email-is-ssl"`
+	JWT     JWT     `mapstructure:"jwt" json:"jwt" yaml:"jwt"`
+	Zap     Zap     `mapstructure:"zap" json:"zap" yaml:"zap"`
+	Redis   Redis   `mapstructure:"redis" json:"redis" yaml:"redis"`
+	Email   Email   `mapstructure:"email" json:"email" yaml:"email"`
+	Casbin  Casbin  `mapstructure:"casbin" json:"casbin" yaml:"casbin"`
+	System  System  `mapstructure:"system" json:"system" yaml:"system"`
+	Captcha Captcha `mapstructure:"captcha" json:"captcha" yaml:"captcha"`
+	// gorm
+	Mysql      Mysql      `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
+	Sqlite     Sqlite     `mapstructure:"sqlite" json:"sqlite" yaml:"sqlite"`
+	Sqlserver  Sqlserver  `mapstructure:"sqlserver" json:"sqlserver" yaml:"sqlserver"`
+	Postgresql Postgresql `mapstructure:"postgresql" json:"postgresql" yaml:"postgresql"`
+	// oss
+	Local Local `mapstructure:"local" json:"local" yaml:"local"`
+	Qiniu Qiniu `mapstructure:"qiniu" json:"qiniu" yaml:"qiniu"`
 }

+ 11 - 0
server/config/email.go

@@ -0,0 +1,11 @@
+package config
+
+type Email struct {
+	To       string `mapstructure:"to" json:"to" yaml:"to"`
+	Port     int    `mapstructure:"port" json:"port" yaml:"port"`
+	From     string `mapstructure:"from" json:"from" yaml:"from"`
+	Host     string `mapstructure:"host" json:"host" yaml:"host"`
+	IsSSL    bool   `mapstructure:"is-ssl" json:"isSSL" yaml:"is-ssl"`
+	Secret   string `mapstructure:"secret" json:"secret" yaml:"secret"`
+	Nickname string `mapstructure:"nickname" json:"nickname" yaml:"nickname"`
+}

+ 43 - 0
server/config/gorm.go

@@ -0,0 +1,43 @@
+package config
+
+type Mysql struct {
+	Path         string `mapstructure:"path" json:"path" yaml:"path"`
+	Config       string `mapstructure:"config" json:"config" yaml:"config"`
+	Dbname       string `mapstructure:"db-name" json:"dbname" yaml:"db-name"`
+	Username     string `mapstructure:"username" json:"username" yaml:"username"`
+	Password     string `mapstructure:"password" json:"password" yaml:"password"`
+	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
+	MaxOpenConns int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
+	LogMode      bool   `mapstructure:"log-mode" json:"logMode" yaml:"log-mode"`
+}
+
+type Sqlite struct {
+	Path         string `mapstructure:"path" json:"path" yaml:"path"`
+	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
+	MaxOpenConns int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
+	Logger       bool   `mapstructure:"logger" json:"logger" yaml:"logger"`
+}
+
+type Sqlserver struct {
+	Path         string `mapstructure:"path" json:"path" yaml:"path"`
+	Dbname       string `mapstructure:"db-name" json:"dbname" yaml:"db-name"`
+	Username     string `mapstructure:"username" json:"username" yaml:"username"`
+	Password     string `mapstructure:"password" json:"password" yaml:"password"`
+	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
+	MaxOpenConns int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
+	Logger       bool   `mapstructure:"logger" json:"logger" yaml:"logger"`
+}
+
+type Postgresql struct {
+	Host                 string `mapstructure:"host" json:"host" yaml:"host"`
+	Port                 string `mapstructure:"port" json:"port" yaml:"port"`
+	Config               string `mapstructure:"config" json:"config" yaml:"config"`
+	Dbname               string `mapstructure:"db-name" json:"dbname" yaml:"db-name"`
+	Username             string `mapstructure:"username" json:"username" yaml:"username"`
+	Password             string `mapstructure:"password" json:"password" yaml:"password"`
+	MaxIdleConns         int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
+	MaxOpenConns         int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
+	PreferSimpleProtocol bool   `mapstructure:"prefer-simple-protocol" json:"preferSimpleProtocol" yaml:"prefer-simple-protocol"`
+	Logger               bool   `mapstructure:"logger" json:"logger" yaml:"logger"`
+}
+

+ 5 - 0
server/config/jwt.go

@@ -0,0 +1,5 @@
+package config
+
+type JWT struct {
+	SigningKey string `mapstructure:"signing-key" json:"signingKey" yaml:"signing-key"`
+}

+ 15 - 0
server/config/oss.go

@@ -0,0 +1,15 @@
+package config
+
+type Local struct {
+	Path string `mapstructure:"path" json:"path" yaml:"path" `
+}
+
+type Qiniu struct {
+	Zone          string `mapstructure:"zone" json:"zone" yaml:"zone"`
+	Bucket        string `mapstructure:"bucket" json:"bucket" yaml:"bucket"`
+	ImgPath       string `mapstructure:"img-path" json:"imgPath" yaml:"img-path"`
+	UseHTTPS      bool   `mapstructure:"use-https" json:"useHttps" yaml:"use-https"`
+	AccessKey     string `mapstructure:"access-key" json:"accessKey" yaml:"access-key"`
+	SecretKey     string `mapstructure:"secret-key" json:"secretKey" yaml:"secret-key"`
+	UseCdnDomains bool   `mapstructure:"use-cdn-domains" json:"useCdnDomains" yaml:"use-cdn-domains"`
+}

+ 7 - 0
server/config/redis.go

@@ -0,0 +1,7 @@
+package config
+
+type Redis struct {
+	DB       int    `mapstructure:"db" json:"db" yaml:"db"`
+	Addr     string `mapstructure:"addr" json:"addr" yaml:"addr"`
+	Password string `mapstructure:"password" json:"password" yaml:"password"`
+}

+ 11 - 0
server/config/system.go

@@ -0,0 +1,11 @@
+package config
+
+type System struct {
+	Env           string `mapstructure:"env" json:"env" yaml:"env"`
+	Addr          int    `mapstructure:"addr" json:"addr" yaml:"addr"`
+	DbType        string `mapstructure:"db-type" json:"dbType" yaml:"db-type"`
+	OssType       string `mapstructure:"oss-type" json:"ossType" yaml:"oss-type"`
+	ConfigEnv     string `mapstructure:"config-env" json:"configEnv" yaml:"config-env"`
+	NeedInitData  bool   `mapstructure:"need-init-data" json:"needInitData" yaml:"need-init-data"`
+	UseMultipoint bool   `mapstructure:"use-multipoint" json:"useMultipoint" yaml:"use-multipoint"`
+}

+ 13 - 0
server/config/zap.go

@@ -0,0 +1,13 @@
+package config
+
+type Zap struct {
+	Level         string `mapstructure:"level" json:"level" yaml:"level"`
+	Format        string `mapstructure:"format" json:"format" yaml:"format"`
+	Prefix        string `mapstructure:"prefix" json:"prefix" yaml:"prefix"`
+	Director      string `mapstructure:"director" json:"director"  yaml:"director"`
+	LinkName      string `mapstructure:"link-name" json:"linkName" yaml:"link-name"`
+	ShowLine      bool   `mapstructure:"show-line" json:"showLine" yaml:"showLine"`
+	EncodeLevel   string `mapstructure:"encode-level" json:"encodeLevel" yaml:"encode-level"`
+	StacktraceKey string `mapstructure:"stacktrace-key" json:"stacktraceKey" yaml:"stacktrace-key"`
+	LogInConsole  bool   `mapstructure:"log-in-console" json:"logInConsole" yaml:"log-in-console"`
+}

+ 6 - 0
server/gva/init_data/init_data.go

@@ -87,6 +87,8 @@ func InitSysApi() (err error) {
 		{gorm.Model{ID: 63, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/simpleUploader/checkFileMd5", "文件完整度验证", "simpleUploader", "GET"},
 		{gorm.Model{ID: 64, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/simpleUploader/mergeFileMd5", "上传完成合并文件", "simpleUploader", "GET"},
 		{gorm.Model{ID: 65, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/user/setUserInfo", "设置用户信息", "user", "PUT"},
+		{gorm.Model{ID: 66, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/system/getServerInfo", "获取服务器信息", "system", "POST"},
+		{gorm.Model{ID: 67, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/email/emailTest", "发送测试邮件", "email", "POST"},
 	}
 	if tx.Create(&insert).Error != nil { // 遇到错误时回滚事务
 		tx.Rollback()
@@ -161,6 +163,7 @@ func InitCasbinModel() (err error) {
 		{"p", "888", "/jwt/jsonInBlacklist", "POST"},
 		{"p", "888", "/system/getSystemConfig", "POST"},
 		{"p", "888", "/system/setSystemConfig", "POST"},
+		{"p", "888", "/system/getServerInfo", "POST"},
 		{"p", "888", "/customer/customer", "POST"},
 		{"p", "888", "/customer/customer", "PUT"},
 		{"p", "888", "/customer/customer", "DELETE"},
@@ -187,6 +190,7 @@ func InitCasbinModel() (err error) {
 		{"p", "888", "/sysOperationRecord/getSysOperationRecordList", "GET"},
 		{"p", "888", "/sysOperationRecord/deleteSysOperationRecordByIds", "DELETE"},
 		{"p", "888", "/user/setUserInfo", "PUT"},
+		{"p", "888", "/email/emailTest", "POST"},
 		{"p", "8881", "/base/login", "POST"},
 		{"p", "8881", "/base/register", "POST"},
 		{"p", "8881", "/api/createApi", "POST"},
@@ -311,6 +315,7 @@ func InitSysBaseMenus() (err error) {
 		{Model: gorm.Model{ID: 24, CreatedAt: time.Now(), UpdatedAt: time.Now()}, MenuLevel: 0, Hidden: false, ParentId: "3", Path: "operation", Name: "operation", Component: "view/superAdmin/operation/sysOperationRecord.vue", Sort: 6, Meta: model.Meta{Title: "操作历史", Icon: "time"}},
 		{Model: gorm.Model{ID: 25, CreatedAt: time.Now(), UpdatedAt: time.Now()}, MenuLevel: 0, Hidden: false, ParentId: "9", Path: "simpleUploader", Name: "simpleUploader", Component: "view/example/simpleUploader/simpleUploader", Sort: 6, Meta: model.Meta{Title: "断点续传(插件版)", Icon: "upload"}},
 		{Model: gorm.Model{ID: 26, CreatedAt: time.Now(), UpdatedAt: time.Now()}, MenuLevel: 0, ParentId: "0", Path: "https://www.gin-vue-admin.com", Name: "https://www.gin-vue-admin.com", Hidden: false, Component: "/", Sort: 0, Meta: model.Meta{Title: "官方网站", Icon: "s-home"}},
+		{Model: gorm.Model{ID: 27, CreatedAt: time.Now(), UpdatedAt: time.Now()}, MenuLevel: 0, ParentId: "0", Path: "state", Name: "state", Hidden: false, Component: "view/system/state.vue", Sort: 6, Meta: model.Meta{Title: "服务器状态", Icon: "cloudy"}},
 	}
 	if tx.Create(&insert).Error != nil { // 遇到错误时回滚事务
 		tx.Rollback()
@@ -369,6 +374,7 @@ func InitSysAuthorityMenus() (err error) {
 		{"888", 24},
 		{"888", 25},
 		{"888", 26},
+		{"888", 27},
 		{"8881", 1},
 		{"8881", 2},
 		{"8881", 8},

+ 2 - 0
server/initialize/gorm.go

@@ -25,6 +25,8 @@ func Gorm() {
 	//	GormSqlite()
 	case "sqlserver":
 		GormSqlServer()
+	default:
+		GormMysql()
 	}
 }
 

+ 1 - 2
server/initialize/router.go

@@ -15,8 +15,7 @@ import (
 
 func Routers() *gin.Engine {
 	var Router = gin.Default()
-	// 为用户头像和文件提供静态地址
-	Router.StaticFS(global.GVA_CONFIG.LocalUpload.FilePath, http.Dir(global.GVA_CONFIG.LocalUpload.FilePath))
+	Router.StaticFS(global.GVA_CONFIG.Local.Path, http.Dir(global.GVA_CONFIG.Local.Path)) // 为用户头像和文件提供静态地址
 	// Router.Use(middleware.LoadTls())  // 打开就能玩https了
 	global.GVA_LOG.Info("use middleware logger")
 	// 跨域

+ 6 - 8
server/middleware/email.go

@@ -19,10 +19,10 @@ func ErrorToEmail() gin.HandlerFunc {
 		if claims, ok := c.Get("claims"); ok {
 			waitUse := claims.(*request.CustomClaims)
 			username = waitUse.Username
-		}else {
+		} else {
 			id, _ := strconv.Atoi(c.Request.Header.Get("x-user-id"))
 			err, user := service.FindUserById(id)
-			if err != nil{
+			if err != nil {
 				username = "Unknown"
 			}
 			username = user.Username
@@ -43,12 +43,10 @@ func ErrorToEmail() gin.HandlerFunc {
 		status := c.Writer.Status()
 		record.ErrorMessage = c.Errors.ByType(gin.ErrorTypePrivate).String()
 		str := "接收到的请求为" + record.Body + "\n" + "请求方式为" + record.Method + "\n" + "报错信息如下" + record.ErrorMessage + "\n" + "耗时" + latency.String() + "\n"
-		if global.GVA_CONFIG.System.ErrorToEmail {
-			if status != 200 {
-				subject := username + "" +record.Ip + "调用了" + record.Path + "报错了"
-				if err := utils.ErrorToEmail(subject, str); err != nil {
-					global.GVA_LOG.Error("ErrorToEmail Failed, err:", zap.Any("err", err))
-				}
+		if status != 200 {
+			subject := username + "" + record.Ip + "调用了" + record.Path + "报错了"
+			if err := utils.ErrorToEmail(subject, str); err != nil {
+				global.GVA_LOG.Error("ErrorToEmail Failed, err:", zap.Any("err", err))
 			}
 		}
 	}

+ 6 - 0
server/middleware/jwt.go

@@ -49,6 +49,12 @@ func JWTAuth() gin.HandlerFunc {
 			c.Abort()
 			return
 		}
+		if err, _ = service.FindUserByUuid(claims.UUID.String()); err != nil{
+			response.Result(response.ERROR, gin.H{
+				"reload": true,
+			}, err.Error(), c)
+			c.Abort()
+		}
 		if claims.ExpiresAt - time.Now().Unix()<claims.BufferTime {
 			claims.ExpiresAt = time.Now().Unix() + 60*60*24*7
 			newToken,_ := j.CreateToken(*claims)

+ 1 - 1
server/middleware/operation.go

@@ -47,7 +47,7 @@ func OperationRecord() gin.HandlerFunc {
 			UserID: userId,
 		}
 		values := c.Request.Header.Values("content-type")
-		if strings.Contains(values[0], "boundary"){
+		if len(values) >0 && strings.Contains(values[0], "boundary") {
 			record.Body = "file"
 		}
 		writer := responseBodyWriter{

+ 4 - 4
server/router/sys_system.go

@@ -2,14 +2,14 @@ package router
 
 import (
 	"gin-vue-admin/api/v1"
-	"gin-vue-admin/middleware"
 	"github.com/gin-gonic/gin"
 )
 
 func InitSystemRouter(Router *gin.RouterGroup) {
-	UserRouter := Router.Group("system").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
+	SystemRouter := Router.Group("system")
 	{
-		UserRouter.POST("getSystemConfig", v1.GetSystemConfig) // 获取配置文件内容
-		UserRouter.POST("setSystemConfig", v1.SetSystemConfig) // 设置配置文件内容
+		SystemRouter.POST("getSystemConfig", v1.GetSystemConfig) // 获取配置文件内容
+		SystemRouter.POST("setSystemConfig", v1.SetSystemConfig) // 设置配置文件内容
+		SystemRouter.POST("getServerInfo", v1.GetServerInfo)     // 获取服务器信息
 	}
 }

+ 15 - 26
server/service/exa_file_upload_download.go

@@ -5,9 +5,8 @@ import (
 	"gin-vue-admin/global"
 	"gin-vue-admin/model"
 	"gin-vue-admin/model/request"
-	"gin-vue-admin/utils"
+	"gin-vue-admin/utils/upload"
 	"mime/multipart"
-	"os"
 	"strings"
 )
 
@@ -43,19 +42,9 @@ func FindFile(id uint) (error, model.ExaFileUploadAndDownload) {
 func DeleteFile(file model.ExaFileUploadAndDownload) (err error) {
 	var fileFromDb model.ExaFileUploadAndDownload
 	err, fileFromDb = FindFile(file.ID)
-	if err != nil {
-		return errors.New("文件不存在")
-	}
-	if global.GVA_CONFIG.LocalUpload.Local { // 删除本地文件
-		if strings.Contains(fileFromDb.Url, global.GVA_CONFIG.LocalUpload.FilePath) {
-			if err = os.Remove(fileFromDb.Url); err != nil {
-				err = errors.New("本地文件删除失败, err:" + err.Error())
-			}
-		}
-	} else {
-		if err = utils.DeleteFile(file.Key); err != nil { // 删除七牛云文件
-			err = errors.New("七牛云文件删除失败, err:" + err.Error())
-		}
+	oss := upload.NewOss()
+	if err = oss.DeleteFile(fileFromDb.Key); err != nil{
+		return errors.New("文件删除失败")
 	}
 	err = global.GVA_DB.Where("id = ?", file.ID).Unscoped().Delete(file).Error
 	return err
@@ -88,19 +77,19 @@ func GetFileRecordInfoList(info request.PageInfo) (err error, list interface{},
 // @return    file            file model.ExaFileUploadAndDownload
 
 func UploadFile(header *multipart.FileHeader, noSave string) (err error, file model.ExaFileUploadAndDownload) {
-	var filePath, key string
-	var f model.ExaFileUploadAndDownload
-	if global.GVA_CONFIG.LocalUpload.Local { // 本地上传
-		err, filePath, key = utils.UploadFileLocal(header)
-	} else { // 七牛云上传
-		err, filePath, key = utils.UploadRemote(header)
+	oss := upload.NewOss()
+	filePath, key, uploadErr := oss.UploadFile(header)
+	if uploadErr != nil {
+		panic(err)
 	}
 	if noSave == "0" {
-		f.Url = filePath
-		f.Name = header.Filename
-		s := strings.Split(f.Name, ".")
-		f.Tag = s[len(s)-1]
-		f.Key = key
+		s := strings.Split(header.Filename, ".")
+		f := model.ExaFileUploadAndDownload{
+			Url:  filePath,
+			Name: header.Filename,
+			Tag:  s[len(s)-1],
+			Key:  key,
+		}
 		return Upload(f), f
 	}
 	return

+ 28 - 0
server/service/sys_system.go

@@ -5,6 +5,7 @@ import (
 	"gin-vue-admin/global"
 	"gin-vue-admin/model"
 	"gin-vue-admin/utils"
+	"go.uber.org/zap"
 )
 
 // @title    GetSystemConfig
@@ -31,3 +32,30 @@ func SetSystemConfig(system model.System) (err error) {
 	err = global.GVA_VP.WriteConfig()
 	return err
 }
+
+
+// @title    GetServerInfo
+// @description   get server info , 获取服务器信息
+// @auth                    (2020/04/05  20:22)
+// @return    server         *utils.Server
+// @return    err            error
+
+func GetServerInfo() (server *utils.Server, err error) {
+	var s utils.Server
+	s.Os = utils.InitOS()
+	if s.Cpu, err = utils.InitCPU(); err != nil{
+		global.GVA_LOG.Error("func utils.InitCPU() Failed!", zap.String("err", err.Error()))
+		return &s, err
+	}
+	if s.Rrm, err = utils.InitRAM(); err != nil{
+		global.GVA_LOG.Error("func utils.InitRAM() Failed!", zap.String("err", err.Error()))
+		return &s, err
+	}
+	if s.Disk, err = utils.InitDisk(); err != nil{
+		global.GVA_LOG.Error("func utils.InitDisk() Failed!", zap.String("err", err.Error()))
+		return &s, err
+	}
+
+	return &s, nil
+}
+

+ 15 - 0
server/service/sys_user.go

@@ -125,3 +125,18 @@ func FindUserById(id int) (err error, user *model.SysUser) {
 	err = global.GVA_DB.Where("`id` = ?", id).First(&u).Error
 	return err, &u
 }
+
+// @title    FindUserByUuid
+// @description   Get user information by uuid, 通过uuid获取用户信息
+// @auth                     (2020/04/05  20:22)
+// @param     uuid            string
+// @return    err             error
+// @return    user            *model.SysUser
+
+func FindUserByUuid(uuid string) (err error, user *model.SysUser) {
+	var u model.SysUser
+	if err = global.GVA_DB.Where("`uuid` = ?", uuid).First(&u).Error; err != nil{
+		return errors.New("用户不存在"), &u
+	}
+	return nil, &u
+}

+ 9 - 9
server/utils/email.go

@@ -12,13 +12,13 @@ import (
 )
 
 func Email(subject string, body string) error {
-	to := strings.Split(global.GVA_CONFIG.Email.EmailTo, ",")
+	to := strings.Split(global.GVA_CONFIG.Email.To, ",")
 	return send(to, subject, body)
 }
 
 // ErrorToEmail Error 发送邮件
 func ErrorToEmail(subject string, body string) error {
-	to := strings.Split(global.GVA_CONFIG.Email.EmailTo, ",")
+	to := strings.Split(global.GVA_CONFIG.Email.To, ",")
 	if to[len(to)-1] == "" { // 判断切片的最后一个元素是否为空,为空则移除
 		to = to[:len(to)-1]
 	}
@@ -26,17 +26,17 @@ func ErrorToEmail(subject string, body string) error {
 }
 
 func EmailTest(subject string, body string) error {
-	to := []string{global.GVA_CONFIG.Email.EmailFrom}
+	to := []string{global.GVA_CONFIG.Email.From}
 	return send(to, subject, body)
 }
 
 func send(to []string, subject string, body string) error {
-	from := global.GVA_CONFIG.Email.EmailFrom
-	nickname := global.GVA_CONFIG.Email.EmailNickname
-	secret := global.GVA_CONFIG.Email.EmailSecret
-	host := global.GVA_CONFIG.Email.EmailHost
-	port := global.GVA_CONFIG.Email.EmailPort
-	isSSL := global.GVA_CONFIG.Email.EmailIsSSL
+	from := global.GVA_CONFIG.Email.From
+	nickname := global.GVA_CONFIG.Email.Nickname
+	secret := global.GVA_CONFIG.Email.Secret
+	host := global.GVA_CONFIG.Email.Host
+	port := global.GVA_CONFIG.Email.Port
+	isSSL := global.GVA_CONFIG.Email.IsSSL
 
 	auth := smtp.PlainAuth("", from, secret, host)
 	e := email.NewEmail()

+ 79 - 39
server/utils/server.go

@@ -1,14 +1,13 @@
 package utils
 
 import (
-	"fmt"
 	"github.com/shirou/gopsutil/cpu"
 	"github.com/shirou/gopsutil/disk"
-	"github.com/shirou/gopsutil/load"
 	"github.com/shirou/gopsutil/mem"
 	"runtime"
 	"time"
 )
+
 const (
 	B  = 1
 	KB = 1024 * B
@@ -16,47 +15,88 @@ const (
 	GB = 1024 * MB
 )
 
-//服务器硬盘使用量
-func DiskCheck() {
-	u, _ := disk.Usage("/")
-	usedMB := int(u.Used) / MB
-	usedGB := int(u.Used) / GB
-	totalMB := int(u.Total) / MB
-	totalGB := int(u.Total) / GB
-	usedPercent := int(u.UsedPercent)
-	fmt.Printf("Free space: %dMB (%dGB) / %dMB (%dGB) | Used: %d%%\n", usedMB, usedGB, totalMB, totalGB, usedPercent)
+type Server struct {
+	Os   Os   `json:"os"`
+	Cpu  Cpu  `json:"cpu"`
+	Rrm  Rrm  `json:"ram"`
+	Disk Disk `json:"disk"`
+}
+
+type Os struct {
+	GOOS         string `json:"goos"`
+	NumCPU       int    `json:"numCpu"`
+	Compiler     string `json:"compiler"`
+	GoVersion    string `json:"goVersion"`
+	NumGoroutine int    `json:"numGoroutine"`
+}
+
+type Cpu struct {
+	Cpus  []float64 `json:"cpus"`
+	Cores int       `json:"cores"`
+}
+
+
+type Rrm struct {
+	UsedMB      int `json:"usedMb"`
+	TotalMB     int `json:"totalMb"`
+	UsedPercent int `json:"usedPercent"`
 }
 
-//OS
-func OSCheck() {
-	fmt.Printf("goOs:%s,compiler:%s,numCpu:%d,version:%s,numGoroutine:%d\n", runtime.GOOS, runtime.Compiler, runtime.NumCPU(), runtime.Version(), runtime.NumGoroutine())
+type Disk struct {
+	UsedMB      int `json:"usedMb"`
+	UsedGB      int `json:"usedGb"`
+	TotalMB     int `json:"totalMb"`
+	TotalGB     int `json:"totalGb"`
+	UsedPercent int `json:"usedPercent"`
 }
 
-//CPU 使用量
-func CPUCheck() {
-	cores, _ := cpu.Counts(false)
+// InitOS OS信息
+func InitOS() (o Os) {
+	o.GOOS = runtime.GOOS
+	o.NumCPU = runtime.NumCPU()
+	o.Compiler = runtime.Compiler
+	o.GoVersion = runtime.Version()
+	o.NumGoroutine = runtime.NumGoroutine()
+	return o
+}
+
+// InitCPU CPU信息
+func InitCPU() (c Cpu, err error) {
+	if cores, err := cpu.Counts(false); err != nil {
+		return c, err
+	} else {
+		c.Cores = cores
+	}
+	if cpus, err := cpu.Percent(time.Duration(200)*time.Millisecond, true); err != nil {
+		return c, err
+	} else {
+		c.Cpus = cpus
+	}
+	return c, nil
+}
+
+// InitRAM ARM信息
+func InitRAM() (r Rrm, err error) {
+	if u, err := mem.VirtualMemory(); err != nil{
+		return r, err
+	}else {
+		r.UsedMB = int(u.Used) / MB
+		r.TotalMB = int(u.Total) / MB
+		r.UsedPercent = int(u.UsedPercent)
+	}
+	return r, nil
+}
 
-	cpus, err := cpu.Percent(time.Duration(200)*time.Millisecond, true)
-	if err == nil {
-		for i, c := range cpus {
-			fmt.Printf("cpu%d : %f%%\n", i, c)
-		}
+// InitDisk 硬盘信息
+func InitDisk() (d Disk, err error) {
+	if u, err := disk.Usage("/"); err != nil{
+		return d, err
+	} else {
+		d.UsedMB = int(u.Used) / MB
+		d.UsedGB = int(u.Used) / GB
+		d.TotalMB = int(u.Total) / MB
+		d.TotalGB = int(u.Total) / GB
+		d.UsedPercent = int(u.UsedPercent)
 	}
-	a, _ := load.Avg()
-	l1 := a.Load1
-	l5 := a.Load5
-	l15 := a.Load15
-	fmt.Println(l1)
-	fmt.Println(l5)
-	fmt.Println(l15)
-	fmt.Println(cores)
-}
-
-//内存使用量
-func RAMCheck() {
-	u, _ := mem.VirtualMemory()
-	usedMB := int(u.Used) / MB
-	totalMB := int(u.Total) / MB
-	usedPercent := int(u.UsedPercent)
-	fmt.Printf("usedMB:%d,totalMB:%d,usedPercent:%d", usedMB, totalMB, usedPercent)
+	return d, nil
 }

+ 67 - 0
server/utils/upload/local.go

@@ -0,0 +1,67 @@
+package upload
+import (
+	"errors"
+	"gin-vue-admin/global"
+	"gin-vue-admin/utils"
+	"go.uber.org/zap"
+	"io"
+	"mime/multipart"
+	"os"
+	"path"
+	"strings"
+	"time"
+)
+
+type Local struct{}
+
+// UploadFile 上传文件
+func (l Local) UploadFile(file *multipart.FileHeader) (string, string, error) {
+	// 读取文件后缀
+	ext := path.Ext(file.Filename)
+	// 读取文件名并加密
+	name := strings.TrimSuffix(file.Filename, ext)
+	name = utils.MD5V([]byte(name))
+	// 拼接新文件名
+	filename := name + "_" + time.Now().Format("20060102150405") + ext
+	// 尝试创建此路径
+	mkdirErr := os.MkdirAll(global.GVA_CONFIG.Local.Path, os.ModePerm)
+	if mkdirErr != nil {
+		global.GVA_LOG.Error("function os.MkdirAll() Filed", zap.Any("err", mkdirErr.Error()))
+		return "", "", errors.New("function os.MkdirAll() Filed, err:" + mkdirErr.Error())
+	}
+	// 拼接路径和文件名
+	p := global.GVA_CONFIG.Local.Path + "/" + filename
+
+	f, openError := file.Open() // 读取文件
+	if openError != nil {
+		global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
+		return "", "", errors.New("function file.Open() Filed, err:" + openError.Error())
+	}
+	defer f.Close() // 创建文件 defer 关闭
+
+	out, createErr := os.Create(p)
+	if createErr != nil {
+		global.GVA_LOG.Error("function os.Create() Filed", zap.Any("err", createErr.Error()))
+
+		return "", "", errors.New("function os.Create() Filed, err:" + createErr.Error())
+	}
+	defer out.Close() // 创建文件 defer 关闭
+
+	_, copyErr := io.Copy(out, f) // 传输(拷贝)文件
+	if copyErr != nil {
+		global.GVA_LOG.Error("function io.Copy() Filed", zap.Any("err", copyErr.Error()))
+		return "", "", errors.New("function io.Copy() Filed, err:" + copyErr.Error())
+	}
+	return p, filename, nil
+}
+
+// DeleteFile 删除文件
+func (l Local) DeleteFile(key string) error {
+	p := global.GVA_CONFIG.Local.Path + "/" + key
+	if strings.Contains(p, global.GVA_CONFIG.Local.Path) {
+		if err := os.Remove(p); err != nil {
+			return errors.New("本地文件删除失败, err:" + err.Error())
+		}
+	}
+	return nil
+}

+ 73 - 0
server/utils/upload/qiniu.go

@@ -0,0 +1,73 @@
+package upload
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"gin-vue-admin/global"
+	"github.com/qiniu/api.v7/v7/auth/qbox"
+	"github.com/qiniu/api.v7/v7/storage"
+	"go.uber.org/zap"
+	"mime/multipart"
+	"time"
+)
+
+type Qiniu struct{}
+
+// Upload 上传文件
+func (*Qiniu) UploadFile(file *multipart.FileHeader) (string, string, error) {
+	putPolicy := storage.PutPolicy{Scope: global.GVA_CONFIG.Qiniu.Bucket}
+	mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
+	upToken := putPolicy.UploadToken(mac)
+	cfg := qiniuConfig()
+	formUploader := storage.NewFormUploader(cfg)
+	ret := storage.PutRet{}
+	putExtra := storage.PutExtra{Params: map[string]string{"x:name": "github logo"}}
+
+	f, openError := file.Open()
+	if openError != nil {
+		global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
+
+		return "", "", errors.New("function file.Open() Filed, err:" + openError.Error())
+	}
+	fileKey := fmt.Sprintf("%d%s", time.Now().Unix(), file.Filename) // 文件名格式 自己可以改 建议保证唯一性
+	putErr := formUploader.Put(context.Background(), &ret, upToken, fileKey, f, file.Size, &putExtra)
+	if putErr != nil {
+		global.GVA_LOG.Error("function formUploader.Put() Filed", zap.Any("err", putErr.Error()))
+		return "", "", errors.New("function formUploader.Put() Filed, err:" + putErr.Error())
+	}
+	return global.GVA_CONFIG.Qiniu.ImgPath + "/" + ret.Key, ret.Key, nil
+}
+
+// DeleteFile 删除文件
+func (*Qiniu) DeleteFile(key string) error {
+	mac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)
+	cfg := qiniuConfig()
+	bucketManager := storage.NewBucketManager(mac, cfg)
+	if err := bucketManager.Delete(global.GVA_CONFIG.Qiniu.Bucket, key); err != nil{
+		global.GVA_LOG.Error("function bucketManager.Delete() Filed", zap.Any("err", err.Error()))
+		return errors.New("function bucketManager.Delete() Filed, err:" + err.Error())
+	}
+	return nil
+}
+
+// config 根据配置文件进行返回七牛云的配置
+func qiniuConfig() *storage.Config {
+	cfg := storage.Config{
+		UseHTTPS: global.GVA_CONFIG.Qiniu.UseHTTPS,
+		UseCdnDomains: global.GVA_CONFIG.Qiniu.UseCdnDomains,
+	}
+	switch global.GVA_CONFIG.Qiniu.Zone { // 根据配置文件进行初始化空间对应的机房
+	case "ZoneHuadong":
+		cfg.Zone = &storage.ZoneHuadong
+	case "ZoneHuabei":
+		cfg.Zone = &storage.ZoneHuabei
+	case "ZoneHuanan":
+		cfg.Zone = &storage.ZoneHuanan
+	case "ZoneBeimei":
+		cfg.Zone = &storage.ZoneBeimei
+	case "ZoneXinjiapo":
+		cfg.Zone = &storage.ZoneXinjiapo
+	}
+	return &cfg
+}

+ 24 - 0
server/utils/upload/upload.go

@@ -0,0 +1,24 @@
+package upload
+
+import (
+	"gin-vue-admin/global"
+	"mime/multipart"
+)
+
+var Oss OSS
+
+type OSS interface {
+	UploadFile(file *multipart.FileHeader) (string, string, error)
+	DeleteFile(key string) error
+}
+
+func NewOss() OSS {
+	switch global.GVA_CONFIG.System.OssType {
+	case "local":
+		return &Local{}
+	case "qiniu":
+		return &Qiniu{}
+	default:
+		return &Local{}
+	}
+}

+ 1 - 1
server/utils/upload_file_local.go

@@ -20,7 +20,7 @@ func UploadFileLocal(file *multipart.FileHeader) (err error, localPath string, k
 	// 拼接新文件名
 	lastName := fileName + "_" + time.Now().Format("20060102150405") + ext
 	// 读取全局变量的定义路径
-	savePath := global.GVA_CONFIG.LocalUpload.FilePath
+	savePath := global.GVA_CONFIG.Local.Path
 	// 尝试创建此路径
 	err = os.MkdirAll(savePath, os.ModePerm)
 	if err != nil {

+ 25 - 12
web/src/api/system.js

@@ -1,4 +1,4 @@
-import service from '@/utils/request'
+import service from "@/utils/request";
 
 // @Tags systrm
 // @Summary 获取配置文件内容
@@ -7,11 +7,11 @@ import service from '@/utils/request'
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
 // @Router /system/getSystemConfig [post]
 export const getSystemConfig = () => {
-    return service({
-        url: "/system/getSystemConfig",
-        method: 'post',
-    })
-}
+  return service({
+    url: "/system/getSystemConfig",
+    method: "post",
+  });
+};
 
 // @Tags system
 // @Summary 设置配置文件内容
@@ -21,9 +21,22 @@ export const getSystemConfig = () => {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
 // @Router /system/setSystemConfig [post]
 export const setSystemConfig = (data) => {
-    return service({
-        url: "/system/setSystemConfig",
-        method: 'post',
-        data
-    })
-}
+  return service({
+    url: "/system/setSystemConfig",
+    method: "post",
+    data,
+  });
+};
+
+// @Tags system
+// @Summary 获取服务器运行状态
+// @Security ApiKeyAuth
+// @Produce  application/json
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
+// @Router /system/getServerInfo [post]
+export const getSystemState = () => {
+  return service({
+    url: "/system/getServerInfo",
+    method: "post",
+  });
+};

+ 1 - 1
web/src/view/example/simpleUploader/simpleUploader.vue

@@ -94,7 +94,7 @@ export default {
           return false;
         }
         md5 = SparkMD5.ArrayBuffer.hash(e.target.result, false);
-        
+
         file.uniqueIdentifier = md5;
         if (md5 != "") {
           const res = await checkFileMd5({ md5: md5 });

+ 169 - 0
web/src/view/system/state.vue

@@ -0,0 +1,169 @@
+<template>
+  <div>
+    <el-row :gutter="15" class="system_state">
+      <el-col :span="12">
+        <el-card v-if="state.os" class="card_item">
+          <div slot="header">Runtime</div>
+          <div>
+            <el-row :gutter="10">
+              <el-col :span="12">os:</el-col>
+              <el-col :span="12" v-text="state.os.goos"></el-col>
+            </el-row>
+            <el-row :gutter="10">
+              <el-col :span="12">cpu nums:</el-col>
+              <el-col :span="12" v-text="state.os.numCpu"></el-col>
+            </el-row>
+            <el-row :gutter="10">
+              <el-col :span="12">compiler:</el-col>
+              <el-col :span="12" v-text="state.os.compiler"></el-col>
+            </el-row>
+            <el-row :gutter="10">
+              <el-col :span="12">go version:</el-col>
+              <el-col :span="12" v-text="state.os.goVersion"></el-col>
+            </el-row>
+            <el-row :gutter="10">
+              <el-col :span="12">goroutine nums:</el-col>
+              <el-col :span="12" v-text="state.os.numGoroutine"></el-col>
+            </el-row>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="12">
+        <el-card v-if="state.disk" class="card_item">
+          <div slot="header">Disk</div>
+          <div>
+            <el-row :gutter="10">
+              <el-col :span="12">
+                <el-row :gutter="10">
+                  <el-col :span="12">total (MB)</el-col>
+                  <el-col :span="12" v-text="state.disk.totalMb"></el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :span="12">used (MB)</el-col>
+                  <el-col :span="12" v-text="state.disk.usedMb"></el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :span="12">total (GB)</el-col>
+                  <el-col :span="12" v-text="state.disk.totalGb"></el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :span="12">used (GB)</el-col>
+                  <el-col :span="12" v-text="state.disk.usedGb"></el-col>
+                </el-row>
+              </el-col>
+              <el-col :span="12">
+                <el-progress
+                  type="dashboard"
+                  :percentage="state.disk.usedPercent"
+                  :color="colors"
+                ></el-progress>
+              </el-col>
+            </el-row>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+    <el-row :gutter="15" class="system_state">
+      <el-col :span="12">
+        <el-card
+          class="card_item"
+          v-if="state.cpu"
+          :body-style="{ height: '180px', 'overflow-y': 'scroll' }"
+        >
+          <div slot="header">CPU</div>
+          <div>
+            <el-row :gutter="10">
+              <el-col :span="12">physical number of cores:</el-col>
+              <el-col :span="12" v-text="state.cpu.cores"> </el-col>
+            </el-row>
+            <template v-for="(item, index) in state.cpu.cpus">
+              <el-row :key="index" :gutter="10">
+                <el-col :span="12">core {{ index }}:</el-col>
+                <el-col :span="12"
+                  ><el-progress
+                    type="line"
+                    :percentage="+item.toFixed(0)"
+                    :color="colors"
+                  ></el-progress
+                ></el-col>
+              </el-row>
+            </template>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="12">
+        <el-card class="card_item" v-if="state.ram">
+          <div slot="header">Ram</div>
+          <div>
+            <el-row :gutter="10">
+              <el-col :span="12">
+                <el-row :gutter="10">
+                  <el-col :span="12">total (MB)</el-col>
+                  <el-col :span="12" v-text="state.ram.totalMb"></el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :span="12">used (MB)</el-col>
+                  <el-col :span="12" v-text="state.ram.usedMb"></el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :span="12">total (GB)</el-col>
+                  <el-col :span="12" v-text="state.ram.totalMb / 1024"></el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :span="12">used (GB)</el-col>
+                  <el-col
+                    :span="12"
+                    v-text="(state.ram.usedMb / 1024).toFixed(2)"
+                  ></el-col>
+                </el-row>
+              </el-col>
+              <el-col :span="12">
+                <el-progress
+                  type="dashboard"
+                  :percentage="state.ram.usedPercent"
+                  :color="colors"
+                ></el-progress>
+              </el-col>
+            </el-row>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { getSystemState } from "@/api/system.js";
+export default {
+  name: "State",
+  data() {
+    return {
+      state: {},
+      colors: [
+        { color: "#5cb87a", percentage: 20 },
+        { color: "#e6a23c", percentage: 40 },
+        { color: "#f56c6c", percentage: 80 },
+      ],
+    };
+  },
+  created() {
+    this.reload();
+  },
+  methods: {
+    async reload() {
+      const { data } = await getSystemState();
+      this.state = data.server;
+    },
+  },
+};
+</script>
+
+<style>
+.system_state {
+  padding: 10px;
+}
+
+.card_item {
+  height: 280px;
+}
+</style>

+ 175 - 123
web/src/view/systemTools/system/system.vue

@@ -1,10 +1,8 @@
 <template>
   <div class="system">
     <el-form :model="config" label-width="100px" ref="form" class="system">
+      <!--  System start  -->
       <h2>系统配置</h2>
-      <el-form-item label="多点登录拦截">
-        <el-checkbox v-model="config.system.useMultipoint">开启</el-checkbox>
-      </el-form-item>
       <el-form-item label="环境值">
         <el-input v-model="config.system.env"></el-input>
       </el-form-item>
@@ -13,20 +11,126 @@
       </el-form-item>
       <el-form-item label="数据库类型">
         <el-select v-model="config.system.dbType">
-          <el-option value="sqlite"></el-option>
           <el-option value="mysql"></el-option>
-          <el-option value="postgresql"></el-option>
+          <el-option value="sqlite"></el-option>
           <el-option value="sqlserver"></el-option>
+          <el-option value="postgresql"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="Oss类型">
+        <el-select v-model="config.system.ossType">
+          <el-option value="local"></el-option>
+          <el-option value="qiniu"></el-option>
         </el-select>
       </el-form-item>
+      <el-form-item label="配置文件环境变量名">
+        <el-input v-model.number="config.system.configEnv"></el-input>
+      </el-form-item>
+      <el-form-item label="数据初始化">
+        <el-checkbox v-model="config.system.needInitData">开启</el-checkbox>
+      </el-form-item>
+      <el-form-item label="多点登录拦截">
+        <el-checkbox v-model="config.system.useMultipoint">开启</el-checkbox>
+      </el-form-item>
+      <!--  System end  -->
+
+      <!--  JWT start  -->
       <h2>jwt签名</h2>
       <el-form-item label="jwt签名">
         <el-input v-model="config.jwt.signingKey"></el-input>
       </el-form-item>
+      <!--  JWT end  -->
+
+      <!--  Zap start  -->
+      <h2>Zap日志配置</h2>
+      <el-form-item label="级别">
+        <el-input v-model.number="config.zap.level"></el-input>
+      </el-form-item>
+      <el-form-item label="输出">
+        <el-input v-model="config.zap.format"></el-input>
+      </el-form-item>
+      <el-form-item label="日志前缀">
+        <el-input v-model="config.zap.prefix"></el-input>
+      </el-form-item>
+      <el-form-item label="日志文件夹">
+        <el-input v-model="config.zap.director"></el-input>
+      </el-form-item>
+      <el-form-item label="软链接名称">
+        <el-input v-model="config.zap.linkName"></el-input>
+      </el-form-item>
+      <el-form-item label="编码级">
+        <el-input v-model="config.zap.encodeLevel"></el-input>
+      </el-form-item>
+      <el-form-item label="栈名">
+        <el-input v-model="config.zap.stacktraceKey"></el-input>
+      </el-form-item>
+      <el-form-item label="显示行">
+        <el-checkbox v-model="config.zap.showLine"></el-checkbox>
+      </el-form-item>
+      <el-form-item label="输出控制台">
+        <el-checkbox v-model="config.zap.logInConsole"></el-checkbox>
+      </el-form-item>
+      <!--  Zap end  -->
+
+      <!--  Redis start  -->
+      <h2>Redis admin数据库配置</h2>
+      <el-form-item label="db">
+        <el-input v-model="config.redis.db"></el-input>
+      </el-form-item>
+      <el-form-item label="addr">
+        <el-input v-model="config.redis.addr"></el-input>
+      </el-form-item>
+      <el-form-item label="password">
+        <el-input v-model="config.redis.password"></el-input>
+      </el-form-item>
+      <!--  Redis end  -->
+
+      <!--  Email start  -->
+      <h2>邮箱配置</h2>
+      <el-form-item label="接收者邮箱">
+        <el-input v-model="config.email.to" placeholder="可多个,以逗号分隔"></el-input>
+      </el-form-item>
+      <el-form-item label="端口">
+        <el-input v-model.number="config.email.port"></el-input>
+      </el-form-item>
+      <el-form-item label="发送者邮箱">
+        <el-input v-model="config.email.from"></el-input>
+      </el-form-item>
+      <el-form-item label="host">
+        <el-input v-model="config.email.host"></el-input>
+      </el-form-item>
+      <el-form-item label="是否为ssl">
+        <el-checkbox v-model="config.email.isSSL"></el-checkbox>
+      </el-form-item>
+      <el-form-item label="secret">
+        <el-input v-model="config.email.secret"></el-input>
+      </el-form-item>
+      <el-form-item label="测试邮件">
+        <el-button @click="email">测试邮件</el-button>
+      </el-form-item>
+      <!--  Email end  -->
+
+      <!--  Casbin start  -->
       <h2>casbin配置</h2>
       <el-form-item label="模型地址">
         <el-input v-model="config.casbin.modelPath"></el-input>
       </el-form-item>
+      <!--  Casbin end  -->
+
+      <!--  Captcha start  -->
+      <h2>验证码配置</h2>
+      <el-form-item label="keyLong">
+        <el-input v-model.number="config.captcha.keyLong"></el-input>
+      </el-form-item>
+      <el-form-item label="imgWidth">
+        <el-input v-model.number="config.captcha.imgWidth"></el-input>
+      </el-form-item>
+      <el-form-item label="imgHeight">
+        <el-input v-model.number="config.captcha.imgHeight"></el-input>
+      </el-form-item>
+      <!--  Captcha end  -->
+
+      <!--  dbType start  -->
       <template v-if="config.system.dbType == 'mysql'">
         <h2>mysql admin数据库配置</h2>
         <el-form-item label="username">
@@ -51,6 +155,45 @@
           <el-checkbox v-model="config.mysql.logMode"></el-checkbox>
         </el-form-item>
       </template>
+      <template v-if="config.system.dbType == 'sqlite'">
+        <h2>sqlite admin数据库配置</h2>
+        <el-form-item label="path">
+          <el-input v-model="config.mysql.path"></el-input>
+        </el-form-item>
+        <el-form-item label="maxIdleConns">
+          <el-input v-model.number="config.mysql.maxIdleConns"></el-input>
+        </el-form-item>
+        <el-form-item label="maxOpenConns">
+          <el-input v-model.number="config.mysql.maxOpenConns"></el-input>
+        </el-form-item>
+        <el-form-item label="logger">
+          <el-checkbox v-model="config.mysql.logger"></el-checkbox>
+        </el-form-item>
+      </template>
+      <template v-if="config.system.dbType == 'sqlserver'">
+        <h2>sqlserver admin数据库配置</h2>
+        <el-form-item label="username">
+          <el-input v-model="config.sqlserver.username"></el-input>
+        </el-form-item>
+        <el-form-item label="password">
+          <el-input v-model="config.sqlserver.password"></el-input>
+        </el-form-item>
+        <el-form-item label="path">
+          <el-input v-model="config.sqlserver.path"></el-input>
+        </el-form-item>
+        <el-form-item label="dbname">
+          <el-input v-model="config.sqlserver.dbname"></el-input>
+        </el-form-item>
+        <el-form-item label="maxIdleConns">
+          <el-input v-model.number="config.sqlserver.maxIdleConns"></el-input>
+        </el-form-item>
+        <el-form-item label="maxOpenConns">
+          <el-input v-model.number="config.sqlserver.maxOpenConns"></el-input>
+        </el-form-item>
+        <el-form-item label="logger">
+          <el-checkbox v-model="config.sqlserver.logger"></el-checkbox>
+        </el-form-item>
+      </template>
       <template v-if="config.system.dbType == 'postgresql'">
         <h2>postgresql admin数据库配置</h2>
         <el-form-item label="username">
@@ -81,132 +224,41 @@
           <el-checkbox v-model="config.mysql.preferSimpleProtocol"></el-checkbox>
         </el-form-item>
       </template>
-      <template v-if="config.system.dbType == 'sqlite'">
-        <h2>sqlite admin数据库配置</h2>
-        <el-form-item label="path">
-          <el-input v-model="config.mysql.path"></el-input>
-        </el-form-item>
-        <el-form-item label="maxIdleConns">
-          <el-input v-model.number="config.mysql.maxIdleConns"></el-input>
-        </el-form-item>
-        <el-form-item label="maxOpenConns">
-          <el-input v-model.number="config.mysql.maxOpenConns"></el-input>
-        </el-form-item>
-        <el-form-item label="logger">
-          <el-checkbox v-model="config.mysql.logger"></el-checkbox>
+      <!--  dbType end  -->
+
+      <!--  ossType start  -->
+      <template v-if="config.system.ossType == 'local'">
+        <h2>本地上传配置</h2>
+        <el-form-item label="本地文件路径">
+          <el-input v-model="config.local.path"></el-input>
         </el-form-item>
       </template>
-      <template v-if="config.system.dbType == 'sqlserver'">
-        <h2>sqlserver admin数据库配置</h2>
-        <el-form-item label="username">
-          <el-input v-model="config.sqlserver.username"></el-input>
+      <template v-if="config.system.ossType == 'qiniu'">
+        <h2>qiniu上传配置</h2>
+        <el-form-item label="存储区域">
+          <el-input v-model="config.qiniu.zone"></el-input>
         </el-form-item>
-        <el-form-item label="password">
-          <el-input v-model="config.sqlserver.password"></el-input>
+        <el-form-item label="空间名称">
+          <el-input v-model="config.qiniu.bucket"></el-input>
         </el-form-item>
-        <el-form-item label="path">
-          <el-input v-model="config.sqlserver.path"></el-input>
+        <el-form-item label="CDN加速域名">
+          <el-input v-model="config.qiniu.imgPath"></el-input>
         </el-form-item>
-        <el-form-item label="dbname">
-          <el-input v-model="config.sqlserver.dbname"></el-input>
+        <el-form-item label="是否使用https">
+          <el-checkbox v-model="config.qiniu.imgPath">开启</el-checkbox>
         </el-form-item>
-        <el-form-item label="maxIdleConns">
-          <el-input v-model.number="config.sqlserver.maxIdleConns"></el-input>
+        <el-form-item label="accessKey">
+          <el-input v-model="config.qiniu.accessKey"></el-input>
         </el-form-item>
-        <el-form-item label="maxOpenConns">
-          <el-input v-model.number="config.sqlserver.maxOpenConns"></el-input>
+        <el-form-item label="secretKey">
+          <el-input v-model="config.qiniu.secretKey"></el-input>
         </el-form-item>
-        <el-form-item label="logger">
-          <el-checkbox v-model="config.sqlserver.logger"></el-checkbox>
+        <el-form-item label="上传是否使用CDN上传加速">
+          <el-checkbox v-model="config.qiniu.useCdnDomains">开启</el-checkbox>
         </el-form-item>
       </template>
-      <h2>Redis admin数据库配置</h2>
-      <el-form-item label="addr">
-        <el-input v-model="config.redis.addr"></el-input>
-      </el-form-item>
-      <el-form-item label="password">
-        <el-input v-model="config.redis.password"></el-input>
-      </el-form-item>
-      <el-form-item label="db">
-        <el-input v-model="config.redis.db"></el-input>
-      </el-form-item>
-      <h2>上传配置</h2>
-      <el-form-item label="本地或七牛云">
-        <el-checkbox v-model="config.localUpload.local">本地</el-checkbox>
-      </el-form-item>
-      <el-form-item label="本地文件路径">
-        <el-input v-model="config.localUpload.filePath"></el-input>
-      </el-form-item>
-      <h2>七牛密钥配置</h2>
-      <el-form-item label="accessKey">
-        <el-input v-model="config.qiniu.accessKey"></el-input>
-      </el-form-item>
-      <el-form-item label="secretKey">
-        <el-input v-model="config.qiniu.secretKey"></el-input>
-      </el-form-item>
-      <h2>验证码配置</h2>
-      <el-form-item label="keyLong">
-        <el-input v-model.number="config.captcha.keyLong"></el-input>
-      </el-form-item>
-      <el-form-item label="imgWidth">
-        <el-input v-model.number="config.captcha.imgWidth"></el-input>
-      </el-form-item>
-      <el-form-item label="imgHeight">
-        <el-input v-model.number="config.captcha.imgHeight"></el-input>
-      </el-form-item>
-      <h2>日志配置</h2>
-      <el-form-item label="level">
-        <el-input v-model.number="config.zap.level"></el-input>
-      </el-form-item>
-      <el-form-item label="format">
-        <el-input v-model="config.zap.format"></el-input>
-      </el-form-item>
-      <el-form-item label="prefix">
-        <el-input v-model="config.zap.prefix"></el-input>
-      </el-form-item>
-      <el-form-item label="director">
-        <el-input v-model="config.zap.director"></el-input>
-      </el-form-item>
-      <el-form-item label="link-name">
-        <el-input v-model="config.zap.linkName"></el-input>
-      </el-form-item>
-      <el-form-item label="encode-level">
-        <el-input v-model="config.zap.encodeLevel"></el-input>
-      </el-form-item>
-      <el-form-item label="stacktrace-key">
-        <el-input v-model="config.zap.stacktraceKey"></el-input>
-      </el-form-item>
-      <el-form-item label="show-line">
-        <el-checkbox v-model="config.zap.showLine"></el-checkbox>
-      </el-form-item>
-      <el-form-item label="log-in-console">
-        <el-checkbox v-model="config.zap.logInConsole"></el-checkbox>
-      </el-form-item>
-      <h2>邮箱配置</h2>
-      <el-form-item label="emailFrom">
-        <el-input v-model="config.email.emailFrom"></el-input>
-      </el-form-item>
-      <el-form-item label="emailNickName">
-        <el-input v-model="config.email.emailNickName"></el-input>
-      </el-form-item>
-      <el-form-item label="emailSecret">
-        <el-input v-model="config.email.emailSecret"></el-input>
-      </el-form-item>
-      <el-form-item label="emailTo">
-        <el-input v-model="config.email.emailTo" placeholder="可多个,以逗号分隔"></el-input>
-      </el-form-item>
-      <el-form-item label="emailHost">
-        <el-input v-model="config.email.emailHost"></el-input>
-      </el-form-item>
-      <el-form-item label="emailPort">
-        <el-input v-model.number="config.email.emailPort"></el-input>
-      </el-form-item>
-      <el-form-item label="emailIsSSL">
-        <el-checkbox v-model="config.email.emailIsSSL"></el-checkbox>
-      </el-form-item>
-      <el-form-item label="测试邮件">
-        <el-button @click="email">测试邮件</el-button>
-      </el-form-item>
+      <!--  ossType end  -->
+
       <el-form-item>
         <el-button @click="update" type="primary">立即更新</el-button>
         <el-button @click="reload" type="primary">重启服务(开发中)</el-button>
@@ -231,8 +283,8 @@ export default {
         redis: {},
         qiniu: {},
         captcha: {},
-        log: {},
-        localUpload: {},
+        zap: {},
+        local: {},
         email: {}
       }
     };