commit fbfb353aacb525e04a492713c51785481f7c9fa3 Author: 冼子明 <2513889970@qq.com> Date: Fri Mar 21 23:51:45 2025 +0800 first commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a1e43ea --- /dev/null +++ b/Dockerfile @@ -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 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8eadaac --- /dev/null +++ b/LICENSE @@ -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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe7d69c --- /dev/null +++ b/README.md @@ -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 + diff --git a/doc/mysql.sql b/doc/mysql.sql new file mode 100644 index 0000000..71650ea --- /dev/null +++ b/doc/mysql.sql @@ -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'); diff --git a/doc/oracle.sql b/doc/oracle.sql new file mode 100644 index 0000000..215cf8a --- /dev/null +++ b/doc/oracle.sql @@ -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'); diff --git a/doc/sqlServer.sql b/doc/sqlServer.sql new file mode 100644 index 0000000..ce8e98d --- /dev/null +++ b/doc/sqlServer.sql @@ -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'); diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d8f0c86 --- /dev/null +++ b/pom.xml @@ -0,0 +1,177 @@ + + + 4.0.0 + + org.noear + solon-parent + 3.1.0 + + + vip.fuck.sm + solon-manager + 0.0.1-SNAPSHOT + solon-manager + Demo project for Solon + + 1.8 + 3.4.0 + 2.5.5 + 12.1.0.1-atlassian-hosted + 4.0 + 2.6 + 2.5 + 1.10 + 1.7 + 1.11.0 + 1.1.10 + 1.2.83 + 2.0.0 + 2.0.2 + 1.6.2 + + + + + org.noear + solon-web + + + + org.noear + solon-view-thymeleaf + + + org.noear + solon-logging-logback + + + org.noear + solon-serialization-jackson + + + org.noear + solon-security-validation + + + + com.baomidou + mybatis-plus-solon-plugin + 3.5.10.1 + + + + com.baomidou + mybatis-plus-jsqlparser-4.9 + 3.5.9 + + + + + org.projectlombok + lombok + + + + mysql + mysql-connector-java + runtime + 8.0.33 + + + com.zaxxer + HikariCP + 4.0.3 + + + + com.oracle + ojdbc6 + ${ojdbc6.version} + + + com.microsoft.sqlserver + sqljdbc4 + ${sqlserver.version} + runtime + + + + org.noear + solon-openapi2-knife4j + + + commons-lang + commons-lang + ${commons.lang.version} + + + commons-io + commons-io + ${commons.io.version} + + + commons-configuration + commons-configuration + ${commons.configuration.version} + + + velocity + org.apache.velocity + ${velocity.version} + + + com.github.whvcse + easy-captcha + ${easy-captcha.version} + + + commons-codec + commons-codec + 1.13 + + + + + org.noear + sa-token-solon-plugin + + + cn.hutool + hutool-all + 5.8.22 + + + + + + + + manager + + + org.noear + solon-maven-plugin + + + + + + + tencent + https://mirrors.cloud.tencent.com/nexus/repository/maven-public/ + + false + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + diff --git a/src/main/java/vip/fuck/sm/SolonManagerApplication.java b/src/main/java/vip/fuck/sm/SolonManagerApplication.java new file mode 100644 index 0000000..13c7893 --- /dev/null +++ b/src/main/java/vip/fuck/sm/SolonManagerApplication.java @@ -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 优先级更高 + }); + + } + +} diff --git a/src/main/java/vip/fuck/sm/common/aop/annotation/LogAnnotation.java b/src/main/java/vip/fuck/sm/common/aop/annotation/LogAnnotation.java new file mode 100644 index 0000000..50ed105 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/aop/annotation/LogAnnotation.java @@ -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 ""; +} diff --git a/src/main/java/vip/fuck/sm/common/aop/aspect/LoggingRouterInterceptor.java b/src/main/java/vip/fuck/sm/common/aop/aspect/LoggingRouterInterceptor.java new file mode 100644 index 0000000..9e5b125 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/aop/aspect/LoggingRouterInterceptor.java @@ -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 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); + + } + } + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/GlobalResultInterceptor.java b/src/main/java/vip/fuck/sm/common/config/GlobalResultInterceptor.java new file mode 100644 index 0000000..34a7a00 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/GlobalResultInterceptor.java @@ -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); + } + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/MetaObjectHandlerConfig.java b/src/main/java/vip/fuck/sm/common/config/MetaObjectHandlerConfig.java new file mode 100644 index 0000000..0067cc3 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/MetaObjectHandlerConfig.java @@ -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 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 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); +// } + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/MyBatisPlusConfig.java b/src/main/java/vip/fuck/sm/common/config/MyBatisPlusConfig.java new file mode 100644 index 0000000..ae1ec4b --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/MyBatisPlusConfig.java @@ -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()); + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/StpInterfaceImpl.java b/src/main/java/vip/fuck/sm/common/config/StpInterfaceImpl.java new file mode 100644 index 0000000..448fc73 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/StpInterfaceImpl.java @@ -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 getPermissionList(Object loginId, String loginType) { + if (loginType.equals(StpUtil.TYPE)) { + return permissionService.getPermissionsByUserId(String.valueOf(loginId)); + } + return null; + } + + /** + * 返回一个账号所拥有的角色标识集合 + */ + @Override + public List getRoleList(Object loginId, String loginType) { + return null; + } + +} diff --git a/src/main/java/vip/fuck/sm/common/config/SwaggerConfiguration.java b/src/main/java/vip/fuck/sm/common/config/SwaggerConfiguration.java new file mode 100644 index 0000000..081d0f7 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/SwaggerConfiguration.java @@ -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"); //可以加多条,以包名为单位 + + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/WebMvcConfigurer.java b/src/main/java/vip/fuck/sm/common/config/WebMvcConfigurer.java new file mode 100644 index 0000000..d15af9d --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/WebMvcConfigurer.java @@ -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"); + }); + + + } +} + diff --git a/src/main/java/vip/fuck/sm/common/exception/BusinessException.java b/src/main/java/vip/fuck/sm/common/exception/BusinessException.java new file mode 100644 index 0000000..343a384 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/exception/BusinessException.java @@ -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; + } +} diff --git a/src/main/java/vip/fuck/sm/common/exception/code/BaseResponseCode.java b/src/main/java/vip/fuck/sm/common/exception/code/BaseResponseCode.java new file mode 100644 index 0000000..8fbc9c4 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/exception/code/BaseResponseCode.java @@ -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; + } +} diff --git a/src/main/java/vip/fuck/sm/common/exception/code/ResponseCodeInterface.java b/src/main/java/vip/fuck/sm/common/exception/code/ResponseCodeInterface.java new file mode 100644 index 0000000..43a565f --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/exception/code/ResponseCodeInterface.java @@ -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(); +} diff --git a/src/main/java/vip/fuck/sm/common/exception/handler/AppFilter.java b/src/main/java/vip/fuck/sm/common/exception/handler/AppFilter.java new file mode 100644 index 0000000..1e37f18 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/exception/handler/AppFilter.java @@ -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)); + } + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/utils/AssertUtil.java b/src/main/java/vip/fuck/sm/common/utils/AssertUtil.java new file mode 100644 index 0000000..ddb3c4b --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/AssertUtil.java @@ -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); + } + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/utils/Constant.java b/src/main/java/vip/fuck/sm/common/utils/Constant.java new file mode 100644 index 0000000..2d37002 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/Constant.java @@ -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; +} diff --git a/src/main/java/vip/fuck/sm/common/utils/DataResult.java b/src/main/java/vip/fuck/sm/common/utils/DataResult.java new file mode 100644 index 0000000..2964ca3 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/DataResult.java @@ -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 { + + /** + * 请求响应code,0为成功 其他为失败 + */ + @ApiModelProperty(value = "请求响应code,0为成功 其他为失败", 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); + } + + +} diff --git a/src/main/java/vip/fuck/sm/common/utils/DateUtils.java b/src/main/java/vip/fuck/sm/common/utils/DateUtils.java new file mode 100644 index 0000000..893cce3 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/DateUtils.java @@ -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; + } +} diff --git a/src/main/java/vip/fuck/sm/common/utils/GenUtils.java b/src/main/java/vip/fuck/sm/common/utils/GenUtils.java new file mode 100644 index 0000000..86fe468 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/GenUtils.java @@ -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 getTemplates() { + List 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 table, + List> 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 columsList = new ArrayList<>(); + List htmlColumsList = new ArrayList<>(); + for (Map 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 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 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; + } +} diff --git a/src/main/java/vip/fuck/sm/common/utils/PasswordEncoder.java b/src/main/java/vip/fuck/sm/common/utils/PasswordEncoder.java new file mode 100644 index 0000000..c356b97 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/PasswordEncoder.java @@ -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) { + + } + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/utils/PasswordUtils.java b/src/main/java/vip/fuck/sm/common/utils/PasswordUtils.java new file mode 100644 index 0000000..80bf808 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/PasswordUtils.java @@ -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); + } + +} diff --git a/src/main/java/vip/fuck/sm/controller/DeptController.java b/src/main/java/vip/fuck/sm/controller/DeptController.java new file mode 100644 index 0000000..97c8262 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/DeptController.java @@ -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 getTree( String deptId) { + return deptService.deptTreeList(deptId, false); + } + + @Get @Mapping ("/depts") + @ApiOperation(value = "获取机构列表接口") + @LogAnnotation(title = "机构管理", action = "获取所有组织机构") + @SaCheckPermission("sys:dept:list") + public List getDeptAll() { + List deptList = deptService.list(); + deptList.stream().forEach(entity -> { + SysDept parentDept = deptService.getById(entity.getPid()); + if (parentDept != null) { + entity.setPidName(parentDept.getName()); + } + }); + return deptList; + } + +} diff --git a/src/main/java/vip/fuck/sm/controller/IndexController.java b/src/main/java/vip/fuck/sm/controller/IndexController.java new file mode 100644 index 0000000..a178c6f --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/IndexController.java @@ -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"); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/PermissionController.java b/src/main/java/vip/fuck/sm/controller/PermissionController.java new file mode 100644 index 0000000..4f1cd08 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/PermissionController.java @@ -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 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 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 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: + } + } +} diff --git a/src/main/java/vip/fuck/sm/controller/RoleController.java b/src/main/java/vip/fuck/sm/controller/RoleController.java new file mode 100644 index 0000000..127335d --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/RoleController.java @@ -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.lambdaQuery().eq(SysRoleDeptEntity::getRoleId, vo.getId())); + //如果不是自定义 + if (vo.getDataScope() != 2) { + vo.setDepts(null); + } + if (!ObjectUtil.isEmpty(vo.getDepts())) { + List 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 pageInfo( SysRole vo) { + LambdaQueryWrapper 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); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/SysContentController.java b/src/main/java/vip/fuck/sm/controller/SysContentController.java new file mode 100644 index 0000000..1454915 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysContentController.java @@ -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 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 findListByPage( SysContentEntity sysContent) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + if (!StrUtil.isEmpty(sysContent.getTitle())) { + queryWrapper.like(SysContentEntity::getTitle, sysContent.getTitle()); + } + return sysContentService.page(sysContent.getQueryPage(), queryWrapper); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/SysDictController.java b/src/main/java/vip/fuck/sm/controller/SysDictController.java new file mode 100644 index 0000000..d17fbda --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysDictController.java @@ -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.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 ids) { + sysDictService.removeByIds(ids); + //删除detail + sysDictDetailService.remove(Wrappers.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 findListByPage( SysDictEntity sysDict) { + LambdaQueryWrapper 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); + } + +} diff --git a/src/main/java/vip/fuck/sm/controller/SysDictDetailController.java b/src/main/java/vip/fuck/sm/controller/SysDictDetailController.java new file mode 100644 index 0000000..23b033c --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysDictDetailController.java @@ -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 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 ids) { + sysDictDetailService.removeByIds(ids); + } + + @ApiOperation(value = "更新") + @Put + @Mapping ("/update") + @SaCheckPermission("sysDict:update") + public void update( SysDictDetailEntity sysDictDetail) { + AssertUtil.isStringNotBlank(sysDictDetail.getValue(), "字典值不能为空"); + LambdaQueryWrapper 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 findListByPage( SysDictDetailEntity sysDictDetail) { + if (StrUtil.isEmpty(sysDictDetail.getDictId())) { + return new Page<>(); + } + return sysDictDetailService.listByPage(sysDictDetail.getQueryPage(), sysDictDetail.getDictId()); + } + +} diff --git a/src/main/java/vip/fuck/sm/controller/SysFilesController.java b/src/main/java/vip/fuck/sm/controller/SysFilesController.java new file mode 100644 index 0000000..7feba05 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysFilesController.java @@ -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 ids) { + sysFilesService.removeByIdsAndFiles(ids); + } + + @ApiOperation(value = "查询分页数据") + @Post @Mapping ("/listByPage") + @SaCheckPermission("sysFiles:list") + public IPage findListByPage( SysFilesEntity sysFiles) { + return sysFilesService.page(sysFiles.getQueryPage(), Wrappers.lambdaQuery().orderByDesc(SysFilesEntity::getCreateDate)); + } + + +} diff --git a/src/main/java/vip/fuck/sm/controller/SysGeneratorController.java b/src/main/java/vip/fuck/sm/controller/SysGeneratorController.java new file mode 100644 index 0000000..44cc15d --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysGeneratorController.java @@ -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 findListByPage( SysGenerator vo) { + return sysGeneratorService.selectAllTables(vo.getQueryPage(), vo); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/SysLogController.java b/src/main/java/vip/fuck/sm/controller/SysLogController.java new file mode 100644 index 0000000..5bf0139 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysLogController.java @@ -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 pageInfo( SysLog vo) { + LambdaQueryWrapper 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 logIds) { + logService.removeByIds(logIds); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/UserController.java b/src/main/java/vip/fuck/sm/controller/UserController.java new file mode 100644 index 0000000..285b371 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/UserController.java @@ -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 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 userIds) { + //删除用户, 删除redis的绑定的角色跟权限 + LambdaQueryWrapper 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 roleIds) { + + LambdaQueryWrapper 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); + } + } +} diff --git a/src/main/java/vip/fuck/sm/controller/UserRoleController.java b/src/main/java/vip/fuck/sm/controller/UserRoleController.java new file mode 100644 index 0000000..b692caf --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/UserRoleController.java @@ -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); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/api/TestController.java b/src/main/java/vip/fuck/sm/controller/api/TestController.java new file mode 100644 index 0000000..402a23a --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/api/TestController.java @@ -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(); + } +} diff --git a/src/main/java/vip/fuck/sm/entity/BasePageEntity.java b/src/main/java/vip/fuck/sm/entity/BasePageEntity.java new file mode 100644 index 0000000..d6004a4 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/BasePageEntity.java @@ -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 + * @return + */ + @JsonIgnore + public Page getQueryPage() { + return new Page(page == null ? 1 : page, limit == null ? 10 : limit); + } +} diff --git a/src/main/java/vip/fuck/sm/entity/ColumnEntity.java b/src/main/java/vip/fuck/sm/entity/ColumnEntity.java new file mode 100644 index 0000000..f4b6623 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/ColumnEntity.java @@ -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; + } +} diff --git a/src/main/java/vip/fuck/sm/entity/SysContentEntity.java b/src/main/java/vip/fuck/sm/entity/SysContentEntity.java new file mode 100644 index 0000000..65deaef --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysContentEntity.java @@ -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; + + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysDept.java b/src/main/java/vip/fuck/sm/entity/SysDept.java new file mode 100644 index 0000000..7262073 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysDept.java @@ -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; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysDictDetailEntity.java b/src/main/java/vip/fuck/sm/entity/SysDictDetailEntity.java new file mode 100644 index 0000000..94497de --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysDictDetailEntity.java @@ -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; + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysDictEntity.java b/src/main/java/vip/fuck/sm/entity/SysDictEntity.java new file mode 100644 index 0000000..59ff5e9 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysDictEntity.java @@ -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; + + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java b/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java new file mode 100644 index 0000000..5c4f1ac --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java @@ -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; + + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysGenerator.java b/src/main/java/vip/fuck/sm/entity/SysGenerator.java new file mode 100644 index 0000000..cfc75c0 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysGenerator.java @@ -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; + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysLog.java b/src/main/java/vip/fuck/sm/entity/SysLog.java new file mode 100644 index 0000000..d444de1 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysLog.java @@ -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; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysPermission.java b/src/main/java/vip/fuck/sm/entity/SysPermission.java new file mode 100644 index 0000000..3127fa9 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysPermission.java @@ -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; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysRole.java b/src/main/java/vip/fuck/sm/entity/SysRole.java new file mode 100644 index 0000000..5c1eff9 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysRole.java @@ -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 permissionRespNodes; + @TableField(exist = false) + private List deptRespNodes; + + @TableField(exist = false) + private String startTime; + + @TableField(exist = false) + private String endTime; + + @TableField(exist = false) + private List permissions; + + @TableField(exist = false) + private List depts; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysRoleDeptEntity.java b/src/main/java/vip/fuck/sm/entity/SysRoleDeptEntity.java new file mode 100644 index 0000000..5f2c854 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysRoleDeptEntity.java @@ -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; + + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysRolePermission.java b/src/main/java/vip/fuck/sm/entity/SysRolePermission.java new file mode 100644 index 0000000..6e76d9f --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysRolePermission.java @@ -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; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysUser.java b/src/main/java/vip/fuck/sm/entity/SysUser.java new file mode 100644 index 0000000..44194a0 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysUser.java @@ -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 roleIds; + + @TableField(exist = false) + private String captcha; +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysUserRole.java b/src/main/java/vip/fuck/sm/entity/SysUserRole.java new file mode 100644 index 0000000..8f5a752 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysUserRole.java @@ -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; + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/TableEntity.java b/src/main/java/vip/fuck/sm/entity/TableEntity.java new file mode 100644 index 0000000..b8dd062 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/TableEntity.java @@ -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 columns; + private List htmlColumns; + + //类名(第一个字母大写),如:sys_user => SysUser + private String className; + //类名(第一个字母小写),如:sys_user => sysUser + private String classname; + //类名(都小写),如:sys_user => sysuser + private String classNameLower; + + public List getHtmlColumns() { + return htmlColumns; + } + + public void setHtmlColumns(List 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 getColumns() { + return columns; + } + + public void setColumns(List 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; + } +} diff --git a/src/main/java/vip/fuck/sm/mapper/GeneratorMapper.java b/src/main/java/vip/fuck/sm/mapper/GeneratorMapper.java new file mode 100644 index 0000000..24fe714 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/GeneratorMapper.java @@ -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 { + + IPage selectAllTables(Page page, @Param(value = "vo") SysGenerator vo); + + Map queryTable(String tableName); + + List> queryColumns(String tableName); +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysContentMapper.java b/src/main/java/vip/fuck/sm/mapper/SysContentMapper.java new file mode 100644 index 0000000..593d76a --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysContentMapper.java @@ -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 { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysDeptMapper.java b/src/main/java/vip/fuck/sm/mapper/SysDeptMapper.java new file mode 100644 index 0000000..2b7ae28 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysDeptMapper.java @@ -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 { +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysDictDetailMapper.java b/src/main/java/vip/fuck/sm/mapper/SysDictDetailMapper.java new file mode 100644 index 0000000..ef503dd --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysDictDetailMapper.java @@ -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 { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysDictMapper.java b/src/main/java/vip/fuck/sm/mapper/SysDictMapper.java new file mode 100644 index 0000000..270b5fa --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysDictMapper.java @@ -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 { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysFilesMapper.java b/src/main/java/vip/fuck/sm/mapper/SysFilesMapper.java new file mode 100644 index 0000000..9859cf7 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysFilesMapper.java @@ -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 { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysLogMapper.java b/src/main/java/vip/fuck/sm/mapper/SysLogMapper.java new file mode 100644 index 0000000..2a4fbfa --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysLogMapper.java @@ -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 { +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysPermissionMapper.java b/src/main/java/vip/fuck/sm/mapper/SysPermissionMapper.java new file mode 100644 index 0000000..1214e16 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysPermissionMapper.java @@ -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 { + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysRoleDeptMapper.java b/src/main/java/vip/fuck/sm/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..60daf8b --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysRoleDeptMapper.java @@ -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 { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysRoleMapper.java b/src/main/java/vip/fuck/sm/mapper/SysRoleMapper.java new file mode 100644 index 0000000..cf47ea6 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysRoleMapper.java @@ -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 { + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysRolePermissionMapper.java b/src/main/java/vip/fuck/sm/mapper/SysRolePermissionMapper.java new file mode 100644 index 0000000..acd1810 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysRolePermissionMapper.java @@ -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 { + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysUserMapper.java b/src/main/java/vip/fuck/sm/mapper/SysUserMapper.java new file mode 100644 index 0000000..7ea2cf6 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysUserMapper.java @@ -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 { +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysUserRoleMapper.java b/src/main/java/vip/fuck/sm/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..fc207d7 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysUserRoleMapper.java @@ -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 { + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/DeptService.java b/src/main/java/vip/fuck/sm/service/DeptService.java new file mode 100644 index 0000000..2170f7b --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/DeptService.java @@ -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 { + + /** + * 添加部门 + * + * @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 deptTreeList(String deptId, Boolean disabled); +} diff --git a/src/main/java/vip/fuck/sm/service/HomeService.java b/src/main/java/vip/fuck/sm/service/HomeService.java new file mode 100644 index 0000000..7a83cbf --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/HomeService.java @@ -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); +} diff --git a/src/main/java/vip/fuck/sm/service/ISysGeneratorService.java b/src/main/java/vip/fuck/sm/service/ISysGeneratorService.java new file mode 100644 index 0000000..6f69bee --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/ISysGeneratorService.java @@ -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 selectAllTables(Page page, SysGenerator vo); + + /** + * 生成代码 + * + * @param tables tables + * @return byte[] + */ + byte[] generatorCode(String[] tables); +} diff --git a/src/main/java/vip/fuck/sm/service/LogService.java b/src/main/java/vip/fuck/sm/service/LogService.java new file mode 100644 index 0000000..31b2b29 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/LogService.java @@ -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 { +} diff --git a/src/main/java/vip/fuck/sm/service/PermissionService.java b/src/main/java/vip/fuck/sm/service/PermissionService.java new file mode 100644 index 0000000..05c1196 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/PermissionService.java @@ -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 { + + /** + * 根据userId获取权限 + * + * @param userId userId + * @return 权限 + */ + List getPermission(String userId); + + /** + * 删除权限 + * + * @param permissionId 权限id + */ + void deleted(String permissionId); + + /** + * 获取所有 + * + * @return List + */ + List selectAll(Integer status); + + /** + * 根据userId获取权限标志 + * + * @param userId userId + * @return Set + */ + List getPermissionsByUserId(String userId); + + /** + * 根据userId获取权限树 + * + * @param userId + * @return List + */ + List permissionTreeList(String userId); + + /** + * 根据权限树 + * + * @return List + */ + List selectAllByTree(Integer status); + + /** + * 根据目录树 + * + * @param permissionId permissionId + * @return List + */ + List selectAllMenuByTree(String permissionId); + + + /** + * 根据权限id获取绑定的userId + * + * @param permissionId permissionId + * @return List + */ + List getUserIdsById(String permissionId); + + /** + * 更新 + * + * @param vo vo + */ + void updatePermission(SysPermission vo); +} diff --git a/src/main/java/vip/fuck/sm/service/RolePermissionService.java b/src/main/java/vip/fuck/sm/service/RolePermissionService.java new file mode 100644 index 0000000..278211d --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/RolePermissionService.java @@ -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 { + + /** + * 角色绑定权限 + * + * @param vo vo + */ + void addRolePermission(RolePermissionOperationReqVO vo); +} diff --git a/src/main/java/vip/fuck/sm/service/RoleService.java b/src/main/java/vip/fuck/sm/service/RoleService.java new file mode 100644 index 0000000..05f0427 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/RoleService.java @@ -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 { + + /** + * 添加角色 + * + * @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 getRoleInfoByUserId(String userId); +} diff --git a/src/main/java/vip/fuck/sm/service/SysContentService.java b/src/main/java/vip/fuck/sm/service/SysContentService.java new file mode 100644 index 0000000..4a10a05 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysContentService.java @@ -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 { + +} + diff --git a/src/main/java/vip/fuck/sm/service/SysDictDetailService.java b/src/main/java/vip/fuck/sm/service/SysDictDetailService.java new file mode 100644 index 0000000..a7f3f1e --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysDictDetailService.java @@ -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 { + + /** + * 分页 + * + * @param page page + * @param dictId dictId + * @return IPage + */ + IPage listByPage(Page page, String dictId); +} + diff --git a/src/main/java/vip/fuck/sm/service/SysDictService.java b/src/main/java/vip/fuck/sm/service/SysDictService.java new file mode 100644 index 0000000..1d5af2e --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysDictService.java @@ -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 { + +} + diff --git a/src/main/java/vip/fuck/sm/service/SysFilesService.java b/src/main/java/vip/fuck/sm/service/SysFilesService.java new file mode 100644 index 0000000..a95e696 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysFilesService.java @@ -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 { + + /** + * 保存图片返回url + * + * @param file + * @param request + * @return + */ + String saveFile(UploadedFile file, HttpRequest request); + + /** + * 删除图片 + * + * @param ids + */ + void removeByIdsAndFiles(List ids); +} + diff --git a/src/main/java/vip/fuck/sm/service/SysRoleDeptService.java b/src/main/java/vip/fuck/sm/service/SysRoleDeptService.java new file mode 100644 index 0000000..1b4d0cb --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysRoleDeptService.java @@ -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 { + +} + diff --git a/src/main/java/vip/fuck/sm/service/UserRoleService.java b/src/main/java/vip/fuck/sm/service/UserRoleService.java new file mode 100644 index 0000000..7ca2b14 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/UserRoleService.java @@ -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 { + + /** + * 根据userId获取绑定的角色id + * + * @param userId userId + * @return List + */ + List getRoleIdsByUserId(String userId); + + /** + * 用户绑定角色 + * + * @param vo vo + */ + void addUserRoleInfo(UserRoleOperationReqVO vo); +} diff --git a/src/main/java/vip/fuck/sm/service/UserService.java b/src/main/java/vip/fuck/sm/service/UserService.java new file mode 100644 index 0000000..fc09156 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/UserService.java @@ -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 { + + /** + * 注册 + * + * @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 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); +} diff --git a/src/main/java/vip/fuck/sm/service/impl/DeptServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/DeptServiceImpl.java new file mode 100644 index 0000000..375cfba --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/DeptServiceImpl.java @@ -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 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 wrapper = Wrappers.lambdaQuery(); + wrapper.likeLeft(SysDept::getDeptNo, sysDept.getDeptNo()); + List 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 deptIds = sysDeptMapper.selectObjs(Wrappers.lambdaQuery().select(SysDept::getId).likeRight(SysDept::getRelationCode, sysDept.getRelationCode())); + List list = sysUserMapper.selectList(Wrappers.lambdaQuery().in(SysUser::getDeptId, deptIds)); + if (!ObjectUtil.isEmpty(list)) { + throw new BusinessException(BaseResponseCode.NOT_PERMISSION_DELETED_DEPT); + } + sysDeptMapper.deleteById(id); + } + + @Override + public List deptTreeList(String deptId, Boolean disabled) { + List 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 queryWrapper = Wrappers.lambdaQuery().likeRight(SysDept::getRelationCode, sysDept.getRelationCode()); + List childIds = sysDeptMapper.selectObjs(queryWrapper); + list = sysDeptMapper.selectList(Wrappers.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 result = new ArrayList<>(); + result.add(respNodeVO); + return result; + } + + private List getTree(List all) { + List 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 getChild(String id, List all) { + List 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 lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.select(SysDept::getDeptNo); + //获取所有的deptCode + List deptCodes = sysDeptMapper.selectObjs(lambdaQueryWrapper); + AtomicReference 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(); + } +} diff --git a/src/main/java/vip/fuck/sm/service/impl/HomeServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/HomeServiceImpl.java new file mode 100644 index 0000000..a53eb69 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/HomeServiceImpl.java @@ -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 menus = permissionService.permissionTreeList(userId); + + HomeRespVO respVO = new HomeRespVO(); + respVO.setMenus(menus); + respVO.setUserInfo(vo); + + return respVO; + } +} diff --git a/src/main/java/vip/fuck/sm/service/impl/LogServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/LogServiceImpl.java new file mode 100644 index 0000000..d509d1e --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/LogServiceImpl.java @@ -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 implements LogService { +} diff --git a/src/main/java/vip/fuck/sm/service/impl/PermissionServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/PermissionServiceImpl.java new file mode 100644 index 0000000..a59dc5a --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/PermissionServiceImpl.java @@ -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 implements PermissionService { + @Inject + private UserRoleService userRoleService; + @Inject + private RolePermissionService rolePermissionService; + @Db + private SysPermissionMapper sysPermissionMapper; + + /** + * 根据用户查询拥有的权限 + * 先查出用户拥有的角色 + * 再去差用户拥有的权限 + * 也可以多表关联查询 + */ + @Override + public List getPermission(String userId) { + List roleIds = userRoleService.getRoleIdsByUserId(userId); + if (ObjectUtil.isEmpty(roleIds)) { + return null; + } + List permissionIds = rolePermissionService.listObjs(Wrappers.lambdaQuery().select(SysRolePermission::getPermissionId).in(SysRolePermission::getRoleId, roleIds)); + if (ObjectUtil.isEmpty(permissionIds)) { + return null; + } + + LambdaQueryWrapper queryWrapper = Wrappers.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 userIds = getUserIdsById(permissionId); + SysPermission sysPermission = sysPermissionMapper.selectById(permissionId); + if (null == sysPermission) { + log.error("传入 的 id:{}不合法", permissionId); + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + //获取下一级 + List childs = sysPermissionMapper.selectList(Wrappers.lambdaQuery().eq(SysPermission::getPid, permissionId)); + if (!ObjectUtil.isEmpty(childs)) { + throw new BusinessException(BaseResponseCode.ROLE_PERMISSION_RELATION); + } + sysPermissionMapper.deleteById(permissionId); + //删除和角色关联 + rolePermissionService.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getPermissionId, permissionId)); + + + } + + @Override + public void updatePermission(SysPermission vo) { + sysPermissionMapper.updateById(vo); + } + + /** + * 获取所有菜单权限 + */ + @Override + public List selectAll(Integer status) { + List result = sysPermissionMapper.selectList(Wrappers.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 getPermissionsByUserId(String userId) { + + List list = getPermission(userId); + Set 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(permissions); + } + + /** + * 以树型的形式把用户拥有的菜单权限返回给客户端 + */ + @Override + public List permissionTreeList(String userId) { + List list = getPermission(userId); + return getTree(list, true); + } + + /** + * 递归获取菜单树 + */ + private List getTree(List all, boolean type) { + + List 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 getChildAll(String id, List all) { + + List 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 getChildExcBtn(String id, List all) { + + List 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 selectAllByTree(Integer status) { + + List list = selectAll(status); + return getTree(list, false); + } + + /** + * 获取所有的目录菜单树排除按钮 + * 因为不管是新增或者修改 + * 选择所属菜单目录的时候 + * 都不可能选择到按钮 + * 而且编辑的时候 所属目录不能 + * 选择自己和它的子类 + */ + @Override + public List selectAllMenuByTree(String permissionId) { + + List list = selectAll(1); + if (!ObjectUtil.isEmpty(list) && !ObjectUtil.isEmpty(permissionId)) { + for (SysPermission sysPermission : list) { + if (sysPermission.getId().equals(permissionId)) { + list.remove(sysPermission); + break; + } + } + } + List 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 roleIds = rolePermissionService.listObjs(Wrappers.lambdaQuery().select(SysRolePermission::getRoleId).eq(SysRolePermission::getPermissionId, id)); + if (!ObjectUtil.isEmpty(roleIds)) { + //根据角色id, 获取关联用户 + return userRoleService.listObjs(Wrappers.lambdaQuery().select(SysUserRole::getUserId).in(SysUserRole::getRoleId, roleIds)); + } + return null; + } + + +} diff --git a/src/main/java/vip/fuck/sm/service/impl/RolePermissionServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/RolePermissionServiceImpl.java new file mode 100644 index 0000000..2f034c9 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/RolePermissionServiceImpl.java @@ -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 implements RolePermissionService { + @Override + public void addRolePermission(RolePermissionOperationReqVO vo) { + List 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.lambdaQuery().eq(SysRolePermission::getRoleId, vo.getRoleId())); + this.saveBatch(list); + } + +} diff --git a/src/main/java/vip/fuck/sm/service/impl/RoleServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..dcb115d --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/RoleServiceImpl.java @@ -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 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.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 permissionRespNodes = permissionService.selectAllByTree(1); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().select(SysRolePermission::getPermissionId).eq(SysRolePermission::getRoleId, sysRole.getId()); + Set checkList = + new HashSet<>(rolePermissionService.listObjs(queryWrapper)); + setChecked(permissionRespNodes, checkList); + sysRole.setPermissionRespNodes(permissionRespNodes); + + LambdaQueryWrapper queryWrapperDept = Wrappers.lambdaQuery().select(SysRoleDeptEntity::getDeptId).eq(SysRoleDeptEntity::getRoleId, sysRole.getId()); + List deptRespNodes = deptService.deptTreeList(null, true); + Set checkDeptList = + new HashSet<>(sysRoleDeptService.listObjs(queryWrapperDept)); + setCheckedDept(deptRespNodes, checkDeptList); + sysRole.setDeptRespNodes(deptRespNodes); + return sysRole; + } + + private void setCheckedDept(List deptRespNodes, Set checkDeptList) { + for (DeptRespNodeVO node : deptRespNodes) { + if (checkDeptList.contains(node.getId())) { + node.setChecked(true); + } + setCheckedDept((List) node.getChildren(), checkDeptList); + } + } + + + private void setChecked(List list, Set checkList) { + for (PermissionRespNode node : list) { + if (checkList.contains(node.getId()) + && ObjectUtil.isEmpty(node.getChildren())) { + node.setChecked(true); + } + setChecked((List) node.getChildren(), checkList); + } + } + + @Tran + @Override + public void deletedRole(String id) { + //删除角色 + sysRoleMapper.deleteById(id); + //删除角色权限关联 + rolePermissionService.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getRoleId, id)); + //删除角色用户关联 + userRoleService.remove(Wrappers.lambdaQuery().eq(SysUserRole::getRoleId, id)); + } + + @Override + public List getRoleInfoByUserId(String userId) { + + List roleIds = userRoleService.getRoleIdsByUserId(userId); + if (ObjectUtil.isEmpty(roleIds)) { + return null; + } + return sysRoleMapper.selectBatchIds(roleIds); + } +} diff --git a/src/main/java/vip/fuck/sm/service/impl/SysContentServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysContentServiceImpl.java new file mode 100644 index 0000000..348e6fe --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysContentServiceImpl.java @@ -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 implements SysContentService { + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/SysDictDetailServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysDictDetailServiceImpl.java new file mode 100644 index 0000000..fa6315c --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysDictDetailServiceImpl.java @@ -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 implements SysDictDetailService { + @Db + private SysDictDetailMapper sysDictDetailMapper; + @Db + private SysDictMapper sysDictMapper; + + + @Override + public IPage listByPage(Page page, String dictId) { + + SysDictEntity sysDictEntity = sysDictMapper.selectById(dictId); + if (sysDictEntity == null) { + throw new BusinessException("获取字典数据失败!"); + } + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(SysDictDetailEntity::getDictId, dictId); + wrapper.orderByAsc(SysDictDetailEntity::getSort); + IPage result = sysDictDetailMapper.selectPage(page, wrapper); + if (!ObjectUtil.isEmpty(result.getRecords())) { + result.getRecords().stream().forEach(entity -> entity.setDictName(sysDictEntity.getName())); + } + return result; + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/SysDictServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysDictServiceImpl.java new file mode 100644 index 0000000..0e4fbd4 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysDictServiceImpl.java @@ -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 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.lambdaQuery().eq(SysDictEntity::getName, name)); + if (dict == null || dict.getId() == null) { + return new JSONArray(); + } + //获取明细 + List list = sysDictDetailMapper.selectList(Wrappers.lambdaQuery().eq(SysDictDetailEntity::getDictId, dict.getId())); + return JSONUtil.parseArray(list); + } + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java new file mode 100644 index 0000000..72b2e93 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java @@ -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 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 ids) { + List 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(); + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/SysGeneratorServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysGeneratorServiceImpl.java new file mode 100644 index 0000000..bdadf7c --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysGeneratorServiceImpl.java @@ -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 selectAllTables(Page 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 table = queryTable(tableName); + //查询列信息 + List> columns = queryColumns(tableName); + //生成代码 + GenUtils.generatorCode(table, columns, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + public Map queryTable(String tableName) { + return generatorMapper.queryTable(tableName); + } + + public List> queryColumns(String tableName) { + return generatorMapper.queryColumns(tableName); + } + + +} diff --git a/src/main/java/vip/fuck/sm/service/impl/SysRoleDeptServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysRoleDeptServiceImpl.java new file mode 100644 index 0000000..1190493 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysRoleDeptServiceImpl.java @@ -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 implements SysRoleDeptService { + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/UserRoleServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/UserRoleServiceImpl.java new file mode 100644 index 0000000..ff3d07e --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/UserRoleServiceImpl.java @@ -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 implements UserRoleService { + @Db + private SysUserRoleMapper sysUserRoleMapper; + + @Override + public List getRoleIdsByUserId(String userId) { + LambdaQueryWrapper queryWrapper = Wrappers.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 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.lambdaQuery().eq(SysUserRole::getUserId, vo.getUserId())); + //批量插入 + this.saveBatch(list); + } +} diff --git a/src/main/java/vip/fuck/sm/service/impl/UserServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..a757cce --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/UserServiceImpl.java @@ -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 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.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.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.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 pageInfo(SysUser vo) { + LambdaQueryWrapper 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 queryWrapperDept = Wrappers.lambdaQuery(); + queryWrapperDept.select(SysDept::getId).like(SysDept::getRelationCode, vo.getDeptNo()); + List list = sysDeptMapper.selectObjs(queryWrapperDept); + queryWrapper.in(SysUser::getDeptId, list); + } + queryWrapper.orderByDesc(SysUser::getCreateTime); + IPage 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.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 roleIdsByUserId = userRoleService.getRoleIdsByUserId(userId); + List list = roleService.list(); + UserOwnRoleRespVO vo = new UserOwnRoleRespVO(); + vo.setAllRole(list); + vo.setOwnRoles(roleIdsByUserId); + return vo; + } +} diff --git a/src/main/java/vip/fuck/sm/vo/req/RolePermissionOperationReqVO.java b/src/main/java/vip/fuck/sm/vo/req/RolePermissionOperationReqVO.java new file mode 100644 index 0000000..3bbafb4 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/req/RolePermissionOperationReqVO.java @@ -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 permissionIds; +} diff --git a/src/main/java/vip/fuck/sm/vo/req/UserRoleOperationReqVO.java b/src/main/java/vip/fuck/sm/vo/req/UserRoleOperationReqVO.java new file mode 100644 index 0000000..8837be3 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/req/UserRoleOperationReqVO.java @@ -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 roleIds; +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/DeptRespNodeVO.java b/src/main/java/vip/fuck/sm/vo/resp/DeptRespNodeVO.java new file mode 100644 index 0000000..708f2f1 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/DeptRespNodeVO.java @@ -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; + } + +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/HomeRespVO.java b/src/main/java/vip/fuck/sm/vo/resp/HomeRespVO.java new file mode 100644 index 0000000..fe21f85 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/HomeRespVO.java @@ -0,0 +1,22 @@ +package vip.fuck.sm.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * HomeRespVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class HomeRespVO { + @ApiModelProperty(value = "用户信息") + private UserInfoRespVO userInfo; + @ApiModelProperty(value = "目录菜单") + private List menus; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/vo/resp/LoginRespVO.java b/src/main/java/vip/fuck/sm/vo/resp/LoginRespVO.java new file mode 100644 index 0000000..23f07ce --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/LoginRespVO.java @@ -0,0 +1,27 @@ +package vip.fuck.sm.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * LoginRespVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class LoginRespVO { + @ApiModelProperty(value = "token") + private String accessToken; + @ApiModelProperty(value = "用户名") + private String username; + @ApiModelProperty(value = "用户id") + private String id; + @ApiModelProperty(value = "电话") + private String phone; + @ApiModelProperty(value = "用户所拥有的菜单权限(前后端分离返回给前端控制菜单和按钮的显示和隐藏)") + private List list; +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/PermissionRespNode.java b/src/main/java/vip/fuck/sm/vo/resp/PermissionRespNode.java new file mode 100644 index 0000000..a96cd19 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/PermissionRespNode.java @@ -0,0 +1,53 @@ +package vip.fuck.sm.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * PermissionRespNode + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class PermissionRespNode { + @ApiModelProperty(value = "id") + private String id; + @ApiModelProperty(value = "菜单权限名称") + private String title; + + @ApiModelProperty(value = "菜单权限标识,shiro 适配restful") + private String perms; + + @ApiModelProperty(value = "接口地址") + private String url; + + @ApiModelProperty(value = "icon") + private String icon; + + private String target; + + @ApiModelProperty(value = "父级id") + private String pid; + + @ApiModelProperty(value = "父级名称") + private String pidName; + + @ApiModelProperty(value = "菜单权限类型(1:目录;2:菜单;3:按钮)") + private Integer type; + + @ApiModelProperty(value = "排序码") + private Integer orderNum; + + @ApiModelProperty(value = "是否展开 默认不展开(false)") + private boolean spread = true; + + @ApiModelProperty(value = "是否选中 默认false") + private boolean checked; + private List> children; + + +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/UserInfoRespVO.java b/src/main/java/vip/fuck/sm/vo/resp/UserInfoRespVO.java new file mode 100644 index 0000000..daea99d --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/UserInfoRespVO.java @@ -0,0 +1,30 @@ +package vip.fuck.sm.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * UserInfoRespVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class UserInfoRespVO { + @ApiModelProperty(value = "用户id") + private String id; + @ApiModelProperty(value = "账号") + private String username; + @ApiModelProperty(value = "手机号") + private String phone; + @ApiModelProperty(value = "昵称") + private String nickName; + @ApiModelProperty(value = "真实姓名") + private String realName; + @ApiModelProperty(value = "所属机构id") + private String deptId; + @ApiModelProperty(value = "所属机构名称") + private String deptName; + +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/UserOwnRoleRespVO.java b/src/main/java/vip/fuck/sm/vo/resp/UserOwnRoleRespVO.java new file mode 100644 index 0000000..2c227bf --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/UserOwnRoleRespVO.java @@ -0,0 +1,22 @@ +package vip.fuck.sm.vo.resp; + +import vip.fuck.sm.entity.SysRole; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * UserOwnRoleRespVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class UserOwnRoleRespVO { + @ApiModelProperty("所有角色集合") + private List allRole; + @ApiModelProperty(value = "用户所拥有角色集合") + private List ownRoles; +} diff --git a/src/main/resources/app.yml b/src/main/resources/app.yml new file mode 100644 index 0000000..f6c3eb8 --- /dev/null +++ b/src/main/resources/app.yml @@ -0,0 +1,80 @@ +server.port: 8080 +server.contextPath: '/' +solon.env: 'dev' + +solon.app: + name: 'solon-manager' + group: 'vip.fuck' + +solon.logging: + appender: + console: + level: INFO + file: + level: INFO + +solon.dataSources: + master!: + class: "com.zaxxer.hikari.HikariDataSource" + username: root + password: 123456 + driverClassName: com.mysql.cj.jdbc.Driver + jdbcUrl: jdbc:mysql://localhost:3306/company_project?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8 + + + +mybatis.master: + typeAliases: #支持包名 或 类名(大写开头 或 *)//支持 ** 或 * 占位符 + - "vip.fuck.sm.entity" + typeHandlers: #支持包名 或 类名(大写开头 或 *)//支持 ** 或 * 占位符 + - "vip.fuck.sm.entity.handler" + mappers: #支持包名 或 类名(大写开头 或 *)或 xml(.xml结尾)//支持 ** 或 * 占位符 + - "vip.fuck.sm.mapper.*" #这个表达式同上效果 + - "classpath:mapper/${project.database}/**/*.xml,classpath:mapper/*.xml" + - "classpath:mapper/*.xml" + configuration: #扩展配置(要与 MybatisConfiguration 类的属性一一对应) + cacheEnabled: false + mapperVerifyEnabled: false #如果为 true,则要求所有 mapper 有 @Mapper 主解 + mapUnderscoreToCamelCase: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + globalConfig: #全局配置(要与 GlobalConfig 类的属性一一对应) + banner: true + metaObjectHandler: "vip.fuck.sm.common.config.MetaObjectHandlerConfig" + dbConfig: + logicDeleteField: "deleted" + logicDeleteValue: 1 + logicNotDeleteValue: 0 + +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## +sa-token: + # token 名称(同时也是 cookie 名称) + token-name: satoken + # token 有效期(单位:秒) 默认30天,-1 代表永久有效 + timeout: 2592000 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + active-timeout: -1 + # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) + is-share: true + # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) + token-style: uuid + # 是否输出操作日志 + is-log: true + +knife4j.enable: true +knife4j.basic.enable: true +knife4j.basic.username: admin +knife4j.basic.password: 123456 +knife4j.setting.enableOpenApi: false +knife4j.setting.enableSwaggerModels: false +knife4j.setting.enableFooter: false + +#使用代码生成模块时 指定要生成的表存在于哪种数据库,可选值有【mysql、oracle、sqlServer】 +project: + database: mysql + +file: + #文件上传目录 绝对路径 末尾不需要加 / + path: D:/files #windows + #path: /data/files #linux \ No newline at end of file diff --git a/src/main/resources/generator.properties b/src/main/resources/generator.properties new file mode 100644 index 0000000..8b42514 --- /dev/null +++ b/src/main/resources/generator.properties @@ -0,0 +1,61 @@ +#\u4EE3\u7801\u751F\u6210\u5668\uFF0C\u914D\u7F6E\u4FE1\u606F + +mainPath=com.company +#\u5305\u540D +package=vip.fuck.sm +#\u4F5C\u8005 +author=Rish +#Email +email=xian.zi.ming@qq.com +#表前缀 +tablePrefix= + +#\u7C7B\u578B\u8F6C\u6362\uFF0C\u914D\u7F6E\u4FE1\u606F +tinyint=Integer +smallint=Integer +mediumint=Integer +int=Integer +integer=Integer +bigint=Long +float=Float +double=Double +decimal=BigDecimal +bit=Boolean + +char=String +varchar=String +tinytext=String +text=String +mediumtext=String +longtext=String + +date=Date +datetime=Date +timestamp=Date + +NUMBER=Integer +INT=Integer +INTEGER=Integer +BINARY_INTEGER=Integer +LONG=String +FLOAT=Float +BINARY_FLOAT=Float +DOUBLE=Double +BINARY_DOUBLE=Double +DECIMAL=BigDecimal +CHAR=String +VARCHAR=String +VARCHAR2=String +NVARCHAR=String +NVARCHAR2=String +CLOB=String +BLOB=String +DATE=Date +DATETIME=Date +TIMESTAMP=Date +TIMESTAMP(6)=Date + +int8=Long +int4=Integer +int2=Integer +numeric=BigDecimal \ No newline at end of file diff --git a/src/main/resources/mapper/mysql/SysGeneratorMapper.xml b/src/main/resources/mapper/mysql/SysGeneratorMapper.xml new file mode 100644 index 0000000..c4c12ff --- /dev/null +++ b/src/main/resources/mapper/mysql/SysGeneratorMapper.xml @@ -0,0 +1,39 @@ + + + + + + + id, table_name, menu_name, pid, gen_time + + + + + + SELECT + TABLE_NAME AS tableName, + TABLE_COMMENT AS tableComment, + CREATE_TIME AS createTime + FROM + information_schema.TABLES + WHERE + TABLE_SCHEMA = ( SELECT DATABASE ( ) ) + + and TABLE_NAME LIKE concat('%',#{vo.tableName},'%') + + ORDER BY + CREATE_TIME DESC + + + + + + select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables + where table_schema = (select database()) and table_name = #{tableName} + + + + select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns + where table_name = #{tableName} and table_schema = (select database()) order by ordinal_position + + diff --git a/src/main/resources/mapper/oracle/SysGeneratorMapper.xml b/src/main/resources/mapper/oracle/SysGeneratorMapper.xml new file mode 100644 index 0000000..4fa5780 --- /dev/null +++ b/src/main/resources/mapper/oracle/SysGeneratorMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, table_name, menu_name, pid, gen_time + + + + select dt.table_name tableName, + dtc.comments tableComment, + uo.created createTime + from user_tables dt, + user_tab_comments dtc, + user_objects uo + where dt.table_name = dtc.table_name and dt.table_name = uo.object_name and uo.object_type='TABLE' + + and dt.table_name like concat('%', UPPER(#{vo.tableName})) + + order by uo.CREATED desc + + + + + select dt.table_name tableName,dtc.comments tableComment,dt.last_analyzed createTime from user_tables dt,user_tab_comments dtc where dt.table_name=dtc.table_name and dt.table_name = UPPER(#{tableName}) + + + + select temp.column_name columnname, + temp.data_type dataType, + temp.comments columnComment, + case temp.constraint_type when 'P' then 'PRI' when 'C' then 'UNI' else '' end "COLUMNKEY", + '' "EXTRA" + from ( + select col.column_id, + col.column_name, + col.data_type, + colc.comments, + uc.constraint_type, + row_number() over (partition by col.column_name order by uc.constraint_type desc) as row_flg + from user_tab_columns col + left join user_col_comments colc + on colc.table_name = col.table_name + and colc.column_name = col.column_name + left join user_cons_columns ucc + on ucc.table_name = col.table_name + and ucc.column_name = col.column_name + left join user_constraints uc + on uc.constraint_name = ucc.constraint_name + where col.table_name = #{tableName} + ) temp + where temp.row_flg = 1 + order by temp.column_id + + + diff --git a/src/main/resources/mapper/sqlServer/SysGeneratorMapper.xml b/src/main/resources/mapper/sqlServer/SysGeneratorMapper.xml new file mode 100644 index 0000000..8142722 --- /dev/null +++ b/src/main/resources/mapper/sqlServer/SysGeneratorMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + id, table_name, menu_name, pid, gen_time + + + + + select * from + ( + select cast(so.name as varchar(500)) as tableName, cast(sep.value as varchar(500)) as tableComment, getDate() as createTime + from sysobjects so + left JOIN sys.extended_properties sep + on sep.major_id=so.id and sep.minor_id=0 + where (xtype='U' or xtype='v') + ) t where 1=1 + + and t.tableName like concat('%', #{vo.tableName}, '%') + + order by t.tableName + + + + select * from ( + select cast(so.name as varchar(500)) as tableName, 'mssql' as engine,cast(sep.value as varchar(500)) as tableComment, getDate() as createTime + from sysobjects so + left JOIN sys.extended_properties sep on sep.major_id=so.id and sep.minor_id=0 + where (xtype='U' or xtype='v') + ) t where t.tableName=#{tableName} + + + + SELECT + cast( + b.NAME AS VARCHAR(500) + ) AS columnName, + cast( + sys.types.NAME AS VARCHAR(500) + ) AS dataType, + cast( + c.VALUE AS VARCHAR(500) + ) AS columnComment, + ( + SELECT + CASE + count( 1 ) + WHEN 1 then 'PRI' + ELSE '' + END + FROM + syscolumns, + sysobjects, + sysindexes, + sysindexkeys, + systypes + WHERE + syscolumns.xusertype = systypes.xusertype + AND syscolumns.id = object_id(A.NAME) + AND sysobjects.xtype = 'PK' + AND sysobjects.parent_obj = syscolumns.id + AND sysindexes.id = syscolumns.id + AND sysobjects.NAME = sysindexes.NAME + AND sysindexkeys.id = syscolumns.id + AND sysindexkeys.indid = sysindexes.indid + AND syscolumns.colid = sysindexkeys.colid + AND syscolumns.NAME = B.NAME + ) as columnKey, + '' as extra + FROM + ( + select + name, + object_id + from + sys.tables + UNION all select + name, + object_id + from + sys.views + ) a + INNER JOIN sys.COLUMNS b ON + b.object_id = a.object_id + LEFT JOIN sys.types ON + b.user_type_id = sys.types.user_type_id + LEFT JOIN sys.extended_properties c ON + c.major_id = b.object_id + AND c.minor_id = b.column_id + WHERE + a.NAME = #{tableName} + and sys.types.NAME != 'sysname' + + + diff --git a/src/main/resources/static/css/403.css b/src/main/resources/static/css/403.css new file mode 100644 index 0000000..fe360a5 --- /dev/null +++ b/src/main/resources/static/css/403.css @@ -0,0 +1,9 @@ +#banner { + background: url("images/403.png") no-repeat; + background-size: 100%; + overflow: hidden; +} + +h1 { + font-size: 40px; +} \ No newline at end of file diff --git a/src/main/resources/static/css/404.css b/src/main/resources/static/css/404.css new file mode 100644 index 0000000..5276f2f --- /dev/null +++ b/src/main/resources/static/css/404.css @@ -0,0 +1,9 @@ +#banner { + background: url("images/404.png") no-repeat; + background-size: 100%; + overflow: hidden; +} + +h1 { + font-size: 40px; +} \ No newline at end of file diff --git a/src/main/resources/static/css/500.css b/src/main/resources/static/css/500.css new file mode 100644 index 0000000..13400d3 --- /dev/null +++ b/src/main/resources/static/css/500.css @@ -0,0 +1,9 @@ +#banner { + background: url("images/500.png") no-repeat; + background-size: 100%; + overflow: hidden; +} + +h1 { + font-size: 40px; +} \ No newline at end of file diff --git a/src/main/resources/static/css/build.css b/src/main/resources/static/css/build.css new file mode 100644 index 0000000..2fba99e --- /dev/null +++ b/src/main/resources/static/css/build.css @@ -0,0 +1,111 @@ +@charset "UTF-8"; + +/*元素面板*/ +.element-panel{ + padding-top: 10px; +} +.element-panel .layui-form-item, +.element-panel .layui-form-item .layui-form-label, +.build-panel .build-item, +.build-panel .build-item .layui-form-label +{ + cursor: move; +} +.drag-box{ + position: absolute; + top: 100px; + left: 100px; + background-color: #FFFFFF; + box-shadow: 0 0 2px 1px rgba(0,0,0,.12); + opacity: 0.6; +} +.drag-box .layui-form-item{ + margin-bottom: 10px; +} + +/*构建面板*/ +.build-card{ + overflow: hidden; +} +.build-panel{ + min-height: 500px; + overflow: hidden; + padding: 0; + margin: 15px; +} +.build-panel.active{ + background-color: #fdffcd; +} +.build-panel #shell-item{ + background-color: #eeeeee; + border: 1px dashed #c3c3c3; +} +.build-panel .build-item{ + position: relative; +} +.build-panel .build-item:hover{ + padding-top: 10px; + border: 1px dashed #ffc664; +} +.build-panel .build-item:hover .control{ + display: block; +} +.build-panel .build-item .control{ + position: absolute; + top: 0; + right: 6px; + font-size: 12px; + color: #009688; + display: none; + z-index: 999999; +} +.build-panel .build-item .control a{ + color: #009688; +} +.build-item-edit .build-edit-box{ + position: relative; + width: 500px; + height: 317px; + display: block; +} +.build-item-edit .build-edit{ + display: block; + width: 460px; + height: 287px; + border: 10px solid #F8F8F8; + border-top-width: 0; + padding: 10px; + line-height: 20px; + overflow: auto; + background-color: #3F3F3F; + color: #eee; + font-size: 12px; + font-family: Courier New, serif; +} +.build-item-edit .build-edit-btn{ + position: absolute; + z-index: 99999; + right: 34px; + bottom: 26px; + width: 58px; + height: 30px; + border: none; + color: #ffffff; + border-radius: 2px; + background-color: #009688; + cursor: pointer; +} +.build-item-edit .build-edit-btn:hover{ + background-color: #007c6e; +} +.build-generate{ + float: right; + margin-top: 6px; + margin-right: 2px; + color: #009688; + border-color: #009688; +} +.build-generate:hover{ + background-color: #009688; + color: #FFFFFF; +} \ No newline at end of file diff --git a/src/main/resources/static/css/custom.form.css b/src/main/resources/static/css/custom.form.css new file mode 100644 index 0000000..e1de6be --- /dev/null +++ b/src/main/resources/static/css/custom.form.css @@ -0,0 +1,38 @@ +.panel-heading{ + padding:10px 10px; + border-bottom:1px solid transparent; + border-radius:2px 2px 0 0; + font-size:14px; + background: #eeeeee +} +.panel{ + margin-bottom:20px; + background-color:#fff; + border:1px solid transparent; + border-radius:4px; + -webkit-box-shadow:0 1px 1px rgba(0,0,0,.05); + box-shadow:0 1px 1px rgba(0,0,0,.05) +} +.panel-default{ + border-color:#ddd; +} + +.layui-input, .layui-textarea { + display: block; + width: 96%; + padding-left: 10px; +} + +.layui-form-pane .layui-form-label { + width: 125px; + padding: 8px 15px; + height: 38px; + line-height: 20px; + border-width: 1px; + border-style: solid; + border-radius: 2px 0 0 2px; + text-align: center; + background-color: #FBFBFB; + overflow: hidden; + box-sizing: border-box; +} \ No newline at end of file diff --git a/src/main/resources/static/css/home.css b/src/main/resources/static/css/home.css new file mode 100644 index 0000000..692175f --- /dev/null +++ b/src/main/resources/static/css/home.css @@ -0,0 +1,110 @@ +.layui-tab-title .layui-this { + background-color: #009688; + color: #eee; +} + +.first-tab i.layui-tab-close { + display: none !important; +} + +.layui-layout-admin .layui-header { + background-color: #1aa094 !important; +} + +.layui-layout-admin .layui-logo { + background-color: #0c0c0c !important; +} + +.layuimini-color .color-title { + padding: 10px 0 10px 20px; + border-bottom: 1px solid #d9dada; + margin-bottom: 8px; +} + +.layuimini-color .color-content { + padding: 0 5px 0 5px; +} + +.layuimini-color .color-content ul { + list-style: none; + text-align: center; +} + +.layuimini-color .color-content ul li { + position: relative; + display: inline-block; + vertical-align: top; + width: 80px; + height: 50px; + margin: 0 15px 15px 0; + padding: 2px 2px 4px 2px; + background-color: #f2f2f2; + cursor: pointer; + font-size: 12px; + color: #666; +} + +.layuimini-color .color-content li.layui-this:after, .layuimini-color .color-content li:hover:after { + width: 100%; + height: 100%; + padding: 4px; + top: -5px; + left: -5px; + border-color: #d8d8d8; + opacity: 1; +} + +.layuimini-color .color-content li:after { + content: ''; + position: absolute; + z-index: 20; + top: 50%; + left: 50%; + width: 1px; + height: 0; + border: 1px solid #f2f2f2; + transition: all .3s; + -webkit-transition: all .3s; + opacity: 0; +} + +.layuimini-tool-left { + position: absolute !important; + top: 0; + left: 200px; + width: 60px; + height: 100%; + line-height: 60px; + text-align: center; + color: #ffffff !important; +} + +.closeBox { + height: 35px !important; +} + +.closeBox > li { + line-height: 35px !important; +} + +.closeBox { + position: absolute; + right: -10px; + top: 16px; + background-color: #fff !important; + color: #000; + border-bottom: 1px solid #e2e2e2; + padding: 0 10px !important; +} + +.closeBox .layui-nav-item { + line-height: 40px; +} + +.closeBox .layui-nav-item > a, .closeBox .layui-nav-item > a:hover { + color: #000; +} + +.closeBox .layui-nav-child { + top: 40px; +} \ No newline at end of file diff --git a/src/main/resources/static/css/images/403.png b/src/main/resources/static/css/images/403.png new file mode 100644 index 0000000..afa0a3b Binary files /dev/null and b/src/main/resources/static/css/images/403.png differ diff --git a/src/main/resources/static/css/images/404.png b/src/main/resources/static/css/images/404.png new file mode 100644 index 0000000..4444775 Binary files /dev/null and b/src/main/resources/static/css/images/404.png differ diff --git a/src/main/resources/static/css/images/500.png b/src/main/resources/static/css/images/500.png new file mode 100644 index 0000000..bc467d4 Binary files /dev/null and b/src/main/resources/static/css/images/500.png differ diff --git a/src/main/resources/static/css/images/bg.jpg b/src/main/resources/static/css/images/bg.jpg new file mode 100644 index 0000000..d5870f5 Binary files /dev/null and b/src/main/resources/static/css/images/bg.jpg differ diff --git a/src/main/resources/static/css/login.css b/src/main/resources/static/css/login.css new file mode 100644 index 0000000..bcd9598 --- /dev/null +++ b/src/main/resources/static/css/login.css @@ -0,0 +1,98 @@ +html, body { + width: 100%; + height: 100%; + overflow: hidden +} + +body { + background: #1E9FFF; +} + +body:after { + content: ''; + background-repeat: no-repeat; + background-size: cover; + -webkit-filter: blur(3px); + -moz-filter: blur(3px); + -o-filter: blur(3px); + -ms-filter: blur(3px); + filter: blur(3px); + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; +} + +.layui-container { + width: 100%; + height: 100%; + overflow: hidden +} + +.admin-login-background { + width: 360px; + height: 300px; + position: absolute; + left: 50%; + top: 40%; + margin-left: -180px; + margin-top: -100px; +} + +.logo-title { + text-align: center; + letter-spacing: 2px; + padding: 14px 0; +} + +.logo-title h1 { + color: #1E9FFF; + font-size: 25px; + font-weight: bold; +} + +.login-form { + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + padding: 14px 20px; + box-shadow: 0 0 8px #eeeeee; +} + +.login-form .layui-form-item { + position: relative; +} + +.login-form .layui-form-item label { + position: absolute; + left: 1px; + top: 1px; + width: 38px; + line-height: 36px; + text-align: center; + color: #d2d2d2; +} + +.login-form .layui-form-item input { + padding-left: 36px; +} + +.captcha { + width: 60%; + display: inline-block; +} + +.captcha-img { + display: inline-block; + width: 34%; + float: right; +} + +.captcha-img img { + height: 34px; + border: 1px solid #e6e6e6; + height: 36px; + width: 100%; +} \ No newline at end of file diff --git a/src/main/resources/static/css/login2.css b/src/main/resources/static/css/login2.css new file mode 100644 index 0000000..27d4ec0 --- /dev/null +++ b/src/main/resources/static/css/login2.css @@ -0,0 +1,99 @@ +body { + background-image: url("images/bg.jpg"); + height: 100%; + width: 100% +} + +#container { + height: 100%; + width: 100% +} + +input:-webkit-autofill { + -webkit-box-shadow: inset 0 0 0 1000px #fff; + background-color: transparent +} + +.admin-login-background { + width: 300px; + height: 300px; + position: absolute; + left: 50%; + top: 40%; + margin-left: -150px; + margin-top: -100px +} + +.admin-header { + text-align: center; + margin-bottom: 20px; + color: #ffffff; + font-weight: bold; + font-size: 40px +} + +.admin-input { + border-top-style: none; + border-right-style: solid; + border-bottom-style: solid; + border-left-style: solid; + height: 50px; + width: 300px; + padding-bottom: 0px +} + +.admin-input::-webkit-input-placeholder { + color: #a78369 +} + +.layui-icon-username { + color: #a78369 !important +} + +.layui-icon-username:hover { + color: #9dadce !important +} + +.layui-icon-password { + color: #a78369 !important +} + +.layui-icon-password:hover { + color: #9dadce !important +} + +.admin-input-username { + border-top-style: solid; + border-radius: 10px 10px 0 0 +} + +.admin-input-verify { + border-radius: 0 0 10px 10px +} + +.admin-button { + margin-top: 20px; + font-weight: bold; + font-size: 18px; + width: 300px; + height: 50px; + border-radius: 5px; + background-color: #a78369; + border: 1px solid #d8b29f +} + +.admin-icon { + margin-left: 260px; + margin-top: 10px; + font-size: 30px +} + +i { + position: absolute +} + +.admin-captcha { + position: absolute; + margin-left: 205px; + margin-top: -45px +} \ No newline at end of file diff --git a/src/main/resources/static/js/build.js b/src/main/resources/static/js/build.js new file mode 100644 index 0000000..f3a1eb2 --- /dev/null +++ b/src/main/resources/static/js/build.js @@ -0,0 +1,167 @@ +layui.use(function () { + var $ = layui.jquery; + var form = layui.form; + + var build = $(".build-panel"); + + + // 禁止选择网页文本 + $(document).on('selectstart', '.layui-card', function(){ + return false; + }); + + // 移动操作 + var downPosi, target = null, dragDom = null, timer = null; + var areaPosi; + $(document).on("mousedown", ".layui-form-item", function (e) { + $this = $(this); + timer = setTimeout(function () { + downPosi = {'left': e.clientX - $this.offset().left, + 'top': e.clientY - $this.offset().top + 10}; + areaPosi = {'ltX': build.offset().left, 'ltY': build.offset().top, + 'rbX': build.offset().left + build.width(), + 'rbY': build.offset().top + build.height()}; + target = $this; + }, 200); + }); + $(document).on("mousemove", function (e) { + if(dragDom == null && target != null){ + dragDom = $(""); + dragDom.append(target.clone()); + dragDom.addClass("drag-box"); + dragDom.css("width", target.width()); + $("body").append(dragDom); + var buildItem = target.parent('.build-item'); + if(buildItem.length > 0){ + buildItem.remove(); + } + } + if(dragDom != null){ + dragDom.css("left", e.clientX - downPosi.left); + dragDom.css("top", e.clientY - downPosi.top); + } + if(dragDom != null){ + if(e.clientX > areaPosi.ltX && e.clientY > areaPosi.ltY + && e.clientX < areaPosi.rbX && e.clientY < areaPosi.rbY){ + build.addClass("active"); + buildItemPosi(e.clientY); + }else{ + build.removeClass("active"); + shellItem.remove(); + } + } + }); + $(document).on("mouseup", function (e) { + if(dragDom != null){ + if(build.hasClass("active")){ + buildAdd(dragDom); + } + dragDom.remove(); + dragDom = null; + target = null; + build.removeClass("active"); + shellItem.remove(); + } + if(timer != null){ + clearTimeout(timer); + timer = null; + } + }); + + // 构建项位置 + var shellItem = $(""); + var buildItemPosi = function(clientY){ + build.children('.build-item').each(function(key, val){ + var $this = $(val); + var ty = $this.offset().top; + var by = $this.offset().top + $this.height(); + if(clientY > ty && clientY < by ){ + if(clientY < (ty + by) / 2){ + $this.before(shellItem); + }else{ + $this.after(shellItem); + } + } + }); + shellItem.css('height', dragDom.height()); + if($('#shell-item').length == 0){ + build.append(shellItem); + } + }; + + // 加入构建面板 + var buildAdd = function(dragDom){ + var elem = dragDom.children(".layui-form-item").clone(); + elem.children('div').children('div').remove(); + elem.removeAttr('style'); + elem.removeClass('drag-box'); + var item = $("" + + "编辑HTML | " + + "删除" + + ""); + shellItem.after(item.append(elem)); + + form.render(); + }; + + // 编辑构建项 + var buildItem, index; + build.on('click', '.edit', function(){ + buildItem = $(this).parents('.build-item'); + var elem = buildItem.children('.layui-form-item').clone(); + elem.children('div').children('div').remove(); + elem.find('.layui-upload-file').remove(); + + var box = $(""); + var edit = $("").text(elem.prop('outerHTML')); + box.append(edit).append("更新"); + + index = layer.open({ + title: '编辑HTML', + type: 1, + skin: 'build-item-edit', //样式类名 + shadeClose: true, //开启遮罩关闭 + area: ['500px', '360px'], + content: box.prop('outerHTML') + }); + }); + + // 更新HTML + $(document).on('click', '.build-edit-btn', function(){ + var val = $(this).parent().children('textarea').val(); + buildItem.children('.layui-form-item').remove(); + buildItem.append($(val)); + form.render(); + layer.close(index); + }); + + // 删除构建项 + build.on('click', '.remove', function(){ + $(this).parents('.build-item').remove(); + }); + + // 生成代码 + $(document).on('click', '.build-generate', function(){ + var genHtml = ''; + build.find(".layui-form-item").each(function (key, val) { + var item = $(val).clone(); + item.children('div').children('div').remove(); + item.find('.layui-upload-file').remove(); + genHtml += item.prop('outerHTML') + "\n"; + }); + var box = $(""); + var edit = $("").text(genHtml); + box.append(edit); + + index = layer.open({ + title: '复制HTML代码', + type: 1, + skin: 'build-item-edit', //样式类名 + shadeClose: true, //开启遮罩关闭 + area: ['500px', '360px'], + content: box.prop('outerHTML') + }); + $('.build-edit').focus().select(); + }); + +}); \ No newline at end of file diff --git a/src/main/resources/static/js/core.util.js b/src/main/resources/static/js/core.util.js new file mode 100644 index 0000000..8571f98 --- /dev/null +++ b/src/main/resources/static/js/core.util.js @@ -0,0 +1,182 @@ +/*工具类*/ +var CoreUtil = (function () { + var coreUtil = {}; + + /*GET*/ + coreUtil.sendGet = function(url, params, ft){ + this.sendAJAX(url, params, ft, "GET") + } + + /*POST*/ + coreUtil.sendPost = function(url, params, ft){ + this.sendAJAX(url, JSON.stringify(params), ft, "POST") + } + /*PUT*/ + coreUtil.sendPut = function(url, params, ft){ + this.sendAJAX(url, JSON.stringify(params), ft, "PUT") + } + /*DELETE*/ + coreUtil.sendDelete = function(url, params, ft){ + this.sendAJAX(url, JSON.stringify(params), ft, "DELETE") + } + + + /*ajax*/ + coreUtil.sendAJAX = function(url, params, ft, method){ + var loadIndex = top.layer.load(0, {shade: false}); + $.ajax({ + url: url, + cache: false, + async: true, + data: params, + type: method, + contentType: 'application/json; charset=UTF-8', + dataType: "json", + beforeSend: function(request) { + request.setRequestHeader("authorization", CoreUtil.getData("access_token")); + }, + success: function (res) { + top.layer.close(loadIndex); + if (res.code==0){ + if(ft!=null&&ft!=undefined){ + ft(res); + } + }else if(res.code==401001){ //凭证过期重新登录 + layer.msg("凭证过期请重新登录", {time:2000}, function () { + top.window.location.href=ctx + "index/login" + }) + }else if(res.code==401008){ //凭证过期重新登录 + layer.msg("抱歉!您暂无权限", {time:2000}) + } else { + layer.msg(res.msg); + } + }, + error:function (XMLHttpRequest, textStatus, errorThrown) { + top.layer.close(loadIndex); + if(XMLHttpRequest.status==404){ + top.window.location.href= ctx + "index/404"; + }else{ + layer.msg("服务器好像除了点问题!请稍后试试"); + } + } + }) + } + + + /*存入本地缓存*/ + coreUtil.setData = function(key, value){ + layui.data('LocalData',{ + key :key, + value: value + }) + }; + /*从本地缓存拿数据*/ + coreUtil.getData = function(key){ + var localData = layui.data('LocalData'); + return localData[key]; + }; + + //判断字符是否为空的方法 + coreUtil.isEmpty = function(obj){ + if(typeof obj == "undefined" || obj == null || obj == ""){ + return true; + }else{ + return false; + } + } + + //判断字符是否为空的方法 空的话返回默认值 + coreUtil.isEmptyGet = function(obj, defaultVal){ + if(typeof obj == "undefined" || obj == null || obj == ""){ + return defaultVal; + }else{ + return obj; + } + } + + //字典数据回显 + coreUtil.selectDictLabel = function (datas, value) { + datas = JSON.parse(datas); + var label = ""; + $.each(datas, function(index, dict) { + if (dict.value == ('' + value)) { + label = dict.label; + return false; + } + }); + //匹配不到,返回未知 + if (CoreUtil.isEmpty(label)) { + return "未知"; + } + return label; + } + + //生成随机8位数 + coreUtil.showImg = function (src) { + if (!CoreUtil.isEmpty(src)) { + var json = { + "title": "", //相册标题 + "id": "1", //相册id + "start": 0, //初始显示的图片序号,默认0 + "data": [ //相册包含的图片,数组格式 + { + "alt": "", + "pid": "1", //图片id + "src": src, //原图地址 + "thumb": "" //缩略图地址 + } + ] + }; + layer.photos({ + photos: json + , anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机(请注意,3.0之前的版本用shift参数) + }); + } + } + + //获取复选框的值 + coreUtil.getCheckboxValues = function (type, data) { + if (this.isEmpty(data)) { + return ""; + } + var listRtn = []; + var keys = getObjectKeys(data); + for (var i = 0; i < keys.length; i++) { + if (keys[i].indexOf("[") > -1 && keys[i].indexOf("]") > -1 && keys[i].indexOf(type) > -1) { + listRtn.push(keys[i].substring(keys[i].indexOf("[") + 1, keys[i].indexOf("]"))) + } + } + return listRtn.toString(); + } + + //赋值复选框的值 返回json, 可以直接form.val进行赋值 + coreUtil.setCheckboxValues = function (type, values) { + var json = {}; + if (this.isEmpty(values)) { + return json; + } + values = values.split(","); + for (var i = 0; i < values.length; i++) { + var key = type + "["+values[i] + "]"; + json[key] = true; + } + return json; + } + + return coreUtil; +})(CoreUtil, window); + +//写成标准的方法(数组是object的一种): +function getObjectKeys(object) { + var keys = []; + for (var property in object) + keys.push(property); + return keys; +} + +function getObjectValues(object) { + var values = []; + for (var property in object) + values.push(object[property]); + return values; +} \ No newline at end of file diff --git a/src/main/resources/static/js/home.js b/src/main/resources/static/js/home.js new file mode 100644 index 0000000..9274883 --- /dev/null +++ b/src/main/resources/static/js/home.js @@ -0,0 +1,369 @@ +//全屏 +$('body').on('click', '[data-check-screen]', function () { + var check = $(this).attr('data-check-screen'); + if (check == 'full') { + fullScreen(); + $(this).attr('data-check-screen', 'exit'); + $(this).html(''); + } else { + exitFullScreen(); + $(this).attr('data-check-screen', 'full'); + $(this).html(''); + } +}); + +//刷新 +$('body').on('click', '[data-refresh]', function () { + $(".layui-tab-item.layui-show").find("iframe")[0].contentWindow.location.reload(); +}); + +/** + * 初始化背景色 + */ +var initBgColor = function () { + var bgcolorId = sessionStorage.getItem('layuiminiBgcolorId'); + if (bgcolorId == null || bgcolorId == undefined || bgcolorId == '') { + bgcolorId = config('BgColorDefault'); + } + var bgcolorData = bgColorConfigFun(bgcolorId); + console.log(bgcolorData) + var styleHtml = '.layui-layout-admin .layui-header{background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-header>ul>.layui-nav-item.layui-this,.layuimini-tool i:hover{background-color:' + bgcolorData.headerRightThis + '!important;}\n' + + '.layui-layout-admin .layui-logo {background-color:' + bgcolorData.headerLogo + '!important;color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-tab-title .layui-this {background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-nav-tree .layui-nav-bar {background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-btn {background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-nav .layui-this:after, .layui-nav-bar, .layui-nav-tree .layui-nav-itemed:after {background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-side.layui-bg-black,.layui-side.layui-bg-black>.layui-left-menu>ul {background-color:' + bgcolorData.menuLeft + '!important;}\n' + + '.layui-left-menu .layui-nav .layui-nav-child a:hover:not(.layui-this) {background-color:' + bgcolorData.menuLeftHover + ';}\n' + + '.layui-layout-admin .layui-nav-tree .layui-this, .layui-layout-admin .layui-nav-tree .layui-this>a, .layui-layout-admin .layui-nav-tree .layui-nav-child dd.layui-this, .layui-layout-admin .layui-nav-tree .layui-nav-child dd.layui-this a {\n' + + ' background-color: ' + bgcolorData.menuLeftThis + ' !important;\n' + + '}'; + $('#layuimini-bg-color').html(styleHtml); +}; + +/** + * 弹出配色方案 + */ +$('body').on('click', '[data-bgcolor]', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + var clientHeight = (document.documentElement.clientHeight) - 95; + var bgColorHtml = buildBgColorHtml(); + var html = '\n' + + '\n' + + '配色方案\n' + + '\n' + + '\n' + + '\n' + bgColorHtml + '\n' + + '\n' + + ''; + layer.open({ + type: 1, + title: false, + closeBtn: 0, + shade: 0.2, + anim: 2, + shadeClose: true, + id: 'layuiminiBgColor', + area: ['340px', clientHeight + 'px'], + offset: 'rb', + content: html, + end: function () { + $('.layuimini-select-bgcolor').removeClass('layui-this'); + } + }); + layer.close(loading); +}); +/** + * 选择配色方案 + */ +$('body').on('click', '[data-select-bgcolor]', function () { + var bgcolorId = $(this).attr('data-select-bgcolor'); + $('.layuimini-color .color-content ul .layui-this').attr('class', ''); + $(this).attr('class', 'layui-this'); + sessionStorage.setItem('layuiminiBgcolorId', bgcolorId); + initBgColor(); +}); + +/** + * 进入全屏 + */ +var fullScreen = function () { + var el = document.documentElement; + var rfs = el.requestFullScreen || el.webkitRequestFullScreen; + if (typeof rfs != "undefined" && rfs) { + rfs.call(el); + } else if (typeof window.ActiveXObject != "undefined") { + var wscript = new ActiveXObject("WScript.Shell"); + if (wscript != null) { + wscript.SendKeys("{F11}"); + } + } else if (el.msRequestFullscreen) { + el.msRequestFullscreen(); + } else if (el.oRequestFullscreen) { + el.oRequestFullscreen(); + } else { + top.layer.msg('浏览器不支持全屏调用!'); + } +}; + +/** + * 退出全屏 + */ +var exitFullScreen = function () { + var el = document; + var cfs = el.cancelFullScreen || el.webkitCancelFullScreen || el.exitFullScreen; + if (typeof cfs != "undefined" && cfs) { + cfs.call(el); + } else if (typeof window.ActiveXObject != "undefined") { + var wscript = new ActiveXObject("WScript.Shell"); + if (wscript != null) { + wscript.SendKeys("{F11}"); + } + } else if (el.msExitFullscreen) { + el.msExitFullscreen(); + } else if (el.oRequestFullscreen) { + el.oCancelFullScreen(); + } else { + top.layer.msg('浏览器不支持全屏调用!'); + } +}; + +/** + * 构建背景颜色选择 + * @returns {string} + */ +var buildBgColorHtml = function () { + var html = ''; + var bgcolorId = sessionStorage.getItem('layuiminiBgcolorId'); + if (bgcolorId == null || bgcolorId == undefined || bgcolorId == '') { + bgcolorId = 0; + } + var bgColorConfig = bgColorConfigFun(); + $.each(bgColorConfig, function (key, val) { + if (key == bgcolorId) { + html += '\n'; + } else { + html += '\n'; + } + html += '\n' + + '\n' + + '\n' + + '\n' + + ''; + }); + return html; +}; +/** + * 配色方案配置项(默认选中第一个方案) + * @param bgcolorId + */ + function bgColorConfigFun(bgcolorId) { + var bgColorConfig = [ + { + headerRight: '#1aa094', + headerRightThis: '#197971', + headerLogo: '#243346', + menuLeft: '#2f4056', + menuLeftThis: '#1aa094', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#23262e', + headerRightThis: '#0c0c0c', + headerLogo: '#0c0c0c', + menuLeft: '#23262e', + menuLeftThis: '#23262e', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#ffa4d1', + headerRightThis: '#bf7b9d', + headerLogo: '#e694bd', + menuLeft: '#1f1f1f', + menuLeftThis: '#ffa4d1', + menuLeftHover: '#1f1f1f', + }, + { + headerRight: '#1aa094', + headerRightThis: '#197971', + headerLogo: '#0c0c0c', + menuLeft: '#23262e', + menuLeftThis: '#1aa094', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#1E9FFF', + headerRightThis: '#0069b7', + headerLogo: '#0c0c0c', + menuLeft: '#1f1f1f', + menuLeftThis: '#1E9FFF', + menuLeftHover: '#3b3f4b', + }, + + { + headerRight: '#ffb800', + headerRightThis: '#d09600', + headerLogo: '#243346', + menuLeft: '#2f4056', + menuLeftThis: '#ffb800', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#e82121', + headerRightThis: '#ae1919', + headerLogo: '#0c0c0c', + menuLeft: '#1f1f1f', + menuLeftThis: '#e82121', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#963885', + headerRightThis: '#772c6a', + headerLogo: '#243346', + menuLeft: '#2f4056', + menuLeftThis: '#963885', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#1e9fff', + headerRightThis: '#0069b7', + headerLogo: '#0069b7', + menuLeft: '#1f1f1f', + menuLeftThis: '#1e9fff', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#ffb800', + headerRightThis: '#d09600', + headerLogo: '#d09600', + menuLeft: '#2f4056', + menuLeftThis: '#ffb800', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#e82121', + headerRightThis: '#ae1919', + headerLogo: '#d91f1f', + menuLeft: '#1f1f1f', + menuLeftThis: '#e82121', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#963885', + headerRightThis: '#772c6a', + headerLogo: '#772c6a', + menuLeft: '#2f4056', + menuLeftThis: '#963885', + menuLeftHover: '#3b3f4b', + } + ]; + + if (bgcolorId == undefined) { + return bgColorConfig; + } else { + return bgColorConfig[bgcolorId]; + } +}; + + +/** + * 系统配置 + * @param name + * @returns {{BgColorDefault: number, urlSuffixDefault: boolean}|*} + */ +var config = function (name) { + + var config = { + urlHashLocation: true, // URL地址hash定位 + urlSuffixDefault: false, // URL后缀 + BgColorDefault: 3, // 默认皮肤(0开始) + checkUrlDefault: false, // 是否判断URL有效 + }; + + if (name == undefined) { + return config; + } else { + return config[name]; + } +}; + + +//显示隐藏侧边栏 +var isShow=1; +function iconHide(){ + if(isShow===1) + hide(); + else + show(); + isShow*=-1; +} +function hide(){ + $('.layuimini-tool-left').animate({left:'50px'}); + + $('.layui-side cite').hide(); + $('.layui-side').animate({width:'55px'}); + $('.layui-logo').html("SM") + $('.layui-logo').animate({width:'55px'}); + $('.layui-body').animate({left:'60px'}); + document.getElementById('hide').className="layui-color layui-icon layui-icon-spread-left"; + $(".layui-side li").removeClass("layui-nav-itemed"); +} +function show(){ + $('.layuimini-tool-left').animate({left:'200px'}); + + $('.layui-side cite').show(); + $('.layui-side').animate({width:'200px'}); + $('.layui-body').animate({left:'200px'}); + $('.layui-logo').html("solon-manager") + $('.layui-logo').animate({width:'200px'}); + document.getElementById('hide').className="layui-color layui-icon layui-icon-shrink-right"; + var id = $(".layui-tab-title li.layui-this").attr("lay-id"); + if (!CoreUtil.isEmpty(id)) { + $("a[data-id='"+id+"']").parents("li").addClass("layui-nav-itemed") + } +} +function ulHide(){ + if(isShow===-1) + show(); + isShow=1; +} + +/** + * 选项卡操作 + */ +$('body').on('click', '[data-page-close]', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + var closeType = $(this).attr('data-page-close'); + + if (closeType == 'all') { + if($(".layui-tab-title li").length > 1){ + $(".layui-tab-title li").each(function(){ + if($(this).attr("lay-id") != ''){ + element.tabDelete("tab",$(this).attr("lay-id")).init(); + } + }) + }else{ + layer.msg("没有可以关闭的窗口了@_@"); + } + } else { + if($(".layui-tab-title li").length > 1){ + + console.log($(".layui-tab-title li").length) + console.log($(".layui-tab-title li.layui-this span").text()) + if ($(".layui-tab-title li").length == 2 && $(".layui-tab-title li.layui-this span").text()!="主页"){ + layer.msg("没有可以关闭的窗口了@_@"); + } else { + $(".layui-tab-title li").each(function(){ + if($(this).attr("lay-id") != '' && !$(this).hasClass("layui-this")){ + element.tabDelete("tab",$(this).attr("lay-id")).init(); + } + }) + } + + }else{ + layer.msg("没有可以关闭的窗口了@_@"); + } + } + layer.close(loading); +}); diff --git a/src/main/resources/static/js/jq-module/jquery.particleground.min.js b/src/main/resources/static/js/jq-module/jquery.particleground.min.js new file mode 100644 index 0000000..dac720c --- /dev/null +++ b/src/main/resources/static/js/jq-module/jquery.particleground.min.js @@ -0,0 +1,195 @@ +/** + * Particleground + * + * @author Jonathan Nicol - @mrjnicol + * @version 1.0.1 + * @description Creates a canvas based particle system background + * + * Inspired by: + * http://requestlab.fr/ + * http://disruptivebydesign.com/ + * + * @license The MIT License (MIT) + * + * Copyright (c) 2014 Jonathan Nicol - @mrjnicol + * + * 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. + */ +!function (a) { + function b(b, d) { + function e() { + if (w) { + $canvas = a(''), v.prepend($canvas), p = $canvas[0], q = p.getContext("2d"), f(); + for (var b = Math.round(p.width * p.height / d.density), c = 0; b > c; c++) { + var e = new l; + e.setStackPos(c), x.push(e) + } + a(window).on("resize", function () { + h() + }), a(document).on("mousemove", function (a) { + y = a.pageX, z = a.pageY + }), B && !A && window.addEventListener("deviceorientation", function () { + D = Math.min(Math.max(-event.beta, -30), 30), C = Math.min(Math.max(-event.gamma, -30), 30) + }, !0), g(), o("onInit") + } + } + + function f() { + p.width = v.width(), p.height = v.height(), q.fillStyle = d.dotColor, q.strokeStyle = d.lineColor, q.lineWidth = d.lineWidth + } + + function g() { + if (w) { + s = a(window).width(), t = a(window).height(), q.clearRect(0, 0, p.width, p.height); + for (var b = 0; b < x.length; b++) x[b].updatePosition(); + for (var b = 0; b < x.length; b++) x[b].draw(); + E || (r = requestAnimationFrame(g)) + } + } + + function h() { + for (f(), i = x.length - 1; i >= 0; i--) (x[i].position.x > v.width() || x[i].position.y > v.height()) && x.splice(i, 1); + var a = Math.round(p.width * p.height / d.density); + if (a > x.length) for (; a > x.length;) { + var b = new l; + x.push(b) + } else a < x.length && x.splice(a); + for (i = x.length - 1; i >= 0; i--) x[i].setStackPos(i) + } + + function j() { + E = !0 + } + + function k() { + E = !1, g() + } + + function l() { + switch (this.stackPos, this.active = !0, this.layer = Math.ceil(3 * Math.random()), this.parallaxOffsetX = 0, this.parallaxOffsetY = 0, this.position = {x: Math.ceil(Math.random() * p.width), y: Math.ceil(Math.random() * p.height)}, this.speed = {}, d.directionX) { + case"left": + this.speed.x = +(-d.maxSpeedX + Math.random() * d.maxSpeedX - d.minSpeedX).toFixed(2); + break; + case"right": + this.speed.x = +(Math.random() * d.maxSpeedX + d.minSpeedX).toFixed(2); + break; + default: + this.speed.x = +(-d.maxSpeedX / 2 + Math.random() * d.maxSpeedX).toFixed(2), this.speed.x += this.speed.x > 0 ? d.minSpeedX : -d.minSpeedX + } + switch (d.directionY) { + case"up": + this.speed.y = +(-d.maxSpeedY + Math.random() * d.maxSpeedY - d.minSpeedY).toFixed(2); + break; + case"down": + this.speed.y = +(Math.random() * d.maxSpeedY + d.minSpeedY).toFixed(2); + break; + default: + this.speed.y = +(-d.maxSpeedY / 2 + Math.random() * d.maxSpeedY).toFixed(2), this.speed.x += this.speed.y > 0 ? d.minSpeedY : -d.minSpeedY + } + } + + function m(a, b) { + return b ? void(d[a] = b) : d[a] + } + + function n() { + v.find(".pg-canvas").remove(), o("onDestroy"), v.removeData("plugin_" + c) + } + + function o(a) { + void 0 !== d[a] && d[a].call(u) + } + + var p, q, r, s, t, u = b, v = a(b), w = !!document.createElement("canvas").getContext, x = [], y = 0, z = 0, A = !navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|BB10|mobi|tablet|opera mini|nexus 7)/i), B = !!window.DeviceOrientationEvent, C = 0, D = 0, E = !1; + return d = a.extend({}, a.fn[c].defaults, d), l.prototype.draw = function () { + q.beginPath(), q.arc(this.position.x + this.parallaxOffsetX, this.position.y + this.parallaxOffsetY, d.particleRadius / 2, 0, 2 * Math.PI, !0), q.closePath(), q.fill(), q.beginPath(); + for (var a = x.length - 1; a > this.stackPos; a--) { + var b = x[a], c = this.position.x - b.position.x, e = this.position.y - b.position.y, f = Math.sqrt(c * c + e * e).toFixed(2); + f < d.proximity && (q.moveTo(this.position.x + this.parallaxOffsetX, this.position.y + this.parallaxOffsetY), d.curvedLines ? q.quadraticCurveTo(Math.max(b.position.x, b.position.x), Math.min(b.position.y, b.position.y), b.position.x + b.parallaxOffsetX, b.position.y + b.parallaxOffsetY) : q.lineTo(b.position.x + b.parallaxOffsetX, b.position.y + b.parallaxOffsetY)) + } + q.stroke(), q.closePath() + }, l.prototype.updatePosition = function () { + if (d.parallax) { + if (B && !A) { + var a = (s - 0) / 60; + pointerX = (C - -30) * a + 0; + var b = (t - 0) / 60; + pointerY = (D - -30) * b + 0 + } else pointerX = y, pointerY = z; + this.parallaxTargX = (pointerX - s / 2) / (d.parallaxMultiplier * this.layer), this.parallaxOffsetX += (this.parallaxTargX - this.parallaxOffsetX) / 10, this.parallaxTargY = (pointerY - t / 2) / (d.parallaxMultiplier * this.layer), this.parallaxOffsetY += (this.parallaxTargY - this.parallaxOffsetY) / 10 + } + switch (d.directionX) { + case"left": + this.position.x + this.speed.x + this.parallaxOffsetX < 0 && (this.position.x = v.width() - this.parallaxOffsetX); + break; + case"right": + this.position.x + this.speed.x + this.parallaxOffsetX > v.width() && (this.position.x = 0 - this.parallaxOffsetX); + break; + default: + (this.position.x + this.speed.x + this.parallaxOffsetX > v.width() || this.position.x + this.speed.x + this.parallaxOffsetX < 0) && (this.speed.x = -this.speed.x) + } + switch (d.directionY) { + case"up": + this.position.y + this.speed.y + this.parallaxOffsetY < 0 && (this.position.y = v.height() - this.parallaxOffsetY); + break; + case"down": + this.position.y + this.speed.y + this.parallaxOffsetY > v.height() && (this.position.y = 0 - this.parallaxOffsetY); + break; + default: + (this.position.y + this.speed.y + this.parallaxOffsetY > v.height() || this.position.y + this.speed.y + this.parallaxOffsetY < 0) && (this.speed.y = -this.speed.y) + } + this.position.x += this.speed.x, this.position.y += this.speed.y + }, l.prototype.setStackPos = function (a) { + this.stackPos = a + }, e(), {option: m, destroy: n, start: k, pause: j} + } + + var c = "particleground"; + a.fn[c] = function (d) { + if ("string" == typeof arguments[0]) { + var e, f = arguments[0], g = Array.prototype.slice.call(arguments, 1); + return this.each(function () { + a.data(this, "plugin_" + c) && "function" == typeof a.data(this, "plugin_" + c)[f] && (e = a.data(this, "plugin_" + c)[f].apply(this, g)) + }), void 0 !== e ? e : this + } + return "object" != typeof d && d ? void 0 : this.each(function () { + a.data(this, "plugin_" + c) || a.data(this, "plugin_" + c, new b(this, d)) + }) + }, a.fn[c].defaults = { + minSpeedX: .1, maxSpeedX: .7, minSpeedY: .1, maxSpeedY: .7, directionX: "center", directionY: "center", density: 1e4, dotColor: "#666666", lineColor: "#666666", particleRadius: 7, lineWidth: 1, curvedLines: !1, proximity: 100, parallax: !0, parallaxMultiplier: 5, onInit: function () { + }, onDestroy: function () { + } + } +}(jQuery), /** + * requestAnimationFrame polyfill by Erik M枚ller. fixes from Paul Irish and Tino Zijdel + * @see: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + * @see: http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating + * @license: MIT license + */ + function () { + for (var a = 0, b = ["ms", "moz", "webkit", "o"], c = 0; c < b.length && !window.requestAnimationFrame; ++c) window.requestAnimationFrame = window[b[c] + "RequestAnimationFrame"], window.cancelAnimationFrame = window[b[c] + "CancelAnimationFrame"] || window[b[c] + "CancelRequestAnimationFrame"]; + window.requestAnimationFrame || (window.requestAnimationFrame = function (b) { + var c = (new Date).getTime(), d = Math.max(0, 16 - (c - a)), e = window.setTimeout(function () { + b(c + d) + }, d); + return a = c + d, e + }), window.cancelAnimationFrame || (window.cancelAnimationFrame = function (a) { + clearTimeout(a) + }) + }(); \ No newline at end of file diff --git a/src/main/resources/static/js/jq-module/paigusu.min.js b/src/main/resources/static/js/jq-module/paigusu.min.js new file mode 100644 index 0000000..4564bc9 --- /dev/null +++ b/src/main/resources/static/js/jq-module/paigusu.min.js @@ -0,0 +1 @@ +(function(c,f,h,k){var g=function(a,b){this.eve=a;this.defaults={width:230,height:400,color:"#1926dc",recommend:!1,title:"\u6700\u8fd1\u4f7f\u7528"};this.options=c.extend({},this.defaults,b);console.log(this.options)};g.prototype={init:function(){this.getPosition();this.initDefaultColor();this.latelyColor();this.createHtml();this.on()},createHtml:function(){var a=this.options,b=a.bg.r+","+a.bg.g+","+a.bg.b,d="";c.each(a.lately,function(a,b){if(9b.h&&(b.h+=360);b.s*=100/255;b.b*=100/255;return b={h:Math.round(b.h),s:Math.round(b.s),b:Math.round(b.b)}},hexToRgb:function(a){a=-1>16,g:(a&65280)>>8,b:a&255}},rgbToHex:function(a){var b=[a.r.toString(16),a.g.toString(16),a.b.toString(16)];c.each(b,function(a,e){1==e.length&&(b[a]="0"+e)});return b.join("")},hsbToRgb:function(a){var b,d,e;b=a.h;var c=255*a.s/100;a=255*a.b/100;if(0==c)b=d=e=a;else{var c=(255-c)*a/255,f=b%60*(a-c)/60;360==b&&(b=0);60>b?(b=a,e=c,d=c+f):120>b?(d=a,e=c,b=a-f):180>b?(d=a,b=c,e=c+f):240>b?(e=a,b=c,d=a-f):300>b?(e=a,d=c,b=c+f):360>b?(b=a,d=c,e=a-f):e=d=b=0}return{r:Math.round(b),g:Math.round(d),b:Math.round(e)}},hsbToHex:function(a){a=this.hsbToRgb(a);var b=[a.r.toString(16),a.g.toString(16),a.b.toString(16)];c.each(b,function(a,c){1==c.length&&(b[a]="0"+c)});return b.join("")},getPosition:function(){var a=this.options,b=c(f).width(),d=c(f).height(),e=this.eve.getBoundingClientRect();b-e.right>a.width?this.set({positionLeft:e.right+5}):this.set({positionLeft:e.left-a.width-5});d-e.bottom>a.height?this.set({positionTop:e.top}):this.set({positionTop:e.bottom-a.height})},doploy:function(){var a=this.options;c("#paigusu-slider-btn").css("left",a.colorSlider-5);var b=this.hsbToHex({h:a.colorSlider/160*360,s:100,b:100}),d=this.hexToRgb(b),e={h:a.colorSlider/160*360,s:100,s:a.hsb.s,b:a.hsb.b},b=this.hsbToHex(e),f=this.hexToRgb(b);f.a=a.color.a;this.set({bg:d,color:f,hex:b,hsb:e});this.setInputColor()},setInputColor:function(){var a=this.options,b=a.color.r+","+a.color.g+","+a.color.b;c("#final-color").css("background","rgba("+b+","+a.color.a+")");var d=a.bg.r+","+a.bg.g+","+a.bg.b;console.log(d);c("#color-block").css("background","rgb("+d+")");c("#paigusu-alpha-block").css("background","linear-gradient(to right, rgba("+b+", 0) 0%, rgba("+b+", 1) 100%)");c.each(a.color,function(a,b){c("input[name\x3d'paigusu-"+a+"']").val(b)});c("input[name\x3d'paigusu-hex']").val("#"+a.hex);this.callFun()},inputSetColor:function(){var a=this.options.hsb,b=this.hsbToRgb({h:0==a.h?250:a.h,s:100,b:100}),d=150-a.b/100*150-6,e=a.s/100*230-6,a=parseInt(a.h/360*160),f=this.options.color;this.set({bg:b,ident:{top:d,left:e},colorSlider:a});c("#color-block").css("background","rgb("+b.r+","+b.g+","+b.b+")");c("#block-ident").css({top:d,left:e});c("#paigusu-slider-btn").css("left",a-5);c("#final-color").css("background","rgb("+f.r+","+f.g+","+f.b+","+f.a+")");c("#paigusu-alpha-block").css("background","linear-gradient(to right, rgba(0,17,255, 0) 0%, rgba("+b.r+","+b.g+","+b.b+", 1) 100%)");c("#paigusu-alpha-btn").css("left",parseInt(160*f.a)-5);this.callFun()},palette:function(){var a=this.options;c("#block-ident").css(a.ident);var b=0>a.ident.top?0:a.ident.top,d=0>a.ident.left?0:a.ident.left,a={s:((230b.offsetX?0:b.offsetX}),a.doploy())}).on("mouseup",function(){f.paigususlider=!1}).on("mouseleave",function(){f.paigususlider=!1});c("#paigusu-alpha").off().on("mousedown",function(b){b=b||f.event;f.paigusualpha=!0;c("#paigusu-alpha-btn").css("left",b.offsetX-6);a.options.color.a=parseFloat((b.offsetX/160).toFixed(1));a.setInputColor()}).on("mousemove",function(b){b=b||f.event;f.paigusualpha&&(c("#paigusu-alpha-btn").css("left",b.offsetX-6),a.options.color.a=parseFloat(((0>b.offsetX?0:b.offsetX)/160).toFixed(1)),a.setInputColor())}).on("mouseup",function(){f.paigusualpha=!1}).on("mouseleave",function(){f.paigusualpha=!1});c('input[name\x3d"paigusu-r"],input[name\x3d"paigusu-g"],input[name\x3d"paigusu-b"],input[name\x3d"paigusu-a"]').on("keyup",function(){var b=c(this).attr("name").split("-");if("a"==b[1]){var d=parseFloat(c(this).val())||1,d=parseFloat(d.toFixed(1));if(1d)c(this).val(1),d=1}else d=parseInt(c(this).val())||0,0>d?(c(this).val(0),d=0):255").width(boundx).height(boundy).addClass(cssClass("holder")).css({position:"relative",backgroundColor:options.bgColor}).insertAfter($origimg).append($img);if(options.addClass){$div.addClass(options.addClass)}var $img2=$("").attr("src",$img.attr("src")).css("position","absolute").width(boundx).height(boundy);var $img_holder=$("").width(pct(100)).height(pct(100)).css({zIndex:310,position:"absolute",overflow:"hidden"}).append($img2);var $hdl_holder=$("").width(pct(100)).height(pct(100)).css("zIndex",320);var $sel=$("").css({position:"absolute",zIndex:300}).insertBefore($img).append($img_holder,$hdl_holder);var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:"absolute",top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var xlimit,ylimit,xmin,ymin; +var xscale,yscale,enabled=true;var docOffset=getPos($img),btndown,lastcurs,dimmed,animating,shift_down;var Coords=function(){var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos){var pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1]}function setCurrent(pos){var pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1]}function getOffset(){return[ox,oy]}function moveOffset(offset){var ox=offset[0],oy=offset[1];if(0>x1+ox){ox-=ox+x1}if(0>y1+oy){oy-=oy+y1}if(boundyboundx){xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1}}}else{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0){yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1}else{if(yy>boundy){yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1}}}if(xx>x1){if(xx-x1max_x){xx=x1+max_x}}if(yy>y1){yy=y1+(xx-x1)/aspect}else{yy=y1-(xx-x1)/aspect}}else{if(xxmax_x){xx=x1-max_x}}if(yy>y1){yy=y1+(x1-xx)/aspect}else{yy=y1-(x1-xx)/aspect}}}if(xx<0){x1-=xx;xx=0}else{if(xx>boundx){x1-=xx-boundx;xx=boundx}}if(yy<0){y1-=yy;yy=0}else{if(yy>boundy){y1-=yy-boundy;yy=boundy}}return last=makeObj(flipCoords(x1,y1,xx,yy))}function rebound(p){if(p[0]<0){p[0]=0}if(p[1]<0){p[1]=0}if(p[0]>boundx){p[0]=boundx}if(p[1]>boundy){p[1]=boundy}return[p[0],p[1]] +}function flipCoords(x1,y1,x2,y2){var xa=x1,xb=x2,ya=y1,yb=y2;if(x2xlimit)){x2=(xsize>0)?(x1+xlimit):(x1-xlimit)}if(ylimit&&(Math.abs(ysize)>ylimit)){y2=(ysize>0)?(y1+ylimit):(y1-ylimit)}if(ymin&&(Math.abs(ysize)0)?(y1+ymin):(y1-ymin)}if(xmin&&(Math.abs(xsize)0)?(x1+xmin):(x1-xmin)}if(x1<0){x2-=x1;x1-=x1}if(y1<0){y2-=y1;y1-=y1}if(x2<0){x1-=x2;x2-=x2}if(y2<0){y1-=y2;y2-=y2}if(x2>boundx){var delta=x2-boundx;x1-=delta;x2-=delta}if(y2>boundy){var delta=y2-boundy;y1-=delta;y2-=delta}if(x1>boundx){var delta=x1-boundy;y2-=delta;y1-=delta}if(y1>boundy){var delta=y1-boundy;y2-=delta;y1-=delta}return makeObj(flipCoords(x1,y1,x2,y2))}function makeObj(a){return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]}}return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed}}();var Selection=function(){var start,end,dragmode,awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;if(options.drawBorders){borders={top:insertBorder("hline").css("top",$.browser.msie?px(-1):px(0)),bottom:insertBorder("hline"),left:insertBorder("vline"),right:insertBorder("vline")}}if(options.dragEdges){handle.t=insertDragbar("n");handle.b=insertDragbar("s");handle.r=insertDragbar("e");handle.l=insertDragbar("w")}options.sideHandles&&createHandles(["n","s","e","w"]);options.cornerHandles&&createHandles(["sw","nw","ne","se"]);function insertBorder(type){var jq=$("").css({position:"absolute",opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq}function dragDiv(ord,zi){var jq=$("").mousedown(createDragger(ord)).css({cursor:ord+"-resize",position:"absolute",zIndex:zi});$hdl_holder.append(jq);return jq}function insertHandle(ord){return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).addClass(cssClass("handle")) +}function insertDragbar(ord){var s=options.handleSize,o=hhs,h=s,w=s,t=o,l=o;switch(ord){case"n":case"s":w=pct(100);break;case"e":case"w":h=pct(100);break}return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)})}function createHandles(li){for(i in li){handle[li[i]]=insertHandle(li[i])}}function moveHandles(c){var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;"e" in handle&&handle.e.css({top:px(midvert),left:px(east)})&&handle.w.css({top:px(midvert)})&&handle.s.css({top:px(south),left:px(midhoriz)})&&handle.n.css({left:px(midhoriz)});"ne" in handle&&handle.ne.css({left:px(east)})&&handle.se.css({top:px(south),left:px(east)})&&handle.sw.css({top:px(south)});"b" in handle&&handle.b.css({top:px(south)})&&handle.r.css({left:px(east)})}function moveto(x,y){$img2.css({top:px(-y),left:px(-x)});$sel.css({top:px(y),left:px(x)})}function resize(w,h){$sel.width(w).height(h)}function refresh(){var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible()}function updateVisible(){if(awake){return update()}}function update(){var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);options.drawBorders&&borders["right"].css({left:px(c.w-1)})&&borders["bottom"].css({top:px(c.h-1)});seehandles&&moveHandles(c);awake||show();options.onChange(unscale(c))}function show(){$sel.show();$img.css("opacity",options.bgOpacity);awake=true}function release(){disableHandles();$sel.hide();$img.css("opacity",1);awake=false}function showHandles(){if(seehandles){moveHandles(Coords.getFixed());$hdl_holder.show()}}function enableHandles(){seehandles=true;if(options.allowResize){moveHandles(Coords.getFixed());$hdl_holder.show();return true}}function disableHandles(){seehandles=false;$hdl_holder.hide()}function animMode(v){(animating=v)?disableHandles():enableHandles()}function done(){animMode(false);refresh()}var $track=newTracker().mousedown(createDragger("move")).css({cursor:"move",position:"absolute",zIndex:360}); +$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,setCursor:function(cursor){$track.css("cursor",cursor)},enableHandles:enableHandles,enableOnly:function(){seehandles=true},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,done:done}}();var Tracker=function(){var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;if(!trackDoc){$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp)}function toFront(){$trk.css({zIndex:450});if(trackDoc){$(document).mousemove(trackMove).mouseup(trackUp)}}function toBack(){$trk.css({zIndex:290});if(trackDoc){$(document).unbind("mousemove",trackMove).unbind("mouseup",trackUp)}}function trackMove(e){onMove(mouseAbs(e))}function trackUp(e){e.preventDefault();e.stopPropagation();if(btndown){btndown=false;onDone(mouseAbs(e));options.onSelect(unscale(Coords.getFixed()));toBack();onMove=function(){};onDone=function(){}}return false}function activateHandlers(move,done){btndown=true;onMove=move;onDone=done;toFront();return false}function setCursor(t){$trk.css("cursor",t)}$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor}}();var KeyManager=function(){var $keymgr=$('').css({position:"absolute",left:"-30px"}).keypress(parseKey).blur(onBlur),$keywrap=$("").css({position:"absolute",overflow:"hidden"}).append($keymgr);function watchKeys(){if(options.keySupport){$keymgr.show();$keymgr.focus()}}function onBlur(e){$keymgr.hide()}function doNudge(e,x,y){if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible()}e.preventDefault();e.stopPropagation()}function parseKey(e){if(e.ctrlKey){return true}shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode){case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:Selection.release();break;case 9:return true}return nothing(e) +}if(options.keySupport){$keywrap.insertBefore($img)}return{watchKeys:watchKeys}}();function px(n){return""+parseInt(n)+"px"}function pct(n){return""+parseInt(n)+"%"}function cssClass(cl){return options.baseClass+"-"+cl}function getPos(obj){var pos=$(obj).offset();return[pos.left,pos.top]}function mouseAbs(e){return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])]}function myCursor(type){if(type!=lastcurs){Tracker.setCursor(type);lastcurs=type}}function startDragMode(mode,pos){docOffset=getPos($img);Tracker.setCursor(mode=="move"?mode:mode+"-resize");if(mode=="move"){return Tracker.activateHandlers(createMover(pos),doneSelect)}var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect)}function dragmodeHandler(mode,f){return function(pos){if(!options.aspectRatio){switch(mode){case"e":pos[1]=f.y2;break;case"w":pos[1]=f.y2;break;case"n":pos[0]=f.x2;break;case"s":pos[0]=f.x2;break}}else{switch(mode){case"e":pos[1]=f.y+1;break;case"w":pos[1]=f.y+1;break;case"n":pos[0]=f.x+1;break;case"s":pos[0]=f.x+1;break}}Coords.setCurrent(pos);Selection.update()}}function createMover(pos){var lloc=pos;KeyManager.watchKeys();return function(pos){Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update()}}function oppLockCorner(ord){switch(ord){case"n":return"sw";case"s":return"nw";case"e":return"nw";case"w":return"ne";case"ne":return"sw";case"nw":return"se";case"se":return"nw";case"sw":return"ne"}}function createDragger(ord){return function(e){if(options.disabled){return false}if((ord=="move")&&!options.allowMove){return false}btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false}}function presize($obj,w,h){var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0){nw=w;nh=(w/$obj.width())*$obj.height()}if((nh>h)&&h>0){nh=h;nw=(h/$obj.height())*$obj.width()}xscale=$obj.width()/nw; +yscale=$obj.height()/nh;$obj.width(nw).height(nh)}function unscale(c){return{x:parseInt(c.x*xscale),y:parseInt(c.y*yscale),x2:parseInt(c.x2*xscale),y2:parseInt(c.y2*yscale),w:parseInt(c.w*xscale),h:parseInt(c.h*yscale)}}function doneSelect(pos){var c=Coords.getFixed();if(c.w>options.minSelect[0]&&c.h>options.minSelect[1]){Selection.enableHandles();Selection.done()}else{Selection.release()}Tracker.setCursor(options.allowSelect?"crosshair":"default")}function newSelection(e){if(options.disabled){return false}if(!options.allowSelect){return false}btndown=true;docOffset=getPos($img);Selection.disableHandles();myCursor("crosshair");var pos=mouseAbs(e);Coords.setPressed(pos);Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();Selection.update();e.stopPropagation();e.preventDefault();return false}function selectDrag(pos){Coords.setCurrent(pos);Selection.update()}function newTracker(){var trk=$("").addClass(cssClass("tracker"));$.browser.msie&&trk.css({opacity:0,backgroundColor:"white"});return trk}function animateTo(a){var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(animating){return}var animto=Coords.flipCoords(x1,y1,x2,y2);var c=Coords.getFixed();var animat=initcr=[c.x,c.y,c.x2,c.y2];var interv=options.animationDelay;var x=animat[0];var y=animat[1];var x2=animat[2];var y2=animat[3];var ix1=animto[0]-initcr[0];var iy1=animto[1]-initcr[1];var ix2=animto[2]-initcr[2];var iy2=animto[3]-initcr[3];var pcent=0;var velocity=options.swingSpeed;Selection.animMode(true);var animator=function(){return function(){pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent<100){animateStart()}else{Selection.done()}if(pcent>=99.8){pcent=100}setSelectRaw(animat)}}();function animateStart(){window.setTimeout(animator,interv)}animateStart()}function setSelect(rect){setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale])}function setSelectRaw(l){Coords.setPressed([l[0],l[1]]); +Coords.setCurrent([l[2],l[3]]);Selection.update()}function setOptions(opt){if(typeof(opt)!="object"){opt={}}options=$.extend(options,opt);if(typeof(options.onChange)!=="function"){options.onChange=function(){}}if(typeof(options.onSelect)!=="function"){options.onSelect=function(){}}}function tellSelect(){return unscale(Coords.getFixed())}function tellScaled(){return Coords.getFixed()}function setOptionsNew(opt){setOptions(opt);interfaceUpdate()}function disableCrop(){options.disabled=true;Selection.disableHandles();Selection.setCursor("default");Tracker.setCursor("default")}function enableCrop(){options.disabled=false;interfaceUpdate()}function cancelCrop(){Selection.done();Tracker.activateHandlers(null,null)}function destroy(){$div.remove();$origimg.show()}function interfaceUpdate(alt){options.allowResize?alt?Selection.enableOnly():Selection.enableHandles():Selection.disableHandles();Tracker.setCursor(options.allowSelect?"crosshair":"default");Selection.setCursor(options.allowMove?"move":"default");$div.css("backgroundColor",options.bgColor);if("setSelect" in options){setSelect(opt.setSelect);Selection.done();delete (options.setSelect)}if("trueSize" in options){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy}xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if("outerImage" in options){$img.attr("src",options.outerImage);delete (options.outerImage)}Selection.refresh()}$hdl_holder.hide();interfaceUpdate(true);var api={animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale]},getWidgetSize:function(){return[boundx,boundy]},release:Selection.release,destroy:destroy};$origimg.data("Jcrop",api);return api};$.fn.Jcrop=function(options){function attachWhenDone(from){var loadsrc=options.useImg||from.src;var img=new Image(); +img.onload=function(){$.Jcrop(from,options)};img.src=loadsrc}if(typeof(options)!=="object"){options={}}this.each(function(){if($(this).data("Jcrop")){if(options=="api"){return $(this).data("Jcrop")}else{$(this).data("Jcrop").setOptions(options)}}else{attachWhenDone(this)}});return this}})(jQuery);(function($,undefined){$.fn.zyPopup=function(options,param){var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"){var fn=this[0][options];if($.isFunction(fn)){return fn.apply(this,otherArgs)}else{throw ("zyPopup - No such method: "+options)}}return this.each(function(){var para={};var self=this;var zoom="",zoomContent="",zoomedIn=false,openedImage=null,windowWidth="",windowHeight="";var tailorVal={};var defaults={src:"",index:0,name:"",onTailor:function(val){}};para=$.extend(defaults,options);this.init=function(){this.createHtml();this.openPopup();this.bindPopupEvent()};this.createHtml=function(){$("#zoom").remove();$("body").append('');zoom=$("#zoom").hide(),zoomContent=$("#zoom .content"),zoomedIn=false,openedImage=null,windowWidth=$(window).width(),windowHeight=$(window).height()};this.openPopup=function(){var self=this;var image=$(new Image()).attr("id","tailorImg").hide();$("#zoom .previous, #zoom .next").show();if(!zoomedIn){zoomedIn=true;zoom.show();$("body").addClass("zoomed")}zoomContent.html(image).delay(500).addClass("loading");image.load(render).attr("src",para.src);function render(){var image=$(this),borderWidth=parseInt(zoomContent.css("borderLeftWidth")),maxImageWidth=windowWidth-(borderWidth*2),maxImageHeight=windowHeight-(borderWidth*2),imageWidth=image.width(),imageHeight=image.height();if(imageWidth==zoomContent.width()&&imageWidth<=maxImageWidth&&imageHeight==zoomContent.height()&&imageHeight<=maxImageHeight){show(image);return}zoomContent.animate({width:image.width(),height:image.height(),marginTop:-(image.height()/2)-borderWidth,marginLeft:-(image.width()/2)-borderWidth},200,function(){show(image) +});function show(image){image.show();zoomContent.removeClass("loading");self.createTailorPlug()}}};this.createTailorPlug=function(){var width=$("#tailorImg").width();var height=$("#tailorImg").height();var x1=(width/2)-(width/5);var y1=(height/2)-(height/5);var x2=(width/2)+(width/5);var y2=(height/2)+(height/5);var api=$.Jcrop("#tailorImg",{setSelect:[x1,y1,x2,y2],onChange:setCoords,onSelect:setCoords});function setCoords(obj){tailorVal={"leftX":obj.x,"leftY":obj.y,"rightX":obj.x2,"rightY":obj.y2,"width":obj.w,"height":obj.h}}};this.bindPopupEvent=function(){var self=this;zoom.bind("click",function(event){event.preventDefault();if($(event.target).attr("id")=="zoom"){self.closePopup(event)}});$("#zoom .finish").bind("click",function(event){var quondamImgInfo=new Object();quondamImgInfo["width"]=$(".jcrop-holder>div>div>img").width();quondamImgInfo["height"]=$(".jcrop-holder>div>div>img").height();para.onTailor(tailorVal,quondamImgInfo);self.closePopup(event)});$("#zoom .close").bind("click",function(event){self.closePopup(event)})};this.closePopup=function(event){if(event){event.preventDefault()}zoomedIn=false;openedImage=null;zoom.hide();$("body").removeClass("zoomed");zoomContent.empty()};this.init()})}})(jQuery);var ZYFILE={fileInput:null,uploadInput:null,dragDrop:null,url:"",uploadFile:[],lastUploadFile:[],perUploadFile:[],fileNum:0,filterFile:function(files){return files},onSelect:function(selectFile,files){},onDelete:function(file,files){},onProgress:function(file,loaded,total){},onSuccess:function(file,responseInfo){},onFailure:function(file,responseInfo){},onComplete:function(responseInfo){},funDragHover:function(e){e.stopPropagation();e.preventDefault();this[e.type==="dragover"?"onDragOver":"onDragLeave"].call(e.target);return this},funGetFiles:function(e){var self=this;this.funDragHover(e);var files=e.target.files||e.dataTransfer.files;self.lastUploadFile=this.uploadFile;this.uploadFile=this.uploadFile.concat(this.filterFile(files));var tmpFiles=[];var lArr=[]; +var uArr=[];$.each(self.lastUploadFile,function(k,v){lArr.push(v.name)});$.each(self.uploadFile,function(k,v){uArr.push(v.name)});$.each(uArr,function(k,v){if($.inArray(v,lArr)<0){tmpFiles.push(self.uploadFile[k])}});this.uploadFile=tmpFiles;this.funDealtFiles();return true},funDealtFiles:function(){var self=this;$.each(this.uploadFile,function(k,v){v.index=self.fileNum;self.fileNum++});var selectFile=this.uploadFile;this.perUploadFile=this.perUploadFile.concat(this.uploadFile);this.uploadFile=this.lastUploadFile.concat(this.uploadFile);this.onSelect(selectFile,this.uploadFile);console.info("继续选择");console.info(this.uploadFile);return this},funDeleteFile:function(delFileIndex,isCb){var self=this;var tmpFile=[];var delFile=this.perUploadFile[delFileIndex];$.each(this.uploadFile,function(k,v){if(delFile!=v){tmpFile.push(v)}});this.uploadFile=tmpFile;if(isCb){self.onDelete(delFile,this.uploadFile)}console.info("还剩这些文件没有上传:");console.info(this.uploadFile);return true},funUploadFiles:function(){var self=this;$.each(this.uploadFile,function(k,v){self.funUploadFile(v)})},funUploadFile:function(file){var self=this;var formdata=new FormData();formdata.append("file",file);if($("#uploadTailor_"+file.index).length>0){formdata.append("tailor",$("#uploadTailor_"+file.index).attr("tailor"))}var xhr=new XMLHttpRequest();xhr.upload.addEventListener("progress",function(e){self.onProgress(file,e.loaded,e.total)},false);xhr.addEventListener("load",function(e){self.funDeleteFile(file.index,false);self.onSuccess(file,xhr.responseText);if(self.uploadFile.length==0){self.onComplete("全部完成")}},false);xhr.addEventListener("error",function(e){self.onFailure(file,xhr.responseText)},false);xhr.open("POST",self.url,true);xhr.send(formdata)},funReturnNeedFiles:function(){return this.uploadFile},init:function(){var self=this;if(this.dragDrop){this.dragDrop.addEventListener("dragover",function(e){self.funDragHover(e)},false);this.dragDrop.addEventListener("dragleave",function(e){self.funDragHover(e)},false); +this.dragDrop.addEventListener("drop",function(e){self.funGetFiles(e)},false)}if(self.fileInput){this.fileInput.addEventListener("change",function(e){self.funGetFiles(e)},false)}if(self.uploadInput){this.uploadInput.addEventListener("click",function(e){self.funUploadFiles(e)},false)}}};(function($,undefined){$.fn.zyUpload=function(options,param){var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"){var fn=this[0][options];if($.isFunction(fn)){return fn.apply(this,otherArgs)}else{throw ("zyUpload - No such method: "+options)}}return this.each(function(){var para={};var self=this;var defaults={width:"700px",height:"400px",itemWidth:"140px",itemHeight:"120px",url:"/upload/UploadAction",fileType:[],fileSize:51200000,multiple:true,dragDrop:true,tailor:false,del:true,finishDel:false,onSelect:function(selectFiles,allFiles){},onDelete:function(file,files){},onSuccess:function(file,response){},onFailure:function(file,response){},onComplete:function(response){}};para=$.extend(defaults,options);this.init=function(){this.createHtml();this.createCorePlug()};this.createHtml=function(){var multiple="";para.multiple?multiple="multiple":multiple="";var html="";if(para.dragDrop){html+='';html+=' ';html+=' ';html+=' ';html+=' ';html+=' ';html+=' 点击选择文件';html+=' ";html+=" ";html+=" ";html+=' 或者将文件拖到此处';html+=" ";html+=' ';html+=' 选中0张文件,共0B。';html+=' ';html+=' 继续选择';html+=' 开始上传'; +html+=" ";html+=" ";html+=' ';html+=" ";html+=' ';html+=' 确认上传文件';html+=" ";html+=' ';html+=" ";html+=""}else{var imgWidth=parseInt(para.itemWidth.replace("px",""))-15;html+='';html+=' ';html+=' ';html+=' ';html+=' 选中0张文件,共0B。';html+=' ';html+=' ";html+=' 选择文件';html+=' 开始上传';html+=" ";html+=" ";html+=' ';html+=' ';html+=' ';html+=' ';html+=' ';html+=" ";html+=" ";html+=" ";html+=" ";html+=" ";html+=' ';html+=' 确认上传文件';html+=" ";html+=' ';html+=" ";html+=""}$(self).append(html).css({"width":para.width,"height":para.height});this.addEvent()};this.funSetStatusInfo=function(files){var size=0;var num=files.length;$.each(files,function(k,v){size+=v.size});if(size>1024*1024){size=(Math.round(size*100/(1024*1024))/100).toString()+"MB" +}else{size=(Math.round(size*100/1024)/100).toString()+"KB"}$("#status_info").html("选中"+num+"张文件,共"+size+"。")};this.funFilterEligibleFile=function(files){var arrFiles=[];for(var i=0,file;file=files[i];i++){var newStr=file.name.split("").reverse().join("");if(newStr.split(".")[0]!=null){var type=newStr.split(".")[0].split("").reverse().join("");if(jQuery.inArray(type,para.fileType)>-1){if(file.size>=para.fileSize){alert('您这个"'+file.name+'"文件大小过大')}else{arrFiles.push(file)}}else{alert('您这个"'+file.name+'"上传类型不符合')}}else{alert('您这个"'+file.name+'"没有类型, 无法识别')}}return arrFiles};this.funDisposePreviewHtml=function(file,e){var html="";var imgWidth=parseInt(para.itemWidth.replace("px",""))-15;var imgHeight=parseInt(para.itemHeight.replace("px",""))-10;var editHtml="";var delHtml="";if(para.tailor){editHtml=''}if(para.del){delHtml=''}var newStr=file.name.split("").reverse().join("");var type=newStr.split(".")[0].split("").reverse().join("");var fileImgSrc="zyupload/skins/images/fileType/";if(type=="rar"){fileImgSrc=fileImgSrc+"rar.png"}else{if(type=="zip"){fileImgSrc=fileImgSrc+"zip.png"}else{if(type=="txt"){fileImgSrc=fileImgSrc+"txt.png"}else{if(type=="ppt"){fileImgSrc=fileImgSrc+"ppt.png"}else{if(type=="xls"){fileImgSrc=fileImgSrc+"xls.png"}else{if(type=="pdf"){fileImgSrc=fileImgSrc+"pdf.png"}else{if(type=="psd"){fileImgSrc=fileImgSrc+"psd.png"}else{if(type=="ttf"){fileImgSrc=fileImgSrc+"ttf.png"}else{if(type=="swf"){fileImgSrc=fileImgSrc+"swf.png"}else{fileImgSrc=fileImgSrc+"file.png"}}}}}}}}}if(file.type.indexOf("image")==0){html+='';html+=' ';html+=' ';html+=' '+file.name+"";html+=editHtml;html+=delHtml;html+=" ";html+=" ";html+=' '; +html+=' ';html+=' ';html+=" ";html+=" ";html+=' ';html+=' 上传失败,请重试';html+=' 裁剪完成';html+=' ';html+=""}else{html+='';html+=' ';html+=' ';html+=' '+file.name+"";html+=delHtml;html+=" ";html+=" ";html+=' ';html+=' ';html+=' ';html+=" ";html+=" ";html+=' ';html+=' 上传失败,请重试';html+=' ';html+=""}return html};this.createPopupPlug=function(imgSrc,index,name){$("body").zyPopup({src:imgSrc,index:index,name:name,onTailor:function(val,quondamImgInfo){var nWidth=parseInt(para.itemWidth.replace("px",""));var nHeight=parseInt(para.itemHeight.replace("px",""));var qWidth=val.width;var qHeight=val.height;var ratio=nWidth/qWidth;var width=ratio*quondamImgInfo.width;var height=ratio*quondamImgInfo.height;var left=val.leftX*ratio;var top=val.rightY*ratio-qHeight*ratio;$("#uploadImage_"+index).css({"width":width,"height":height,"margin-left":-left,"margin-top":-top}); +$("#uploadTailor_"+index).show();console.info(val);var tailor="{'leftX':"+val.leftX+",'leftY':"+val.leftY+",'rightX':"+val.rightX+",'rightY':"+val.rightY+",'width':"+val.width+",'height':"+val.height+"}";$("#uploadTailor_"+index).attr("tailor",tailor)}})};this.createCorePlug=function(){var params={fileInput:$("#fileImage").get(0),uploadInput:$("#fileSubmit").get(0),dragDrop:$("#fileDragArea").get(0),url:$("#uploadForm").attr("action"),filterFile:function(files){return self.funFilterEligibleFile(files)},onSelect:function(selectFiles,allFiles){para.onSelect(selectFiles,allFiles);self.funSetStatusInfo(ZYFILE.funReturnNeedFiles());var html="",i=0;var funDealtPreviewHtml=function(){file=selectFiles[i];if(file){var reader=new FileReader();reader.onload=function(e){html+=self.funDisposePreviewHtml(file,e);i++;funDealtPreviewHtml()};reader.readAsDataURL(file)}else{funAppendPreviewHtml(html)}};var funAppendPreviewHtml=function(html){if(para.dragDrop){$("#preview").append(html)}else{$(".add_upload").before(html)}funBindDelEvent();funBindHoverEvent()};var funBindDelEvent=function(){if($(".file_del").length>0){$(".file_del").click(function(){ZYFILE.funDeleteFile(parseInt($(this).attr("data-index")),true);return false})}if($(".file_edit").length>0){$(".file_edit").click(function(){var imgIndex=$(this).attr("data-index");var imgName=$(this).prev(".file_name").attr("title");var imgSrc=$("#uploadImage_"+imgIndex).attr("src");self.createPopupPlug(imgSrc,imgIndex,imgName);return false})}};var funBindHoverEvent=function(){$(".upload_append_list").hover(function(e){$(this).find(".file_bar").addClass("file_hover")},function(e){$(this).find(".file_bar").removeClass("file_hover")})};funDealtPreviewHtml()},onDelete:function(file,files){para.onDelete(file,files);$("#uploadList_"+file.index).fadeOut();self.funSetStatusInfo(files);console.info("剩下的文件");console.info(files)},onProgress:function(file,loaded,total){var eleProgress=$("#uploadProgress_"+file.index),percent=(loaded/total*100).toFixed(2)+"%"; +if(eleProgress.is(":hidden")){eleProgress.show()}eleProgress.css("width",percent)},onSuccess:function(file,response){para.onSuccess(file,response);$("#uploadProgress_"+file.index).hide();$("#uploadSuccess_"+file.index).show();if(para.finishDel){$("#uploadList_"+file.index).fadeOut();self.funSetStatusInfo(ZYFILE.funReturnNeedFiles())}if($("#uploadTailor_"+file.index).length>0){$("#uploadTailor_"+file.index).hide()}},onFailure:function(file,response){para.onFailure(file,response);$("#uploadProgress_"+file.index).hide();$("#uploadSuccess_"+file.index).show();if($("#uploadTailor_"+file.index).length>0){$("#uploadTailor_"+file.index).hide()}$("#uploadInf").append("文件"+file.name+"上传失败!")},onComplete:function(response){para.onComplete(response);console.info(response)},onDragOver:function(){$(this).addClass("upload_drag_hover")},onDragLeave:function(){$(this).removeClass("upload_drag_hover")}};ZYFILE=$.extend(ZYFILE,params);ZYFILE.init()};this.addEvent=function(){if($(".filePicker").length>0){$(".filePicker").bind("click",function(e){$("#fileImage").click()})}$(".webuploader_pick").bind("click",function(e){$("#fileImage").click()});$(".upload_btn").bind("click",function(e){if(ZYFILE.funReturnNeedFiles().length>0){$("#fileSubmit").click()}else{alert("请先选中文件再点击上传")}});if($("#rapidAddImg").length>0){$("#rapidAddImg").bind("click",function(e){$("#fileImage").click()})}};this.init()})}})(jQuery); diff --git a/src/main/resources/static/js/jquery.js b/src/main/resources/static/js/jquery.js new file mode 100644 index 0000000..07c00cd --- /dev/null +++ b/src/main/resources/static/js/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"",""],thead:[1,"",""],col:[2,"",""],tr:[2,"",""],td:[3,"",""],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/'; + }; + var dataToHtml = function (editor, dataIn) { + var data = global$1.extend({}, dataIn); + if (!data.source) { + global$1.extend(data, htmlToData(getScripts(editor), data.embed)); + if (!data.source) { + return ''; + } + } + if (!data.altsource) { + data.altsource = ''; + } + if (!data.poster) { + data.poster = ''; + } + data.source = editor.convertURL(data.source, 'source'); + data.altsource = editor.convertURL(data.altsource, 'source'); + data.sourcemime = guess(data.source); + data.altsourcemime = guess(data.altsource); + data.poster = editor.convertURL(data.poster, 'poster'); + var pattern = matchPattern(data.source); + if (pattern) { + data.source = pattern.url; + data.type = pattern.type; + data.allowFullscreen = pattern.allowFullscreen; + data.width = data.width || String(pattern.w); + data.height = data.height || String(pattern.h); + } + if (data.embed) { + return updateHtml(data.embed, data, true); + } else { + var videoScript = getVideoScriptMatch(getScripts(editor), data.source); + if (videoScript) { + data.type = 'script'; + data.width = String(videoScript.width); + data.height = String(videoScript.height); + } + var audioTemplateCallback = getAudioTemplateCallback(editor); + var videoTemplateCallback = getVideoTemplateCallback(editor); + data.width = data.width || '300'; + data.height = data.height || '150'; + global$1.each(data, function (value, key) { + data[key] = editor.dom.encode('' + value); + }); + if (data.type === 'iframe') { + return getIframeHtml(data); + } else if (data.sourcemime === 'application/x-shockwave-flash') { + return getFlashHtml(data); + } else if (data.sourcemime.indexOf('audio') !== -1) { + return getAudioHtml(data, audioTemplateCallback); + } else if (data.type === 'script') { + return getScriptHtml(data); + } else { + return getVideoHtml(data, videoTemplateCallback); + } + } + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var cache = {}; + var embedPromise = function (data, dataToHtml, handler) { + return new global$6(function (res, rej) { + var wrappedResolve = function (response) { + if (response.html) { + cache[data.source] = response; + } + return res({ + url: data.source, + html: response.html ? response.html : dataToHtml(data) + }); + }; + if (cache[data.source]) { + wrappedResolve(cache[data.source]); + } else { + handler({ url: data.source }, wrappedResolve, rej); + } + }); + }; + var defaultPromise = function (data, dataToHtml) { + return new global$6(function (res) { + res({ + html: dataToHtml(data), + url: data.source + }); + }); + }; + var loadedData = function (editor) { + return function (data) { + return dataToHtml(editor, data); + }; + }; + var getEmbedHtml = function (editor, data) { + var embedHandler = getUrlResolver(editor); + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); + }; + var isCached = function (url) { + return cache.hasOwnProperty(url); + }; + + var extractMeta = function (sourceInput, data) { + return get(data, sourceInput).bind(function (mainData) { + return get(mainData, 'meta'); + }); + }; + var getValue = function (data, metaData, sourceInput) { + return function (prop) { + var _a; + var getFromData = function () { + return get(data, prop); + }; + var getFromMetaData = function () { + return get(metaData, prop); + }; + var getNonEmptyValue = function (c) { + return get(c, 'value').bind(function (v) { + return v.length > 0 ? Option.some(v) : Option.none(); + }); + }; + var getFromValueFirst = function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () { + return Option.from(child); + }); + }); + }; + var getFromMetaFirst = function () { + return getFromMetaData().orThunk(function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child) : Option.from(child); + }); + }); + }; + return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a; + }; + }; + var getDimensions = function (data, metaData) { + var dimensions = {}; + get(data, 'dimensions').each(function (dims) { + each([ + 'width', + 'height' + ], function (prop) { + get(metaData, prop).orThunk(function () { + return get(dims, prop); + }).each(function (value) { + return dimensions[prop] = value; + }); + }); + }); + return dimensions; + }; + var unwrap = function (data, sourceInput) { + var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {}; + var get = getValue(data, metaData, sourceInput); + return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData)); + }; + var wrap = function (data) { + var wrapped = __assign(__assign({}, data), { + source: { value: get(data, 'source').getOr('') }, + altsource: { value: get(data, 'altsource').getOr('') }, + poster: { value: get(data, 'poster').getOr('') } + }); + each([ + 'width', + 'height' + ], function (prop) { + get(data, prop).each(function (value) { + var dimensions = wrapped.dimensions || {}; + dimensions[prop] = value; + wrapped.dimensions = dimensions; + }); + }); + return wrapped; + }; + var handleError = function (editor) { + return function (error) { + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); + }; + }; + var snippetToData = function (editor, embedSnippet) { + return htmlToData(getScripts(editor), embedSnippet); + }; + var isMediaElement = function (element) { + return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri'); + }; + var getEditorData = function (editor) { + var element = editor.selection.getNode(); + var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; + return __assign({ embed: snippet }, htmlToData(getScripts(editor), snippet)); + }; + var addEmbedHtml = function (api, editor) { + return function (response) { + if (isString(response.url) && response.url.trim().length > 0) { + var html = response.html; + var snippetData = snippetToData(editor, html); + var nuData = __assign(__assign({}, snippetData), { + source: response.url, + embed: html + }); + api.setData(wrap(nuData)); + } + }; + }; + var selectPlaceholder = function (editor, beforeObjects) { + var afterObjects = editor.dom.select('img[data-mce-object]'); + for (var i = 0; i < beforeObjects.length; i++) { + for (var y = afterObjects.length - 1; y >= 0; y--) { + if (beforeObjects[i] === afterObjects[y]) { + afterObjects.splice(y, 1); + } + } + } + editor.selection.select(afterObjects[0]); + }; + var handleInsert = function (editor, html) { + var beforeObjects = editor.dom.select('img[data-mce-object]'); + editor.insertContent(html); + selectPlaceholder(editor, beforeObjects); + editor.nodeChanged(); + }; + var submitForm = function (prevData, newData, editor) { + newData.embed = updateHtml(newData.embed, newData); + if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) { + handleInsert(editor, newData.embed); + } else { + getEmbedHtml(editor, newData).then(function (response) { + handleInsert(editor, response.html); + }).catch(handleError(editor)); + } + }; + var showDialog = function (editor) { + var editorData = getEditorData(editor); + var currentData = Cell(editorData); + var initialData = wrap(editorData); + var handleSource = function (prevData, api) { + var serviceData = unwrap(api.getData(), 'source'); + if (prevData.source !== serviceData.source) { + addEmbedHtml(win, editor)({ + url: serviceData.source, + html: '' + }); + getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + } + }; + var handleEmbed = function (api) { + var data = unwrap(api.getData()); + var dataFromEmbed = snippetToData(editor, data.embed); + api.setData(wrap(dataFromEmbed)); + }; + var handleUpdate = function (api, sourceInput) { + var data = unwrap(api.getData(), sourceInput); + var embed = dataToHtml(editor, data); + api.setData(wrap(__assign(__assign({}, data), { embed: embed }))); + }; + var mediaInput = [{ + name: 'source', + type: 'urlinput', + filetype: 'media', + label: 'Source' + }]; + var sizeInput = !hasDimensions(editor) ? [] : [{ + type: 'sizeinput', + name: 'dimensions', + label: 'Constrain proportions', + constrain: true + }]; + var generalTab = { + title: 'General', + name: 'general', + items: flatten([ + mediaInput, + sizeInput + ]) + }; + var embedTextarea = { + type: 'textarea', + name: 'embed', + label: 'Paste your embed code below:' + }; + var embedTab = { + title: 'Embed', + items: [embedTextarea] + }; + var advancedFormItems = []; + if (hasAltSource(editor)) { + advancedFormItems.push({ + name: 'altsource', + type: 'urlinput', + filetype: 'media', + label: 'Alternative source URL' + }); + } + if (hasPoster(editor)) { + advancedFormItems.push({ + name: 'poster', + type: 'urlinput', + filetype: 'image', + label: 'Media poster (Image URL)' + }); + } + var advancedTab = { + title: 'Advanced', + name: 'advanced', + items: advancedFormItems + }; + var tabs = [ + generalTab, + embedTab + ]; + if (advancedFormItems.length > 0) { + tabs.push(advancedTab); + } + var body = { + type: 'tabpanel', + tabs: tabs + }; + var win = editor.windowManager.open({ + title: 'Insert/Edit Media', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var serviceData = unwrap(api.getData()); + submitForm(currentData.get(), serviceData, editor); + api.close(); + }, + onChange: function (api, detail) { + switch (detail.name) { + case 'source': + handleSource(currentData.get(), api); + break; + case 'embed': + handleEmbed(api); + break; + case 'dimensions': + case 'altsource': + case 'poster': + handleUpdate(api, detail.name); + break; + } + currentData.set(unwrap(api.getData())); + }, + initialData: initialData + }); + }; + + var get$1 = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + return { showDialog: showDialog$1 }; + }; + + var register = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + editor.addCommand('mceMedia', showDialog$1); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$8 = tinymce.util.Tools.resolve('tinymce.Env'); + + var sanitize = function (editor, html) { + if (shouldFilterHtml(editor) === false) { + return html; + } + var writer = global$5(); + var blocked; + global$3({ + validate: false, + allow_conditional_comments: false, + comment: function (text) { + writer.comment(text); + }, + cdata: function (text) { + writer.cdata(text); + }, + text: function (text, raw) { + writer.text(text, raw); + }, + start: function (name, attrs, empty) { + blocked = true; + if (name === 'script' || name === 'noscript' || name === 'svg') { + return; + } + for (var i = attrs.length - 1; i >= 0; i--) { + var attrName = attrs[i].name; + if (attrName.indexOf('on') === 0) { + delete attrs.map[attrName]; + attrs.splice(i, 1); + } + if (attrName === 'style') { + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); + } + } + writer.start(name, attrs, empty); + blocked = false; + }, + end: function (name) { + if (blocked) { + return; + } + writer.end(name); + } + }, global$4({})).parse(html); + return writer.getContent(); + }; + + var createPlaceholderNode = function (editor, node) { + var name = node.name; + var placeHolder = new global$7('img', 1); + placeHolder.shortEnded = true; + retainAttributesAndInnerHtml(editor, node, placeHolder); + placeHolder.attr({ + 'width': node.attr('width') || '300', + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'), + 'style': node.attr('style'), + 'src': global$8.transparentSrc, + 'data-mce-object': name, + 'class': 'mce-object mce-object-' + name + }); + return placeHolder; + }; + var createPreviewIframeNode = function (editor, node) { + var name = node.name; + var previewWrapper = new global$7('span', 1); + previewWrapper.attr({ + 'contentEditable': 'false', + 'style': node.attr('style'), + 'data-mce-object': name, + 'class': 'mce-preview-object mce-object-' + name + }); + retainAttributesAndInnerHtml(editor, node, previewWrapper); + var previewNode = new global$7(name, 1); + previewNode.attr({ + src: node.attr('src'), + allowfullscreen: node.attr('allowfullscreen'), + style: node.attr('style'), + class: node.attr('class'), + width: node.attr('width'), + height: node.attr('height'), + frameborder: '0' + }); + var shimNode = new global$7('span', 1); + shimNode.attr('class', 'mce-shim'); + previewWrapper.append(previewNode); + previewWrapper.append(shimNode); + return previewWrapper; + }; + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { + var attrName; + var attrValue; + var ai; + var attribs = sourceNode.attributes; + ai = attribs.length; + while (ai--) { + attrName = attribs[ai].name; + attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + if (attrName === 'data' || attrName === 'src') { + attrValue = editor.convertURL(attrValue, attrName); + } + targetNode.attr('data-mce-p-' + attrName, attrValue); + } + } + var innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + if (innerHtml) { + targetNode.attr('data-mce-html', escape(sanitize(editor, innerHtml))); + targetNode.firstChild = null; + } + }; + var isPageEmbedWrapper = function (node) { + var nodeClass = node.attr('class'); + return nodeClass && /\btiny-pageembed\b/.test(nodeClass); + }; + var isWithinEmbedWrapper = function (node) { + while (node = node.parent) { + if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) { + return true; + } + } + return false; + }; + var placeHolderConverter = function (editor) { + return function (nodes) { + var i = nodes.length; + var node; + var videoScript; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (node.name === 'script') { + videoScript = getVideoScriptMatch(getScripts(editor), node.attr('src')); + if (!videoScript) { + continue; + } + } + if (videoScript) { + if (videoScript.width) { + node.attr('width', videoScript.width.toString()); + } + if (videoScript.height) { + node.attr('height', videoScript.height.toString()); + } + } + if (node.name === 'iframe' && hasLiveEmbeds(editor) && global$8.ceFalse) { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPreviewIframeNode(editor, node)); + } + } else { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPlaceholderNode(editor, node)); + } + } + } + }; + }; + + var setup = function (editor) { + editor.on('preInit', function () { + var specialElements = editor.schema.getSpecialElements(); + global$1.each('video audio iframe object'.split(' '), function (name) { + specialElements[name] = new RegExp('' + name + '[^>]*>', 'gi'); + }); + var boolAttrs = editor.schema.getBoolAttrs(); + global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + boolAttrs[name] = {}; + }); + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', placeHolderConverter(editor)); + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { + var i = nodes.length; + var node; + var realElm; + var ai; + var attribs; + var innerHtml; + var innerNode; + var realElmName; + var className; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + realElmName = node.attr(name); + realElm = new global$7(realElmName, 1); + if (realElmName !== 'audio' && realElmName !== 'script') { + className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1) { + realElm.attr({ + width: node.firstChild.attr('width'), + height: node.firstChild.attr('height') + }); + } else { + realElm.attr({ + width: node.attr('width'), + height: node.attr('height') + }); + } + } + realElm.attr({ style: node.attr('style') }); + attribs = node.attributes; + ai = attribs.length; + while (ai--) { + var attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + realElm.attr(attrName.substr(11), attribs[ai].value); + } + } + if (realElmName === 'script') { + realElm.attr('type', 'text/javascript'); + } + innerHtml = node.attr('data-mce-html'); + if (innerHtml) { + innerNode = new global$7('#text', 3); + innerNode.raw = true; + innerNode.value = sanitize(editor, unescape(innerHtml)); + realElm.append(innerNode); + } + node.replace(realElm); + } + }); + }); + editor.on('SetContent', function () { + editor.$('span.mce-preview-object').each(function (index, elm) { + var $elm = editor.$(elm); + if ($elm.find('span.mce-shim').length === 0) { + $elm.append(''); + } + }); + }); + }; + + var setup$1 = function (editor) { + editor.on('ResolveName', function (e) { + var name; + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { + e.name = name; + } + }); + }; + + var setup$2 = function (editor) { + editor.on('click keyup touchend', function () { + var selectedNode = editor.selection.getNode(); + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { + selectedNode.setAttribute('data-mce-selected', '2'); + } + } + }); + editor.on('ObjectSelected', function (e) { + var objectType = e.target.getAttribute('data-mce-object'); + if (objectType === 'audio' || objectType === 'script') { + e.preventDefault(); + } + }); + editor.on('ObjectResized', function (e) { + var target = e.target; + var html; + if (target.getAttribute('data-mce-object')) { + html = target.getAttribute('data-mce-html'); + if (html) { + html = unescape(html); + target.setAttribute('data-mce-html', escape(updateHtml(html, { + width: String(e.width), + height: String(e.height) + }))); + } + } + }); + }; + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('media', { + tooltip: 'Insert/edit media', + icon: 'embed', + onAction: function () { + editor.execCommand('mceMedia'); + }, + onSetup: stateSelectorAdapter(editor, [ + 'img[data-mce-object]', + 'span[data-mce-object]', + 'div[data-ephox-embed-iri]' + ]) + }); + editor.ui.registry.addMenuItem('media', { + icon: 'embed', + text: 'Media...', + onAction: function () { + editor.execCommand('mceMedia'); + } + }); + }; + + function Plugin () { + global.add('media', function (editor) { + register(editor); + register$1(editor); + setup$1(editor); + setup(editor); + setup$2(editor); + return get$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/media/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/media/plugin.min.js new file mode 100644 index 0000000..9ee7c88 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/media/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var e,t,r,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),p=function(){return(p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r"):"application/x-shockwave-flash"===n.sourcemime?(l='',s.poster&&(l+=''),l+=""):-1!==n.sourcemime.indexOf("audio")?(c=n,(u=h)?u(c):''+(c.altsource?'\n\n":"")+""):"script"===n.type?' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + return previewHtml; + }; + + var open = function (editor) { + var content = getPreviewHtml(editor); + var dataApi = editor.windowManager.open({ + title: 'Preview', + size: 'large', + body: { + type: 'panel', + items: [{ + name: 'preview', + type: 'iframe', + sandboxed: true + }] + }, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: { preview: content } + }); + dataApi.focus('close'); + }; + + var register = function (editor) { + editor.addCommand('mcePreview', function () { + open(editor); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('preview', { + icon: 'preview', + tooltip: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + editor.ui.registry.addMenuItem('preview', { + icon: 'preview', + text: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + }; + + function Plugin () { + global.add('preview', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/preview/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 0000000..8f0496e --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=tinymce.util.Tools.resolve("tinymce.Env"),w=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(e){var t=function(t){var n="",i=t.dom.encode,e=t.getParam("content_style","");n+='',e&&(n+='");var o=t.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"";w.each(t.contentCSS,function(e){n+='"});var r,a,c,s,d,m,l,u=-1===(s=(r=t).getParam("body_id","tinymce","string")).indexOf("=")?s:(c=(a=r).getParam("body_id","","hash"))[a.id]||c,y=-1===(l=(d=t).getParam("body_class","","string")).indexOf("=")?l:(m=d).getParam("body_class","","hash")[m.id]||"",v=' + + +
'+file.name+"
上传失败,请重试
裁剪完成
文件"+file.name+"上传失败!