├── .gitignore ├── .vscode └── launch.json ├── LICENSE ├── README.md ├── admin.sql ├── bean ├── config.go ├── logrus.go └── mysql.go ├── config-demo.yml ├── controller ├── admin │ ├── admin.go │ ├── login.go │ ├── menu.go │ ├── record.go │ ├── role.go │ └── test.go └── test.go ├── go.mod ├── go.sum ├── html ├── css │ ├── app.c78d4271.css │ ├── chunk-02f03958.2d98c619.css │ ├── chunk-1ccde611.d24fe862.css │ ├── chunk-1fd08d72.0eb26cea.css │ ├── chunk-2b16495a.3ff21897.css │ ├── chunk-2e82ed00.7bd433b5.css │ ├── chunk-4243275a.d4dc1969.css │ ├── chunk-5b4bb6bc.cbf84ebb.css │ ├── chunk-92041630.9781e4a6.css │ └── chunk-vendors.9d79a1d4.css ├── favicon.ico ├── fonts │ ├── element-icons.535877f5.woff │ └── element-icons.732389de.ttf ├── img │ ├── 404.a57b6f31.png │ ├── 404_cloud.0f4bc32b.png │ ├── limit-icon.a58ad831.png │ ├── login_bg.b201058b.jpg │ ├── position-icon.244701e8.png │ ├── team-icon.e071b9db.png │ └── user-default.e28e794c.png ├── index.html ├── js │ ├── app.101e40b7.js │ ├── app.101e40b7.js.map │ ├── chunk-02f03958.f7dd72a2.js │ ├── chunk-02f03958.f7dd72a2.js.map │ ├── chunk-1ccde611.2d0f64ff.js │ ├── chunk-1ccde611.2d0f64ff.js.map │ ├── chunk-1fd08d72.70b91bbd.js │ ├── chunk-1fd08d72.70b91bbd.js.map │ ├── chunk-2b16495a.e6dee020.js │ ├── chunk-2b16495a.e6dee020.js.map │ ├── chunk-2e82ed00.f3d1308c.js │ ├── chunk-2e82ed00.f3d1308c.js.map │ ├── chunk-4243275a.a45fd2e0.js │ ├── chunk-4243275a.a45fd2e0.js.map │ ├── chunk-5b4bb6bc.de683ac9.js │ ├── chunk-5b4bb6bc.de683ac9.js.map │ ├── chunk-8f625d9a.b35a2bbc.js │ ├── chunk-8f625d9a.b35a2bbc.js.map │ ├── chunk-92041630.b00eae45.js │ ├── chunk-92041630.b00eae45.js.map │ ├── chunk-vendors.ee7d7559.js │ └── chunk-vendors.ee7d7559.js.map └── js2_favicon.ico ├── image-1.png ├── image.png ├── main.go ├── main_test.go ├── middleware ├── login.go ├── permission.go └── record.go ├── model ├── admin │ ├── admin.go │ ├── admin_menu.go │ ├── admin_record.go │ └── admin_role.go └── base.go └── route └── admin.go /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | # Dependency directories (remove the comment below to include it) 15 | # vendor/ 16 | 17 | # 日志文件 18 | /*.log 19 | /cmd/*.log 20 | # 配置文件 21 | /config.yml 22 | /cmd/config.yml 23 | # air 热重载缓存文件 24 | /tmp 25 | # 文件上传 26 | /upload/* 27 | !/upload/test.txt 28 | !/upload/profile.png 29 | 30 | /auth-gateway 31 | 32 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Launch Package", 9 | "type": "go", 10 | "request": "launch", 11 | "mode": "auto", 12 | "program": "${fileDirname}" 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 lluck42 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # auth-gateway 2 | 3 | #### 亮点 4 | 5 | auth gateway 6 | 7 | 避免重复造轮子,搭建后台再也不需要权限控制、登录验证了!直接从业务代码开始搞起,使用网关进行权限验证! 8 | 9 | 只需配置好 config.yml 中的后端服务地址即可进行代理! 10 | 11 | #### 介绍 12 | 13 | 登录、权限认证 http 网关 14 | 15 | 附带后台 RBAC 权限管理接口 16 | 17 | 验证通过后 通过 http 反向代理方式请求后端服务 18 | 19 | admin.sql 是数据库文件 20 | 21 | config.yml 是配置文件,填写所需代理的后端地址 22 | 23 | 24 | 1. 管理员模块 25 | 2. 登录模块 26 | 3. token验证模块 27 | 4. 图形验证码 28 | 29 | 形如 http://0.0.0.0:3000/admin/xxx 不可用(网关管理模块) 30 | /admin 网关管理模块 31 | /html 前端页面打包地址模块 32 | 其他地址可用 33 | 34 | 没有被注册的路由地址会走反向代理 35 | 36 | 在界面中设置需要验证的权限(菜单-权限,角色-勾选权限-点击确定) 37 | 38 | 39 | #### 软件架构 40 | gin + gorm + mysql 41 | 42 | 43 | #### 安装教程 44 | git clone https://gitee.com/lluck42/auth-gateway 45 | 46 | 导入 admin.sql 47 | 48 | mv config-demo.yml config.yml 49 | 50 | 配置 config.yml 配置文件,填入 mysql 账号密码,需要反向代理的协议、地址 51 | 52 | go run . 53 | 54 | 打开网关配置界面进行配置 55 | 56 | http://127.0.0.1:3000/html 57 | 58 | 账号 admin 密码 Admin123 59 | 60 | ![登录界面](image-1.png) 61 | 62 | ![配置界面](image.png) 63 | 64 | 65 | #### 获取接口权限 66 | 1. 前端调用 login 接口登录成功后获取 token 67 | 2. 在http请求 header 中加入 Bearer token 即可 68 | 3. 具体步骤:需要先调用获取验证码接口获取验证码ID,显示出验证码,然后再调用登录接口进行登录(接口在登录界面,请自行寻找哈) 69 | ![登录界面](image-1.png) 70 | 71 | 备注:header 中有 adminID 可用于业务 72 | -------------------------------------------------------------------------------- /admin.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat Premium Data Transfer 3 | 4 | Source Server : localhost_3306 5 | Source Server Type : MySQL 6 | Source Server Version : 80032 (8.0.32) 7 | Source Host : 127.0.0.1:3306 8 | Source Schema : auth-gateway 9 | 10 | Target Server Type : MySQL 11 | Target Server Version : 80032 (8.0.32) 12 | File Encoding : 65001 13 | 14 | Date: 13/06/2024 16:38:27 15 | */ 16 | 17 | SET NAMES utf8mb4; 18 | SET FOREIGN_KEY_CHECKS = 0; 19 | 20 | -- ---------------------------- 21 | -- Table structure for admin 22 | -- ---------------------------- 23 | DROP TABLE IF EXISTS `admin`; 24 | CREATE TABLE `admin` ( 25 | `id` int UNSIGNED NOT NULL AUTO_INCREMENT, 26 | `organization_id` int UNSIGNED NULL DEFAULT NULL, 27 | `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 28 | `mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 29 | `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 30 | `role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 31 | `role_id` bigint NULL DEFAULT NULL, 32 | `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 33 | `user_id` int UNSIGNED NULL DEFAULT NULL, 34 | `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP, 35 | `updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 36 | PRIMARY KEY (`id`) USING BTREE, 37 | UNIQUE INDEX `uni_token`(`token` ASC) USING BTREE, 38 | UNIQUE INDEX `uni_mobile`(`mobile` ASC) USING BTREE, 39 | UNIQUE INDEX `uni_name`(`name` ASC) USING BTREE, 40 | INDEX `organization_id`(`organization_id` ASC) USING BTREE 41 | ) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; 42 | 43 | -- ---------------------------- 44 | -- Records of admin 45 | -- ---------------------------- 46 | INSERT INTO `admin` VALUES (1, 1, 'admin', 'admin', 'e64b78fc3bc91bcbc7dc232ba8ec59e0', '超级管理员', 2, '38c9d42c40e6a988b5758afc9f341865', 2, '2023-04-03 16:02:16', '2024-06-13 16:15:45'); 47 | INSERT INTO `admin` VALUES (16, 1, 'admin1', 'admin1', 'e64b78fc3bc91bcbc7dc232ba8ec59e0', '123123', 2, 'e5fce01b1b1316e3c0b08ddd38ec8359', 0, '2024-06-13 15:25:54', '2024-06-13 16:14:55'); 48 | 49 | -- ---------------------------- 50 | -- Table structure for admin_menu 51 | -- ---------------------------- 52 | DROP TABLE IF EXISTS `admin_menu`; 53 | CREATE TABLE `admin_menu` ( 54 | `id` int UNSIGNED NOT NULL AUTO_INCREMENT, 55 | `parent_id` int NULL DEFAULT NULL, 56 | `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 57 | `label` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 58 | `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 59 | `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 60 | `type` enum('页面','接口') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '页面', 61 | `show` enum('true','false') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT 'true', 62 | `sort` smallint NULL DEFAULT NULL, 63 | `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP, 64 | `updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 65 | PRIMARY KEY (`id`) USING BTREE 66 | ) ENGINE = InnoDB AUTO_INCREMENT = 155 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; 67 | 68 | -- ---------------------------- 69 | -- Records of admin_menu 70 | -- ---------------------------- 71 | INSERT INTO `admin_menu` VALUES (9, 0, 'home', '主页', '/', 'home-icon', '页面', 'true', 0, '2023-08-10 15:44:04', '2024-04-08 11:23:39'); 72 | INSERT INTO `admin_menu` VALUES (20, 0, 'limit', '权限设置', '/limit', 'limit-icon', '页面', 'true', 7, '2023-08-10 15:51:57', '2024-04-02 09:35:34'); 73 | INSERT INTO `admin_menu` VALUES (21, 20, 'limit', '菜单', '/limit', '', '页面', 'true', 2, '2023-08-10 15:52:48', '2023-08-10 16:08:02'); 74 | INSERT INTO `admin_menu` VALUES (22, 20, 'role', '角色', '/role', '', '页面', 'true', 1, '2023-08-10 15:53:07', '2023-08-10 15:53:07'); 75 | INSERT INTO `admin_menu` VALUES (23, 20, 'systemAdmin', '管理员', '/systemAdmin', '', '页面', 'true', 1, '2023-08-10 16:07:57', '2023-08-10 16:07:57'); 76 | INSERT INTO `admin_menu` VALUES (24, 20, 'recordList', '操作记录', '/recordList', '', '页面', 'true', 4, '2023-08-11 17:08:30', '2024-03-22 15:33:43'); 77 | INSERT INTO `admin_menu` VALUES (36, 24, '', '列表', '/admin/RecordList', '', '接口', 'true', 1, '2024-03-22 11:36:23', '2024-03-22 11:36:23'); 78 | INSERT INTO `admin_menu` VALUES (37, 21, '', 'tree', '/admin/MenuTree', '', '接口', 'true', 1, '2024-03-22 11:37:01', '2024-03-22 11:37:01'); 79 | INSERT INTO `admin_menu` VALUES (38, 21, '', '编辑', '/admin/MenuEdit', '', '接口', 'true', 2, '2024-03-22 11:37:29', '2024-03-22 11:37:29'); 80 | INSERT INTO `admin_menu` VALUES (39, 21, '', '删除', '/admin/MenuDelete', '', '接口', 'true', 3, '2024-03-22 11:37:46', '2024-03-22 11:37:46'); 81 | INSERT INTO `admin_menu` VALUES (40, 22, '', '列表', '/admin/RoleList', '', '接口', 'true', 1, '2024-03-22 11:38:24', '2024-03-22 11:38:24'); 82 | INSERT INTO `admin_menu` VALUES (41, 22, '', '详情', '/admin/RoleDetail', '', '接口', 'true', 2, '2024-03-22 11:38:36', '2024-03-22 11:38:36'); 83 | INSERT INTO `admin_menu` VALUES (42, 22, '', '编辑', '/admin/RoleEdit', '', '接口', 'true', 3, '2024-03-22 11:38:54', '2024-03-22 11:38:54'); 84 | INSERT INTO `admin_menu` VALUES (43, 22, '', '操作权限编辑', '/admin/RolePermissionEdit', '', '接口', 'true', 4, '2024-03-22 11:39:17', '2024-03-29 11:06:29'); 85 | INSERT INTO `admin_menu` VALUES (44, 22, '', '删除', '/admin/RoleDelete', '', '接口', 'true', 5, '2024-03-22 11:39:29', '2024-03-22 11:39:29'); 86 | INSERT INTO `admin_menu` VALUES (45, 23, '', '我的列表', '/admin/MyList', '', '接口', 'true', 1, '2024-03-22 11:40:57', '2024-04-03 10:13:39'); 87 | INSERT INTO `admin_menu` VALUES (46, 23, '', '编辑', '/admin/Edit', '', '接口', 'true', 2, '2024-03-22 11:41:14', '2024-03-22 11:41:14'); 88 | INSERT INTO `admin_menu` VALUES (47, 23, '', '删除', '/admin/Delete', '', '接口', 'true', 3, '2024-03-22 11:41:30', '2024-03-22 11:41:30'); 89 | INSERT INTO `admin_menu` VALUES (93, 0, 'xxxx', '个人信息', 'xx', 'user-icon', '页面', 'false', 10, '2024-04-03 09:22:31', '2024-05-15 09:19:56'); 90 | INSERT INTO `admin_menu` VALUES (94, 93, 'xxxx', '常用接口', 'xxxx', '', '页面', 'false', 1, '2024-04-03 09:30:14', '2024-04-03 09:30:14'); 91 | INSERT INTO `admin_menu` VALUES (95, 94, '', '登录', '/admin/Login', '', '接口', 'true', 1, '2024-04-03 09:30:48', '2024-05-15 10:14:49'); 92 | INSERT INTO `admin_menu` VALUES (96, 94, '', '个人信息', '/admin/Info', '', '接口', 'true', 0, '2024-04-03 09:47:11', '2024-04-03 09:47:11'); 93 | INSERT INTO `admin_menu` VALUES (98, 94, '', '退出登陆', '/admin/Logout', '', '接口', 'true', 0, '2024-04-07 16:20:51', '2024-04-07 16:20:51'); 94 | INSERT INTO `admin_menu` VALUES (99, 22, '', '全部列表', '/admin/RoleAllList', '', '接口', 'true', 0, '2024-04-07 16:53:06', '2024-04-07 16:53:06'); 95 | INSERT INTO `admin_menu` VALUES (148, 94, '', '修改密码', '/admin/ChangePassword', '', '接口', 'true', 4, '2024-05-15 10:14:39', '2024-05-15 10:14:39'); 96 | INSERT INTO `admin_menu` VALUES (152, 0, '/limit112', '测试菜单', '/limit12', 'user-icon', '页面', 'true', 3, '2024-06-13 16:17:50', '2024-06-13 16:37:35'); 97 | INSERT INTO `admin_menu` VALUES (153, 152, '测试菜单子', '测试菜单子', '/limit12', '', '页面', 'true', 0, '2024-06-13 16:18:18', '2024-06-13 16:37:45'); 98 | INSERT INTO `admin_menu` VALUES (154, 153, '', '测试权限', '/article_history/list', '', '接口', 'true', 1, '2024-06-13 16:18:54', '2024-06-13 16:18:54'); 99 | 100 | -- ---------------------------- 101 | -- Table structure for admin_record 102 | -- ---------------------------- 103 | DROP TABLE IF EXISTS `admin_record`; 104 | CREATE TABLE `admin_record` ( 105 | `id` int UNSIGNED NOT NULL AUTO_INCREMENT, 106 | `admin_id` int NULL DEFAULT NULL, 107 | `admin_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 108 | `method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 109 | `api_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 110 | `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 111 | `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP, 112 | `updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 113 | PRIMARY KEY (`id`) USING BTREE 114 | ) ENGINE = InnoDB AUTO_INCREMENT = 2275 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; 115 | 116 | -- ---------------------------- 117 | -- Records of admin_record 118 | -- ---------------------------- 119 | 120 | -- ---------------------------- 121 | -- Table structure for admin_role 122 | -- ---------------------------- 123 | DROP TABLE IF EXISTS `admin_role`; 124 | CREATE TABLE `admin_role` ( 125 | `id` int UNSIGNED NOT NULL AUTO_INCREMENT, 126 | `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, 127 | `admin_menu_ids` json NULL, 128 | `admin_menu_api_paths` json NULL, 129 | `created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP, 130 | `updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 131 | PRIMARY KEY (`id`) USING BTREE 132 | ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; 133 | 134 | -- ---------------------------- 135 | -- Records of admin_role 136 | -- ---------------------------- 137 | INSERT INTO `admin_role` VALUES (1, '站点管理员', '[9, 20, 23, 45, 46, 47, 99, 40, 37, 93, 94, 96, 98, 95, 148]', '[\"/admin/MenuTree\", \"/admin/RoleList\", \"/admin/MyList\", \"/admin/Edit\", \"/admin/Delete\", \"/admin/Login\", \"/admin/Info\", \"/admin/Logout\", \"/admin/RoleAllList\", \"/admin/ChangePassword\"]', '2023-08-10 08:48:01', '2024-06-13 16:16:22'); 138 | INSERT INTO `admin_role` VALUES (2, '超级管理员', '[9, 152, 153, 154, 20, 23, 45, 46, 47, 22, 99, 40, 41, 42, 43, 44, 21, 37, 38, 39, 24, 36, 93, 94, 98, 96, 95, 148]', '[\"/admin/RecordList\", \"/admin/MenuTree\", \"/admin/MenuEdit\", \"/admin/MenuDelete\", \"/admin/RoleList\", \"/admin/RoleDetail\", \"/admin/RoleEdit\", \"/admin/RolePermissionEdit\", \"/admin/RoleDelete\", \"/admin/MyList\", \"/admin/Edit\", \"/admin/Delete\", \"/admin/Login\", \"/admin/Info\", \"/admin/Logout\", \"/admin/RoleAllList\", \"/admin/ChangePassword\", \"/article_history/list\"]', '2023-08-10 08:48:46', '2024-06-13 16:19:15'); 139 | 140 | SET FOREIGN_KEY_CHECKS = 1; 141 | -------------------------------------------------------------------------------- /bean/config.go: -------------------------------------------------------------------------------- 1 | package bean 2 | 3 | import ( 4 | "os" 5 | 6 | "gopkg.in/yaml.v3" 7 | ) 8 | 9 | var Config struct { 10 | App struct { 11 | Addr string `yaml:"addr"` 12 | SetMode string `yaml:"setmode"` 13 | } `yaml:"app"` 14 | Mysql struct { 15 | Host string `yaml:"host"` 16 | Port string `yaml:"port"` 17 | Username string `yaml:"username"` 18 | Password string `yaml:"password"` 19 | Database string `yaml:"database"` 20 | ParseTime string `yaml:"parsetime"` 21 | Debug bool `yaml:"debug"` 22 | } `yaml:"mysql"` 23 | ReverseProxy struct { 24 | Scheme string `yaml:"Scheme"` 25 | Host string `yaml:"Host"` 26 | } `yaml:"ReverseProxy"` 27 | } 28 | 29 | func ConfigInit() { 30 | 31 | yamlFile, err := os.ReadFile("config.yml") 32 | if err != nil { 33 | panic(err.Error()) 34 | } 35 | 36 | err = yaml.Unmarshal(yamlFile, &Config) 37 | if err != nil { 38 | panic(err.Error()) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /bean/logrus.go: -------------------------------------------------------------------------------- 1 | package bean 2 | 3 | import ( 4 | "os" 5 | 6 | "github.com/sirupsen/logrus" 7 | ) 8 | 9 | var Log *logrus.Logger 10 | 11 | func LogInit() { 12 | 13 | Log = logrus.New() 14 | // 设置日志级别为xx以及以上 15 | Log.SetLevel(logrus.InfoLevel) 16 | Log.SetFormatter(&logrus.TextFormatter{ 17 | TimestampFormat: "2006-01-02 15:04:05", //时间格式化 18 | }) 19 | Log.SetReportCaller(true) 20 | 21 | // log文件 22 | file, err := os.OpenFile("error.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) 23 | if err != nil { 24 | Log.Panic("LogInit失败") 25 | } 26 | 27 | Log.Out = file 28 | } 29 | -------------------------------------------------------------------------------- /bean/mysql.go: -------------------------------------------------------------------------------- 1 | package bean 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | 7 | "gorm.io/driver/mysql" 8 | "gorm.io/gorm" 9 | "gorm.io/gorm/schema" 10 | ) 11 | 12 | var MysqlDb *gorm.DB 13 | 14 | func MysqlInit() { 15 | var dsn = "%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=%s&loc=Local" 16 | dsn = fmt.Sprintf(dsn, Config.Mysql.Username, Config.Mysql.Password, Config.Mysql.Host, Config.Mysql.Port, Config.Mysql.Database, Config.Mysql.ParseTime) 17 | 18 | // newLogger := logger.New( 19 | // log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注) 20 | // logger.Config{ 21 | // SlowThreshold: time.Second, // 慢 SQL 阈值 22 | // LogLevel: logger.Error, // 日志级别 23 | // IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 24 | // Colorful: true, // 禁用彩色打印 25 | // }, 26 | // ) 27 | 28 | db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ 29 | // Logger: newLogger, 30 | SkipDefaultTransaction: true, 31 | NamingStrategy: schema.NamingStrategy{ 32 | SingularTable: true, 33 | }, 34 | }) 35 | 36 | if err != nil { 37 | Log.Panic("连接数据库失败") 38 | } 39 | 40 | // 实际调整的是 LogLevel 41 | if Config.Mysql.Debug { 42 | db = db.Debug() 43 | } 44 | 45 | MysqlDb = db 46 | 47 | sqlDB, err := db.DB() 48 | if err != nil { 49 | Log.Panic("连接数据库失败") 50 | } 51 | 52 | // SetMaxIdleConns sets the maximum number of connections in the idle connection pool. 53 | sqlDB.SetMaxIdleConns(10) 54 | 55 | // SetMaxOpenConns sets the maximum number of open connections to the database. 56 | sqlDB.SetMaxOpenConns(100) 57 | 58 | // SetConnMaxLifetime sets the maximum amount of time a connection may be reused. 59 | sqlDB.SetConnMaxLifetime(time.Hour) 60 | } 61 | -------------------------------------------------------------------------------- /config-demo.yml: -------------------------------------------------------------------------------- 1 | app: 2 | addr: 127.0.0.1:3000 3 | setmode: debug 4 | mysql: 5 | host: 127.0.0.1 6 | port: 3306 7 | username: xxxxx 8 | password: xxxxxxx 9 | database: auth-gateway 10 | parsetime: false 11 | debug: true 12 | ReverseProxy: 13 | Scheme: http 14 | Host: 127.0.0.1:8000 -------------------------------------------------------------------------------- /controller/admin/admin.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "auth-gateway/model/admin" 6 | 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | func MyList(c *gin.Context) { 11 | 12 | var req struct { 13 | Page int `binding:"required,gte=1"` 14 | Limit int `binding:"required,gte=1"` 15 | Name string `binding:"max=255"` 16 | OrganizationId uint `binding:"max=10000000"` 17 | } 18 | 19 | if err := c.ShouldBindQuery(&req); err != nil { 20 | bean.Log.Warning(err.Error()) 21 | c.String(400, err.Error()) 22 | return 23 | } 24 | 25 | var offset = (req.Page - 1) * req.Limit 26 | 27 | // 查询 28 | var count int64 29 | var list []admin.Admin 30 | 31 | var tx = bean.MysqlDb.Model(&admin.Admin{}) 32 | 33 | if req.Name != "" { 34 | tx = tx.Where("`name` like ?", "%"+req.Name+"%") 35 | } 36 | 37 | // 查询总数 38 | if err := tx.Count(&count).Error; err != nil { 39 | bean.Log.Error(err) 40 | c.String(500, err.Error()) 41 | return 42 | } 43 | 44 | // 查询列表 45 | if err := tx.Limit(req.Limit).Offset(offset).Order("`id` DESC").Find(&list).Error; err != nil { 46 | bean.Log.Error(err) 47 | c.String(500, err.Error()) 48 | return 49 | } 50 | 51 | c.PureJSON(200, gin.H{ 52 | "count": count, 53 | "list": list, 54 | }) 55 | } 56 | 57 | // info 58 | func Info(c *gin.Context) { 59 | // 获取登录用户对象 60 | var one admin.Admin 61 | if err := one.Get(c); err != nil { 62 | bean.Log.Error(err) 63 | c.String(500, err.Error()) 64 | return 65 | } 66 | 67 | c.PureJSON(200, one) 68 | } 69 | 70 | // 添加+修改管理员信息 71 | func Edit(c *gin.Context) { 72 | // 用户输入信息 73 | var req struct { 74 | ID uint `binding:"max=10000000"` 75 | Name string `binding:"max=255"` 76 | Mobile string `binding:"max=255"` 77 | Role string `binding:"max=255"` 78 | RoleID uint `binding:"min=1,max=10000000"` 79 | OrganizationId uint `binding:"min=1,max=10000000"` 80 | Password string `binding:"max=255"` 81 | } 82 | 83 | if err := c.ShouldBindJSON(&req); err != nil { 84 | bean.Log.Warning(err) 85 | c.String(400, err.Error()) 86 | return 87 | } 88 | 89 | if req.ID == 0 && req.Password == "" { 90 | bean.Log.Error("密码不能为空") 91 | c.String(400, "密码不能为空") 92 | return 93 | } 94 | 95 | var one admin.Admin 96 | one.ID = req.ID 97 | one.Name = req.Name 98 | one.Mobile = req.Mobile 99 | one.RoleID = req.RoleID 100 | one.Role = req.Role 101 | one.OrganizationId = req.OrganizationId 102 | one.Password = req.Password 103 | 104 | if one.Password != "" { 105 | if err := one.PasswordMd5(); err != nil { 106 | bean.Log.Error(err) 107 | c.String(500, err.Error()) 108 | return 109 | } 110 | 111 | // 重置token 112 | if err := one.NewToken(); err != nil { 113 | bean.Log.Error(err) 114 | c.String(500, err.Error()) 115 | return 116 | } 117 | } 118 | 119 | if req.ID == 0 { 120 | if err := bean.MysqlDb.Save(&one).Error; err != nil { 121 | bean.Log.Error(err) 122 | c.String(500, err.Error()) 123 | return 124 | } 125 | } else { 126 | if err := bean.MysqlDb.Updates(&one).Error; err != nil { 127 | bean.Log.Error(err) 128 | c.String(500, err.Error()) 129 | return 130 | } 131 | } 132 | 133 | c.String(200, "ok") 134 | } 135 | 136 | // 删除管理员 137 | func Delete(c *gin.Context) { 138 | // 用户输入信息 139 | var req struct { 140 | ID int 141 | } 142 | 143 | if err := c.ShouldBindJSON(&req); err != nil { 144 | bean.Log.Warning(err) 145 | c.String(400, err.Error()) 146 | return 147 | } 148 | 149 | if req.ID == 1 { 150 | c.String(400, "管理员不能删除") 151 | return 152 | } 153 | 154 | var one admin.Admin 155 | if err := bean.MysqlDb.Where("id=?", req.ID).First(&one).Error; err != nil { 156 | bean.Log.Warning(err) 157 | c.String(400, "没有该用户") 158 | return 159 | } 160 | 161 | if err := bean.MysqlDb.Delete(&one).Error; err != nil { 162 | bean.Log.Warning(err) 163 | c.String(500, "内部错误") 164 | return 165 | } 166 | 167 | c.String(200, "ok") 168 | } 169 | 170 | func ChangePassword(c *gin.Context) { 171 | // 用户输入信息 172 | var req struct { 173 | Password string 174 | NewPassword string 175 | } 176 | 177 | if err := c.ShouldBindJSON(&req); err != nil { 178 | bean.Log.Error(err) 179 | c.String(400, err.Error()) 180 | return 181 | } 182 | 183 | // 获取登录用户对象 184 | var one admin.Admin 185 | if err := one.Get(c); err != nil { 186 | bean.Log.Error(err) 187 | c.String(500, err.Error()) 188 | return 189 | } 190 | 191 | // 新旧密码不能相同 192 | if req.Password == req.NewPassword { 193 | c.String(400, "新旧密码相同") 194 | return 195 | } 196 | 197 | // 验证旧密码 198 | if s, err := admin.Md5(req.Password); err != nil { 199 | bean.Log.Error(err) 200 | c.String(500, err.Error()) 201 | return 202 | } else { 203 | if s != one.Password { 204 | c.String(400, "密码错误") 205 | return 206 | } 207 | } 208 | 209 | // 加密新密码 210 | var str = req.NewPassword 211 | if s, err := admin.Md5(str); err != nil { 212 | bean.Log.Error(err) 213 | c.String(500, err.Error()) 214 | return 215 | } else { 216 | one.Password = s 217 | } 218 | 219 | if err := bean.MysqlDb.Save(&one).Error; err != nil { 220 | c.String(500, err.Error()) 221 | return 222 | } 223 | 224 | c.String(200, "ok") 225 | } 226 | -------------------------------------------------------------------------------- /controller/admin/login.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "auth-gateway/model/admin" 6 | 7 | "github.com/dchest/captcha" 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | func CaptchaId(c *gin.Context) { 12 | 13 | var captchaId = captcha.NewLen(4) 14 | 15 | c.String(200, captchaId) 16 | } 17 | 18 | func Captcha(c *gin.Context) { 19 | 20 | var captchaId = c.Query("captchaId") 21 | 22 | c.Header("captchaid", captchaId) 23 | 24 | if err := captcha.WriteImage(c.Writer, captchaId, 100, 50); err != nil { 25 | bean.Log.Warning(err) 26 | c.String(400, "验证码生成失败") 27 | return 28 | } 29 | } 30 | 31 | func Login(c *gin.Context) { 32 | 33 | var req struct { 34 | Mobile string `binding:"max=255"` 35 | Password string `binding:"max=255"` 36 | CaptchaId string `binding:"max=255"` 37 | Digits string `binding:"max=255"` 38 | UserToken string `binding:"max=255"` 39 | } 40 | 41 | if err := c.ShouldBindJSON(&req); err != nil { 42 | bean.Log.Warning(err) 43 | c.String(400, err.Error()) 44 | return 45 | } 46 | 47 | // 请求记录 48 | var rec admin.AdminRecord 49 | rec.Method = c.Request.Method 50 | rec.ApiPath = c.Request.URL.Path 51 | rec.Ip = c.ClientIP() 52 | rec.AdminName = "尝试登录账号:" + req.Mobile 53 | if err := bean.MysqlDb.Save(&rec).Error; err != nil { 54 | bean.Log.Error(err) 55 | return 56 | } 57 | 58 | // 验证码判断 59 | if !captcha.VerifyString(req.CaptchaId, req.Digits) { 60 | bean.Log.Info("验证码错误:" + req.Digits) 61 | c.String(400, "验证码错误") 62 | return 63 | } 64 | 65 | // 密码加密 66 | if s, err := admin.Md5(req.Password); err != nil { 67 | bean.Log.Error(err) 68 | c.String(500, "内部错误m") 69 | return 70 | } else { 71 | req.Password = s 72 | } 73 | 74 | // 对比查找用户 75 | var one admin.Admin 76 | 77 | if err := bean.MysqlDb.Where("`mobile`=? and `password`=?", req.Mobile, req.Password).First(&one).Error; err != nil { 78 | bean.Log.Error(err) 79 | c.String(400, "账号或密码错误") 80 | return 81 | } 82 | 83 | c.PureJSON(200, one) 84 | 85 | // 更新请求记录 86 | rec.AdminName = one.Name 87 | rec.AdminID = one.ID 88 | 89 | if err := bean.MysqlDb.Save(&rec).Error; err != nil { 90 | bean.Log.Error(err) 91 | return 92 | } 93 | 94 | // 放入admin 信息,record 中间件使用 95 | c.Set("admin", one) 96 | } 97 | 98 | func Logout(c *gin.Context) { 99 | // 获取登录用户对象 100 | var one admin.Admin 101 | if err := one.Get(c); err != nil { 102 | bean.Log.Error(err) 103 | c.String(500, err.Error()) 104 | return 105 | } 106 | // 107 | 108 | if err := one.NewToken(); err != nil { 109 | bean.Log.Error(err) 110 | c.String(500, err.Error()) 111 | return 112 | } 113 | 114 | var two admin.Admin 115 | two.ID = one.ID 116 | two.Token = one.Token 117 | 118 | if err := bean.MysqlDb.Updates(&two).Error; err != nil { 119 | bean.Log.Error(err) 120 | c.String(500, err.Error()) 121 | return 122 | } 123 | 124 | c.String(200, "ok") 125 | } 126 | -------------------------------------------------------------------------------- /controller/admin/menu.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "auth-gateway/model/admin" 6 | "encoding/json" 7 | 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | func MenuTree(c *gin.Context) { 12 | // 查询列表 13 | var req struct { 14 | Type string `binding:"oneof='' My 页面 接口"` // 菜单用 15 | } 16 | 17 | if err := c.ShouldBindQuery(&req); err != nil { 18 | bean.Log.Warning(err.Error()) 19 | c.String(400, err.Error()) 20 | return 21 | } 22 | 23 | var tx = bean.MysqlDb.Model(&admin.AdminMenu{}) 24 | if req.Type == "My" { 25 | // 我的菜单 26 | tx.Where("`type`='页面' AND `show`='true'") 27 | // 获取登录用户对象 28 | var adm admin.Admin 29 | if err := adm.Get(c); err != nil { 30 | bean.Log.Error(err) 31 | c.String(500, err.Error()) 32 | return 33 | } 34 | 35 | var rol admin.AdminRole 36 | if err := bean.MysqlDb.Where("id=?", adm.RoleID).Take(&rol).Error; err != nil { 37 | bean.Log.Error(err) 38 | c.String(500, err.Error()) 39 | return 40 | } 41 | 42 | var menuIds []uint 43 | if err := json.Unmarshal([]byte(rol.AdminMenuIds), &menuIds); err != nil { 44 | bean.Log.Error(err) 45 | c.String(500, err.Error()) 46 | return 47 | } 48 | 49 | // 待测试 50 | tx.Where("id in (?)", menuIds) 51 | } else if req.Type == "页面" { 52 | // 所有菜单 53 | tx.Where("`type`='页面'") 54 | } 55 | 56 | // 查询 57 | var list []admin.AdminMenu 58 | 59 | // 查询列表 60 | if err := tx.Order("`sort` ASC").Find(&list).Error; err != nil { 61 | bean.Log.Error(err) 62 | c.String(500, err.Error()) 63 | return 64 | } 65 | 66 | var adm admin.AdminMenu 67 | 68 | c.PureJSON(200, adm.Tree(0, list)) 69 | } 70 | 71 | func MenuDetail(c *gin.Context) { 72 | // 查询列表 73 | var req struct { 74 | ID int `binding:"required,gte=1"` 75 | } 76 | 77 | if err := c.ShouldBindQuery(&req); err != nil { 78 | bean.Log.Warning(err.Error()) 79 | c.String(400, err.Error()) 80 | return 81 | } 82 | 83 | var one admin.AdminMenu 84 | if err := bean.MysqlDb.First(&one).Error; err != nil { 85 | bean.Log.Error(err) 86 | c.String(500, err.Error()) 87 | return 88 | } 89 | 90 | c.PureJSON(200, one) 91 | } 92 | 93 | func MenuEdit(c *gin.Context) { 94 | // 查询列表 95 | var req struct { 96 | ID uint 97 | ParentID uint 98 | Name string `binding:"max=255"` 99 | Label string `binding:"max=255"` 100 | Path string `binding:"max=255"` 101 | Icon string `binding:"max=255"` 102 | Type string `binding:"oneof=页面 接口"` 103 | Show string `binding:"oneof=true false"` 104 | Sort uint 105 | } 106 | 107 | if err := c.ShouldBindJSON(&req); err != nil { 108 | bean.Log.Warning(err.Error()) 109 | c.String(400, err.Error()) 110 | return 111 | } 112 | 113 | var one admin.AdminMenu 114 | one.ID = req.ID 115 | one.ParentID = req.ParentID 116 | one.Name = req.Name 117 | one.Label = req.Label 118 | one.Path = req.Path 119 | one.Icon = req.Icon 120 | one.Type = req.Type 121 | one.Show = req.Show 122 | one.Sort = req.Sort 123 | 124 | if err := bean.MysqlDb.Save(&one).Error; err != nil { 125 | bean.Log.Error(err) 126 | c.String(500, err.Error()) 127 | return 128 | } 129 | 130 | c.String(200, "ok") 131 | } 132 | 133 | func MenuDelete(c *gin.Context) { 134 | // 查询列表 135 | var req struct { 136 | ID uint 137 | } 138 | 139 | if err := c.ShouldBindJSON(&req); err != nil { 140 | bean.Log.Warning(err.Error()) 141 | c.String(400, err.Error()) 142 | return 143 | } 144 | 145 | var one admin.AdminMenu 146 | if err := bean.MysqlDb.Where("id=?", req.ID).Take(&one).Error; err != nil { 147 | bean.Log.Error(err) 148 | c.String(500, err.Error()) 149 | return 150 | } 151 | 152 | if err := bean.MysqlDb.Delete(&one).Error; err != nil { 153 | bean.Log.Error(err) 154 | c.String(500, err.Error()) 155 | return 156 | } 157 | 158 | c.String(200, "ok") 159 | } 160 | -------------------------------------------------------------------------------- /controller/admin/record.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "auth-gateway/model/admin" 6 | 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | func RecordList(c *gin.Context) { 11 | 12 | var req struct { 13 | Page int `binding:"required,gte=1"` 14 | Limit int `binding:"required,gte=1"` 15 | Name string `binding:"max=255"` 16 | } 17 | 18 | if err := c.ShouldBindQuery(&req); err != nil { 19 | bean.Log.Warning(err.Error()) 20 | c.String(400, err.Error()) 21 | return 22 | } 23 | 24 | var offset = (req.Page - 1) * req.Limit 25 | 26 | // 查询 27 | var count int64 28 | var list []admin.AdminRecord 29 | 30 | var tx = bean.MysqlDb.Model(&admin.AdminRecord{}) 31 | 32 | if req.Name != "" { 33 | tx = tx.Where("name like ?", "%"+req.Name+"%") 34 | } 35 | 36 | // 查询总数 37 | if err := tx.Count(&count).Error; err != nil { 38 | bean.Log.Error(err) 39 | c.String(500, err.Error()) 40 | return 41 | } 42 | 43 | // 查询列表 44 | if err := tx.Limit(req.Limit).Offset(offset).Order("id DESC").Find(&list).Error; err != nil { 45 | bean.Log.Error(err) 46 | c.String(500, err.Error()) 47 | return 48 | } 49 | 50 | c.PureJSON(200, gin.H{ 51 | "count": count, 52 | "list": list, 53 | }) 54 | } 55 | -------------------------------------------------------------------------------- /controller/admin/role.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "auth-gateway/model/admin" 6 | "encoding/json" 7 | 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | func RoleAllList(c *gin.Context) { 12 | 13 | var list []struct { 14 | ID uint 15 | Name string 16 | } 17 | 18 | var tx = bean.MysqlDb.Model(&admin.AdminRole{}) 19 | 20 | // 查询列表 21 | if err := tx.Model(&admin.AdminRole{}).Order("`id` ASC").Find(&list).Error; err != nil { 22 | bean.Log.Error(err) 23 | c.String(500, err.Error()) 24 | return 25 | } 26 | 27 | c.PureJSON(200, gin.H{ 28 | "list": list, 29 | }) 30 | } 31 | 32 | func RoleList(c *gin.Context) { 33 | 34 | var req struct { 35 | Page int `binding:"required,gte=1"` 36 | Limit int `binding:"required,gte=1"` 37 | Name string `binding:"max=255"` 38 | } 39 | 40 | if err := c.ShouldBindQuery(&req); err != nil { 41 | bean.Log.Warning(err.Error()) 42 | c.String(400, err.Error()) 43 | return 44 | } 45 | 46 | var offset = (req.Page - 1) * req.Limit 47 | 48 | // 查询 49 | var count int64 50 | var list []admin.AdminRole 51 | 52 | var tx = bean.MysqlDb.Model(&admin.AdminRole{}) 53 | 54 | if req.Name != "" { 55 | tx = tx.Where("name like ?", "%"+req.Name+"%") 56 | } 57 | 58 | // 查询总数 59 | if err := tx.Count(&count).Error; err != nil { 60 | bean.Log.Error(err) 61 | c.String(500, err.Error()) 62 | return 63 | } 64 | 65 | // 查询列表 66 | if err := tx.Limit(req.Limit).Offset(offset).Order("id DESC").Find(&list).Error; err != nil { 67 | bean.Log.Error(err) 68 | c.String(500, err.Error()) 69 | return 70 | } 71 | 72 | c.PureJSON(200, gin.H{ 73 | "count": count, 74 | "list": list, 75 | }) 76 | } 77 | 78 | func RoleDetail(c *gin.Context) { 79 | // 查询列表 80 | var req struct { 81 | ID int `binding:"required,gte=1"` 82 | } 83 | 84 | if err := c.ShouldBindQuery(&req); err != nil { 85 | bean.Log.Warning(err.Error()) 86 | c.String(400, err.Error()) 87 | return 88 | } 89 | 90 | var one admin.AdminRole 91 | 92 | if err := bean.MysqlDb.Where("id=?", req.ID).First(&one).Error; err != nil { 93 | bean.Log.Error(err) 94 | c.String(500, err.Error()) 95 | return 96 | } 97 | 98 | c.PureJSON(200, one) 99 | } 100 | 101 | func RoleEdit(c *gin.Context) { 102 | // 查询列表 103 | var req struct { 104 | ID uint 105 | Name string `binding:"max=255"` 106 | } 107 | 108 | if err := c.ShouldBindJSON(&req); err != nil { 109 | bean.Log.Warning(err.Error()) 110 | c.String(400, err.Error()) 111 | return 112 | } 113 | 114 | var one admin.AdminRole 115 | one.ID = req.ID 116 | one.Name = req.Name 117 | 118 | if one.ID == 0 { 119 | one.AdminMenuApiPaths = "[]" 120 | one.AdminMenuIds = "[]" 121 | 122 | if err := bean.MysqlDb.Create(&one).Error; err != nil { 123 | bean.Log.Error(err) 124 | c.String(500, err.Error()) 125 | return 126 | } 127 | } else { 128 | if err := bean.MysqlDb.Updates(&one).Error; err != nil { 129 | bean.Log.Error(err) 130 | c.String(500, err.Error()) 131 | return 132 | } 133 | } 134 | 135 | c.String(200, "ok") 136 | } 137 | 138 | func RoleDelete(c *gin.Context) { 139 | // 查询列表 140 | var req struct { 141 | ID uint 142 | } 143 | 144 | if err := c.ShouldBindJSON(&req); err != nil { 145 | bean.Log.Warning(err.Error()) 146 | c.String(400, err.Error()) 147 | return 148 | } 149 | 150 | // 判断是否在用 151 | var one admin.AdminRole 152 | if err := bean.MysqlDb.Where("id=?", req.ID).Take(&one).Error; err != nil { 153 | bean.Log.Error(err) 154 | c.String(500, err.Error()) 155 | return 156 | } 157 | 158 | if err := bean.MysqlDb.Delete(&one).Error; err != nil { 159 | bean.Log.Error(err) 160 | c.String(500, err.Error()) 161 | return 162 | } 163 | 164 | c.String(200, "ok") 165 | } 166 | 167 | // 修改权限 168 | func RolePermissionEdit(c *gin.Context) { 169 | // 查询列表 170 | var req struct { 171 | ID uint 172 | AdminMenuIds []uint 173 | } 174 | 175 | if err := c.ShouldBindJSON(&req); err != nil { 176 | bean.Log.Warning(err.Error()) 177 | c.String(400, err.Error()) 178 | return 179 | } 180 | 181 | // 判断是否存在 182 | var one admin.AdminRole 183 | if err := bean.MysqlDb.Where("id=?", req.ID).Take(&one).Error; err != nil { 184 | bean.Log.Error(err) 185 | c.String(400, err.Error()) 186 | return 187 | } 188 | 189 | // updates 190 | var one2 admin.AdminRole 191 | one2.ID = one.ID 192 | 193 | if menuIds, err := json.Marshal(req.AdminMenuIds); err != nil { 194 | bean.Log.Error(err) 195 | c.String(500, err.Error()) 196 | return 197 | } else { 198 | one2.AdminMenuIds = string(menuIds) 199 | } 200 | 201 | // 查询 menu_id 转为 api_path 202 | var menu []admin.AdminMenu 203 | var paths []string 204 | 205 | if err := bean.MysqlDb.Where("id in (?)", req.AdminMenuIds).Where("`type`='接口'").Find(&menu).Error; err != nil { 206 | bean.Log.Error(err) 207 | c.String(500, err.Error()) 208 | return 209 | } 210 | 211 | for _, v := range menu { 212 | paths = append(paths, v.Path) 213 | } 214 | 215 | if path, err := json.Marshal(paths); err != nil { 216 | bean.Log.Error(err) 217 | c.String(500, err.Error()) 218 | return 219 | } else { 220 | one2.AdminMenuApiPaths = string(path) 221 | } 222 | 223 | // save 224 | if err := bean.MysqlDb.Updates(&one2).Error; err != nil { 225 | bean.Log.Error(err) 226 | c.String(500, err.Error()) 227 | return 228 | } 229 | 230 | c.String(200, "ok") 231 | } 232 | -------------------------------------------------------------------------------- /controller/admin/test.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | ) 6 | 7 | func Test(c *gin.Context) { 8 | 9 | c.PureJSON(200, 11) 10 | } 11 | -------------------------------------------------------------------------------- /controller/test.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "time" 5 | 6 | "github.com/gin-gonic/gin" 7 | ) 8 | 9 | func Time(c *gin.Context) { 10 | c.String(200, time.Now().Format(time.DateTime)) 11 | } 12 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module auth-gateway 2 | 3 | go 1.20 4 | 5 | require ( 6 | github.com/gin-gonic/gin v1.9.1 7 | github.com/sirupsen/logrus v1.9.0 8 | gorm.io/gorm v1.23.8 9 | ) 10 | 11 | require ( 12 | github.com/bytedance/sonic v1.9.1 // indirect 13 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect 14 | github.com/gabriel-vasile/mimetype v1.4.2 // indirect 15 | github.com/klauspost/cpuid/v2 v2.2.4 // indirect 16 | github.com/twitchyliquid64/golang-asm v0.15.1 // indirect 17 | golang.org/x/arch v0.3.0 // indirect 18 | ) 19 | 20 | require github.com/go-sql-driver/mysql v1.7.0 // indirect 21 | 22 | require ( 23 | github.com/dchest/captcha v1.0.0 24 | github.com/gin-contrib/sse v0.1.0 // indirect 25 | github.com/go-playground/locales v0.14.1 // indirect 26 | github.com/go-playground/universal-translator v0.18.1 // indirect 27 | github.com/go-playground/validator/v10 v10.14.0 // indirect 28 | github.com/goccy/go-json v0.10.2 // indirect 29 | github.com/jinzhu/inflection v1.0.0 // indirect 30 | github.com/jinzhu/now v1.1.5 // indirect 31 | github.com/json-iterator/go v1.1.12 // indirect 32 | github.com/leodido/go-urn v1.2.4 // indirect 33 | github.com/mattn/go-isatty v0.0.19 // indirect 34 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 35 | github.com/modern-go/reflect2 v1.0.2 // indirect 36 | github.com/pelletier/go-toml/v2 v2.0.8 // indirect 37 | github.com/ugorji/go/codec v1.2.11 // indirect 38 | golang.org/x/crypto v0.9.0 // indirect 39 | golang.org/x/net v0.10.0 // indirect 40 | golang.org/x/sys v0.8.0 // indirect 41 | golang.org/x/text v0.9.0 // indirect 42 | google.golang.org/protobuf v1.30.0 // indirect 43 | gopkg.in/yaml.v3 v3.0.1 44 | gorm.io/driver/mysql v1.4.7 45 | ) 46 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= 2 | github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= 3 | github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= 4 | github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= 5 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= 6 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= 7 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 8 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 9 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 10 | github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o= 11 | github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo= 12 | github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= 13 | github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= 14 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= 15 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 16 | github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= 17 | github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= 18 | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= 19 | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= 20 | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= 21 | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= 22 | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= 23 | github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= 24 | github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= 25 | github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= 26 | github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= 27 | github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= 28 | github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 29 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 30 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 31 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 32 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 33 | github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= 34 | github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= 35 | github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= 36 | github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= 37 | github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= 38 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 39 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 40 | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 41 | github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= 42 | github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= 43 | github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= 44 | github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= 45 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= 46 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 47 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 48 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 49 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 50 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= 51 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 52 | github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= 53 | github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= 54 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 55 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 56 | github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= 57 | github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 58 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 59 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 60 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 61 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 62 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 63 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 64 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 65 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 66 | github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 67 | github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= 68 | github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 69 | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= 70 | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 71 | github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= 72 | github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= 73 | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 74 | golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= 75 | golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 76 | golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= 77 | golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= 78 | golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= 79 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 80 | golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 81 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 82 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 83 | golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= 84 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 85 | golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= 86 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 87 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 88 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 89 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 90 | google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= 91 | google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 92 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 93 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 94 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 95 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 96 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 97 | gorm.io/driver/mysql v1.4.7 h1:rY46lkCspzGHn7+IYsNpSfEv9tA+SU4SkkB+GFX125Y= 98 | gorm.io/driver/mysql v1.4.7/go.mod h1:SxzItlnT1cb6e1e4ZRpgJN2VYtcqJgqnHxWr4wsP8oc= 99 | gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE= 100 | gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= 101 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 102 | -------------------------------------------------------------------------------- /html/css/app.c78d4271.css: -------------------------------------------------------------------------------- 1 | #app{height:100vh}#app .el-input.is-disabled .el-input__inner,#app .el-textarea.is-disabled .el-textarea__inner{color:#000}#nprogress .spinner{right:15px!important;top:15px!important}a,abbr,acronym,address,applet,article,aside,audio,big,body,canvas,center,cite,code,dd,details,dfn,div,dl,dt,embed,fieldset,figcaption,figure,footer,form,h4,h5,h6,header,hgroup,html,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,summary,time,tt,u,ul,var,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;-webkit-box-sizing:border-box;box-sizing:border-box}caption,table,tbody,td,tfoot,th,thead,tr{margin:0;padding:0;font-size:100%;font:inherit;vertical-align:baseline;-webkit-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}a,a:hover{color:inherit;text-decoration:none}table{border-collapse:collapse;border-spacing:0}body,html{width:100%;height:100%;background-color:#f5f5f5;font-family:PingFangSC-Light,PingFang SC,STHeitiSC-Light,Helvetica-Light,Arial,"sans-serif"}.fl{float:left}.fr{float:right}.fr .button-group-item{padding-left:3px}.clearfix{zoom:1}.clearfix:after{display:block;clear:both;content:"";visibility:hidden;height:0}@font-face{font-family:iconfont;src:url(//at.alicdn.com/t/font_2699486_k2e52bx1j6s.woff2?t=1627463812762) format("woff2"),url(//at.alicdn.com/t/font_2699486_k2e52bx1j6s.woff?t=1627463812762) format("woff"),url(//at.alicdn.com/t/font_2699486_k2e52bx1j6s.ttf?t=1627463812762) format("truetype")}.iconfont{font-family:iconfont!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-anniu1:before{content:"\e625"}.icon-anniu:before{content:"\e7fb"}.icon-caidan:before{content:"\e624"}.icon-mulu:before{content:"\e84e"}.icon-jiesuanguanli:before{content:"\e610"}.icon-jiesuan:before{content:"\e61d"}.icon-index:before{content:"\e600"} -------------------------------------------------------------------------------- /html/css/chunk-02f03958.2d98c619.css: -------------------------------------------------------------------------------- 1 | .content[data-v-0d11735a]{padding:20px 20px;background-color:#fff}.el-form[data-v-0d11735a] .el-form-item .el-input,.el-form[data-v-0d11735a] .el-form-item .el-select{width:500px} -------------------------------------------------------------------------------- /html/css/chunk-1ccde611.d24fe862.css: -------------------------------------------------------------------------------- 1 | .content[data-v-6ede1650]{background-color:#fff}.el-form[data-v-6ede1650]{margin-top:10px}.el-form[data-v-6ede1650] .el-form-item .el-input,.el-form[data-v-6ede1650] .el-form-item .el-select{width:500px}.admin-model .el-dialog[data-v-6ede1650]{background-color:pink}.admin-model .el-dialog[data-v-6ede1650] .el-dialog__body{padding:30px 120px}.admin-model .el-dialog .el-icon-view[data-v-6ede1650]:before{font-size:20px}.admin-model .el-dialog .colse-eye[data-v-6ede1650]{width:21px}.admin-model .el-dialog .colse-eye[data-v-6ede1650]:before{content:"";display:inline-block;width:21px;height:14px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABy9JREFUeF7tmlWPbEUURtfF3d3dgru7BJcgCYRgIfwAfgdP8MATLzyQQHB3h+Du7u4SHLImVZN9a845fap7Lsn09E46c293naraX2359q6zgHkuC+a5/kwAmFjAPEdg4gLz3AAmQXAcXWAf4PG+lj1uAOwF7A881heEcQJgD+DAcPK9QBgXAHYDDi7MXjcQhE4ZBwB2Bg4rtHwSeHiQ8v7+fwKwLLA2sELxcR8/F58PgX96KLAjcEQx7mngwR7PTg1ZlACsDqwHrJv++v8aeQN4D3gf+KXhwe2Bo4rvnwXur1lktgFYDtgqfTas2ciAsTcDb4Yx2wFHF888D9xbu+ZsAaCyWXFBaJOPgD+A39Nf/63oHsukjxazRJigVH5r4LhigReBu2uVnw0X2BgwCG3RsvinwGeAimvKf/fc5CrAOikOxJPfEjihmOMV4I6e884YNqwF6Nsqvm3Dwvrra8CrwFfDbqzhuc2BE4u45Tq3jbJGLQCa936A0bcUlVVpP7+OsqmGZzdNJx9dwyB5y6jr1ACguR8ErFks+g1gAPKzKGSjdPJLhcnfAowN/4bvtJCVgOdqNtEXgN2T8nHuH4Pif/ZcVAtSIVOiQMoLlkwcQAtSsejzGyTlDZBZ3knKx3jiuJOApQFjwqPAT3321AcA041pJ4ooP9GSn9vWNWZIWQ1wTVJGe+OMPh+zioH0JiACLpjHJ1DzvIIpCILVKYMAMN2YdrLI2KSY+nmNnA508YJSeTOA0X7FsIjsUOVNoU1iIWRBFGVgQdQFQKn820n5b2s0By4oTt3TM3p/DHwC6EpR1krKrxy+dKwgDQqu26SiaPnwbCcIbQCUyr8E3FWpuMNLxvZFYmtygyZZIym/avhRLqHyWl8fMbYcW7hEKwhNAOydUl1e7BnggT4rF2NWA84L3w2ax/GafawZPk/Kl1YyaDsWXKf2AaEEQBp6BrB4WmGgD3XsxACWGaKneFXHWAOjgUzzz/JlUv77Qdp2/H5uAYKM0SwxLSUAJwObpV+NuNeOsPhFqex1CpUXhCYxd6u8gS+L3MKAF+ONe415v+/Wzgpz/5Z00rKmJAIQebaR9hpAnx1GVOrC9OB3wBUtkxisNHtTXhbH6/ORRpvfNwFkf7UiezQQ6xaKgdeDnUqlEQAprv6vmOfvq10pjJe6npL+b01/XcNcVoAqL4nJ8kNSPgLvxs9PTY4XhtyT5Ou08Ky6TTHGCEDM1W7YjQ8rsUHZ1KHxRDV76XUWmZsnHzOE2cCILmN8JJGvYfdk5yjXMNOHEgG4OMx8ybCrpOd2AQ5N/y4DqdRX5bWSLFaQKq95RjkS2CF9cSMgFxlFZugYAYi5f5To7wZlfVpU2aUxu6i8hUsWA5MBz55BKTGKX15Jvcu5on4CKaALuUDZYCzpaQ3yVm6HF7W6YKu8wTaLHSGV/6BhcvmAACimxCtrNlCMtYq1oMtye6bz0QIWSxwgRmQXdfHZEH1Zqprlr2T277ZMHn126JZXapzaQM2ykHWXPCBHXP00y6WpfzcKCGVFactbC2vz6ZhFXPd6oA2otn1pQV6WmD6zzKD0TVRYNnZ2MaucwGpsGLF1HU/AObrcy3rgnLCQJe0NlQvboFX5WE0aY64u52krhppAsAz2xqVGohnn524FXm+YxFrA4skLziiXdZTATXvxdnjf4ofpoNcXAMdpQtLI6A5O5J1bn7jgdZVNkCjTwSd86UlJhsz1pdRkI0/bYBf7F87XeV8wqCHS1G2RQtptsbprk0OAXYsf7wReLr6TncnSSrE1JlvrWwLr5wIZK0mDrOSpa5+9rsacVJoc05cbNijpyy4UpUw5/nYPUNLYM9O1WXxW/m/E79tgtV0m64wpzvn0d5VvK8Cm1xxkAXFzO6VaIRcVVmwC4N8svpxQ+vA07w7jLJPzbZBc4Ov0aWt3NVma+1HxssdonFL5XpVjDQBuQj91UbsupfIGHgNQFBspnSbY4UZtPxnhpccxvTnWtpl1x8BGaJy4FoD8rG4RT77sIjnuIeCpIRRsesT+oCTKAFfeS9gtUvGq+4C8yLAAxE3uCRxQ7HrUys3prOOtGWzQeOrxVigvp+JaWN9gOQPcUQFoujBpSl26hr5qkNNy7PRY+0cx3dpI0bqMEX5iCs5j7QznK7iR7x5HAcA0Z7qL4mWJpx+liZjk3w1+0mJzuEGxSwQuKz70iZcLDAtA03s5+rt+31f5PuFB/7Z5YVqTG/R5babPvNNjhgGg6b2crpa3a1hh+lk/uYKmXpq3yuV3haw75Blt9wdVSnYNrgWg6b2cYfuHXngKhHtQ8ab3gGZN0baJagDwZYhjiolkd7K8OSt9AWh6L0deL7+f09IXAPOw7awsRmMruzkvfQFQ0QyCtbw1/VhIDQAZhPgGx5wHoRaAOa9wqcAEgLE70kqFJhZQCdjYDZ9YwNgdaaVC894C/gOT42RQZ/cT/AAAAABJRU5ErkJggg==) no-repeat 50%;background-size:100% auto;margin-top:13px;margin-right:4px} -------------------------------------------------------------------------------- /html/css/chunk-1fd08d72.0eb26cea.css: -------------------------------------------------------------------------------- 1 | .login-container[data-v-fb8652be]{min-height:100%;width:100%;background:url(../img/login_bg.b201058b.jpg) no-repeat 50%;background-size:cover;overflow:hidden}.login-container .login_cont[data-v-fb8652be]{width:1200px;height:100vh;margin:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.login-container .login_cont .login_title[data-v-fb8652be]{text-align:center;font-size:33.33px;letter-spacing:4px;font-weight:700;color:#fff}.login-container .login_cont .box-card[data-v-fb8652be]{border-radius:12px;background-color:#fff;border:none}.login-container .login_cont .box-card .box-top[data-v-fb8652be]{margin-top:68px;margin-bottom:20px;margin-left:20px;font-size:25px;letter-spacing:5px;color:#060606;font-weight:600}.login-container .login_cont .box-card .demo-ruleForm[data-v-fb8652be]{padding:0 20px}.login-container .login_cont .box-card .demo-ruleForm[data-v-fb8652be] .el-form-item{margin-bottom:30px}.login-container .login_cont .box-card .demo-ruleForm .loin_item[data-v-fb8652be]{font-size:18px}.login-container .login_cont .box-card .demo-ruleForm .loin_item[data-v-fb8652be] .el-input__inner{height:42px;line-height:42px;font-size:14px}.login-container .login_cont .box-card .demo-ruleForm .loin_item[data-v-fb8652be] .el-input__icon{line-height:42px}.login-container .login_cont .box-card .demo-ruleForm .loin_item[data-v-fb8652be] .el-input-group__append{width:100px;padding:0;height:42px;-webkit-box-sizing:border-box;box-sizing:border-box;border:none}.login-container .login_cont .box-card .demo-ruleForm .loin_item .img_cont[data-v-fb8652be]{width:100px;height:100%;height:42px;font-size:16px;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box}.login-container .login_cont .box-card .demo-ruleForm .loin_item .img_cont img[data-v-fb8652be]{width:100%;height:100%;cursor:pointer}.login-container .login_cont .box-card .demo-ruleForm .loin_itembtn[data-v-fb8652be]{margin-top:50px;width:100%;font-size:18px} -------------------------------------------------------------------------------- /html/css/chunk-2b16495a.3ff21897.css: -------------------------------------------------------------------------------- 1 | .role[data-v-39b5656f]{min-width:730px}.tabs[data-v-39b5656f]{font-size:18px;width:700px}.addPage-btn[data-v-39b5656f]{margin-top:20px}.tree-content[data-v-39b5656f]{padding:20px 20px 50px;background-color:#fff}.tree1[data-v-39b5656f]{margin-top:50px;width:700px}[data-v-39b5656f] .el-tree-node__content{height:38px}.el-button--text[data-v-39b5656f]{font-size:14px}.icon-titlle[data-v-39b5656f]{width:20px;margin-right:5px;vertical-align:middle}.custom-tree-node[data-v-39b5656f]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:18px}.custom-tree-node .sort_id[data-v-39b5656f]{width:30px} -------------------------------------------------------------------------------- /html/css/chunk-2e82ed00.7bd433b5.css: -------------------------------------------------------------------------------- 1 | .content[data-v-6a0408ac]{margin-top:0;padding:20px 20px;background-color:#fff} -------------------------------------------------------------------------------- /html/css/chunk-4243275a.d4dc1969.css: -------------------------------------------------------------------------------- 1 | .home[data-v-0960e3e9]{min-width:1200px;padding:80px 30px}.home .user-box[data-v-0960e3e9]{background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around;-webkit-box-shadow:0 2px 12px 1px rgba(25,103,142,.1);box-shadow:0 2px 12px 1px rgba(25,103,142,.1)}.home .user-box .user-item[data-v-0960e3e9]{min-width:300px;margin:20px 0 30px 30px;display:-webkit-box;display:-ms-flexbox;display:flex;background-color:#fff;border-right:2px solid #e6e6e6}.home .user-box .user-item .user-icon[data-v-0960e3e9]{width:80px;height:80px}.home .user-box .user-item .user-icon img[data-v-0960e3e9]{width:100%;height:100%}.home .user-box .user-item .detail[data-v-0960e3e9]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around;margin-left:20px}.home .user-box .user-item .detail .num[data-v-0960e3e9]{font-size:25px;color:#efb500;font-weight:700}.home .user-box .user-item .detail .txt[data-v-0960e3e9]{font-size:18px;color:#333;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.home .user-box .user-item .detail .num-red[data-v-0960e3e9]{margin-left:10px;color:#ff566c}.home .user-box .user-item .detail .num-blue[data-v-0960e3e9]{color:#1679e8}.home .user-box .user-item .detail .num-green[data-v-0960e3e9]{color:#45b34b}.home .user-box .user-item[data-v-0960e3e9]:last-child{border-right:none}.home .graph[data-v-0960e3e9]{margin-top:80px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.home .graph .el-card[data-v-0960e3e9]{width:48%}.home .graph p[data-v-0960e3e9]{color:#333;font-size:18px}.home .graph .line[data-v-0960e3e9]{display:inline-block;width:2px;height:15px;vertical-align:top;background-color:#0059af}.juzhong[data-v-0960e3e9]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100vh;overflow:hidden} -------------------------------------------------------------------------------- /html/css/chunk-5b4bb6bc.cbf84ebb.css: -------------------------------------------------------------------------------- 1 | .cont[data-v-367ea050]{width:100%;height:100%;background-color:#2d3a4b}.wscn-http404-container[data-v-367ea050]{-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;top:40%;left:50%}.wscn-http404[data-v-367ea050]{position:relative;width:1200px;padding:0 50px;overflow:hidden}.wscn-http404 .pic-404[data-v-367ea050]{position:relative;float:left;width:600px;overflow:hidden}.wscn-http404 .pic-404__parent[data-v-367ea050]{width:100%}.wscn-http404 .pic-404__child[data-v-367ea050]{position:absolute}.wscn-http404 .pic-404__child.left[data-v-367ea050]{width:80px;top:17px;left:220px;opacity:0;-webkit-animation-name:cloudLeft-367ea050;animation-name:cloudLeft-367ea050;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.wscn-http404 .pic-404__child.mid[data-v-367ea050]{width:46px;top:10px;left:420px;opacity:0;-webkit-animation-name:cloudMid-367ea050;animation-name:cloudMid-367ea050;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1.2s;animation-delay:1.2s}.wscn-http404 .pic-404__child.right[data-v-367ea050]{width:62px;top:100px;left:500px;opacity:0;-webkit-animation-name:cloudRight-367ea050;animation-name:cloudRight-367ea050;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}@-webkit-keyframes cloudLeft-367ea050{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@keyframes cloudLeft-367ea050{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@-webkit-keyframes cloudMid-367ea050{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@keyframes cloudMid-367ea050{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@-webkit-keyframes cloudRight-367ea050{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}@keyframes cloudRight-367ea050{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}.wscn-http404 .bullshit[data-v-367ea050]{position:relative;float:left;width:300px;padding:30px 0;overflow:hidden}.wscn-http404 .bullshit__oops[data-v-367ea050]{font-size:32px;line-height:40px;color:#1482f0;margin-bottom:20px;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__headline[data-v-367ea050],.wscn-http404 .bullshit__oops[data-v-367ea050]{font-weight:700;opacity:0;-webkit-animation-name:slideUp-367ea050;animation-name:slideUp-367ea050;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__headline[data-v-367ea050]{font-size:20px;line-height:24px;color:#222;margin-bottom:10px;-webkit-animation-delay:.1s;animation-delay:.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-367ea050]{font-size:13px;line-height:21px;color:grey;margin-bottom:30px;-webkit-animation-delay:.2s;animation-delay:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-367ea050],.wscn-http404 .bullshit__return-home[data-v-367ea050]{opacity:0;-webkit-animation-name:slideUp-367ea050;animation-name:slideUp-367ea050;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__return-home[data-v-367ea050]{display:block;float:left;width:110px;height:36px;background:#1482f0;border-radius:100px;text-align:center;color:#fff;font-size:14px;line-height:36px;cursor:pointer;-webkit-animation-delay:.3s;animation-delay:.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes slideUp-367ea050{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes slideUp-367ea050{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}} -------------------------------------------------------------------------------- /html/css/chunk-92041630.9781e4a6.css: -------------------------------------------------------------------------------- 1 | .el-menu[data-v-6533749c]{height:100%;border:none}.el-menu h3[data-v-6533749c]{color:#fff;text-align:center;font-weight:700}.el-menu[data-v-6533749c] .el-menu-item,.el-menu[data-v-6533749c] .el-submenu__title{font-size:16px;height:45px;line-height:45px}.el-menu[data-v-6533749c] .el-menu-item-group__title{display:none}.el-menu-vertical-demo[data-v-6533749c]:not(.el-menu--collapse){width:220px;min-height:400px}.icon-titlle[data-v-6533749c]{width:20px;margin-right:8px;vertical-align:middle}.el-menu-vertical-demo[data-v-6533749c] .is-active{background-color:rgba(31,45,61,.5)!important}.tabs[data-v-35394033]{background-color:#edf2f5;padding:10px 20px 0!important}.tabs .el-tag[data-v-35394033]{margin-right:15px;margin-bottom:10px;cursor:pointer}header[data-v-12f4fb38] .el-dialog__body{padding:0 20px}.infoitem[data-v-12f4fb38]{width:200px;text-align:center;line-height:25px;font-size:18px;padding:10px 0}header[data-v-12f4fb38]{height:100%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.l-content[data-v-12f4fb38],header[data-v-12f4fb38]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.l-content .el-button[data-v-12f4fb38]{margin-right:20px}.l-content[data-v-12f4fb38] .el-breadcrumb__inner{color:#333!important}.l-content .isfold[data-v-12f4fb38]{font-size:25px;color:#333;margin-right:15px;cursor:pointer}.r-content[data-v-12f4fb38]{margin-right:20px}.r-content .name_c[data-v-12f4fb38]{display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.r-content .myname[data-v-12f4fb38]{color:#333;display:inline-block;line-height:45px;font-size:16px;margin-right:10px;font-weight:700}.r-content .user[data-v-12f4fb38]{width:35px;height:35px;border-radius:50%}.el-breadcrumb__item .el-breadcrumb__inner{color:#666;font-weight:400}.el-breadcrumb__item:last-child .el-breadcrumb__inner{color:#fff}.el-header[data-v-ae661f98]{background-color:#edf2f5;height:48px!important;border-bottom:2px solid #e6e6e6}.el-aside[data-v-ae661f98]::-webkit-scrollbar{display:none}.el-main[data-v-ae661f98]{background-color:#edf2f5;padding-top:0} -------------------------------------------------------------------------------- /html/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/favicon.ico -------------------------------------------------------------------------------- /html/fonts/element-icons.535877f5.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/fonts/element-icons.535877f5.woff -------------------------------------------------------------------------------- /html/fonts/element-icons.732389de.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/fonts/element-icons.732389de.ttf -------------------------------------------------------------------------------- /html/img/404.a57b6f31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/img/404.a57b6f31.png -------------------------------------------------------------------------------- /html/img/404_cloud.0f4bc32b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/img/404_cloud.0f4bc32b.png -------------------------------------------------------------------------------- /html/img/limit-icon.a58ad831.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/img/limit-icon.a58ad831.png -------------------------------------------------------------------------------- /html/img/login_bg.b201058b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/img/login_bg.b201058b.jpg -------------------------------------------------------------------------------- /html/img/position-icon.244701e8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/img/position-icon.244701e8.png -------------------------------------------------------------------------------- /html/img/team-icon.e071b9db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/img/team-icon.e071b9db.png -------------------------------------------------------------------------------- /html/img/user-default.e28e794c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/img/user-default.e28e794c.png -------------------------------------------------------------------------------- /html/index.html: -------------------------------------------------------------------------------- 1 | auth-gateway 权限管理平台
-------------------------------------------------------------------------------- /html/js/app.101e40b7.js: -------------------------------------------------------------------------------- 1 | (function(e){function n(n){for(var r,o,i=n[0],c=n[1],s=n[2],l=0,d=[];l1?arguments[1]:void 0)}},"2e78":function(e,t,a){"use strict";a.r(t);a("b0c0");var o=function(){var e=this,t=e._self._c;return t("div",{staticClass:"content"},[t("el-form",{staticClass:"el-form",attrs:{inline:!0}},[t("el-form-item",{attrs:{label:""}},[t("el-input",{staticClass:"input-with-select",attrs:{placeholder:"角色",clearable:""},on:{clear:e.loadData},nativeOn:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.loadData.apply(null,arguments)}},model:{value:e.condition.name,callback:function(t){e.$set(e.condition,"name",t)},expression:"condition.name"}},[t("el-button",{attrs:{slot:"append",icon:"el-icon-search"},on:{click:function(t){return e.loadData()}},slot:"append"})],1)],1),t("el-form-item",[t("el-button",{attrs:{type:"primary",icon:"el-icon-plus"},on:{click:function(t){return e.addRole()}}},[e._v("创建角色")])],1)],1),t("el-table",{ref:"filterTable",staticStyle:{width:"100%","margin-bottom":"20px"},attrs:{data:e.tableData,border:""}},[t("el-table-column",{attrs:{prop:"Name",align:"center","show-overflow-tooltip":!0,label:"角色","min-width":"180"}}),t("el-table-column",{attrs:{prop:"CreatedAt",align:"center",label:"创建时间","min-width":"180"}}),t("el-table-column",{staticClass:"handDo",attrs:{prop:"name",align:"center",label:"操作","min-width":"160",fixed:"right"},scopedSlots:e._u([{key:"default",fn:function(a){return[t("el-button",{attrs:{type:"primary"},on:{click:function(t){return e.editUser(a.row)}}},[e._v("编辑")]),t("el-button",{attrs:{type:"primary"},on:{click:function(t){return e.editUserPage(a.row)}}},[e._v("权限管理")]),t("el-button",{attrs:{type:"danger"},on:{click:function(t){return t.stopPropagation(),e.delPage(a.row.ID)}}},[e._v("删除")])]}}])})],1),t("el-pagination",{staticStyle:{"text-align":"right","margin-top":"20px"},attrs:{layout:"total, prev, pager, next, jumper",total:e.page.totle,"page-size":e.page.Limit,"current-page":e.page.page},on:{"update:currentPage":function(t){return e.$set(e.page,"page",t)},"update:current-page":function(t){return e.$set(e.page,"page",t)},"current-change":e.handleCurrentPage}}),t("el-dialog",{attrs:{visible:e.showAddRole,width:"800px"},on:{"update:visible":function(t){e.showAddRole=t},close:e.resetVerForm}},[t("el-form",{ref:"addRoleForm",staticClass:"demo-ruleForm",attrs:{model:e.addRoleForm,"status-icon":"",rules:e.rules,"label-width":"100px"}},[t("el-form-item",{attrs:{label:"名称",prop:"Name"}},[t("el-input",{model:{value:e.addRoleForm.Name,callback:function(t){e.$set(e.addRoleForm,"Name",t)},expression:"addRoleForm.Name"}})],1)],1),t("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[t("el-button",{on:{click:function(t){return e.resetVerForm()}}},[e._v("取 消")]),t("el-button",{attrs:{type:"primary"},on:{click:function(t){return e.commitRoleForm()}}},[e._v("确 定")])],1)],1),t("el-dialog",{attrs:{visible:e.showRolePage,title:"角色权限选择",width:"800px"},on:{"update:visible":function(t){e.showRolePage=t},close:e.exitRolePage}},[t("span",[t("el-button",{attrs:{size:"small",type:"primary"},on:{click:function(t){return e.setAllChecked()}}},[e._v("全选")]),t("el-button",{staticStyle:{"margin-bottom":"30px"},attrs:{size:"small",type:"primary"},on:{click:function(t){return e.resetAllChecked()}}},[e._v("清空")])],1),t("el-tree",{ref:"tree",attrs:{data:e.pageData,"show-checkbox":"","node-key":"ID","check-strictly":!0,"default-expanded-keys":e.defaultExpanded,"default-checked-keys":e.defaultCheck,props:e.defaultProps}}),t("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[t("el-button",{on:{click:function(t){return e.exitRolePage()}}},[e._v("取 消")]),t("el-button",{attrs:{type:"primary"},on:{click:function(t){return e.commitRolePage()}}},[e._v("确 定")])],1)],1)],1)},n=[],i=(a("14d9"),a("b64b"),a("d3b7"),a("159b"),{name:"role",data:function(){return{tableData:[],page:{page:1,Limit:20,totle:0},showAddRole:!1,isAddrole:!0,showRolePage:!1,addRoleForm:{ID:0,Name:""},rules:{Name:[{required:!0,message:"请输入名称",trigger:"change"}]},condition:{name:""},pageData:[],defaultProps:{children:"Children",label:"Label"},defaultPosProps:{children:"Children",label:"Name"},defaultCheck:[],defaultExpanded:[],editId:"",sortType:"",allData:[]}},mounted:function(){this.loadData(),this.getMenu()},methods:{loadData:function(){var e=this,t={Page:this.page.page,Limit:this.page.Limit,Name:this.condition.name};this.apiSever.get("".concat(this.URl.ROLE_LIST+"?Page="+t.Page+"&Limit="+t.Limit+"&Name="+t.Name),(function(t){e.tableData=t.data.list,e.page.totle=t.data.count}))},handleCurrentPage:function(e){this.page.page=e,this.loadData()},commitRoleForm:function(){var e=this;this.$refs["addRoleForm"].validate((function(t){if(!t)return!1;e.apiSever.post(e.URl.ROLE_EDIT,e.addRoleForm,(function(t){e.$message({type:"success",message:"操作成功!"}),e.showAddRole=!1,e.resetVerForm(),e.loadData()}))}))},resetVerForm:function(){this.addRoleForm={ID:0,Name:""},this.showAddRole=!1,this.$refs["addRoleForm"].resetFields()},addRole:function(){this.isAddrole=!0,this.showAddRole=!0},editUser:function(e){this.addRoleForm={ID:e.ID,Name:e.Name},this.isAddrole=!1,this.showAddRole=!0},delPage:function(e){var t=this,a={ID:e};this.$confirm("确定要删除吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((function(){t.apiSever.post(t.URl.ROLE_DELETE,a,(function(e){t.loadData(),t.$message({type:"success",message:"删除成功"})}))})).catch((function(){t.$message({type:"info",message:"取消操作"})}))},getMenu:function(){var e=this;this.apiSever.get("".concat(this.URl.MENU+"?type=My"),(function(t){e.pageData=t.data,e.pageData.forEach((function(t){e.defaultExpanded.push(t.ID)}))}))},getTreeRole:function(e){var t=this;this.apiSever.get("".concat(this.URl.ROLE_DETAIL+"?ID="+e),(function(e){t.defaultCheck=JSON.parse(e.data.AdminMenuIds)}))},editUserPage:function(e){this.editId=e.ID,this.getTreeRole(this.editId),this.showRolePage=!0},exitRolePage:function(){this.defaultCheck=[],this.$refs.tree.setCheckedKeys([]),this.editId="",this.showRolePage=!1},commitRolePage:function(){var e=this,t=this.$refs.tree.getCheckedKeys();this.apiSever.post(this.URl.ROLE_PERMISS,{ID:this.editId,AdminMenuIds:t},(function(t){e.$message({type:"success",message:"修改成功!"}),e.exitRolePage(),e.loadData()}))},resetAllChecked:function(){this.$refs.tree.setCheckedKeys([])},getAllData:function(e){var t=this;e.forEach((function(e){e.Children&&0!=e.Children.length?e.Children&&e.Children.length>0&&(t.allData.push(e),t.getAllData(e.Children)):t.allData.push(e)}))},setAllChecked:function(){var e=this;this.allData=[],this.getAllData(this.pageData),this.$nextTick((function(){e.$refs.tree.setCheckedNodes(e.allData)}))}}}),r=i,l=(a("d084"),a("2877")),s=Object(l["a"])(r,o,n,!1,null,"0d11735a",null);t["default"]=s.exports},a640:function(e,t,a){"use strict";var o=a("d039");e.exports=function(e,t){var a=[][e];return!!a&&o((function(){a.call(null,t||function(){return 1},1)}))}},b341:function(e,t,a){},b64b:function(e,t,a){"use strict";var o=a("23e7"),n=a("7b0b"),i=a("df75"),r=a("d039"),l=r((function(){i(1)}));o({target:"Object",stat:!0,forced:l},{keys:function(e){return i(n(e))}})},d084:function(e,t,a){"use strict";a("b341")}}]); 2 | //# sourceMappingURL=chunk-02f03958.f7dd72a2.js.map -------------------------------------------------------------------------------- /html/js/chunk-02f03958.f7dd72a2.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./node_modules/core-js/modules/web.dom-collections.for-each.js","webpack:///./node_modules/core-js/internals/array-for-each.js","webpack:///./src/views/limit/role.vue","webpack:///src/views/limit/role.vue","webpack:///./src/views/limit/role.vue?239c","webpack:///./src/views/limit/role.vue?a529","webpack:///./node_modules/core-js/internals/array-method-is-strict.js","webpack:///./node_modules/core-js/modules/es.object.keys.js","webpack:///./src/views/limit/role.vue?7418"],"names":["global","DOMIterables","DOMTokenListPrototype","forEach","createNonEnumerableProperty","handlePrototype","CollectionPrototype","error","COLLECTION_NAME","prototype","$forEach","arrayMethodIsStrict","STRICT_METHOD","module","exports","callbackfn","this","arguments","length","undefined","render","_vm","_c","_self","staticClass","attrs","on","loadData","nativeOn","$event","type","indexOf","_k","keyCode","key","apply","model","value","condition","name","callback","$$v","$set","expression","slot","addRole","_v","ref","staticStyle","tableData","scopedSlots","_u","fn","scope","editUser","row","editUserPage","stopPropagation","delPage","ID","page","totle","Limit","handleCurrentPage","showAddRole","resetVerForm","addRoleForm","rules","Name","commitRoleForm","showRolePage","exitRolePage","setAllChecked","resetAllChecked","pageData","defaultExpanded","defaultCheck","defaultProps","commitRolePage","staticRenderFns","data","isAddrole","required","message","trigger","children","label","defaultPosProps","editId","sortType","allData","mounted","getMenu","methods","_this","params","Page","apiSever","get","concat","URl","ROLE_LIST","list","count","val","_this2","$refs","validate","valid","post","ROLE_EDIT","$message","resetFields","id","_this3","$confirm","confirmButtonText","cancelButtonText","then","ROLE_DELETE","catch","_this4","MENU","res","item","push","getTreeRole","_this5","ROLE_DETAIL","JSON","parse","AdminMenuIds","tree","setCheckedKeys","_this6","checkedKeys","getCheckedKeys","ROLE_PERMISS","getAllData","_this7","Children","_this8","$nextTick","setCheckedNodes","component","fails","METHOD_NAME","argument","method","call","$","toObject","nativeKeys","FAILS_ON_PRIMITIVES","target","stat","forced","keys","it"],"mappings":"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","file":"js/chunk-02f03958.f7dd72a2.js","sourcesContent":["'use strict';\nvar global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar handlePrototype = function (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n if (DOMIterables[COLLECTION_NAME]) {\n handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype);\n }\n}\n\nhandlePrototype(DOMTokenListPrototype);\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.foreach\nmodule.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n// eslint-disable-next-line es/no-array-prototype-foreach -- safe\n} : [].forEach;\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"content\"},[_c('el-form',{staticClass:\"el-form\",attrs:{\"inline\":true}},[_c('el-form-item',{attrs:{\"label\":\"\"}},[_c('el-input',{staticClass:\"input-with-select\",attrs:{\"placeholder\":\"角色\",\"clearable\":\"\"},on:{\"clear\":_vm.loadData},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;return _vm.loadData.apply(null, arguments)}},model:{value:(_vm.condition.name),callback:function ($$v) {_vm.$set(_vm.condition, \"name\", $$v)},expression:\"condition.name\"}},[_c('el-button',{attrs:{\"slot\":\"append\",\"icon\":\"el-icon-search\"},on:{\"click\":function($event){return _vm.loadData()}},slot:\"append\"})],1)],1),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\",\"icon\":\"el-icon-plus\"},on:{\"click\":function($event){return _vm.addRole()}}},[_vm._v(\"创建角色\")])],1)],1),_c('el-table',{ref:\"filterTable\",staticStyle:{\"width\":\"100%\",\"margin-bottom\":\"20px\"},attrs:{\"data\":_vm.tableData,\"border\":\"\"}},[_c('el-table-column',{attrs:{\"prop\":\"Name\",\"align\":\"center\",\"show-overflow-tooltip\":true,\"label\":\"角色\",\"min-width\":\"180\"}}),_c('el-table-column',{attrs:{\"prop\":\"CreatedAt\",\"align\":\"center\",\"label\":\"创建时间\",\"min-width\":\"180\"}}),_c('el-table-column',{staticClass:\"handDo\",attrs:{\"prop\":\"name\",\"align\":\"center\",\"label\":\"操作\",\"min-width\":\"160\",\"fixed\":\"right\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.editUser(scope.row)}}},[_vm._v(\"编辑\")]),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.editUserPage(scope.row)}}},[_vm._v(\"权限管理\")]),_c('el-button',{attrs:{\"type\":\"danger\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.delPage(scope.row.ID)}}},[_vm._v(\"删除\")])]}}])})],1),_c('el-pagination',{staticStyle:{\"text-align\":\"right\",\"margin-top\":\"20px\"},attrs:{\"layout\":\"total, prev, pager, next, jumper\",\"total\":_vm.page.totle,\"page-size\":_vm.page.Limit,\"current-page\":_vm.page.page},on:{\"update:currentPage\":function($event){return _vm.$set(_vm.page, \"page\", $event)},\"update:current-page\":function($event){return _vm.$set(_vm.page, \"page\", $event)},\"current-change\":_vm.handleCurrentPage}}),_c('el-dialog',{attrs:{\"visible\":_vm.showAddRole,\"width\":\"800px\"},on:{\"update:visible\":function($event){_vm.showAddRole=$event},\"close\":_vm.resetVerForm}},[_c('el-form',{ref:\"addRoleForm\",staticClass:\"demo-ruleForm\",attrs:{\"model\":_vm.addRoleForm,\"status-icon\":\"\",\"rules\":_vm.rules,\"label-width\":\"100px\"}},[_c('el-form-item',{attrs:{\"label\":\"名称\",\"prop\":\"Name\"}},[_c('el-input',{model:{value:(_vm.addRoleForm.Name),callback:function ($$v) {_vm.$set(_vm.addRoleForm, \"Name\", $$v)},expression:\"addRoleForm.Name\"}})],1)],1),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){return _vm.resetVerForm()}}},[_vm._v(\"取 消\")]),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.commitRoleForm()}}},[_vm._v(\"确 定\")])],1)],1),_c('el-dialog',{attrs:{\"visible\":_vm.showRolePage,\"title\":'角色权限选择',\"width\":\"800px\"},on:{\"update:visible\":function($event){_vm.showRolePage=$event},\"close\":_vm.exitRolePage}},[_c('span',[_c('el-button',{attrs:{\"size\":\"small\",\"type\":\"primary\"},on:{\"click\":function($event){return _vm.setAllChecked()}}},[_vm._v(\"全选\")]),_c('el-button',{staticStyle:{\"margin-bottom\":\"30px\"},attrs:{\"size\":\"small\",\"type\":\"primary\"},on:{\"click\":function($event){return _vm.resetAllChecked()}}},[_vm._v(\"清空\")])],1),_c('el-tree',{ref:\"tree\",attrs:{\"data\":_vm.pageData,\"show-checkbox\":\"\",\"node-key\":\"ID\",\"check-strictly\":true,\"default-expanded-keys\":_vm.defaultExpanded,\"default-checked-keys\":_vm.defaultCheck,\"props\":_vm.defaultProps}}),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){return _vm.exitRolePage()}}},[_vm._v(\"取 消\")]),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.commitRolePage()}}},[_vm._v(\"确 定\")])],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./role.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./role.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./role.vue?vue&type=template&id=0d11735a&scoped=true\"\nimport script from \"./role.vue?vue&type=script&lang=js\"\nexport * from \"./role.vue?vue&type=script&lang=js\"\nimport style0 from \"./role.vue?vue&type=style&index=0&id=0d11735a&prod&lang=less&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0d11735a\",\n null\n \n)\n\nexport default component.exports","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call -- required for testing\n method.call(null, argument || function () { return 1; }, 1);\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./role.vue?vue&type=style&index=0&id=0d11735a&prod&lang=less&scoped=true\""],"sourceRoot":""} -------------------------------------------------------------------------------- /html/js/chunk-1ccde611.2d0f64ff.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-1ccde611"],{"0cab":function(e,t,a){},b5e4:function(e,t,a){"use strict";a("0cab")},c91e:function(e,t,a){"use strict";a.r(t);var r=function(){var e=this,t=e._self._c;return t("div",{staticClass:"content"},[t("el-container",{staticStyle:{height:"89vh","overflow-y":"auto"}},[t("el-main",[t("el-form",{staticClass:"el-form",attrs:{inline:!0}},[t("el-form-item",[t("el-input",{staticClass:"input-with-select",attrs:{placeholder:"帐号",clearable:""},on:{clear:e.loadData},model:{value:e.formSearch.Name,callback:function(t){e.$set(e.formSearch,"Name",t)},expression:"formSearch.Name"}},[t("el-button",{attrs:{slot:"append",icon:"el-icon-search"},on:{click:function(t){return e.loadData()}},slot:"append"})],1)],1),t("el-form-item",[t("el-button",{attrs:{type:"primary",icon:"el-icon-plus"},on:{click:function(t){return e.addUser()}}},[e._v("创建管理员")])],1)],1),t("el-table",{ref:"filterTable",staticStyle:{width:"100%","margin-bottom":"20px"},attrs:{data:e.tableData,border:""}},[t("el-table-column",{attrs:{prop:"Name",align:"center","show-overflow-tooltip":!0,label:"姓名","min-width":"100"}}),t("el-table-column",{attrs:{prop:"Mobile",align:"center","show-overflow-tooltip":!0,label:"账号","min-width":"100"}}),t("el-table-column",{attrs:{prop:"RoleID",align:"center",label:"角色",formatter:e.classFormatter}}),t("el-table-column",{attrs:{prop:"CreatedAt",align:"center",label:"创建时间","min-width":"100"}}),t("el-table-column",{staticClass:"handDo",attrs:{prop:"name",align:"center","min-width":"160",fixed:"right"},scopedSlots:e._u([{key:"default",fn:function(a){return[t("el-button",{attrs:{type:"primary",size:"mini"},on:{click:function(t){return e.editUser(a.row)}}},[e._v("编辑")]),t("el-button",{staticClass:"dangerColor",attrs:{size:"mini",type:"danger"},on:{click:function(t){return t.stopPropagation(),e.delPage(a.row.ID)}}},[e._v("删除")])]}}])})],1),t("el-pagination",{staticStyle:{margin:"10px 0","text-align":"right"},attrs:{"hide-on-single-page":!1,"current-page":e.page.page,"page-sizes":[10,50,200,500],"page-size":e.page.Limit,layout:"total, prev, pager, next, jumper",total:e.page.totle},on:{"size-change":e.handleSizeChange,"current-change":e.handleCurrentChange}})],1)],1),t("el-dialog",{staticClass:"admin-model",attrs:{visible:e.showAddUser,width:"800px"},on:{"update:visible":function(t){e.showAddUser=t},close:e.resetVerForm}},[t("el-form",{ref:"addUserForm",staticClass:"demo-ruleForm",attrs:{model:e.addUserForm,"status-icon":"",rules:e.rules,"label-width":"90px"}},[t("el-form-item",{attrs:{label:"账号",prop:"Mobile"}},[t("el-input",{attrs:{disabled:0!=e.addUserForm.ID},model:{value:e.addUserForm.Mobile,callback:function(t){e.$set(e.addUserForm,"Mobile",t)},expression:"addUserForm.Mobile"}})],1),t("el-form-item",{attrs:{label:"姓名",prop:"Name"}},[t("el-input",{model:{value:e.addUserForm.Name,callback:function(t){e.$set(e.addUserForm,"Name",t)},expression:"addUserForm.Name"}})],1),t("el-form-item",{attrs:{label:"角色",prop:"RoleID"}},[t("el-select",{staticStyle:{width:"100%"},on:{change:e.selectClassify},model:{value:e.addUserForm.RoleID,callback:function(t){e.$set(e.addUserForm,"RoleID",t)},expression:"addUserForm.RoleID"}},e._l(e.roleLists,(function(e,a){return t("el-option",{key:a,attrs:{label:e.Name,value:e.ID}})})),1)],1),0==e.addUserForm.ID?t("el-form-item",{attrs:{label:"密码",prop:"Password"}},[t("el-input",{attrs:{placeholder:"密码必须包含大小写字母和数字,字符8-20位之间"},model:{value:e.addUserForm.Password,callback:function(t){e.$set(e.addUserForm,"Password",t)},expression:"addUserForm.Password"}})],1):t("el-form-item",{attrs:{label:"密码",prop:"PasswordEdit"}},[t("el-input",{model:{value:e.addUserForm.PasswordEdit,callback:function(t){e.$set(e.addUserForm,"PasswordEdit",t)},expression:"addUserForm.PasswordEdit"}})],1)],1),t("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[t("el-button",{on:{click:function(t){return e.resetVerForm()}}},[e._v("取 消")]),t("el-button",{attrs:{type:"primary"},on:{click:function(t){return e.commitAddUser()}}},[e._v("确 定")])],1)],1)],1)},s=[],o={name:"systemAdmin",data:function(){return{tableData:[],page:{page:1,Limit:20,totle:0},showAddUser:!1,addUserForm:{ID:0,Mobile:"",Password:"",PasswordEdit:"",Name:"",RoleID:"",OrganizationId:1},roleLists:[],siteLists:[],rules:{Mobile:[{required:!0,message:"请输入账号",trigger:"change"}],Name:[{required:!0,message:"请输入姓名",trigger:"change"}],RoleID:[{required:!0,message:"请选择角色",trigger:"change"}],Password:[{required:!0,message:"请输入密码",trigger:"change"},{pattern:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,20}$/,message:"密码必须包含大小写字母和数字,字符8-20位之间",trigger:"blur"}],PasswordEdit:[{pattern:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,20}$/,message:"密码必须包含大小写字母和数字,字符8-20位之间",trigger:"blur"}]},formSearch:{id:"",Name:""},passwordInputType:"",sortType:"",isAddBtn:!0}},mounted:function(){this.isAddBtn=!0,this.getRoleList(),this.loadData()},methods:{clickTree:function(e){this.formSearch.id=e.ID,this.formSearch.Name="",this.page.page=1,this.isAddBtn=!1,this.resetVerForm(),this.addUserForm.OrganizationId=e.ID,this.loadData()},handleSizeChange:function(e){this.page.Limit=e,this.loadData()},handleCurrentChange:function(e){this.page.page=e,this.loadData()},loadData:function(){var e=this,t={Page:this.page.page,Limit:this.page.Limit,id:this.formSearch.id,Name:this.formSearch.Name};this.apiSever.get("".concat(this.URl.ADMIN_LIST+"?Page="+t.Page+"&Limit="+t.Limit+"&Name="+t.Name+"&OrganizationId="+t.id),(function(t){console.log(t.data.list),e.page.totle=t.data.count,e.tableData=t.data.list}))},getRoleList:function(){var e=this;this.apiSever.get("".concat(this.URl.ROLE_LIST+"?Page=1&Limit=100000"),(function(t){e.roleLists=t.data.list}))},classFormatter:function(e,t,a){for(var r=0;r\n
\n \n \n \n \n \n \n \n \n \n 创建管理员\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 取 消\n 确 定\n \n \n
\n\n\n \n ","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./system_admin.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./system_admin.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./system_admin.vue?vue&type=template&id=6ede1650&scoped=true\"\nimport script from \"./system_admin.vue?vue&type=script&lang=js\"\nexport * from \"./system_admin.vue?vue&type=script&lang=js\"\nimport style0 from \"./system_admin.vue?vue&type=style&index=0&id=6ede1650&prod&lang=less&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6ede1650\",\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""} -------------------------------------------------------------------------------- /html/js/chunk-1fd08d72.70b91bbd.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-1fd08d72"],{"1ca0":function(t,e,i){"use strict";i("992c")},7101:function(t,e,i){"use strict";i.r(e);var o=function(){var t=this,e=t._self._c;return e("div",{staticClass:"login-container"},[e("div",{staticClass:"login_cont"},[e("h3",{staticClass:"login_title"},[t._v("auth-gateway 权限管理平台")]),e("el-card",{staticClass:"box-card"},[e("div",{staticClass:"box-top"},[t._v("登 录")]),e("el-form",{ref:"ruleForm",staticClass:"demo-ruleForm",attrs:{model:t.loginForm,rules:t.rules},nativeOn:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.submitForm("ruleForm")}}},[e("el-form-item",{attrs:{label:"",prop:"Mobile"}},[e("el-input",{staticClass:"loin_item",attrs:{placeholder:"用户名","prefix-icon":"el-icon-user",type:"text",autocomplete:"off"},model:{value:t.loginForm.Mobile,callback:function(e){t.$set(t.loginForm,"Mobile",e)},expression:"loginForm.Mobile"}})],1),e("el-form-item",{attrs:{label:"",prop:"Password"}},[e("el-input",{staticClass:"loin_item",attrs:{placeholder:"密码","prefix-icon":"el-icon-lock","show-password":"",autocomplete:"off"},model:{value:t.loginForm.Password,callback:function(e){t.$set(t.loginForm,"Password",e)},expression:"loginForm.Password"}})],1),e("el-form-item",{attrs:{label:"",prop:"Digits"}},[e("el-input",{ref:"Digits",staticClass:"loin_item",attrs:{placeholder:"验证码","prefix-icon":"el-icon-picture-outline",autocomplete:"off"},model:{value:t.loginForm.Digits,callback:function(e){t.$set(t.loginForm,"Digits",e)},expression:"loginForm.Digits"}},[e("template",{slot:"append"},[e("div",{staticClass:"img_cont",on:{click:t.getcook}},[e("img",{directives:[{name:"show",rawName:"v-show",value:t.isshowimg,expression:"isshowimg"}],attrs:{src:t.imgcode_url,alt:"点击刷新",title:"点击刷新"},on:{load:t.imgload,error:t.imgerror}}),t.isshowimg?t._e():e("div",{staticStyle:{"line-height":"33px"}},[t._v("点击刷新")])])])],2)],1),e("el-form-item",[e("el-button",{staticClass:"loin_itembtn",attrs:{type:"primary",loading:t.loading},on:{click:function(e){return t.submitForm("ruleForm")}}},[t._v("立即登录")])],1)],1)],1)],1)])},r=[],n=(i("14d9"),i("e9c4"),{name:"Login",data:function(){return{loginForm:{Mobile:"",Password:"",Digits:"",CaptchaId:""},imgcode_url:"",isshowimg:!1,loading:!1,rules:{Mobile:[{required:!0,trigger:"blur",message:"请输入用户名"}],Password:[{required:!0,trigger:"blur",message:"请输入密码"}],Digits:[{required:!0,trigger:"blur",message:"请输入验证码"}]}}},created:function(){this.getcook()},mounted:function(){},methods:{imgload:function(){this.isshowimg=!0},imgerror:function(){this.isshowimg=!1},changeImgCode:function(){this.$set(this.loginForm,"Digits",""),this.imgcode_url="/admin/Captcha?captchaId="+this.CaptchaId+"&t="+String((new Date).getTime())},submitForm:function(t){var e=this;this.$refs[t].validate((function(t){if(!t)return console.log("error submit!!"),!1;e.loading=!0,e.apiSever.post(e.URl.LOGIN,e.loginForm,(function(t){200==t.status?(e.$message.success("登录成功!"),e.$cookies.set("mytoken",t.data.Token,"1d"),e.$router.push({path:"/"}),localStorage.setItem("user_name",t.data.Name),localStorage.setItem("user_mobile",t.data.Mobile),localStorage.setItem("role_ids",JSON.stringify(t.data.ID)),e.$store.commit("setuser",{name:t.data.Name,mobile:t.data.Mobile,role_ids:t.data.ID})):e.loading=!1}),(function(t){e.loading=!1}))}))},getcook:function(){var t=this;this.apiSever.get("".concat(this.URl.ADMIN_CHECK_CODE),(function(e){t.CaptchaId=e.data,t.loginForm.CaptchaId=e.data,t.changeImgCode()}))}}}),a=n,s=(i("1ca0"),i("2877")),l=Object(s["a"])(a,o,r,!1,null,"fb8652be",null);e["default"]=l.exports},"992c":function(t,e,i){},e267:function(t,e,i){"use strict";var o=i("e330"),r=i("e8b5"),n=i("1626"),a=i("c6b6"),s=i("577e"),l=o([].push);t.exports=function(t){if(n(t))return t;if(r(t)){for(var e=t.length,i=[],o=0;o\r\n
\r\n
\r\n

auth-gateway 权限管理平台

\r\n \r\n
登 录
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 立即登录\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Login.vue?vue&type=template&id=fb8652be&scoped=true\"\nimport script from \"./Login.vue?vue&type=script&lang=js\"\nexport * from \"./Login.vue?vue&type=script&lang=js\"\nimport style0 from \"./Login.vue?vue&type=style&index=0&id=fb8652be&prod&lang=less&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"fb8652be\",\n null\n \n)\n\nexport default component.exports","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isArray = require('../internals/is-array');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof-raw');\nvar toString = require('../internals/to-string');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (replacer) {\n if (isCallable(replacer)) return replacer;\n if (!isArray(replacer)) return;\n var rawLength = replacer.length;\n var keys = [];\n for (var i = 0; i < rawLength; i++) {\n var element = replacer[i];\n if (typeof element == 'string') push(keys, element);\n else if (typeof element == 'number' || classof(element) === 'Number' || classof(element) === 'String') push(keys, toString(element));\n }\n var keysLength = keys.length;\n var root = true;\n return function (key, value) {\n if (root) {\n root = false;\n return value;\n }\n if (isArray(this)) return value;\n for (var j = 0; j < keysLength; j++) if (keys[j] === key) return value;\n };\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar apply = require('../internals/function-apply');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isSymbol = require('../internals/is-symbol');\nvar arraySlice = require('../internals/array-slice');\nvar getReplacerFunction = require('../internals/get-json-replacer-function');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nvar $String = String;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar exec = uncurryThis(/./.exec);\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar replace = uncurryThis(''.replace);\nvar numberToString = uncurryThis(1.0.toString);\n\nvar tester = /[\\uD800-\\uDFFF]/g;\nvar low = /^[\\uD800-\\uDBFF]$/;\nvar hi = /^[\\uDC00-\\uDFFF]$/;\n\nvar WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () {\n var symbol = getBuiltIn('Symbol')('stringify detection');\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) !== '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) !== '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) !== '{}';\n});\n\n// https://github.com/tc39/proposal-well-formed-stringify\nvar ILL_FORMED_UNICODE = fails(function () {\n return $stringify('\\uDF06\\uD834') !== '\"\\\\udf06\\\\ud834\"'\n || $stringify('\\uDEAD') !== '\"\\\\udead\"';\n});\n\nvar stringifyWithSymbolsFix = function (it, replacer) {\n var args = arraySlice(arguments);\n var $replacer = getReplacerFunction(replacer);\n if (!isCallable($replacer) && (it === undefined || isSymbol(it))) return; // IE8 returns string on undefined\n args[1] = function (key, value) {\n // some old implementations (like WebKit) could pass numbers as keys\n if (isCallable($replacer)) value = call($replacer, this, $String(key), value);\n if (!isSymbol(value)) return value;\n };\n return apply($stringify, null, args);\n};\n\nvar fixIllFormed = function (match, offset, string) {\n var prev = charAt(string, offset - 1);\n var next = charAt(string, offset + 1);\n if ((exec(low, match) && !exec(hi, next)) || (exec(hi, match) && !exec(low, prev))) {\n return '\\\\u' + numberToString(charCodeAt(match, 0), 16);\n } return match;\n};\n\nif ($stringify) {\n // `JSON.stringify` method\n // https://tc39.es/ecma262/#sec-json.stringify\n $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n stringify: function stringify(it, replacer, space) {\n var args = arraySlice(arguments);\n var result = apply(WRONG_SYMBOLS_CONVERSION ? stringifyWithSymbolsFix : $stringify, null, args);\n return ILL_FORMED_UNICODE && typeof result == 'string' ? replace(result, tester, fixIllFormed) : result;\n }\n });\n}\n"],"sourceRoot":""} -------------------------------------------------------------------------------- /html/js/chunk-2e82ed00.f3d1308c.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2e82ed00"],{"0a1c":function(t,e,a){"use strict";a.r(e);var n=function(){var t=this,e=t._self._c;return e("div",{staticClass:"content"},[e("el-table",{ref:"filterTable",staticStyle:{width:"100%","margin-bottom":"20px"},attrs:{data:t.tableData,border:""}},[e("el-table-column",{attrs:{prop:"AdminName",align:"center","show-overflow-tooltip":!0,label:"操作人"}}),e("el-table-column",{attrs:{prop:"ApiPath",align:"center","show-overflow-tooltip":!0,label:"操作接口"}}),e("el-table-column",{attrs:{prop:"Ip",align:"center",label:"IP"}}),e("el-table-column",{attrs:{prop:"CreatedAt",align:"center",label:"时间"}})],1),e("el-pagination",{staticStyle:{"text-align":"right","margin-top":"20px"},attrs:{layout:"total, prev, pager, next, jumper",total:t.page.totle,"page-size":t.page.Limit,"current-page":t.page.page},on:{"update:currentPage":function(e){return t.$set(t.page,"page",e)},"update:current-page":function(e){return t.$set(t.page,"page",e)},"current-change":t.handleCurrentPage}})],1)},i=[],l={name:"recordList",data:function(){return{tableData:[],page:{page:1,Limit:20,totle:0}}},mounted:function(){this.loadData()},methods:{loadData:function(){var t=this,e={Page:this.page.page,Limit:this.page.Limit};this.apiSever.get("".concat(this.URl.RECORD_LIST+"?Page="+e.Page+"&Limit="+e.Limit),(function(e){t.tableData=e.data.list,t.page.totle=e.data.count}))},handleCurrentPage:function(t){this.page.page=t,this.loadData()}}},r=l,o=(a("4699"),a("2877")),p=Object(o["a"])(r,n,i,!1,null,"6a0408ac",null);e["default"]=p.exports},4699:function(t,e,a){"use strict";a("e2b1")},e2b1:function(t,e,a){}}]); 2 | //# sourceMappingURL=chunk-2e82ed00.f3d1308c.js.map -------------------------------------------------------------------------------- /html/js/chunk-2e82ed00.f3d1308c.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/views/limit/recordList.vue","webpack:///src/views/limit/recordList.vue","webpack:///./src/views/limit/recordList.vue?621a","webpack:///./src/views/limit/recordList.vue?7060","webpack:///./src/views/limit/recordList.vue?1d8d"],"names":["render","_vm","this","_c","_self","staticClass","ref","staticStyle","attrs","tableData","page","totle","Limit","on","$event","$set","handleCurrentPage","staticRenderFns","name","data","mounted","loadData","methods","_this","params","Page","apiSever","get","concat","URl","RECORD_LIST","list","count","val","component"],"mappings":"yHAAA,IAAIA,EAAS,WAAkB,IAAIC,EAAIC,KAAKC,EAAGF,EAAIG,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACE,YAAY,WAAW,CAACF,EAAG,WAAW,CAACG,IAAI,cAAcC,YAAY,CAAC,MAAQ,OAAO,gBAAgB,QAAQC,MAAM,CAAC,KAAOP,EAAIQ,UAAU,OAAS,KAAK,CAACN,EAAG,kBAAkB,CAACK,MAAM,CAAC,KAAO,YAAY,MAAQ,SAAS,yBAAwB,EAAK,MAAQ,SAASL,EAAG,kBAAkB,CAACK,MAAM,CAAC,KAAO,UAAU,MAAQ,SAAS,yBAAwB,EAAK,MAAQ,UAAUL,EAAG,kBAAkB,CAACK,MAAM,CAAC,KAAO,KAAK,MAAQ,SAAS,MAAQ,QAAQL,EAAG,kBAAkB,CAACK,MAAM,CAAC,KAAO,YAAY,MAAQ,SAAS,MAAQ,SAAS,GAAGL,EAAG,gBAAgB,CAACI,YAAY,CAAC,aAAa,QAAQ,aAAa,QAAQC,MAAM,CAAC,OAAS,mCAAmC,MAAQP,EAAIS,KAAKC,MAAM,YAAYV,EAAIS,KAAKE,MAAM,eAAeX,EAAIS,KAAKA,MAAMG,GAAG,CAAC,qBAAqB,SAASC,GAAQ,OAAOb,EAAIc,KAAKd,EAAIS,KAAM,OAAQI,IAAS,sBAAsB,SAASA,GAAQ,OAAOb,EAAIc,KAAKd,EAAIS,KAAM,OAAQI,IAAS,iBAAiBb,EAAIe,sBAAsB,IAE7/BC,EAAkB,GC4BP,GACfC,KAAA,aACAC,KAAA,WACA,OACAV,UAAA,GACAC,KAAA,CACAA,KAAA,EACAE,MAAA,GACAD,MAAA,KAIAS,QAAA,WACA,KAAAC,YAEAC,QAAA,CAEAD,SAAA,eAAAE,EAAA,KACAC,EAAA,CACAC,KAAA,KAAAf,UACAE,MAAA,KAAAF,KAAAE,OAEA,KAAAc,SAAAC,IAAA,GAAAC,OAAA,KAAAC,IAAAC,YAAA,SAAAN,EAAAC,KAAA,UAAAD,EAAAZ,QAAA,SAAAO,GACAI,EAAAd,UAAAU,OAAAY,KACAR,EAAAb,KAAAC,MAAAQ,OAAAa,UAIAhB,kBAAA,SAAAiB,GACA,KAAAvB,UAAAuB,EACA,KAAAZ,cC5DkW,I,wBCQ9Va,EAAY,eACd,EACAlC,EACAiB,GACA,EACA,KACA,WACA,MAIa,aAAAiB,E,2CCnBf,W","file":"js/chunk-2e82ed00.f3d1308c.js","sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"content\"},[_c('el-table',{ref:\"filterTable\",staticStyle:{\"width\":\"100%\",\"margin-bottom\":\"20px\"},attrs:{\"data\":_vm.tableData,\"border\":\"\"}},[_c('el-table-column',{attrs:{\"prop\":\"AdminName\",\"align\":\"center\",\"show-overflow-tooltip\":true,\"label\":\"操作人\"}}),_c('el-table-column',{attrs:{\"prop\":\"ApiPath\",\"align\":\"center\",\"show-overflow-tooltip\":true,\"label\":\"操作接口\"}}),_c('el-table-column',{attrs:{\"prop\":\"Ip\",\"align\":\"center\",\"label\":\"IP\"}}),_c('el-table-column',{attrs:{\"prop\":\"CreatedAt\",\"align\":\"center\",\"label\":\"时间\"}})],1),_c('el-pagination',{staticStyle:{\"text-align\":\"right\",\"margin-top\":\"20px\"},attrs:{\"layout\":\"total, prev, pager, next, jumper\",\"total\":_vm.page.totle,\"page-size\":_vm.page.Limit,\"current-page\":_vm.page.page},on:{\"update:currentPage\":function($event){return _vm.$set(_vm.page, \"page\", $event)},\"update:current-page\":function($event){return _vm.$set(_vm.page, \"page\", $event)},\"current-change\":_vm.handleCurrentPage}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recordList.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recordList.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./recordList.vue?vue&type=template&id=6a0408ac&scoped=true\"\nimport script from \"./recordList.vue?vue&type=script&lang=js\"\nexport * from \"./recordList.vue?vue&type=script&lang=js\"\nimport style0 from \"./recordList.vue?vue&type=style&index=0&id=6a0408ac&prod&lang=less&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6a0408ac\",\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recordList.vue?vue&type=style&index=0&id=6a0408ac&prod&lang=less&scoped=true\""],"sourceRoot":""} -------------------------------------------------------------------------------- /html/js/chunk-4243275a.a45fd2e0.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-4243275a"],{"1c62":function(t,a,e){"use strict";e.r(a);var n=function(){var t=this;t._self._c;return t._m(0)},i=[function(){var t=this,a=t._self._c;return a("div",{staticClass:"juzhong"},[a("h1",[t._v("欢迎 hello auto-gateway")])])}],s={data:function(){return{infoData:{},ThisActivityMap:"",ThisTrainMap:"",tableLabel:{Name:"人数",Count:"次数"},echartData:{order:{xData:[],series:[]},mall:{series:[]},prod:{xData:[],series:[]}}}},created:function(){},methods:{}},r=s,c=(e("e336"),e("2877")),o=Object(c["a"])(r,n,i,!1,null,"0960e3e9",null);a["default"]=o.exports},"51a5":function(t,a,e){},e336:function(t,a,e){"use strict";e("51a5")}}]); 2 | //# sourceMappingURL=chunk-4243275a.a45fd2e0.js.map -------------------------------------------------------------------------------- /html/js/chunk-4243275a.a45fd2e0.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/views/Home/Home.vue","webpack:///src/views/Home/Home.vue","webpack:///./src/views/Home/Home.vue?d50f","webpack:///./src/views/Home/Home.vue?d7af","webpack:///./src/views/Home/Home.vue?b1b1"],"names":["render","_vm","this","_self","_c","_m","staticRenderFns","staticClass","_v","data","infoData","ThisActivityMap","ThisTrainMap","tableLabel","Name","Count","echartData","order","xData","series","mall","prod","created","methods","component"],"mappings":"yHAAA,IAAIA,EAAS,WAAkB,IAAIC,EAAIC,KAAQD,EAAIE,MAAMC,GAAG,OAAOH,EAAII,GAAG,IAEtEC,EAAkB,CAAC,WAAY,IAAIL,EAAIC,KAAKE,EAAGH,EAAIE,MAAMC,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,WAAW,CAACH,EAAG,KAAK,CAACH,EAAIO,GAAG,+BCKzH,GACAC,KAAA,WACA,OACAC,SAAA,GACAC,gBAAA,GACAC,aAAA,GACAC,WAAA,CACAC,KAAA,KACAC,MAAA,MAEAC,WAAA,CACAC,MAAA,CACAC,MAAA,GACAC,OAAA,IAEAC,KAAA,CACAD,OAAA,IAEAE,KAAA,CACAH,MAAA,GACAC,OAAA,OAKAG,QAAA,aAEAC,QAAA,IClC4V,I,wBCQxVC,EAAY,eACd,EACAxB,EACAM,GACA,EACA,KACA,WACA,MAIa,aAAAkB,E,oECnBf","file":"js/chunk-4243275a.a45fd2e0.js","sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c;return _vm._m(0)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"juzhong\"},[_c('h1',[_vm._v(\"欢迎 hello auto-gateway\")])])\n}]\n\nexport { render, staticRenderFns }","\r\n \r\n\r\n \r\n\r\n ","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=0960e3e9&scoped=true\"\nimport script from \"./Home.vue?vue&type=script&lang=js\"\nexport * from \"./Home.vue?vue&type=script&lang=js\"\nimport style0 from \"./Home.vue?vue&type=style&index=0&id=0960e3e9&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0960e3e9\",\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=0&id=0960e3e9&prod&lang=scss&scoped=true\""],"sourceRoot":""} -------------------------------------------------------------------------------- /html/js/chunk-5b4bb6bc.de683ac9.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-5b4bb6bc"],{"09e2":function(t,s,a){"use strict";a.r(s);var i=function(){var t=this,s=t._self._c;return s("div",{staticClass:"cont"},[s("div",{staticClass:"wscn-http404-container"},[s("div",{staticClass:"wscn-http404"},[t._m(0),s("div",{staticClass:"bullshit"},[s("div",{staticClass:"bullshit__oops"},[t._v("OOPS!")]),s("div",{staticClass:"bullshit__headline",staticStyle:{color:"#ffffff"}},[t._v(t._s(t.message))]),s("div",{staticClass:"bullshit__info"},[t._v("Please check that the URL you entered is correct, or click the button below to return to the homepage.")]),s("a",{staticClass:"bullshit__return-home",attrs:{href:""}},[t._v("Back to home")])])])])])},c=[function(){var t=this,s=t._self._c;return s("div",{staticClass:"pic-404"},[s("img",{staticClass:"pic-404__parent",attrs:{src:a("3dfc"),alt:"404"}}),s("img",{staticClass:"pic-404__child left",attrs:{src:a("a190"),alt:"404"}}),s("img",{staticClass:"pic-404__child mid",attrs:{src:a("a190"),alt:"404"}}),s("img",{staticClass:"pic-404__child right",attrs:{src:a("a190"),alt:"404"}})])}],e={name:"Page404",computed:{message:function(){return"The webmaster said that you can not enter this page..."}}},l=e,n=(a("6873"),a("2877")),r=Object(n["a"])(l,i,c,!1,null,"367ea050",null);s["default"]=r.exports},"3dfc":function(t,s,a){t.exports=a.p+"img/404.a57b6f31.png"},6873:function(t,s,a){"use strict";a("c6ef")},a190:function(t,s,a){t.exports=a.p+"img/404_cloud.0f4bc32b.png"},c6ef:function(t,s,a){}}]); 2 | //# sourceMappingURL=chunk-5b4bb6bc.de683ac9.js.map -------------------------------------------------------------------------------- /html/js/chunk-5b4bb6bc.de683ac9.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/views/Login/Notfound.vue","webpack:///src/views/Login/Notfound.vue","webpack:///./src/views/Login/Notfound.vue?966e","webpack:///./src/views/Login/Notfound.vue?cffb","webpack:///./src/assets/images/404.png","webpack:///./src/views/Login/Notfound.vue?a87b","webpack:///./src/assets/images/404_cloud.png"],"names":["render","_vm","this","_c","_self","staticClass","_m","_v","staticStyle","_s","message","attrs","staticRenderFns","require","name","computed","component","module","exports"],"mappings":"yHAAA,IAAIA,EAAS,WAAkB,IAAIC,EAAIC,KAAKC,EAAGF,EAAIG,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACE,YAAY,QAAQ,CAACF,EAAG,MAAM,CAACE,YAAY,0BAA0B,CAACF,EAAG,MAAM,CAACE,YAAY,gBAAgB,CAACJ,EAAIK,GAAG,GAAGH,EAAG,MAAM,CAACE,YAAY,YAAY,CAACF,EAAG,MAAM,CAACE,YAAY,kBAAkB,CAACJ,EAAIM,GAAG,WAAWJ,EAAG,MAAM,CAACE,YAAY,qBAAqBG,YAAY,CAAC,MAAQ,YAAY,CAACP,EAAIM,GAAGN,EAAIQ,GAAGR,EAAIS,YAAYP,EAAG,MAAM,CAACE,YAAY,kBAAkB,CAACJ,EAAIM,GAAG,4GAA4GJ,EAAG,IAAI,CAACE,YAAY,wBAAwBM,MAAM,CAAC,KAAO,KAAK,CAACV,EAAIM,GAAG,2BAE5mBK,EAAkB,CAAC,WAAY,IAAIX,EAAIC,KAAKC,EAAGF,EAAIG,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACE,YAAY,WAAW,CAACF,EAAG,MAAM,CAACE,YAAY,kBAAkBM,MAAM,CAAC,IAAME,EAAQ,QAA2B,IAAM,SAASV,EAAG,MAAM,CAACE,YAAY,sBAAsBM,MAAM,CAAC,IAAME,EAAQ,QAAiC,IAAM,SAASV,EAAG,MAAM,CAACE,YAAY,qBAAqBM,MAAM,CAAC,IAAME,EAAQ,QAAiC,IAAM,SAASV,EAAG,MAAM,CAACE,YAAY,uBAAuBM,MAAM,CAAC,IAAME,EAAQ,QAAiC,IAAM,aCoB3gB,GACfC,KAAA,UACAC,SAAA,CACAL,QAAA,WACA,kEC1BgW,I,wBCQ5VM,EAAY,eACd,EACAhB,EACAY,GACA,EACA,KACA,WACA,MAIa,aAAAI,E,gCCnBfC,EAAOC,QAAU,IAA0B,wB,kCCA3C,W,qBCAAD,EAAOC,QAAU,IAA0B,8B","file":"js/chunk-5b4bb6bc.de683ac9.js","sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cont\"},[_c('div',{staticClass:\"wscn-http404-container\"},[_c('div',{staticClass:\"wscn-http404\"},[_vm._m(0),_c('div',{staticClass:\"bullshit\"},[_c('div',{staticClass:\"bullshit__oops\"},[_vm._v(\"OOPS!\")]),_c('div',{staticClass:\"bullshit__headline\",staticStyle:{\"color\":\"#ffffff\"}},[_vm._v(_vm._s(_vm.message))]),_c('div',{staticClass:\"bullshit__info\"},[_vm._v(\"Please check that the URL you entered is correct, or click the button below to return to the homepage.\")]),_c('a',{staticClass:\"bullshit__return-home\",attrs:{\"href\":\"\"}},[_vm._v(\"Back to home\")])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"pic-404\"},[_c('img',{staticClass:\"pic-404__parent\",attrs:{\"src\":require(\"@/assets/images/404.png\"),\"alt\":\"404\"}}),_c('img',{staticClass:\"pic-404__child left\",attrs:{\"src\":require(\"@/assets/images/404_cloud.png\"),\"alt\":\"404\"}}),_c('img',{staticClass:\"pic-404__child mid\",attrs:{\"src\":require(\"@/assets/images/404_cloud.png\"),\"alt\":\"404\"}}),_c('img',{staticClass:\"pic-404__child right\",attrs:{\"src\":require(\"@/assets/images/404_cloud.png\"),\"alt\":\"404\"}})])\n}]\n\nexport { render, staticRenderFns }","\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Notfound.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Notfound.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Notfound.vue?vue&type=template&id=367ea050&scoped=true\"\nimport script from \"./Notfound.vue?vue&type=script&lang=js\"\nexport * from \"./Notfound.vue?vue&type=script&lang=js\"\nimport style0 from \"./Notfound.vue?vue&type=style&index=0&id=367ea050&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"367ea050\",\n null\n \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/404.a57b6f31.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Notfound.vue?vue&type=style&index=0&id=367ea050&prod&lang=scss&scoped=true\"","module.exports = __webpack_public_path__ + \"img/404_cloud.0f4bc32b.png\";"],"sourceRoot":""} -------------------------------------------------------------------------------- /html/js2_favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/html/js2_favicon.ico -------------------------------------------------------------------------------- /image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/image-1.png -------------------------------------------------------------------------------- /image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lluck42/auth-gateway/a07b9bc09adc9740d7e2be500c508a9b24d37a67/image.png -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "auth-gateway/middleware" 6 | "auth-gateway/route" 7 | "fmt" 8 | "net/http/httputil" 9 | "net/url" 10 | 11 | "github.com/gin-gonic/gin" 12 | ) 13 | 14 | func init() { 15 | // 配置项初始化 16 | bean.ConfigInit() 17 | // 日志初始化 18 | bean.LogInit() 19 | // mysql 初始化 20 | bean.MysqlInit() 21 | } 22 | 23 | func main() { 24 | 25 | gin.SetMode(bean.Config.App.SetMode) 26 | gin.DisableConsoleColor() 27 | // 记录到指定文件 28 | // if f, err := os.OpenFile("access.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err != nil { 29 | // panic("创建 access.log 失败")1 30 | // } else { 31 | // gin.DefaultWriter = f 32 | // } 33 | 34 | router := gin.Default() 35 | router.TrustedPlatform = "X-Real-Ip" // 用于获取 nginx 设置的 X-Real-Ip(real client ip) 36 | 37 | router.MaxMultipartMemory = 200 << 20 // 上传文件大小限制 200 MiB 38 | 39 | // 静态文件服务 40 | router.Static("/html", "html") // 服务静态文件 相对路径为 项目启动时 用户所在目录 41 | 42 | // 管理端路由 43 | route.Admin(router) 44 | // 反向代理 后端的服务 45 | router.NoRoute(middleware.Record, middleware.Login, middleware.Permission, func(c *gin.Context) { 46 | fmt.Println("router.NoRoute") 47 | fmt.Println(c.Request.URL.Path) 48 | proxy := httputil.NewSingleHostReverseProxy(&url.URL{ 49 | Scheme: bean.Config.ReverseProxy.Scheme, 50 | Host: bean.Config.ReverseProxy.Host, 51 | }) 52 | 53 | proxy.ServeHTTP(c.Writer, c.Request) 54 | }) 55 | 56 | fmt.Println("请打开网关管理页面进行配置:http:" + bean.Config.App.Addr + "/html") 57 | 58 | router.Run(bean.Config.App.Addr) // listen and serve on 0.0.0.0:8080 59 | } 60 | -------------------------------------------------------------------------------- /main_test.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "fmt" 6 | "testing" 7 | "time" 8 | ) 9 | 10 | func init() { 11 | // 配置项初始化 12 | bean.ConfigInit() 13 | // 日志初始化 14 | bean.LogInit() 15 | // mysql 初始化 16 | bean.MysqlInit() 17 | //11 18 | } 19 | 20 | func TestA(t *testing.T) { 21 | //1 22 | var start_time = "" 23 | StartTime, err := time.ParseInLocation(time.DateTime, start_time, time.Local) 24 | if err != err { 25 | var err = fmt.Sprintf("时间解析失败:%s", start_time) 26 | fmt.Println(err) 27 | return 28 | } 29 | // 30 | 31 | dieline := StartTime.Add(time.Minute * 30).Format(time.DateTime) 32 | 33 | fmt.Println(StartTime) 34 | fmt.Println(dieline) 35 | } 36 | 37 | func TestTest(t *testing.T) { 38 | 39 | // var rq weixin.URLLinkReq 40 | 41 | // rq.Path = "pages/index/index" 42 | // rq.Query = "aa=bb" 43 | // rq.EnvVersion = "trial" 44 | 45 | // var _, err = rq.URLLinkGet() 46 | // if err != nil { 47 | // fmt.Printf("+%v", err) 48 | // } 49 | } 50 | -------------------------------------------------------------------------------- /middleware/login.go: -------------------------------------------------------------------------------- 1 | package middleware 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "auth-gateway/model/admin" 6 | "strconv" 7 | 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | func Login(c *gin.Context) { 12 | var token = c.GetHeader("authorization") 13 | 14 | if len(token) < 7 { 15 | bean.Log.Error("token 错误l1") 16 | c.String(401, "token 错误l1") 17 | c.Abort() 18 | return 19 | } 20 | 21 | token = token[7:] 22 | 23 | var one admin.Admin 24 | if err := bean.MysqlDb.Where("token=?", token).First(&one).Error; err != nil { 25 | bean.Log.Error(err) 26 | c.String(401, "token 错误l2") 27 | c.Abort() 28 | return 29 | } 30 | 31 | c.Set("admin", one) 32 | 33 | c.Request.Header.Add("auth-gateway-adminID", strconv.Itoa(int(one.ID))) 34 | } 35 | -------------------------------------------------------------------------------- /middleware/permission.go: -------------------------------------------------------------------------------- 1 | package middleware 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "auth-gateway/model/admin" 6 | "fmt" 7 | 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | func Permission(c *gin.Context) { 12 | fmt.Println("Permission") 13 | // 获取登录用户对象 14 | var adm admin.Admin 15 | if err := adm.Get(c); err != nil { 16 | bean.Log.Error(c.Request.URL.Path) 17 | bean.Log.Error(err) 18 | 19 | c.String(403, err.Error()+c.Request.URL.Path) 20 | c.Abort() 21 | return 22 | } 23 | 24 | fmt.Println("c.Request.URL.Path", c.Request.URL.Path) 25 | var role admin.AdminRole 26 | if err := bean.MysqlDb.Where("`id`=?", adm.RoleID).Where("JSON_OVERLAPS(`admin_menu_api_paths`, JSON_ARRAY(?))", c.Request.URL.Path).Take(&role).Error; err != nil { 27 | bean.Log.Error(err) 28 | c.String(403, "Permission 无权限 "+c.Request.URL.Path) 29 | c.Abort() 30 | return 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /middleware/record.go: -------------------------------------------------------------------------------- 1 | package middleware 2 | 3 | import ( 4 | "auth-gateway/bean" 5 | "auth-gateway/model/admin" 6 | 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | func Record(c *gin.Context) { 11 | 12 | c.Next() 13 | 14 | // 获取登录用户对象 15 | var adm admin.Admin 16 | if err := adm.Get(c); err != nil { 17 | bean.Log.Error(c.Request.URL.Path) 18 | bean.Log.Error(err) 19 | return 20 | } 21 | 22 | // 请求记录 23 | if c.Request.Method != "GET" { 24 | var rec admin.AdminRecord 25 | rec.AdminID = adm.ID 26 | rec.AdminName = adm.Name 27 | rec.Method = c.Request.Method 28 | rec.ApiPath = c.Request.URL.Path 29 | rec.Ip = c.ClientIP() 30 | 31 | if err := bean.MysqlDb.Save(&rec).Error; err != nil { 32 | bean.Log.Error(err) 33 | return 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /model/admin/admin.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "auth-gateway/model" 5 | "crypto/md5" 6 | "errors" 7 | "fmt" 8 | "io" 9 | "strconv" 10 | "time" 11 | 12 | "github.com/gin-gonic/gin" 13 | ) 14 | 15 | type Admin struct { 16 | ID uint `gorm:"primarykey;->"` 17 | OrganizationId uint 18 | Name string 19 | Mobile string 20 | Password string `json:"-"` 21 | Role string 22 | RoleID uint 23 | Token string 24 | UserId uint 25 | 26 | model.BaseTime 27 | } 28 | 29 | // 密码转为Md5处理 30 | func (a *Admin) PasswordMd5() error { 31 | 32 | if s, err := Md5(a.Password); err != nil { 33 | return err 34 | } else { 35 | a.Password = s 36 | } 37 | 38 | return nil 39 | } 40 | 41 | // 生成 token 处理 42 | func (a *Admin) NewToken() error { 43 | 44 | var str = strconv.Itoa(int(a.ID)) + time.Now().Format(time.DateTime) 45 | 46 | if s, err := Md5(str); err != nil { 47 | return err 48 | } else { 49 | a.Token = s 50 | } 51 | 52 | return nil 53 | } 54 | 55 | // 密码转为Md5处理 56 | func Md5(s string) (string, error) { 57 | h := md5.New() 58 | if _, err := io.WriteString(h, s); err != nil { 59 | return "", err 60 | } 61 | 62 | return fmt.Sprintf("%x", h.Sum(nil)), nil 63 | } 64 | 65 | // gin.Context get user 66 | func (one *Admin) Get(c *gin.Context) error { 67 | 68 | if a, exists := c.Get("admin"); !exists { 69 | return errors.New("ctx不存在该用户") 70 | } else { 71 | if u, b := a.(Admin); !b { 72 | return errors.New("断言error") 73 | } else { 74 | *one = u 75 | } 76 | } 77 | 78 | return nil 79 | } 80 | -------------------------------------------------------------------------------- /model/admin/admin_menu.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "auth-gateway/model" 5 | ) 6 | 7 | type AdminMenu struct { 8 | ID uint `gorm:"primarykey;->"` 9 | ParentID uint 10 | Name string 11 | Label string 12 | Path string 13 | Icon string 14 | Type string 15 | Show string 16 | Sort uint 17 | 18 | model.BaseTime 19 | } 20 | 21 | type AdminMenuTree struct { 22 | ID uint 23 | ParentID uint 24 | Name string 25 | Label string 26 | Path string 27 | Icon string 28 | Type string 29 | Show string 30 | Sort uint 31 | Children []AdminMenuTree 32 | } 33 | 34 | // 生成tree 35 | func (me AdminMenu) Tree(ParentID uint, list []AdminMenu) (tree []AdminMenuTree) { 36 | 37 | for _, v := range list { 38 | if v.ParentID == ParentID { 39 | var one AdminMenuTree 40 | one.ID = v.ID 41 | one.ParentID = v.ParentID 42 | one.Name = v.Name 43 | one.Label = v.Label 44 | one.Path = v.Path 45 | one.Icon = v.Icon 46 | one.Type = v.Type 47 | one.Show = v.Show 48 | one.Sort = v.Sort 49 | one.Children = me.Tree(v.ID, list) 50 | 51 | tree = append(tree, one) 52 | } 53 | } 54 | 55 | return tree 56 | } 57 | -------------------------------------------------------------------------------- /model/admin/admin_record.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import "auth-gateway/model" 4 | 5 | type AdminRecord struct { 6 | ID uint `gorm:"primarykey;->"` 7 | AdminID uint 8 | AdminName string 9 | Method string 10 | ApiPath string 11 | Ip string 12 | model.BaseTime 13 | } 14 | -------------------------------------------------------------------------------- /model/admin/admin_role.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import "auth-gateway/model" 4 | 5 | type AdminRole struct { 6 | ID uint `gorm:"primarykey;->"` 7 | Name string 8 | AdminMenuIds string // 菜单id json 9 | AdminMenuApiPaths string // 权限路径 json 10 | model.BaseTime 11 | } 12 | -------------------------------------------------------------------------------- /model/base.go: -------------------------------------------------------------------------------- 1 | package model 2 | 3 | type BaseTime struct { 4 | CreatedAt string `gorm:"->"` 5 | UpdatedAt string `gorm:"->"` 6 | } 7 | -------------------------------------------------------------------------------- /route/admin.go: -------------------------------------------------------------------------------- 1 | package route 2 | 3 | import ( 4 | "auth-gateway/controller" 5 | "auth-gateway/controller/admin" 6 | "auth-gateway/middleware" 7 | 8 | "github.com/gin-gonic/gin" 9 | ) 10 | 11 | func Admin(router *gin.Engine) { 12 | 13 | // router.Static("/upload", "upload") // 服务静态文件 相对路径为 项目启动时 用户所在目录 14 | 15 | router.GET("time", controller.Time) 16 | router.GET("/admin/CaptchaId", admin.CaptchaId) 17 | router.GET("/admin/Captcha", admin.Captcha) 18 | router.POST("/admin/Login", admin.Login) 19 | 20 | // admin 21 | adminGroup := router.Group("admin") 22 | adminGroup.Use(middleware.Record, middleware.Login, middleware.Permission) 23 | { 24 | adminGroup.GET("test", admin.Test) 25 | adminGroup.GET("Info", admin.Info) 26 | adminGroup.GET("MyList", admin.MyList) 27 | adminGroup.POST("Edit", admin.Edit) 28 | adminGroup.POST("Delete", admin.Delete) 29 | adminGroup.POST("Logout", admin.Logout) 30 | adminGroup.POST("ChangePassword", admin.ChangePassword) 31 | 32 | adminGroup.GET("RecordList", admin.RecordList) 33 | 34 | adminGroup.GET("RoleAllList", admin.RoleAllList) 35 | adminGroup.GET("RoleList", admin.RoleList) 36 | adminGroup.GET("RoleDetail", admin.RoleDetail) 37 | adminGroup.POST("RoleEdit", admin.RoleEdit) 38 | adminGroup.POST("RoleDelete", admin.RoleDelete) 39 | adminGroup.POST("RolePermissionEdit", admin.RolePermissionEdit) 40 | 41 | adminGroup.GET("MenuTree", admin.MenuTree) 42 | adminGroup.GET("MenuDetail", admin.MenuDetail) 43 | adminGroup.POST("MenuEdit", admin.MenuEdit) 44 | adminGroup.POST("MenuDelete", admin.MenuDelete) 45 | } 46 | 47 | } 48 | --------------------------------------------------------------------------------