first commit

This commit is contained in:
冼子明 2025-03-21 23:51:45 +08:00
commit fbfb353aac
389 changed files with 60259 additions and 0 deletions

13
Dockerfile Normal file
View File

@ -0,0 +1,13 @@
# 基础镜像
FROM registry.cn-hangzhou.aliyuncs.com/wb_public/openjdk:8-jre
# author
MAINTAINER manager
# 复制jar文件到路径
ADD ./target/manager.jar ./
# 时间
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 启动服务
ENTRYPOINT ["java","-jar","/manager.jar"]
# 暴露端口
EXPOSE 8080

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 xian.zi.ming@qq.com fuck.vip
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

122
README.md Normal file
View File

@ -0,0 +1,122 @@
# solon-manager
## 介绍
基于Solon + Mybatis Plus + SaToken + Thymeleaf + Layui的后台管理系统
接入Sa-Token支持菜单权限
数据库支持 MySQL、Oracle、sqlServer 等主流数据库
提供代码生成器,基本增删改查无需编写,可快速完成开发任务。
后台接口RESTful 风格支持前后端分离可与app公用一套接口。
开发最精简,可当脚手架,适合你来 DIY
**如果喜欢,防止您迷路, 请尽快Star项目。多了您的支持更多了一份动力感谢~**
## 特征
- 后台接口RESTful 风格支持前后端分离可与app公用一套接口
- 采用RBAC的权限控制
- 统一响应结果封装及生成工具 统一异常处理
- 拥抱Sa-Token 实现角色权限认证,让鉴权变得简单、优雅!
- 使用 Solon 集成Druid数据库连接池与监控
- 集成MyBatis-Plus实现单表业务零SQL
- 集成国人风格的knife4j自动生成接口文档
- 提供代码生成器(MySQL、Oracle、sqlServer等主流数据库)生成从Html到Mapper爽歪歪
## 代码仓库 最新请移步gitee github定期同步
Gitee地址[https://gitee.com/uidoer/solon-manager](https://gitee.com/uidoer/solon-manager)
## 开发文档&项目演示
- 开发文档:[开发文档wiki](https://gitee.com/uidoer/solon-manager/wikis/pages)
- 演示地址:[solon-manager](http://1.94.23.145:9000/login)
- **账号密码admin/123456**
## 代码结构
```
├─main
│ ├─java
│ │ └─vip
│ │ └─fuck
│ │ └─sm
│ │ ├─CompanyProjectApplication.java 项目启动类
│ │ ├─common 公共资源,如注解、切面、全局异常处理、组件集成、通用工具类等
│ │ ├─controller Controler层
│ │ ├─entity 实体类
│ │ ├─mapper DAO层
│ │ ├─service Service层
│ │ │ └─impl Service层实现
│ └─resources
│ ├── app-dev.yml 开发环境配置文件
│ ├── app-test.yml 测试环境配置文件
│ ├── app-prod.yml 生产环境配置文件
│ ├── app.yml 通用配置文件
│ ├─mapper Mybatis XML文件
│ ├─static 静态文件
│ │ ├─css 通用css文件
│ │ ├─images 静态图片
│ │ ├─js 通用js文件
│ │ ├─layui layui库
│ │ └─layui-ext layui插件库
│ ├─template 代码生成模版
│ └─templates 项目页面目录
│ ├─depts 部门管理
│ ├─error 错误页面
│ ├─generator 代码生成管理
│ ├─logs 日志管理
│ ├─menus 菜单管理
│ ├─roles 角色管理
│ ├─syscontent 内容管理
│ ├─sysdict 字典管理
│ ├─sysfiles 文件管理
│ └─users 用户管理
└─test
└─java
└─vip
└─fuck
└─sm 单元测试
```
## 开发建议
- Model内成员变量建议与表字段数量对应如需扩展成员变量比如连表查询建议创建VO否则需在扩展的成员变量上加@TableField(exist = false)
- 建议业务失败直接使用throw new BusinessException("ErrorMessage")抛出,由统一异常处理器来封装业务失败的响应结果,会直接被封装为{"code":500002,"message":"ErrorMessage"}返回,尽情抛出;
- 数据库基础字段id(bigint)、remark(varchar)、unable_flag(tinyint)、deleted(tinyint)、create_id(bigint)、update_id(bigint)、create_time(datetime)、update_time(datetime)
## 使用说明
- 使用IDE导入本项目IDE需要安装lombok插件
- 创建数据库, 如mysql数据库导入mysql.sql
- 配置application-dev.yml中的数据库连接
- 运行项目
1. 直接运行CompanyProjectApplication.java
2. 项目根目录下执行mvn -X clean package -Dmaven.test.skip=true编译打包然后执行java -jar manager.jar
- 登录地址 http://localhost:8080/index/login 用户名密码:admin/123456
- 代码生成使用
1. 逻辑删除字段请统一用deleted字段: 0未删 1已删; 主键请统一格式: `id` varchar(50) 类型; 列名请勿使用数据库关键字
2. application.yml中配置 使用代码生成模块时 指定要生成的表存在于哪种数据库。project.database=mysql
3. 点击[代码生成]菜单,生成一个或多个表的代码,下载到本地
4. 解压下载的代码直接复制main文件夹到本地项目的src目录下
5. 数据库执行sql生成菜单
6. admin 刷新页面即刻查看
## 技术文档
* 核心框架:[Solon](https://spring.io/projects/spring-boot)
* 持久层框架:[MyBatis-Plus](https://mybatis.plus)
* 权限认证:[Sa-Token](https://sa-token.cc/doc.html#/)
* 前端框架: [Layui](https://layui.dev/docs/2/)
* 数据库连接池:[Alibaba Druid](https://github.com/alibaba/druid/)
* 模板引擎:[Thymeleaf](https://www.thymeleaf.org/)
* 阿里巴巴Java开发手册[最新版下载](https://github.com/alibaba/p3c)
## 参与贡献
1. Fork 本项目
2. 新建 feature_xxx 分支
3. 提交代码
4. 提交 Pull Request
## **效果图**
### 捐赠
> 项目的发展离不开您的支持, 如果您够宽裕,请作者喝杯咖啡吧!
### 交流群
> 如果大家有疑难杂症,技术交流, 可以加我拉你们进群, 务必备注: 开源
微信: www_fuck_vip

311
doc/mysql.sql Normal file
View File

@ -0,0 +1,311 @@
-- 部门
DROP TABLE IF EXISTS sys_dept;
CREATE TABLE sys_dept (
id varchar(64) NOT NULL COMMENT '主键',
dept_no varchar(18) DEFAULT NULL COMMENT '部门编号(规则:父级关系编码+自己的编码)',
name varchar(300) DEFAULT NULL COMMENT '部门名称',
pid varchar(64) NOT NULL COMMENT '父级id',
status tinyint(4) COMMENT '状态(1:正常0:弃用)',
relation_code varchar(3000) DEFAULT NULL COMMENT '为了维护更深层级关系',
dept_manager_id varchar(64) DEFAULT NULL COMMENT '部门经理user_id',
manager_name varchar(255) DEFAULT NULL COMMENT '部门经理名称',
phone varchar(20) DEFAULT NULL COMMENT '部门经理联系电话',
create_time datetime DEFAULT NULL COMMENT '创建时间',
update_time datetime DEFAULT NULL COMMENT '更新时间',
deleted tinyint(4) COMMENT '是否删除(1未删除0已删除)',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统部门';
-- 系统日志
DROP TABLE IF EXISTS sys_log;
CREATE TABLE sys_log (
id varchar(64) NOT NULL,
user_id varchar(64) DEFAULT NULL COMMENT '用户id',
username varchar(50) DEFAULT NULL COMMENT '用户名',
operation varchar(50) DEFAULT NULL COMMENT '用户操作',
time int(11) DEFAULT NULL COMMENT '响应时间',
method varchar(200) DEFAULT NULL COMMENT '请求方法',
params varchar(5000) DEFAULT NULL COMMENT '请求参数',
ip varchar(64) DEFAULT NULL COMMENT 'IP地址',
create_time datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统日志';
-- 菜单权限
DROP TABLE IF EXISTS sys_permission;
CREATE TABLE sys_permission (
id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',
name varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单权限名称',
perms varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '授权(多个用逗号分隔sys:user:add,sys:user:edit)',
icon varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标',
url varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '访问地址URL',
target varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'a target属性:_self _blank',
pid varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父级菜单权限名称',
order_num int(11) NULL COMMENT '排序',
type tinyint(4) NULL DEFAULT NULL COMMENT '菜单权限类型(1:目录;2:菜单;3:按钮)',
status tinyint(4) NULL COMMENT '状态1:正常 0禁用',
create_time datetime NULL DEFAULT NULL COMMENT '创建时间',
update_time datetime NULL DEFAULT NULL COMMENT '更新时间',
deleted tinyint(4) NULL COMMENT '是否删除(1未删除0已删除)',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统权限' ROW_FORMAT = Compact;
-- 角色
DROP TABLE IF EXISTS sys_role;
CREATE TABLE sys_role (
id varchar(64) NOT NULL COMMENT '主键',
name varchar(255) DEFAULT NULL COMMENT '角色名称',
description varchar(300) DEFAULT NULL,
status tinyint(4) COMMENT '状态(1:正常0:弃用)',
create_time datetime DEFAULT NULL COMMENT '创建时间',
update_time datetime DEFAULT NULL COMMENT '更新时间',
deleted tinyint(4) COMMENT '是否删除(1未删除0已删除)',
data_scope int COMMENT '数据范围1所有 2自定义 3 本部门及以下部门 4仅本部门 5:自己)',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统角色';
-- 角色部门
DROP TABLE IF EXISTS sys_role_dept;
CREATE TABLE sys_role_dept (
id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',
role_id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id',
dept_id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id',
create_time datetime NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色部门' ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
-- 角色权限关联
DROP TABLE IF EXISTS sys_role_permission;
CREATE TABLE sys_role_permission (
id varchar(64) NOT NULL COMMENT '主键',
role_id varchar(64) DEFAULT NULL COMMENT '角色id',
permission_id varchar(64) DEFAULT NULL COMMENT '菜单权限id',
create_time datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 用户表
DROP TABLE IF EXISTS sys_user;
CREATE TABLE sys_user (
id varchar(64) NOT NULL COMMENT '用户id',
username varchar(50) NOT NULL COMMENT '账户名称',
salt varchar(20) DEFAULT NULL COMMENT '加密盐值',
password varchar(200) NOT NULL COMMENT '用户密码密文',
phone varchar(20) DEFAULT NULL COMMENT '手机号码',
dept_id varchar(64) DEFAULT NULL COMMENT '部门id',
real_name varchar(60) DEFAULT NULL COMMENT '真实名称',
nick_name varchar(60) DEFAULT NULL COMMENT '昵称',
email varchar(50) DEFAULT NULL COMMENT '邮箱(唯一)',
status tinyint(4) COMMENT '账户状态(1.正常 0.锁定 )',
sex tinyint(4) COMMENT '性别(1.男 2.女)',
deleted tinyint(4) COMMENT '是否删除(1未删除0已删除)',
create_id varchar(64) DEFAULT NULL COMMENT '创建人',
update_id varchar(64) DEFAULT NULL COMMENT '更新人',
create_where tinyint(4) COMMENT '创建来源(1.web 2.android 3.ios )',
create_time datetime DEFAULT NULL COMMENT '创建时间',
update_time datetime DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统用户';
-- 用户角色关联表
DROP TABLE IF EXISTS sys_user_role;
CREATE TABLE sys_user_role (
id varchar(64) NOT NULL COMMENT '用户id',
user_id varchar(64) DEFAULT NULL,
role_id varchar(64) DEFAULT NULL COMMENT '角色id',
create_time datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统用户角色';
-- 数据字典表
DROP TABLE IF EXISTS sys_dict;
CREATE TABLE sys_dict (
id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
name varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典名称',
remark varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',
create_time datetime NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据字典表' ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
-- 数据字典详情
DROP TABLE IF EXISTS sys_dict_detail;
CREATE TABLE sys_dict_detail (
id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
label varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典标签',
value varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典值',
sort smallint(6) NULL DEFAULT NULL COMMENT '排序',
dict_id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典id',
create_time datetime NULL DEFAULT NULL COMMENT '创建日期',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据字典详情' ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
-- 2020.5.27添加文章管理
DROP TABLE IF EXISTS sys_content;
CREATE TABLE sys_content (
id varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键',
title varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '标题',
one_img varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '单图url',
multiple_img varchar(500) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '多图url',
keywords varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '关键字',
type int(11) DEFAULT NULL COMMENT '文章类型',
content longtext CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT '内容',
create_time datetime NULL DEFAULT NULL COMMENT '创建时间',
create_id varchar(50) NULL DEFAULT NULL COMMENT '创建人',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '文章管理' ROW_FORMAT = Compact;
-- 2020.6.15添加文件管理
DROP TABLE IF EXISTS sys_files;
CREATE TABLE sys_files (
id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
url varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'URL地址',
create_date datetime NULL DEFAULT NULL COMMENT '创建时间',
file_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称',
file_path varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文件上传' ROW_FORMAT = Compact;
-- 初始数据
INSERT INTO sys_dept(id, dept_no, name, pid, status, relation_code, dept_manager_id, manager_name, phone, deleted) VALUES ('1', 'D000001', '总公司', '0', 1, 'D000001', NULL, '小李', '13888888888', 1);
INSERT INTO sys_permission VALUES ('1', '删除', 'sysGenerator:delete', NULL, 'sysGenerator/delete', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('10', '赋予角色', 'sys:user:role:update', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('11', '菜单权限管理', NULL, NULL, 'index/menus', '_self', '51', 98, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('12', '列表', 'sys:dept:list', NULL, 'sys/depts', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('13', '删除', 'sys:role:deleted', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('1311115974068449281', '数据权限', 'sys:role:bindDept', '', 'sys/role/bindDept', '_self', '53', 5, 3, 1, '2020-09-30 09:29:42', NULL, 1);
INSERT INTO sys_permission VALUES ('15', '代码生成', NULL, NULL, 'index/sysGenerator', '_self', '54', 1, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('16', '列表', 'sysGenerator:list', NULL, 'sysGenerator/listByPage', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('17', '详情', 'sys:permission:detail', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('19', '列表', 'sys:role:list', NULL, 'sys/roles', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('2', 'SQL 监控', '', '', 'druid/sql.html', '_self', '21', 98, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:59', 1);
INSERT INTO sys_permission VALUES ('20', '修改', 'sysGenerator:update', NULL, 'sysGenerator/update', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('21', '其他', NULL, 'layui-icon-list', NULL, NULL, '0', 200, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('22', '详情', 'sys:dept:detail', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('23', '列表', 'sys:user:list', NULL, 'sys/users', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('24', '用户管理', NULL, NULL, 'index/users', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('25', '详情', 'sys:user:detail', NULL, 'sys/user/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('26', '删除', 'sys:permission:deleted', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('27', '文件管理', '', '', 'index/sysFiles', '_self', '54', 10, 2, 1, NULL, '2020-06-15 16:00:29', 1);
INSERT INTO sys_permission VALUES ('28', '列表', 'sysFiles:list', NULL, 'sysFiles/listByPage', NULL, '27', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('29', '新增', 'sysFiles:add', NULL, 'sysFiles/add', NULL, '27', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('3', '新增', 'sys:role:add', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('30', '删除', 'sysFiles:delete', NULL, 'sysFiles/delete', NULL, '27', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('31', '文章管理', NULL, NULL, 'index/sysContent', '_self', '54', 10, 2, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('32', '列表', 'sysContent:list', NULL, 'sysContent/listByPage', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('33', '新增', 'sysContent:add', NULL, 'sysContent/add', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('34', '修改', 'sysContent:update', NULL, 'sysContent/update', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('35', '删除', 'sysContent:delete', NULL, 'sysContent/delete', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('36', '更新', 'sys:role:update', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('38', '更新', 'sys:dept:update', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('39', '详情', 'sys:role:detail', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('4', '添加', 'sysGenerator:add', NULL, 'sysGenerator/add', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('40', '编辑', 'sys:permission:update', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('41', '部门管理', NULL, NULL, 'index/depts', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('42', '新增', 'sys:user:add', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('43', '列表', 'sys:permission:list', NULL, 'sys/permissions', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('44', '新增', 'sys:permission:add', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('45', '字典管理', NULL, '', 'index/sysDict', NULL, '54', 10, 2, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('46', '列表', 'sysDict:list', NULL, 'sysDict/listByPage', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('47', '新增', 'sysDict:add', NULL, 'sysDict/add', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('48', '修改', 'sysDict:update', NULL, 'sysDict/update', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('49', '删除', 'sysDict:delete', NULL, 'sysDict/delete', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('5', '删除', 'sys:dept:deleted', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('50', '表单构建', '', '', 'index/build', '_self', '21', 1, 2, 1, '2020-04-22 13:09:41', '2020-05-07 13:36:47', 1);
INSERT INTO sys_permission VALUES ('51', '组织管理', NULL, 'layui-icon-user', NULL, NULL, '0', 1, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('52', '拥有角色', 'sys:user:role:detail', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('53', '角色管理', NULL, NULL, 'index/roles', '_self', '51', 99, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('54', '系统管理', NULL, 'layui-icon-set-fill', NULL, NULL, '0', 98, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('56', '更新', 'sys:user:update', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('57', '删除', 'sys:user:deleted', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('58', '删除', 'sys:log:deleted', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('6', '接口管理', '', '', 'doc.html', '_blank', '21', 100, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:02', 1);
INSERT INTO sys_permission VALUES ('7', '列表', 'sys:log:list', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('8', '日志管理', NULL, NULL, 'index/logs', '_self', '54', 97, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('9', '新增', 'sys:dept:add', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_role(id, name, description, status, create_time, update_time, deleted) VALUES ('1', '超级管理员', '拥有所有权限-不能删除', 1, '2019-11-01 19:26:29', '2020-03-19 13:29:51', 1);
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('1', '1', '1', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('10', '1', '10', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('11', '1', '11', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('12', '1', '12', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('13', '1', '13', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('14', '1', '14', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('15', '1', '15', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('16', '1', '16', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('17', '1', '17', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('18', '1', '18', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('19', '1', '19', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('2', '1', '2', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('20', '1', '20', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('21', '1', '21', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('22', '1', '22', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('23', '1', '23', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('24', '1', '24', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('25', '1', '25', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('26', '1', '26', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('27', '1', '27', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('28', '1', '28', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('29', '1', '29', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('3', '1', '3', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('30', '1', '30', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('31', '1', '31', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('32', '1', '32', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('33', '1', '33', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('34', '1', '34', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('35', '1', '35', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('36', '1', '36', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('38', '1', '38', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('39', '1', '39', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('4', '1', '4', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('40', '1', '40', '2020-06-15 15:21:17');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('41', '1', '41', '2020-06-15 15:21:17');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('42', '1', '42', '2020-06-15 15:21:17');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('43', '1', '43', '2020-06-15 15:21:17');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('44', '1', '44', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('45', '1', '45', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('46', '1', '46', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('47', '1', '47', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('48', '1', '48', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('49', '1', '49', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('5', '1', '5', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('50', '1', '50', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('51', '1', '51', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('52', '1', '52', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('53', '1', '53', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('54', '1', '54', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('55', '1', '55', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('56', '1', '56', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('57', '1', '57', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('58', '1', '58', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('6', '1', '6', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('60', '1', '60', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('61', '1', '61', '2020-05-26 14:21:56');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('62', '1', '62', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('63', '1', '63', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('7', '1', '7', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('8', '1', '8', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('9', '1', '9', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('1311116066716430339', '1', '1311115974068449281', '2020-09-30 09:30:04');
INSERT INTO sys_user(id, username, salt, password, phone, dept_id, real_name, nick_name, email, status, sex, deleted, create_id, update_id, create_where, create_time, update_time) VALUES ('1', 'admin', '324ce32d86224b00a02b', '2102b59a75ab87616b62d0b9432569d0', '13888888888', '1', '爱糖宝', '爱糖宝', 'xxxxxx@163.com', 1, 2, 1, '1', '1', 3, '2019-09-22 19:38:05', '2020-03-18 09:15:22');
INSERT INTO sys_user_role(id, user_id, role_id, create_time) VALUES ('1', '1', '1', '2020-03-19 02:23:13');
INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242690', 'sex', '性别', '2020-04-30 17:24:09');
INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242691', 'content_keyword', '关键字', '2020-04-30 17:24:09');
INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1282504369620430849', 'content_type', '文章类型略略略', '2020-07-13 10:37:24');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790073535885314', '', '1', 1, '1255790029680242690', '2020-04-30 17:24:19');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790100115189761', '', '2', 2, '1255790029680242690', '2020-04-30 17:24:25');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504475715350530', '诗词', '1', 1, '1282504369620430849', '2020-07-13 10:37:49');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504651729317889', '散文', '2', 2, '1282504369620430849', '2020-07-13 10:38:31');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842369', '剧本', '3', 3, '1282504369620430849', '2020-07-14 09:15:01');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842370', 'java', '1', 1, '1255790029680242691', '2020-07-14 09:15:01');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842371', 'mysql', '2', 2, '1255790029680242691', '2020-07-14 09:15:01');

302
doc/oracle.sql Normal file
View File

@ -0,0 +1,302 @@
-- 部门
CREATE TABLE sys_dept (
id varchar2(64),
dept_no varchar2(64),
name varchar2(64),
pid varchar2(64),
status NUMBER(10, 0),
relation_code varchar2(3000),
dept_manager_id varchar2(64),
manager_name varchar2(255),
phone varchar2(20),
create_time date,
update_time date,
deleted NUMBER(10, 0),
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_dept IS '部门';
-- 日志
CREATE TABLE sys_log (
id varchar2(64),
user_id varchar2(64),
username varchar2(50),
operation varchar2(50),
time NUMBER(10, 0),
method varchar2(200),
params varchar2(1000),
ip varchar2(64),
create_time date,
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_log IS '日志';
-- 菜单权限
CREATE TABLE sys_permission (
id varchar2(64) ,
name varchar2(300),
perms varchar2(500) ,
icon varchar2(255),
url varchar2(100),
target varchar2(50),
pid varchar2(64),
order_num NUMBER(10, 0),
type NUMBER(10, 0),
status NUMBER(10, 0),
create_time date,
update_time date,
deleted NUMBER(10, 0),
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_permission IS '菜单权限';
-- 角色
CREATE TABLE sys_role (
id varchar2(64),
name varchar2(255),
description varchar2(255),
status NUMBER(10, 0),
create_time date,
update_time date,
deleted NUMBER(10, 0),
data_scope NUMBER(10, 0),
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_role IS '角色';
-- 角色权限关联表
CREATE TABLE sys_role_permission (
id varchar2(64) ,
role_id varchar2(64),
permission_id varchar2(64),
create_time date,
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_role_permission IS '角色权限关联表';
-- 角色部门关联表
CREATE TABLE sys_role_dept (
id varchar2(64) ,
role_id varchar2(64),
dept_id varchar2(64),
create_time date,
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_role_permission IS '角色部门关联表';
-- 用户
CREATE TABLE sys_user (
id varchar2(64),
username varchar2(50),
salt varchar2(20),
password varchar2(200),
phone varchar2(20),
dept_id varchar2(64),
real_name varchar2(60),
nick_name varchar2(60),
email varchar2(50),
status NUMBER(10, 0),
sex NUMBER(10, 0),
deleted NUMBER(10, 0),
create_id varchar2(64),
update_id varchar2(64),
create_where NUMBER(10, 0) DEFAULT 1,
create_time date,
update_time date,
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_user IS '用户';
-- 用户角色
CREATE TABLE sys_user_role (
id varchar2(64),
user_id varchar2(64),
role_id varchar2(64),
create_time date,
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_user_role IS '用户角色';
-- 数据字典
CREATE TABLE sys_dict (
id varchar2(64) ,
name varchar2(100) ,
remark varchar2(255) ,
create_time date,
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_dict IS '数据字典';
-- 数据字典明细
CREATE TABLE sys_dict_detail (
id varchar2(50) ,
label varchar2(255) ,
value varchar2(255) ,
sort NUMBER(10, 0) ,
dict_id varchar2(50) ,
create_time date,
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_dict_detail IS '数据字典明细';
-- 文章管理
CREATE TABLE sys_content (
id varchar2(50),
title varchar2(255),
one_img varchar2(255),
multiple_img varchar2(500),
keywords varchar2(255),
type NUMBER(10, 0),
content VARCHAR2(4000) ,
create_time date ,
create_id varchar2(50) ,
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_content IS '文章管理';
-- 文件管理
CREATE TABLE sys_files (
id varchar2(50) ,
url varchar2(200),
create_date date ,
file_name varchar2(255),
file_path varchar2(255) ,
PRIMARY KEY (id)
);
COMMENT ON TABLE sys_files IS '文件管理';
-- 初始数据
INSERT INTO sys_dept(id, dept_no, name, pid, status, relation_code, dept_manager_id, manager_name, phone, deleted) VALUES ('1', 'D000001', '总公司', '0', 1, 'D000001', NULL, '小李', '13888888888', 1);
INSERT INTO sys_permission VALUES ('1', '删除', 'sysGenerator:delete', NULL, 'sysGenerator/delete', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('10', '赋予角色', 'sys:user:role:update', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('11', '菜单权限管理', NULL, NULL, 'index/menus', '_self', '51', 98, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('12', '列表', 'sys:dept:list', NULL, 'sys/depts', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('13', '删除', 'sys:role:deleted', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('1311115974068449281', '数据权限', 'sys:role:bindDept', '', 'sys/role/bindDept', '_self', '53', 5, 3, 1, '2020-09-30 09:29:42', NULL, 1);
INSERT INTO sys_permission VALUES ('15', '代码生成', NULL, NULL, 'index/sysGenerator', '_self', '54', 1, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('16', '列表', 'sysGenerator:list', NULL, 'sysGenerator/listByPage', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('17', '详情', 'sys:permission:detail', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('19', '列表', 'sys:role:list', NULL, 'sys/roles', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('2', 'SQL 监控', '', '', 'druid/sql.html', '_self', '21', 98, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:59', 1);
INSERT INTO sys_permission VALUES ('20', '修改', 'sysGenerator:update', NULL, 'sysGenerator/update', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('21', '其他', NULL, 'layui-icon-list', NULL, NULL, '0', 200, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('22', '详情', 'sys:dept:detail', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('23', '列表', 'sys:user:list', NULL, 'sys/users', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('24', '用户管理', NULL, NULL, 'index/users', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('25', '详情', 'sys:user:detail', NULL, 'sys/user/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('26', '删除', 'sys:permission:deleted', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('27', '文件管理', '', '', 'index/sysFiles', '_self', '54', 10, 2, 1, NULL, '2020-06-15 16:00:29', 1);
INSERT INTO sys_permission VALUES ('28', '列表', 'sysFiles:list', NULL, 'sysFiles/listByPage', NULL, '27', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('29', '新增', 'sysFiles:add', NULL, 'sysFiles/add', NULL, '27', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('3', '新增', 'sys:role:add', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('30', '删除', 'sysFiles:delete', NULL, 'sysFiles/delete', NULL, '27', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('31', '文章管理', NULL, NULL, 'index/sysContent', '_self', '54', 10, 2, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('32', '列表', 'sysContent:list', NULL, 'sysContent/listByPage', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('33', '新增', 'sysContent:add', NULL, 'sysContent/add', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('34', '修改', 'sysContent:update', NULL, 'sysContent/update', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('35', '删除', 'sysContent:delete', NULL, 'sysContent/delete', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('36', '更新', 'sys:role:update', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('38', '更新', 'sys:dept:update', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('39', '详情', 'sys:role:detail', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('4', '添加', 'sysGenerator:add', NULL, 'sysGenerator/add', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('40', '编辑', 'sys:permission:update', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('41', '部门管理', NULL, NULL, 'index/depts', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('42', '新增', 'sys:user:add', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('43', '列表', 'sys:permission:list', NULL, 'sys/permissions', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('44', '新增', 'sys:permission:add', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('45', '字典管理', NULL, '', 'index/sysDict', NULL, '54', 10, 2, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('46', '列表', 'sysDict:list', NULL, 'sysDict/listByPage', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('47', '新增', 'sysDict:add', NULL, 'sysDict/add', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('48', '修改', 'sysDict:update', NULL, 'sysDict/update', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('49', '删除', 'sysDict:delete', NULL, 'sysDict/delete', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('5', '删除', 'sys:dept:deleted', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('50', '表单构建', '', '', 'index/build', '_self', '21', 1, 2, 1, '2020-04-22 13:09:41', '2020-05-07 13:36:47', 1);
INSERT INTO sys_permission VALUES ('51', '组织管理', NULL, 'layui-icon-user', NULL, NULL, '0', 1, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('52', '拥有角色', 'sys:user:role:detail', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('53', '角色管理', NULL, NULL, 'index/roles', '_self', '51', 99, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('54', '系统管理', NULL, 'layui-icon-set-fill', NULL, NULL, '0', 98, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('56', '更新', 'sys:user:update', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('57', '删除', 'sys:user:deleted', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('58', '删除', 'sys:log:deleted', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('6', '接口管理', '', '', 'doc.html', '_blank', '21', 100, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:02', 1);
INSERT INTO sys_permission VALUES ('7', '列表', 'sys:log:list', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('8', '日志管理', NULL, NULL, 'index/logs', '_self', '54', 97, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('9', '新增', 'sys:dept:add', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_role(id, name, description, status, deleted) VALUES ('1', '超级管理员', '拥有所有权限-不能删除', 1, 1);
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('1', '1', '1');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('10', '1', '10');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('11', '1', '11');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('12', '1', '12');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('13', '1', '13');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('14', '1', '14');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('15', '1', '15');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('16', '1', '16');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('17', '1', '17');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('18', '1', '18');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('19', '1', '19');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('2', '1', '2');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('20', '1', '20');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('21', '1', '21');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('22', '1', '22');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('23', '1', '23');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('24', '1', '24');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('25', '1', '25');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('26', '1', '26');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('27', '1', '27');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('28', '1', '28');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('29', '1', '29');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('3', '1', '3');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('30', '1', '30');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('31', '1', '31');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('32', '1', '32');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('33', '1', '33');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('34', '1', '34');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('35', '1', '35');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('36', '1', '36');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('38', '1', '38');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('39', '1', '39');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('4', '1', '4');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('40', '1', '40');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('41', '1', '41');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('42', '1', '42');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('43', '1', '43');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('44', '1', '44');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('45', '1', '45');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('46', '1', '46');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('47', '1', '47');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('48', '1', '48');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('49', '1', '49');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('5', '1', '5');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('50', '1', '50');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('51', '1', '51');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('52', '1', '52');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('53', '1', '53');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('54', '1', '54');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('55', '1', '55');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('56', '1', '56');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('57', '1', '57');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('58', '1', '58');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('6', '1', '6');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('60', '1', '60');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('61', '1', '61');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('62', '1', '62');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('63', '1', '63');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('7', '1', '7');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('8', '1', '8');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('9', '1', '9');
INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('1311116066716430339', '1', '1311115974068449281');
INSERT INTO sys_user(id, username, salt, password, phone, dept_id, real_name, nick_name, email, status, sex, deleted, create_id, update_id, create_where) VALUES ('1', 'admin', '324ce32d86224b00a02b', '2102b59a75ab87616b62d0b9432569d0', '13888888888', '1', '爱糖宝', '爱糖宝', 'xxxxxx@163.com', 1, 2, 1, '1', '1', 3);
INSERT INTO sys_user_role(id, user_id, role_id) VALUES ('1', '1', '1');
INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242690', 'sex', '性别', '2020-04-30 17:24:09');
INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242691', 'content_keyword', '关键字', '2020-04-30 17:24:09');
INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1282504369620430849', 'content_type', '文章类型略略略', '2020-07-13 10:37:24');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790073535885314', '', '1', 1, '1255790029680242690', '2020-04-30 17:24:19');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790100115189761', '', '2', 2, '1255790029680242690', '2020-04-30 17:24:25');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504475715350530', '诗词', '1', 1, '1282504369620430849', '2020-07-13 10:37:49');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504651729317889', '散文', '2', 2, '1282504369620430849', '2020-07-13 10:38:31');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842369', '剧本', '3', 3, '1282504369620430849', '2020-07-14 09:15:01');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842370', 'java', '1', 1, '1255790029680242691', '2020-07-14 09:15:01');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842371', 'mysql', '2', 2, '1255790029680242691', '2020-07-14 09:15:01');

295
doc/sqlServer.sql Normal file
View File

@ -0,0 +1,295 @@
-- 部门
CREATE TABLE sys_dept (
id varchar(64),
dept_no varchar(64),
name varchar(64),
pid varchar(64),
status int,
relation_code varchar(3000),
dept_manager_id varchar(64),
manager_name varchar(255),
phone varchar(20),
create_time datetime,
update_time datetime,
deleted int,
PRIMARY KEY (id)
);
-- 日志
CREATE TABLE sys_log (
id varchar(64),
user_id varchar(64),
username varchar(50),
operation varchar(50),
time int,
method varchar(200),
params varchar(1000),
ip varchar(64),
create_time datetime,
PRIMARY KEY (id)
);
-- 菜单权限
CREATE TABLE sys_permission (
id varchar(64) ,
name varchar(300),
perms varchar(500) ,
icon varchar(255),
url varchar(100),
target varchar(50),
pid varchar(64),
order_num int,
type int,
status int,
create_time datetime,
update_time datetime,
deleted int,
PRIMARY KEY (id)
);
-- 角色
CREATE TABLE sys_role (
id varchar(64),
name varchar(255),
description varchar(255),
status int,
create_time datetime,
update_time datetime,
deleted int,
data_scope int,
PRIMARY KEY (id)
);
-- 角色部门关联表
CREATE TABLE sys_role_dept (
id varchar(64) ,
role_id varchar(64),
dept_id varchar(64),
create_time datetime,
PRIMARY KEY (id)
);
-- 角色权限关联表
CREATE TABLE sys_role_permission (
id varchar(64) ,
role_id varchar(64),
permission_id varchar(64),
create_time datetime,
PRIMARY KEY (id)
);
-- 用户
CREATE TABLE sys_user (
id varchar(64),
username varchar(50),
salt varchar(20),
password varchar(200),
phone varchar(20),
dept_id varchar(64),
real_name varchar(60),
nick_name varchar(60),
email varchar(50),
status int,
sex int,
deleted int,
create_id varchar(64),
update_id varchar(64),
create_where int DEFAULT 1,
create_time datetime,
update_time datetime,
PRIMARY KEY (id)
);
-- 用户角色
CREATE TABLE sys_user_role (
id varchar(64),
user_id varchar(64),
role_id varchar(64),
create_time datetime,
PRIMARY KEY (id)
);
-- 数据字典
CREATE TABLE sys_dict (
id varchar(64) ,
name varchar(100) ,
remark varchar(255) ,
create_time datetime,
PRIMARY KEY (id)
);
-- 数据字典明细
CREATE TABLE sys_dict_detail (
id varchar(50) ,
label varchar(255) ,
value varchar(255) ,
sort int ,
dict_id varchar(50) ,
create_time datetime,
PRIMARY KEY (id)
);
-- 文章管理
CREATE TABLE sys_content (
id varchar(50),
title varchar(255),
one_img varchar(255),
multiple_img varchar(500),
keywords varchar(255),
type int,
content varchar(4000) ,
create_time datetime ,
create_id varchar(50) ,
PRIMARY KEY (id)
);
-- 文件管理
CREATE TABLE sys_files (
id varchar(50) ,
url varchar(200),
create_date datetime ,
file_name varchar(255),
file_path varchar(255) ,
PRIMARY KEY (id)
);
-- 初始数据
-- 初始数据
INSERT INTO sys_dept(id, dept_no, name, pid, status, relation_code, dept_manager_id, manager_name, phone, create_time, update_time, deleted) VALUES ('1', 'D000001', '总公司', '0', 1, 'D000001', NULL, '小李', '13888888888', '2019-11-07 22:43:33', NULL, 1);
INSERT INTO sys_permission VALUES ('1', '删除', 'sysGenerator:delete', NULL, 'sysGenerator/delete', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('10', '赋予角色', 'sys:user:role:update', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('11', '菜单权限管理', NULL, NULL, 'index/menus', '_self', '51', 98, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('12', '列表', 'sys:dept:list', NULL, 'sys/depts', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('13', '删除', 'sys:role:deleted', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('1311115974068449281', '数据权限', 'sys:role:bindDept', '', 'sys/role/bindDept', '_self', '53', 5, 3, 1, '2020-09-30 09:29:42', NULL, 1);
INSERT INTO sys_permission VALUES ('15', '代码生成', NULL, NULL, 'index/sysGenerator', '_self', '54', 1, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('16', '列表', 'sysGenerator:list', NULL, 'sysGenerator/listByPage', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('17', '详情', 'sys:permission:detail', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('19', '列表', 'sys:role:list', NULL, 'sys/roles', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('2', 'SQL 监控', '', '', 'druid/sql.html', '_self', '21', 98, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:59', 1);
INSERT INTO sys_permission VALUES ('20', '修改', 'sysGenerator:update', NULL, 'sysGenerator/update', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('21', '其他', NULL, 'layui-icon-list', NULL, NULL, '0', 200, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('22', '详情', 'sys:dept:detail', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('23', '列表', 'sys:user:list', NULL, 'sys/users', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('24', '用户管理', NULL, NULL, 'index/users', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('25', '详情', 'sys:user:detail', NULL, 'sys/user/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('26', '删除', 'sys:permission:deleted', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('27', '文件管理', '', '', 'index/sysFiles', '_self', '54', 10, 2, 1, NULL, '2020-06-15 16:00:29', 1);
INSERT INTO sys_permission VALUES ('28', '列表', 'sysFiles:list', NULL, 'sysFiles/listByPage', NULL, '27', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('29', '新增', 'sysFiles:add', NULL, 'sysFiles/add', NULL, '27', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('3', '新增', 'sys:role:add', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('30', '删除', 'sysFiles:delete', NULL, 'sysFiles/delete', NULL, '27', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('31', '文章管理', NULL, NULL, 'index/sysContent', '_self', '54', 10, 2, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('32', '列表', 'sysContent:list', NULL, 'sysContent/listByPage', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('33', '新增', 'sysContent:add', NULL, 'sysContent/add', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('34', '修改', 'sysContent:update', NULL, 'sysContent/update', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('35', '删除', 'sysContent:delete', NULL, 'sysContent/delete', NULL, '31', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('36', '更新', 'sys:role:update', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('38', '更新', 'sys:dept:update', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('39', '详情', 'sys:role:detail', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('4', '添加', 'sysGenerator:add', NULL, 'sysGenerator/add', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('40', '编辑', 'sys:permission:update', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('41', '部门管理', NULL, NULL, 'index/depts', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('42', '新增', 'sys:user:add', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('43', '列表', 'sys:permission:list', NULL, 'sys/permissions', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('44', '新增', 'sys:permission:add', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('45', '字典管理', NULL, '', 'index/sysDict', NULL, '54', 10, 2, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('46', '列表', 'sysDict:list', NULL, 'sysDict/listByPage', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('47', '新增', 'sysDict:add', NULL, 'sysDict/add', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('48', '修改', 'sysDict:update', NULL, 'sysDict/update', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('49', '删除', 'sysDict:delete', NULL, 'sysDict/delete', NULL, '45', 0, 3, 1, NULL, NULL, 1);
INSERT INTO sys_permission VALUES ('5', '删除', 'sys:dept:deleted', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('50', '表单构建', '', '', 'index/build', '_self', '21', 1, 2, 1, '2020-04-22 13:09:41', '2020-05-07 13:36:47', 1);
INSERT INTO sys_permission VALUES ('51', '组织管理', NULL, 'layui-icon-user', NULL, NULL, '0', 1, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('52', '拥有角色', 'sys:user:role:detail', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('53', '角色管理', NULL, NULL, 'index/roles', '_self', '51', 99, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('54', '系统管理', NULL, 'layui-icon-set-fill', NULL, NULL, '0', 98, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('56', '更新', 'sys:user:update', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('57', '删除', 'sys:user:deleted', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('58', '删除', 'sys:log:deleted', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('6', '接口管理', '', '', 'doc.html', '_blank', '21', 100, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:02', 1);
INSERT INTO sys_permission VALUES ('7', '列表', 'sys:log:list', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('8', '日志管理', NULL, NULL, 'index/logs', '_self', '54', 97, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_permission VALUES ('9', '新增', 'sys:dept:add', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1);
INSERT INTO sys_role(id, name, description, status, create_time, update_time, deleted) VALUES ('1', '超级管理员', '拥有所有权限-不能删除', 1, '2019-11-01 19:26:29', '2020-03-19 13:29:51', 1);
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('1', '1', '1', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('10', '1', '10', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('11', '1', '11', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('12', '1', '12', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('13', '1', '13', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('14', '1', '14', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('15', '1', '15', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('16', '1', '16', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('17', '1', '17', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('18', '1', '18', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('19', '1', '19', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('2', '1', '2', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('20', '1', '20', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('21', '1', '21', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('22', '1', '22', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('23', '1', '23', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('24', '1', '24', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('25', '1', '25', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('26', '1', '26', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('27', '1', '27', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('28', '1', '28', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('29', '1', '29', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('3', '1', '3', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('30', '1', '30', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('31', '1', '31', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('32', '1', '32', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('33', '1', '33', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('34', '1', '34', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('35', '1', '35', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('36', '1', '36', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('38', '1', '38', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('39', '1', '39', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('4', '1', '4', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('40', '1', '40', '2020-06-15 15:21:17');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('41', '1', '41', '2020-06-15 15:21:17');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('42', '1', '42', '2020-06-15 15:21:17');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('43', '1', '43', '2020-06-15 15:21:17');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('44', '1', '44', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('45', '1', '45', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('46', '1', '46', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('47', '1', '47', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('48', '1', '48', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('49', '1', '49', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('5', '1', '5', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('50', '1', '50', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('51', '1', '51', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('52', '1', '52', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('53', '1', '53', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('54', '1', '54', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('55', '1', '55', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('56', '1', '56', '2020-05-26 17:04:21');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('57', '1', '57', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('58', '1', '58', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('6', '1', '6', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('60', '1', '60', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('61', '1', '61', '2020-05-26 14:21:56');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('62', '1', '62', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('63', '1', '63', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('7', '1', '7', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('8', '1', '8', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('9', '1', '9', '2020-04-22 15:48:47');
INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('1311116066716430339', '1', '1311115974068449281', '2020-09-30 09:30:04');
INSERT INTO sys_user(id, username, salt, password, phone, dept_id, real_name, nick_name, email, status, sex, deleted, create_id, update_id, create_where, create_time, update_time) VALUES ('1', 'admin', '324ce32d86224b00a02b', '2102b59a75ab87616b62d0b9432569d0', '13888888888', '1', '爱糖宝', '爱糖宝', 'xxxxxx@163.com', 1, 2, 1, '1', '1', 3, '2019-09-22 19:38:05', '2020-03-18 09:15:22');
INSERT INTO sys_user_role(id, user_id, role_id, create_time) VALUES ('1', '1', '1', '2020-03-19 02:23:13');
INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242690', 'sex', '性别', '2020-04-30 17:24:09');
INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242691', 'content_keyword', '关键字', '2020-04-30 17:24:09');
INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1282504369620430849', 'content_type', '文章类型略略略', '2020-07-13 10:37:24');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790073535885314', '', '1', 1, '1255790029680242690', '2020-04-30 17:24:19');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790100115189761', '', '2', 2, '1255790029680242690', '2020-04-30 17:24:25');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504475715350530', '诗词', '1', 1, '1282504369620430849', '2020-07-13 10:37:49');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504651729317889', '散文', '2', 2, '1282504369620430849', '2020-07-13 10:38:31');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842369', '剧本', '3', 3, '1282504369620430849', '2020-07-14 09:15:01');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842370', 'java', '1', 1, '1255790029680242691', '2020-07-14 09:15:01');
INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842371', 'mysql', '2', 2, '1255790029680242691', '2020-07-14 09:15:01');

177
pom.xml Normal file
View File

@ -0,0 +1,177 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.noear</groupId>
<artifactId>solon-parent</artifactId>
<version>3.1.0</version>
<relativePath />
</parent>
<groupId>vip.fuck.sm</groupId>
<artifactId>solon-manager</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>solon-manager</name>
<description>Demo project for Solon</description>
<properties>
<java.version>1.8</java.version>
<mybatis-plus.version>3.4.0</mybatis-plus.version>
<mybatis-plus-dynamic.version>2.5.5</mybatis-plus-dynamic.version>
<ojdbc6.version>12.1.0.1-atlassian-hosted</ojdbc6.version>
<sqlserver.version>4.0</sqlserver.version>
<commons.lang.version>2.6</commons.lang.version>
<commons.io.version>2.5</commons.io.version>
<commons.configuration.version>1.10</commons.configuration.version>
<velocity.version>1.7</velocity.version>
<shiro.version>1.11.0</shiro.version>
<druid.version>1.1.10</druid.version>
<fastjson.version>1.2.83</fastjson.version>
<thymeleaf-shiro.version>2.0.0</thymeleaf-shiro.version>
<knife4j.version>2.0.2</knife4j.version>
<easy-captcha.version>1.6.2</easy-captcha.version>
</properties>
<dependencies>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-web</artifactId>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-view-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-logging-logback</artifactId>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-serialization-jackson</artifactId>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-security-validation</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-solon-plugin</artifactId>
<version>3.5.10.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser-4.9</artifactId>
<version>3.5.9</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>${ojdbc6.version}</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>${sqlserver.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-openapi2-knife4j</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons.lang.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>${commons.configuration.version}</version>
</dependency>
<dependency>
<artifactId>velocity</artifactId>
<groupId>org.apache.velocity</groupId>
<version>${velocity.version}</version>
</dependency>
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>${easy-captcha.version}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
<!-- Sa-Token 权限认证在线文档https://sa-token.cc -->
<dependency>
<groupId>org.noear</groupId>
<artifactId>sa-token-solon-plugin</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.22</version>
</dependency>
</dependencies>
<build>
<finalName>manager</finalName>
<plugins>
<plugin>
<groupId>org.noear</groupId>
<artifactId>solon-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>tencent</id>
<url>https://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>aliyun-repos</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>

View File

@ -0,0 +1,25 @@
package vip.fuck.sm;
import lombok.extern.slf4j.Slf4j;
import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain;
import org.noear.solon.web.cors.CrossFilter;
/**
* 启动类
*
* @author xian.zi.ming@qq.com fuck.vip
*/
@Slf4j
@SolonMain
public class SolonManagerApplication {
public static void main(String[] args) throws Exception {
Solon.start(SolonManagerApplication.class, args, app->{
//或者增加全局处理用过滤器模式
app.filter(-1, new CrossFilter().allowedOrigins("*")); //-1 优先级更高
});
}
}

View File

@ -0,0 +1,25 @@
package vip.fuck.sm.common.aop.annotation;
import java.lang.annotation.*;
/**
* LogAnnotation
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
/**
* 模块
*/
String title() default "";
/**
* 功能
*/
String action() default "";
}

View File

@ -0,0 +1,80 @@
package vip.fuck.sm.common.aop.aspect;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import vip.fuck.sm.common.aop.annotation.LogAnnotation;
import vip.fuck.sm.entity.SysLog;
import vip.fuck.sm.mapper.SysLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Component;
import org.noear.solon.core.handle.Action;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Handler;
import org.noear.solon.core.route.RouterInterceptor;
import org.noear.solon.core.route.RouterInterceptorChain;
import org.noear.solon.core.util.MultiMap;
import java.lang.reflect.Parameter;
import static org.noear.solon.validation.annotation.HttpPart.params;
@Component(index = -99)
@Slf4j
public class LoggingRouterInterceptor implements RouterInterceptor {
@Db
private SysLogMapper sysLogMapper;
@Override
public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {
LogAnnotation logAnnotation = null;
Action action = ctx.action();
if (action != null) {
logAnnotation = action.method().getAnnotation(LogAnnotation.class);
}
if (logAnnotation == null) {
//如果没有注解
chain.doIntercept(ctx, mainHandler);
} else {
//1.开始计时
long start = System.currentTimeMillis();
try {
chain.doIntercept(ctx, mainHandler);
} finally {
//2.获得接口响应时长
long timespan = System.currentTimeMillis() - start;
JSONObject param = new JSONObject();
String body = ctx.body();
if(body!=null && JSONUtil.isTypeJSON(body)){
param.set("body",JSONUtil.parse(body));
}
MultiMap<String> keyValues = ctx.paramMap();
if(keyValues!=null){
param.set("params",JSONUtil.parse(keyValues));
}
//3.记日志
SysLog sysLog = new SysLog();
sysLog.setParams(param.toJSONString(0));
sysLog.setUsername(ctx.sessionOrDefault("currentUserName",""));
//注解上的描述
sysLog.setOperation(logAnnotation.title() + "-" + logAnnotation.action());
String className = action.controller().clz().getName();
String methodName = action.method().getName();
sysLog.setMethod(className + "." + methodName + "()");
String userId = StpUtil.getLoginIdAsString();
sysLog.setUserId(userId);
sysLog.setTime((int) timespan);
log.info(sysLog.toString());
sysLogMapper.insert(sysLog);
}
}
}
}

View File

@ -0,0 +1,55 @@
package vip.fuck.sm.common.config;
import vip.fuck.sm.common.utils.DataResult;
import org.noear.solon.annotation.Component;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Handler;
import org.noear.solon.core.handle.ModelAndView;
import org.noear.solon.core.route.PathRule;
import org.noear.solon.core.route.RouterInterceptor;
import org.noear.solon.core.route.RouterInterceptorChain;
import java.util.Arrays;
@Component
public class GlobalResultInterceptor implements RouterInterceptor {
@Override
public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {
chain.doIntercept(ctx, mainHandler);
}
private static final PathRule ORG_PATH_RULE = new PathRule();
static {
ORG_PATH_RULE.include("/favicon.ico",
"/doc.html",
"/swagger",
"/swagger/**",
"/swagger-resources",
"/swagger-resources/**",
"/webjars/**",
"/error",
"/static/**",
"/files/**"
);
}
/**
* 提交结果 render 执行前调用//不要做太复杂的事情
*/
@Override
public Object postResult(Context ctx, Object result) throws Throwable {
String path = ctx.path();
if(result instanceof Throwable){
//异常类型根据需要处理
return result;
}else if(result instanceof DataResult || result instanceof ModelAndView){
return result;
} else if( ORG_PATH_RULE.test(path) ){
return result;
}else {
return DataResult.success(result);
}
}
}

View File

@ -0,0 +1,78 @@
package vip.fuck.sm.common.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import vip.fuck.sm.common.utils.Constant;
import org.apache.ibatis.reflection.MetaObject;
import org.noear.solon.annotation.Component;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
/**
* mybatis plus 默认值配置
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
public class MetaObjectHandlerConfig implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
Date currentDate = new Date();
String[] setterNames = metaObject.getSetterNames();
HashSet<String> setterNameSet = new HashSet<>(Arrays.asList(setterNames));
if (setterNameSet.contains("deleted")) {
//默认未删除
setFieldValByName("deleted", Constant.DATA_NOT_DELETED, metaObject);
}
if (setterNameSet.contains("createTime")) {
//创建时间默认当前时间
setFieldValByName("createTime", currentDate, metaObject);
}
if (setterNameSet.contains("createDate")) {
//创建时间默认当前时间
setFieldValByName("createDate", currentDate, metaObject);
}
// if (setterNameSet.contains("createId")) {
// //创建时间默认当前时间
// setFieldValByName("createId", StpUtil.getLoginIdAsString(), metaObject);
// }
// if (setterNameSet.contains("updateId")) {
// //创建时间默认当前时间
// setFieldValByName("updateId", StpUtil.getLoginIdAsString(), metaObject);
// }
if (setterNameSet.contains("updateTime")) {
//创建时间默认当前时间
setFieldValByName("updateTime", currentDate, metaObject);
}
if (setterNameSet.contains("updateDate")) {
//创建时间默认当前时间
setFieldValByName("updateDate", currentDate, metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
Date currentDate = new Date();
String[] setterNames = metaObject.getSetterNames();
HashSet<String> setterNameSet = new HashSet<>(Arrays.asList(setterNames));
if (setterNameSet.contains("updateTime")) {
//创建时间默认当前时间
setFieldValByName("updateTime", currentDate, metaObject);
}
if (setterNameSet.contains("updateDate")) {
//创建时间默认当前时间
setFieldValByName("updateDate", currentDate, metaObject);
}
// if (setterNameSet.contains("updateId")) {
// //创建时间默认当前时间
// setFieldValByName("updateId", StpUtil.getLoginIdAsString(), metaObject);
// }
}
}

View File

@ -0,0 +1,47 @@
package vip.fuck.sm.common.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;
import org.noear.solon.core.util.ResourceUtil;
/**
* mybatis plus config
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Configuration
public class MyBatisPlusConfig {
// /**
// * 配置mybatis-plus 分页查件
// */
// @Bean
// public PaginationInterceptor paginationInterceptor() {
// return new PaginationInterceptor();
// }
@Bean
public void db1_cfg(
@Db("master") MybatisConfiguration cfg,
@Db("master") GlobalConfig globalConfig) throws Exception {
MybatisPlusInterceptor plusInterceptor = new MybatisPlusInterceptor();
plusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
cfg.setCacheEnabled(false);
cfg.addInterceptor(plusInterceptor);
// globalConfig.setSqlInjector(new MyLogicSqlInjector());
}
}

View File

@ -0,0 +1,42 @@
package vip.fuck.sm.common.config;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import vip.fuck.sm.service.PermissionService;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
import java.util.List;
/**
* SaToken自定义权限加载接口实现类
*
* @author xian.zi.ming@qq.com fuck.vip
*/
@Component
public class StpInterfaceImpl implements StpInterface {
@Inject
PermissionService permissionService;
/**
* 返回一个账号所拥有的权限码集合
*/
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
if (loginType.equals(StpUtil.TYPE)) {
return permissionService.getPermissionsByUserId(String.valueOf(loginId));
}
return null;
}
/**
* 返回一个账号所拥有的角色标识集合
*/
@Override
public List<String> getRoleList(Object loginId, String loginType) {
return null;
}
}

View File

@ -0,0 +1,50 @@
package vip.fuck.sm.common.config;
import com.github.xiaoymin.knife4j.solon.extension.OpenApiExtensionResolver;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Import;
import org.noear.solon.annotation.Inject;
import org.noear.solon.core.handle.Result;
import org.noear.solon.docs.DocDocket;
import org.noear.solon.docs.models.ApiContact;
import org.noear.solon.docs.models.ApiInfo;
/**
* SwaggerConfiguration
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Configuration
public class SwaggerConfiguration {
// knife4j 的配置由它承载
@Inject
OpenApiExtensionResolver openApiExtensionResolver;
@Bean("adminApi")
public DocDocket adminApi() {
//根据情况增加 "knife4j.setting" 可选
return new DocDocket()
.basicAuth(openApiExtensionResolver.getSetting().getBasic())
.vendorExtensions(openApiExtensionResolver.buildExtensions())
.groupName("管理端接口")
.info(new ApiInfo().title("在线文档")
.description("在线API文档")
.termsOfService("https://gitee.com/uidoer")
.contact(new ApiContact().name("rish")
.url("https://gitee.com/uidoer")
.email("xian.zi.ming@qq.com"))
.version("1.0"))
// .schemes(Scheme.HTTP, Scheme.HTTPS)
.globalResponseInData(true)
// .globalResult(Result.class)
.apis("vip.fuck.sm.controller"); //可以加多条以包名为单位
}
}

View File

@ -0,0 +1,95 @@
package vip.fuck.sm.common.config;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.solon.integration.SaTokenInterceptor;
import cn.dev33.satoken.stp.StpUtil;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;
import org.noear.solon.web.staticfiles.StaticMappings;
import org.noear.solon.web.staticfiles.repository.ClassPathStaticRepository;
import org.noear.solon.web.staticfiles.repository.FileStaticRepository;
import java.io.File;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* mvc 配置
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Configuration
public class WebMvcConfigurer {
@Inject("${file.path}")
private String filePath;
@Bean
public void staticFiles() {
StaticMappings.add("/files/", new FileStaticRepository(filePath));
StaticMappings.add("/static/", new ClassPathStaticRepository("static"));
}
//添加拦截器
//web是从管理后台来的接口不走app那一套校验逻辑
@Bean(index = -100) //-100是顺序位低值优先
public SaTokenInterceptor saTokenInterceptor() {
return new SaTokenInterceptor()
// 指定 [拦截路由] [放行路由]
.addInclude("/**")
.addExclude(
"/favicon.ico",
"/app/api/**",
"/doc.html",
"/swagger-resources",
"/swagger-resources/**",
"/webjars/**",
"/error",
"/static/**",
"/files/**",
"/login",
"/index/login",
"/sys/user/login",
"/sys/getVerify"
)
// 认证函数: 每次请求执行
.setAuth(req -> {
// System.out.println("---------- sa全局认证");
SaRouter.match("/**", StpUtil::checkLogin);
})
// 异常处理函数每次认证函数发生异常时执行此函数 //包括注解异常
// .setError(e -> {
// System.out.println("---------- sa全局异常 ");
// return AjaxJson.getError(e.getMessage());
// })
// 前置函数在每次认证函数之前执行
.setBeforeAuth(req -> {
// ---------- 设置一些安全响应头 ----------
// SaHolder.getResponse()
// // 服务器名称
// .setServer("sa-server")
// // 是否可以在iframe显示视图 DENY=不可以 | SAMEORIGIN=同域下可以 | ALLOW-FROM uri=指定域名下可以
// .setHeader("X-Frame-Options", "SAMEORIGIN")
// // 是否启用浏览器默认XSS防护 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时停止渲染页面
// .setHeader("X-XSS-Protection", "1; mode=block")
// // 禁用浏览器内容嗅探
// .setHeader("X-Content-Type-Options", "nosniff");
});
}
}

View File

@ -0,0 +1,52 @@
package vip.fuck.sm.common.exception;
import vip.fuck.sm.common.exception.code.BaseResponseCode;
import vip.fuck.sm.common.exception.code.ResponseCodeInterface;
/**
* BusinessException
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public class BusinessException extends RuntimeException {
/**
* 异常编号
*/
private final int messageCode;
/**
* 对messageCode 异常信息进行补充说明
*/
private final String detailMessage;
public BusinessException(int messageCode, String message) {
super(message);
this.messageCode = messageCode;
this.detailMessage = message;
}
public BusinessException(String message) {
super(message);
this.messageCode = BaseResponseCode.OPERATION_ERRO.getCode();
this.detailMessage = message;
}
/**
* 构造函数
*
* @param code 异常码
*/
public BusinessException(ResponseCodeInterface code) {
this(code.getCode(), code.getMsg());
}
public int getMessageCode() {
return messageCode;
}
public String getDetailMessage() {
return detailMessage;
}
}

View File

@ -0,0 +1,59 @@
package vip.fuck.sm.common.exception.code;
/**
* 错误码
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public enum BaseResponseCode implements ResponseCodeInterface {
/**
* 错误码
*/
SUCCESS(0, "操作成功"),
SYSTEM_BUSY(500001, "系统繁忙,请稍候再试"),
OPERATION_ERRO(500002, "操作失败"),
ILLEGAL_DATA(500003, "非法的数据格式"),
TOKEN_ERROR(401001, "登录凭证已过期,请重新登录"),
DATA_ERROR(401003, "传入数据异常"),
NOT_ACCOUNT(401004, "该用户不存在,请先注册"),
USER_LOCK(401005, "该用户已被锁定,请联系运营人员"),
PASSWORD_ERROR(401006, "用户名或密码错误"),
METHODARGUMENTNOTVALIDEXCEPTION(401007, "方法参数校验异常"),
UNAUTHORIZED_ERROR(401008, "权鉴校验不通过"),
ROLE_PERMISSION_RELATION(401009, "该菜单权限存在子集关联,不允许删除"),
OLD_PASSWORD_ERROR(401010, "旧密码不正确"),
NOT_PERMISSION_DELETED_DEPT(401011, "该组织机构下还关联着用户,不允许删除"),
OPERATION_MENU_PERMISSION_CATALOG_ERROR(401012, "操作后的菜单类型是目录,所属菜单必须为默认顶级菜单或者目录"),
OPERATION_MENU_PERMISSION_MENU_ERROR(401013, "操作后的菜单类型是菜单,所属菜单必须为目录类型"),
OPERATION_MENU_PERMISSION_BTN_ERROR(401013, "操作后的菜单类型是按钮,所属菜单必须为菜单类型"),
OPERATION_MENU_PERMISSION_URL_NOT_NULL(401015, "菜单权限的url不能为空"),
OPERATION_MENU_PERMISSION_URL_PERMS_NULL(401016, "菜单权限的标识符不能为空"),
;
/**
* 错误码
*/
private final int code;
/**
* 错误消息
*/
private final String msg;
BaseResponseCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public int getCode() {
return code;
}
@Override
public String getMsg() {
return msg;
}
}

View File

@ -0,0 +1,24 @@
package vip.fuck.sm.common.exception.code;
/**
* ResponseCodeInterface
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface ResponseCodeInterface {
/**
* 获取code
*
* @return code
*/
int getCode();
/**
* 获取信息
*
* @return msg
*/
String getMsg();
}

View File

@ -0,0 +1,45 @@
package vip.fuck.sm.common.exception.handler;
import cn.dev33.satoken.exception.NotLoginException;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.exception.code.BaseResponseCode;
import vip.fuck.sm.common.utils.DataResult;
import lombok.extern.slf4j.Slf4j;
import org.noear.solon.annotation.Component;
import org.noear.solon.core.exception.StatusException;
import org.noear.solon.core.handle.*;
import org.noear.solon.validation.ValidatorException;
import org.thymeleaf.exceptions.TemplateEngineException;
@Component(index = 0) //index 为顺序位不加则默认为0
@Slf4j
public class AppFilter implements Filter {
@Override
public void doFilter(Context ctx, FilterChain chain) throws Throwable {
try {
chain.doFilter(ctx);
} catch (NotLoginException e){
ctx.redirect("/index/login");
} catch (ValidatorException e) {
ctx.render(DataResult.getResult(
BaseResponseCode.METHODARGUMENTNOTVALIDEXCEPTION.getCode(),
e.getMessage()));
}catch (BusinessException e){
ctx.render(new DataResult(e.getMessageCode(), e.getDetailMessage()));
} catch (StatusException e){
ctx.status(e.getCode());
if (e.getCode() == 404){
String pathNew = ctx.pathNew();
log.error("404:{}",pathNew);
ctx.redirect("/index/404");
} else {
ctx.redirect("/index/500");
}
} catch (TemplateEngineException e){
ctx.render(" /** 【页面异常】 **/");
} catch (Throwable e) {
log.error(e.getMessage(),e);
ctx.render(DataResult.getResult(BaseResponseCode.SYSTEM_BUSY));
}
}
}

View File

@ -0,0 +1,110 @@
package vip.fuck.sm.common.utils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import vip.fuck.sm.common.exception.BusinessException;
import java.util.Collection;
/**
* 断言工具类
*/
public class AssertUtil {
/**
* true不报错
*
* @param expression
* @param message
*/
public static void isTrue(boolean expression, String message) {
if (!expression) {
throw new BusinessException(message);
}
}
/**
* true不报错
*
* @param expression
*/
public static void isTrue(boolean expression) {
if (!expression) {
throw new BusinessException("参数无效/数据异常");
}
}
/**
* string为空报错
* 不为空不报错
*
* @param s
* @param message
*/
public static void isStringNotBlank(String s, String message) {
isTrue(StringUtils.isNotBlank(s), message);
}
public static void isStringNotBlank(String s) {
isTrue(StringUtils.isNotBlank(s));
}
/**
* string为空不报错
* 不为空报错
*
* @param s
* @param message
*/
public static void isStringBlank(String s, String message) {
isTrue(StringUtils.isBlank(s), message);
}
public static void isStringBlank(String s) {
isTrue(StringUtils.isBlank(s));
}
/**
* 对象为null 不报错
* 不为null 报错
* @param obj
* @param errorMessage
*/
public static void isNull(Object obj, String errorMessage) {
isTrue(obj == null, errorMessage);
}
public static void isNull(Object obj) {
isTrue(obj == null);
}
/**
* 对象不为null 不报错
* 为null 报错
* @param obj
* @param errorMessage
*/
public static void isExists(Object obj, String errorMessage) {
isTrue(obj != null, errorMessage);
}
public static void isExists(Object obj) {
isTrue(obj != null);
}
/**
* list或者map 不能为空
* @param collection
* @param errorMessage
*/
public static void hasElements(Collection<?> collection, String errorMessage) {
isTrue(CollectionUtils.isNotEmpty(collection), errorMessage);
}
public static void hasElements(Object[] array, String errorMessage) {
isTrue(array != null && array.length != 0, errorMessage);
}
}

View File

@ -0,0 +1,38 @@
package vip.fuck.sm.common.utils;
/**
* Constant
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public class Constant {
/**
* 未删除值
*/
public static final Integer DATA_NOT_DELETED = 0;
/**
* 数据库类型
*/
public static final String DB_TYPE_MYSQL = "mysql";
public static final String DB_TYPE_ORACLE = "oracle";
public static final String DB_TYPE_SQL_SERVER = "sqlServer";
/**
* 定时任务状态
*/
public static final Integer SCHEDULER_STATUS_NORMAL = 0;
public static final Integer SCHEDULER_STATUS_PAUSE = 1;
/**
* 数据范围类型 1:所有/2:自定义/3:本部门及一下/4:仅本部门/5:自己
*/
public static final Integer DATA_SCOPE_ALL = 1;
public static final Integer DATA_SCOPE_CUSTOM = 2;
public static final Integer DATA_SCOPE_DEPT_AND_CHILD = 3;
public static final Integer DATA_SCOPE_DEPT = 4;
public static final Integer DATA_SCOPE_DEPT_SELF = 5;
}

View File

@ -0,0 +1,112 @@
package vip.fuck.sm.common.utils;
import vip.fuck.sm.common.exception.code.BaseResponseCode;
import vip.fuck.sm.common.exception.code.ResponseCodeInterface;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 返回值DataResult
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
public class DataResult {
/**
* 请求响应code0为成功 其他为失败
*/
@ApiModelProperty(value = "请求响应code0为成功 其他为失败", name = "code")
private int code;
/**
* 响应异常码详细信息
*/
@ApiModelProperty(value = "响应异常码详细信息", name = "msg")
private String msg;
@ApiModelProperty(value = "需要返回的数据", name = "data")
private Object data;
public DataResult(int code, Object data) {
this.code = code;
this.data = data;
this.msg = null;
}
public DataResult(int code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public DataResult(int code, String msg) {
this.code = code;
this.msg = msg;
this.data = null;
}
public DataResult() {
this.code = BaseResponseCode.SUCCESS.getCode();
this.msg = BaseResponseCode.SUCCESS.getMsg();
this.data = null;
}
public DataResult(Object data) {
this.data = data;
this.code = BaseResponseCode.SUCCESS.getCode();
this.msg = BaseResponseCode.SUCCESS.getMsg();
}
public DataResult(ResponseCodeInterface responseCodeInterface) {
this.data = null;
this.code = responseCodeInterface.getCode();
this.msg = responseCodeInterface.getMsg();
}
public DataResult(ResponseCodeInterface responseCodeInterface, Object data) {
this.data = data;
this.code = responseCodeInterface.getCode();
this.msg = responseCodeInterface.getMsg();
}
/**
* 操作成功 data为null
*/
public static DataResult success() {
return new DataResult();
}
/**
* 操作成功 data 不为null
*/
public static DataResult success(Object data) {
return new DataResult(data);
}
/**
* 操作失败 data 不为null
*/
public static DataResult fail(String msg) {
return new DataResult(BaseResponseCode.OPERATION_ERRO.getCode(), msg);
}
/**
* 自定义返回 data为null
*/
public static DataResult getResult(int code, String msg) {
return new DataResult(code, msg);
}
/**
* 自定义返回 入参一般是异常code枚举 data为空
*/
public static DataResult getResult(BaseResponseCode responseCode) {
return new DataResult(responseCode);
}
}

View File

@ -0,0 +1,30 @@
package vip.fuck.sm.common.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日期处理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public class DateUtils {
/**
* 时间格式(yyyy-MM-dd HH:mm:ss)
*/
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
/**
* 时间格式(yyyyMMdd)
*/
public final static String DATEPATTERN = "yyyyMMdd";
public static String format(Date date, String pattern) {
if (date != null) {
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.format(date);
}
return null;
}
}

View File

@ -0,0 +1,244 @@
package vip.fuck.sm.common.utils;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.entity.ColumnEntity;
import vip.fuck.sm.entity.TableEntity;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 代码生成器 工具类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public class GenUtils {
public static List<String> getTemplates() {
List<String> templates = new ArrayList<>();
templates.add("template/Entity.java.vm");
templates.add("template/Dao.java.vm");
templates.add("template/Dao.xml.vm");
templates.add("template/Service.java.vm");
templates.add("template/ServiceImpl.java.vm");
templates.add("template/Controller.java.vm");
templates.add("template/menu.sql.vm");
templates.add("template/list.html.vm");
return templates;
}
/**
* 生成代码
*/
public static void generatorCode(Map<String, String> table,
List<Map<String, String>> columns, ZipOutputStream zip) {
//配置信息
Configuration config = getConfig();
boolean hasBigDecimal = false;
//表信息
TableEntity tableEntity = new TableEntity();
tableEntity.setTableName(table.get("tableName"));
tableEntity.setComments(table.get("tableComment"));
//表名转换成Java类名
String className = tableToJava(tableEntity.getTableName(), config.getStringArray("tablePrefix"));
tableEntity.setClassName(className);
tableEntity.setClassname(StringUtils.uncapitalize(className));
tableEntity.setClassNameLower(className.toLowerCase());
//列信息
List<ColumnEntity> columsList = new ArrayList<>();
List<ColumnEntity> htmlColumsList = new ArrayList<>();
for (Map<String, String> column : columns) {
ColumnEntity columnEntity = new ColumnEntity();
columnEntity.setColumnName(column.get("columnName"));
columnEntity.setDataType(column.get("dataType"));
columnEntity.setComments(column.get("columnComment"));
columnEntity.setExtra(column.get("extra"));
//列名转换成Java属性名
String attrName = columnToJava(columnEntity.getColumnName());
columnEntity.setAttrName(attrName);
columnEntity.setAttrname(StringUtils.uncapitalize(attrName));
//列的数据类型转换成Java类型
String attrType = config.getString(columnEntity.getDataType(), "unknowType");
columnEntity.setAttrType(attrType);
if (!hasBigDecimal && "BigDecimal".equals(attrType)) {
hasBigDecimal = true;
}
//是否主键
if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) {
tableEntity.setPk(columnEntity);
}
columsList.add(columnEntity);
if (!Arrays.asList("deleted", "create_id", "create_by", "update_id", "update_by", "create_time", "create_date", "update_time", "update_date").contains(column.get("columnName"))) {
htmlColumsList.add(columnEntity);
}
}
tableEntity.setColumns(columsList);
tableEntity.setHtmlColumns(htmlColumsList);
//没主键则第一个字段为主键
if (tableEntity.getPk() == null) {
tableEntity.setPk(tableEntity.getColumns().get(0));
}
//设置velocity资源加载器
Properties prop = new Properties();
prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init(prop);
String mainPath = config.getString("mainPath");
mainPath = StringUtils.isBlank(mainPath) ? "com.company" : mainPath;
//封装模板数据
Map<String, Object> map = new HashMap<>(15);
map.put("tableName", tableEntity.getTableName());
map.put("comments", tableEntity.getComments());
map.put("pk", tableEntity.getPk());
map.put("className", tableEntity.getClassName());
map.put("classname", tableEntity.getClassname());
map.put("pathName", tableEntity.getClassname().toLowerCase());
map.put("columns", tableEntity.getColumns());
map.put("htmlColumns", tableEntity.getHtmlColumns());
map.put("classNameLower", tableEntity.getClassNameLower());
map.put("hasBigDecimal", hasBigDecimal);
map.put("mainPath", mainPath);
map.put("package", config.getString("package"));
map.put("author", config.getString("author"));
map.put("email", config.getString("email"));
map.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN));
map.put("identity", IdWorker.getId());
map.put("addId", IdWorker.getId());
map.put("updateId", IdWorker.getId());
map.put("deleteId", IdWorker.getId());
map.put("selectId", IdWorker.getId());
map.put("identityJoinId", IdWorker.getId());
map.put("addIdJoinId", IdWorker.getId());
map.put("updateIdJoinId", IdWorker.getId());
map.put("deleteIdJoinId", IdWorker.getId());
map.put("selectIdJoinId", IdWorker.getId());
VelocityContext context = new VelocityContext(map);
//获取模板列表
List<String> templates = getTemplates();
for (String template : templates) {
//渲染模板
StringWriter sw = new StringWriter();
Template tpl = Velocity.getTemplate(template, "UTF-8");
tpl.merge(context, sw);
try {
//添加到zip
zip.putNextEntry(new ZipEntry(Objects.requireNonNull(getFileName(template, tableEntity.getClassName(), config.getString("package")))));
IOUtils.write(sw.toString(), zip, "UTF-8");
IOUtils.closeQuietly(sw);
zip.closeEntry();
} catch (IOException e) {
throw new BusinessException("渲染模板失败,表名:" + tableEntity.getTableName());
}
}
}
/**
* 列名转换成Java属性名
*/
public static String columnToJava(String field) {
String[] fields = field.split("_");
StringBuilder sbuilder = new StringBuilder(fields[0]);
for (int i = 1; i < fields.length; i++) {
char[] cs = fields[i].toCharArray();
if (cs[0] >= 'a') {
cs[0] -= 32;
}
sbuilder.append(String.valueOf(cs));
}
return sbuilder.toString().substring(0, 1).toUpperCase() + sbuilder.toString().substring(1);
}
/**
* 表名转换成Java类名
*/
public static String tableToJava(String tableName, String[] tablePrefixArray) {
tableName = tableName.toLowerCase();
if (null != tablePrefixArray && tablePrefixArray.length > 0) {
for (String tablePrefix : tablePrefixArray) {
tablePrefix = tablePrefix.toLowerCase();
tableName = tableName.replace(tablePrefix, "");
}
}
return columnToJava(tableName);
}
/**
* 获取配置信息
*/
public static Configuration getConfig() {
try {
return new PropertiesConfiguration("generator.properties");
} catch (ConfigurationException e) {
throw new BusinessException("获取配置文件失败");
}
}
/**
* 获取文件名
*/
public static String getFileName(String template, String className, String packageName) {
String packagePath = "main" + File.separator + "java" + File.separator;
if (StringUtils.isNotBlank(packageName)) {
packagePath += packageName.replace(".", File.separator) + File.separator;
}
if (template.contains("Entity.java.vm")) {
return packagePath + "entity" + File.separator + className + "Entity.java";
}
if (template.contains("Dao.java.vm")) {
return packagePath + "mapper" + File.separator + className + "Mapper.java";
}
if (template.contains("Service.java.vm")) {
return packagePath + "service" + File.separator + className + "Service.java";
}
if (template.contains("ServiceImpl.java.vm")) {
return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java";
}
if (template.contains("Controller.java.vm")) {
return packagePath + "controller" + File.separator + className + "Controller.java";
}
if (template.contains("Dao.xml.vm")) {
return "main" + File.separator + "resources" + File.separator + "mapper" + File.separator + className + "Mapper.xml";
}
if (template.contains("menu.sql.vm")) {
return className.toLowerCase() + "_menu.sql";
}
if (template.contains("list.html.vm")) {
return "main" + File.separator + "resources" + File.separator + "templates" + File.separator + className.toLowerCase() + File.separator + "list" + ".html";
}
return null;
}
}

View File

@ -0,0 +1,117 @@
package vip.fuck.sm.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
/**
* 密码加密
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public class PasswordEncoder {
private static Logger logger = LoggerFactory.getLogger(PasswordEncoder.class);
private final static String[] HEX_DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
"e", "f"};
private final static String MD5 = "MD5";
private Object salt;
private String algorithm;
public PasswordEncoder(Object salt) {
this(salt, MD5);
}
public PasswordEncoder(Object salt, String algorithm) {
this.salt = salt;
this.algorithm = algorithm;
}
/**
* 密码加密
*
* @param rawPass 密码
* @return 加密后
*/
public String encode(String rawPass) {
String result = null;
try {
MessageDigest md = MessageDigest.getInstance(algorithm);
// 加密后的字符串
result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes(StandardCharsets.UTF_8)));
} catch (Exception e) {
logger.error(e.toString(), e);
}
return result;
}
/**
* 密码匹配验证
*
* @param encPass 密文
* @param rawPass 明文
* @return 是否匹配
*/
public boolean matches(String encPass, String rawPass) {
String pass1 = "" + encPass;
String pass2 = encode(rawPass);
return pass1.equals(pass2);
}
private String mergePasswordAndSalt(String password) {
if (password == null) {
password = "";
}
if ((salt == null) || "".equals(salt)) {
return password;
} else {
return password + "{" + salt.toString() + "}";
}
}
/**
* 转换字节数组为16进制字串
*
* @param b 字节数组
* @return 16进制字串
*/
private String byteArrayToHexString(byte[] b) {
StringBuilder resultSb = new StringBuilder();
for (byte value : b) {
resultSb.append(byteToHexString(value));
}
return resultSb.toString();
}
/**
* 将字节转换为16进制
*
* @param b 字节
* @return 16进制
*/
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n = 256 + n;
}
int d1 = n / 16;
int d2 = n % 16;
return HEX_DIGITS[d1] + HEX_DIGITS[d2];
}
public static void main(String[] args) {
}
}

View File

@ -0,0 +1,47 @@
package vip.fuck.sm.common.utils;
import java.util.UUID;
/**
* 密码工具类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public class PasswordUtils {
/**
* 匹配密码
*
* @param salt
* @param rawPass 明文
* @param encPass 密文
* @return 是否匹配
*/
public static boolean matches(String salt, String rawPass, String encPass) {
return new PasswordEncoder(salt).matches(encPass, rawPass);
}
/**
* 明文密码加密
*
* @param rawPass 明文
* @param salt
* @reture 加密后
*/
public static String encode(String rawPass, String salt) {
return new PasswordEncoder(salt).encode(rawPass);
}
/**
* 获取加密盐
*
* @return 盐值
*/
public static String getSalt() {
return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 20);
}
}

View File

@ -0,0 +1,96 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import vip.fuck.sm.common.aop.annotation.LogAnnotation;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.utils.AssertUtil;
import vip.fuck.sm.entity.SysDept;
import vip.fuck.sm.service.DeptService;
import vip.fuck.sm.vo.resp.DeptRespNodeVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.noear.solon.annotation.*;
import org.noear.solon.validation.annotation.Valid;
import org.noear.solon.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
/**
* 部门管理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapping("/sys")
@Controller
@Api(tags = "组织模块-机构管理")
@Valid
public class DeptController {
@Inject
private DeptService deptService;
@Post
@Mapping("/dept")
@ApiOperation(value = "新增组织接口")
@LogAnnotation(title = "机构管理", action = "新增组织")
@SaCheckPermission("sys:dept:add")
public void addDept( @Validated SysDept vo) {
deptService.addDept(vo);
}
@Delete
@Mapping ("/dept/{id}")
@ApiOperation(value = "删除组织接口")
@LogAnnotation(title = "机构管理", action = "删除组织")
@SaCheckPermission("sys:dept:deleted")
public void deleted(@Path("id") String id) {
deptService.deleted(id);
}
@Put
@Mapping ("/dept")
@ApiOperation(value = "更新组织信息接口")
@LogAnnotation(title = "机构管理", action = "更新组织信息")
@SaCheckPermission("sys:dept:update")
public void updateDept( SysDept vo) {
AssertUtil.isStringNotBlank(vo.getId(), "id不能为空");
deptService.updateDept(vo);
}
@Get
@Mapping ("/dept/{id}")
@ApiOperation(value = "查询组织详情接口")
@LogAnnotation(title = "机构管理", action = "查询组织详情")
@SaCheckPermission("sys:dept:detail")
public SysDept detailInfo(@Path("id") String id) {
return deptService.getById(id);
}
@Get @Mapping ("/dept/tree")
@ApiOperation(value = "树型组织列表接口")
@LogAnnotation(title = "机构管理", action = "树型组织列表")
@SaCheckPermission(value = {"sys:user:list", "sys:user:update", "sys:user:add", "sys:dept:add", "sys:dept:update"}, mode = SaMode.OR)
public List<DeptRespNodeVO> getTree( String deptId) {
return deptService.deptTreeList(deptId, false);
}
@Get @Mapping ("/depts")
@ApiOperation(value = "获取机构列表接口")
@LogAnnotation(title = "机构管理", action = "获取所有组织机构")
@SaCheckPermission("sys:dept:list")
public List<SysDept> getDeptAll() {
List<SysDept> deptList = deptService.list();
deptList.stream().forEach(entity -> {
SysDept parentDept = deptService.getById(entity.getPid());
if (parentDept != null) {
entity.setPidName(parentDept.getName());
}
});
return deptList;
}
}

View File

@ -0,0 +1,145 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.stp.StpUtil;
import io.swagger.annotations.Api;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Get;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.core.handle.ModelAndView;
import org.noear.solon.validation.annotation.Valid;
/**
* 视图
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Api(tags = "视图")
@Controller
@Mapping("")
@Valid
public class IndexController {
@Get @Mapping ("/index/login")
public ModelAndView login1(){
return this.loginIndex();
}
@Get @Mapping ( "/login")
public ModelAndView login2(){
return this.loginIndex();
}
@Get @Mapping ( "/")
public ModelAndView login3(){
return this.loginIndex();
}
public ModelAndView loginIndex() {
if (StpUtil.isLogin()) {
return new ModelAndView("/home.html");
}
return new ModelAndView("login.html");
}
@Get @Mapping ("/index/home")
public ModelAndView home() {
return this.loginIndex();
}
@Get @Mapping ("/index/users/password")
public ModelAndView updatePassword() {
return new ModelAndView("users/update_password.html");
}
@Get @Mapping ("/index/users/info")
public ModelAndView userDetail() {
return new ModelAndView("users/user_edit.html");
}
@Get @Mapping ("/index/menus")
public ModelAndView menusList() {
return new ModelAndView("menus/menu_list.html");
}
@Get @Mapping ("/index/roles")
public ModelAndView roleList() {
return new ModelAndView("roles/role_list.html");
}
@Get @Mapping ("/index/users")
public ModelAndView userList() {
return new ModelAndView("users/user_list.html");
}
@Get @Mapping ("/index/logs")
public ModelAndView logList() {
return new ModelAndView("logs/log_list.html");
}
@Get @Mapping ("/index/depts")
public ModelAndView deptList() {
return new ModelAndView("depts/dept_list.html");
}
@Get @Mapping ("/index/403")
public ModelAndView error403() {
return new ModelAndView("error/403.html");
}
@Get @Mapping ("/index/404")
public ModelAndView error404() {
return new ModelAndView("error/404.html");
}
@Get @Mapping ("/index/500")
public ModelAndView error405() {
return new ModelAndView("error/500.html");
}
@Get @Mapping ("/index/main")
public ModelAndView indexHome() {
return new ModelAndView( "main.html");
}
@Get @Mapping ("/index/about")
public ModelAndView about() {
return new ModelAndView("about.html");
}
@Get @Mapping ("/index/build")
public ModelAndView build() {
return new ModelAndView("build.html");
}
@Get @Mapping ("/index/sysContent")
public ModelAndView sysContent() {
return new ModelAndView("syscontent/list.html");
}
@Get @Mapping ("/index/sysDict")
public ModelAndView sysDict() {
return new ModelAndView("sysdict/list.html");
}
@Get @Mapping ("/index/sysGenerator")
public ModelAndView sysGenerator() {
return new ModelAndView("generator/list.html");
}
@Get @Mapping ("/index/sysJob")
public ModelAndView sysJob() {
return new ModelAndView("sysjob/list.html");
}
@Get @Mapping ("/index/sysJobLog")
public ModelAndView sysJobLog() {
return new ModelAndView("sysjoblog/list.html");
}
@Get @Mapping ("/index/sysFiles")
public ModelAndView sysFiles() {
return new ModelAndView("sysfiles/list.html");
}
}

View File

@ -0,0 +1,148 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import vip.fuck.sm.common.aop.annotation.LogAnnotation;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.exception.code.BaseResponseCode;
import vip.fuck.sm.common.utils.AssertUtil;
import vip.fuck.sm.entity.SysPermission;
import vip.fuck.sm.service.PermissionService;
import vip.fuck.sm.vo.resp.PermissionRespNode;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.noear.solon.annotation.*;
import org.noear.solon.validation.annotation.Valid;
import org.noear.solon.validation.annotation.Validated;
import java.util.List;
/**
* 菜单权限管理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapping("/sys")
@Controller
@Api(tags = "组织模块-菜单权限管理")
@Valid
public class PermissionController {
@Inject
private PermissionService permissionService;
@Post @Mapping ("/permission")
@ApiOperation(value = "新增菜单权限接口")
@LogAnnotation(title = "菜单权限管理", action = "新增菜单权限")
@SaCheckPermission("sys:permission:add")
public void addPermission( @Validated SysPermission vo) {
verifyFormPid(vo);
permissionService.save(vo);
}
@Delete @Mapping ("/permission/{id}")
@ApiOperation(value = "删除菜单权限接口")
@LogAnnotation(title = "菜单权限管理", action = "删除菜单权限")
@SaCheckPermission("sys:permission:deleted")
public void deleted(@Path("id") String id) {
permissionService.deleted(id);
}
@Put
@Mapping ("/permission")
@ApiOperation(value = "更新菜单权限接口")
@LogAnnotation(title = "菜单权限管理", action = "更新菜单权限")
@SaCheckPermission("sys:permission:update")
public void updatePermission( @Validated SysPermission vo) {
AssertUtil.isStringNotBlank(vo.getId(), "id不能为空");
SysPermission sysPermission = permissionService.getById(vo.getId());
if (null == sysPermission) {
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
// 只有类型变更或者所属菜单变更
if (sysPermission.getType().equals(vo.getType()) || !sysPermission.getPid().equals(vo.getPid())) {
verifyFormPid(vo);
}
permissionService.updatePermission(vo);
}
@Get
@Mapping ("/permission/{id}")
@ApiOperation(value = "查询菜单权限接口")
@LogAnnotation(title = "菜单权限管理", action = "查询菜单权限")
@SaCheckPermission("sys:permission:detail")
public SysPermission detailInfo(@Path("id") String id) {
return permissionService.getById(id);
}
@Get @Mapping ("/permissions")
@ApiOperation(value = "获取所有菜单权限接口")
@LogAnnotation(title = "菜单权限管理", action = "获取所有菜单权限")
@SaCheckPermission("sys:permission:list")
public List<SysPermission> getAllMenusPermission() {
return permissionService.selectAll(null);
}
@Get @Mapping ("/permission/tree")
@ApiOperation(value = "获取所有目录菜单树接口")
@LogAnnotation(title = "菜单权限管理", action = "获取所有目录菜单树")
@SaCheckPermission(value = {"sys:permission:update", "sys:permission:add"}, mode = SaMode.OR)
public List<PermissionRespNode> getAllMenusPermissionTree( String permissionId) {
return permissionService.selectAllMenuByTree(permissionId);
}
@Get @Mapping ("/permission/tree/all")
@ApiOperation(value = "获取所有目录菜单树接口")
@LogAnnotation(title = "菜单权限管理", action = "获取所有目录菜单树")
@SaCheckPermission(value = {"sys:role:update", "sys:role:add"}, mode = SaMode.OR)
public List<PermissionRespNode> getAllPermissionTree() {
return permissionService.selectAllByTree(1);
}
/**
* 操作后的菜单类型是目录的时候 父级必须为目录
* 操作后的菜单类型是菜单的时候父类必须为目录类型
* 操作后的菜单类型是按钮的时候 父类必须为菜单类型
*/
private void verifyFormPid(SysPermission sysPermission) {
SysPermission parent;
parent = permissionService.getById(sysPermission.getPid());
switch (sysPermission.getType()) {
case 1:
if (parent != null) {
if (parent.getType() != 1) {
throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_CATALOG_ERROR);
}
} else if (!"0".equals(sysPermission.getPid())) {
throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_CATALOG_ERROR);
}
break;
case 2:
if (parent == null || parent.getType() != 1) {
throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_MENU_ERROR);
}
if (StrUtil.isEmpty(sysPermission.getUrl())) {
throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_URL_NOT_NULL);
}
break;
case 3:
if (parent == null || parent.getType() != 2) {
throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_BTN_ERROR);
}
if (StrUtil.isEmpty(sysPermission.getPerms())) {
throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_URL_PERMS_NULL);
}
if (StrUtil.isEmpty(sysPermission.getUrl())) {
throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_URL_NOT_NULL);
}
break;
default:
}
}
}

View File

@ -0,0 +1,141 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import vip.fuck.sm.common.aop.annotation.LogAnnotation;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.utils.AssertUtil;
import vip.fuck.sm.entity.SysRole;
import vip.fuck.sm.entity.SysRoleDeptEntity;
import vip.fuck.sm.service.RolePermissionService;
import vip.fuck.sm.service.RoleService;
import vip.fuck.sm.service.SysRoleDeptService;
import vip.fuck.sm.vo.req.RolePermissionOperationReqVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.noear.solon.annotation.*;
import org.noear.solon.validation.annotation.Valid;
import org.noear.solon.validation.annotation.Validated;
import java.util.ArrayList;
import java.util.List;
/**
* 角色管理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapping("/sys")
@Controller
@Api(tags = "组织模块-角色管理")
@Valid
public class RoleController {
@Inject
private RoleService roleService;
@Inject
private SysRoleDeptService sysRoleDeptService;
@Inject
private RolePermissionService rolePermissionService;
@Post @Mapping ("/role")
@ApiOperation(value = "新增角色接口")
@LogAnnotation(title = "角色管理", action = "新增角色")
@SaCheckPermission("sys:role:add")
public void addRole( @Validated SysRole vo) {
roleService.addRole(vo);
}
@Delete @Mapping ("/role/{id}")
@ApiOperation(value = "删除角色接口")
@LogAnnotation(title = "角色管理", action = "删除角色")
@SaCheckPermission("sys:role:deleted")
public void deleted(@Path("id") String id) {
roleService.deletedRole(id);
}
@Put
@Mapping ("/role")
@ApiOperation(value = "更新角色信息接口")
@LogAnnotation(title = "角色管理", action = "更新角色信息")
@SaCheckPermission("sys:role:update")
public void updateDept( SysRole vo) {
AssertUtil.isStringNotBlank(vo.getId(), "id不能为空");
roleService.updateRole(vo);
}
@Post @Mapping ("/role/bindDept")
@ApiOperation(value = "绑定角色部门接口")
@LogAnnotation(title = "角色管理", action = "绑定角色部门信息")
@SaCheckPermission("sys:role:bindDept")
public void bindDept( SysRole vo) {
AssertUtil.isStringNotBlank(vo.getId(), "id不能为空");
AssertUtil.isExists(vo.getId(), "获取角色失败");
//先删除所有绑定
sysRoleDeptService.remove(Wrappers.<SysRoleDeptEntity>lambdaQuery().eq(SysRoleDeptEntity::getRoleId, vo.getId()));
//如果不是自定义
if (vo.getDataScope() != 2) {
vo.setDepts(null);
}
if (!ObjectUtil.isEmpty(vo.getDepts())) {
List<SysRoleDeptEntity> list = new ArrayList<>();
for (String deptId : vo.getDepts()) {
SysRoleDeptEntity sysRoleDeptEntity = new SysRoleDeptEntity();
sysRoleDeptEntity.setDeptId(deptId);
sysRoleDeptEntity.setRoleId(vo.getId());
list.add(sysRoleDeptEntity);
}
sysRoleDeptService.saveBatch(list);
}
roleService.updateById(new SysRole().setId(vo.getId()).setDataScope(vo.getDataScope()));
}
@Get
@Mapping ("/role/{id}")
@ApiOperation(value = "查询角色详情接口")
@LogAnnotation(title = "角色管理", action = "查询角色详情")
@SaCheckPermission("sys:role:detail")
public SysRole detailInfo(@Path("id") String id) {
return roleService.detailInfo(id);
}
@Post @Mapping ("/roles")
@ApiOperation(value = "分页获取角色信息接口")
@LogAnnotation(title = "角色管理", action = "分页获取角色信息")
@SaCheckPermission("sys:role:list")
@SuppressWarnings("unchecked")
public Page<SysRole> pageInfo( SysRole vo) {
LambdaQueryWrapper<SysRole> queryWrapper = Wrappers.lambdaQuery();
if (!StrUtil.isEmpty(vo.getName())) {
queryWrapper.like(SysRole::getName, vo.getName());
}
if (!StrUtil.isEmpty(vo.getStartTime())) {
queryWrapper.gt(SysRole::getCreateTime, vo.getStartTime());
}
if (!StrUtil.isEmpty(vo.getEndTime())) {
queryWrapper.lt(SysRole::getCreateTime, vo.getEndTime());
}
if (!ObjectUtil.isEmpty(vo.getStatus())) {
queryWrapper.eq(SysRole::getStatus, vo.getStatus());
}
queryWrapper.orderByDesc(SysRole::getCreateTime);
return roleService.page(vo.getQueryPage(), queryWrapper);
}
@Post @Mapping ("/role/permission")
@ApiOperation(value = "修改或者新增角色菜单权限接口")
@LogAnnotation(title = "角色和菜单关联接口", action = "修改或者新增角色菜单权限")
@SaCheckPermission(value = {"sys:role:update", "sys:role:add"}, mode = SaMode.OR)
public void operationRolePermission( @Validated RolePermissionOperationReqVO vo) {
rolePermissionService.addRolePermission(vo);
}
}

View File

@ -0,0 +1,75 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import vip.fuck.sm.common.utils.AssertUtil;
import vip.fuck.sm.entity.SysContentEntity;
import vip.fuck.sm.service.SysContentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.*;
import org.noear.solon.validation.annotation.Valid;
import javax.annotation.Resource;
import java.util.List;
/**
* 文章管理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Api(tags = "文章管理")
@Controller
@Mapping("/sysContent")
@Valid
public class SysContentController {
@Inject
private SysContentService sysContentService;
@ApiOperation(value = "新增")
@Post @Mapping ("/add")
@SaCheckPermission("sysContent:add")
public void add( SysContentEntity sysContent) {
sysContentService.save(sysContent);
}
@ApiOperation(value = "删除")
@Delete @Mapping ("/delete")
@SaCheckPermission("sysContent:delete")
public void delete( @ApiParam(value = "id集合") List<String> ids) {
sysContentService.removeByIds(ids);
}
@ApiOperation(value = "更新")
@Put
@Mapping ("/update")
@SaCheckPermission("sysContent:update")
public void update( SysContentEntity sysContent) {
AssertUtil.isStringNotBlank(sysContent.getId(), "id不能为空");
sysContentService.updateById(sysContent);
}
@ApiOperation(value = "查询分页数据")
@Post @Mapping ("/listByPage")
@SaCheckPermission("sysContent:list")
public IPage<SysContentEntity> findListByPage( SysContentEntity sysContent) {
LambdaQueryWrapper<SysContentEntity> queryWrapper = Wrappers.lambdaQuery();
//查询条件示例
if (!StrUtil.isEmpty(sysContent.getTitle())) {
queryWrapper.like(SysContentEntity::getTitle, sysContent.getTitle());
}
return sysContentService.page(sysContent.getQueryPage(), queryWrapper);
}
}

View File

@ -0,0 +1,89 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.utils.AssertUtil;
import vip.fuck.sm.entity.SysDictDetailEntity;
import vip.fuck.sm.entity.SysDictEntity;
import vip.fuck.sm.service.SysDictDetailService;
import vip.fuck.sm.service.SysDictService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.*;
import org.noear.solon.annotation.Put;
import org.noear.solon.validation.annotation.Valid;
import javax.annotation.Resource;
import java.util.List;
/**
* 字典管理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Api(tags = "字典管理")
@Controller
@Mapping("/sysDict")
@Valid
public class SysDictController {
@Inject
private SysDictService sysDictService;
@Inject
private SysDictDetailService sysDictDetailService;
@ApiOperation(value = "新增")
@Post @Mapping ("/add")
@SaCheckPermission("sysDict:add")
public void add( SysDictEntity sysDict) {
AssertUtil.isStringNotBlank(sysDict.getName(), "字典名称不能为空");
SysDictEntity q = sysDictService.getOne(Wrappers.<SysDictEntity>lambdaQuery().eq(SysDictEntity::getName, sysDict.getName()));
AssertUtil.isNull(q, "字典名称已存在");
sysDictService.save(sysDict);
}
@ApiOperation(value = "删除")
@Delete @Mapping ("/delete")
@SaCheckPermission("sysDict:delete")
public void delete( @ApiParam(value = "id集合") List<String> ids) {
sysDictService.removeByIds(ids);
//删除detail
sysDictDetailService.remove(Wrappers.<SysDictDetailEntity>lambdaQuery().in(SysDictDetailEntity::getDictId, ids));
}
@ApiOperation(value = "更新")
@Put
@Mapping ("/update")
@SaCheckPermission("sysDict:update")
public void update( SysDictEntity sysDict) {
AssertUtil.isStringNotBlank(sysDict.getName(), "字典名称不能为空");
sysDictService.updateById(sysDict);
}
@ApiOperation(value = "查询分页数据")
@Post @Mapping ("/listByPage")
@SaCheckPermission("sysDict:list")
public IPage<SysDictEntity> findListByPage( SysDictEntity sysDict) {
LambdaQueryWrapper<SysDictEntity> queryWrapper = Wrappers.lambdaQuery();
//查询条件示例
if (!StrUtil.isEmpty(sysDict.getName())) {
queryWrapper.like(SysDictEntity::getName, sysDict.getName());
queryWrapper.or();
queryWrapper.like(SysDictEntity::getRemark, sysDict.getName());
}
queryWrapper.orderByAsc(SysDictEntity::getName);
return sysDictService.page(sysDict.getQueryPage(), queryWrapper);
}
}

View File

@ -0,0 +1,88 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.utils.AssertUtil;
import vip.fuck.sm.entity.SysDictDetailEntity;
import vip.fuck.sm.service.SysDictDetailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.noear.solon.annotation.*;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.Put;
import org.noear.solon.validation.annotation.Valid;
import javax.annotation.Resource;
import java.util.List;
/**
* 字典明细管理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Api(tags = "字典明细管理")
@Controller
@Mapping("/sysDictDetail")
@Valid
public class SysDictDetailController {
@Inject
private SysDictDetailService sysDictDetailService;
@ApiOperation(value = "新增")
@Post @Mapping ("/add")
@SaCheckPermission("sysDict:add")
public void add( SysDictDetailEntity sysDictDetail) {
AssertUtil.isStringNotBlank(sysDictDetail.getValue(), "字典值不能为空");
LambdaQueryWrapper<SysDictDetailEntity> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(SysDictDetailEntity::getValue, sysDictDetail.getValue());
queryWrapper.eq(SysDictDetailEntity::getDictId, sysDictDetail.getDictId());
SysDictDetailEntity q = sysDictDetailService.getOne(queryWrapper);
AssertUtil.isNull(q, "字典名称-字典值已存在");
sysDictDetailService.save(sysDictDetail);
}
@ApiOperation(value = "删除")
@Delete @Mapping ("/delete")
@SaCheckPermission("sysDict:delete")
public void delete( @ApiParam(value = "id集合") List<String> ids) {
sysDictDetailService.removeByIds(ids);
}
@ApiOperation(value = "更新")
@Put
@Mapping ("/update")
@SaCheckPermission("sysDict:update")
public void update( SysDictDetailEntity sysDictDetail) {
AssertUtil.isStringNotBlank(sysDictDetail.getValue(), "字典值不能为空");
LambdaQueryWrapper<SysDictDetailEntity> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(SysDictDetailEntity::getValue, sysDictDetail.getValue());
queryWrapper.eq(SysDictDetailEntity::getDictId, sysDictDetail.getDictId());
SysDictDetailEntity q = sysDictDetailService.getOne(queryWrapper);
sysDictDetailService.updateById(sysDictDetail);
}
@ApiOperation(value = "查询列表数据")
@Post @Mapping ("/listByPage")
@SaCheckPermission("sysDict:list")
public IPage<SysDictDetailEntity> findListByPage( SysDictDetailEntity sysDictDetail) {
if (StrUtil.isEmpty(sysDictDetail.getDictId())) {
return new Page<>();
}
return sysDictDetailService.listByPage(sysDictDetail.getQueryPage(), sysDictDetail.getDictId());
}
}

View File

@ -0,0 +1,67 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.entity.SysFilesEntity;
import vip.fuck.sm.service.SysFilesService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.noear.solon.annotation.*;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.UploadedFile;
import org.noear.solon.validation.annotation.Valid;
import org.smartboot.http.server.HttpRequest;
import org.smartboot.http.server.HttpResponse;
import java.util.List;
/**
* 文件上传
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Controller
@Mapping("/sysFiles")
@Api(tags = "文件管理")
@Valid
public class SysFilesController {
@Inject
private SysFilesService sysFilesService;
@ApiOperation(value = "新增")
@Post
@Mapping("/upload")
@SaCheckPermission(value = {"sysFiles:add", "sysContent:update", "sysContent:add"}, mode = SaMode.OR)
public String add(UploadedFile file, HttpRequest request) {
//判断文件是否空
if (file == null || file.getName() == null || "".equalsIgnoreCase(file.getName().trim())) {
throw new BusinessException("文件为空");
}
return sysFilesService.saveFile(file, request);
}
@ApiOperation(value = "删除")
@Delete
@Mapping ("/delete")
@SaCheckPermission("sysFiles:delete")
public void delete( @ApiParam(value = "id集合") List<String> ids) {
sysFilesService.removeByIdsAndFiles(ids);
}
@ApiOperation(value = "查询分页数据")
@Post @Mapping ("/listByPage")
@SaCheckPermission("sysFiles:list")
public IPage<SysFilesEntity> findListByPage( SysFilesEntity sysFiles) {
return sysFilesService.page(sysFiles.getQueryPage(), Wrappers.<SysFilesEntity>lambdaQuery().orderByDesc(SysFilesEntity::getCreateDate));
}
}

View File

@ -0,0 +1,58 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.metadata.IPage;
import vip.fuck.sm.entity.SysGenerator;
import vip.fuck.sm.service.ISysGeneratorService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Get;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.*;
import org.noear.solon.validation.annotation.Valid;
import org.smartboot.http.server.HttpResponse;
import java.io.IOException;
/**
* 代码生成
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Api(tags = "系统模块-代码生成")
@Slf4j
@Controller
@Mapping("/sysGenerator")
@Valid
public class SysGeneratorController {
@Inject
private ISysGeneratorService sysGeneratorService;
/**
* 生成代码
*/
@ApiOperation(value = "生成")
@Get
@Mapping ("/gen")
@SaCheckPermission("sysGenerator:add")
public void code(String tables, HttpResponse response) throws IOException {
byte[] data = sysGeneratorService.generatorCode(tables.split(","));
response.setHeader("Content-Disposition", "attachment; filename=\"manager.zip\"");
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream; charset=UTF-8");
IOUtils.write(data, response.getOutputStream());
}
@ApiOperation(value = "查询分页数据")
@Post @Mapping ("/listByPage")
@SaCheckPermission("sysGenerator:list")
public IPage<SysGenerator> findListByPage( SysGenerator vo) {
return sysGeneratorService.selectAllTables(vo.getQueryPage(), vo);
}
}

View File

@ -0,0 +1,64 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import vip.fuck.sm.common.aop.annotation.LogAnnotation;
import vip.fuck.sm.entity.SysLog;
import vip.fuck.sm.service.LogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.noear.solon.annotation.*;
import org.noear.solon.validation.annotation.Valid;
import javax.annotation.Resource;
import java.util.List;
/**
* 系统操作日志
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapping("/sys")
@Api(tags = "系统模块-系统操作日志管理")
@Controller
@Valid
public class SysLogController {
@Inject
private LogService logService;
@Post @Mapping ("/logs")
@ApiOperation(value = "分页查询系统操作日志接口")
@LogAnnotation(title = "系统操作日志管理", action = "分页查询系统操作日志")
@SaCheckPermission("sys:log:list")
public Page<SysLog> pageInfo( SysLog vo) {
LambdaQueryWrapper<SysLog> queryWrapper = Wrappers.lambdaQuery();
if (!StrUtil.isEmpty(vo.getUsername())) {
queryWrapper.like(SysLog::getUsername, vo.getUsername());
}
if (!StrUtil.isEmpty(vo.getOperation())) {
queryWrapper.like(SysLog::getOperation, vo.getOperation());
}
if (!StrUtil.isEmpty(vo.getStartTime())) {
queryWrapper.gt(SysLog::getCreateTime, vo.getStartTime());
}
if (!StrUtil.isEmpty(vo.getEndTime())) {
queryWrapper.lt(SysLog::getCreateTime, vo.getEndTime());
}
queryWrapper.orderByDesc(SysLog::getCreateTime);
return logService.page(vo.getQueryPage(), queryWrapper);
}
@Delete @Mapping ("/logs")
@ApiOperation(value = "删除日志接口")
@LogAnnotation(title = "系统操作日志管理", action = "删除系统操作日志")
@SaCheckPermission("sys:log:deleted")
public void deleted( List<String> logIds) {
logService.removeByIds(logIds);
}
}

View File

@ -0,0 +1,217 @@
package vip.fuck.sm.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import vip.fuck.sm.common.aop.annotation.LogAnnotation;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.exception.code.BaseResponseCode;
import vip.fuck.sm.common.utils.AssertUtil;
import vip.fuck.sm.common.utils.DataResult;
import vip.fuck.sm.entity.SysUser;
import vip.fuck.sm.entity.SysUserRole;
import vip.fuck.sm.service.HomeService;
import vip.fuck.sm.service.UserRoleService;
import vip.fuck.sm.service.UserService;
import vip.fuck.sm.vo.req.UserRoleOperationReqVO;
import vip.fuck.sm.vo.resp.HomeRespVO;
import vip.fuck.sm.vo.resp.LoginRespVO;
import vip.fuck.sm.vo.resp.UserOwnRoleRespVO;
import com.wf.captcha.ArithmeticCaptcha;
import com.wf.captcha.utils.CaptchaUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.noear.solon.annotation.*;
import org.noear.solon.boot.smarthttp.http.SmHttpContext;
import org.noear.solon.core.handle.Context;
import org.noear.solon.validation.annotation.Valid;
import org.noear.solon.validation.annotation.Validated;
import java.io.IOException;
import java.util.List;
/**
* 用户管理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Controller
@Api(tags = "组织模块-用户管理")
@Mapping("/sys")
@Slf4j
@Valid
public class UserController {
@Inject
private UserService userService;
@Inject
private UserRoleService userRoleService;
@Inject
private HomeService homeService;
/**
* 获取验证码图片
* Gets captcha code.
*
* @param ctx the request
* @throws IOException the io exception
*/
@Mapping("/getVerify")
public void getCaptchaCode(Context ctx ) throws IOException {
ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48);
captcha.setLen(2);
ctx.sessionSet("captcha",captcha.text().toLowerCase());
captcha.out(ctx.outputStream());
}
@Post @Mapping (value = "/user/login")
@ApiOperation(value = "用户登录接口")
public LoginRespVO login(@Validated SysUser vo, Context ctx) {
//判断验证码
if (!ObjectUtil.equal(vo.getCaptcha(),""+ctx.session("captcha") )) {
// 清除session中的验证码
ctx.sessionRemove("captcha");
throw new BusinessException("验证码错误!");
}
LoginRespVO login = userService.login(vo);
ctx.sessionSet("currentUserName",login.getUsername());
return login;
}
@Get
@Mapping ("/home")
@ApiOperation(value = "获取首页数据接口")
public HomeRespVO getHomeInfo() {
//通过access_token拿userId
String userId = StpUtil.getLoginIdAsString();
DataResult result = DataResult.success();
return homeService.getHomeInfo(userId);
}
@Post @Mapping ("/user/register")
@ApiOperation(value = "用户注册接口")
public void register( @Validated SysUser vo) {
userService.register(vo);
}
@Get @Mapping ("/user/unLogin")
@ApiOperation(value = "引导客户端去登录")
public void unLogin() {
throw new BusinessException(BaseResponseCode.TOKEN_ERROR);
}
@Put
@Mapping ("/user")
@ApiOperation(value = "更新用户信息接口")
@LogAnnotation(title = "用户管理", action = "更新用户信息")
@SaCheckPermission("sys:user:update")
public void updateUserInfo( SysUser vo) {
AssertUtil.isStringNotBlank(vo.getId(), "id不能为空");
userService.updateUserInfo(vo);
}
@Put @Mapping ("/user/info")
@ApiOperation(value = "更新用户信息接口")
@LogAnnotation(title = "用户管理", action = "更新用户信息")
public void updateUserInfoById( SysUser vo) {
userService.updateUserInfoMy(vo);
}
@Get @Mapping ("/user/{id}")
@ApiOperation(value = "查询用户详情接口")
@LogAnnotation(title = "用户管理", action = "查询用户详情")
@SaCheckPermission("sys:user:detail")
public SysUser detailInfo(@Path("id") String id) {
return userService.getById(id);
}
@Get @Mapping ("/user")
@ApiOperation(value = "查询用户详情接口")
@LogAnnotation(title = "用户管理", action = "查询用户详情")
public SysUser youSelfInfo() {
String userId = StpUtil.getLoginIdAsString();
return userService.getById(userId);
}
@Post @Mapping ("/users")
@ApiOperation(value = "分页获取用户列表接口")
@SaCheckPermission("sys:user:list")
@LogAnnotation(title = "用户管理", action = "分页获取用户列表")
public IPage<SysUser> pageInfo( SysUser vo) {
return userService.pageInfo(vo);
}
@Post @Mapping ("/user")
@ApiOperation(value = "新增用户接口")
@SaCheckPermission("sys:user:add")
@LogAnnotation(title = "用户管理", action = "新增用户")
public void addUser( @Validated SysUser vo) {
userService.addUser(vo);
}
@Get @Mapping ("/user/logout")
@ApiOperation(value = "退出接口")
public void logout() {
StpUtil.logout();
}
@Put @Mapping ("/user/pwd")
@ApiOperation(value = "修改密码接口")
@LogAnnotation(title = "用户管理", action = "更新密码")
public void updatePwd( SysUser vo) {
if (StrUtil.isEmpty(vo.getOldPwd()) || StrUtil.isEmpty(vo.getNewPwd())) {
throw new BusinessException("旧密码与新密码不能为空");
}
vo.setId(StpUtil.getLoginIdAsString());
userService.updatePwd(vo);
}
@Delete @Mapping ("/user")
@ApiOperation(value = "删除用户接口")
@LogAnnotation(title = "用户管理", action = "删除用户")
@SaCheckPermission("sys:user:deleted")
public void deletedUser( @ApiParam(value = "用户id集合") List<String> userIds) {
//删除用户 删除redis的绑定的角色跟权限
LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.in(SysUser::getId, userIds);
userService.remove(queryWrapper);
}
@Get @Mapping ("/user/roles/{userId}")
@ApiOperation(value = "赋予角色-获取所有角色接口")
@LogAnnotation(title = "用户管理", action = "赋予角色-获取所有角色接口")
@SaCheckPermission("sys:user:role:detail")
public UserOwnRoleRespVO getUserOwnRole(@Path("userId") String userId) {
DataResult result = DataResult.success();
return userService.getUserOwnRole(userId);
}
@Put @Mapping ("/user/roles/{userId}")
@ApiOperation(value = "赋予角色-用户赋予角色接口")
@LogAnnotation(title = "用户管理", action = "赋予角色-用户赋予角色接口")
@SaCheckPermission("sys:user:role:update")
public void setUserOwnRole(@Path("userId") String userId, List<String> roleIds) {
LambdaQueryWrapper<SysUserRole> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(SysUserRole::getUserId, userId);
userRoleService.remove(queryWrapper);
if (!ObjectUtil.isEmpty(roleIds)) {
UserRoleOperationReqVO reqVO = new UserRoleOperationReqVO();
reqVO.setUserId(userId);
reqVO.setRoleIds(roleIds);
userRoleService.addUserRoleInfo(reqVO);
}
}
}

View File

@ -0,0 +1,36 @@
package vip.fuck.sm.controller;
import vip.fuck.sm.common.aop.annotation.LogAnnotation;
import vip.fuck.sm.service.UserRoleService;
import vip.fuck.sm.vo.req.UserRoleOperationReqVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.noear.solon.annotation.*;
import org.noear.solon.validation.annotation.Valid;
import org.noear.solon.validation.annotation.Validated;
/**
* 用户和角色关联
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapping("/sys")
@Controller
@Api(tags = "组织管理-用户和角色关联接口")
@Valid
public class UserRoleController {
@Inject
private UserRoleService userRoleService;
@Post @Mapping("/user/role")
@ApiOperation(value = "修改或者新增用户角色接口")
@LogAnnotation(title = "用户和角色关联接口", action = "修改或者新增用户角色")
public void operationUserRole( @Validated UserRoleOperationReqVO vo) {
userRoleService.addUserRoleInfo(vo);
}
}

View File

@ -0,0 +1,44 @@
package vip.fuck.sm.controller.api;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.noear.solon.annotation.Get;
import org.noear.solon.annotation.*;
/**
* api test示例
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年5月11日
*/
@Controller
@Mapping("/app/api")
@Api(tags = "test")
public class TestController {
@Post @Mapping ("/login")
@ApiOperation(value = "登录接口")
public SaResult login() {
// 第1步先登录上
StpUtil.login(10001);
// 第2步获取 Token 相关参数
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
// 第3步返回给前端
return SaResult.data(tokenInfo);
}
@Get
@Mapping ("/getCurUserInfo")
@ApiOperation(value = "获取当前登录人信息示例")
public void getAppUserInfo() {
//拿userId与userName
String userId = StpUtil.getLoginIdAsString();
}
}

View File

@ -0,0 +1,38 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* BaseEntity
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
@JsonIgnoreProperties(value = { "getQueryPage"})
public class BasePageEntity {
@TableField(exist = false)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Integer page;
@TableField(exist = false)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Integer limit;
/**
* page条件
*
* @param <T>
* @return
*/
@JsonIgnore
public <T> Page getQueryPage() {
return new Page<T>(page == null ? 1 : page, limit == null ? 10 : limit);
}
}

View File

@ -0,0 +1,104 @@
package vip.fuck.sm.entity;
import lombok.Data;
/**
* 代码生成 列属性
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
public class ColumnEntity {
/**
* 列名
*/
private String columnName;
/**
* 列名类型
*/
private String dataType;
/**
* 列名备注
*/
private String comments;
/**
* 属性名称(第一个字母大写)user_name => UserName
*/
private String attrName;
/**
* 属性名称(第一个字母小写)user_name => userName
*/
private String attrname;
/**
* 属性类型
*/
private String attrType;
/**
* auto_increment
*/
private String extra;
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public String getAttrname() {
return attrname;
}
public void setAttrname(String attrname) {
this.attrname = attrname;
}
public String getAttrName() {
return attrName;
}
public void setAttrName(String attrName) {
this.attrName = attrName;
}
public String getAttrType() {
return attrType;
}
public void setAttrType(String attrType) {
this.attrType = attrType;
}
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
}

View File

@ -0,0 +1,78 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* 内容管理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("sys_content")
public class SysContentEntity extends BasePageEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId("id")
private String id;
/**
* 主题
*/
@TableField("title")
private String title;
/**
* 内容
*/
@TableField("content")
private String content;
/**
* 单个图片url
*/
private String oneImg;
/**
* 多个图片url
*/
private String multipleImg;
/**
* 关键字
*/
private String keywords;
/**
* 类型数据字典
*/
@TableField("type")
private String type;
/**
* 创建人
*/
@TableField(value = "create_id", fill = FieldFill.INSERT)
private String createId;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
}

View File

@ -0,0 +1,54 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import org.noear.solon.validation.annotation.NotBlank;
import java.io.Serializable;
import java.util.Date;
/**
* 部门
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
public class SysDept implements Serializable {
@TableId
private String id;
private String deptNo;
@NotBlank(message = "机构名称不能为空")
private String name;
@NotBlank(message = "父级不能为空")
private String pid;
@TableField(exist = false)
private String pidName;
private Integer status;
private String relationCode;
private String deptManagerId;
private String managerName;
private String phone;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
}

View File

@ -0,0 +1,68 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* 字典明细
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("sys_dict_detail")
public class SysDictDetailEntity extends BasePageEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId("id")
private String id;
/**
* 字典标签
*/
@TableField("label")
private String label;
/**
* 字典值
*/
@TableField("value")
private String value;
/**
* 排序
*/
@TableField("sort")
private Integer sort;
/**
* 字典id
*/
@TableField("dict_id")
private String dictId;
/**
* 创建日期
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/**
* 字典name
*/
@TableField(exist = false)
private String dictName;
}

View File

@ -0,0 +1,51 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* 字典管理
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("sys_dict")
public class SysDictEntity extends BasePageEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId("id")
private String id;
/**
* 字典名称
*/
@TableField("name")
private String name;
/**
* 备注
*/
@TableField("remark")
private String remark;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
}

View File

@ -0,0 +1,51 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* 文件上传
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("sys_files")
public class SysFilesEntity extends BasePageEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId("id")
private String id;
/**
* URL地址
*/
@TableField("url")
private String url;
/**
* 创建时间
*/
@TableField(value = "create_date", fill = FieldFill.INSERT)
private Date createDate;
@TableField("file_name")
private String fileName;
@TableField("file_path")
private String filePath;
}

View File

@ -0,0 +1,30 @@
package vip.fuck.sm.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 代码生成
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysGenerator extends BasePageEntity implements Serializable {
private static final long serialVersionUID = 1L;
private String tableName;
private Date createTime;
private String tableComment;
}

View File

@ -0,0 +1,48 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* 操作日志
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysLog extends BasePageEntity implements Serializable {
@TableId
private String id;
private String userId;
private String username;
private String operation;
private Integer time;
private String method;
private String params;
private String ip;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(exist = false)
private String startTime;
@TableField(exist = false)
private String endTime;
}

View File

@ -0,0 +1,63 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import org.noear.solon.validation.annotation.NotBlank;
import org.noear.solon.validation.annotation.NotNull;
import java.io.Serializable;
import java.util.Date;
/**
* 权限菜单
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
public class SysPermission implements Serializable {
@TableId
private String id;
@NotBlank(message = "菜单权限名称不能为空")
private String name;
private String perms;
private String url;
private String icon;
private String target;
@NotNull(message = "所属菜单不能为空")
private String pid;
private Integer orderNum;
@NotNull(message = "菜单权限类型不能为空")
private Integer type;
/**
* 1正常 2禁用
*/
private Integer status;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
@TableField(exist = false)
private String pidName;
}

View File

@ -0,0 +1,66 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import vip.fuck.sm.vo.resp.DeptRespNodeVO;
import vip.fuck.sm.vo.resp.PermissionRespNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.noear.solon.validation.annotation.NotBlank;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 角色
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
public class SysRole extends BasePageEntity implements Serializable {
@TableId
private String id;
@NotBlank(message = "名称不能为空")
private String name;
private String description;
private Integer status;
private Integer dataScope;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
@TableField(exist = false)
private List<PermissionRespNode> permissionRespNodes;
@TableField(exist = false)
private List<DeptRespNodeVO> deptRespNodes;
@TableField(exist = false)
private String startTime;
@TableField(exist = false)
private String endTime;
@TableField(exist = false)
private List<String> permissions;
@TableField(exist = false)
private List<String> depts;
}

View File

@ -0,0 +1,49 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 角色部门
*
* @author xian.zi.ming@qq.com fuck.vip
* @email *****@mail.com
* @date 2020-09-27 17:30:15
*/
@Data
@TableName("sys_role_dept")
public class SysRoleDeptEntity extends BasePageEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId("id")
private String id;
/**
* 角色id
*/
@TableField("role_id")
private String roleId;
/**
* 菜单权限id
*/
@TableField("dept_id")
private String deptId;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
}

View File

@ -0,0 +1,30 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 角色权限
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
public class SysRolePermission implements Serializable {
@TableId
private String id;
private String roleId;
private String permissionId;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
}

View File

@ -0,0 +1,88 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.noear.solon.validation.annotation.NotBlank;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 用户
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysUser extends BasePageEntity implements Serializable {
@TableId
private String id;
@NotBlank(message = "账号不能为空")
private String username;
private String salt;
@NotBlank(message = "密码不能为空")
private String password;
@TableField(exist = false)
private String oldPwd;
@TableField(exist = false)
private String newPwd;
private String phone;
private String deptId;
@TableField(exist = false)
private String deptName;
@TableField(exist = false)
private String deptNo;
private String realName;
private String nickName;
private String email;
private Integer status;
private Integer sex;
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
private String createId;
private String updateId;
private Integer createWhere;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(exist = false)
private String startTime;
@TableField(exist = false)
private String endTime;
@TableField(exist = false)
private List<String> roleIds;
@TableField(exist = false)
private String captcha;
}

View File

@ -0,0 +1,31 @@
package vip.fuck.sm.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 用户角色
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
public class SysUserRole implements Serializable {
@TableId
private String id;
private String userId;
private String roleId;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
}

View File

@ -0,0 +1,93 @@
package vip.fuck.sm.entity;
import java.util.List;
/**
* 代码生成 表数据
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public class TableEntity {
//表的名称
private String tableName;
//表的备注
private String comments;
//表的主键
private ColumnEntity pk;
//表的列名(不包含主键)
private List<ColumnEntity> columns;
private List<ColumnEntity> htmlColumns;
//类名(第一个字母大写)sys_user => SysUser
private String className;
//类名(第一个字母小写)sys_user => sysUser
private String classname;
//类名(都小写)sys_user => sysuser
private String classNameLower;
public List<ColumnEntity> getHtmlColumns() {
return htmlColumns;
}
public void setHtmlColumns(List<ColumnEntity> htmlColumns) {
this.htmlColumns = htmlColumns;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public ColumnEntity getPk() {
return pk;
}
public void setPk(ColumnEntity pk) {
this.pk = pk;
}
public List<ColumnEntity> getColumns() {
return columns;
}
public void setColumns(List<ColumnEntity> columns) {
this.columns = columns;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public String getClassNameLower() {
return classNameLower;
}
public void setClassNameLower(String classNameLower) {
this.classNameLower = classNameLower;
}
}

View File

@ -0,0 +1,28 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import vip.fuck.sm.entity.SysGenerator;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* 代码生成 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface GeneratorMapper extends BaseMapper<SysGenerator> {
IPage<SysGenerator> selectAllTables(Page<SysGenerator> page, @Param(value = "vo") SysGenerator vo);
Map<String, String> queryTable(String tableName);
List<Map<String, String>> queryColumns(String tableName);
}

View File

@ -0,0 +1,17 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysContentEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 内容管理 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysContentMapper extends BaseMapper<SysContentEntity> {
}

View File

@ -0,0 +1,16 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysDept;
import org.apache.ibatis.annotations.Mapper;
/**
* 部门 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysDeptMapper extends BaseMapper<SysDept> {
}

View File

@ -0,0 +1,17 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysDictDetailEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 字典详情 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysDictDetailMapper extends BaseMapper<SysDictDetailEntity> {
}

View File

@ -0,0 +1,17 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysDictEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 字典 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysDictMapper extends BaseMapper<SysDictEntity> {
}

View File

@ -0,0 +1,17 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysFilesEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 文件上传 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysFilesMapper extends BaseMapper<SysFilesEntity> {
}

View File

@ -0,0 +1,16 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysLog;
import org.apache.ibatis.annotations.Mapper;
/**
* 操作日志 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysLogMapper extends BaseMapper<SysLog> {
}

View File

@ -0,0 +1,17 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysPermission;
import org.apache.ibatis.annotations.Mapper;
/**
* 菜单权限 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysPermissionMapper extends BaseMapper<SysPermission> {
}

View File

@ -0,0 +1,17 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysRoleDeptEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 角色部门
*
* @author xian.zi.ming@qq.com fuck.vip
* @email *****@mail.com
* @date 2020-09-27 17:30:15
*/
@Mapper
public interface SysRoleDeptMapper extends BaseMapper<SysRoleDeptEntity> {
}

View File

@ -0,0 +1,17 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysRole;
import org.apache.ibatis.annotations.Mapper;
/**
* 角色 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysRoleMapper extends BaseMapper<SysRole> {
}

View File

@ -0,0 +1,17 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysRolePermission;
import org.apache.ibatis.annotations.Mapper;
/**
* 角色权限 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysRolePermissionMapper extends BaseMapper<SysRolePermission> {
}

View File

@ -0,0 +1,16 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysUser;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}

View File

@ -0,0 +1,17 @@
package vip.fuck.sm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.fuck.sm.entity.SysUserRole;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户角色 Mapper
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Mapper
public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {
}

View File

@ -0,0 +1,47 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysDept;
import vip.fuck.sm.vo.resp.DeptRespNodeVO;
import java.util.List;
/**
* 部门
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface DeptService extends IService<SysDept> {
/**
* 添加部门
*
* @param vo vo
*/
void addDept(SysDept vo);
/**
* 更新部门
*
* @param vo vo
*/
void updateDept(SysDept vo);
/**
* 删除部门
*
* @param id id
*/
void deleted(String id);
/**
* 部门树形列表
*
* @param deptId deptId
* @param disabled 最顶级是否可用
* @return 树形列表
*/
List<DeptRespNodeVO> deptTreeList(String deptId, Boolean disabled);
}

View File

@ -0,0 +1,21 @@
package vip.fuck.sm.service;
import vip.fuck.sm.vo.resp.HomeRespVO;
/**
* 首页
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface HomeService {
/**
* 获取首页信息
*
* @param userId userId
* @return HomeRespVO
*/
HomeRespVO getHomeInfo(String userId);
}

View File

@ -0,0 +1,32 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import vip.fuck.sm.entity.SysGenerator;
/**
* 代码生成
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface ISysGeneratorService {
/**
* 获取所有表
*
* @param page page
* @param vo vo
* @return IPage
*/
IPage<SysGenerator> selectAllTables(Page<SysGenerator> page, SysGenerator vo);
/**
* 生成代码
*
* @param tables tables
* @return byte[]
*/
byte[] generatorCode(String[] tables);
}

View File

@ -0,0 +1,14 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysLog;
/**
* 系统日志
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface LogService extends IService<SysLog> {
}

View File

@ -0,0 +1,86 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysPermission;
import vip.fuck.sm.vo.resp.PermissionRespNode;
import java.util.List;
/**
* 菜单权限
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface PermissionService extends IService<SysPermission> {
/**
* 根据userId获取权限
*
* @param userId userId
* @return 权限
*/
List<SysPermission> getPermission(String userId);
/**
* 删除权限
*
* @param permissionId 权限id
*/
void deleted(String permissionId);
/**
* 获取所有
*
* @return List
*/
List<SysPermission> selectAll(Integer status);
/**
* 根据userId获取权限标志
*
* @param userId userId
* @return Set
*/
List<String> getPermissionsByUserId(String userId);
/**
* 根据userId获取权限树
*
* @param userId
* @return List
*/
List<PermissionRespNode> permissionTreeList(String userId);
/**
* 根据权限树
*
* @return List
*/
List<PermissionRespNode> selectAllByTree(Integer status);
/**
* 根据目录树
*
* @param permissionId permissionId
* @return List
*/
List<PermissionRespNode> selectAllMenuByTree(String permissionId);
/**
* 根据权限id获取绑定的userId
*
* @param permissionId permissionId
* @return List
*/
List<String> getUserIdsById(String permissionId);
/**
* 更新
*
* @param vo vo
*/
void updatePermission(SysPermission vo);
}

View File

@ -0,0 +1,22 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysRolePermission;
import vip.fuck.sm.vo.req.RolePermissionOperationReqVO;
/**
* 角色权限关联
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface RolePermissionService extends IService<SysRolePermission> {
/**
* 角色绑定权限
*
* @param vo vo
*/
void addRolePermission(RolePermissionOperationReqVO vo);
}

View File

@ -0,0 +1,53 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysRole;
import java.util.List;
/**
* 角色
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface RoleService extends IService<SysRole> {
/**
* 添加角色
*
* @param vo SysRole
*/
void addRole(SysRole vo);
/**
* 更新角色
*
* @param vo SysRole
*/
void updateRole(SysRole vo);
/**
* 根据id获取角色详情
*
* @param id id
* @return SysRole
*/
SysRole detailInfo(String id);
/**
* 根据id删除
*
* @param id id
*/
void deletedRole(String id);
/**
* 根据userId获取绑定的角色
*
* @param userId userId
* @return List
*/
List<SysRole> getRoleInfoByUserId(String userId);
}

View File

@ -0,0 +1,16 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysContentEntity;
/**
* 内容 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface SysContentService extends IService<SysContentEntity> {
}

View File

@ -0,0 +1,26 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysDictDetailEntity;
/**
* 数据字典 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface SysDictDetailService extends IService<SysDictDetailEntity> {
/**
* 分页
*
* @param page page
* @param dictId dictId
* @return IPage
*/
IPage<SysDictDetailEntity> listByPage(Page<SysDictDetailEntity> page, String dictId);
}

View File

@ -0,0 +1,16 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysDictEntity;
/**
* 数据字典 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface SysDictService extends IService<SysDictEntity> {
}

View File

@ -0,0 +1,36 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysFilesEntity;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.UploadedFile;
import org.smartboot.http.server.HttpRequest;
import java.util.List;
/**
* 文件上传 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface SysFilesService extends IService<SysFilesEntity> {
/**
* 保存图片返回url
*
* @param file
* @param request
* @return
*/
String saveFile(UploadedFile file, HttpRequest request);
/**
* 删除图片
*
* @param ids
*/
void removeByIdsAndFiles(List<String> ids);
}

View File

@ -0,0 +1,16 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysRoleDeptEntity;
/**
* 角色部门
*
* @author xian.zi.ming@qq.com fuck.vip
* @email *****@mail.com
* @date 2020-09-27 17:30:15
*/
public interface SysRoleDeptService extends IService<SysRoleDeptEntity> {
}

View File

@ -0,0 +1,32 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysUserRole;
import vip.fuck.sm.vo.req.UserRoleOperationReqVO;
import java.util.List;
/**
* 用户角色 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface UserRoleService extends IService<SysUserRole> {
/**
* 根据userId获取绑定的角色id
*
* @param userId userId
* @return List
*/
List<String> getRoleIdsByUserId(String userId);
/**
* 用户绑定角色
*
* @param vo vo
*/
void addUserRoleInfo(UserRoleOperationReqVO vo);
}

View File

@ -0,0 +1,76 @@
package vip.fuck.sm.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.fuck.sm.entity.SysUser;
import vip.fuck.sm.vo.resp.LoginRespVO;
import vip.fuck.sm.vo.resp.UserOwnRoleRespVO;
/**
* 用户 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
public interface UserService extends IService<SysUser> {
/**
* 注册
*
* @param vo vo
*/
void register(SysUser vo);
/**
* 登陆
*
* @param vo vo
* @return LoginRespVO
*/
LoginRespVO login(SysUser vo);
/**
* 更新用户信息
*
* @param vo vo
*/
void updateUserInfo(SysUser vo);
/**
* 分页
*
* @param vo vo
* @return IPage
*/
IPage<SysUser> pageInfo(SysUser vo);
/**
* 添加用户
*
* @param vo vo
*/
void addUser(SysUser vo);
/**
* 修改密码
*
* @param vo vo
*/
void updatePwd(SysUser vo);
/**
* 根据userid获取绑定角色
*
* @param userId userId
* @return UserOwnRoleRespVO
*/
UserOwnRoleRespVO getUserOwnRole(String userId);
/**
* 修改自己信息
*
* @param vo vo
*/
void updateUserInfoMy(SysUser vo);
}

View File

@ -0,0 +1,214 @@
package vip.fuck.sm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.exception.code.BaseResponseCode;
import vip.fuck.sm.entity.SysDept;
import vip.fuck.sm.entity.SysUser;
import vip.fuck.sm.mapper.SysDeptMapper;
import vip.fuck.sm.mapper.SysUserMapper;
import vip.fuck.sm.service.DeptService;
import vip.fuck.sm.vo.resp.DeptRespNodeVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Component;
import org.noear.solon.data.annotation.Tran;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
/**
* 部门
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
@Slf4j
public class DeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> implements DeptService {
@Db
private SysDeptMapper sysDeptMapper;
@Db
private SysUserMapper sysUserMapper;
@Override
public void addDept(SysDept vo) {
String relationCode;
String deptCode = this.getNewDeptCode();
SysDept parent = sysDeptMapper.selectById(vo.getPid());
if ("0".equals(vo.getPid())) {
relationCode = deptCode;
} else if (null == parent) {
throw new BusinessException(BaseResponseCode.DATA_ERROR);
} else {
relationCode = parent.getRelationCode() + deptCode;
}
vo.setDeptNo(deptCode);
vo.setRelationCode(relationCode);
sysDeptMapper.insert(vo);
}
@Override
@Tran
public void updateDept(SysDept vo) {
SysDept sysDept = sysDeptMapper.selectById(vo.getId());
if (null == sysDept) {
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
sysDeptMapper.updateById(vo);
//说明层级发生了变化
if (!StrUtil.isEmpty(vo.getPid()) && !vo.getPid().equals(sysDept.getPid())) {
SysDept parent = sysDeptMapper.selectById(vo.getPid());
if (!"0".equals(vo.getPid()) && null == parent) {
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
SysDept oldParent = sysDeptMapper.selectById(sysDept.getPid());
String oldRelationCode;
String newRelationCode;
//根目录降到其他目录
if ("0".equals(sysDept.getPid())) {
oldRelationCode = sysDept.getDeptNo();
newRelationCode = parent.getRelationCode() + sysDept.getDeptNo();
} else if ("0".equals(vo.getPid())) { // 其他目录升级到跟目录
oldRelationCode = sysDept.getRelationCode();
newRelationCode = sysDept.getDeptNo();
} else {
oldRelationCode = oldParent.getRelationCode();
newRelationCode = parent.getRelationCode();
}
LambdaQueryWrapper<SysDept> wrapper = Wrappers.lambdaQuery();
wrapper.likeLeft(SysDept::getDeptNo, sysDept.getDeptNo());
List<SysDept> list = sysDeptMapper.selectList(wrapper);
list.stream().forEach(entity -> {
String relationCode = entity.getRelationCode().replace(oldRelationCode, newRelationCode);
entity.setRelationCode(relationCode);
sysDeptMapper.updateById(entity);
});
}
}
@Override
public void deleted(String id) {
SysDept sysDept = sysDeptMapper.selectById(id);
if (null == sysDept) {
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
List<Object> deptIds = sysDeptMapper.selectObjs(Wrappers.<SysDept>lambdaQuery().select(SysDept::getId).likeRight(SysDept::getRelationCode, sysDept.getRelationCode()));
List<SysUser> list = sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery().in(SysUser::getDeptId, deptIds));
if (!ObjectUtil.isEmpty(list)) {
throw new BusinessException(BaseResponseCode.NOT_PERMISSION_DELETED_DEPT);
}
sysDeptMapper.deleteById(id);
}
@Override
public List<DeptRespNodeVO> deptTreeList(String deptId, Boolean disabled) {
List<SysDept> list;
if (ObjectUtil.isEmpty(deptId)) {
list = sysDeptMapper.selectList(Wrappers.emptyWrapper());
} else {
SysDept sysDept = sysDeptMapper.selectById(deptId);
if (sysDept == null) {
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
LambdaQueryWrapper<SysDept> queryWrapper = Wrappers.<SysDept>lambdaQuery().likeRight(SysDept::getRelationCode, sysDept.getRelationCode());
List<Object> childIds = sysDeptMapper.selectObjs(queryWrapper);
list = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery().notIn(SysDept::getId, childIds));
}
// 默认加一个顶级方便新增顶级部门
DeptRespNodeVO respNodeVO = new DeptRespNodeVO();
respNodeVO.setTitle("默认顶级部门");
respNodeVO.setId("0");
respNodeVO.setSpread(true);
respNodeVO.setDisabled(disabled);
respNodeVO.setChildren(getTree(list));
List<DeptRespNodeVO> result = new ArrayList<>();
result.add(respNodeVO);
return result;
}
private List<DeptRespNodeVO> getTree(List<SysDept> all) {
List<DeptRespNodeVO> list = new ArrayList<>();
for (SysDept sysDept : all) {
if ("0".equals(sysDept.getPid())) {
DeptRespNodeVO deptTree = new DeptRespNodeVO();
BeanUtil.copyProperties(sysDept, deptTree);
deptTree.setTitle(sysDept.getName());
deptTree.setSpread(true);
deptTree.setChildren(getChild(sysDept.getId(), all));
list.add(deptTree);
}
}
return list;
}
private List<DeptRespNodeVO> getChild(String id, List<SysDept> all) {
List<DeptRespNodeVO> list = new ArrayList<>();
for (SysDept sysDept : all) {
if (sysDept.getPid().equals(id)) {
DeptRespNodeVO deptTree = new DeptRespNodeVO();
BeanUtil.copyProperties(sysDept, deptTree);
deptTree.setTitle(sysDept.getName());
deptTree.setChildren(getChild(sysDept.getId(), all));
list.add(deptTree);
}
}
return list;
}
//获取新的部门编码
public String getNewDeptCode() {
LambdaQueryWrapper<SysDept> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.select(SysDept::getDeptNo);
//获取所有的deptCode
List<Object> deptCodes = sysDeptMapper.selectObjs(lambdaQueryWrapper);
AtomicReference<Integer> maxDeptCode = new AtomicReference<>(0);
//遍历获取最大的DeptCode
deptCodes.forEach(o -> {
String str = String.valueOf(o);
if (str.length() >= 7) {
Integer one = Integer.parseInt(str.substring(str.length() - 5));
if (one > maxDeptCode.get()) {
maxDeptCode.set(one);
}
}
});
return padRight(maxDeptCode.get() + 1, 6, "0");
}
/**
* 右补位左对齐
*
* @param len 目标字符串长度
* @param alexi 补位字符
* @param oriStr 原字符串
* @return 目标字符串
* 以alexin 做为补位
*/
public static String padRight(int oriStr, int len, String alexi) {
StringBuilder str = new StringBuilder();
int strlen = String.valueOf(oriStr).length();
if (strlen < len) {
for (int i = 0; i < len - strlen; i++) {
str.append(alexi);
}
}
str.append(oriStr);
return "D" + str.toString();
}
}

View File

@ -0,0 +1,59 @@
package vip.fuck.sm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import vip.fuck.sm.entity.SysDept;
import vip.fuck.sm.entity.SysUser;
import vip.fuck.sm.service.DeptService;
import vip.fuck.sm.service.HomeService;
import vip.fuck.sm.service.PermissionService;
import vip.fuck.sm.service.UserService;
import vip.fuck.sm.vo.resp.HomeRespVO;
import vip.fuck.sm.vo.resp.PermissionRespNode;
import vip.fuck.sm.vo.resp.UserInfoRespVO;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* 首页
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
public class HomeServiceImpl implements HomeService {
@Inject
private UserService userService;
@Inject
private DeptService deptService;
@Inject
private PermissionService permissionService;
@Override
public HomeRespVO getHomeInfo(String userId) {
SysUser sysUser = userService.getById(userId);
UserInfoRespVO vo = new UserInfoRespVO();
if (sysUser != null) {
BeanUtil.copyProperties(sysUser, vo);
SysDept sysDept = deptService.getById(sysUser.getDeptId());
if (sysDept != null) {
vo.setDeptId(sysDept.getId());
vo.setDeptName(sysDept.getName());
}
}
List<PermissionRespNode> menus = permissionService.permissionTreeList(userId);
HomeRespVO respVO = new HomeRespVO();
respVO.setMenus(menus);
respVO.setUserInfo(vo);
return respVO;
}
}

View File

@ -0,0 +1,18 @@
package vip.fuck.sm.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.entity.SysLog;
import vip.fuck.sm.mapper.SysLogMapper;
import vip.fuck.sm.service.LogService;
import org.noear.solon.annotation.Component;
/**
* 系统日志
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
public class LogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements LogService {
}

View File

@ -0,0 +1,263 @@
package vip.fuck.sm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.exception.code.BaseResponseCode;
import vip.fuck.sm.entity.SysPermission;
import vip.fuck.sm.entity.SysRolePermission;
import vip.fuck.sm.entity.SysUserRole;
import vip.fuck.sm.mapper.SysPermissionMapper;
import vip.fuck.sm.service.PermissionService;
import vip.fuck.sm.service.RolePermissionService;
import vip.fuck.sm.service.UserRoleService;
import vip.fuck.sm.vo.resp.PermissionRespNode;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Component;
import org.noear.solon.data.annotation.Tran;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 菜单权限
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
@Slf4j
public class PermissionServiceImpl extends ServiceImpl<SysPermissionMapper, SysPermission> implements PermissionService {
@Inject
private UserRoleService userRoleService;
@Inject
private RolePermissionService rolePermissionService;
@Db
private SysPermissionMapper sysPermissionMapper;
/**
* 根据用户查询拥有的权限
* 先查出用户拥有的角色
* 再去差用户拥有的权限
* 也可以多表关联查询
*/
@Override
public List<SysPermission> getPermission(String userId) {
List<String> roleIds = userRoleService.getRoleIdsByUserId(userId);
if (ObjectUtil.isEmpty(roleIds)) {
return null;
}
List<Object> permissionIds = rolePermissionService.listObjs(Wrappers.<SysRolePermission>lambdaQuery().select(SysRolePermission::getPermissionId).in(SysRolePermission::getRoleId, roleIds));
if (ObjectUtil.isEmpty(permissionIds)) {
return null;
}
LambdaQueryWrapper<SysPermission> queryWrapper = Wrappers.<SysPermission>lambdaQuery().in(SysPermission::getId, permissionIds).eq(SysPermission::getStatus, 1).orderByAsc(SysPermission::getOrderNum);
return sysPermissionMapper.selectList(queryWrapper);
}
/**
* 删除菜单权限
* 判断是否 有角色关联
* 判断是否有子集
*/
@Tran
@Override
public void deleted(String permissionId) {
//获取关联userId
List<String> userIds = getUserIdsById(permissionId);
SysPermission sysPermission = sysPermissionMapper.selectById(permissionId);
if (null == sysPermission) {
log.error("传入 的 id:{}不合法", permissionId);
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
//获取下一级
List<SysPermission> childs = sysPermissionMapper.selectList(Wrappers.<SysPermission>lambdaQuery().eq(SysPermission::getPid, permissionId));
if (!ObjectUtil.isEmpty(childs)) {
throw new BusinessException(BaseResponseCode.ROLE_PERMISSION_RELATION);
}
sysPermissionMapper.deleteById(permissionId);
//删除和角色关联
rolePermissionService.remove(Wrappers.<SysRolePermission>lambdaQuery().eq(SysRolePermission::getPermissionId, permissionId));
}
@Override
public void updatePermission(SysPermission vo) {
sysPermissionMapper.updateById(vo);
}
/**
* 获取所有菜单权限
*/
@Override
public List<SysPermission> selectAll(Integer status) {
List<SysPermission> result = sysPermissionMapper.selectList(Wrappers.<SysPermission>lambdaQuery().eq(status != null, SysPermission::getStatus, status).orderByAsc(SysPermission::getOrderNum));
if (!ObjectUtil.isEmpty(result)) {
for (SysPermission sysPermission : result) {
SysPermission parent = sysPermissionMapper.selectById(sysPermission.getPid());
if (parent != null) {
sysPermission.setPidName(parent.getName());
}
}
}
return result;
}
/**
* 获取权限标识
*/
@Override
public List<String> getPermissionsByUserId(String userId) {
List<SysPermission> list = getPermission(userId);
Set<String> permissions = new HashSet<>();
if (ObjectUtil.isEmpty(list)) {
return null;
}
for (SysPermission sysPermission : list) {
if (!ObjectUtil.isEmpty(sysPermission.getPerms())) {
permissions.add(sysPermission.getPerms());
}
}
return new ArrayList<String>(permissions);
}
/**
* 以树型的形式把用户拥有的菜单权限返回给客户端
*/
@Override
public List<PermissionRespNode> permissionTreeList(String userId) {
List<SysPermission> list = getPermission(userId);
return getTree(list, true);
}
/**
* 递归获取菜单树
*/
private List<PermissionRespNode> getTree(List<SysPermission> all, boolean type) {
List<PermissionRespNode> list = new ArrayList<>();
if (ObjectUtil.isEmpty(all)) {
return list;
}
for (SysPermission sysPermission : all) {
if ("0".equals(sysPermission.getPid())) {
PermissionRespNode permissionRespNode = new PermissionRespNode();
BeanUtil.copyProperties(sysPermission, permissionRespNode);
permissionRespNode.setTitle(sysPermission.getName());
if (type) {
permissionRespNode.setChildren(getChildExcBtn(sysPermission.getId(), all));
} else {
permissionRespNode.setChildren(getChildAll(sysPermission.getId(), all));
}
list.add(permissionRespNode);
}
}
return list;
}
/**
* 递归遍历所有
*/
private List<PermissionRespNode> getChildAll(String id, List<SysPermission> all) {
List<PermissionRespNode> list = new ArrayList<>();
for (SysPermission sysPermission : all) {
if (sysPermission.getPid().equals(id)) {
PermissionRespNode permissionRespNode = new PermissionRespNode();
BeanUtil.copyProperties(sysPermission, permissionRespNode);
permissionRespNode.setTitle(sysPermission.getName());
permissionRespNode.setChildren(getChildAll(sysPermission.getId(), all));
list.add(permissionRespNode);
}
}
return list;
}
/**
* 只递归获取目录和菜单
*/
private List<PermissionRespNode> getChildExcBtn(String id, List<SysPermission> all) {
List<PermissionRespNode> list = new ArrayList<>();
for (SysPermission sysPermission : all) {
if (sysPermission.getPid().equals(id) && sysPermission.getType() != 3) {
PermissionRespNode permissionRespNode = new PermissionRespNode();
BeanUtil.copyProperties(sysPermission, permissionRespNode);
permissionRespNode.setTitle(sysPermission.getName());
permissionRespNode.setChildren(getChildExcBtn(sysPermission.getId(), all));
list.add(permissionRespNode);
}
}
return list;
}
/**
* 获取所有菜单权限按钮
*/
@Override
public List<PermissionRespNode> selectAllByTree(Integer status) {
List<SysPermission> list = selectAll(status);
return getTree(list, false);
}
/**
* 获取所有的目录菜单树排除按钮
* 因为不管是新增或者修改
* 选择所属菜单目录的时候
* 都不可能选择到按钮
* 而且编辑的时候 所属目录不能
* 选择自己和它的子类
*/
@Override
public List<PermissionRespNode> selectAllMenuByTree(String permissionId) {
List<SysPermission> list = selectAll(1);
if (!ObjectUtil.isEmpty(list) && !ObjectUtil.isEmpty(permissionId)) {
for (SysPermission sysPermission : list) {
if (sysPermission.getId().equals(permissionId)) {
list.remove(sysPermission);
break;
}
}
}
List<PermissionRespNode> result = new ArrayList<>();
//新增顶级目录是为了方便添加一级目录
PermissionRespNode respNode = new PermissionRespNode();
respNode.setId("0");
respNode.setTitle("默认顶级菜单");
respNode.setSpread(true);
respNode.setChildren(getTree(list, true));
result.add(respNode);
return result;
}
@Override
public List getUserIdsById(String id) {
//根据权限id获取所有角色id
//根据权限id获取所有角色id
List<Object> roleIds = rolePermissionService.listObjs(Wrappers.<SysRolePermission>lambdaQuery().select(SysRolePermission::getRoleId).eq(SysRolePermission::getPermissionId, id));
if (!ObjectUtil.isEmpty(roleIds)) {
//根据角色id 获取关联用户
return userRoleService.listObjs(Wrappers.<SysUserRole>lambdaQuery().select(SysUserRole::getUserId).in(SysUserRole::getRoleId, roleIds));
}
return null;
}
}

View File

@ -0,0 +1,36 @@
package vip.fuck.sm.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.entity.SysRolePermission;
import vip.fuck.sm.mapper.SysRolePermissionMapper;
import vip.fuck.sm.service.RolePermissionService;
import vip.fuck.sm.vo.req.RolePermissionOperationReqVO;
import org.noear.solon.annotation.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 角色权限关联
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
public class RolePermissionServiceImpl extends ServiceImpl<SysRolePermissionMapper, SysRolePermission> implements RolePermissionService {
@Override
public void addRolePermission(RolePermissionOperationReqVO vo) {
List<SysRolePermission> list = new ArrayList<>();
for (String permissionId : vo.getPermissionIds()) {
SysRolePermission sysRolePermission = new SysRolePermission();
sysRolePermission.setPermissionId(permissionId);
sysRolePermission.setRoleId(vo.getRoleId());
list.add(sysRolePermission);
}
this.remove(Wrappers.<SysRolePermission>lambdaQuery().eq(SysRolePermission::getRoleId, vo.getRoleId()));
this.saveBatch(list);
}
}

View File

@ -0,0 +1,147 @@
package vip.fuck.sm.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.exception.code.BaseResponseCode;
import vip.fuck.sm.entity.SysRole;
import vip.fuck.sm.entity.SysRoleDeptEntity;
import vip.fuck.sm.entity.SysRolePermission;
import vip.fuck.sm.entity.SysUserRole;
import vip.fuck.sm.mapper.SysRoleMapper;
import vip.fuck.sm.service.*;
import vip.fuck.sm.vo.req.RolePermissionOperationReqVO;
import vip.fuck.sm.vo.resp.DeptRespNodeVO;
import vip.fuck.sm.vo.resp.PermissionRespNode;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
import org.noear.solon.data.annotation.Tran;
import javax.annotation.Resource;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 角色
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
@Slf4j
public class RoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements RoleService {
@Db
private SysRoleMapper sysRoleMapper;
@Inject
private UserRoleService userRoleService;
@Inject
private RolePermissionService rolePermissionService;
@Inject
private PermissionService permissionService;
@Inject
private DeptService deptService;
@Inject
private SysRoleDeptService sysRoleDeptService;
@Tran
@Override
public void addRole(SysRole vo) {
vo.setStatus(1);
sysRoleMapper.insert(vo);
if (!ObjectUtil.isEmpty(vo.getPermissions())) {
RolePermissionOperationReqVO reqVO = new RolePermissionOperationReqVO();
reqVO.setRoleId(vo.getId());
reqVO.setPermissionIds(vo.getPermissions());
rolePermissionService.addRolePermission(reqVO);
}
}
@Tran
@Override
public void updateRole(SysRole vo) {
SysRole sysRole = sysRoleMapper.selectById(vo.getId());
if (null == sysRole) {
log.error("传入 的 id:{}不合法", vo.getId());
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
sysRoleMapper.updateById(vo);
//删除角色权限关联
rolePermissionService.remove(Wrappers.<SysRolePermission>lambdaQuery().eq(SysRolePermission::getRoleId, sysRole.getId()));
if (!ObjectUtil.isEmpty(vo.getPermissions())) {
RolePermissionOperationReqVO reqVO = new RolePermissionOperationReqVO();
reqVO.setRoleId(sysRole.getId());
reqVO.setPermissionIds(vo.getPermissions());
rolePermissionService.addRolePermission(reqVO);
}
}
@Override
public SysRole detailInfo(String id) {
SysRole sysRole = sysRoleMapper.selectById(id);
if (sysRole == null) {
log.error("传入 的 id:{}不合法", id);
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
List<PermissionRespNode> permissionRespNodes = permissionService.selectAllByTree(1);
LambdaQueryWrapper<SysRolePermission> queryWrapper = Wrappers.<SysRolePermission>lambdaQuery().select(SysRolePermission::getPermissionId).eq(SysRolePermission::getRoleId, sysRole.getId());
Set<Object> checkList =
new HashSet<>(rolePermissionService.listObjs(queryWrapper));
setChecked(permissionRespNodes, checkList);
sysRole.setPermissionRespNodes(permissionRespNodes);
LambdaQueryWrapper<SysRoleDeptEntity> queryWrapperDept = Wrappers.<SysRoleDeptEntity>lambdaQuery().select(SysRoleDeptEntity::getDeptId).eq(SysRoleDeptEntity::getRoleId, sysRole.getId());
List<DeptRespNodeVO> deptRespNodes = deptService.deptTreeList(null, true);
Set<Object> checkDeptList =
new HashSet<>(sysRoleDeptService.listObjs(queryWrapperDept));
setCheckedDept(deptRespNodes, checkDeptList);
sysRole.setDeptRespNodes(deptRespNodes);
return sysRole;
}
private void setCheckedDept(List<DeptRespNodeVO> deptRespNodes, Set<Object> checkDeptList) {
for (DeptRespNodeVO node : deptRespNodes) {
if (checkDeptList.contains(node.getId())) {
node.setChecked(true);
}
setCheckedDept((List<DeptRespNodeVO>) node.getChildren(), checkDeptList);
}
}
private void setChecked(List<PermissionRespNode> list, Set<Object> checkList) {
for (PermissionRespNode node : list) {
if (checkList.contains(node.getId())
&& ObjectUtil.isEmpty(node.getChildren())) {
node.setChecked(true);
}
setChecked((List<PermissionRespNode>) node.getChildren(), checkList);
}
}
@Tran
@Override
public void deletedRole(String id) {
//删除角色
sysRoleMapper.deleteById(id);
//删除角色权限关联
rolePermissionService.remove(Wrappers.<SysRolePermission>lambdaQuery().eq(SysRolePermission::getRoleId, id));
//删除角色用户关联
userRoleService.remove(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getRoleId, id));
}
@Override
public List<SysRole> getRoleInfoByUserId(String userId) {
List<String> roleIds = userRoleService.getRoleIdsByUserId(userId);
if (ObjectUtil.isEmpty(roleIds)) {
return null;
}
return sysRoleMapper.selectBatchIds(roleIds);
}
}

View File

@ -0,0 +1,20 @@
package vip.fuck.sm.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.entity.SysContentEntity;
import vip.fuck.sm.mapper.SysContentMapper;
import vip.fuck.sm.service.SysContentService;
import org.noear.solon.annotation.Component;
/**
* 内容 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component(value = "share:sysContentService",typed = true)
public class SysContentServiceImpl extends ServiceImpl<SysContentMapper, SysContentEntity> implements SysContentService {
}

View File

@ -0,0 +1,53 @@
package vip.fuck.sm.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.entity.SysDictDetailEntity;
import vip.fuck.sm.entity.SysDictEntity;
import vip.fuck.sm.mapper.SysDictDetailMapper;
import vip.fuck.sm.mapper.SysDictMapper;
import vip.fuck.sm.service.SysDictDetailService;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
import javax.annotation.Resource;
/**
* 数据字典 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component(value = "share:sysDictDetailService",typed = true)
public class SysDictDetailServiceImpl extends ServiceImpl<SysDictDetailMapper, SysDictDetailEntity> implements SysDictDetailService {
@Db
private SysDictDetailMapper sysDictDetailMapper;
@Db
private SysDictMapper sysDictMapper;
@Override
public IPage<SysDictDetailEntity> listByPage(Page<SysDictDetailEntity> page, String dictId) {
SysDictEntity sysDictEntity = sysDictMapper.selectById(dictId);
if (sysDictEntity == null) {
throw new BusinessException("获取字典数据失败!");
}
LambdaQueryWrapper<SysDictDetailEntity> wrapper = Wrappers.lambdaQuery();
wrapper.eq(SysDictDetailEntity::getDictId, dictId);
wrapper.orderByAsc(SysDictDetailEntity::getSort);
IPage<SysDictDetailEntity> result = sysDictDetailMapper.selectPage(page, wrapper);
if (!ObjectUtil.isEmpty(result.getRecords())) {
result.getRecords().stream().forEach(entity -> entity.setDictName(sysDictEntity.getName()));
}
return result;
}
}

View File

@ -0,0 +1,57 @@
package vip.fuck.sm.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.entity.SysDictDetailEntity;
import vip.fuck.sm.entity.SysDictEntity;
import vip.fuck.sm.mapper.SysDictDetailMapper;
import vip.fuck.sm.mapper.SysDictMapper;
import vip.fuck.sm.service.SysDictService;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonArrayFormatVisitor;
import com.fasterxml.jackson.databind.util.JSONPObject;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
import javax.annotation.Resource;
import java.util.List;
/**
* 数据字典 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component(value = "share:sysDictService",typed = true)
public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDictEntity> implements SysDictService {
@Db
private SysDictDetailMapper sysDictDetailMapper;
/**
* 根据字典类型查询字典数据信息
*
* @param name 字典名称
* @return 参数键值
**/
public JSONArray getType(String name) {
if (ObjectUtil.isEmpty(name)) {
return new JSONArray();
}
//根据名称获取字典
SysDictEntity dict = this.getOne(Wrappers.<SysDictEntity>lambdaQuery().eq(SysDictEntity::getName, name));
if (dict == null || dict.getId() == null) {
return new JSONArray();
}
//获取明细
List<SysDictDetailEntity> list = sysDictDetailMapper.selectList(Wrappers.<SysDictDetailEntity>lambdaQuery().eq(SysDictDetailEntity::getDictId, dict.getId()));
return JSONUtil.parseArray(list);
}
}

View File

@ -0,0 +1,123 @@
package vip.fuck.sm.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.utils.DateUtils;
import vip.fuck.sm.entity.SysFilesEntity;
import vip.fuck.sm.mapper.SysFilesMapper;
import vip.fuck.sm.service.SysFilesService;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
import org.noear.solon.core.handle.UploadedFile;
import org.smartboot.http.server.HttpRequest;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
* 文件上传 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component(value = "share:sysFilesService",typed = true)
public class SysFilesServiceImpl extends ServiceImpl<SysFilesMapper, SysFilesEntity> implements SysFilesService {
@Inject("${server.contextPath}")
private String contextPath;
@Inject("${file.path}")
private String filePath;
@Override
public String saveFile(UploadedFile file, HttpRequest request) {
//存储文件夹
String createTime = DateUtils.format(new Date(), DateUtils.DATEPATTERN);
String newPath = filePath + File.separator + createTime + File.separator;
File uploadDirectory = new File(newPath);
if (uploadDirectory.exists()) {
if (!uploadDirectory.isDirectory()) {
uploadDirectory.delete();
}
} else {
uploadDirectory.mkdir();
}
try {
String fileName = file.getName();
//id与filename保持一直删除文件
String fileNameNew = UUID.randomUUID().toString().replace("-", "") + getFileType(fileName);
String newFilePathName = newPath + fileNameNew;
String url = this.getRootDir(request) + ("/" + contextPath + "/files/" + createTime + "/" + fileNameNew).replaceAll("/+", "/");
//创建输出文件对象
File outFile = new File(newFilePathName);
//拷贝文件到输出文件对象
// FileUtils.copyInputStreamToFile(file.getInputStream(), outFile);
file.transferTo(outFile);
//保存文件记录
SysFilesEntity sysFilesEntity = new SysFilesEntity();
sysFilesEntity.setFileName(fileName);
sysFilesEntity.setFilePath(newFilePathName);
sysFilesEntity.setUrl(url);
this.save(sysFilesEntity);
return url;
} catch (Exception e) {
throw new BusinessException("上传文件失败");
}
}
@Override
public void removeByIdsAndFiles(List<String> ids) {
List<SysFilesEntity> list = this.listByIds(ids);
list.forEach(entity -> {
//如果之前的文件存在删除
File file = new File(entity.getFilePath());
if (file.exists()) {
file.delete();
}
});
this.removeByIds(ids);
}
/**
* 获取文件后缀名
*
* @param fileName 文件名
* @return 后缀名
*/
private String getFileType(String fileName) {
if (fileName != null && fileName.contains(".")) {
return fileName.substring(fileName.lastIndexOf("."));
}
return "";
}
/**
* 获取跟路径
*
* @param request
* @return
*/
private String getRootDir(HttpRequest request) {
// 获取协议 (http https)
String scheme = request.getScheme();
// 获取域名
String serverName = ""; // = request.getServerName();
// 获取端口号
int serverPort = request.getLocalAddress().getPort();
// 构建根路径
StringBuilder rootURL = new StringBuilder();
rootURL.append(scheme).append("://").append(serverName);
// 仅当端口不是默认端口时才包括端口号
if ((scheme.equals("http") && serverPort != 80) || (scheme.equals("https") && serverPort != 443)) {
rootURL.append(":").append(serverPort);
}
return rootURL.toString();
}
}

View File

@ -0,0 +1,64 @@
package vip.fuck.sm.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import vip.fuck.sm.common.utils.GenUtils;
import vip.fuck.sm.entity.SysGenerator;
import vip.fuck.sm.mapper.GeneratorMapper;
import vip.fuck.sm.service.ISysGeneratorService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Component;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipOutputStream;
/**
* 代码生成
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
@Slf4j
public class SysGeneratorServiceImpl implements ISysGeneratorService {
@Db
private GeneratorMapper generatorMapper;
@Override
public IPage<SysGenerator> selectAllTables(Page<SysGenerator> page, SysGenerator vo) {
return generatorMapper.selectAllTables(page, vo);
}
@Override
public byte[] generatorCode(String[] tableNames) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
for (String tableName : tableNames) {
//查询表信息
Map<String, String> table = queryTable(tableName);
//查询列信息
List<Map<String, String>> columns = queryColumns(tableName);
//生成代码
GenUtils.generatorCode(table, columns, zip);
}
IOUtils.closeQuietly(zip);
return outputStream.toByteArray();
}
public Map<String, String> queryTable(String tableName) {
return generatorMapper.queryTable(tableName);
}
public List<Map<String, String>> queryColumns(String tableName) {
return generatorMapper.queryColumns(tableName);
}
}

View File

@ -0,0 +1,14 @@
package vip.fuck.sm.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.entity.SysRoleDeptEntity;
import vip.fuck.sm.mapper.SysRoleDeptMapper;
import vip.fuck.sm.service.SysRoleDeptService;
import org.noear.solon.annotation.Component;
@Component(value = "share:sysRoleDeptService",typed = true)
public class SysRoleDeptServiceImpl extends ServiceImpl<SysRoleDeptMapper, SysRoleDeptEntity> implements SysRoleDeptService {
}

View File

@ -0,0 +1,55 @@
package vip.fuck.sm.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.entity.SysUserRole;
import vip.fuck.sm.mapper.SysUserRoleMapper;
import vip.fuck.sm.service.UserRoleService;
import vip.fuck.sm.vo.req.UserRoleOperationReqVO;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
import org.noear.solon.data.annotation.Tran;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* 用户角色 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
public class UserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements UserRoleService {
@Db
private SysUserRoleMapper sysUserRoleMapper;
@Override
public List getRoleIdsByUserId(String userId) {
LambdaQueryWrapper<SysUserRole> queryWrapper = Wrappers.<SysUserRole>lambdaQuery().select(SysUserRole::getRoleId).eq(SysUserRole::getUserId, userId);
return sysUserRoleMapper.selectObjs(queryWrapper);
}
@Tran
@Override
public void addUserRoleInfo(UserRoleOperationReqVO vo) {
if (CollectionUtils.isEmpty(vo.getRoleIds())) {
return;
}
List<SysUserRole> list = new ArrayList<>();
for (String roleId : vo.getRoleIds()) {
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(vo.getUserId());
sysUserRole.setRoleId(roleId);
list.add(sysUserRole);
}
sysUserRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, vo.getUserId()));
//批量插入
this.saveBatch(list);
}
}

View File

@ -0,0 +1,237 @@
package vip.fuck.sm.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.fuck.sm.common.exception.BusinessException;
import vip.fuck.sm.common.exception.code.BaseResponseCode;
import vip.fuck.sm.common.utils.PasswordUtils;
import vip.fuck.sm.entity.SysDept;
import vip.fuck.sm.entity.SysRole;
import vip.fuck.sm.entity.SysUser;
import vip.fuck.sm.mapper.SysDeptMapper;
import vip.fuck.sm.mapper.SysUserMapper;
import vip.fuck.sm.service.PermissionService;
import vip.fuck.sm.service.RoleService;
import vip.fuck.sm.service.UserRoleService;
import vip.fuck.sm.service.UserService;
import vip.fuck.sm.vo.req.UserRoleOperationReqVO;
import vip.fuck.sm.vo.resp.LoginRespVO;
import vip.fuck.sm.vo.resp.UserOwnRoleRespVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* 用户 服务类
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Component
@Slf4j
public class UserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements UserService {
@Db
private SysUserMapper sysUserMapper;
@Inject
private RoleService roleService;
@Inject
private PermissionService permissionService;
@Inject
private UserRoleService userRoleService;
@Db
private SysDeptMapper sysDeptMapper;
@Inject("${solon.env}")
private String env;
@Override
public void register(SysUser sysUser) {
SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, sysUser.getUsername()));
if (sysUserOne != null) {
throw new BusinessException("用户名已存在!");
}
sysUser.setSalt(PasswordUtils.getSalt());
String encode = PasswordUtils.encode(sysUser.getPassword(), sysUser.getSalt());
sysUser.setPassword(encode);
sysUserMapper.insert(sysUser);
}
@Override
public LoginRespVO login(SysUser vo) {
SysUser sysUser = sysUserMapper.selectOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, vo.getUsername()));
if (null == sysUser) {
throw new BusinessException(BaseResponseCode.NOT_ACCOUNT);
}
if (sysUser.getStatus() == 2) {
throw new BusinessException(BaseResponseCode.USER_LOCK);
}
if (!PasswordUtils.matches(sysUser.getSalt(), vo.getPassword(), sysUser.getPassword())) {
throw new BusinessException(BaseResponseCode.PASSWORD_ERROR);
}
LoginRespVO respVO = new LoginRespVO();
BeanUtil.copyProperties(sysUser, respVO);
if (StringUtils.isNotBlank(sysUser.getDeptId())) {
SysDept sysDept = sysDeptMapper.selectById(sysUser.getDeptId());
if (sysDept != null) {
sysUser.setDeptNo(sysDept.getDeptNo());
}
}
//saToken
StpUtil.login(sysUser.getId());
return respVO;
}
@Override
public void updateUserInfo(SysUser vo) {
SysUser sysUser = sysUserMapper.selectById(vo.getId());
if (null == sysUser) {
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
//如果用户名变更
if (!sysUser.getUsername().equals(vo.getUsername())) {
SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, vo.getUsername()));
if (sysUserOne != null) {
throw new BusinessException("用户名已存在!");
}
}
//如果用户名密码状态 变更删除redis中用户绑定的角色跟权限
if (!sysUser.getUsername().equals(vo.getUsername())
|| (!StringUtils.isEmpty(vo.getPassword())
&& !sysUser.getPassword().equals(PasswordUtils.encode(vo.getPassword(), sysUser.getSalt())))
|| !sysUser.getStatus().equals(vo.getStatus())) {
}
if (!StringUtils.isEmpty(vo.getPassword())) {
String newPassword = PasswordUtils.encode(vo.getPassword(), sysUser.getSalt());
vo.setPassword(newPassword);
} else {
vo.setPassword(null);
}
sysUserMapper.updateById(vo);
}
@Override
public void updateUserInfoMy(SysUser vo) {
SysUser user = sysUserMapper.selectById(StpUtil.getLoginIdAsString());
if (null == user) {
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
if (!StringUtils.isEmpty(vo.getPassword())) {
String newPassword = PasswordUtils.encode(vo.getPassword(), user.getSalt());
vo.setPassword(newPassword);
} else {
vo.setPassword(null);
}
vo.setUpdateId(StpUtil.getLoginIdAsString());
sysUserMapper.updateById(vo);
}
@Override
public IPage<SysUser> pageInfo(SysUser vo) {
LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.lambdaQuery();
if (!StringUtils.isEmpty(vo.getUsername())) {
queryWrapper.like(SysUser::getUsername, vo.getUsername());
}
if (!StringUtils.isEmpty(vo.getStartTime())) {
queryWrapper.gt(SysUser::getCreateTime, vo.getStartTime());
}
if (!StringUtils.isEmpty(vo.getEndTime())) {
queryWrapper.lt(SysUser::getCreateTime, vo.getEndTime());
}
if (!StringUtils.isEmpty(vo.getNickName())) {
queryWrapper.like(SysUser::getNickName, vo.getNickName());
}
if (null != vo.getStatus()) {
queryWrapper.eq(SysUser::getStatus, vo.getStatus());
}
if (!StringUtils.isEmpty(vo.getDeptNo())) {
LambdaQueryWrapper<SysDept> queryWrapperDept = Wrappers.lambdaQuery();
queryWrapperDept.select(SysDept::getId).like(SysDept::getRelationCode, vo.getDeptNo());
List<Object> list = sysDeptMapper.selectObjs(queryWrapperDept);
queryWrapper.in(SysUser::getDeptId, list);
}
queryWrapper.orderByDesc(SysUser::getCreateTime);
IPage<SysUser> iPage = sysUserMapper.selectPage(vo.getQueryPage(), queryWrapper);
if (!CollectionUtils.isEmpty(iPage.getRecords())) {
for (SysUser sysUser : iPage.getRecords()) {
SysDept sysDept = sysDeptMapper.selectById(sysUser.getDeptId());
if (sysDept != null) {
sysUser.setDeptName(sysDept.getName());
}
}
}
return iPage;
}
@Override
public void addUser(SysUser vo) {
SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, vo.getUsername()));
if (sysUserOne != null) {
throw new BusinessException("用户已存在,请勿重复添加!");
}
vo.setSalt(PasswordUtils.getSalt());
String encode = PasswordUtils.encode(vo.getPassword(), vo.getSalt());
vo.setPassword(encode);
vo.setStatus(1);
vo.setCreateWhere(1);
sysUserMapper.insert(vo);
if (!CollectionUtils.isEmpty(vo.getRoleIds())) {
UserRoleOperationReqVO reqVO = new UserRoleOperationReqVO();
reqVO.setUserId(vo.getId());
reqVO.setRoleIds(vo.getRoleIds());
userRoleService.addUserRoleInfo(reqVO);
}
}
@Override
public void updatePwd(SysUser vo) {
SysUser sysUser = sysUserMapper.selectById(vo.getId());
if (sysUser == null) {
throw new BusinessException(BaseResponseCode.DATA_ERROR);
}
if ("test".equals(env) && "guest".equals(sysUser.getUsername())) {
throw new BusinessException("演示环境禁止修改演示账号密码");
}
if (!PasswordUtils.matches(sysUser.getSalt(), vo.getOldPwd(), sysUser.getPassword())) {
throw new BusinessException(BaseResponseCode.OLD_PASSWORD_ERROR);
}
if (sysUser.getPassword().equals(PasswordUtils.encode(vo.getNewPwd(), sysUser.getSalt()))) {
throw new BusinessException("新密码不能与旧密码相同");
}
sysUser.setPassword(PasswordUtils.encode(vo.getNewPwd(), sysUser.getSalt()));
sysUserMapper.updateById(sysUser);
}
@Override
public UserOwnRoleRespVO getUserOwnRole(String userId) {
List<String> roleIdsByUserId = userRoleService.getRoleIdsByUserId(userId);
List<SysRole> list = roleService.list();
UserOwnRoleRespVO vo = new UserOwnRoleRespVO();
vo.setAllRole(list);
vo.setOwnRoles(roleIdsByUserId);
return vo;
}
}

View File

@ -0,0 +1,25 @@
package vip.fuck.sm.vo.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.noear.solon.validation.annotation.NotBlank;
import org.noear.solon.validation.annotation.NotEmpty;
import java.util.List;
/**
* RolePermissionOperationReqVO
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
public class RolePermissionOperationReqVO {
@ApiModelProperty(value = "角色id")
@NotBlank(message = "角色id不能为空")
private String roleId;
@ApiModelProperty(value = "菜单权限集合")
@NotEmpty(message = "菜单权限集合不能为空")
private List<String> permissionIds;
}

View File

@ -0,0 +1,25 @@
package vip.fuck.sm.vo.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.noear.solon.validation.annotation.NotBlank;
import org.noear.solon.validation.annotation.NotEmpty;
import java.util.List;
/**
* UserRoleOperationReqVO
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
public class UserRoleOperationReqVO {
@ApiModelProperty(value = "用户id")
@NotBlank(message = "用户id不能为空")
private String userId;
@ApiModelProperty(value = "角色id集合")
@NotEmpty(message = "角色id集合不能为空")
private List<String> roleIds;
}

View File

@ -0,0 +1,53 @@
package vip.fuck.sm.vo.resp;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* DeptRespNodeVO
*
* @author xian.zi.ming@qq.com fuck.vip
* @version V1.0
* @date 2020年3月18日
*/
@Data
public class DeptRespNodeVO {
@ApiModelProperty(value = "组织id")
private String id;
@ApiModelProperty(value = "组织编码")
private String deptNo;
@ApiModelProperty(value = "组织名称")
private String title;
@ApiModelProperty(value = "组织名称")
private String label;
@ApiModelProperty(value = "组织父级id")
private String pid;
@ApiModelProperty(value = "组织状态")
private Integer status;
@ApiModelProperty(value = "组织关系id")
private String relationCode;
@ApiModelProperty(value = "是否展开 默认不展开(false)")
private boolean spread = true;
@ApiModelProperty(value = "是否选中")
private boolean checked = false;
private boolean disabled = false;
@ApiModelProperty(value = "子集")
private List<?> children;
public String getLabel() {
return title;
}
}

Some files were not shown because too many files have changed in this diff Show More