Bladeren bron

feat: 实现日志相关接口

weijianghai 2 jaren geleden
bovenliggende
commit
bcc217febd
40 gewijzigde bestanden met toevoegingen van 2246 en 860 verwijderingen
  1. 175 69
      doc/开发测试文档/开发环境建设/开发环境建设.md
  2. 1255 730
      doc/开发测试文档/接口开发/acl提供给web的接口.md
  3. 33 18
      doc/部署文档/正式环境/正式环境部署文档.md
  4. 54 1
      pom.xml
  5. 10 0
      src/main/java/com/nokia/common/exception/BizException.java
  6. 22 0
      src/main/java/com/nokia/common/exception/MyRuntimeException.java
  7. 42 0
      src/main/java/com/nokia/config/MinioConfig.java
  8. 9 1
      src/main/java/com/nokia/config/web/ControllerExceptionHandler.java
  9. 65 0
      src/main/java/com/nokia/controller/web/WebLogController.java
  10. 2 2
      src/main/java/com/nokia/dao/FunctionDao.java
  11. 5 4
      src/main/java/com/nokia/dao/OperationLogDao.java
  12. 2 2
      src/main/java/com/nokia/dao/RoleDao.java
  13. 3 3
      src/main/java/com/nokia/dao/UserDao.java
  14. 5 5
      src/main/java/com/nokia/dao/VerificationLogDao.java
  15. 148 0
      src/main/java/com/nokia/service/LogService.java
  16. 60 0
      src/main/java/com/nokia/service/file/FileService.java
  17. 101 0
      src/main/java/com/nokia/service/file/MinioServiceImpl.java
  18. 3 3
      src/main/java/com/nokia/vo/AddFunctionDto.java
  19. 1 1
      src/main/java/com/nokia/vo/AddUserDto.java
  20. 4 4
      src/main/java/com/nokia/vo/AddUserRoleDto.java
  21. 2 2
      src/main/java/com/nokia/vo/CopyRolesDto.java
  22. 1 1
      src/main/java/com/nokia/vo/DeleteFunctionDto.java
  23. 1 1
      src/main/java/com/nokia/vo/DeleteUserDto.java
  24. 31 0
      src/main/java/com/nokia/vo/ExportOperationLogDto.java
  25. 14 0
      src/main/java/com/nokia/vo/ExportOperationLogVo.java
  26. 35 0
      src/main/java/com/nokia/vo/ExportVerificationLogDto.java
  27. 14 0
      src/main/java/com/nokia/vo/ExportVerificationLogVo.java
  28. 1 1
      src/main/java/com/nokia/vo/GetRoleByLoginNameDto.java
  29. 1 1
      src/main/java/com/nokia/vo/GetUserDetailDto.java
  30. 35 0
      src/main/java/com/nokia/vo/ListOperationLogDto.java
  31. 27 0
      src/main/java/com/nokia/vo/ListOperationLogVo.java
  32. 37 0
      src/main/java/com/nokia/vo/ListVerificationLogDto.java
  33. 27 0
      src/main/java/com/nokia/vo/ListVerificationLogVo.java
  34. 2 2
      src/main/java/com/nokia/vo/PageDto.java
  35. 3 3
      src/main/java/com/nokia/vo/TokenVo.java
  36. 1 1
      src/main/java/com/nokia/vo/TopUserDto.java
  37. 1 1
      src/main/java/com/nokia/vo/UpdateUserDto.java
  38. 5 1
      src/main/resources/application-product.properties
  39. 8 2
      src/main/resources/application-test.properties
  40. 1 1
      src/main/resources/application.properties

+ 175 - 69
doc/开发测试文档/开发环境建设/开发环境建设.md

@@ -13,30 +13,12 @@ docker run --name=redis --restart=always -p 6379:6379 -d redis
 - 引入数据
 
 ```sql
--- 创建模式
-create schema sqmdb_rpt;
--- 创建acl_user表
-CREATE TABLE sqmdb_rpt.acl_user (
-	user_id serial4 NOT NULL,
-	login_name varchar NULL,
-	user_name varchar NULL,
-	phone varchar NULL,
-	email varchar NULL,
-	city_id int4 NULL,
-	area_id int4 NULL,
-	province_id int4 NULL,
-	org varchar NULL,
-	CONSTRAINT user_pk PRIMARY KEY (user_id)
-);
--- 创建acl_user_role_city表
-CREATE TABLE sqmdb_rpt.acl_user_role_city (
-	id serial4 NOT NULL,
-	user_id int4 NOT NULL,
-	role_id int4 NOT NULL,
-	city_id int4 NOT NULL,
-	CONSTRAINT user_role_city_pk PRIMARY KEY (id)
-);
--- 创建acl_area表
+-- sqmdb_rpt.acl_area definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_area;
+
 CREATE TABLE sqmdb_rpt.acl_area (
 	area_id int4 NOT NULL,
 	area_name varchar NOT NULL,
@@ -44,13 +26,23 @@ CREATE TABLE sqmdb_rpt.acl_area (
 	type_code int4 NOT NULL,
 	parent_id int4 NULL
 );
--- 创建acl_role表
-CREATE TABLE sqmdb_rpt.acl_role (
-	role_id serial4 NOT NULL,
-	role_name varchar NULL,
-	"system" varchar NULL,
-	CONSTRAINT role_pk PRIMARY KEY (role_id)
+-- sqmdb_rpt.acl_client definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_client;
+
+CREATE TABLE sqmdb_rpt.acl_client (
+	client int4 NOT NULL, -- 主键
+	client_name varchar NOT NULL, -- 客户端名称
+	CONSTRAINT acl_client_pk PRIMARY KEY (client)
 );
+COMMENT ON TABLE sqmdb_rpt.acl_client IS '客户端';
+
+-- Column comments
+
+COMMENT ON COLUMN sqmdb_rpt.acl_client.client IS '主键';
+COMMENT ON COLUMN sqmdb_rpt.acl_client.client_name IS '客户端名称';
 -- sqmdb_rpt.acl_function definition
 
 -- Drop table
@@ -58,15 +50,18 @@ CREATE TABLE sqmdb_rpt.acl_role (
 -- DROP TABLE sqmdb_rpt.acl_function;
 
 CREATE TABLE sqmdb_rpt.acl_function (
-	id int4 NOT NULL, -- 主键
+	id serial4 NOT NULL, -- 主键
 	"name" varchar NOT NULL, -- 功能名称
-	url varchar NOT NULL, -- 功能链接
-	client int4 NOT NULL, -- 展示的客户端
 	"system" varchar NOT NULL, -- 系统模块
-	icon varchar NOT NULL DEFAULT ''::character varying, -- 图标链接
+	client int4 NOT NULL, -- 展示的客户端
+	app_url varchar NOT NULL DEFAULT ''::character varying, -- app链接
 	app_icon varchar NOT NULL DEFAULT ''::character varying, -- app图标链接
-	priority int4 NOT NULL DEFAULT 0, -- 显示优先级,值越大越靠前
-	CONSTRAINT acl_app_function_pk PRIMARY KEY (id)
+	app_priority int4 NOT NULL DEFAULT 0, -- app显示优先级,越大越靠前
+	web_url varchar NOT NULL DEFAULT ''::character varying, -- web链接
+	web_icon varchar NOT NULL DEFAULT ''::character varying, -- web图标链接
+	web_priority int4 NOT NULL DEFAULT 0, -- web显示优先级,越大越靠前
+	function_description varchar NOT NULL DEFAULT ''::character varying, -- 功能说明
+	CONSTRAINT acl_function_pk PRIMARY KEY (id)
 );
 COMMENT ON TABLE sqmdb_rpt.acl_function IS '功能';
 
@@ -74,12 +69,134 @@ COMMENT ON TABLE sqmdb_rpt.acl_function IS '功能';
 
 COMMENT ON COLUMN sqmdb_rpt.acl_function.id IS '主键';
 COMMENT ON COLUMN sqmdb_rpt.acl_function."name" IS '功能名称';
-COMMENT ON COLUMN sqmdb_rpt.acl_function.url IS '功能链接';
-COMMENT ON COLUMN sqmdb_rpt.acl_function.client IS '展示的客户端';
 COMMENT ON COLUMN sqmdb_rpt.acl_function."system" IS '系统模块';
-COMMENT ON COLUMN sqmdb_rpt.acl_function.icon IS '图标链接';
+COMMENT ON COLUMN sqmdb_rpt.acl_function.client IS '展示的客户端';
+COMMENT ON COLUMN sqmdb_rpt.acl_function.app_url IS 'app链接';
 COMMENT ON COLUMN sqmdb_rpt.acl_function.app_icon IS 'app图标链接';
-COMMENT ON COLUMN sqmdb_rpt.acl_function.priority IS '显示优先级,值越大越靠前';
+COMMENT ON COLUMN sqmdb_rpt.acl_function.app_priority IS 'app显示优先级,越大越靠前';
+COMMENT ON COLUMN sqmdb_rpt.acl_function.web_url IS 'web链接';
+COMMENT ON COLUMN sqmdb_rpt.acl_function.web_icon IS 'web图标链接';
+COMMENT ON COLUMN sqmdb_rpt.acl_function.web_priority IS 'web显示优先级,越大越靠前';
+COMMENT ON COLUMN sqmdb_rpt.acl_function.function_description IS '功能说明';
+-- sqmdb_rpt.acl_operation_log definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_operation_log;
+
+CREATE TABLE sqmdb_rpt.acl_operation_log (
+	id bigserial NOT NULL, -- 主键
+	operation_time timestamp NOT NULL, -- 操作时间
+	operator_id int4 NOT NULL, -- 操作人id
+	operator_name varchar NOT NULL, -- 操作人姓名
+	operator_account varchar NOT NULL, -- 操作人账号
+	operation_name varchar NOT NULL, -- 操作名称
+	operation_content varchar NOT NULL, -- 操作内容
+	CONSTRAINT acl_operation_log_pk PRIMARY KEY (id)
+);
+COMMENT ON TABLE sqmdb_rpt.acl_operation_log IS '操作日志';
+
+-- Column comments
+
+COMMENT ON COLUMN sqmdb_rpt.acl_operation_log.id IS '主键';
+COMMENT ON COLUMN sqmdb_rpt.acl_operation_log.operation_time IS '操作时间';
+COMMENT ON COLUMN sqmdb_rpt.acl_operation_log.operator_id IS '操作人id';
+COMMENT ON COLUMN sqmdb_rpt.acl_operation_log.operator_name IS '操作人姓名';
+COMMENT ON COLUMN sqmdb_rpt.acl_operation_log.operator_account IS '操作人账号';
+COMMENT ON COLUMN sqmdb_rpt.acl_operation_log.operation_name IS '操作名称';
+COMMENT ON COLUMN sqmdb_rpt.acl_operation_log.operation_content IS '操作内容';
+-- sqmdb_rpt.acl_org definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_org;
+
+CREATE TABLE sqmdb_rpt.acl_org (
+	org_id int8 NOT NULL, -- 组织id
+	org_name varchar NOT NULL, -- 组织名称
+	province_id int4 NULL, -- 省份id
+	city_id int4 NULL, -- 地市id
+	area_id int4 NULL, -- 区县id
+	CONSTRAINT acl_org_pk PRIMARY KEY (org_id)
+);
+COMMENT ON TABLE sqmdb_rpt.acl_org IS '组织';
+
+-- Column comments
+
+COMMENT ON COLUMN sqmdb_rpt.acl_org.org_id IS '组织id';
+COMMENT ON COLUMN sqmdb_rpt.acl_org.org_name IS '组织名称';
+COMMENT ON COLUMN sqmdb_rpt.acl_org.province_id IS '省份id';
+COMMENT ON COLUMN sqmdb_rpt.acl_org.city_id IS '地市id';
+COMMENT ON COLUMN sqmdb_rpt.acl_org.area_id IS '区县id';
+-- sqmdb_rpt.acl_role definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_role;
+
+CREATE TABLE sqmdb_rpt.acl_role (
+	role_id serial4 NOT NULL,
+	role_name varchar NULL,
+	"system" varchar NULL,
+	function_id int4 NULL,
+	role_description varchar NULL DEFAULT ''::character varying, -- 角色说明
+	CONSTRAINT role_pk PRIMARY KEY (role_id)
+);
+
+-- Column comments
+
+COMMENT ON COLUMN sqmdb_rpt.acl_role.role_description IS '角色说明';
+-- sqmdb_rpt.acl_system definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_system;
+
+CREATE TABLE sqmdb_rpt.acl_system (
+	"system" varchar NOT NULL, -- system id
+	system_name varchar NOT NULL, -- system中文名称
+	CONSTRAINT acl_system_pk PRIMARY KEY (system)
+);
+COMMENT ON TABLE sqmdb_rpt.acl_system IS 'acl系统';
+
+-- Column comments
+
+COMMENT ON COLUMN sqmdb_rpt.acl_system."system" IS 'system id';
+COMMENT ON COLUMN sqmdb_rpt.acl_system.system_name IS 'system中文名称';
+-- sqmdb_rpt.acl_top_user definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_top_user;
+
+CREATE TABLE sqmdb_rpt.acl_top_user (
+	login_name varchar NULL,
+	org_id int8 NULL,
+	org_name varchar NULL,
+	user_id varchar NULL,
+	user_name varchar NULL,
+	phone varchar NULL,
+	employee_code varchar NULL
+);
+-- sqmdb_rpt.acl_user definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_user;
+
+CREATE TABLE sqmdb_rpt.acl_user (
+	user_id serial4 NOT NULL,
+	login_name varchar NULL,
+	user_name varchar NULL,
+	phone varchar NULL,
+	email varchar NULL,
+	city_id int4 NULL,
+	area_id int4 NULL,
+	province_id int4 NULL,
+	org varchar NULL,
+	deleted int4 NOT NULL DEFAULT 0,
+	CONSTRAINT user_pk PRIMARY KEY (user_id)
+);
 -- sqmdb_rpt.acl_user_function definition
 
 -- Drop table
@@ -89,7 +206,7 @@ COMMENT ON COLUMN sqmdb_rpt.acl_function.priority IS '显示优先级,值越
 CREATE TABLE sqmdb_rpt.acl_user_function (
 	user_id int4 NOT NULL, -- 用户id
 	function_id int4 NOT NULL, -- 功能id
-	CONSTRAINT acl_app_user_function_pk PRIMARY KEY (user_id, function_id)
+	CONSTRAINT acl_user_function_pk PRIMARY KEY (user_id, function_id)
 );
 COMMENT ON TABLE sqmdb_rpt.acl_user_function IS '用户功能关联';
 
@@ -97,7 +214,19 @@ COMMENT ON TABLE sqmdb_rpt.acl_user_function IS '用户功能关联';
 
 COMMENT ON COLUMN sqmdb_rpt.acl_user_function.user_id IS '用户id';
 COMMENT ON COLUMN sqmdb_rpt.acl_user_function.function_id IS '功能id';
-    
+-- sqmdb_rpt.acl_user_role_city definition
+
+-- Drop table
+
+-- DROP TABLE sqmdb_rpt.acl_user_role_city;
+
+CREATE TABLE sqmdb_rpt.acl_user_role_city (
+	id serial4 NOT NULL,
+	user_id int4 NOT NULL,
+	role_id int4 NOT NULL,
+	city_id int4 NOT NULL,
+	CONSTRAINT user_role_city_pk PRIMARY KEY (id)
+);
 -- sqmdb_rpt.acl_verification_log definition
 
 -- Drop table
@@ -112,6 +241,8 @@ CREATE TABLE sqmdb_rpt.acl_verification_log (
 	city_id int4 NOT NULL, -- 所属地市
 	"system" varchar NOT NULL, -- 登入模块
 	login_time timestamp NOT NULL, -- 登录时间
+	success int4 NULL, -- 是否登录成功
+	res varchar NULL, -- 返回结果
 	CONSTRAINT acl_verification_log_pk PRIMARY KEY (id)
 );
 COMMENT ON TABLE sqmdb_rpt.acl_verification_log IS '用户登录日志';
@@ -125,31 +256,6 @@ COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.user_name IS '用户姓名';
 COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.city_id IS '所属地市';
 COMMENT ON COLUMN sqmdb_rpt.acl_verification_log."system" IS '登入模块';
 COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.login_time IS '登录时间';
+COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.success IS '是否登录成功';
+COMMENT ON COLUMN sqmdb_rpt.acl_verification_log.res IS '返回结果';
 ```
-
-测试数据
-```sql
-INSERT INTO sqmdb_rpt.acl_function (id,"name",url,client,"system",icon,app_icon,priority) VALUES
-	 (1,'工单处理','/pages/index/index?type=dispose',1,'flow','','icon1',88),
-	 (2,'工单查询','/pages/index/index?type=query',0,'flow','','icon2',77),
-	 (3,'工单答复','/pages/index/index?type=reply',1,'flow','','icon3',99),
-	 (4,'黑点库查询','',-1,'heidianku','','',0),
-	 (5,'黑点库管理','',-1,'heidianku','','',0),
-	 (6,'投诉大屏','',-1,'daping','','',0),
-	 (7,'投诉分析','',-1,'fenxi','','',0),
-	 (8,'投诉预测','',-1,'yuce','','',0);
-
-select * from acl_user_role_city aurc
-inner join acl_role ar on aurc.role_id = ar.role_id
-inner join acl_user au on au.user_id = aurc.user_id
-where aurc.user_id = 555;
-
-select distinct aurc.user_id
-from acl_user_role_city aurc
-inner join acl_role ar on aurc.role_id = ar.role_id
-inner join acl_user au on au.user_id = aurc.user_id
-where ar.role_name like '工单处理%'
-order by aurc.user_id;
-
-select * from acl_function order by id;
-```

+ 1255 - 730
doc/开发测试文档/接口开发/acl提供给web的接口.md

@@ -1,1114 +1,1639 @@
 # acl提供给web的接口
 
-## 鉴权接口
+**测试环境**: http://192.168.50.3:12128
 
-```http
-POST HTTP://127.0.0.1:12128/api/verification
-Content-Type: application/json
+**正式环境**: http://192.168.70.125:12128
 
-{
-  "token": "token",
-  "system": "web",
-  "fromSystem": "test"
-}
-```
+[TOC]
 
-```json
-{
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": {
-    "userName": "张三",
-    "list": [
-      {
-        "id": 1,
-        "name": "工单处理",
-        "url": "url",
-        "webIcon": "webIcon",
-        "priority": 0
-      },
-      {
-        "id": 2,
-        "name": "工单答复",
-        "url": "url",
-        "webIcon": "webIcon",
-        "priority": 0
-      }
-    ]
-  }
-}
-```
+# 用户
 
-### 输出参数说明
 
-id: 功能id
+## 修改用户
 
-name: 功能名称
 
-url: 功能链接
+**接口地址**:`/api/web/user/update`
 
-webIcon: web图标链接
 
-priority: 显示优先级,值越大越靠前
+**请求方式**:`POST`
 
-### 特殊情况
 
-- 无任何权限
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
 
-```json
-{
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": {
-    "userName": "张三",
-    "list": null
-  }
-}
-```
 
-## 查询角色说明接口
+**响应数据类型**:`*/*`
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/role/list
-Content-Type: application/json
 
-{
-    "current": 1,
-    "pageSize": 10,
-    "roleName": "工单查询",
-    "system": "flow"
-}
-```
+**接口描述**:
+
 
-```json
+**请求示例**:
+
+
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": [
+  "email": "",
+  "userId": 0,
+  "roles": [
     {
+      "roleId": 0,
+      "cityId": 0,
       "roleName": "工单查询",
-      "system": "flow",
-      "systemName": "流程"
-    },
-    {
-      "roleName": "工单答复",
-      "system": "flow",
-      "systemName": "流程"
+      "cityName": "石家庄市",
+      "functionId": 0
     }
   ]
 }
 ```
 
-### 输入参数说明
 
-roleName: 角色名称
+**请求参数**:
 
-system: 系统
 
-current: 页码
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|updateUserDto|UpdateUserDto|body|true|UpdateUserDto|UpdateUserDto|
+|  email|邮箱||false|string||
+|  userId|用户id||true|integer(int32)||
+|  roles|角色列表||false|array|AddUserRoleDto|
+|    roleId|角色id||true|integer||
+|    cityId|地市id||true|integer||
+|    roleName|角色名称||true|string||
+|    cityName|地市名称||true|string||
+|    functionId|功能id||false|integer||
 
-pageSize: 每页个数
 
-### 输出参数说明
+**响应状态**:
 
-total: 数据总数
 
-roleName: 角色名称
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|default|default response|RObject|
+|无法修改非本地市用户|{"success":false,"code":0,"message":"无法修改非本地市用户","data":null}||
 
-system: 系统
 
-systemName: 系统中文名称
+**响应参数**:
 
-## 查询模块列表接口
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/function/list
-Content-Type: application/json
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data|数据|object||
 
-{
-    "current": 1,
-    "pageSize": 10,
-    "functionName": "工单查询",
-    "client": 1,
-    "system": "flow"
-}
-```
 
-```json
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": {
-    "total": 100,
-    "list": [
-      {
-        "functionId": 1,
-        "functionName": "工单查询",
-        "systemName": "流程",
-        "clientName": "所有",
-        "priority": 0,
-        "url": "url",
-        "webIcon": "webIcon",
-        "appIcon": "appIcon"
-      },
-      {
-        "functionId": 2,
-        "functionName": "工单答复",
-        "systemName": "流程",
-        "clientName": "app",
-        "priority": 0,
-        "url": "url",
-        "webIcon": "webIcon",
-        "appIcon": "appIcon"
-      }
-    ]
-  }
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {}
 }
 ```
 
-### 输入参数说明
-
-functionName: 功能名称
 
-client: 客户端,0:所有,1:app,2:web
-
-system: 系统
-
-current: 页码
+## 查询用户列表接口
 
-pageSize: 每页个数
 
-### 输出参数说明
+**接口地址**:`/api/web/user/list`
 
-total: 数据总数
 
-functionId: 模块id
+**请求方式**:`POST`
 
-functionName: 模块名称
 
-systemName: 系统中文名称
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
 
-clientName: 客户端名称
 
-priority: 显示优先级
+**响应数据类型**:`*/*`
 
-url: 模块链接
 
-webIcon: web图标链接
+**接口描述**:
 
-appIcon: app图标链接
 
-## 添加模块接口
+**请求示例**:
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/function/add
-Content-Type: application/json
 
+```javascript
 {
-    "functionName": "工单查询",
-    "system": "flow",
-    "client": 1,
-    "priority": 0,
-    "url": "url",
-    "webIcon": "webIcon",
-    "appIcon": "appIcon"
+  "current": 1,
+  "pageSize": 10,
+  "loginName": "zhangsan",
+  "userName": "张三",
+  "org": "河北",
+  "areaId": -1
 }
 ```
 
-```json
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|listUserDto|ListUserDto|body|true|ListUserDto|ListUserDto|
+|  current|页码,最小值1||true|integer(int32)||
+|  pageSize|每页个数,最小值1||true|integer(int32)||
+|  loginName|账号||false|string||
+|  userName|用户名||false|string||
+|  org|组织||false|string||
+|  areaId|地区id||false|integer(int32)||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RPageVoListUserVo|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||PageVoListUserVo|PageVoListUserVo|
+|  total|数据总条数|integer(int64)||
+|  list|数据列表|array|ListUserVo|
+|    userId|用户id|integer||
+|    loginName|账号|string||
+|    userName|用户名|string||
+|    phone|手机号|string||
+|    email|邮箱|string||
+|    org|河北省分公司云网运营中心|string||
+|    provinceName|省份名称|string||
+|    cityName|地市名称|string||
+|    areaName|区县名称|string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": null
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"total": 1000,
+		"list": [
+			{
+				"userId": 0,
+				"loginName": "zhangsan",
+				"userName": "张三",
+				"phone": "12345678901",
+				"email": "",
+				"org": "",
+				"provinceName": "河北省",
+				"cityName": "石家庄市",
+				"areaName": "长安区"
+			}
+		]
+	}
 }
 ```
 
-### 输入参数说明
 
-functionName: 功能名称
+## 查询top用户信息
+
 
-system: 系统
+**接口地址**:`/api/web/user/getTopUserByLoginName`
 
-client: 客户端,0:所有,1:app,2:web
 
-priority: 显示优先级
+**请求方式**:`POST`
 
-url: 模块链接
 
-webIcon: web图标链接
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
 
-appIcon: app图标链接
 
-### 输出参数说明
+**响应数据类型**:`*/*`
 
 
-## 修改模块接口
+**接口描述**:
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/function/update
-Content-Type: application/json
 
+**请求示例**:
+
+
+```javascript
 {
-    "functionId": 1,
-    "functionName": "工单查询",
-    "system": "flow",
-    "client": 1,
-    "priority": 0,
-    "url": "url",
-    "webIcon": "webIcon",
-    "appIcon": "appIcon"
+  "loginName": "zhangsan"
 }
 ```
 
-```json
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|topUserDto|TopUserDto|body|true|TopUserDto|TopUserDto|
+|  loginName|账号||true|string||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|default|default response|RTopUserVo|
+|没有查询到top用户信息|{"success":false,"code":0,"message":"没有查询到top用户信息","data":null}||
+|非本地市用户|{"success":false,"code":0,"message":"非本地市用户","data":null}||
+|用户已存在系统中|{"success":false,"code":0,"message":"用户已存在系统中","data":null}||
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||TopUserVo|TopUserVo|
+|  loginName|账号|string||
+|  userName|用户名|string||
+|  phone|手机号|string||
+|  orgName|组织|string||
+|  provinceId|省份id|integer(int32)||
+|  cityId|地市id|integer(int32)||
+|  areaId|区县id|integer(int32)||
+|  provinceName|省份名称|string||
+|  cityName|地市名称|string||
+|  areaName|区县名称|string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": null
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"loginName": "zhangsan",
+		"userName": "张三",
+		"phone": "12345678901",
+		"orgName": "河北省分公司云网运营中心",
+		"provinceId": 0,
+		"cityId": 0,
+		"areaId": 0,
+		"provinceName": "河北省",
+		"cityName": "石家庄市",
+		"areaName": "长安区"
+	}
 }
 ```
 
-### 输入参数说明
 
-functionId: 模块id
+## 查询用户权限
+
 
-functionName: 功能名称
+**接口地址**:`/api/web/user/getRoleByLoginName`
 
-system: 系统
 
-client: 客户端,0:所有,1:app,2:web
+**请求方式**:`POST`
 
-priority: 显示优先级
 
-url: 模块链接
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
 
-webIcon: web图标链接
 
-appIcon: app图标链接
+**响应数据类型**:`*/*`
 
-### 输出参数说明
 
+**接口描述**:
 
-## 删除模块接口
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/function/del
-Content-Type: application/json
+**请求示例**:
 
+
+```javascript
 {
-    "functionId": 1
+  "loginName": "zhangsan"
 }
 ```
 
-```json
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|getRoleByLoginNameDto|GetRoleByLoginNameDto|body|true|GetRoleByLoginNameDto|GetRoleByLoginNameDto|
+|  loginName|账号||true|string||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|用户不存在|{"success":false,"code":0,"message":"用户不存在","data":null}||
+|default|default response|RListGetRoleByLoginNameVo|
+|非本地市用户|{"success":false,"code":0,"message":"非本地市用户","data":null}||
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data|数据|array|GetRoleByLoginNameVo|
+|  roleId|角色id|integer(int32)||
+|  roleName|角色名称|string||
+|  system|系统id|string||
+|  systemName|系统名称|string||
+|  cityId|地区id|integer(int32)||
+|  cityName|地市名称|string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": null
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": [
+		{
+			"roleId": 0,
+			"roleName": "工单查询",
+			"system": "flow",
+			"systemName": "流程",
+			"cityId": 0,
+			"cityName": "石家庄市"
+		}
+	]
 }
 ```
 
-### 输入参数说明
 
-functionId: 模块id
+## 查询用户详情
+
+
+**接口地址**:`/api/web/user/detail`
+
+
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
+
+
+**响应数据类型**:`*/*`
 
-### 输出参数说明
 
-## 查询top用户信息接口
+**接口描述**:
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/user/getTopUserByLoginName
-Content-Type: application/json
 
+**请求示例**:
+
+
+```javascript
 {
-    "loginName": "zhangsan"
+  "userId": 0
 }
 ```
 
-```json
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|getUserDetailDto|GetUserDetailDto|body|true|GetUserDetailDto|GetUserDetailDto|
+|  userId|用户id||true|integer(int32)||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RGetUserDetailVo|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||GetUserDetailVo|GetUserDetailVo|
+|  userId|用户id|integer(int32)||
+|  loginName|账号|string||
+|  userName|用户名|string||
+|  phone|手机号|string||
+|  orgName|组织|string||
+|  provinceName|省份名称|string||
+|  cityName|地市名称|string||
+|  areaName|区县名称|string||
+|  email|邮箱|string||
+|  roles|角色列表|array|GetUserDetailRoleVo|
+|    roleId|角色id|integer||
+|    cityId|地区id|integer||
+|    roleName|角色名称|string||
+|    cityName|地市名称|string||
+|    system|系统id|string||
+|    systemName|系统名称|string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": {
-    "userId": 7,
-    "loginName": "zhangsan",
-    "userName": "张三",
-    "phone": "12345678909",
-    "org": "河北省分公司云网运营中心",
-    "provinceId": -1,
-    "cityId": 130300,
-    "areaId": 130302,
-    "provinceName": "河北省",
-    "cityName": "石家庄市",
-    "areaName": "长安区"
-  }
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"userId": 0,
+		"loginName": "zhangsan",
+		"userName": "张三",
+		"phone": "12345678901",
+		"orgName": "河北省分公司云网运营中心",
+		"provinceName": "河北省",
+		"cityName": "石家庄市",
+		"areaName": "长安区",
+		"email": "",
+		"roles": [
+			{
+				"roleId": 0,
+				"cityId": 0,
+				"roleName": "工单查询",
+				"cityName": "石家庄市",
+				"system": "flow",
+				"systemName": "流程"
+			}
+		]
+	}
 }
 ```
 
-### 输入参数说明
 
-loginName: 账号
+## 删除用户
 
-### 输出参数说明
 
-userId: 用户id
+**接口地址**:`/api/web/user/del`
 
-loginName: 账号
 
-phone: 手机号
+**请求方式**:`POST`
 
-org: 组织
 
-provinceId: 省份id
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
 
-cityId: 地市id
 
-areaId: 区县id
+**响应数据类型**:`*/*`
 
-provinceName: 省份名称
 
-cityName: 地市名称
+**接口描述**:
 
-areaName: 区县名称
 
-### 特殊情况
+**请求示例**:
 
-- 用户已存在
 
-```json
+```javascript
 {
-  "success": false,
-  "code": 0,
-  "message": "用户已存在",
-  "data": null
+  "userIds": []
 }
 ```
 
-- top用户不存在
 
-```json
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|deleteUserDto|DeleteUserDto|body|true|DeleteUserDto|DeleteUserDto|
+|  userIds|用户id列表||true|array|integer(int32)|
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|无法删除非本地市用户|{"success":false,"code":0,"message":"无法删除非本地市用户","data":null}||
+|default|default response|RObject|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data|数据|object||
+
+
+**响应示例**:
+```javascript
 {
-  "success": false,
-  "code": 0,
-  "message": "top用户不存在",
-  "data": null
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {}
 }
 ```
 
-## 查询所有权限列表接口
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/role/all
-Content-Type: application/json
+## 批量复制权限
 
-{}
-```
 
-```json
+**接口地址**:`/api/web/user/copyRole`
+
+
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
+
+
+**响应数据类型**:`*/*`
+
+
+**接口描述**:
+
+
+**请求示例**:
+
+
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": [
+  "userIds": [],
+  "roles": [
     {
-      "roleId": 42,
+      "roleId": 0,
+      "cityId": 0,
       "roleName": "工单查询",
-      "functionId": 1,
-      "system": "flow",
-      "systemName": "流程"
-    },
-    {
-      "roleId": 43,
-      "roleName": "工单答复",
-      "functionId": 2,
-      "system": "flow",
-      "systemName": "流程"
+      "cityName": "石家庄市",
+      "functionId": 0
     }
   ]
 }
 ```
 
-### 输出参数说明
 
-roleId: 角色id
+**请求参数**:
 
-roleName: 角色名称
 
-functionId: 模块id
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|copyRolesDto|CopyRolesDto|body|true|CopyRolesDto|CopyRolesDto|
+|  userIds|用户id列表||true|array|integer(int32)|
+|  roles|角色列表||true|array|AddUserRoleDto|
+|    roleId|角色id||true|integer||
+|    cityId|地市id||true|integer||
+|    roleName|角色名称||true|string||
+|    cityName|地市名称||true|string||
+|    functionId|功能id||false|integer||
 
-system: 系统
 
-systemName: 系统中文名称
+**响应状态**:
 
-## 查询地市列表接口
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/area/listCity
-Content-Type: application/json
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|default|default response|RObject|
+|无法修改非本地市用户|{"success":false,"code":0,"message":"无法修改非本地市用户","data":null}||
 
-{}
-```
 
-```json
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data|数据|object||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": [
-    {
-      "areaId": 130100,
-      "areaName": "石家庄市"
-    },
-    {
-      "areaId": 130200,
-      "areaName": "唐山市"
-    }
-  ]
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {}
 }
 ```
 
-### 输出参数说明
 
-areaId: 地市id
+## 添加用户
 
-areaName: 地市名称
 
-## 查询省市区树形接口
+**接口地址**:`/api/web/user/add`
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/area/treeArea
-Content-Type: application/json
 
-{}
-```
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
+
 
-```json
+**响应数据类型**:`*/*`
+
+
+**接口描述**:
+
+
+**请求示例**:
+
+
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": [
+  "loginName": "zhangsan",
+  "email": "",
+  "roles": [
     {
-      "label": "河北省",
-      "value": -1,
-      "children": [
-        {
-          "label": "石家庄市",
-          "value": 130100,
-          "children": [
-            {
-              "label": "长安区",
-              "value": 130102
-            },
-            {
-              "label": "桥西区",
-              "value": 130104
-            }
-          ]
-        },
-        {
-          "label": "唐山市",
-          "value": 130100,
-          "children": [
-            {
-              "label": "长安区",
-              "value": 130102
-            },
-            {
-              "label": "桥西区",
-              "value": 130104
-            }
-          ]
-        }
-      ]
+      "roleId": 0,
+      "cityId": 0,
+      "roleName": "工单查询",
+      "cityName": "石家庄市",
+      "functionId": 0
     }
   ]
 }
 ```
 
-### 输出参数说明
 
-value: 省市区id
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|addUserDto|AddUserDto|body|true|AddUserDto|AddUserDto|
+|  loginName|账号||true|string||
+|  email|邮箱||false|string||
+|  roles|角色列表||false|array|AddUserRoleDto|
+|    roleId|角色id||true|integer||
+|    cityId|地市id||true|integer||
+|    roleName|角色名称||true|string||
+|    cityName|地市名称||true|string||
+|    functionId|功能id||false|integer||
+
 
-label: 省市区名称
+**响应状态**:
 
-children: 地市或区县列表
 
-## 查询用户权限接口
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|无法添加非本地市用户|{"success":false,"code":0,"message":"无法添加非本地市用户","data":null}||
+|default|default response|RObject|
+|用户已存在系统中|{"success":false,"code":0,"message":"用户已存在系统中","data":null}||
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/user/getRoleByLoginName
-Content-Type: application/json
 
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data|数据|object||
+
+
+**响应示例**:
+```javascript
 {
-    "loginName": "zhangsan"
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {}
 }
 ```
 
-```json
+
+# 系统
+
+
+## 查询系统列表
+
+
+**接口地址**:`/api/web/system/list`
+
+
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded`
+
+
+**响应数据类型**:`*/*`
+
+
+**接口描述**:
+
+
+**请求参数**:
+
+
+暂无
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RListAclSystem|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data|数据|array|AclSystem|
+|  system|系统id|string||
+|  systemName|系统名称|string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": [
-    {
-      "roleId": 42,
-      "cityId": 130300
-    },
-    {
-      "roleId": 42,
-      "cityId": 130300
-    }
-  ]
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": [
+		{
+			"system": "flow",
+			"systemName": "流程"
+		}
+	]
 }
 ```
 
-### 输入参数说明
 
-loginName: 账号
+# 角色
 
-### 输出参数说明
 
-roleId: 角色id
+## 查询角色说明列表
 
-cityId: 地市id
 
-## 查询用户列表接口
+**接口地址**:`/api/web/role/list`
+
+
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
+
+
+**响应数据类型**:`*/*`
+
+
+**接口描述**:
+
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/user/list
-Content-Type: application/json
+**请求示例**:
 
+
+```javascript
 {
-    "current": 1,
-    "pageSize": 10,
-    "loginName": "zhangsan",
-    "userName": "张三",
-    "org": "河北省分公司云网运营中心",
-    "areaId": 130302
+  "current": 1,
+  "pageSize": 10,
+  "roleName": "工单",
+  "system": "flow"
 }
 ```
 
-```json
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|listRoleDto|ListRoleDto|body|true|ListRoleDto|ListRoleDto|
+|  current|页码,最小值1||true|integer(int32)||
+|  pageSize|每页个数,最小值1||true|integer(int32)||
+|  roleName|角色名称||false|string||
+|  system|系统id||false|string||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RPageVoListRoleVo|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||PageVoListRoleVo|PageVoListRoleVo|
+|  total|数据总条数|integer(int64)||
+|  list|数据列表|array|ListRoleVo|
+|    roleName|角色名称|string||
+|    system|系统id|string||
+|    systemName|系统名称|string||
+|    roleDescription|角色说明|string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": {
-    "total": 100,
-    "list": [
-      {
-        "userId": 1,
-        "loginName": "zhangsan",
-        "userName": "张三",
-        "phone": "12345678909",
-        "email": "a@qq.com",
-        "org": "河北省分公司云网运营中心",
-        "provinceName": "河北省",
-        "cityName": "石家庄市",
-        "areaName": "长安区"
-      }
-    ]
-  }
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"total": 1000,
+		"list": [
+			{
+				"roleName": "工单查询",
+				"system": "flow",
+				"systemName": "流程",
+				"roleDescription": ""
+			}
+		]
+	}
 }
 ```
 
-### 输入参数说明
 
-loginName: 账号
+## 查询所有角色
 
-userName: 用户名
 
-org: 组织
+**接口地址**:`/api/web/role/all`
 
-areaId: 省市区id
 
-current: 页码
+**请求方式**:`POST`
 
-pageSize: 每页个数
 
-### 输出参数说明
+**请求数据类型**:`application/x-www-form-urlencoded`
 
-total: 数据总数
 
-userId: 用户id
+**响应数据类型**:`*/*`
 
-loginName: 账号
 
-userName: 用户名
+**接口描述**:
 
-phone: 手机号
 
-email: 邮箱
+**请求参数**:
 
-org: 组织
 
-provinceName: 省份名称
+暂无
 
-cityName: 地市名称
 
-areaName: 区县名称
+**响应状态**:
 
-## 添加用户接口
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/user/add
-Content-Type: application/json
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RListAllRoleVo|
 
-{
-    "loginName": "zhangsan",
-    "userName": "张三",
-    "phone": "12345678909",
-    "email": "a@qq.com",
-    "org": "河北省分公司云网运营中心",
-    "provinceId": -1,
-    "cityId": 130300,
-    "areaId": 130302,
-    "roles": [
-        {
-            "roleId": 42,
-            "cityId": 130300,
-            "functionId": 1
-        },
-        {
-            "roleId": 42,
-            "cityId": 130300,
-            "functionId": 1
-        }
-    ]
-}
-```
 
-```json
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data|数据|array|AllRoleVo|
+|  roleId|角色id|integer(int32)||
+|  functionId|功能id|integer(int32)||
+|  roleName|角色名称|string||
+|  system|系统id|string||
+|  systemName|系统名称|string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": null
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": [
+		{
+			"roleId": 0,
+			"functionId": 0,
+			"roleName": "工单查询",
+			"system": "flow",
+			"systemName": "流程"
+		}
+	]
 }
 ```
 
-### 输入参数说明
 
-loginName: 账号
+# 日志
+
 
-userName: 用户名
+## 查询登录日志列表
 
-phone: 手机号
 
-email: 邮箱
+**接口地址**:`/api/web/log/verificationLog/list`
 
-org: 组织
 
-provinceId: 省份id
+**请求方式**:`POST`
 
-cityId: 地市id
 
-areaId: 区县id
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
 
-roleId: 角色id
 
-functionId: 模块id
+**响应数据类型**:`*/*`
 
 
-### 输出参数说明
+**接口描述**:
 
-### 特殊情况
 
-- 用户已存在
+**请求示例**:
 
-```json
+
+```javascript
 {
-  "success": false,
-  "code": 0,
-  "message": "用户已存在",
-  "data": null
+  "current": 1,
+  "pageSize": 10,
+  "userId": 0,
+  "loginName": "zhangsan",
+  "userName": "张三",
+  "startTime": "",
+  "endTime": "",
+  "system": "flow",
+  "cityId": 0
 }
 ```
 
-- top用户不存在
 
-```json
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|listVerificationLogDto|ListVerificationLogDto|body|true|ListVerificationLogDto|ListVerificationLogDto|
+|  current|页码,最小值1||true|integer(int32)||
+|  pageSize|每页个数,最小值1||true|integer(int32)||
+|  userId|用户id||false|integer(int32)||
+|  loginName|账号||false|string||
+|  userName|用户名||false|string||
+|  startTime|起始时间||false|string(date-time)||
+|  endTime|截至时间||false|string(date-time)||
+|  system|系统id||false|string||
+|  cityId|地区id||false|integer(int32)||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RPageVoListVerificationLogVo|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||PageVoListVerificationLogVo|PageVoListVerificationLogVo|
+|  total|数据总条数|integer(int64)||
+|  list|数据列表|array|ListVerificationLogVo|
+|    userId|用户id|integer||
+|    loginName|账号|string||
+|    userName|用户名|string||
+|    cityName|地市名称|string||
+|    systemName|系统名称|string||
+|    loginTime||string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": false,
-  "code": 0,
-  "message": "top用户不存在",
-  "data": null
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"total": 1000,
+		"list": [
+			{
+				"userId": 0,
+				"loginName": "zhangsan",
+				"userName": "张三",
+				"cityName": "石家庄市",
+				"systemName": "流程",
+				"loginTime": ""
+			}
+		]
+	}
 }
 ```
 
-## 修改用户接口
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/user/update
-Content-Type: application/json
+## 导出登录日志
+
+
+**接口地址**:`/api/web/log/verificationLog/export`
+
+
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
+
+
+**响应数据类型**:`*/*`
+
 
+**接口描述**:
+
+
+**请求示例**:
+
+
+```javascript
 {
-    "userId": 1,
-    "email": "a@qq.com",
-    "roles": [
-        {
-            "roleId": 42,
-            "cityId": 130300,
-            "functionId": 1
-        },
-        {
-            "roleId": 42,
-            "cityId": 130300,
-            "functionId": 1
-        }
-    ]
+  "userId": 0,
+  "loginName": "zhangsan",
+  "userName": "张三",
+  "operationName": "修改用户",
+  "startTime": "",
+  "endTime": "",
+  "system": "flow",
+  "cityId": 0
 }
 ```
 
-```json
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|exportVerificationLogDto|ExportVerificationLogDto|body|true|ExportVerificationLogDto|ExportVerificationLogDto|
+|  userId|用户id||false|integer(int32)||
+|  loginName|账号||false|string||
+|  userName|用户名||false|string||
+|  operationName|操作名称||false|string||
+|  startTime|||false|string(date-time)||
+|  endTime|||false|string(date-time)||
+|  system|系统id||false|string||
+|  cityId|地区id||false|integer(int32)||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RExportVerificationLogVo|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||ExportVerificationLogVo|ExportVerificationLogVo|
+|  url|导出文件链接|string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": null
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"url": ""
+	}
 }
 ```
 
 
-### 输入参数说明
+## 查询操作日志列表
+
+
+**接口地址**:`/api/web/log/operationLog/list`
+
+
+**请求方式**:`POST`
+
 
-userId: 用户id
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
 
-email: 邮箱
 
-cityId: 地市id
+**响应数据类型**:`*/*`
 
-roleId: 角色id
 
-functionId: 模块id
+**接口描述**:
 
-### 输出参数说明
 
-## 删除用户接口
+**请求示例**:
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/user/del
-Content-Type: application/json
 
+```javascript
 {
-    "userId": 1
+  "current": 1,
+  "pageSize": 10,
+  "operatorId": 0,
+  "operatorAccount": "zhangsan",
+  "operatorName": "张三",
+  "operationName": "修改用户",
+  "startTime": "",
+  "endTime": ""
 }
 ```
 
-```json
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|listOperationLogDto|ListOperationLogDto|body|true|ListOperationLogDto|ListOperationLogDto|
+|  current|页码,最小值1||true|integer(int32)||
+|  pageSize|每页个数,最小值1||true|integer(int32)||
+|  operatorId|用户id||false|integer(int32)||
+|  operatorAccount|账号||false|string||
+|  operatorName|用户名||false|string||
+|  operationName|操作名称||false|string||
+|  startTime|起始时间||false|string(date-time)||
+|  endTime|截至时间||false|string(date-time)||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RPageVoListOperationLogVo|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||PageVoListOperationLogVo|PageVoListOperationLogVo|
+|  total|数据总条数|integer(int64)||
+|  list|数据列表|array|ListOperationLogVo|
+|    operatorId|用户id|integer||
+|    operatorAccount|账号|string||
+|    operatorName|用户名|string||
+|    operationName|操作名称|string||
+|    operationContent|操作内容|string||
+|    operationTime||string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": null
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"total": 1000,
+		"list": [
+			{
+				"operatorId": 0,
+				"operatorAccount": "zhangsan",
+				"operatorName": "张三",
+				"operationName": "修改用户",
+				"operationContent": "",
+				"operationTime": ""
+			}
+		]
+	}
 }
 ```
 
 
-### 输入参数说明
+## 导出操作日志
+
+
+**接口地址**:`/api/web/log/operationLog/export`
+
+
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
+
+
+**响应数据类型**:`*/*`
+
 
-userId: 用户id
+**接口描述**:
 
-### 输出参数说明
 
-## 查询用户详情接口
+**请求示例**:
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/user/detail
-Content-Type: application/json
 
+```javascript
 {
-    "userId": 1
+  "operatorId": 0,
+  "operatorAccount": "zhangsan",
+  "operatorName": "张三",
+  "operationName": "修改用户",
+  "startTime": "",
+  "endTime": ""
 }
 ```
 
-```json
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|exportOperationLogDto|ExportOperationLogDto|body|true|ExportOperationLogDto|ExportOperationLogDto|
+|  operatorId|用户id||false|integer(int32)||
+|  operatorAccount|账号||false|string||
+|  operatorName|用户名||false|string||
+|  operationName|操作名称||false|string||
+|  startTime|||false|string(date-time)||
+|  endTime|||false|string(date-time)||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RExportOperationLogVo|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||ExportOperationLogVo|ExportOperationLogVo|
+|  url|导出文件链接|string||
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": [
-    {
-      "userId": 1,
-      "loginName": "zhangsan",
-      "userName": "张三",
-      "phone": "12345678909",
-      "email": "a@qq.com",
-      "org": "河北省分公司云网运营中心",
-      "provinceName": "河北省",
-      "cityName": "石家庄市",
-      "areaName": "长安区",
-      "roles": [
-        {
-          "roleName": "工单查询",
-          "cityName": "石家庄市",
-          "system": "liucheng",
-          "systemName": "流程"
-        },
-        {
-          "roleName": "黑点库查询",
-          "cityName": "石家庄市",
-          "system": "heidianku",
-          "systemName": "黑点库"
-        }
-      ]
-    }
-  ]
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"url": ""
+	}
 }
 ```
 
-### 输入参数说明
 
-userId: 用户id
+# 功能
 
-### 输出参数说明
 
-userId: 用户id
+## 查询模块列表
 
-loginName: 账号
 
-userName: 用户名
+**接口地址**:`/api/web/function/list`
 
-phone: 手机号
 
-email: 邮箱
+**请求方式**:`POST`
 
-org: 组织
 
-provinceName: 省份名称
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
 
-cityName: 地市名称
 
-areaName: 区县名称
+**响应数据类型**:`*/*`
 
-roleName: 角色名称
 
-cityName: 地市名称
+**接口描述**:
 
-system: 系统
 
-systemName: 系统中文名称
+**请求示例**:
 
-## 批量复制权限接口
-
-```http
-POST HTTP://127.0.0.1:12128/rest/api/role/copy
-Content-Type: application/json
 
+```javascript
 {
-    "userIds": [1, 2],
-    "roles": [
-        {
-            "roleId": 42,
-            "cityId": 130300,
-            "functionId": 1
-        },
-        {
-            "roleId": 42,
-            "cityId": 130300,
-            "functionId": 1
-        }
-    ]
+  "current": 1,
+  "pageSize": 10,
+  "functionName": "工单",
+  "client": 0,
+  "system": "flow"
 }
 ```
 
-```json
-{
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": null
-}
-```
 
-### 输入参数说明
+**请求参数**:
 
-userIds: 用户id列表
 
-cityId: 地市id
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|listFunctionDto|ListFunctionDto|body|true|ListFunctionDto|ListFunctionDto|
+|  current|页码,最小值1||true|integer(int32)||
+|  pageSize|每页个数,最小值1||true|integer(int32)||
+|  functionName|模块名称||false|string||
+|  client|客户端id||false|integer(int32)||
+|  system|系统id||false|string||
 
-roleId: 角色id
 
-functionId: 模块id
+**响应状态**:
 
 
-### 输出参数说明
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RPageVoListFunctionVo|
 
 
-## 查询操作日志列表接口
+**响应参数**:
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/log/operationLog
-Content-Type: application/json
 
-{
-    "current": 1,
-    "pageSize": 10,
-    "operatorId": 1,
-    "operatorAccount": "zhangsan",
-    "operatorName": "张三",
-    "operationName": "修改用户",
-    "operationContent": "操作内容",
-    "startTime": "2022-11-01 13:00:00",
-    "endTime": "2022-11-01 13:00:00"
-}
-```
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||PageVoListFunctionVo|PageVoListFunctionVo|
+|  total|数据总条数|integer(int64)||
+|  list|数据列表|array|ListFunctionVo|
+|    functionId|模块id|integer||
+|    functionName|模块名称|string||
+|    systemName|系统名称|string||
+|    clientName|客户端名称|string||
+|    functionDescription|模块描述|string||
+|    appPriority|app显示优先级|integer||
+|    webPriority|web显示优先级|integer||
+|    webUrl|web链接|string||
+|    appUrl|app链接|string||
+|    webIcon|web图标|string||
+|    appIcon|app图标|string||
+
 
-```json
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": {
-    "total": 100,
-    "list": [
-      {
-        "operatorId": 1,
-        "operatorAccount": "zhangsan",
-        "operatorName": "张三",
-        "operationName": "修改用户",
-        "operationContent": "操作内容",
-        "operationTime": "2022-11-01 13:00:00"
-      },
-      {
-        "operatorId": 1,
-        "operatorAccount": "zhangsan",
-        "operatorName": "张三",
-        "operationName": "修改用户",
-        "operationContent": "操作内容",
-        "operationTime": "2022-11-01 13:00:00"
-      }
-    ]
-  }
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"total": 1000,
+		"list": [
+			{
+				"functionId": 0,
+				"functionName": "工单查询",
+				"systemName": "流程",
+				"clientName": "app",
+				"functionDescription": "",
+				"appPriority": 0,
+				"webPriority": 0,
+				"webUrl": "",
+				"appUrl": "",
+				"webIcon": "",
+				"appIcon": ""
+			}
+		]
+	}
 }
 ```
 
-### 输入参数说明
 
-operatorId: 操作人id
+# 地区
+
+
+## 查询省市区树形接口(用户列表地区选择框)
+
 
-operatorAccount: 操作人账号
+**接口地址**:`/api/web/area/tree`
 
-operatorName: 操作人姓名
 
-operationName: 操作名称
+**请求方式**:`POST`
 
-operationContent: 操作内容
 
-startTime: 起始时间
+**请求数据类型**:`application/x-www-form-urlencoded`
 
-endTime: 截至时间
 
-current: 页码
+**响应数据类型**:`*/*`
 
-pageSize: 每页个数
 
-### 输出参数说明
+**接口描述**:
 
-total: 数据总数
 
-operatorId: 操作人id
+**请求参数**:
 
-operatorAccount: 操作人账号
 
-operatorName: 操作人姓名
+暂无
 
-operationName: 操作名称
 
-operationContent: 操作内容
+**响应状态**:
 
-operationTime: 操作时间
 
-## 查询登录日志列表接口
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RTreeAreaVo|
 
-```http
-POST HTTP://127.0.0.1:12128/rest/api/log/verificationLog
-Content-Type: application/json
 
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||TreeAreaVo|TreeAreaVo|
+|  label|地区名称|string||
+|  value|地区id|integer(int32)||
+|  children|子地区列表|array|TreeAreaVo|
+
+
+**响应示例**:
+```javascript
 {
-    "current": 1,
-    "pageSize": 10,
-    "userId": 1,
-    "loginName": "zhangsan",
-    "userName": "张三",
-    "system": "liucheng",
-    "cityId": 130300,
-    "startTime": "2022-11-25T16:30:15.160",
-    "endTime": "2022-11-25T16:30:15.160"
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"label": "河北省",
+		"value": -1,
+		"children": [
+			{
+				"label": "河北省",
+				"value": -1,
+				"children": [
+					{}
+				]
+			}
+		]
+	}
 }
 ```
 
-```json
+
+## 查询省和地市树形接口(添加修改用户、操作日志地区选择框)
+
+
+**接口地址**:`/api/web/area/treeProvinceCity`
+
+
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded`
+
+
+**响应数据类型**:`*/*`
+
+
+**接口描述**:
+
+
+**请求参数**:
+
+
+暂无
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|RTreeAreaVo|
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|success|是否成功|boolean||
+|code|业务码|integer(int32)|integer(int32)|
+|message|提示信息|string||
+|data||TreeAreaVo|TreeAreaVo|
+|  label|地区名称|string||
+|  value|地区id|integer(int32)||
+|  children|子地区列表|array|TreeAreaVo|
+
+
+**响应示例**:
+```javascript
 {
-  "success": true,
-  "code": 1,
-  "message": "成功",
-  "data": {
-    "total": 100,
-    "list": [
-      {
-        "userId": 1,
-        "loginName": "zhangsan",
-        "userName": "张三",
-        "cityName": "石家庄市",
-        "systemName": "流程",
-        "loginTime": "2022-11-01 13:00:00"
-      },
-      {
-        "userId": 1,
-        "loginName": "zhangsan",
-        "userName": "张三",
-        "cityName": "石家庄市",
-        "systemName": "流程",
-        "loginTime": "2022-11-01 13:00:00"
-      }
-    ]
-  }
+	"success": true,
+	"code": 0,
+	"message": "成功",
+	"data": {
+		"label": "河北省",
+		"value": -1,
+		"children": [
+			{
+				"label": "河北省",
+				"value": -1,
+				"children": [
+					{}
+				]
+			}
+		]
+	}
 }
 ```
 
-### 输入参数说明
 
-userId: 用户id
+# 鉴权
+
+
+## 鉴权
+
+
+**接口地址**:`/api/verification`
+
+
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded,application/json`
+
 
-loginName: 账号
+**响应数据类型**:`*/*`
 
-userName: 用户名
 
-system: 系统
+**接口描述**:
 
-cityId: 地市id
 
-startTime: 起始时间
+**请求示例**:
 
-endTime: 截至时间
 
-current: 页码
+```javascript
+{
+  "token": "test_token_hebei",
+  "system": "web",
+  "fromSystem": "test"
+}
+```
+
 
-pageSize: 每页个数
+**请求参数**:
 
-### 输出参数说明
 
-total: 数据总数
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|tokenVo|TokenVo|body|true|TokenVo|TokenVo|
+|  token|token||true|string||
+|  system|system||true|string||
+|  fromSystem|fromSystem||true|string||
 
-userId: 用户id
 
-loginName: 账号
+**响应状态**:
 
-userName: 用户名
 
-cityName: 地市名称
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|用户不存在|{"success":false,"code":0,"message":"用户不存在","data":null}||
+|app|{"success":true,"code":1,"message":"成功","data":{"userName":"张三","list":[{"id":1,"name":"工单处理","url":"url","webIcon":"webIcon","priority":0},{"id":2,"name":"工单答复","url":"url","webIcon":"webIcon","priority":0}]}}|WebVerificationVo|
 
-systemName: 系统中文名称
 
-loginTime: 登录时间
+**响应参数**:
 
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|userName|用户名|string||
+|list|入口列表|array|WebFunctionVo|
+|  id|功能id|integer(int32)||
+|  name|功能名称|string||
+|  url|web链接|string||
+|  webIcon|web图标|string||
+|  priority|显示优先级|integer(int32)||
+
+
+**响应示例**:
+```javascript
+{
+	"userName": "张三",
+	"list": [
+		{
+			"id": 0,
+			"name": "",
+			"url": "",
+			"webIcon": "",
+			"priority": 0
+		}
+	]
+}
+```

+ 33 - 18
doc/部署文档/正式环境/正式环境部署文档.md

@@ -19,30 +19,45 @@
 
     ```sql
     -- 备份
-    create table sqmdb_rpt.acl_area_0805 as select *from sqmdb_rpt.acl_area;
-    create table sqmdb_rpt.acl_city_0805 as select* from sqmdb_rpt.acl_city;
-    create table sqmdb_rpt.acl_district_0805 as select *from sqmdb_rpt.acl_district;
-    create table sqmdb_rpt.acl_role_0805 as select* from sqmdb_rpt.acl_role;
-    create table sqmdb_rpt.acl_user_0805 as select *from sqmdb_rpt.acl_user;
-    create table sqmdb_rpt.acl_user_role_0805 as select* from sqmdb_rpt.acl_user_role;
-    create table sqmdb_rpt.acl_user_role_city_0805 as select * from sqmdb_rpt.acl_user_role_city;
+    create table sqmdb_rpt.acl_area_bak as select * from sqmdb_rpt.acl_area;
+    create table sqmdb_rpt.acl_client_bak as select * from sqmdb_rpt.acl_client;
+    create table sqmdb_rpt.acl_function_bak as select * from sqmdb_rpt.acl_function;
+    create table sqmdb_rpt.acl_operation_log_bak as select * from sqmdb_rpt.acl_operation_log;
+    create table sqmdb_rpt.acl_org_bak as select * from sqmdb_rpt.acl_org;
+    create table sqmdb_rpt.acl_role_bak as select * from sqmdb_rpt.acl_role;
+    create table sqmdb_rpt.acl_system_bak as select * from sqmdb_rpt.acl_system;
+    create table sqmdb_rpt.acl_top_user_bak as select * from sqmdb_rpt.acl_top_user;
+    create table sqmdb_rpt.acl_user_bak as select * from sqmdb_rpt.acl_user;
+    create table sqmdb_rpt.acl_user_function_bak as select * from sqmdb_rpt.acl_user_function;
+    create table sqmdb_rpt.acl_user_role_city_bak as select * from sqmdb_rpt.acl_user_role_city;
+    create table sqmdb_rpt.acl_verification_log_bak as select * from sqmdb_rpt.acl_verification_log;
 
     -- 如需回退操作(将正式表命名为back结尾的,然后将备份表改为正式表名)执行如下
     alter table sqmdb_rpt.acl_area rename to acl_area_back;
-    alter table sqmdb_rpt.acl_city rename to acl_city_back;
-    alter table sqmdb_rpt.acl_district rename to acl_district_back;
+    alter table sqmdb_rpt.acl_client rename to acl_client_back;
+    alter table sqmdb_rpt.acl_function rename to acl_function_back;
+    alter table sqmdb_rpt.acl_operation_log rename to acl_operation_log_back;
+    alter table sqmdb_rpt.acl_org rename to acl_org_back;
     alter table sqmdb_rpt.acl_role rename to acl_role_back;
+    alter table sqmdb_rpt.acl_system rename to acl_system_back;
+    alter table sqmdb_rpt.acl_top_user rename to acl_top_user_back;
     alter table sqmdb_rpt.acl_user rename to acl_user_back;
-    alter table sqmdb_rpt.acl_user_role rename to acl_user_role_back;
+    alter table sqmdb_rpt.acl_user_function rename to acl_user_function_back;
     alter table sqmdb_rpt.acl_user_role_city rename to acl_user_role_city_back;
-
-    alter table sqmdb_rpt.acl_area_0805 rename to acl_area;
-    alter table sqmdb_rpt.acl_city_0805 rename to acl_city;
-    alter table sqmdb_rpt.acl_district_0805 rename to acl_district;
-    alter table sqmdb_rpt.acl_role_0805 rename to acl_role;
-    alter table sqmdb_rpt.acl_user_0805 rename to acl_user;
-    alter table sqmdb_rpt.acl_user_role_0805 rename to acl_user_role;
-    alter table sqmdb_rpt.acl_user_role_city_0805 rename to acl_user_role_city;
+    alter table sqmdb_rpt.acl_verification_log rename to acl_verification_log_back;
+
+    alter table sqmdb_rpt.acl_area_bak rename to acl_area;
+    alter table sqmdb_rpt.acl_client_bak rename to acl_client;
+    alter table sqmdb_rpt.acl_function_bak rename to acl_function;
+    alter table sqmdb_rpt.acl_operation_log_bak rename to acl_operation_log;
+    alter table sqmdb_rpt.acl_org_bak rename to acl_org;
+    alter table sqmdb_rpt.acl_role_bak rename to acl_role;
+    alter table sqmdb_rpt.acl_system_bak rename to acl_system;
+    alter table sqmdb_rpt.acl_top_user_bak rename to acl_top_user;
+    alter table sqmdb_rpt.acl_user_bak rename to acl_user;
+    alter table sqmdb_rpt.acl_user_function_bak rename to acl_user_function;
+    alter table sqmdb_rpt.acl_user_role_city_bak rename to acl_user_role_city;
+    alter table sqmdb_rpt.acl_verification_log_bak rename to acl_verification_log;
     ```
 
 3. 更新数据库文件

+ 54 - 1
pom.xml

@@ -17,7 +17,44 @@
         <skipTests>true</skipTests>
     </properties>
 
+    <repositories>
+        <repository>
+            <id>nexus-maven</id>
+            <name>nexus-maven</name>
+            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+        </repository>
+    </repositories>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>30.1.1-jre</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.squareup.okhttp3</groupId>
+                <artifactId>okhttp</artifactId>
+                <version>4.10.0</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>knife4j-dependencies</artifactId>
+                <version>4.0.0-SNAPSHOT</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
@@ -61,7 +98,6 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-csv</artifactId>
-            <version>1.9.0</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-ui -->
         <dependency>
@@ -69,7 +105,24 @@
             <artifactId>springdoc-openapi-ui</artifactId>
             <version>1.6.13</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/io.minio/minio -->
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.4.6</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.10</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
+        </dependency>
     </dependencies>
+
     <build>
         <finalName>aclTousu</finalName>
         <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>

+ 10 - 0
src/main/java/com/nokia/common/exception/BizException.java

@@ -0,0 +1,10 @@
+package com.nokia.common.exception;
+
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+public class BizException extends RuntimeException{
+    public BizException(String message) {
+        super(message);
+    }
+}

+ 22 - 0
src/main/java/com/nokia/common/exception/MyRuntimeException.java

@@ -0,0 +1,22 @@
+package com.nokia.common.exception;
+
+public class MyRuntimeException extends RuntimeException{
+    public MyRuntimeException() {
+    }
+
+    public MyRuntimeException(String message) {
+        super(message);
+    }
+
+    public MyRuntimeException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public MyRuntimeException(Throwable cause) {
+        super(cause);
+    }
+
+    public MyRuntimeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}

+ 42 - 0
src/main/java/com/nokia/config/MinioConfig.java

@@ -0,0 +1,42 @@
+package com.nokia.config;
+
+import io.minio.MinioClient;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+@ConfigurationProperties("minio")
+public class MinioConfig {
+    /**
+     * 对象存储服务的URL
+     */
+    private String endpoint;
+
+    /**
+     * 存储桶
+     */
+    private String bucket;
+
+    /**
+     * 访问标识
+     */
+    private String accessKey;
+
+    /**
+     * 密钥
+     */
+    private String secretKey;
+
+    /**
+     * 链接默认过期时间,分钟
+     */
+    private Integer expiry;
+
+    @Bean
+    public MinioClient minioClient() {
+        return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
+    }
+}

+ 9 - 1
src/main/java/com/nokia/config/web/ControllerExceptionHandler.java

@@ -1,7 +1,9 @@
 package com.nokia.config.web;
 
 import com.nokia.common.R;
+import com.nokia.common.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
 import org.springframework.beans.TypeMismatchException;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -70,10 +72,16 @@ public class ControllerExceptionHandler
         return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(R.error().message(e.getMessage()));
     }
 
+    @ExceptionHandler(BizException.class)
+    public ResponseEntity<Object> bizExceptionHandler(BizException e)
+    {
+        return ResponseEntity.ok().body(R.error(e.getMessage()));
+    }
+
     @ExceptionHandler(Exception.class)
     public ResponseEntity<Object> exceptionHandler(Exception e)
     {
         log.error("╭( ′• o •′ )╭☞ 发生错误了 {}", e.getMessage(), e);
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error());
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error("失败" + MDC.get("traceId")));
     }
 }

+ 65 - 0
src/main/java/com/nokia/controller/web/WebLogController.java

@@ -0,0 +1,65 @@
+package com.nokia.controller.web;
+
+import com.nokia.common.R;
+import com.nokia.service.LogService;
+import com.nokia.vo.*;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpSession;
+import javax.validation.Valid;
+
+@Tag(name = "日志")
+@RestController
+@RequestMapping("api/web/log")
+public class WebLogController {
+    private final LogService logService;
+
+    public WebLogController(LogService logService) {
+        this.logService = logService;
+    }
+
+    /**
+     * 查询操作日志列表
+     *
+     */
+    @Operation(summary = "查询操作日志列表")
+    @PostMapping("operationLog/list")
+    public R<PageVo<ListOperationLogVo>> listOperationLog(@Valid @RequestBody ListOperationLogDto dto) {
+        return logService.listOperationLog(dto);
+    }
+
+    /**
+     * 导出操作日志
+     *
+     */
+    @Operation(summary = "导出操作日志")
+    @PostMapping("operationLog/export")
+    public R<ExportOperationLogVo> exportOperationLog(@Valid @RequestBody ExportOperationLogDto dto, HttpSession session) {
+        return logService.exportOperationLog(dto, session);
+    }
+
+    /**
+     * 查询登录日志列表
+     *
+     */
+    @Operation(summary = "查询登录日志列表")
+    @PostMapping("verificationLog/list")
+    public R<PageVo<ListVerificationLogVo>> listVerificationLog(@Valid @RequestBody ListVerificationLogDto dto, HttpSession session) {
+        return logService.listVerificationLog(dto,session);
+    }
+
+    /**
+     * 导出登录日志
+     *
+     */
+    @Operation(summary = "导出登录日志")
+    @PostMapping("verificationLog/export")
+    public R<ExportVerificationLogVo> exportVerificationLog(@Valid @RequestBody ExportVerificationLogDto dto, HttpSession session) {
+        return logService.exportVerificationLog(dto, session);
+    }
+}

+ 2 - 2
src/main/java/com/nokia/dao/FunctionDao.java

@@ -22,13 +22,13 @@ public interface FunctionDao extends BaseMapper<Function> {
             "from sqmdb_rpt.acl_function af inner join sqmdb_rpt.acl_system as2 on af.\"system\" = as2.\"system\" " +
             "inner join sqmdb_rpt.acl_client ac on af.client = ac.client" +
             "<where> " +
-            "    <if test='dto.system'> " +
+            "    <if test=\"dto.system != null and dto.system != ''\"> " +
             "         af.\"system\" = #{dto.system} " +
             "    </if> " +
             "    <if test='dto.client'> " +
             "         and af.client = #{dto.client} " +
             "    </if> " +
-            "    <if test='dto.functionName'> " +
+            "    <if test=\"dto.functionName != null and dto.functionName != ''\"> " +
             "         and af.\"name\" like concat('%', #{dto.functionName}, '%') " +
             "    </if> " +
             "</where> " +

+ 5 - 4
src/main/java/com/nokia/dao/OperationLogDao.java

@@ -24,13 +24,13 @@ public interface OperationLogDao extends BaseMapper<OperationLog> {
             "    <if test='dto.operatorId'> " +
             "         operator_id = #{dto.operatorId} " +
             "    </if> " +
-            "    <if test='dto.operatorAccount'> " +
+            "    <if test=\"dto.operatorAccount != null and dto.operatorAccount != ''\"> " +
             "         and operator_account like concat(#{dto.operatorAccount}, '%') " +
             "    </if> " +
-            "    <if test='dto.operatorName'> " +
+            "    <if test=\"dto.operatorName != null and dto.operatorName != ''\"> " +
             "         and operator_name like concat(#{dto.operatorName}, '%') " +
             "    </if> " +
-            "    <if test='dto.operationName'> " +
+            "    <if test=\"dto.operationName != null and dto.operationName != ''\"> " +
             "         and operation_name like concat('%', #{dto.operationName}, '%') " +
             "    </if> " +
             "    <if test='dto.startTime'> " +
@@ -40,6 +40,7 @@ public interface OperationLogDao extends BaseMapper<OperationLog> {
             "         and operation_time <![CDATA[ <= ]]> #{dto.endTime} " +
             "    </if> " +
             "</where> " +
+            "order by operation_time desc " +
             "</script>")
-    List<ListOperationLogVo> listOperationLog(Page<ListOperationLogVo> page, ListOperationLogDto dto);
+    List<ListOperationLogVo> listOperationLog(Page<ListOperationLogVo> page, Object dto);
 }

+ 2 - 2
src/main/java/com/nokia/dao/RoleDao.java

@@ -21,10 +21,10 @@ public interface RoleDao extends BaseMapper<Role> {
             "select ar.role_name, ar.\"system\", ar.role_description, as2.system_name from sqmdb_rpt.acl_role ar " +
             "inner join sqmdb_rpt.acl_system as2 on ar.\"system\" = as2.\"system\" " +
             "<where> " +
-            "    <if test='dto.system'> " +
+            "    <if test=\"dto.system != null and dto.system != ''\"> " +
             "         ar.\"system\" = #{dto.system} " +
             "    </if> " +
-            "    <if test='dto.roleName'> " +
+            "    <if test=\"dto.roleName != null and dto.roleName != ''\"> " +
             "         and ar.role_name like concat('%', #{dto.roleName}, '%') " +
             "    </if> " +
             "</where> " +

+ 3 - 3
src/main/java/com/nokia/dao/UserDao.java

@@ -145,13 +145,13 @@ public interface UserDao extends BaseMapper<User> {
                 "left join sqmdb_rpt.acl_area aa2 on au.city_id = aa2.area_id " +
                 "left join sqmdb_rpt.acl_area aa3 on au.area_id = aa3.area_id " +
                 "where au.deleted = 0 " +
-                "<if test='dto.loginName'> " +
+                "<if test=\"dto.loginName != null and dto.loginName != ''\"> " +
                 "     and au.login_name like concat(#{dto.loginName}, '%') " +
                 "</if> " +
-                "<if test='dto.userName'> " +
+                "<if test=\"dto.userName != null and dto.userName != ''\"> " +
                 "     and au.user_name like concat(#{dto.userName}, '%') " +
                 "</if> " +
-                "<if test='dto.org'> " +
+                "<if test=\"dto.org != null and dto.org != ''\"> " +
                 "     and au.org like concat('%', #{dto.org}, '%') " +
                 "</if> " +
                 "<if test='dto.areaId'> " +

+ 5 - 5
src/main/java/com/nokia/dao/VerificationLogDao.java

@@ -3,7 +3,6 @@ package com.nokia.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.nokia.pojo.VerificationLog;
-import com.nokia.vo.ListVerificationLogDto;
 import com.nokia.vo.ListVerificationLogVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Select;
@@ -28,13 +27,13 @@ public interface VerificationLogDao extends BaseMapper<VerificationLog> {
             "<if test='dto.cityId'> " +
             "     and avl.city_id = #{dto.cityId} " +
             "</if> " +
-            "<if test='dto.system'> " +
+            "<if test=\"dto.system != null and dto.system != ''\"> " +
             "     and avl.\"system\" = #{dto.system} " +
             "</if> " +
-            "<if test='dto.loginName'> " +
+            "<if test=\"dto.loginName != null and dto.loginName != ''\"> " +
             "     and avl.login_name like concat(#{dto.loginName}, '%') " +
             "</if> " +
-            "<if test='dto.userName'> " +
+            "<if test=\"dto.userName != null and dto.userName != ''\"> " +
             "     and avl.user_name like concat(#{dto.userName}, '%') " +
             "</if> " +
             "<if test='dto.startTime'> " +
@@ -43,6 +42,7 @@ public interface VerificationLogDao extends BaseMapper<VerificationLog> {
             "<if test='dto.endTime'> " +
             "     and avl.login_time <![CDATA[ <= ]]> #{dto.endTime} " +
             "</if> " +
+            "order by avl.login_time desc" +
             "</script>")
-    List<ListVerificationLogVo> listVerificationLog(Page<ListVerificationLogVo> page, ListVerificationLogDto dto);
+    List<ListVerificationLogVo> listVerificationLog(Page<ListVerificationLogVo> page, Object dto);
 }

+ 148 - 0
src/main/java/com/nokia/service/LogService.java

@@ -0,0 +1,148 @@
+package com.nokia.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nokia.common.R;
+import com.nokia.common.exception.MyRuntimeException;
+import com.nokia.dao.OperationLogDao;
+import com.nokia.dao.VerificationLogDao;
+import com.nokia.pojo.UserRoleCity;
+import com.nokia.service.file.FileService;
+import com.nokia.vo.*;
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.servlet.http.HttpSession;
+import java.io.ByteArrayInputStream;
+import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.temporal.TemporalAdjusters;
+import java.util.List;
+
+@Service
+public class LogService {
+    private final OperationLogDao operationLogDao;
+    private final VerificationLogDao verificationLogDao;
+    private final UserService userService;
+    private final FileService fileService;
+    private final OperationLogService operationLogService;
+
+    public LogService(OperationLogDao operationLogDao, VerificationLogDao verificationLogDao, UserService userService,
+                      FileService fileService, OperationLogService operationLogService) {
+        this.operationLogDao = operationLogDao;
+        this.verificationLogDao = verificationLogDao;
+        this.userService = userService;
+        this.fileService = fileService;
+        this.operationLogService = operationLogService;
+    }
+
+    public R<PageVo<ListOperationLogVo>> listOperationLog(ListOperationLogDto dto) {
+        PageVo<ListOperationLogVo> vo = new PageVo<>();
+        Page<ListOperationLogVo> page = new Page<>(dto.getCurrent(), dto.getPageSize());
+        List<ListOperationLogVo> list = operationLogDao.listOperationLog(page, dto);
+        vo.setList(list);
+        vo.setTotal(page.getTotal());
+        return R.ok(vo);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public R<ExportOperationLogVo> exportOperationLog(ExportOperationLogDto dto, HttpSession session) {
+        // 时间范围为空默认当前月开始
+        if (dto.getStartTime() == null && dto.getEndTime() == null) {
+            dto.setStartTime(LocalDateTime.now().with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN));
+        }
+        // 查询操作日志
+        List<ListOperationLogVo> list = operationLogDao.listOperationLog(null, dto);
+        if (CollectionUtils.isEmpty(list)) {
+            return R.error("没有查询到数据");
+        }
+        try (ByteArrayOutputStream os = new ByteArrayOutputStream();
+             OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_8);
+             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT)) {
+            // 添加bom头避免excel乱码
+            osw.write('\ufeff');
+            printer.printRecord("操作时间", "账号", "用户名", "用户id", "操作名称", "操作内容");
+            for (ListOperationLogVo t : list) {
+                printer.printRecord(t.getOperationTime(), t.getOperatorAccount(), t.getOperatorName(),
+                        t.getOperatorId(), t.getOperationName(), t.getOperationContent());
+            }
+            printer.flush();
+            String object = fileService.generateFilename(".csv");
+            byte[] bytes = os.toByteArray();
+            long objectSize = bytes.length;
+            // 保存文件
+            fileService.putObject(object, new ByteArrayInputStream(bytes), objectSize);
+            // 生成下载链接
+            String url = fileService.getDownloadUrl(object);
+            // 记录操作日志
+            operationLogService.logOperation(session, "导出操作日志", "导出操作日志成功");
+            return R.ok(new ExportOperationLogVo(url));
+        } catch (Exception e) {
+            operationLogService.logOperation(session, "导出操作日志", "导出操作日志失败");
+            throw new MyRuntimeException(e);
+        }
+    }
+
+    public R<PageVo<ListVerificationLogVo>> listVerificationLog(ListVerificationLogDto dto, HttpSession session) {
+        UserRoleCity role = userService.getUserRoleCity(session);
+        Integer cityId = role.getCityId();
+        // 非河北省用户默认查询本地市
+        if (!cityId.equals(-1) && dto.getCityId() == null) {
+            dto.setCityId(cityId);
+        }
+        PageVo<ListVerificationLogVo> vo = new PageVo<>();
+        Page<ListVerificationLogVo> page = new Page<>(dto.getCurrent(), dto.getPageSize());
+        List<ListVerificationLogVo> list = verificationLogDao.listVerificationLog(page, dto);
+        vo.setList(list);
+        vo.setTotal(page.getTotal());
+        return R.ok(vo);
+    }
+
+    public R<ExportVerificationLogVo> exportVerificationLog(ExportVerificationLogDto dto, HttpSession session) {
+        // 时间范围为空默认当前月开始
+        if (dto.getStartTime() == null && dto.getEndTime() == null) {
+            dto.setStartTime(LocalDateTime.now().with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN));
+        }
+        UserRoleCity role = userService.getUserRoleCity(session);
+        Integer cityId = role.getCityId();
+        // 非河北省用户默认查询本地市
+        if (!cityId.equals(-1) && dto.getCityId() == null) {
+            dto.setCityId(cityId);
+        }
+        // 查询登录日志
+        List<ListVerificationLogVo> list = verificationLogDao.listVerificationLog(null, dto);
+        if (CollectionUtils.isEmpty(list)) {
+            return R.error("没有查询到数据");
+        }
+        try (ByteArrayOutputStream os = new ByteArrayOutputStream();
+             OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_8);
+             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT)) {
+            // 添加bom头避免excel乱码
+            osw.write('\ufeff');
+            printer.printRecord("登录时间", "账号", "用户名", "用户id", "地市", "登录系统");
+            for (ListVerificationLogVo t : list) {
+                printer.printRecord(t.getLoginTime(), t.getLoginName(), t.getUserName(),
+                        t.getUserId(), t.getCityName(), t.getSystemName());
+            }
+            printer.flush();
+            String object = fileService.generateFilename(".csv");
+            byte[] bytes = os.toByteArray();
+            long objectSize = bytes.length;
+            // 保存文件
+            fileService.putObject(object, new ByteArrayInputStream(bytes), objectSize);
+            // 生成下载链接
+            String url = fileService.getDownloadUrl(object);
+            // 记录操作日志
+            operationLogService.logOperation(session, "导出登录日志", "导出登录日志成功");
+            return R.ok(new ExportVerificationLogVo(url));
+        } catch (Exception e) {
+            operationLogService.logOperation(session, "导出登录日志", "导出登录日志失败");
+            throw new MyRuntimeException(e);
+        }
+    }
+}

+ 60 - 0
src/main/java/com/nokia/service/file/FileService.java

@@ -0,0 +1,60 @@
+package com.nokia.service.file;
+
+import cn.hutool.core.util.IdUtil;
+
+import java.io.InputStream;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public interface FileService {
+    /**
+     * 生成文件名
+     *
+     * @return {@link String}
+     */
+    default String generateFilename() {
+        return generateFilename("");
+    }
+
+    /**
+     * 生成文件名
+     *
+     * @param suffix 后缀
+     * @return {@link String}
+     */
+    default String generateFilename(String suffix) {
+        LocalDateTime now = LocalDateTime.now();
+        return now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth() + "/"
+                + IdUtil.fastSimpleUUID() + "-" + now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + suffix;
+    }
+
+    /**
+     * 获取下载地址
+     *
+     * @param object 对象名称
+     * @return {@link String}
+     */
+    String getDownloadUrl(String object);
+
+    /**
+     * 获取下载地址
+     *
+     * @param object   对象名称
+     * @param duration 过期时间
+     * @param unit     单位
+     * @return {@link String}
+     */
+    String getDownloadUrl(String object, int duration, TimeUnit unit);
+
+    /**
+     * 从流中上传数据到对象
+     *
+     * @param object     对象名称
+     * @param stream     流
+     * @param objectSize 对象大小
+     * @return {@link Map}<{@link String}, {@link Object}>
+     */
+    Map<String, Object> putObject(String object, InputStream stream, long objectSize);
+}

+ 101 - 0
src/main/java/com/nokia/service/file/MinioServiceImpl.java

@@ -0,0 +1,101 @@
+package com.nokia.service.file;
+
+import com.nokia.common.exception.MyRuntimeException;
+import com.nokia.config.MinioConfig;
+import io.minio.GetPresignedObjectUrlArgs;
+import io.minio.MinioClient;
+import io.minio.ObjectWriteResponse;
+import io.minio.PutObjectArgs;
+import io.minio.errors.*;
+import io.minio.http.Method;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Primary
+@Slf4j
+@Service
+public class MinioServiceImpl implements FileService {
+
+    private final MinioClient minioClient;
+    private final MinioConfig minioConfig;
+
+    public MinioServiceImpl(MinioClient minioClient, MinioConfig minioConfig) {
+        this.minioClient = minioClient;
+        this.minioConfig = minioConfig;
+    }
+
+    /**
+     * 获取下载地址
+     *
+     * @param object 对象名称
+     * @return {@link String}
+     */
+    @Override
+    public String getDownloadUrl(String object) {
+        return getDownloadUrl(object, minioConfig.getExpiry(), TimeUnit.MINUTES);
+    }
+
+    /**
+     * 获取下载地址
+     *
+     * @param object   对象名称
+     * @param duration 过期时间
+     * @param unit     单位
+     * @return {@link String}
+     */
+    @Override
+    public String getDownloadUrl(String object, int duration, TimeUnit unit) {
+        try {
+            return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
+                    .expiry(duration, unit)
+                    .bucket(minioConfig.getBucket())
+                    .object(object)
+                    .method(Method.GET)
+                    .build());
+        } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |
+                 InvalidResponseException | IOException | NoSuchAlgorithmException | XmlParserException |
+                 ServerException e) {
+            throw new MyRuntimeException(e);
+        }
+    }
+
+    /**
+     * 从流中上传数据到对象
+     *
+     * @param object     对象名称
+     * @param stream     流
+     * @param objectSize 对象大小
+     * @return {@link Map}<{@link String}, {@link Object}>
+     */
+    @Override
+    public Map<String, Object> putObject(String object, InputStream stream, long objectSize) {
+        try {
+            ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
+                    .bucket(minioConfig.getBucket())
+                    .object(object)
+                    .stream(stream, objectSize, -1)
+                    .build());
+            Map<String, Object> map = new HashMap<>();
+            map.put("object", response.object());
+            map.put("bucket", response.bucket());
+            map.put("etag", response.etag());
+            map.put("versionId", response.versionId());
+            map.put("headers", response.headers());
+            map.put("region", response.region());
+            return map;
+        } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |
+                 InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException |
+                 XmlParserException e) {
+            throw new MyRuntimeException(e);
+        }
+    }
+}

+ 3 - 3
src/main/java/com/nokia/vo/AddFunctionDto.java

@@ -12,13 +12,13 @@ import javax.validation.constraints.NotNull;
 @NoArgsConstructor
 @Data
 public class AddFunctionDto {
-    @Schema(description = "功能名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "功能名称", required = true)
     @NotBlank(message = "functionName不能为空")
     private String functionName;
-    @Schema(description = "系统id", requiredMode = Schema.RequiredMode.REQUIRED, example = "flow")
+    @Schema(description = "系统id", required = true, example = "flow")
     @NotBlank(message = "system不能为空")
     private String system;
-    @Schema(description = "客户端id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "客户端id", required = true)
     @NotNull(message = "client不能为空")
     private Integer client;
     @Schema(description = "app优先级")

+ 1 - 1
src/main/java/com/nokia/vo/AddUserDto.java

@@ -14,7 +14,7 @@ import java.util.List;
 @AllArgsConstructor
 @Data
 public class AddUserDto {
-    @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "zhangsan")
+    @Schema(description = "账号", required = true, example = "zhangsan")
     @NotBlank(message = "loginName不能为空")
     private String loginName;
     @Schema(description = "邮箱")

+ 4 - 4
src/main/java/com/nokia/vo/AddUserRoleDto.java

@@ -12,16 +12,16 @@ import javax.validation.constraints.NotNull;
 @AllArgsConstructor
 @Data
 public class AddUserRoleDto {
-    @Schema(description = "角色id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "角色id", required = true)
     @NotNull(message = "roleId不能为空")
     private Integer roleId;
-    @Schema(description = "地市id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "地市id", required = true)
     @NotNull(message = "cityId不能为空")
     private Integer cityId;
-    @Schema(description = "角色名称", example = "工单查询", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "角色名称", example = "工单查询", required = true)
     @NotBlank(message = "roleName不能为空")
     private String roleName;
-    @Schema(description = "地市名称", example = "石家庄市", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "地市名称", example = "石家庄市", required = true)
     @NotBlank(message = "cityName不能为空")
     private String cityName;
     @Schema(description = "功能id")

+ 2 - 2
src/main/java/com/nokia/vo/CopyRolesDto.java

@@ -13,10 +13,10 @@ import java.util.List;
 @AllArgsConstructor
 @Data
 public class CopyRolesDto {
-    @Schema(description = "用户id列表", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "用户id列表", required = true)
     @NotEmpty(message = "userIds不能为空")
     private List<Integer> userIds;
-    @Schema(description = "角色列表", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "角色列表", required = true)
     @NotEmpty(message = "roles不能为空")
     @Valid
     private List<AddUserRoleDto> roles;

+ 1 - 1
src/main/java/com/nokia/vo/DeleteFunctionDto.java

@@ -12,7 +12,7 @@ import java.util.List;
 @NoArgsConstructor
 @Data
 public class DeleteFunctionDto {
-    @Schema(description = "功能id列表", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "功能id列表", required = true)
     @NotEmpty(message = "functionIds不能为空")
     private List<Integer> functionIds;
 }

+ 1 - 1
src/main/java/com/nokia/vo/DeleteUserDto.java

@@ -12,7 +12,7 @@ import java.util.List;
 @AllArgsConstructor
 @Data
 public class DeleteUserDto {
-    @Schema(description = "用户id列表", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "用户id列表", required = true)
     @NotEmpty(message = "userIds不能为空")
     private List<Integer> userIds;
 }

+ 31 - 0
src/main/java/com/nokia/vo/ExportOperationLogDto.java

@@ -0,0 +1,31 @@
+package com.nokia.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Past;
+import javax.validation.constraints.PastOrPresent;
+import java.time.LocalDateTime;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class ExportOperationLogDto {
+    @Schema(description = "用户id")
+    private Integer operatorId;
+    @Schema(description = "账号", example = "zhangsan")
+    private String operatorAccount;
+    @Schema(description = "用户名", example = "张三")
+    private String operatorName;
+    @Schema(description = "操作名称", example = "修改用户")
+    private String operationName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Past(message = "startTime不能大于当前时间")
+    private LocalDateTime startTime;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @PastOrPresent(message = "endTime不能大于当前时间")
+    private LocalDateTime endTime;
+}

+ 14 - 0
src/main/java/com/nokia/vo/ExportOperationLogVo.java

@@ -0,0 +1,14 @@
+package com.nokia.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class ExportOperationLogVo {
+    @Schema(description = "导出文件链接")
+    private String url;
+}

+ 35 - 0
src/main/java/com/nokia/vo/ExportVerificationLogDto.java

@@ -0,0 +1,35 @@
+package com.nokia.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Past;
+import javax.validation.constraints.PastOrPresent;
+import java.time.LocalDateTime;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class ExportVerificationLogDto {
+    @Schema(description = "用户id")
+    private Integer userId;
+    @Schema(description = "账号", example = "zhangsan")
+    private String loginName;
+    @Schema(description = "用户名", example = "张三")
+    private String userName;
+    @Schema(description = "操作名称", example = "修改用户")
+    private String operationName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Past(message = "startTime不能大于当前时间")
+    private LocalDateTime startTime;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @PastOrPresent(message = "endTime不能大于当前时间")
+    private LocalDateTime endTime;
+    @Schema(description = "系统id", example = "flow")
+    private String system;
+    @Schema(description = "地区id")
+    private Integer cityId;
+}

+ 14 - 0
src/main/java/com/nokia/vo/ExportVerificationLogVo.java

@@ -0,0 +1,14 @@
+package com.nokia.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class ExportVerificationLogVo {
+    @Schema(description = "导出文件链接")
+    private String url;
+}

+ 1 - 1
src/main/java/com/nokia/vo/GetRoleByLoginNameDto.java

@@ -11,7 +11,7 @@ import javax.validation.constraints.NotBlank;
 @NoArgsConstructor
 @Data
 public class GetRoleByLoginNameDto {
-    @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "zhangsan")
+    @Schema(description = "账号", required = true, example = "zhangsan")
     @NotBlank(message = "loginName不能为空")
     private String loginName;
 }

+ 1 - 1
src/main/java/com/nokia/vo/GetUserDetailDto.java

@@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull;
 @AllArgsConstructor
 @Data
 public class GetUserDetailDto {
-    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "用户id", required = true)
     @NotNull(message = "userId不能为空")
     private Integer userId;
 }

+ 35 - 0
src/main/java/com/nokia/vo/ListOperationLogDto.java

@@ -0,0 +1,35 @@
+package com.nokia.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Past;
+import javax.validation.constraints.PastOrPresent;
+import java.time.LocalDateTime;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ListOperationLogDto extends PageDto {
+    @Schema(description = "用户id")
+    private Integer operatorId;
+    @Schema(description = "账号", example = "zhangsan")
+    private String operatorAccount;
+    @Schema(description = "用户名", example = "张三")
+    private String operatorName;
+    @Schema(description = "操作名称", example = "修改用户")
+    private String operationName;
+    @Schema(description = "起始时间", example = "2022-11-01 13:00:00")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Past(message = "startTime不能大于当前时间")
+    private LocalDateTime startTime;
+    @Schema(description = "截至时间", example = "2022-11-02 13:00:00")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @PastOrPresent(message = "endTime不能大于当前时间")
+    private LocalDateTime endTime;
+}

+ 27 - 0
src/main/java/com/nokia/vo/ListOperationLogVo.java

@@ -0,0 +1,27 @@
+package com.nokia.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class ListOperationLogVo {
+    @Schema(description = "用户id")
+    private Integer operatorId;
+    @Schema(description = "账号", example = "zhangsan")
+    private String operatorAccount;
+    @Schema(description = "用户名", example = "张三")
+    private String operatorName;
+    @Schema(description = "操作名称", example = "修改用户")
+    private String operationName;
+    @Schema(description = "操作内容")
+    private String operationContent;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime operationTime;
+}

+ 37 - 0
src/main/java/com/nokia/vo/ListVerificationLogDto.java

@@ -0,0 +1,37 @@
+package com.nokia.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Past;
+import javax.validation.constraints.PastOrPresent;
+import java.time.LocalDateTime;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ListVerificationLogDto extends PageDto {
+    @Schema(description = "用户id")
+    private Integer userId;
+    @Schema(description = "账号", example = "zhangsan")
+    private String loginName;
+    @Schema(description = "用户名", example = "张三")
+    private String userName;
+    @Schema(description = "起始时间", example = "2022-11-01 13:00:00")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Past(message = "startTime不能大于当前时间")
+    private LocalDateTime startTime;
+    @Schema(description = "截至时间", example = "2022-11-02 13:00:00")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @PastOrPresent(message = "endTime不能大于当前时间")
+    private LocalDateTime endTime;
+    @Schema(description = "系统id", example = "flow")
+    private String system;
+    @Schema(description = "地区id")
+    private Integer cityId;
+}

+ 27 - 0
src/main/java/com/nokia/vo/ListVerificationLogVo.java

@@ -0,0 +1,27 @@
+package com.nokia.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class ListVerificationLogVo {
+    @Schema(description = "用户id")
+    private Integer userId;
+    @Schema(description = "账号", example = "zhangsan")
+    private String loginName;
+    @Schema(description = "用户名", example = "张三")
+    private String userName;
+    @Schema(description = "地市名称", example = "石家庄市")
+    private String cityName;
+    @Schema(description = "系统名称", example = "流程")
+    private String systemName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime loginTime;
+}

+ 2 - 2
src/main/java/com/nokia/vo/PageDto.java

@@ -12,11 +12,11 @@ import javax.validation.constraints.NotNull;
 @NoArgsConstructor
 @Data
 public class PageDto {
-    @Schema(description = "页码,最小值1", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @Schema(description = "页码,最小值1", required = true, example = "1")
     @NotNull(message = "页码不能为空")
     @Range(min = 1, message = "页码错误")
     private Integer current;
-    @Schema(description = "每页个数,最小值1", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+    @Schema(description = "每页个数,最小值1", required = true, example = "10")
     @NotNull(message = "每页个数不能为空")
     @Range(min = 1, message = "每页个数错误")
     private Integer pageSize;

+ 3 - 3
src/main/java/com/nokia/vo/TokenVo.java

@@ -11,13 +11,13 @@ import java.io.Serializable;
  */
 @Data
 public class TokenVo implements Serializable {
-    @Schema(description = "token", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_token_hebei")
+    @Schema(description = "token", required = true, example = "test_token_hebei")
     @NotBlank(message = "token不能为空")
     private String token;
-    @Schema(description = "system", requiredMode = Schema.RequiredMode.REQUIRED, example = "web")
+    @Schema(description = "system", required = true, example = "web")
     @NotBlank(message = "system不能为空")
     private String system;
-    @Schema(description = "fromSystem", requiredMode = Schema.RequiredMode.REQUIRED, example = "test")
+    @Schema(description = "fromSystem", required = true, example = "test")
     @NotBlank(message = "fromSystem不能为空")
     private String fromSystem;
 }

+ 1 - 1
src/main/java/com/nokia/vo/TopUserDto.java

@@ -11,7 +11,7 @@ import javax.validation.constraints.NotBlank;
 @NoArgsConstructor
 @Data
 public class TopUserDto {
-    @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "zhangsan")
+    @Schema(description = "账号", required = true, example = "zhangsan")
     @NotBlank(message = "loginName不能为空")
     private String loginName;
 }

+ 1 - 1
src/main/java/com/nokia/vo/UpdateUserDto.java

@@ -17,7 +17,7 @@ public class UpdateUserDto {
     @Schema(description = "邮箱")
     @Email(message = "邮箱格式错误")
     private String email;
-    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "用户id", required = true)
     @NotNull(message = "userId不能为空")
     private Integer userId;
     @Schema(description = "角色列表")

+ 5 - 1
src/main/resources/application-product.properties

@@ -16,4 +16,8 @@ spring.redis.host=192.168.70.125
 spring.redis.port=6379
 spring.redis.database=0
 spring.redis.password=Richr00t
-redis.timeoutSeconds=600
+redis.timeoutSeconds=600
+# 关闭接口文档
+springdoc.api-docs.enabled=false
+springdoc.swagger-ui.enabled=false
+knife4j.production=true

+ 8 - 2
src/main/resources/application-test.properties

@@ -3,7 +3,7 @@ server.port=12128
 
 # log配置
 logging.level.root=info
-#logging.level.com.nokia=debug
+logging.level.com.nokia=debug
 
 # 测试环境数据库配置
 spring.datasource.driver-class-name=org.postgresql.Driver
@@ -16,4 +16,10 @@ spring.redis.host=192.168.70.125
 spring.redis.port=6379
 spring.redis.database=10
 spring.redis.password=Richr00t
-redis.timeoutSeconds=600
+redis.timeoutSeconds=600
+# minio配置
+minio.endpoint=http://192.168.50.3:19000
+minio.bucket=acl-tousu-test
+minio.accessKey=QBZSEFMteKaz69Sh
+minio.secretKey=6hNzjymqo3PCX7oQRQ8ESGePzK3b52Dc
+minio.expiry=15

+ 1 - 1
src/main/resources/application.properties

@@ -1,5 +1,5 @@
 # 启用的配置
-spring.profiles.active=product
+spring.profiles.active=test
 top.url=http://10.17.180.3/prod-api/verifySystem
 dop.url=http://10.17.180.5:8089/prod-api/verifySystem
 woyunwei.url=http://192.168.70.130:13000/PAOOS/aaaa/userservice/getUserInfo.do?method=findUserBySessionID&sessionID=