first commit

This commit is contained in:
2026-07-13 08:57:05 +08:00
commit 3ecbd0957b
2536 changed files with 200576 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
.git
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
+201
View File
@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+138
View File
@@ -0,0 +1,138 @@
<p align="center">
<img alt="logo" src="https://shensong.gitee.io/static/images/logo.png">
</p>
<h1 align="center" >ExciteCMS-Layui</h1>
<p align="center"><b>基于Spring Boot 2 + Layui 开发的内容管理系统 / 快速开发脚手架</b></p>
<p align="center">
<a href="https://gitee.com/geekrdc/ExciteCMS-SpringBoot-Layui/stargazers" target="_blank">
<img src="https://gitee.com/geekrdc/ExciteCMS-SpringBoot-Layui/badge/star.svg"></a>
<a href="https://gitee.com/geekrdc/ExciteCMS-SpringBoot-Layui/members" target="_blank">
<img src="https://gitee.com/geekrdc/ExciteCMS-SpringBoot-Layui/badge/fork.svg"></a>
<a href="https://github.com/cxh1231/ExciteCMS-SpringBoot-Layui/stargazers" target="_blank">
<img src="https://img.shields.io/github/stars/cxh1231/ExciteCMS-SpringBoot-Layui?style=flat-square&logo=GitHub"></a>
<a href="https://github.com/cxh1231/ExciteCMS-SpringBoot-Layui/network/members" target="_blank">
<img src="https://img.shields.io/github/forks/cxh1231/ExciteCMS-SpringBoot-Layui?style=flat-square&logo=GitHub"></a>
<a href="https://gitee.com/geekrdc/ExciteCMS-SpringBoot-Layui" target="_blank">
<img src="https://img.shields.io/badge/ExciteCMS%20Layui-1.0.0-brightgreen.svg"></a>
<a href="https://gitee.com/geekrdc/ExciteCMS-SpringBoot-Layui/blob/master/LICENSE" target="_blank">
<img src="https://img.shields.io/github/license/cxh1231/ExciteCMS-SpringBoot-Layui.svg?style=flat-square"></a>
</p>
## 1、主要功能简介
+ 用户管理:基本的增删改查与授权角色;
+ 角色管理:基本的增删改查与授权用户和授权菜单;
+ 菜单管理:基本的增删改查,其中以树状展示;
+ 日志管理:即操作日志管理、登录日志管理等功能;
+ 监控管理:即服务器监控、数据库监控等功能;
+ 开发功能:即代码生成等功能;
+ 第三方功能:如微信支付、支付宝支付、七牛云OSS等功能;
+
## 2、视频演示
详情请访问:[https://www.bilibili.com/video/BV1Wq4y1h78B](https://www.bilibili.com/video/BV1Wq4y1h78B)
## 3、主要功能演示
> **系统功能**:主要实现了基本的RBAC,即用户管理、权限控制、日志管理、代码生成与系统监控等功能。其预览图如下所示。
<table>
<tr>
<td>
<img src="https://img.zxdmy.com/2022/202201302055725.png">
<center><b>首页</b></center>
</td>
<td>
<img src="https://img.zxdmy.com/2022/202201262036756.png">
<center><b>用户管理</b></center>
</td>
</tr>
<tr>
<td>
<img src="https://img.zxdmy.com/2022/202201262036690.png">
<center><b>角色管理</b></center>
</td>
<td>
<img src="https://img.zxdmy.com/2022/202201262034888.png">
<center><b>菜单/权限管理</b></center>
</td>
</tr>
<tr>
<td>
<img src="https://img.zxdmy.com/2022/202201262041698.png">
<center><b>操作日志</b></center>
</td>
<td>
<img src="https://img.zxdmy.com/2022/202201262042293.png">
<center><b>登录日志</b></center>
</td>
</tr>
<tr>
<td>
<img src="https://img.zxdmy.com/2022/202201262044870.png">
<center><b>代码生成</b></center>
</td>
<td>
<img src="https://img.zxdmy.com/2022/202201262044488.png">
<center><b>服务器监控</b></center>
</td>
</tr>
</table>
> **集成功能**:主要实现了部分第三方组件功能,如支付宝、微信等支付功能,对象存储服务功能,短信服务功能等。其预览见演示视频。
## 4、主要技术栈
**后的技术栈:**
| 技术栈 | 说明 |
| :---------------- | :----------------------- |
| Spring Boot 2.5.X | Spring框架 |
| Sa-Token | 权限认证框架 |
| thymeleaf | 前端模板引擎 |
| nekohtml | 提供非严格HTML模式支持 |
| mybatis-plus | Mybatis 的增强工具 |
| freemarker | 代码生成器模板 |
| lombok | LombokJava开发工具 |
| druid | 数据库连接池 |
| openapi | 接口文档 |
| fastjson | 阿里巴巴的开源JSON解析库 |
**前端模板:**
+ Layui
+ miniLayui
## 5、开发文档
网址1[https://excitecms.gitee.io](https://shensong.gitee.io)
网址2[https://excite.zxdmy.com](https://excite.zxdmy.com)
> 以上两个开发文档网址内容一致,区别是部署的仓库不同(Gitee和GitHub)。
## 6、在线体验
网址:[http://demo.excite.zxdmy.com](http://demo.excite.zxdmy.com)
体验账号:demo@zxdmy.com
登录密码:123456
> 注:① 体验账号只有浏览权限,无增删改的权限。② 由于部分页面设置了固定的长宽,使用电脑浏览器访问体验更佳!
## 7、支持
如果你觉得 ExciteCMS 还不错,可以通过点亮仓库右上角的 Star 来支持我们~
## 8、贡献
发现BUG?发现功能错误?欢迎提交**issues**:[Gitee](https://gitee.com/ExciteTeam/ExciteCMS-SpringBoot-Layui/issues) | [GitHub](https://github.com/cxh1231/ExciteCMS-SpringBoot-Layui/issues)
## 9、开源协议
[Apache License 2.0](https://gitee.com/ExciteTeam/ExciteCMS-SpringBoot-Layui/blob/master/LICENSE)
+396
View File
@@ -0,0 +1,396 @@
/*
Navicat Premium Data Transfer
Source Server : db_excite_cms
Source Server Type : MySQL
Source Server Version : 50734
Source Host : 1.15.186.61:3306
Source Schema : db_excite_cms
Target Server Type : MySQL
Target Server Version : 50734
File Encoding : 65001
Date: 30/01/2022 18:05:09
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for attach_file
-- ----------------------------
DROP TABLE IF EXISTS `attach_file`;
CREATE TABLE `attach_file` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '文件主键',
`user_id` bigint(20) NULL DEFAULT NULL COMMENT '上传用户id',
`file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件名(服务器内存储的)',
`file_source_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件原名(上传前)',
`file_size` int(11) NULL DEFAULT NULL COMMENT '文件大小',
`file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件路径',
`file_type` tinyint(4) NULL DEFAULT NULL COMMENT '文件类型 1:图片 2:视频 3:文件',
`file_mime_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件类型(mime-type',
`file_group_id` bigint(20) NULL DEFAULT 0 COMMENT '文件分组id',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1431 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '上传文件记录表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of attach_file
-- ----------------------------
-- ----------------------------
-- Table structure for global_config
-- ----------------------------
DROP TABLE IF EXISTS `global_config`;
CREATE TABLE `global_config` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键,自增',
`conf_service` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '配置信息的服务:如qiniualiyun',
`conf_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '配置信息的主键:如qiniu01、aliyunSms01等等',
`conf_value` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '配置信息的JSON值',
`encrypt` tinyint(4) NULL DEFAULT NULL COMMENT '是否加密:1-是 0-否',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`delete_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '组件配置信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of global_config
-- ----------------------------
INSERT INTO `global_config` VALUES (2, 'aliyunSms', 'aliyunSms001', '', 0, NULL, '2022-01-03 20:50:41', NULL);
INSERT INTO `global_config` VALUES (6, 'alipay', 'alipay', '666', 1, NULL, '2022-01-12 17:14:01', NULL);
-- ----------------------------
-- Table structure for sys_log_login
-- ----------------------------
DROP TABLE IF EXISTS `sys_log_login`;
CREATE TABLE `sys_log_login` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int(11) NULL DEFAULT NULL COMMENT '登录用户ID',
`user_account` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录用户账号',
`ip` varchar(127) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录IP',
`user_agent` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '浏览器Agent',
`req_data` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '请求数据',
`res_data` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '返回数据',
`time_cost` int(11) NULL DEFAULT NULL COMMENT '耗时',
`status` tinyint(4) NULL DEFAULT NULL COMMENT '请求状态:0-失败 | 1-成功',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`delete_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '登录日志表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_log_login
-- ----------------------------
INSERT INTO `sys_log_login` VALUES (53, 10000, '10000@zxdmy.com', '60.233.1.102', 'Windows 10 or Windows Server 2016;Chrome 97.0.4692.99', '[\"10000@zxdmy.com\",\"Pr+v96V9jqGTN6rgRUkGMHKjXuRyzrIVs70jtGoJmoRATDsvSTudyPD5/WqWVjs1nq4tmQX3gWYySzygIyEnOZoNWLe06AKhzId1P7Q0la75WUuLNzqbAs24kMGKfS/7SjFqmtwURHrzn0PALXtkUARhzbErcWe1h3YhFfaIm0g=\",\"0\",null]', '{\"msg\":\"登录成功!\",\"code\":200,\"data\":{\"tokenName\":\"com.zxdmy.excite\",\"tokenValue\":\"6cf72af4-eff9-4167-88c9-ad6aed4ca6be\",\"isLogin\":true,\"loginId\":\"10000\",\"loginType\":\"login\",\"tokenTimeout\":259200,\"sessionTimeout\":259200,\"tokenSessionTimeout\":-2,\"tokenActivityTimeout\":7200,\"loginDevice\":\"default-device\",\"tag\":null},\"success\":true}', 58, 1, '2022-01-30 17:43:27', NULL, NULL);
-- ----------------------------
-- Table structure for sys_log_request
-- ----------------------------
DROP TABLE IF EXISTS `sys_log_request`;
CREATE TABLE `sys_log_request` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int(11) NULL DEFAULT NULL COMMENT '请求用户ID',
`ip` varchar(127) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求IP',
`user_agent` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '浏览器Agent',
`req_uri` varchar(1023) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求的URI',
`req_method` varchar(31) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求方法:GET | POST | DELETE',
`req_function` varchar(511) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求的函数',
`req_data` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '请求的数据',
`res_data` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '返回的数据',
`time_cost` int(11) NULL DEFAULT NULL COMMENT '耗时',
`status` tinyint(4) NULL DEFAULT NULL COMMENT '请求状态:0-失败 | 1-成功',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`delete_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 162 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作请求日志表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_log_request
-- ----------------------------
INSERT INTO `sys_log_request` VALUES (161, 10000, '60.233.1.102', 'Windows 10 or Windows Server 2016;Chrome 97.0.4692.99', '/system/role/update', 'POST', 'SysRoleController.updateRole(..)', '[{\"id\":101,\"name\":\"围观角色\",\"permission\":\"visit\",\"remark\":\"演示用户拥有的权限\",\"sort\":50,\"status\":null,\"createTime\":null,\"updateTime\":null,\"deleteTime\":null,\"checkArr\":\"0\",\"parentId\":\"-1\",\"LAY_CHECKED\":false},[1,2,3,6,7,9,12,4,17,18,20,5,28,25,26,35,36,24,32,34,38,39,40,33,41,42]]', '{\"msg\":\"更新角色成功\",\"code\":200,\"success\":true}', 174, 1, '2022-01-30 17:43:50', NULL, NULL);
-- ----------------------------
-- Table structure for sys_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单/权限ID',
`name` varchar(63) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单/权限名称',
`icon` varchar(63) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单图标',
`path` varchar(63) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单/权限路由:对于后台控制类定义,示例:system/user/get/{id}',
`permission` varchar(63) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限标识符:对于后台控制类定义。示例:system:user:list',
`component` varchar(63) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件路径:对于前端框架定义。示例:system/user/index',
`parent_id` int(11) NULL DEFAULT NULL COMMENT '上级菜单ID',
`type` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单类型:C - 目录 | M - 菜单 | B - 按钮',
`sort` int(11) NULL DEFAULT NULL COMMENT '排序:数值越大越靠前',
`editable` tinyint(4) NULL DEFAULT NULL COMMENT '可编辑:0-禁止编辑 | 1-可编辑',
`removable` tinyint(4) NULL DEFAULT NULL COMMENT '可删除:0-禁止删除 | 1-可删除',
`status` tinyint(4) NULL DEFAULT NULL COMMENT '角色状态:0-封禁 | 1-正常 | 2-正常且禁止封禁',
`is_delete` tinyint(4) NULL DEFAULT NULL COMMENT '是否删除:0-未删除 | 1-已删除',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`delete_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 49 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统菜单/权限表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_menu
-- ----------------------------
INSERT INTO `sys_menu` VALUES (1, '系统功能', 'fa fa-gears', '', 'system:system', NULL, -1, 'N', 100, 0, 0, 2, NULL, '2021-09-16 20:10:10', '2021-12-04 18:53:50', NULL);
INSERT INTO `sys_menu` VALUES (2, '系统管理', 'fa fa-cog', '', 'system:index', NULL, 1, 'C', 80, 0, 0, 2, NULL, '2021-09-16 20:10:10', '2021-12-04 18:53:46', NULL);
INSERT INTO `sys_menu` VALUES (3, '系统用户', 'fa fa-user', '/system/user/index', 'system:user:index', NULL, 2, 'M', 75, 1, 0, 1, NULL, '2021-09-16 20:10:10', '2021-12-09 10:48:48', NULL);
INSERT INTO `sys_menu` VALUES (4, '角色管理', 'fa fa-users', '/system/role/index', 'system:role:index', NULL, 2, 'M', 70, 1, 0, 1, NULL, '2021-09-16 20:10:10', '2021-12-02 21:27:29', NULL);
INSERT INTO `sys_menu` VALUES (5, '菜单管理', 'fa fa-th-list', '/system/menu/index', 'system:menu:index', NULL, 2, 'M', 65, 1, 1, 1, NULL, '2021-09-16 20:10:10', '2021-12-02 21:01:06', NULL);
INSERT INTO `sys_menu` VALUES (6, '查询用户列表', 'fa fa fa-mouse-pointer', '/system/user/list/{type}', 'system:user:list', NULL, 3, 'B', 50, 1, 0, 1, NULL, '2021-10-12 20:50:33', '2021-12-04 17:13:17', NULL);
INSERT INTO `sys_menu` VALUES (7, '访问添加用户页面', 'fa fa-address-card', '/system/user/goAdd', 'system:user:goAdd', NULL, 3, 'B', 50, 1, 1, 1, NULL, '2021-09-16 20:10:10', '2021-12-02 21:45:36', NULL);
INSERT INTO `sys_menu` VALUES (8, '添加用户', 'fa fa-500px', '/system/user/add', 'system:user:add', NULL, 3, 'B', 50, 1, 1, 1, NULL, '2021-09-16 20:10:10', '2021-12-02 21:46:11', NULL);
INSERT INTO `sys_menu` VALUES (9, '访问用户编辑页面', 'fa fa-500px', '/system/user/goEdit', 'system:user:goEdit', NULL, 3, 'B', 50, 1, 1, 1, NULL, '2021-09-16 20:10:10', '2021-12-02 21:47:21', NULL);
INSERT INTO `sys_menu` VALUES (10, '更新用户信息', 'fa fa-address-book', '/system/user/update', 'system:user:update', NULL, 3, 'B', 50, 1, 1, 1, NULL, '2021-09-16 20:10:10', '2021-12-04 17:43:00', NULL);
INSERT INTO `sys_menu` VALUES (11, '删除用户', 'fa fa-address-book', '/system/user/delete', 'system:user:delete', NULL, 3, 'B', 50, 1, 1, 1, NULL, '2021-09-16 20:10:10', '2022-01-30 15:21:14', NULL);
INSERT INTO `sys_menu` VALUES (12, '访问分配角色页面', 'fa fa-address-book', '/system/user/role/{id}', 'system:user:role', NULL, 3, 'B', 50, 1, 1, 1, NULL, '2021-09-16 20:10:10', '2021-12-04 17:25:52', NULL);
INSERT INTO `sys_menu` VALUES (13, '分配角色', 'fa fa-address-book', '/system/user/authRole', 'system:user:authRole', NULL, 3, 'B', 50, 1, 0, 1, NULL, '2021-09-16 20:10:10', '2022-01-30 15:22:43', NULL);
INSERT INTO `sys_menu` VALUES (14, '改变用户状态', 'fa fa-address-book', '/system/user/changeStatus/{status}', 'system:user:changeStatus', NULL, 3, 'B', 50, 1, 1, 1, NULL, '2021-09-16 20:10:10', '2022-01-30 15:19:20', NULL);
INSERT INTO `sys_menu` VALUES (16, '重置密码', 'fa fa-compass', '/system/user/resetPassword', 'system:user:resetPassword', NULL, 3, 'B', 50, 1, 1, 1, NULL, '2021-12-02 17:32:40', '2022-01-30 15:23:33', NULL);
INSERT INTO `sys_menu` VALUES (17, '查询用户列表', 'fa fa-address-book', '/system/role/list', 'system:role:list', NULL, 4, 'B', 50, 1, 1, 1, NULL, '2021-12-02 21:20:41', '2021-12-04 19:01:55', NULL);
INSERT INTO `sys_menu` VALUES (18, '访问添加角色页面', 'fa fa-fonticons', '/system/role/goAdd', 'system:role:goAdd', NULL, 4, 'B', 50, 1, 1, 1, NULL, '2021-12-04 19:03:32', NULL, NULL);
INSERT INTO `sys_menu` VALUES (19, '添加角色', 'fa fa-fonticons', '/system/role/add', 'system:role:add', NULL, 4, 'B', 50, 1, 1, 1, NULL, '2021-12-04 19:03:54', NULL, NULL);
INSERT INTO `sys_menu` VALUES (20, '访问修改角色页面', 'fa fa-fonticons', '/system/role/goEdit/{id}', 'system:role:goEdit', NULL, 4, 'B', 50, 1, 1, 1, NULL, '2021-12-04 19:04:10', '2021-12-04 21:09:28', NULL);
INSERT INTO `sys_menu` VALUES (21, '修改角色', 'fa fa-fonticons', '/system/role/update', 'system:role:update', NULL, 4, 'B', 50, 1, 1, 1, NULL, '2021-12-04 19:04:35', NULL, NULL);
INSERT INTO `sys_menu` VALUES (22, '删除角色', 'fa fa-fonticons', '/system/role/delete', 'system:role:delete', NULL, 4, 'B', 50, 1, 1, 1, NULL, '2021-12-04 21:21:13', '2021-12-04 21:21:23', NULL);
INSERT INTO `sys_menu` VALUES (23, '改变角色状态', 'fa fa-fonticons', '/system/role/changeStatus/{status}', 'system:role:changeStatus', NULL, 4, 'B', 50, 1, 1, 1, NULL, '2021-12-04 21:35:37', '2021-12-08 20:33:05', NULL);
INSERT INTO `sys_menu` VALUES (24, '日志管理', 'fa fa-history', '', 'system:log', NULL, 1, 'C', 50, 1, 1, 1, NULL, '2021-12-06 15:48:11', '2021-12-26 16:30:38', NULL);
INSERT INTO `sys_menu` VALUES (25, '查询菜单列表', 'fa fa-fonticons', '/system/menu/list/{type}', 'system:menu:list', NULL, 5, 'B', 50, 1, 1, 1, NULL, '2021-12-07 11:31:13', NULL, NULL);
INSERT INTO `sys_menu` VALUES (26, '访问添加菜单页面', 'fa fa-fonticons', '/system/menu/goAdd', 'system:menu:goAdd', NULL, 5, 'B', 50, 1, 1, 1, NULL, '2021-12-07 11:31:42', NULL, NULL);
INSERT INTO `sys_menu` VALUES (27, '添加菜单', 'fa fa-fonticons', '/system/menu/add', 'system:menu:add', NULL, 5, 'B', 50, 1, 1, 1, NULL, '2021-12-07 11:31:52', NULL, NULL);
INSERT INTO `sys_menu` VALUES (28, '访问编辑菜单页面', 'fa fa-fonticons', '/system/menu/goEdit/{id}', 'system:menu:goEdit', NULL, 5, 'B', 50, 1, 1, 1, NULL, '2021-12-07 11:34:04', '2021-12-07 20:41:21', NULL);
INSERT INTO `sys_menu` VALUES (29, '编辑菜单', 'fa fa-fonticons', '/system/menu/update', 'system:menu:update', NULL, 5, 'B', 50, 1, 1, 1, NULL, '2021-12-07 11:34:11', '2021-12-07 19:46:47', NULL);
INSERT INTO `sys_menu` VALUES (30, '修改菜单状态', 'fa fa-fonticons', '/system/menu/changeStatus/{status}', 'system:menu:changeStatus', NULL, 5, 'B', 50, 1, 1, 2, NULL, '2021-12-07 11:34:35', '2022-01-30 16:41:24', NULL);
INSERT INTO `sys_menu` VALUES (31, '删除菜单', 'fa fa-fonticons', '/system/menu/remove', 'system:menu:remove', NULL, 5, 'B', 50, 1, 1, 1, NULL, '2021-12-07 11:34:46', '2022-01-30 17:29:12', NULL);
INSERT INTO `sys_menu` VALUES (32, '操作日志', 'fa fa-sliders', '/system/log/request', 'system:log:request', NULL, 24, 'M', 50, 1, 1, 1, NULL, '2021-12-13 19:07:47', '2021-12-26 16:31:38', NULL);
INSERT INTO `sys_menu` VALUES (33, '第三方组件', 'fa fa-fonticons', '', 'component', NULL, -1, 'N', 50, 1, 1, 1, NULL, '2021-12-23 18:23:07', '2022-01-11 20:46:52', NULL);
INSERT INTO `sys_menu` VALUES (34, '登录日志', 'fa fa-street-view', '/system/log/login', 'system:log:login', NULL, 24, 'M', 50, 1, 1, 1, NULL, '2021-12-26 16:27:13', '2021-12-28 20:21:06', NULL);
INSERT INTO `sys_menu` VALUES (35, '开发管理', 'fa fa-gears', '', 'controller:develop', NULL, 1, 'C', 50, 1, 1, 1, NULL, '2021-12-26 16:28:55', '2021-12-26 16:35:59', NULL);
INSERT INTO `sys_menu` VALUES (36, '代码生成', 'fa fa-file-code-o', '/system/develop/generator', 'system:develop:generator', NULL, 35, 'M', 50, 1, 1, 1, NULL, '2021-12-26 16:37:46', '2021-12-26 16:39:26', NULL);
INSERT INTO `sys_menu` VALUES (37, '接口文档', 'fa fa-external-link-square', '/swagger', 'swagger', NULL, 35, 'M', 50, 1, 1, 1, NULL, '2021-12-26 16:39:13', '2022-01-03 14:00:48', NULL);
INSERT INTO `sys_menu` VALUES (38, '系统监控', 'fa fa-dashboard', '', 'controller:monitor', NULL, 1, 'C', 25, 1, 1, 1, NULL, '2021-12-26 16:52:26', '2021-12-26 16:55:27', NULL);
INSERT INTO `sys_menu` VALUES (39, '服务器监控', 'fa fa-line-chart', '/system/monitor/server', 'system:monitor:server', NULL, 38, 'M', 50, 1, 1, 1, NULL, '2021-12-26 16:54:23', '2022-01-30 17:29:18', NULL);
INSERT INTO `sys_menu` VALUES (40, '数据库监控', 'fa fa-database', '/druid/login.html', 'druid:login.html', NULL, 38, 'M', 50, 1, 1, 1, NULL, '2021-12-26 16:54:47', '2022-01-23 21:24:32', NULL);
INSERT INTO `sys_menu` VALUES (41, '微信支付演示', 'fa fa-wechat', '/component/wechatPay/index', 'component:wechatPay:index', NULL, 33, 'M', 50, 1, 1, 1, NULL, '2022-01-11 20:45:02', '2022-01-12 20:01:22', NULL);
INSERT INTO `sys_menu` VALUES (42, '支付宝支付演示', 'fa fa-cc-paypal', '/component/alipay/index', 'component:alipay:index', NULL, 33, 'M', 50, 1, 1, 1, NULL, '2022-01-11 22:57:18', '2022-01-24 21:36:19', NULL);
INSERT INTO `sys_menu` VALUES (43, '阿里云短信服务', 'fa fa-commenting-o', '/component/aliyunSms/index', 'component:aliyunSms:index', NULL, 33, 'M', 50, 1, 1, 1, NULL, '2022-01-12 16:31:08', '2022-01-24 21:35:56', NULL);
INSERT INTO `sys_menu` VALUES (44, '七牛云文件存储', 'fa fa-file', '/component/qiniuOss/index', 'component:qiniuOss:index', NULL, 33, 'M', 50, 1, 1, 1, NULL, '2022-01-24 21:38:10', '2022-01-24 21:53:54', NULL);
INSERT INTO `sys_menu` VALUES (45, '给用户授权/撤销授权', 'fa fa-fonticons', '/system/role/authUser/{type}', 'system:role:authUser', NULL, 4, 'B', 50, 1, 1, 1, NULL, '2022-01-30 16:36:10', '2022-01-30 16:37:46', NULL);
INSERT INTO `sys_menu` VALUES (46, '删除日志', 'fa fa-fonticons', '/system/log/request/delete', 'system:log:request:delete', NULL, 32, 'B', 0, 1, 1, 1, NULL, '2022-01-30 16:39:00', '2022-01-30 16:53:30', NULL);
INSERT INTO `sys_menu` VALUES (47, '生成指定表的代码', 'fa fa-fonticons', '/system/develop/generator/create', 'system:develop:generator:create', NULL, 36, 'B', 50, 1, 1, 1, NULL, '2022-01-30 16:51:03', NULL, NULL);
INSERT INTO `sys_menu` VALUES (48, '删除日志', 'fa fa-fonticons', '/system/log/login/delete', 'system:log:login:delete', NULL, 34, 'B', 50, 1, 1, 1, NULL, '2022-01-30 16:54:05', NULL, NULL);
-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色ID',
`name` varchar(63) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色名称',
`permission` varchar(63) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色权限标识符,如:admin、guest',
`remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`sort` int(11) NULL DEFAULT NULL COMMENT '排序:数值越大越靠前',
`status` tinyint(4) NULL DEFAULT NULL COMMENT '角色状态:0-封禁 | 1-正常 | 2-正常且禁止封禁',
`is_delete` tinyint(4) NULL DEFAULT NULL COMMENT '是否删除:0-未删除 | 1-已删除',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`delete_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 106 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统角色表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES (100, '超级管理员', 'admin', '超级管理员,禁止禁用和删除!', 100, 2, 0, NULL, '2022-01-30 17:15:50', NULL);
INSERT INTO `sys_role` VALUES (101, '围观角色', 'visit', '演示用户拥有的权限', 50, 1, 0, '2021-09-23 19:36:08', '2022-01-30 17:43:50', NULL);
INSERT INTO `sys_role` VALUES (102, 'test2', 'test2', '', 50, 1, 0, NULL, '2022-01-30 16:47:12', NULL);
INSERT INTO `sys_role` VALUES (103, '系统管理员', 'system', '', 50, 0, 0, '2021-12-04 20:55:13', '2021-12-06 20:23:26', NULL);
INSERT INTO `sys_role` VALUES (104, '系统管理员', 'system', '', 50, 0, 0, '2021-12-04 20:56:45', '2021-12-06 20:19:40', NULL);
INSERT INTO `sys_role` VALUES (105, '测试', '1111', '', 50, 0, 0, '2021-12-08 20:55:59', NULL, NULL);
-- ----------------------------
-- Table structure for sys_role_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE `sys_role_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色菜单关联ID',
`role_id` int(11) NOT NULL COMMENT '角色ID',
`menu_id` int(11) NOT NULL COMMENT '菜单/权限ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 844 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统角色和菜单/权限关联表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_role_menu
-- ----------------------------
INSERT INTO `sys_role_menu` VALUES (89, 104, 24);
INSERT INTO `sys_role_menu` VALUES (90, 103, 1);
INSERT INTO `sys_role_menu` VALUES (91, 103, 2);
INSERT INTO `sys_role_menu` VALUES (92, 103, 4);
INSERT INTO `sys_role_menu` VALUES (93, 103, 17);
INSERT INTO `sys_role_menu` VALUES (94, 103, 18);
INSERT INTO `sys_role_menu` VALUES (95, 103, 19);
INSERT INTO `sys_role_menu` VALUES (96, 103, 20);
INSERT INTO `sys_role_menu` VALUES (97, 103, 21);
INSERT INTO `sys_role_menu` VALUES (98, 103, 22);
INSERT INTO `sys_role_menu` VALUES (99, 103, 23);
INSERT INTO `sys_role_menu` VALUES (720, 100, 1);
INSERT INTO `sys_role_menu` VALUES (721, 100, 2);
INSERT INTO `sys_role_menu` VALUES (722, 100, 3);
INSERT INTO `sys_role_menu` VALUES (724, 100, 6);
INSERT INTO `sys_role_menu` VALUES (725, 100, 7);
INSERT INTO `sys_role_menu` VALUES (726, 100, 8);
INSERT INTO `sys_role_menu` VALUES (727, 100, 9);
INSERT INTO `sys_role_menu` VALUES (728, 100, 10);
INSERT INTO `sys_role_menu` VALUES (729, 100, 11);
INSERT INTO `sys_role_menu` VALUES (730, 100, 12);
INSERT INTO `sys_role_menu` VALUES (731, 100, 13);
INSERT INTO `sys_role_menu` VALUES (732, 100, 14);
INSERT INTO `sys_role_menu` VALUES (733, 100, 16);
INSERT INTO `sys_role_menu` VALUES (734, 100, 4);
INSERT INTO `sys_role_menu` VALUES (735, 100, 45);
INSERT INTO `sys_role_menu` VALUES (736, 100, 17);
INSERT INTO `sys_role_menu` VALUES (737, 100, 18);
INSERT INTO `sys_role_menu` VALUES (738, 100, 19);
INSERT INTO `sys_role_menu` VALUES (739, 100, 20);
INSERT INTO `sys_role_menu` VALUES (740, 100, 21);
INSERT INTO `sys_role_menu` VALUES (741, 100, 22);
INSERT INTO `sys_role_menu` VALUES (742, 100, 23);
INSERT INTO `sys_role_menu` VALUES (743, 100, 5);
INSERT INTO `sys_role_menu` VALUES (744, 100, 27);
INSERT INTO `sys_role_menu` VALUES (745, 100, 28);
INSERT INTO `sys_role_menu` VALUES (746, 100, 29);
INSERT INTO `sys_role_menu` VALUES (747, 100, 30);
INSERT INTO `sys_role_menu` VALUES (748, 100, 31);
INSERT INTO `sys_role_menu` VALUES (749, 100, 26);
INSERT INTO `sys_role_menu` VALUES (750, 100, 25);
INSERT INTO `sys_role_menu` VALUES (751, 100, 35);
INSERT INTO `sys_role_menu` VALUES (752, 100, 36);
INSERT INTO `sys_role_menu` VALUES (753, 100, 47);
INSERT INTO `sys_role_menu` VALUES (754, 100, 37);
INSERT INTO `sys_role_menu` VALUES (755, 100, 24);
INSERT INTO `sys_role_menu` VALUES (756, 100, 32);
INSERT INTO `sys_role_menu` VALUES (757, 100, 46);
INSERT INTO `sys_role_menu` VALUES (758, 100, 34);
INSERT INTO `sys_role_menu` VALUES (759, 100, 48);
INSERT INTO `sys_role_menu` VALUES (760, 100, 38);
INSERT INTO `sys_role_menu` VALUES (761, 100, 39);
INSERT INTO `sys_role_menu` VALUES (762, 100, 40);
INSERT INTO `sys_role_menu` VALUES (763, 100, 33);
INSERT INTO `sys_role_menu` VALUES (764, 100, 41);
INSERT INTO `sys_role_menu` VALUES (765, 100, 42);
INSERT INTO `sys_role_menu` VALUES (818, 101, 1);
INSERT INTO `sys_role_menu` VALUES (819, 101, 2);
INSERT INTO `sys_role_menu` VALUES (820, 101, 3);
INSERT INTO `sys_role_menu` VALUES (821, 101, 6);
INSERT INTO `sys_role_menu` VALUES (822, 101, 7);
INSERT INTO `sys_role_menu` VALUES (823, 101, 9);
INSERT INTO `sys_role_menu` VALUES (824, 101, 12);
INSERT INTO `sys_role_menu` VALUES (825, 101, 4);
INSERT INTO `sys_role_menu` VALUES (826, 101, 17);
INSERT INTO `sys_role_menu` VALUES (827, 101, 18);
INSERT INTO `sys_role_menu` VALUES (828, 101, 20);
INSERT INTO `sys_role_menu` VALUES (829, 101, 5);
INSERT INTO `sys_role_menu` VALUES (830, 101, 28);
INSERT INTO `sys_role_menu` VALUES (831, 101, 25);
INSERT INTO `sys_role_menu` VALUES (832, 101, 26);
INSERT INTO `sys_role_menu` VALUES (833, 101, 35);
INSERT INTO `sys_role_menu` VALUES (834, 101, 36);
INSERT INTO `sys_role_menu` VALUES (835, 101, 24);
INSERT INTO `sys_role_menu` VALUES (836, 101, 32);
INSERT INTO `sys_role_menu` VALUES (837, 101, 34);
INSERT INTO `sys_role_menu` VALUES (838, 101, 38);
INSERT INTO `sys_role_menu` VALUES (839, 101, 39);
INSERT INTO `sys_role_menu` VALUES (840, 101, 40);
INSERT INTO `sys_role_menu` VALUES (841, 101, 33);
INSERT INTO `sys_role_menu` VALUES (842, 101, 41);
INSERT INTO `sys_role_menu` VALUES (843, 101, 42);
-- ----------------------------
-- Table structure for sys_test
-- ----------------------------
DROP TABLE IF EXISTS `sys_test`;
CREATE TABLE `sys_test` (
`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`phone` 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 ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_test
-- ----------------------------
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户主键',
`username` varchar(63) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户姓名',
`avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户头像',
`sex` tinyint(4) NULL DEFAULT NULL COMMENT '用户性别(0-未知 | 1-男 | 2-女)',
`email` varchar(127) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户邮箱',
`phone` varchar(31) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户手机号',
`password` varchar(127) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户密码',
`remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注信息',
`status` tinyint(4) NULL DEFAULT NULL COMMENT '用户状态',
`login_ip` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录IP',
`login_date` datetime NULL DEFAULT NULL COMMENT '登录时间',
`is_delete` tinyint(4) NULL DEFAULT 0 COMMENT '是否删除(0-未删除 | 1-已删除)',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`delete_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10020 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统用户表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (10000, '张三', NULL, 1, '10000@zxdmy.com', '18811111111', 'e10adc3949ba59abbe56e057f20f883e', '超级管理员', 1, NULL, NULL, 0, NULL, '2021-12-30 15:18:34', NULL);
INSERT INTO `sys_user` VALUES (10006, '李四', NULL, 1, 'demo@zxdmy.com', '18866666666', 'e10adc3949ba59abbe56e057f20f883e', '演示用户', 1, NULL, NULL, 0, NULL, '2022-01-30 15:15:13', NULL);
INSERT INTO `sys_user` VALUES (10007, '用户2', NULL, 1, '10007@zxdmy.com', '18877777777', 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (10008, '用户3', NULL, 1, '10008@zxdmy.com', '18888888888', 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, '2022-01-30 16:30:59', NULL);
INSERT INTO `sys_user` VALUES (10009, '用户4', NULL, 1, '10009@zxdmy.com', '18899999999', 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, '2022-01-30 15:23:53', NULL);
INSERT INTO `sys_user` VALUES (10010, '用户5', NULL, 1, '10010@zxdmy.com', '18810101010', 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (10011, '10000@zxdmy.com', NULL, 0, '10011@qq.com', '18811001100', 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, '2021-12-22 21:53:48', '2022-01-30 16:30:33', NULL);
INSERT INTO `sys_user` VALUES (10012, '用户1', NULL, NULL, '10012@zxdmy.com', NULL, 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (10013, '用户2', NULL, NULL, '10013@zxdmy.com', NULL, 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (10014, '用户3', NULL, NULL, '10014@zxdmy.com', NULL, 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, '2021-12-29 11:04:48', NULL);
INSERT INTO `sys_user` VALUES (10015, '用户4', NULL, NULL, '10015@zxdmy.com', NULL, 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (10016, '用户5', NULL, NULL, '10016@zxdmy.com', NULL, 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (10017, '张三', NULL, NULL, '10017@zxdmy.com', NULL, 'e10adc3949ba59abbe56e057f20f883e', NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
INSERT INTO `sys_user` VALUES (10018, '王二麻子', NULL, 1, 'hahah@zxdmy.com', '18811001122', 'e10adc3949ba59abbe56e057f20f883e', '', 0, NULL, NULL, 0, '2021-12-29 10:09:43', '2021-12-29 11:05:31', NULL);
INSERT INTO `sys_user` VALUES (10019, '哈哈哈', NULL, 0, 'hahaaaa@zxdmy.com', '18811001111', 'e10adc3949ba59abbe56e057f20f883e', '', 0, NULL, NULL, 0, '2021-12-29 10:12:55', '2021-12-29 10:36:17', NULL);
-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户角色关联ID',
`user_id` int(11) NOT NULL COMMENT '用户ID',
`role_id` int(11) NOT NULL COMMENT '角色ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统用户和角色关联表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_user_role
-- ----------------------------
INSERT INTO `sys_user_role` VALUES (1, 10000, 100);
INSERT INTO `sys_user_role` VALUES (2, 10000, 101);
INSERT INTO `sys_user_role` VALUES (4, 10006, 101);
INSERT INTO `sys_user_role` VALUES (7, 10018, 101);
INSERT INTO `sys_user_role` VALUES (9, 10011, 101);
INSERT INTO `sys_user_role` VALUES (10, 10006, 102);
SET FOREIGN_KEY_CHECKS = 1;
+904
View File
@@ -0,0 +1,904 @@
|-- undefined
|-- .gitignore
|-- LICENSE
|-- pom.xml
|-- README.md
|-- .idea
| |-- .gitignore
| |-- compiler.xml
| |-- encodings.xml
| |-- jarRepositories.xml
| |-- misc.xml
| |-- runConfigurations.xml
| |-- uiDesigner.xml
| |-- vcs.xml
| |-- workspace.xml
| |-- artifacts
| | |-- shensong_jar.xml
| |-- inspectionProfiles
| |-- Project_Default.xml
|-- database
| |-- db_excite_cms(Only struct).sql
| |-- db_excite_cms(Struct and data).sql
|-- ss-admin
| |-- pom.xml
| |-- README.md
| |-- src
| | |-- main
| | | |-- java
| | | | |-- com
| | | | |-- zxdmy
| | | | |-- excite
| | | | |-- admin
| | | | |-- ExciteAdminApplication.java
| | | | |-- controller
| | | | |-- advanced
| | | | | |-- GeneratorController.java
| | | | | |-- MonitorController.java
| | | | |-- component
| | | | | |-- AlipayController.java
| | | | | |-- QiniuOssController.java
| | | | | |-- WeChatPayController.java
| | | | |-- system
| | | | | |-- SysController.java
| | | | | |-- SysLogController.java
| | | | | |-- SysMenuController.java
| | | | | |-- SysRoleController.java
| | | | | |-- SysUserController.java
| | | | |-- tool
| | | | |-- CaptchaController.java
| | | |-- resources
| | | |-- application.yml
| | | |-- banner.txt
| | | |-- static
| | | | |-- api
| | | | | |-- clear.json
| | | | | |-- init.json
| | | | | |-- menus.json
| | | | | |-- table.json
| | | | | |-- tableSelect.json
| | | | | |-- upload.json
| | | | |-- css
| | | | | |-- layuimini.css
| | | | | |-- login.css
| | | | | |-- public.css
| | | | | |-- login2
| | | | | | |-- admin.css
| | | | | | |-- login2.css
| | | | | |-- themes
| | | | | |-- default.css
| | | | |-- doc
| | | | | |-- AllInOne.css
| | | | | |-- font.css
| | | | | |-- highlight.min.js
| | | | | |-- index.html
| | | | | |-- jquery.min.js
| | | | | |-- xt256.min.css
| | | | |-- images
| | | | | |-- bg-login.jpg
| | | | | |-- bg.jpg
| | | | | |-- captcha.jpg
| | | | | |-- donate_qrcode.png
| | | | | |-- favicon.ico
| | | | | |-- favicon2.ico
| | | | | |-- home.png
| | | | | |-- icon-login.png
| | | | | |-- ic_404.png
| | | | | |-- loginbg.png
| | | | | |-- logo.png
| | | | | |-- logo2.png
| | | | |-- js
| | | | | |-- lay-config.js
| | | | | |-- time.js
| | | | | |-- lay-module
| | | | | |-- dtree
| | | | | | |-- dtree.css
| | | | | | |-- dtree.js
| | | | | | |-- 开发者日志.txt
| | | | | | |-- font
| | | | | | |-- dtreefont.css
| | | | | | |-- dtreefont.eot
| | | | | | |-- dtreefont.svg
| | | | | | |-- dtreefont.ttf
| | | | | | |-- dtreefont.woff
| | | | | | |-- icons.json
| | | | | |-- echarts
| | | | | | |-- echarts.js
| | | | | | |-- echartsTheme.js
| | | | | |-- iconPicker
| | | | | | |-- iconPickerFa.js
| | | | | |-- layarea
| | | | | | |-- layarea.js
| | | | | |-- layuimini
| | | | | | |-- miniAdmin.js
| | | | | | |-- miniMenu.js
| | | | | | |-- miniTab.js
| | | | | | |-- miniTheme.js
| | | | | | |-- miniTongji.js
| | | | | |-- step-lay
| | | | | | |-- step.css
| | | | | | |-- step.js
| | | | | |-- tableSelect
| | | | | | |-- tableSelect.js
| | | | | |-- treetable-lay
| | | | | | |-- treetable.css
| | | | | | |-- treetable.js
| | | | | |-- treetable-lay-3.x
| | | | | | |-- treeTable.css
| | | | | | |-- treeTable.js
| | | | | | |-- treeTable2.js
| | | | | |-- wangEditor
| | | | | |-- wangEditor.css
| | | | | |-- wangEditor.js
| | | | | |-- wangEditor.min.css
| | | | | |-- wangEditor.min.js
| | | | | |-- wangEditor.min.js.map
| | | | | |-- fonts
| | | | | |-- w-e-icon.woff
| | | | |-- lib
| | | | |-- font-awesome-4.7.0
| | | | | |-- HELP-US-OUT.txt
| | | | | |-- css
| | | | | | |-- font-awesome.css
| | | | | | |-- font-awesome.min.css
| | | | | |-- fonts
| | | | | | |-- fontawesome-webfont.eot
| | | | | | |-- fontawesome-webfont.svg
| | | | | | |-- fontawesome-webfont.ttf
| | | | | | |-- fontawesome-webfont.woff
| | | | | | |-- fontawesome-webfont.woff2
| | | | | | |-- FontAwesome.otf
| | | | | |-- less
| | | | | | |-- animated.less
| | | | | | |-- bordered-pulled.less
| | | | | | |-- core.less
| | | | | | |-- fixed-width.less
| | | | | | |-- font-awesome.less
| | | | | | |-- icons.less
| | | | | | |-- larger.less
| | | | | | |-- list.less
| | | | | | |-- mixins.less
| | | | | | |-- path.less
| | | | | | |-- rotated-flipped.less
| | | | | | |-- screen-reader.less
| | | | | | |-- stacked.less
| | | | | | |-- variables.less
| | | | | |-- scss
| | | | | |-- font-awesome.scss
| | | | | |-- _animated.scss
| | | | | |-- _bordered-pulled.scss
| | | | | |-- _core.scss
| | | | | |-- _fixed-width.scss
| | | | | |-- _icons.scss
| | | | | |-- _larger.scss
| | | | | |-- _list.scss
| | | | | |-- _mixins.scss
| | | | | |-- _path.scss
| | | | | |-- _rotated-flipped.scss
| | | | | |-- _screen-reader.scss
| | | | | |-- _stacked.scss
| | | | | |-- _variables.scss
| | | | |-- highlight
| | | | | |-- highlight.min.css
| | | | | |-- highlight.min.js
| | | | |-- jq-module
| | | | | |-- jquery.particleground.min.js
| | | | | |-- paigusu.min.js
| | | | | |-- zyupload
| | | | | |-- zyupload-1.0.0.min.css
| | | | | |-- zyupload-1.0.0.min.js
| | | | |-- jquery-3.4.1
| | | | | |-- jquery-3.4.1.min.js
| | | | |-- jsencrypt
| | | | | |-- jsencrypt.min.js
| | | | | |-- rsa.js
| | | | |-- layui-v2.6.3
| | | | | |-- layui.js
| | | | | |-- css
| | | | | | |-- layui.css
| | | | | | |-- modules
| | | | | | |-- code.css
| | | | | | |-- laydate
| | | | | | | |-- default
| | | | | | | |-- laydate.css
| | | | | | |-- layer
| | | | | | |-- default
| | | | | | |-- icon-ext.png
| | | | | | |-- icon.png
| | | | | | |-- layer.css
| | | | | | |-- loading-0.gif
| | | | | | |-- loading-1.gif
| | | | | | |-- loading-2.gif
| | | | | |-- font
| | | | | |-- iconfont.eot
| | | | | |-- iconfont.svg
| | | | | |-- iconfont.ttf
| | | | | |-- iconfont.woff
| | | | | |-- iconfont.woff2
| | | | |-- qrcode
| | | | |-- qrcode.min.js
| | | |-- templates
| | | |-- component
| | | | |-- alipay
| | | | | |-- index.html
| | | | |-- qiniuOss
| | | | | |-- index.html
| | | | |-- wechatPay
| | | | |-- index.html
| | | |-- error
| | | | |-- 404.html
| | | | |-- 500.html
| | | | |-- error.html
| | | |-- system
| | | |-- index.html
| | | |-- login.html
| | | |-- welcome.html
| | | |-- advanced
| | | | |-- generator.html
| | | | |-- monitorServer.html
| | | |-- log
| | | | |-- login.html
| | | | |-- request.html
| | | |-- menu
| | | | |-- add.html
| | | | |-- edit.html
| | | | |-- index.html
| | | |-- role
| | | | |-- add.html
| | | | |-- authUser.html
| | | | |-- edit.html
| | | | |-- index.html
| | | |-- user
| | | | |-- add.html
| | | | |-- authRole.html
| | | | |-- edit.html
| | | | |-- index.html
| | | |-- userCenter
| | | |-- password.html
| | | |-- setting.html
| | |-- test
| | |-- java
| | |-- com
| | |-- zxdmy
| | |-- excite
| | |-- admin
| | |-- CodeGenerator.java
| | |-- ExciteAdminApplicationTests.java
| | |-- SmartDocGenerator.java
| | |-- component
| | | |-- AlipayTest.java
| | | |-- AliyunSmsTest.java
| | | |-- WeChatPayTest.java
| | |-- service
| | | |-- IGlobalConfigServiceTest.java
| | | |-- ISysMenuServiceTest.java
| | | |-- ISysUserServiceTest.java
| | |-- utils
| | |-- RedisUtilsTest.java
| |-- target
| |-- ss-admin-2.0.0.jar
| |-- ss-admin-2.0.0.jar.original
| |-- classes
| | |-- application.yml
| | |-- banner.txt
| | |-- com
| | | |-- zxdmy
| | | |-- excite
| | | |-- admin
| | | |-- ExciteAdminApplication.class
| | | |-- controller
| | | |-- advanced
| | | | |-- GeneratorController$1.class
| | | | |-- GeneratorController$2.class
| | | | |-- GeneratorController.class
| | | | |-- MonitorController.class
| | | |-- component
| | | | |-- AlipayController.class
| | | | |-- QiniuOssController.class
| | | | |-- WeChatPayController.class
| | | |-- system
| | | | |-- SysController.class
| | | | |-- SysLogController.class
| | | | |-- SysMenuController.class
| | | | |-- SysRoleController.class
| | | | |-- SysUserController.class
| | | |-- tool
| | | |-- CaptchaController.class
| | |-- static
| | | |-- api
| | | | |-- clear.json
| | | | |-- init.json
| | | | |-- menus.json
| | | | |-- table.json
| | | | |-- tableSelect.json
| | | | |-- upload.json
| | | |-- css
| | | | |-- layuimini.css
| | | | |-- login.css
| | | | |-- public.css
| | | | |-- login2
| | | | | |-- admin.css
| | | | | |-- login2.css
| | | | |-- themes
| | | | |-- default.css
| | | |-- doc
| | | | |-- AllInOne.css
| | | | |-- font.css
| | | | |-- highlight.min.js
| | | | |-- index.html
| | | | |-- jquery.min.js
| | | | |-- xt256.min.css
| | | |-- images
| | | | |-- bg-login.jpg
| | | | |-- bg.jpg
| | | | |-- captcha.jpg
| | | | |-- donate_qrcode.png
| | | | |-- favicon.ico
| | | | |-- favicon2.ico
| | | | |-- home.png
| | | | |-- icon-login.png
| | | | |-- ic_404.png
| | | | |-- loginbg.png
| | | | |-- logo.png
| | | | |-- logo2.png
| | | |-- js
| | | | |-- lay-config.js
| | | | |-- time.js
| | | | |-- lay-module
| | | | |-- dtree
| | | | | |-- dtree.css
| | | | | |-- dtree.js
| | | | | |-- 开发者日志.txt
| | | | | |-- font
| | | | | |-- dtreefont.css
| | | | | |-- dtreefont.eot
| | | | | |-- dtreefont.svg
| | | | | |-- dtreefont.ttf
| | | | | |-- dtreefont.woff
| | | | | |-- icons.json
| | | | |-- echarts
| | | | | |-- echarts.js
| | | | | |-- echartsTheme.js
| | | | |-- iconPicker
| | | | | |-- iconPickerFa.js
| | | | |-- layarea
| | | | | |-- layarea.js
| | | | |-- layuimini
| | | | | |-- miniAdmin.js
| | | | | |-- miniMenu.js
| | | | | |-- miniTab.js
| | | | | |-- miniTheme.js
| | | | | |-- miniTongji.js
| | | | |-- step-lay
| | | | | |-- step.css
| | | | | |-- step.js
| | | | |-- tableSelect
| | | | | |-- tableSelect.js
| | | | |-- treetable-lay
| | | | | |-- treetable.css
| | | | | |-- treetable.js
| | | | |-- treetable-lay-3.x
| | | | | |-- treeTable.css
| | | | | |-- treeTable.js
| | | | | |-- treeTable2.js
| | | | |-- wangEditor
| | | | |-- wangEditor.css
| | | | |-- wangEditor.js
| | | | |-- wangEditor.min.css
| | | | |-- wangEditor.min.js
| | | | |-- wangEditor.min.js.map
| | | | |-- fonts
| | | | |-- w-e-icon.woff
| | | |-- lib
| | | |-- font-awesome-4.7.0
| | | | |-- HELP-US-OUT.txt
| | | | |-- css
| | | | | |-- font-awesome.css
| | | | | |-- font-awesome.min.css
| | | | |-- fonts
| | | | | |-- fontawesome-webfont.eot
| | | | | |-- fontawesome-webfont.svg
| | | | | |-- fontawesome-webfont.ttf
| | | | | |-- fontawesome-webfont.woff
| | | | | |-- fontawesome-webfont.woff2
| | | | | |-- FontAwesome.otf
| | | | |-- less
| | | | | |-- animated.less
| | | | | |-- bordered-pulled.less
| | | | | |-- core.less
| | | | | |-- fixed-width.less
| | | | | |-- font-awesome.less
| | | | | |-- icons.less
| | | | | |-- larger.less
| | | | | |-- list.less
| | | | | |-- mixins.less
| | | | | |-- path.less
| | | | | |-- rotated-flipped.less
| | | | | |-- screen-reader.less
| | | | | |-- stacked.less
| | | | | |-- variables.less
| | | | |-- scss
| | | | |-- font-awesome.scss
| | | | |-- _animated.scss
| | | | |-- _bordered-pulled.scss
| | | | |-- _core.scss
| | | | |-- _fixed-width.scss
| | | | |-- _icons.scss
| | | | |-- _larger.scss
| | | | |-- _list.scss
| | | | |-- _mixins.scss
| | | | |-- _path.scss
| | | | |-- _rotated-flipped.scss
| | | | |-- _screen-reader.scss
| | | | |-- _stacked.scss
| | | | |-- _variables.scss
| | | |-- highlight
| | | | |-- highlight.min.css
| | | | |-- highlight.min.js
| | | |-- jq-module
| | | | |-- jquery.particleground.min.js
| | | | |-- paigusu.min.js
| | | | |-- zyupload
| | | | |-- zyupload-1.0.0.min.css
| | | | |-- zyupload-1.0.0.min.js
| | | |-- jquery-3.4.1
| | | | |-- jquery-3.4.1.min.js
| | | |-- jsencrypt
| | | | |-- jsencrypt.min.js
| | | | |-- rsa.js
| | | |-- layui-v2.6.3
| | | | |-- layui.js
| | | | |-- css
| | | | | |-- layui.css
| | | | | |-- modules
| | | | | |-- code.css
| | | | | |-- laydate
| | | | | | |-- default
| | | | | | |-- laydate.css
| | | | | |-- layer
| | | | | |-- default
| | | | | |-- icon-ext.png
| | | | | |-- icon.png
| | | | | |-- layer.css
| | | | | |-- loading-0.gif
| | | | | |-- loading-1.gif
| | | | | |-- loading-2.gif
| | | | |-- font
| | | | |-- iconfont.eot
| | | | |-- iconfont.svg
| | | | |-- iconfont.ttf
| | | | |-- iconfont.woff
| | | | |-- iconfont.woff2
| | | |-- qrcode
| | | |-- qrcode.min.js
| | |-- templates
| | |-- component
| | | |-- alipay
| | | | |-- index.html
| | | |-- qiniuOss
| | | | |-- index.html
| | | |-- wechatPay
| | | |-- index.html
| | |-- error
| | | |-- 404.html
| | | |-- 500.html
| | | |-- error.html
| | |-- system
| | |-- index.html
| | |-- login.html
| | |-- welcome.html
| | |-- advanced
| | | |-- generator.html
| | | |-- monitorServer.html
| | |-- log
| | | |-- login.html
| | | |-- request.html
| | |-- menu
| | | |-- add.html
| | | |-- edit.html
| | | |-- index.html
| | |-- role
| | | |-- add.html
| | | |-- authUser.html
| | | |-- edit.html
| | | |-- index.html
| | |-- user
| | | |-- add.html
| | | |-- authRole.html
| | | |-- edit.html
| | | |-- index.html
| | |-- userCenter
| | |-- password.html
| | |-- setting.html
| |-- generated-sources
| | |-- annotations
| |-- generated-test-sources
| | |-- test-annotations
| |-- maven-archiver
| | |-- pom.properties
| |-- maven-status
| | |-- maven-compiler-plugin
| | |-- compile
| | | |-- default-compile
| | | |-- createdFiles.lst
| | | |-- inputFiles.lst
| | |-- testCompile
| | |-- default-testCompile
| | |-- createdFiles.lst
| | |-- inputFiles.lst
| |-- surefire-reports
| | |-- 2021-12-28T19-22-00_971-jvmRun1.dump
| | |-- com.zxdmy.excite.admin.ExciteAdminApplicationTests.txt
| | |-- com.zxdmy.excite.admin.service.ISysMenuServiceTest.txt
| | |-- com.zxdmy.excite.admin.service.ISysUserServiceTest.txt
| | |-- com.zxdmy.excite.admin.utils.RedisUtilsTest.txt
| | |-- TEST-com.zxdmy.excite.admin.ExciteAdminApplicationTests.xml
| | |-- TEST-com.zxdmy.excite.admin.service.ISysMenuServiceTest.xml
| | |-- TEST-com.zxdmy.excite.admin.service.ISysUserServiceTest.xml
| | |-- TEST-com.zxdmy.excite.admin.utils.RedisUtilsTest.xml
| |-- test-classes
| |-- com
| |-- zxdmy
| |-- excite
| |-- admin
| |-- CodeGenerator$1.class
| |-- CodeGenerator$2.class
| |-- CodeGenerator.class
| |-- ExciteAdminApplicationTests.class
| |-- SmartDocGenerator.class
| |-- component
| | |-- AlipayTest.class
| | |-- AliyunSmsTest.class
| | |-- WeChatPayTest.class
| |-- service
| | |-- IGlobalConfigServiceTest.class
| | |-- ISysMenuServiceTest.class
| | |-- ISysUserServiceTest.class
| |-- utils
| |-- RedisUtilsTest.class
|-- ss-common
| |-- pom.xml
| |-- README.md
| |-- src
| | |-- main
| | |-- java
| | | |-- com
| | | |-- zxdmy
| | | |-- excite
| | | |-- common
| | | |-- base
| | | | |-- BaseController.java
| | | | |-- BaseResult.java
| | | | |-- ErrorController.java
| | | |-- config
| | | | |-- ErrorPageConfig.java
| | | | |-- ExciteConfig.java
| | | | |-- KaptchaConfig.java
| | | | |-- MybatisPlusConfig.java
| | | | |-- RedisConfig.java
| | | | |-- SpringDocConfig.java
| | | |-- entity
| | | | |-- CaptchaDomain.java
| | | | |-- GlobalConfig.java
| | | |-- enums
| | | | |-- ReturnCode.java
| | | | |-- SystemCode.java
| | | |-- exception
| | | | |-- GlobalException.java
| | | | |-- ServiceException.java
| | | |-- mapper
| | | | |-- GlobalConfigMapper.java
| | | |-- service
| | | | |-- CaptchaService.java
| | | | |-- IGlobalConfigService.java
| | | | |-- RedisService.java
| | | | |-- impl
| | | | |-- GlobalConfigServiceImpl.java
| | | |-- utils
| | | |-- ArithUtils.java
| | | |-- DateUtils.java
| | | |-- HttpServletRequestUtil.java
| | | |-- KaptchaMathOneTextCreator.java
| | | |-- KaptchaMathTwoTextCreator.java
| | | |-- MyCaptchaUtil.java
| | |-- resources
| | |-- mapper
| | |-- GlobalConfigMapper.xml
| |-- target
| |-- ss-common-2.0.0.jar
| |-- classes
| | |-- com
| | | |-- zxdmy
| | | |-- excite
| | | |-- common
| | | |-- base
| | | | |-- BaseController.class
| | | | |-- BaseResult.class
| | | | |-- ErrorController.class
| | | |-- config
| | | | |-- ErrorPageConfig.class
| | | | |-- ExciteConfig.class
| | | | |-- KaptchaConfig.class
| | | | |-- MybatisPlusConfig.class
| | | | |-- RedisConfig.class
| | | | |-- SpringDocConfig.class
| | | |-- entity
| | | | |-- CaptchaDomain.class
| | | | |-- GlobalConfig.class
| | | |-- enums
| | | | |-- ReturnCode.class
| | | | |-- SystemCode.class
| | | |-- exception
| | | | |-- GlobalException.class
| | | | |-- ServiceException.class
| | | |-- mapper
| | | | |-- GlobalConfigMapper.class
| | | |-- service
| | | | |-- CaptchaService.class
| | | | |-- IGlobalConfigService.class
| | | | |-- RedisService.class
| | | | |-- impl
| | | | |-- GlobalConfigServiceImpl.class
| | | |-- utils
| | | |-- ArithUtils.class
| | | |-- DateUtils.class
| | | |-- HttpServletRequestUtil.class
| | | |-- KaptchaMathOneTextCreator.class
| | | |-- KaptchaMathTwoTextCreator.class
| | | |-- MyCaptchaUtil.class
| | |-- mapper
| | | |-- GlobalConfigMapper.xml
| | |-- META-INF
| | |-- spring-configuration-metadata.json
| |-- generated-sources
| | |-- annotations
| |-- maven-archiver
| | |-- pom.properties
| |-- maven-status
| |-- maven-compiler-plugin
| |-- compile
| |-- default-compile
| |-- createdFiles.lst
| |-- inputFiles.lst
|-- ss-component
| |-- pom.xml
| |-- src
| | |-- main
| | |-- java
| | |-- com
| | |-- zxdmy
| | |-- excite
| | |-- component
| | |-- alipay
| | | |-- AlipayService.java
| | |-- aliyun
| | | |-- AliyunOssService.java
| | | |-- AliyunSmsService.java
| | |-- bo
| | | |-- AlipayBO.java
| | | |-- AliyunOssBO.java
| | | |-- AliyunSmsBO.java
| | | |-- JustAuthBO.java
| | | |-- QiniuOssBO.java
| | | |-- WeChatPayBO.java
| | |-- justauth
| | | |-- JustAuthService.java
| | |-- qiniu
| | | |-- QiniuOssService.java
| | |-- vo
| | | |-- AliyunOssPolicyVO.java
| | | |-- QiniuFileVO.java
| | |-- wechat
| | |-- WeChatPayService.java
| |-- target
| |-- ss-component-2.0.0.jar
| |-- classes
| | |-- com
| | |-- zxdmy
| | |-- excite
| | |-- component
| | |-- alipay
| | | |-- AlipayService.class
| | |-- aliyun
| | | |-- AliyunOssService.class
| | | |-- AliyunSmsService.class
| | |-- bo
| | | |-- AlipayBO.class
| | | |-- AliyunOssBO.class
| | | |-- AliyunSmsBO.class
| | | |-- JustAuthBO.class
| | | |-- QiniuOssBO.class
| | | |-- WeChatPayBO.class
| | |-- justauth
| | | |-- JustAuthService$1.class
| | | |-- JustAuthService.class
| | |-- qiniu
| | | |-- QiniuOssService.class
| | |-- vo
| | | |-- AliyunOssPolicyVO.class
| | | |-- QiniuFileVO.class
| | |-- wechat
| | |-- WeChatPayService.class
| |-- generated-sources
| | |-- annotations
| |-- maven-archiver
| | |-- pom.properties
| |-- maven-status
| |-- maven-compiler-plugin
| |-- compile
| |-- default-compile
| |-- createdFiles.lst
| |-- inputFiles.lst
|-- ss-framework
| |-- pom.xml
| |-- README.md
| |-- src
| | |-- main
| | |-- java
| | |-- com
| | |-- zxdmy
| | |-- excite
| | |-- framework
| | |-- aop
| | | |-- AnnotationSaveLoginLog.java
| | | |-- AnnotationSaveReLog.java
| | | |-- SaveLogAspect.java
| | |-- config
| | |-- oshi
| | | |-- Server.java
| | | |-- domain
| | | |-- Cpu.java
| | | |-- Jvm.java
| | | |-- Mem.java
| | | |-- Sys.java
| | | |-- SysFile.java
| | |-- satoken
| | |-- SaTokenConfig.java
| | |-- SaTokenListenerConfig.java
| | |-- SaTokenStpInterfaceImpl.java
| |-- target
| |-- ss-framework-2.0.0.jar
| |-- classes
| | |-- com
| | |-- zxdmy
| | |-- excite
| | |-- framework
| | |-- aop
| | | |-- AnnotationSaveLoginLog.class
| | | |-- AnnotationSaveReLog.class
| | | |-- SaveLogAspect.class
| | |-- oshi
| | | |-- Server.class
| | | |-- domain
| | | |-- Cpu.class
| | | |-- Jvm.class
| | | |-- Mem.class
| | | |-- Sys.class
| | | |-- SysFile.class
| | |-- satoken
| | |-- SaTokenConfig.class
| | |-- SaTokenListenerConfig.class
| | |-- SaTokenStpInterfaceImpl.class
| |-- generated-sources
| | |-- annotations
| |-- maven-archiver
| | |-- pom.properties
| |-- maven-status
| |-- maven-compiler-plugin
| |-- compile
| |-- default-compile
| |-- createdFiles.lst
| |-- inputFiles.lst
|-- ss-system
|-- pom.xml
|-- README.md
|-- src
| |-- main
| |-- java
| | |-- com
| | |-- zxdmy
| | |-- excite
| | |-- system
| | |-- entity
| | | |-- SysLogLogin.java
| | | |-- SysLogRequest.java
| | | |-- SysMenu.java
| | | |-- SysRole.java
| | | |-- SysRoleMenu.java
| | | |-- SysUser.java
| | | |-- SysUserRole.java
| | |-- mapper
| | | |-- SysLogLoginMapper.java
| | | |-- SysLogRequestMapper.java
| | | |-- SysMenuMapper.java
| | | |-- SysRoleMapper.java
| | | |-- SysRoleMenuMapper.java
| | | |-- SysUserMapper.java
| | | |-- SysUserRoleMapper.java
| | |-- service
| | | |-- ISysLogLoginService.java
| | | |-- ISysLogRequestService.java
| | | |-- ISysMenuService.java
| | | |-- ISysRoleMenuService.java
| | | |-- ISysRoleService.java
| | | |-- ISysUserRoleService.java
| | | |-- ISysUserService.java
| | | |-- impl
| | | |-- SysLogLoginServiceImpl.java
| | | |-- SysLogRequestServiceImpl.java
| | | |-- SysMenuServiceImpl.java
| | | |-- SysRoleMenuServiceImpl.java
| | | |-- SysRoleServiceImpl.java
| | | |-- SysUserRoleServiceImpl.java
| | | |-- SysUserServiceImpl.java
| | |-- utils
| | |-- AuthUtils.java
| |-- resources
| |-- mapper
| |-- SysLogLoginMapper.xml
| |-- SysLogRequestMapper.xml
| |-- SysMenuMapper.xml
| |-- SysRoleMapper.xml
| |-- SysRoleMenuMapper.xml
| |-- SysUserMapper.xml
| |-- SysUserRoleMapper.xml
|-- target
|-- ss-system-2.0.0.jar
|-- classes
| |-- com
| | |-- zxdmy
| | |-- excite
| | |-- system
| | |-- entity
| | | |-- SysLogLogin.class
| | | |-- SysLogRequest.class
| | | |-- SysMenu.class
| | | |-- SysRole.class
| | | |-- SysRoleMenu.class
| | | |-- SysUser.class
| | | |-- SysUserRole.class
| | |-- mapper
| | | |-- SysLogLoginMapper.class
| | | |-- SysLogRequestMapper.class
| | | |-- SysMenuMapper.class
| | | |-- SysRoleMapper.class
| | | |-- SysRoleMenuMapper.class
| | | |-- SysUserMapper.class
| | | |-- SysUserRoleMapper.class
| | |-- service
| | | |-- ISysLogLoginService.class
| | | |-- ISysLogRequestService.class
| | | |-- ISysMenuService.class
| | | |-- ISysRoleMenuService.class
| | | |-- ISysRoleService.class
| | | |-- ISysUserRoleService.class
| | | |-- ISysUserService.class
| | | |-- impl
| | | |-- SysLogLoginServiceImpl.class
| | | |-- SysLogRequestServiceImpl.class
| | | |-- SysMenuServiceImpl.class
| | | |-- SysRoleMenuServiceImpl.class
| | | |-- SysRoleServiceImpl.class
| | | |-- SysUserRoleServiceImpl.class
| | | |-- SysUserServiceImpl$1.class
| | | |-- SysUserServiceImpl.class
| | |-- utils
| | |-- AuthUtils.class
| |-- mapper
| |-- SysLogLoginMapper.xml
| |-- SysLogRequestMapper.xml
| |-- SysMenuMapper.xml
| |-- SysRoleMapper.xml
| |-- SysRoleMenuMapper.xml
| |-- SysUserMapper.xml
| |-- SysUserRoleMapper.xml
|-- generated-sources
| |-- annotations
|-- maven-archiver
| |-- pom.properties
|-- maven-status
|-- maven-compiler-plugin
|-- compile
|-- default-compile
|-- createdFiles.lst
|-- inputFiles.lst
+198
View File
@@ -0,0 +1,198 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- pom版本标签,指明pom模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- pom父项目标签 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- Spring Boot 的版本-->
<version>2.5.4</version>
<relativePath/>
</parent>
<!-- 公司或组织的ID -->
<groupId>com.zxdmy.excite</groupId>
<!-- 项目ID,本项目的唯一标识-->
<artifactId>shensong</artifactId>
<!-- 项目版本 -->
<version>2.0.0</version>
<!-- 打包方式修改为pom -->
<packaging>pom</packaging>
<!-- 项目名称 -->
<name>Lt-Cloud</name>
<!-- 项目描述 -->
<description>Demo project for Spring Boot</description>
<!-- 加入各个子模块 -->
<modules>
<module>ss-admin</module>
<module>ss-common</module>
<module>ss-component</module>
<module>ss-system</module>
<module>ss-framework</module>
<!-- 如果还有其他,继续增加 -->
<!-- <module>excite-third</module>-->
</modules>
<!-- pom常量,其他位置可以直接引用 -->
<properties>
<shensong.version>2.0.0</shensong.version>
<java.version>1.8</java.version>
</properties>
<!-- 具体依赖声明 -->
<!-- 注意:所有的子模块均会集成父模块的依赖 -->
<!-- 如果所有模块都会用到的依赖,直接添加在父模块中即可 -->
<dependencies>
<!-- Spring Boot web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 如果不设置version,就会父级pom中dependencyManagement找,继承父级的 version 。如果设置了就用自己设置的版本 -->
<!-- <version></version> -->
</dependency>
<!--devtools热部署-->
<!-- https://blog.csdn.net/chachapaofan/article/details/88697452/ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<!-- spring boot validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Druid依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<!-- 数据库连接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
<scope>runtime</scope>
</dependency>
<!-- Mybatis Plus 依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.2</version>
</dependency>
<!-- MyBatis Plus 代码生成器 依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 阿里巴巴 JSON 解析工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!-- JSON工具类 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.7</version>
</dependency>
<!-- OpenApi 接口文档-->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.5.10</version>
</dependency>
<!-- smart-doc 接口文档 -->
<dependency>
<groupId>com.github.shalousun</groupId>
<artifactId>smart-doc</artifactId>
<!-- 只在测试环境中可用 -->
<scope>test</scope>
<version>2.2.6</version>
</dependency>
<!-- configuration-processor -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.28.0</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
</dependency>
<!-- 如果项目不使用Redis,注释掉上面的,改用下面的 -->
<!-- <dependency>-->
<!-- <groupId>cn.dev33</groupId>-->
<!-- <artifactId>sa-token-spring-boot-starter</artifactId>-->
<!-- <version>1.28.0</version>-->
<!-- </dependency>-->
<!-- hutool工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.12</version>
</dependency>
<dependency>
<groupId>com.tennetcn.free</groupId>
<artifactId>think-swagger-ui-starter</artifactId>
<version>0.0.5</version>
</dependency>
</dependencies>
<!-- <build>-->
<!-- <plugins>-->
<!-- <plugin>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- </build>-->
</project>
+3
View File
@@ -0,0 +1,3 @@
# Ss-Admin模块
主模块,项目启动的入口,所有控制类模块,配置文件、资源文件等。
+66
View File
@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 继承的父类信息 -->
<parent>
<groupId>com.zxdmy.excite</groupId>
<artifactId>shensong</artifactId>
<version>2.0.0</version>
</parent>
<artifactId>ss-admin</artifactId>
<version>2.0.0</version>
<name>ss-admin</name>
<description>
这里是本模块的描述.
</description>
<!-- 添加依赖项 -->
<dependencies>
<!-- 这里不仅可以添加官网mvn仓库的依赖,还可以添加其他几项的依赖 -->
<dependency>
<groupId>com.zxdmy.excite</groupId>
<artifactId>ss-framework</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 这里不仅可以添加官网mvn仓库的依赖,还可以添加其他几项的依赖 -->
<dependency>
<groupId>com.zxdmy.excite</groupId>
<artifactId>ss-component</artifactId>
<version>2.0.0</version>
</dependency>
<!-- Spring Boot Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定Main Class为全局唯一入口 -->
<mainClass>com.zxdmy.excite.admin.ExciteAdminApplication</mainClass>
<!-- <layout>ZIP</layout>-->
</configuration>
<executions>
<execution>
<!-- 把依赖的包都打包至生成的jar包中 -->
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,30 @@
package com.zxdmy.excite.admin;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
/**
* 项目启动入口
*
* @author 沈松
*/
@RestController
@SpringBootApplication(scanBasePackages = {
"com.zxdmy.excite",
"com.zxdmy.excite.system.service",
"com.zxdmy.excite.common.service",
})
@MapperScan(basePackages = {
"com.zxdmy.excite.system.mapper",
"com.zxdmy.excite.common.mapper",
})
public class ExciteAdminApplication {
public static void main(String[] args) {
SpringApplication.run(ExciteAdminApplication.class, args);
System.out.println("系统启动成功,访问 http://localhost:8077 ");
}
}
@@ -0,0 +1,225 @@
package com.zxdmy.excite.admin.controller.advanced;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import lombok.AllArgsConstructor;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 描述
* </p>
*
* @author 沈松
* @since 2021/12/29 18:50
*/
@Controller
@AllArgsConstructor
@RequestMapping("/system/develop")
public class GeneratorController extends BaseController {
private DataSourceProperties dataSourceProperties;
/**
* 访问[代码生成]页面
*
* @return 页面跳转
*/
@RequestMapping("generator")
public String generatorIndex() {
return "system/advanced/generator";
}
@GetMapping("/generator/list")
@ResponseBody
public BaseResult getTableList() {
// 获取链接数据库的基本信息,并填入配置类
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig.setUrl(dataSourceProperties.getUrl())//
.setSchemaName("public") //数据库 schema name
.setDbType(DbType.MYSQL)
.setDriverName(dataSourceProperties.getDriverClassName())
.setUsername(dataSourceProperties.getUsername())
.setPassword(dataSourceProperties.getPassword());
// 策略配置(数据库表配置)
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig
.setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略:下划线转驼峰
.setColumnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略:下划线转驼峰
.setEntityLombokModel(true) // 实体是否为lombok模型(默认 false
.setControllerMappingHyphenStyle(true); // 驼峰转连字符
// 获取所有的表
ConfigBuilder configBuilder = new ConfigBuilder(null, dsConfig, strategyConfig, null, null);
List<TableInfo> tableInfos = configBuilder.getTableInfoList();
return success(200, tableInfos);
}
/**
* 生成代码
*
* @param projectPack 项目路径
* @param moduleName 模块名
* @param parentPack 父包名
* @param author 作者
* @param tableName 表名
* @return 结果
*/
@PostMapping("/generator/create")
@ResponseBody
public BaseResult CodeGenerator(String projectPack, String moduleName, String parentPack, String author, String tableName) {
// 代码生成器类
AutoGenerator mpg = new AutoGenerator();
// 项目根目录
String projectPath = System.getProperty("user.dir");
// D:\IdeaProjects\2021_ExciteCMS\ExciteCMS
// 六类文件的保存路径设置,可以根据自己项目的实际情况修改
String entityPath = projectPath + "/ss-" + moduleName + projectPack + moduleName + "/entity/";
String servicePath = projectPath + "/ss-" + moduleName + projectPack + moduleName + "/service/";
String serviceImplPath = projectPath + "/ss-" + moduleName + projectPack + moduleName + "/service/impl/";
String mapperPath = projectPath + "/ss-" + moduleName + projectPack + moduleName + "/mapper";
String mapperXmlPath = projectPath + "/ss-" + moduleName + "/src/main/resources/mapper/";
String controllerPath = projectPath + "/ss-admin/src/main/java/com/zxdmy/excite/admin/controller/" + moduleName + "/";
// 1. 全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig
// 代码生成的目录
// .setOutputDir(projectPath + "/src/main/java")
.setAuthor(author) // 修改项目作者
.setOpen(false) // 是否打开输出目录
.setIdType(IdType.ASSIGN_ID) // 主键策略
.setFileOverride(false) // 是否覆盖已有文件
.setBaseResultMap(true) // 是否开启 BaseResultMapXML文件)
.setBaseColumnList(true); // 是否开启 baseColumnListXML文件)
// .setServiceName("");
//把全局配置添加到代码生成器主类
mpg.setGlobalConfig(globalConfig);
// 2. 数据源配置
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig
// 数据库链接URL
.setUrl(dataSourceProperties.getUrl())
// .setSchemaName("public") //数据库 schema name
.setDbType(DbType.MYSQL) // 数据库类型
.setDriverName(dataSourceProperties.getDriverClassName())
.setUsername(dataSourceProperties.getUsername())
.setPassword(dataSourceProperties.getPassword());
// 把数据源配置添加到代码生成器主类
mpg.setDataSource(dsConfig);
// 3. 包配置
PackageConfig pkConfig = new PackageConfig();
// 添加这个后 会以一个实体为一个模块 比如user实体会生成user模块 每个模块下都会生成三层
// pkConfig.setModuleName(scanner("模块名(系统端建议system,客户端建议client"));
// 父包名。如果为空,将下面子包名必须写写完整的包路径。如果不为空,只需写子包名。
pkConfig.setParent(parentPack)
// 子包名
.setEntity(moduleName + ".entity") // 实体类 Entity包名
.setXml("mapper") // 持久层 Mapper.xml 包名
.setMapper(moduleName + ".mapper") // 持久层 Mapper.java 包名
.setService(moduleName + ".service") // 服务层 Service.java 包名
.setServiceImpl(moduleName + ".service.impl") // 服务层 ServiceImpl.java 包名
.setController("admin.controller." + moduleName); // 控制层 Controller.java 包名
//设置自定义输出目录(分布式项目使用)
Map<String, String> pathInfo = new HashMap<>();
pathInfo.put(ConstVal.ENTITY_PATH, entityPath);
pathInfo.put(ConstVal.MAPPER_PATH, mapperPath);
// pathInfo.put(ConstVal.XML_PATH, mapperXmlPath);
pathInfo.put(ConstVal.SERVICE_PATH, servicePath);
pathInfo.put(ConstVal.SERVICE_IMPL_PATH, serviceImplPath);
pathInfo.put(ConstVal.CONTROLLER_PATH, controllerPath);
pkConfig.setPathInfo(pathInfo);
// 把包配置添加到代码生成器主类
mpg.setPackageInfo(pkConfig);
// 4. 自定义配置【这是MyBatisPlus 3.x 新增的】
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名称,如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return mapperXmlPath + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 5. 策略配置(数据库表配置)
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig
.setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略:下划线转驼峰
.setColumnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略:下划线转驼峰
.setEntityLombokModel(true) // 实体是否为lombok模型(默认 false
// .setSuperEntityClass("com.zxdmy.wx.mp.wechat.common.BaseEntity") // 设置实体类的父类(如果启用,实体类会增加BaseEntity的继承)
.setSuperControllerClass("com.zxdmy.excite.common.base.BaseController") // 设置控制类的父类(如果启用,控制类会增加BaseController的继承)
// 提示输入生成的表名
.setInclude(tableName)
// .setExclude("***") // 需要排除的表名,允许正则表达式
// .setSuperEntityColumns("id"); // 实体类主键名称设置(如果启用,生成的实体类没有此字段)
// .setTablePrefix(pc.getModuleName() + "_") // 表前缀符(如果启用,生成的所有文件名没有此前缀)
.setControllerMappingHyphenStyle(true); // 驼峰转连字符
// 把数据库配置添加到代码生成器主类
mpg.setStrategy(strategyConfig);
// 在代码生成器主类上配置模板引擎,选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
// 开始执行
try {
mpg.execute();
} catch (Exception e) {
return error(e.getMessage());
}
return success("" + tableName + "的代码生成成功!");
}
}
@@ -0,0 +1,41 @@
package com.zxdmy.excite.admin.controller.advanced;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.framework.oshi.Server;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* <p>
* 描述
* </p>
*
* @author 沈松
* @since 2022/1/22 21:18
*/
@Controller
@RequestMapping("/system/monitor")
public class MonitorController extends BaseController {
@RequestMapping("server")
public String goServerMonitor() {
return "system/advanced/monitorServer";
}
@PostMapping("/server")
@ResponseBody
public BaseResult serverMonitor() {
Server server = new Server();
try {
server.copyTo();
return success("获取服务器信息成功!", server);
} catch (Exception e) {
return error("获取服务器信息失败!");
}
}
}
@@ -0,0 +1,237 @@
package com.zxdmy.excite.admin.controller.cloud.account;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.cloud.account.CloudCompany;
import com.zxdmy.excite.system.entity.cloud.account.CloudDepartment;
import com.zxdmy.excite.system.entity.dto.DepartmentTreeDTO;
import com.zxdmy.excite.system.entity.dto.DepartmentUserTreeNode;
import com.zxdmy.excite.system.entity.req.account.ReqDepartment;
import com.zxdmy.excite.system.entity.vo.account.DepartmentVo;
import com.zxdmy.excite.system.service.cloud.account.ICloudCompanyService;
import com.zxdmy.excite.system.service.cloud.account.ICloudDepartmentService;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/account/department/")
public class AccountDepartmentController extends BaseController {
private ICloudDepartmentService iCloudDepartmentService;
private ICloudCompanyService iCloudCompanyService;
@RequestMapping("index")
public String index() {
return "cloud/account/department/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqDepartment data) {
try {
PageList<DepartmentVo> dataPage = iCloudDepartmentService.queryByPage(page, limit, data);
return success("获取数据成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("add")
public String add() {
return "cloud/account/department/add";
}
@PostMapping("/addSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult addSave(@Validated ReqDepartment data) {
try {
if(null == iCloudDepartmentService.getByData(data)){
if(iCloudDepartmentService.saveData(data)==1){
return success("操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("edit/{id}")
public String edit(@PathVariable String id, ModelMap map) {
CloudDepartment data = iCloudDepartmentService.getById(id);
// 加载至前端
if (data == null) {
map.put("code", 404);
map.put("msg", "数据不存在!");
return "error/error";
}
map.put("id", id);
return "cloud/account/department/edit";
}
@GetMapping("/getData")
@ResponseBody
public BaseResult getData(ReqDepartment req) {
try {
DepartmentVo data = iCloudDepartmentService.getByData(req);
if(null!=data){
return success("获取数据成功",data);
}else{
return error(400, "数据不存在!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/editSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult editSave(@Validated ReqDepartment data) {
try {
if(null == iCloudDepartmentService.getByData(data)){
if(iCloudDepartmentService.updateData(data)==1){
return success(200,"操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/delete")
@ResponseBody
@AnnotationSaveReLog
public BaseResult delete(String id) {
try {
int result = iCloudDepartmentService.deleteById(id);
if (result == 1) {
return success(200, "删除成功!");
}else{
return error("删除失败!");
}
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
@GetMapping("/query")
@ResponseBody
public BaseResult query() {
try {
List<DepartmentTreeDTO> data = new ArrayList<>();
List<CloudCompany> company = iCloudCompanyService.getList();
for (CloudCompany cloudCompany :company) {
DepartmentTreeDTO departmentTreeDTO = new DepartmentTreeDTO();
departmentTreeDTO.setId(cloudCompany.getId());
departmentTreeDTO.setTitle(cloudCompany.getCompanyName());
departmentTreeDTO.setSpread(true);
List<CloudDepartment> dataPage = iCloudDepartmentService.getList(cloudCompany.getId());
List<DepartmentTreeDTO> department = buildDepartmentTree(dataPage);
departmentTreeDTO.setChildren(department);
data.add(departmentTreeDTO);
}
return success(200, "获取数据成功!",data);
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@GetMapping("/query1")
@ResponseBody
public BaseResult query1() {
try {
List<DepartmentUserTreeNode> data = new ArrayList<>();
List<CloudCompany> company = iCloudCompanyService.getList();
for (CloudCompany cloudCompany :company) {
CloudDepartment cloudDepartment = new CloudDepartment();
cloudDepartment.setId(cloudCompany.getId());
cloudDepartment.setDepartmentName(cloudCompany.getCompanyName());
DepartmentUserTreeNode departmentTreeDTO = new DepartmentUserTreeNode(cloudDepartment);
List<DepartmentUserTreeNode> tree = iCloudDepartmentService.buildDepartmentUserTree(cloudCompany.getId());
departmentTreeDTO.setChildren(tree);
data.add(departmentTreeDTO);
System.out.println(tree);
}
return success(200, "获取数据成功!",data);
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
public List<DepartmentTreeDTO> buildDepartmentTree(List<CloudDepartment> departments) {
// 1. 按parentId分组
Map<Long, List<DepartmentTreeDTO>> parentMap = new HashMap<>();
// 2. 创建所有节点的映射
Map<Long, DepartmentTreeDTO> nodeMap = new HashMap<>();
// 3. 转换并分组
for (CloudDepartment dept : departments) {
DepartmentTreeDTO node = new DepartmentTreeDTO();
BeanUtils.copyProperties(dept, node);
node.setChildren(new ArrayList<>());
nodeMap.put(dept.getId(), node);
Long parentId = dept.getDepartmentParentId();
if (parentId == null) {
parentId = 0L; // 将null转换为0,作为根节点的父ID
}
parentMap.computeIfAbsent(parentId, k -> new ArrayList<>())
.add(node);
}
// 4. 构建树形结构
List<DepartmentTreeDTO> rootList = parentMap.getOrDefault(0L, new ArrayList<>());
// 5. 递归构建子节点
for (Long parentId : parentMap.keySet()) {
if (parentId.equals(0L)) continue;
DepartmentTreeDTO parentNode = nodeMap.get(parentId);
if (parentNode != null) {
parentNode.setChildren(parentMap.get(parentId));
}
}
// 6. 排序(按department_sort
sortTreeNodes(rootList);
return rootList;
}
private void sortTreeNodes(List<DepartmentTreeDTO> nodes) {
if (nodes == null || nodes.isEmpty()) return;
// 按排序字段排序
nodes.sort(Comparator.comparing(DepartmentTreeDTO::getDepartmentSort));
// 递归排序子节点
for (DepartmentTreeDTO node : nodes) {
if (node.getChildren() != null && !node.getChildren().isEmpty()) {
sortTreeNodes(node.getChildren());
}
}
}
}
@@ -0,0 +1,144 @@
package com.zxdmy.excite.admin.controller.cloud.account;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.cloud.account.CloudCompany;
import com.zxdmy.excite.system.entity.req.account.ReqCompany;
import com.zxdmy.excite.system.entity.vo.account.CompanyVo;
import com.zxdmy.excite.system.service.cloud.account.ICloudCompanyService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/account/company")
public class AccountEnterpriseController extends BaseController {
private ICloudCompanyService iCloudCompanyService;
@RequestMapping("index")
public String index() {
return "cloud/account/enterprise/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqCompany data) {
try {
PageList<CompanyVo> dataPage = iCloudCompanyService.queryByPage(page, limit, data);
return success("获取数据成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("add")
public String add() {
return "cloud/account/enterprise/add";
}
@PostMapping("/addSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult addSave(@Validated ReqCompany data) {
try {
if(null == iCloudCompanyService.getByData(data)){
if(iCloudCompanyService.saveData(data)==1){
return success("操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("edit/{id}")
public String edit(@PathVariable String id, ModelMap map) {
CloudCompany data = iCloudCompanyService.getById(id);
// 加载至前端
if (data == null) {
map.put("code", 404);
map.put("msg", "数据不存在!");
return "error/error";
}
map.put("id", id);
return "cloud/account/enterprise/edit";
}
@GetMapping("/getData")
@ResponseBody
public BaseResult getData(String id) {
try {
CloudCompany data = iCloudCompanyService.getById(id);
if(null!=data){
return success("获取数据成功",data);
}else{
return error(400, "数据不存在!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/editSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult editSave(@Validated ReqCompany data) {
try {
if(null == iCloudCompanyService.getByData(data)){
if(iCloudCompanyService.updateData(data)==1){
return success(200,"操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/delete")
@ResponseBody
@AnnotationSaveReLog
public BaseResult delete(String id) {
try {
int result = iCloudCompanyService.deleteById(id);
if (result == 1) {
return success(200, "删除成功!");
}else{
return error("删除失败!");
}
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
@GetMapping("/query")
@ResponseBody
public BaseResult query() {
try {
List<CompanyVo> dataPage = iCloudCompanyService.queryByData();
return success("获取数据成功", dataPage);
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,340 @@
package com.zxdmy.excite.admin.controller.cloud.account;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.config.ExciteConfig;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.common.enums.SystemCode;
import com.zxdmy.excite.framework.aop.AnnotationSaveLoginLog;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.SysUser;
import com.zxdmy.excite.system.entity.cloud.account.CloudCompany;
import com.zxdmy.excite.system.entity.cloud.account.CloudDepartment;
import com.zxdmy.excite.system.entity.dto.DepartmentTreeDTO;
import com.zxdmy.excite.system.entity.req.account.ReqDepartment;
import com.zxdmy.excite.system.entity.vo.account.DepartmentVo;
import com.zxdmy.excite.system.service.ISysUserService;
import com.zxdmy.excite.system.service.cloud.account.ICloudCompanyService;
import com.zxdmy.excite.system.service.cloud.account.ICloudDepartmentService;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.*;
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/account/user/")
public class AccountUserController extends BaseController {
private ICloudDepartmentService iCloudDepartmentService;
private ICloudCompanyService iCloudCompanyService;
private ISysUserService userService;
private ExciteConfig exciteConfig;
@RequestMapping("index")
public String index() {
return "cloud/account/user/index";
}
@RequestMapping("goAdd/{id}")
public String goAdd(@PathVariable String id,ModelMap map) {
map.put("id", id);
return "cloud/account/user/add";
}
@RequestMapping("goEdit/{id}")
public String goEdit(@PathVariable String id, ModelMap map) {
// 获取该用户的信息
SysUser user = userService.getById(id);
// 加载至前端
if (user == null) {
map.put("code", 404);
map.put("msg", "用户不存在!");
return "error/error";
}
map.put("user", user);
return "cloud/account/user/edit";
}
@RequestMapping("goAuthDepartment/{id}")
public String goAuthDepartment(@PathVariable String id, ModelMap map) {
// 获取该用户的信息
SysUser user = userService.getById(id);
// 加载至前端
if (user == null) {
map.put("code", 404);
map.put("msg", "用户不存在!");
return "error/error";
}
map.put("user", user);
return "cloud/account/user/editDepartment";
}
@RequestMapping("selectDepartment")
public String selectDepartment() {
return "cloud/account/user/selectDepartment";
}
@RequestMapping("updateDepartment/{id}")
public String selectDepartment(@PathVariable String id, ModelMap map) {
map.put("id", id);
return "cloud/account/user/updateDepartment";
}
@PostMapping(value = "/changeDepartment")
@ResponseBody
public BaseResult changeDepartment(String userId, String departmentId) {
try {
if (iCloudDepartmentService.changeDepartment(userId, departmentId)==1) {
return success(200, "转换成功!");
}
return success("转换失败,请重试!");
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
/**
* 接口功能:获取用户列表
*
* @param page 当前页面
* @param limit 每页请求数
* @param username 检索用户名
* @param account 检索电话或邮箱
* @return JSON:用户列表 | 错误信息
*/
@GetMapping(value = "/list")
@ResponseBody
public BaseResult getUserList(Integer page, Integer limit, String username, String account,String departmentId) {
Page<SysUser> userPage = userService.getPage(page, limit, username, account);
if (null != userPage) {
return success("查询成功", userPage.getRecords(), (int) userPage.getTotal());
} else {
return error("查询失败,用户不存在");
}
}
@GetMapping(value = "/getPageList")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, String username, String phone,String departmentId) {
PageList<SysUser> dataPage = userService.queryByPage(page, limit, username,phone,departmentId);
if (null != dataPage) {
return success("查询成功", dataPage.getList(), (int) dataPage.getTotal());
} else {
return error("查询失败,用户不存在");
}
}
/**
* 接口功能:添加用户
* 基本逻辑:接收前端的用户信息-->校验与初始化新用户信息-->添加至[用户表]-->获取新添加用户的ID-->用户ID与角色ID添加至[用户角色关联表].
*
* @param user 用户信息
* @param roleIds 用户分配的角色信息
* @return JSON:成败结果
* @apiNote 启用注解[@AnnotationSaveReLog]保存请求日志
*/
@PostMapping(value = "/add")
@ResponseBody
@AnnotationSaveReLog
public BaseResult add(SysUser user, Integer[] roleIds,String[] roleIds1,String departmentId) {
// 新建用户:其邮箱或手机号、密码不能为空,因为这是登录凭证.
if (null != user && null != user.getPassword() && (null != user.getLoginName() || null != user.getPhone())) {
// 解密
user.setPassword(SecureUtil.md5(this.decrypt(user.getPassword())));
// 添加
if (userService.saveData(user, roleIds,roleIds1,departmentId) > 0) {
return success("新用户添加成功!");
} else {
return error("新用户添加失败,请重试!");
}
}
return error("用户信息(账号或手机号、密码)不能为空,请重试!");
}
/**
* 接口功能:更新用户基本信息(不含角色信息)
*
* @param user 用户信息
* @return JSON:成败结果
* @apiNote 启用注解[@AnnotationSaveReLog]保存请求日志
*/
@PostMapping(value = "/update")
@ResponseBody
@AnnotationSaveReLog
public BaseResult update(SysUser user) {
// 编辑用户基本信息:用户名、头像、性别、邮箱和手机号。
if (null != user && null != user.getId()) {
// 其他信息(状态、密码)不能通过此接口修改,故其应为null.
if (null == user.getStatus() && null == user.getPassword()) {
if (userService.save(user, null) > 0) {
return success("用户信息编辑成功!");
} else {
return error("用户信息编辑失败,请重试!");
}
} else {
return error("接口请求信息错误!");
}
} else {
return error("用户信息不能为空,请重试!");
}
}
/**
* 接口功能:删除用户
* 基本逻辑:删除该用户的角色信息[用户-角色关联表]-->删除用户
*
* @param userIds 用户ID列表
* @return JSON:成败
* @apiNote 启用注解[@AnnotationSaveReLog]保存请求日志
*/
@PostMapping(value = "/delete")
@ResponseBody
@AnnotationSaveReLog
public BaseResult delete(Integer[] userIds) {
try {
if (userService.deleteUserById(userIds)[0] > 0) {
return success("用户删除成功");
}
return error("用户删除失败");
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
/**
* 接口功能:给指定用户分配角色
*
* @param id 用户ID
* @param roleIds 角色信息列表
* @return 分配结果
*/
@PostMapping(value = "/authRole")
@ResponseBody
public BaseResult setRole(Long id, String[] roleIds) {
try {
if (userService.setCloudRoleForUser(String.valueOf(id), roleIds)) {
return success(200, "分配角色成功!");
}
return success("分配角色失败,请重试!");
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
/**
* 接口功能:改变用户的状态
*
* @param status 新状态:1-正常 0-禁用
* @param userIds 用户ID列表
* @return 修改结果
*/
@PostMapping(value = "/changeStatus/{status}")
@ResponseBody
public BaseResult changeStatus(@PathVariable String status, Integer[] userIds) {
try {
int[] result = userService.changeStatus(Integer.parseInt(status), userIds);
// 没有失败
if (result[0] != 0 && result[1] == 0) {
return success(200, "用户状态修改成功!");
}
// 有成功的
else if (result[0] != 0) {
return success(200, result[0] + "个角色状态更新成功," + result[1] + "个失败!");
} else {
return success(500, "用户状态修改失败,请重试!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
/**
* 接口功能:重置密码
*
* @param userId 用户ID
* @param newPassword 新密码
* @param newPassword2 新密码
* @return 重置结果
*/
@PostMapping(value = "/resetPassword")
@ResponseBody
@AnnotationSaveReLog
public BaseResult resetPassword(String userId, String newPassword, String newPassword2) {
if (null == userId || null == newPassword || null == newPassword2) {
return error("输入信息有误,请重新输入!");
}
// 密码先解密
newPassword = this.decrypt(newPassword);
newPassword2 = this.decrypt(newPassword2);
// 密码相同
if (newPassword.equals(newPassword2)) {
SysUser user = new SysUser();
try {
user.setId(Integer.parseInt(userId));
// 密码MD5加密
user.setPassword(SecureUtil.md5(newPassword));
if (userService.save(user, null) > 0) {
return success("密码重置成功!");
} else {
error("密码重置失败,请重试!");
}
} catch (Exception e) {
return error(e.getMessage());
}
}
return error("密码重置失败,新密码不一致!");
}
/**
* 接口功能:获取指定角色所分配的用户列表(拥有/不拥有此角色)
*
* @param roleId 角色ID
* @param have 是否用于此角色:0-不拥有 | 1-拥有
* @return 用户列表
*/
@GetMapping("/listForRole/{have}/{roleId}")
@ResponseBody
public BaseResult getUserListForRole(@PathVariable("have") String have, @PathVariable("roleId") Long roleId) {
try {
// 拥有 此角色
List<SysUser> userList;
if (have.equals("1")) {
userList = userService.selectUsersByCloudUploadRoleId(String.valueOf(roleId));
}
// 不拥有 此角色
else {
userList = userService.selectUsersByCloudUploadRoleIdNotIn(String.valueOf(roleId));
}
return success(200, "获取成功", userList);
} catch (Exception e) {
return error(e.getMessage());
}
}
/**
* 私有方法:解密密码
*
* @param encrypt 加密密码
* @return 解密密码
*/
private String decrypt(String encrypt) {
// 根据私钥生成新的对象
RSA rsa = new RSA(exciteConfig.getRsaPrivateKey(), null);
byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey);
return StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);
}
}
@@ -0,0 +1,91 @@
package com.zxdmy.excite.admin.controller.cloud.collect;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.cloud.account.CloudCompany;
import com.zxdmy.excite.system.entity.cloud.space.CloudFile;
import com.zxdmy.excite.system.entity.req.account.ReqCompany;
import com.zxdmy.excite.system.entity.req.collection.ReqCloudUserCollection;
import com.zxdmy.excite.system.entity.vo.space.CloudFileVo;
import com.zxdmy.excite.system.service.cloud.collection.ICloudUserCollectionService;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 系统菜单/权限表 前端控制器
*
* @author 沈松
* @since 2021-09-12
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/collect/")
public class CollectController extends BaseController {
private ICloudUserCollectionService iCloudUserCollectionService;
/**
* @return 页面:【菜单管理】页面入口
*/
@RequestMapping("index")
public String index() {
return "cloud/collect/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqCloudUserCollection data) {
try {
data.setUserId(StpUtil.getLoginIdAsInt());
PageList<CloudFileVo> dataPage = iCloudUserCollectionService.queryByPage(page, limit, data);
return success("获取列表成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/collection")
@ResponseBody
@AnnotationSaveReLog
public BaseResult collection(@Validated ReqCloudUserCollection data) {
try {
data.setUserId(StpUtil.getLoginIdAsInt());
if(null == iCloudUserCollectionService.getByData(data)){
if(iCloudUserCollectionService.saveData(data)==1){
return success("操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/removeCollection")
@ResponseBody
@AnnotationSaveReLog
public BaseResult removeCollection(String id) {
try {
if(iCloudUserCollectionService.deleteById(id)==1){
return success("操作成功");
}else{
return error(400, "操作失败,系统错误");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,76 @@
package com.zxdmy.excite.admin.controller.cloud.lately;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.req.collection.ReqCloudUserCollection;
import com.zxdmy.excite.system.entity.req.lately.ReqCloudUserLately;
import com.zxdmy.excite.system.entity.vo.space.CloudFileVo;
import com.zxdmy.excite.system.service.cloud.collection.ICloudUserCollectionService;
import com.zxdmy.excite.system.service.cloud.lately.ICloudUserLatelyService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* <p>
* 最近文件表 前端控制器
* </p>
*
* @author 沈松
* @since 2026-01-29
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/lately")
public class CloudUserLatelyController extends BaseController {
private ICloudUserLatelyService iCloudUserLatelyService;
@RequestMapping("index")
public String index() {
return "cloud/lately/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqCloudUserLately data) {
try {
data.setUserId(StpUtil.getLoginIdAsInt());
PageList<CloudFileVo> dataPage = iCloudUserLatelyService.queryByPage(page, limit, data);
return success("获取列表成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/addSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult addSave(@Validated ReqCloudUserLately data) {
try {
data.setUserId(StpUtil.getLoginIdAsInt());
if(null == iCloudUserLatelyService.getByData(data)){
if(iCloudUserLatelyService.saveData(data)==1){
return success("操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,60 @@
package com.zxdmy.excite.admin.controller.cloud.my;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.system.entity.cloud.role.CloudRole;
import com.zxdmy.excite.system.entity.cloud.space.CloudFile;
import com.zxdmy.excite.system.entity.req.space.ReqCloudFile;
import com.zxdmy.excite.system.entity.vo.space.CloudFileVo;
import com.zxdmy.excite.system.service.cloud.role.ICloudRoleService;
import com.zxdmy.excite.system.service.cloud.role.ICloudRoleUserService;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileService;
import lombok.AllArgsConstructor;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* <p>
* 文件表 前端控制器
* </p>
*
* @author ss
* @since 2026-01-28
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/my")
public class CloudMyFileController extends BaseController {
private ICloudFileService iCloudFileService;
private ICloudRoleUserService iCloudRoleUserService;
private ICloudRoleService iCloudRoleService;
@RequestMapping("index")
public String index() {
return "cloud/my/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqCloudFile data) {
try {
data.setCreatorId(StpUtil.getLoginIdAsInt());
data.setFileFolder(1);
PageList<CloudFileVo> dataPage = iCloudFileService.queryByPage(page, limit, data);
return success("获取数据成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,85 @@
package com.zxdmy.excite.admin.controller.cloud.recycle;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.req.space.ReqCloudFile;
import com.zxdmy.excite.system.entity.vo.space.CloudFileVo;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* <p>
* 文件表 前端控制器
* </p>
*
* @author ss
* @since 2026-01-28
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/myRecycle")
public class CloudMyRecycleController extends BaseController {
private ICloudFileService iCloudFileService;
@RequestMapping("index")
public String index() {
return "cloud/recycle/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqCloudFile data) {
try {
data.setCreatorId(StpUtil.getLoginIdAsInt());
PageList<CloudFileVo> dataPage = iCloudFileService.queryByRecyclePage(page, limit, data);
return success("获取数据成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/recover")
@ResponseBody
public BaseResult recover(String id) {
try {
int result = iCloudFileService.recover(id);
if (result == 1) {
return success(200, "恢复成功!");
}else{
return error("恢复失败!");
}
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
@PostMapping("/foreverDelete")
@ResponseBody
@AnnotationSaveReLog
public BaseResult foreverDelete(String id) {
try {
int result = iCloudFileService.deleteById(id);
if (result == 1) {
return success(200, "删除成功!");
}else{
return error("删除失败!");
}
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,286 @@
package com.zxdmy.excite.admin.controller.cloud.role;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.SysRole;
import com.zxdmy.excite.system.entity.cloud.role.CloudRole;
import com.zxdmy.excite.system.entity.dto.RoleTreeDTO;
import com.zxdmy.excite.system.entity.req.role.ReqRole;
import com.zxdmy.excite.system.entity.vo.role.RoleVo;
import com.zxdmy.excite.system.service.ISysUserService;
import com.zxdmy.excite.system.service.cloud.role.ICloudRoleService;
import com.zxdmy.excite.system.service.cloud.role.ICloudRoleUserService;
import lombok.AllArgsConstructor;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;
import com.zxdmy.excite.common.base.BaseController;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 云盘权限表 前端控制器
* </p>
*
* @author ss
* @since 2026-01-27
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/role/")
public class CloudRoleController extends BaseController {
private ICloudRoleService iCloudRoleService;
private ISysUserService iSysUserService;
private ICloudRoleUserService iCloudRoleUserService;
@RequestMapping("index")
public String index() {
return "cloud/role/role/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getRoleList(Integer page, Integer limit, ReqRole data) {
try {
PageList<RoleVo> dataPage = iCloudRoleService.queryByPage(page, limit, data);
return success("获取数据成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("add")
public String add() {
return "cloud/role/role/add";
}
@PostMapping("/addSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult addSave(@Validated ReqRole data) {
try {
if(null == iCloudRoleService.getByData(data)){
if(iCloudRoleService.saveData(data)==1){
return success("操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("edit/{id}")
public String edit(@PathVariable String id, ModelMap map) {
CloudRole data = iCloudRoleService.getById(id);
// 加载至前端
if (data == null) {
map.put("code", 404);
map.put("msg", "数据不存在!");
return "error/error";
}
map.put("id", id);
return "cloud/role/role/edit";
}
@GetMapping("/getData")
@ResponseBody
public BaseResult getData(String id) {
try {
CloudRole data = iCloudRoleService.getById(id);
if(null!=data){
return success("获取数据成功",data);
}else{
return error(400, "数据不存在!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/editSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult editSave(@Validated ReqRole data) {
try {
RoleVo roleVo =iCloudRoleService.getByData(data);
CloudRole cloudRole = iCloudRoleService.getById(data.getId());
if(roleVo==null){
if(iCloudRoleService.updateData(data)==1){
return success(200,"操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
if(cloudRole.getRoleName().equals(roleVo.getRoleName())){
if(iCloudRoleService.updateData(data)==1){
return success(200,"操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/delete")
@ResponseBody
@AnnotationSaveReLog
public BaseResult delete(String id) {
try {
int result = iCloudRoleService.deleteById(id);
if (result == 1) {
return success(200, "删除成功!");
}else{
return error("删除失败!");
}
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
@PostMapping(value = "/changeUploadStatus/{status}")
@ResponseBody
public BaseResult changeUploadStatus(@PathVariable String status, String[] ids) {
try {
int[] result = iCloudRoleService.changeUploadStatus(Integer.parseInt(status), ids);
// 没有失败
if (result[0] != 0 && result[1] == 0) {
return success(200, "修改成功!");
}
// 有成功的
else if (result[0] != 0) {
return success(200, result[0] + "个更新成功," + result[1] + "个失败!");
} else {
return success(500, "修改失败,请重试!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping(value = "/changeDownStatus/{status}")
@ResponseBody
public BaseResult changeDownStatus(@PathVariable String status, String[] ids) {
try {
int[] result = iCloudRoleService.changeDownStatus(Integer.parseInt(status), ids);
// 没有失败
if (result[0] != 0 && result[1] == 0) {
return success(200, "修改成功!");
}
// 有成功的
else if (result[0] != 0) {
return success(200, result[0] + "个更新成功," + result[1] + "个失败!");
} else {
return success(500, "修改失败,请重试!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping(value = "/changeDeleteStatus/{status}")
@ResponseBody
public BaseResult changeDeleteStatus(@PathVariable String status, String[] ids) {
try {
int[] result = iCloudRoleService.changeDeleteStatus(Integer.parseInt(status), ids);
// 没有失败
if (result[0] != 0 && result[1] == 0) {
return success(200, "修改成功!");
}
// 有成功的
else if (result[0] != 0) {
return success(200, result[0] + "个更新成功," + result[1] + "个失败!");
} else {
return success(500, "修改失败,请重试!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("goShowUser/{id}")
public String goShowUser(@PathVariable String id, ModelMap map) {
try {
CloudRole role = iCloudRoleService.getById(id);
if (null == role) {
map.put("code", 500);
map.put("msg", "可能原因:该角色禁止编辑,该角色已被禁用!");
return "error/error";
} else {
RoleVo roleVo = new RoleVo();
BeanUtils.copyProperties(roleVo, role);
map.put("role", roleVo);
return "cloud/role/role/authUser";
}
} catch (Exception e) {
// 发生异常,一般就是数字转换出错
System.err.println(e.getMessage());
return "error/500";
}
}
@PostMapping("/authUser/{type}")
@ResponseBody
@AnnotationSaveReLog
public BaseResult authForUser(@PathVariable("type") String type, String roleId, String[] userIds) {
try {
// 添加授权
if (type.equals("auth")) {
if (iCloudRoleService.authRoleForUsers(roleId, userIds))
return success(200, "添加授权成功!");
else
return error("授权失败,请重试!");
}
// 取消授权
else if (type.equals("revoke")) {
int[] result = iCloudRoleService.revokeRoleForUsers(roleId, userIds);
if (result[1] == 0)
return success(200, "取消授权成功!");
else if (result[0] == 0)
return error("取消授权失败,请重试!");
else
return success(result[0] + "个用户取消授权成功," + result[1] + "个失败!");
}
return error("访问错误!");
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
@GetMapping("/listForUser/{userId}")
@ResponseBody
public BaseResult getRoleListForUser(@PathVariable String userId) {
try {
List<RoleTreeDTO> list = new ArrayList<>();
List<CloudRole> roleList = iCloudRoleService.getListByUserId(Integer.parseInt(userId));
for (CloudRole cloudRole:roleList) {
RoleTreeDTO roleTreeDTO = new RoleTreeDTO();
roleTreeDTO.setId(cloudRole.getId());
roleTreeDTO.setName(cloudRole.getRoleName());
list.add(roleTreeDTO);
}
return success("获取角色列表成功", list, list.size());
} catch (Exception e) {
return error(500, "error:" + e.getMessage());
}
}
}
@@ -0,0 +1,42 @@
package com.zxdmy.excite.admin.controller.cloud.role;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.system.entity.cloud.role.CloudRole;
import com.zxdmy.excite.system.service.ISysUserService;
import com.zxdmy.excite.system.service.cloud.role.ICloudRoleUserService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import com.zxdmy.excite.common.base.BaseController;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* <p>
* 云盘权限用户表 前端控制器
* </p>
*
* @author ss
* @since 2026-01-27
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/roleUser")
public class CloudRoleUserController extends BaseController {
private ICloudRoleUserService iCloudRoleUserService;
@GetMapping("/getRole")
@ResponseBody
public BaseResult getRole() {
try {
CloudRole data = iCloudRoleUserService.getCloudShareRole(StpUtil.getLoginIdAsInt());
return success("获取数据成功",data);
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,103 @@
package com.zxdmy.excite.admin.controller.cloud.share;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.cloud.role.CloudRole;
import com.zxdmy.excite.system.entity.cloud.role.CloudRoleUser;
import com.zxdmy.excite.system.entity.cloud.space.CloudFile;
import com.zxdmy.excite.system.entity.req.space.ReqCloudFile;
import com.zxdmy.excite.system.entity.vo.space.CloudFileVo;
import com.zxdmy.excite.system.service.cloud.role.ICloudRoleService;
import com.zxdmy.excite.system.service.cloud.role.ICloudRoleUserService;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileService;
import lombok.AllArgsConstructor;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
/**
* <p>
* 文件表 前端控制器
* </p>
*
* @author ss
* @since 2026-01-28
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/share")
public class CloudShareController extends BaseController {
private ICloudFileService iCloudFileService;
private ICloudRoleUserService iCloudRoleUserService;
private ICloudRoleService iCloudRoleService;
@RequestMapping("index")
public String index() {
return "cloud/share/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqCloudFile data) {
try {
CloudRole cloudRole = iCloudRoleUserService.getCloudShareRole(StpUtil.getLoginIdAsInt());
PageList<CloudFileVo> dataPage = iCloudFileService.queryByPage(page, limit, data);
if(null!=cloudRole){
if (cloudRole.getRoleDown()>0) {
for (CloudFileVo cloudFileVo:dataPage.getList()) {
cloudFileVo.setRoleDown(1);
}
}
if (cloudRole.getRoleUpload()>0) {
for (CloudFileVo cloudFileVo:dataPage.getList()) {
cloudFileVo.setRoleUpload(1);
}
}
if (cloudRole.getRoleDelete()>0) {
for (CloudFileVo cloudFileVo:dataPage.getList()) {
cloudFileVo.setRoleDelete(1);
}
}
}
return success("获取数据成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@GetMapping("/getData")
@ResponseBody
public BaseResult getData(String id) {
try {
CloudFileVo data = new CloudFileVo();
CloudFile cloudFile = iCloudFileService.getById(id);
if(null!=cloudFile){
BeanUtils.copyProperties(data, cloudFile);
}
if(null!=cloudFile){
return success("获取数据成功",data);
}else{
return error(400, "数据不存在!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,397 @@
package com.zxdmy.excite.admin.controller.cloud.space;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.cloud.role.CloudRole;
import com.zxdmy.excite.system.entity.cloud.space.CloudFile;
import com.zxdmy.excite.system.entity.cloud.space.CloudFileRole;
import com.zxdmy.excite.system.entity.dto.FileTreeDTO;
import com.zxdmy.excite.system.entity.req.space.ReqCloudFile;
import com.zxdmy.excite.system.entity.vo.space.*;
import com.zxdmy.excite.system.service.cloud.role.ICloudRoleUserService;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileRoleService;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileService;
import lombok.AllArgsConstructor;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;
import com.zxdmy.excite.common.base.BaseController;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
* 文件表 前端控制器
* </p>
*
* @author ss
* @since 2026-01-28
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/space")
public class CloudFileController extends BaseController {
private ICloudFileService iCloudFileService;
private ICloudRoleUserService iCloudRoleUserService;
private ICloudFileRoleService iCloudFileRoleService;
@RequestMapping("index")
public String index() {
return "cloud/space/file/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqCloudFile data) {
try {
CloudRole cloudRole = iCloudRoleUserService.getCloudShareRole(StpUtil.getLoginIdAsInt());
PageList<CloudFileVo> dataPage = iCloudFileService.queryByPage(page, limit, data);
if(null!=cloudRole){
if (cloudRole.getRoleDown()>0) {
for (CloudFileVo cloudFileVo:dataPage.getList()) {
cloudFileVo.setRoleDown(1);
}
}
if (cloudRole.getRoleUpload()>0) {
for (CloudFileVo cloudFileVo:dataPage.getList()) {
cloudFileVo.setRoleUpload(1);
}
}
if (cloudRole.getRoleDelete()>0) {
for (CloudFileVo cloudFileVo:dataPage.getList()) {
cloudFileVo.setRoleDelete(1);
}
}
}
return success("获取数据成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("add")
public String add() {
return "cloud/space/file/add";
}
@PostMapping("/addSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult addSave(@Validated ReqCloudFile data) {
try {
if(null == iCloudFileService.getByData(data)){
if(iCloudFileService.saveData(data)==1){
return success("操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@GetMapping("/getData")
@ResponseBody
public BaseResult getData(String id) {
try {
CloudFileVo data = new CloudFileVo();
CloudFile cloudFile = iCloudFileService.getById(id);
if(null!=cloudFile){
BeanUtils.copyProperties(data, cloudFile);
}
if(null!=cloudFile){
return success("获取数据成功",data);
}else{
return error(400, "数据不存在!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("edit/{id}")
public String edit(@PathVariable String id, ModelMap map) throws InvocationTargetException, IllegalAccessException {
CloudFileVo data = new CloudFileVo();
CloudFile cloudFile = iCloudFileService.getById(id);
if(null!=cloudFile){
BeanUtils.copyProperties(data, cloudFile);
}
// 加载至前端
if (cloudFile == null) {
map.put("code", 404);
map.put("msg", "数据不存在!");
return "error/error";
}
map.put("id", id);
return "cloud/space/file/edit";
}
@PostMapping("/editSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult editSave(@Validated ReqCloudFile data) {
try {
CloudFileVo cloudFileVo = iCloudFileService.getByData(data);
CloudFile cloudFile = iCloudFileService.getById(data.getId());
if(cloudFileVo==null){
if(iCloudFileService.updateData(data)==1){
return success(200,"操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
if (cloudFile.getFileName().equals(data.getFileName())) {
if(iCloudFileService.updateData(data)==1){
return success(200,"操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/delete")
@ResponseBody
@AnnotationSaveReLog
public BaseResult delete(String id) {
try {
int result = iCloudFileService.deleteById(id);
if (result == 1) {
return success(200, "删除成功!");
}else{
return error("删除失败!");
}
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
@GetMapping("/getFileRole")
@ResponseBody
public BaseResult getFileRole(String id) {
try {
CloudFilleUserVo cloudFilleUserVo = new CloudFilleUserVo();
List<CloudFileRoleVo> dataPage = iCloudFileRoleService.getFileRole(id);
List<Integer> ids = dataPage.stream()
.map(CloudFileRoleVo::getUserId)
.collect(Collectors.toList());
cloudFilleUserVo.setIds(ids);
String names = dataPage.stream()
.map(CloudFileRoleVo::getUserName)
.collect(Collectors.joining(", "));
String userIDs = dataPage.stream()
.map(CloudFileRoleVo -> String.valueOf(CloudFileRoleVo.getId()))
.collect(Collectors.joining(", "));
cloudFilleUserVo.setUserId(userIDs);
cloudFilleUserVo.setName(names);
return success("获取数据成功", cloudFilleUserVo);
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@GetMapping("/getRoleFile")
@ResponseBody
public BaseResult getRoleFile(String id) {
try {
CloudRoleFolderVo cloudRoleFolderVo = new CloudRoleFolderVo();
List<CloudRoleFileVo> dataPage = iCloudFileRoleService.getRoleFile(id);
List<Long> ids = dataPage.stream()
.map(CloudRoleFileVo::getFileId)
.collect(Collectors.toList());
cloudRoleFolderVo.setIds(ids);
String names = dataPage.stream()
.map(CloudRoleFileVo::getFileName)
.collect(Collectors.joining(", "));
String userIDs = dataPage.stream()
.map(CloudRoleFileVo -> String.valueOf(CloudRoleFileVo.getId()))
.collect(Collectors.joining(", "));
cloudRoleFolderVo.setRoleId(userIDs);
cloudRoleFolderVo.setName(names);
return success("获取数据成功", cloudRoleFolderVo);
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@GetMapping("/getRoleFileCheck")
@ResponseBody
public BaseResult getRoleFileCheck(String id) {
try {
CloudRoleFolderVo cloudRoleFolderVo = new CloudRoleFolderVo();
List<CloudRoleFileVo> dataPage = iCloudFileRoleService.getRoleFileCheck(id);
List<Long> ids = dataPage.stream()
.map(CloudRoleFileVo::getFileId)
.collect(Collectors.toList());
cloudRoleFolderVo.setIds(ids);
String names = dataPage.stream()
.map(CloudRoleFileVo::getFileName)
.collect(Collectors.joining(", "));
String userIDs = dataPage.stream()
.map(CloudRoleFileVo -> String.valueOf(CloudRoleFileVo.getId()))
.collect(Collectors.joining(", "));
cloudRoleFolderVo.setRoleId(userIDs);
cloudRoleFolderVo.setName(names);
return success("获取数据成功", cloudRoleFolderVo);
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping(value = "/changeDeleteStatus/{status}")
@ResponseBody
public BaseResult changeDeleteStatus(@PathVariable String status, String[] ids) {
try {
int[] result = iCloudFileService.changeDeleteStatus(Integer.parseInt(status), ids);
// 没有失败
if (result[0] != 0 && result[1] == 0) {
return success(200, "修改成功!");
}
// 有成功的
else if (result[0] != 0) {
return success(200, result[0] + "个更新成功," + result[1] + "个失败!");
} else {
return success(500, "修改失败,请重试!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@GetMapping("/queryByIndexPage")
@ResponseBody
public BaseResult queryByIndexPage(Integer page, Integer limit, ReqCloudFile data) {
try {
page=1;
limit=15;
List<CloudFileRole> list = iCloudFileRoleService.getFileRoleByUseId(StpUtil.getLoginIdAsInt());
List<Long> ids = list.stream()
.map(CloudFileRole::getFileId)
.collect(Collectors.toList());
data.setFileIds(ids);
PageList<CloudFileVo> dataPage = iCloudFileService.queryByIndexPage(page, limit, data);
return success("获取数据成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("authFile")
public String authFile() {
return "cloud/space/file/authFile";
}
@RequestMapping("updateAuthFile/{id}")
public String updateAuthFile(@PathVariable String id, ModelMap map) {
map.put("id",id);
return "cloud/space/file/updateAuthFile";
}
@GetMapping("/query")
@ResponseBody
public BaseResult query() {
try {
ReqCloudFile data = new ReqCloudFile();
List<CloudFileVo> dataPage = iCloudFileService.queryFileByData(data);
List<FileTreeDTO> department = buildDepartmentTree(dataPage);
return success(200, "获取数据成功!",department);
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
public List<FileTreeDTO> buildDepartmentTree(List<CloudFileVo> departments) {
// 1. 按parentId分组
Map<Long, List<FileTreeDTO>> parentMap = new HashMap<>();
// 2. 创建所有节点的映射
Map<Long, FileTreeDTO> nodeMap = new HashMap<>();
// 3. 转换并分组
for (CloudFileVo dept : departments) {
FileTreeDTO node = new FileTreeDTO();
org.springframework.beans.BeanUtils.copyProperties(dept, node);
node.setChildren(new ArrayList<>());
nodeMap.put(dept.getId(), node);
Long parentId = dept.getFileParentId();
if (parentId == null) {
parentId = 0L; // 将null转换为0,作为根节点的父ID
}
parentMap.computeIfAbsent(parentId, k -> new ArrayList<>())
.add(node);
}
// 4. 构建树形结构
List<FileTreeDTO> rootList = parentMap.getOrDefault(0L, new ArrayList<>());
// 5. 递归构建子节点
for (Long parentId : parentMap.keySet()) {
if (parentId.equals(0L)) continue;
FileTreeDTO parentNode = nodeMap.get(parentId);
if (parentNode != null) {
parentNode.setChildren(parentMap.get(parentId));
}
}
// 6. 排序(按department_sort
sortTreeNodes(rootList);
return rootList;
}
private void sortTreeNodes(List<FileTreeDTO> nodes) {
if (nodes == null || nodes.isEmpty()) return;
// 按排序字段排序
nodes.sort(Comparator.comparing(FileTreeDTO::getFileSort));
// 递归排序子节点
for (FileTreeDTO node : nodes) {
if (node.getChildren() != null && !node.getChildren().isEmpty()) {
sortTreeNodes(node.getChildren());
}
}
}
}
@@ -0,0 +1,64 @@
package com.zxdmy.excite.admin.controller.cloud.space;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.cloud.role.CloudRole;
import com.zxdmy.excite.system.entity.cloud.space.CloudFile;
import com.zxdmy.excite.system.entity.cloud.space.CloudFileRole;
import com.zxdmy.excite.system.entity.req.space.ReqCloudFile;
import com.zxdmy.excite.system.entity.req.space.ReqCloudFileRole;
import com.zxdmy.excite.system.entity.vo.space.CloudFileRoleVo;
import com.zxdmy.excite.system.entity.vo.space.CloudFileVo;
import com.zxdmy.excite.system.entity.vo.space.CloudFilleUserVo;
import com.zxdmy.excite.system.service.cloud.role.ICloudRoleUserService;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileRoleService;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileService;
import lombok.AllArgsConstructor;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 文件表 前端控制器
* </p>
*
* @author ss
* @since 2026-01-28
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/fileRole")
public class CloudFileRoleController extends BaseController {
private ICloudFileRoleService iCloudFileRoleService;
@GetMapping("/getData")
@ResponseBody
public BaseResult getData(ReqCloudFileRole reqCloudFileRole) {
try {
reqCloudFileRole.setUserId(StpUtil.getLoginIdAsInt());
CloudFileRole cloudFileRole = iCloudFileRoleService.getData(reqCloudFileRole);
if(null!=cloudFileRole){
return success("获取数据成功",cloudFileRole);
}else{
return error(400, "暂无权限!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,80 @@
package com.zxdmy.excite.admin.controller.cloud.space;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.req.space.ReqCloudFile;
import com.zxdmy.excite.system.entity.vo.space.CloudFileVo;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* 文件表 前端控制器
* </p>
*
* @author ss
* @since 2026-01-28
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/recycle")
public class CloudRecycleController extends BaseController {
private ICloudFileService iCloudFileService;
@RequestMapping("index")
public String index() {
return "cloud/space/recycle/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqCloudFile data) {
try {
PageList<CloudFileVo> dataPage = iCloudFileService.queryByRecyclePage(page, limit, data);
return success("获取数据成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/recover")
@ResponseBody
public BaseResult recover(String id) {
try {
int result = iCloudFileService.recover(id);
if (result == 1) {
return success(200, "恢复成功!");
}else{
return error("恢复失败!");
}
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
@PostMapping("/foreverDelete")
@ResponseBody
@AnnotationSaveReLog
public BaseResult foreverDelete(String id) {
try {
int result = iCloudFileService.deleteById(id);
if (result == 1) {
return success(200, "删除成功!");
}else{
return error("删除失败!");
}
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,73 @@
package com.zxdmy.excite.admin.controller.cloud.trace;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.PageList;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.req.lately.ReqCloudUserLately;
import com.zxdmy.excite.system.entity.req.space.ReqCloudFile;
import com.zxdmy.excite.system.entity.req.trace.ReqCloudFileTrace;
import com.zxdmy.excite.system.entity.vo.space.CloudFileVo;
import com.zxdmy.excite.system.entity.vo.trace.CloudFileTraceVo;
import com.zxdmy.excite.system.service.cloud.lately.ICloudUserLatelyService;
import com.zxdmy.excite.system.service.cloud.trace.ICloudFileTraceService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* <p>
* 最近文件表 前端控制器
* </p>
*
* @author 沈松
* @since 2026-01-29
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/trace")
public class CloudTraceController extends BaseController {
private ICloudFileTraceService iCloudFileTraceService;
@RequestMapping("index")
public String index() {
return "cloud/lately/index";
}
@GetMapping("/list")
@ResponseBody
public BaseResult getPageList(Integer page, Integer limit, ReqCloudFileTrace data) {
try {
page = 1;
limit = 15;
PageList<CloudFileTraceVo> dataPage = iCloudFileTraceService.queryByPage(page, limit, data);
return success("获取列表成功", dataPage.getList(), (int) dataPage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/addSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult addSave(@Validated ReqCloudFileTrace data) {
try {
if(iCloudFileTraceService.saveData(data)==1){
return success("操作成功");
}else{
return error(400, "操作失败,系统错误");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,90 @@
package com.zxdmy.excite.admin.controller.cloud.upload;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.cloud.space.CloudFile;
import com.zxdmy.excite.system.entity.req.space.ReqCloudFile;
import com.zxdmy.excite.system.entity.vo.space.CloudFileVo;
import com.zxdmy.excite.system.service.cloud.space.ICloudFileService;
import lombok.AllArgsConstructor;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.lang.reflect.InvocationTargetException;
/**
* 系统菜单/权限表 前端控制器
*
* @author 沈松
* @since 2021-09-12
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/upload/")
public class UploadController extends BaseController {
private ICloudFileService iCloudFileService;
@RequestMapping("index/{id}")
public String index(@PathVariable String id, ModelMap map) throws InvocationTargetException, IllegalAccessException {
map.put("id", id);
return "cloud/upload/index";
}
@PostMapping("/addSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult addSave(@Validated ReqCloudFile data) {
try {
String oldName = data.getFileName();
if(null!=data.getFileName()){
String[] file = data.getFileName().split("\\.");
if(file.length>0) {
data.setFileName(file[0].toString());
}
}
if(null == iCloudFileService.getByData(data)){
data.setFileName(oldName);
if(iCloudFileService.saveFileData(data)==1){
return success("操作成功");
}else{
return error(400, "操作失败,系统错误");
}
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/editSave")
@ResponseBody
@AnnotationSaveReLog
public BaseResult editSave(@Validated ReqCloudFile data) {
try {
if(iCloudFileService.updateFileData(data)==1){
return success("操作成功");
}else{
return error(400, "操作失败,数据已存在");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@RequestMapping("changeIndex/{id}")
public String changeIndex(@PathVariable String id, ModelMap map) throws InvocationTargetException, IllegalAccessException {
map.put("id", id);
return "cloud/upload/changeIndex";
}
}
@@ -0,0 +1,83 @@
package com.zxdmy.excite.admin.controller.component;
import cn.hutool.core.util.IdUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.component.alipay.AlipayService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* <p>
* 描述
* </p>
*
* @author 沈松
* @since 2022/1/11 20:45
*/
@Controller
@AllArgsConstructor
@RequestMapping("/component/alipay")
public class AlipayController extends BaseController {
AlipayService alipayService;
@RequestMapping("index")
public String index() {
return "component/alipay/index";
}
@PostMapping(value = "/pay")
@ResponseBody
public BaseResult pay(String title, String price) {
String outTradeNo = IdUtil.simpleUUID();
String qrcode = alipayService.pay(null, "facetoface", title, outTradeNo, price, null, null);
return success(200, "获取支付二维码成功!")
.put("qrcode", qrcode)
.put("outTradeNo", outTradeNo);
}
@GetMapping(value = "/page")
@ResponseBody
public String page(String title, String price,String returnUrl) {
String outTradeNo = IdUtil.simpleUUID();
String qrcode = alipayService.pay(null, "page", title, outTradeNo, price, returnUrl, null);
return qrcode;
// return success(200, "获取支付二维码成功!")
// .put("qrcode", qrcode)
// .put("outTradeNo", outTradeNo);
}
@PostMapping(value = "/refund")
@ResponseBody
public BaseResult refund(String outTradeNo, String amount) {
String[] result = alipayService.refund(null, null, outTradeNo, amount, "用户取消退款");
if ("Y".equals(result[0])) {
return success(200, "退款成功,退款金额:" + result[4]);
} else if ("N".equals(result[0])) {
return success(200, "该订单早已退款成功!退款金额:" + result[4]);
} else
return error("退款错误:" + result[1] + result[2]);
}
@PostMapping(value = "/query")
@ResponseBody
public BaseResult query(String outTradeNo) {
String[] result = alipayService.queryPay(null, null, outTradeNo);
if ("Y".equals(result[0])) {
return success(200, "查询成功!" +
" 支付宝交易号:" + result[1] +
" 交易状态:" + result[3] +
" 订单金额:" + result[4] +
" 买家账号:" + result[6]);
}
return error("查询失败:" + result[1] + result[2]);
}
}
@@ -0,0 +1,43 @@
package com.zxdmy.excite.admin.controller.component;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiniu.storage.model.FileInfo;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.component.qiniu.QiniuOssService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* 七牛云文件存储服务控制类
*
* @author 沈松
* @since 2022/1/24 21:49
*/
@Controller
@AllArgsConstructor
@RequestMapping("/component/qiniuOss")
public class QiniuOssController extends BaseController {
QiniuOssService qiniuOssService;
@RequestMapping("index")
public String index() {
return "component/qiniuOss/index";
}
@GetMapping(value = "/fileList")
@ResponseBody
public BaseResult getList(Integer page, Integer limit) {
Page<FileInfo> fileInfoList = qiniuOssService.getQiniuFileListPage(page, limit, "", "");
return success("获取成功!", fileInfoList.getRecords(), (int) fileInfoList.getTotal());
}
}
@@ -0,0 +1,92 @@
package com.zxdmy.excite.admin.controller.component;
import cn.hutool.core.util.IdUtil;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result;
import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.component.wechat.WeChatPayService;
import lombok.AllArgsConstructor;
import org.aspectj.weaver.ast.Or;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Timer;
/**
* <p>
* 描述
* </p>
*
* @author 沈松
* @since 2022/1/11 20:45
*/
@Controller
@AllArgsConstructor
@RequestMapping("/component/wechatPay")
public class WeChatPayController extends BaseController {
WeChatPayService weChatPayService;
@RequestMapping("index")
public String requestLogPage() {
return "component/wechatPay/index";
}
@PostMapping(value = "/pay")
@ResponseBody
public BaseResult pay(String title, Float price) {
System.out.println(title);
System.out.println(price);
int total = (int) (price * 100);
String outTradeNo = IdUtil.simpleUUID();
String result = weChatPayService.pay(null, "native", title, outTradeNo, total, null);
return success(200, "获取支付二维码成功!")
.put("qrcode", result)
.put("outTradeNo", outTradeNo);
}
@PostMapping(value = "/refund")
@ResponseBody
public BaseResult refund(String outTradeNo, Float amount) {
int refund = (int) (amount * 100);
// 查询该订单的实际支付金额
int total = weChatPayService.query(null, null, outTradeNo).getAmount().getTotal();
if (refund > total) {
return error("退款金额大于支付金额!");
}
WxPayRefundV3Result wxPayRefundV3Result = weChatPayService.refund(null, outTradeNo, IdUtil.simpleUUID(), total, refund);
if ("SUCCESS".equals(wxPayRefundV3Result.getStatus())) {
return success(200, "退款成功!");
} else if ("PROCESSING".equals(wxPayRefundV3Result.getStatus())) {
return success(200, "退款处理中...稍后到账,请注意查收微信通知!");
}
return error("退款失败!");
}
@PostMapping(value = "/query")
@ResponseBody
public BaseResult query(String outTradeNo) {
WxPayOrderQueryV3Result wxPayOrderQueryV3Result = weChatPayService.query(null, null, outTradeNo);
if (wxPayOrderQueryV3Result.getTradeState().equals("SUCCESS")) {
return success(200, "支付成功!,交易成功时间:" + wxPayOrderQueryV3Result.getSuccessTime());
} else if (wxPayOrderQueryV3Result.getTradeState().equals("NOTPAY")) {
return error("未支付!");
} else if (wxPayOrderQueryV3Result.getTradeState().equals("CLOSED")) {
return error("订单已关闭!");
} else if (wxPayOrderQueryV3Result.getTradeState().equals("USERPAYING")) {
return success(200, "用户支付中(付款码支付)!");
} else if (wxPayOrderQueryV3Result.getTradeState().equals("PAYERROR")) {
return error("支付失败(其他原因,如银行返回失败)");
} else if (wxPayOrderQueryV3Result.getTradeState().equals("REFUND")) {
return error("订单已退款!");
} else
return error(wxPayOrderQueryV3Result.getTradeState() + ":订单不存在");
}
}
@@ -0,0 +1,42 @@
package com.zxdmy.excite.admin.controller.fileSet;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.SysMenu;
import com.zxdmy.excite.system.service.ISysMenuService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* 系统菜单/权限表 前端控制器
*
* @author 沈松
* @since 2021-09-12
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/pdf/")
public class PDFController extends BaseController {
private ISysMenuService menuService;
/**
* @return 页面:【菜单管理】页面入口
*/
@RequestMapping("index")
public String index() {
return "file/pdf";
}
}
@@ -0,0 +1,133 @@
package com.zxdmy.excite.admin.controller.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.component.oss.AliOSSProperties;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.time.LocalDate;
import java.util.*;
/**
* 系统菜单/权限表 前端控制器
*
* @author 沈松
* @since 2021-09-12
*/
@Controller
@AllArgsConstructor
@RequestMapping("/cloud/oss/")
public class OssController extends BaseController {
@Autowired//将OSS的配置注入进来,后面需要用到
private AliOSSProperties aliOSSProperties;
/**
* 获取OSS上传凭证(用于前端直传)
*/
@GetMapping("/policy")
@ResponseBody
public BaseResult getUploadPolicy() {
try {
// 使用简化版本的Policy生成
Map<String, String> policy = getSimpleUploadPolicy();
return success("获取列表成功", policy);
} catch (Exception e) {
return error("获取上传凭证失败: " + e.getMessage());
}
}
/**
* 生成唯一的文件名
*/
private String generateFileName(String originalFilename) {
String suffix = "";
if (originalFilename != null && originalFilename.contains(".")) {
suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
}
return UUID.randomUUID().toString().replace("-", "") + suffix;
}
/**
* 简化的Policy获取方法
*/
public Map<String, String> getSimpleUploadPolicy() {
Map<String, String> result = new HashMap<>();
try {
// 生成目录:按年月
String dir = "cloud/" +
LocalDate.now().getYear() + "-" +
String.format("%02d", LocalDate.now().getMonthValue());
// 确保以/结尾
if (!dir.endsWith("/")) {
dir = dir + "/";
}
// 使用更简单的key格式:cloud/2026-01/${filename}
String key = dir + "${filename}";
// Policy过期时间
long expireEndTime = System.currentTimeMillis() + 300 * 1000;
Date expiration = new Date(expireEndTime);
// 创建Policy
PolicyConditions policyConds = new PolicyConditions();
policyConds.addConditionItem(
PolicyConditions.COND_CONTENT_LENGTH_RANGE,
0,
1048576000
);
// 使用starts-with条件,允许任意文件名
policyConds.addConditionItem(
MatchMode.StartWith,
PolicyConditions.COND_KEY,
dir
);
String endpoint = aliOSSProperties.getEndpoint();
String accessKeyId = aliOSSProperties.getAccessKeyId();
String accessKeySecret = aliOSSProperties.getAccessKeySecret();
String bucketName = aliOSSProperties.getBucketName();
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
String encodedPolicy = Base64.getEncoder().encodeToString(postPolicy.getBytes("UTF-8"));
String signature = ossClient.calculatePostSignature(postPolicy);
// 返回结果
result.put("OSSAccessKeyId", accessKeyId);
result.put("policy", encodedPolicy);
result.put("signature", signature);
result.put("key", key); // 这个key必须包含${filename}
result.put("host", "https://" + bucketName + "." + endpoint);
result.put("dir", dir);
result.put("expire", String.valueOf(expireEndTime / 1000));
result.put("success_action_status", "200");
} catch (Exception e) {
throw new RuntimeException("生成上传凭证失败", e);
}
return result;
}
}
@@ -0,0 +1,21 @@
package com.zxdmy.excite.admin.controller.system;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import com.zxdmy.excite.common.base.BaseController;
/**
* <p>
* 云盘权限文件表 前端控制器
* </p>
*
* @author 沈松
* @since 2026-02-01
*/
@Controller
@RequestMapping("/cloud-role-file")
public class CloudRoleFileController extends BaseController {
}
@@ -0,0 +1,21 @@
package com.zxdmy.excite.admin.controller.system;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import com.zxdmy.excite.common.base.BaseController;
/**
* <p>
* 收藏表 前端控制器
* </p>
*
* @author 沈松
* @since 2026-01-29
*/
@Controller
@RequestMapping("/cloud-user-collection")
public class CloudUserCollectionController extends BaseController {
}
@@ -0,0 +1,77 @@
package com.zxdmy.excite.admin.controller.system;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.component.qiniu.QiniuOssService;
import com.zxdmy.excite.system.entity.SysUser;
import com.zxdmy.excite.system.service.ISysUserService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 系统模块基础控制器
*
* @author 沈松
* @since 2021-09-30 0030 23:45
*/
@Controller
@AllArgsConstructor
public class SysController extends BaseController {
ISysUserService userService;
/**
* 开发模式下:默认访问域名,跳转至后台主页
* 如果后期有新的首页,删除即可
*
* @return 页面跳转
*/
@RequestMapping("")
public String defaultPage() {
return "redirect:/system/login";
}
/**
* @return 【后台主页】访问入口
*/
@RequestMapping("system/index")
public String index(ModelMap map) {
// 已登录,访问后台主页
if (StpUtil.isLogin()) {
SysUser user = userService.getById(StpUtil.getLoginIdAsInt());
map.put("user", user);
return "system/index";
}
// 未登录,跳转至登录页面
return "redirect:/system/login";
}
/**
* @return 【登录】页面入口
*/
@RequestMapping("system/login")
public String login() {
// 已登录:跳转至后台首页
if (StpUtil.isLogin()) {
return "redirect:/system/index";
}
// 未登录,跳转至登录页面
return "system/login";
}
/**
* @return 后台欢迎页面访问入口
*/
@RequestMapping("system/welcome")
public String welcome() {
return "system/welcome";
}
}
@@ -0,0 +1,119 @@
package com.zxdmy.excite.admin.controller.system;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.system.entity.SysLogLogin;
import com.zxdmy.excite.system.entity.SysLogRequest;
import com.zxdmy.excite.system.entity.SysMenu;
import com.zxdmy.excite.system.service.ISysLogLoginService;
import com.zxdmy.excite.system.service.ISysLogRequestService;
import lombok.AllArgsConstructor;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;
import com.zxdmy.excite.common.base.BaseController;
import java.time.LocalDateTime;
/**
* 日志管理控制器
*
* @author 沈松
* @since 2021-12-09
*/
@Controller
@AllArgsConstructor
@RequestMapping("/system/log")
public class SysLogController extends BaseController {
ISysLogRequestService logRequestService;
ISysLogLoginService logLoginService;
/**
* @return 【操作日志】页面访问入口
*/
@RequestMapping("request")
public String requestLogPage() {
return "system/log/request";
}
/**
* @return 【登录日志】页面访问入口
*/
@RequestMapping("login")
public String loginLogPage() {
return "system/log/login";
}
/**
* 获取操作日志列表(含查询条件)
*
* @param page 页码
* @param limit 页条数
* @param userId 用户ID,格式:10001
* @param startDate 开始时间,格式:2022-01-11 00:00:00
* @param endDate 结束时间,格式:2022-01-11 00:00:00
* @return 操作日志列表
*/
@GetMapping("/requestList")
@ResponseBody
public BaseResult requestList(Integer page, Integer limit, String userId, String startDate, String endDate) {
try {
// TODO 加上根据ID和开始、结束时间的搜索功能
Page<SysLogRequest> rolePage = logRequestService.getPage(page, limit, userId, startDate, endDate);
return success("获取日志列表成功", rolePage.getRecords(), (int) rolePage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
/**
* 获取登录日志列表
*
* @param page 页码
* @param limit 页条数
* @param userId 用户ID,格式:10001
* @param startDate 开始时间,格式:2022-01-11 00:00:00
* @param endDate 结束时间,格式:2022-01-11 00:00:00
* @return 登录日志列表
*/
@GetMapping("/loginList")
@ResponseBody
public BaseResult loginList(Integer page, Integer limit, String userId, String ip, String startDate, String endDate) {
try {
// TODO 加上搜索功能,详情同上
Page<SysLogLogin> rolePage = logLoginService.getPage(page, limit, userId, ip, startDate, endDate);
return success("获取日志列表成功", rolePage.getRecords(), (int) rolePage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
@PostMapping("/request/delete")
@ResponseBody
public BaseResult deleteRequestLog(Integer[] logIds) {
if (null == logIds || logIds.length == 0) {
return error("请求数据为空!");
}
if (logRequestService.deleteLog(logIds) > 0) {
return success("删除成功!");
}
return error("删除失败!");
}
@PostMapping("/login/delete")
@ResponseBody
public BaseResult deleteLoginLog(Integer[] logIds) {
if (null == logIds || logIds.length == 0) {
return error("请求数据为空!");
}
if (logLoginService.deleteLog(logIds) > 0) {
return success("删除成功!");
}
return error("删除失败!");
}
}
@@ -0,0 +1,334 @@
package com.zxdmy.excite.admin.controller.system;
import cn.dev33.satoken.stp.StpUtil;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.SysMenu;
import com.zxdmy.excite.system.service.ISysMenuService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.*;
/**
* 系统菜单/权限表 前端控制器
*
* @author 沈松
* @since 2021-09-12
*/
@Controller
@AllArgsConstructor
@RequestMapping("/system/menu")
public class SysMenuController extends BaseController {
private ISysMenuService menuService;
/**
* @return 页面:【菜单管理】页面入口
*/
@RequestMapping("index")
public String index() {
return "system/menu/index";
}
/**
* @return 页面:【菜单管理-添加菜单】页面入口
*/
@RequestMapping("goAdd")
public String goAdd() {
return "system/menu/add";
}
/**
* 页面:【菜单管理-编辑菜单】页面入口
*
* @param id 菜单ID
* @param map Map
* @return 【菜单管理-编辑菜单】页面入口
*/
@RequestMapping("goEdit/{id}")
public String goEdit(@PathVariable String id, ModelMap map) {
try {
// 尝试获取菜单信息,并返回前端
SysMenu menu = menuService.getMenu(Integer.parseInt(id));
if (null != menu) {
// 此处是为了适应前端的图标选择器,将"fa "截掉
if ("".equals(menu.getIcon()) && null != menu.getIcon()) {
menu.setIcon(menu.getIcon().substring(3));
}
map.put("menu", menu);
return "system/menu/edit";
} else {
return "error/404";
}
} catch (Exception e) {
// 发生异常,一般就是数字转换出错
System.err.println(e.getMessage());
return "error/500";
}
}
/**
* 接口功能:菜单管理-添加菜单 接口
*
* @param menu 菜单信息
* @return 菜单添加结果
*/
@PostMapping("/add")
@ResponseBody
@AnnotationSaveReLog
public BaseResult addMenu(@Validated SysMenu menu) {
// 添加菜单
if (menuService.saveMenu(menu) > 0) {
return success("菜单添加成功");
}
return error(400, "菜单添加失败");
}
/**
* 接口功能:根据菜单ID查询菜单并返回结果
*
* @param id 菜单ID
* @return 查询结果
*/
@GetMapping("/get/{id}")
@ResponseBody
public BaseResult getMenu(@PathVariable String id) {
try {
SysMenu menu = menuService.getMenu(Integer.parseInt(id));
if (null != menu) {
return success("获取菜单成功", menu);
}
return error(400, "获取菜单失败");
} catch (Exception e) {
return error(400, "发生错误:" + e.getMessage());
}
}
/**
* 接口功能:查询菜单列表,并组合后台首页的其他信息
*
* @return 菜单列表,以及后台标题等信息
*/
@GetMapping("/indexList")
@ResponseBody
public BaseResult getMenuListIndex() {
List<SysMenu> menus = menuService.getMenuListByUserId(StpUtil.getLoginIdAsInt(), true);
if (null != menus) {
// 如果是【tree】,则需要将菜单初始化成树状结构
menus = this.initMenu(menus);
// 首页信息
HashMap<String, String> map = new HashMap<>();
map.put("title", "首页");
map.put("href", "/system/welcome");
// logo信息
HashMap<String, String> map2 = new HashMap<>();
map2.put("title", "");
map2.put("image", "/images/logo/logo.png");
map2.put("href", "/system/index");
// 转换成相应的格式
return success("获取菜单成功").put("homeInfo", map).put("logoInfo", map2).put("menuInfo", menus);
}
return error(400, "获取菜单失败");
}
/**
* 接口功能:根据类型获取菜单列表
*
* @param type all:查询全部数据 | menu:查询除了按钮的全部数据 | tree:查询树状菜单(不含按钮)
* @return 菜单/权限列表
*/
@GetMapping("/list/{type}")
@ResponseBody
public BaseResult getMenuList(@PathVariable String type) {
boolean isAll = "all".equals(type);
boolean isTree = "tree".equals(type);
List<SysMenu> menus = menuService.getMenuList(isAll);
if (null != menus) {
// 如果是【tree】,则需要将菜单初始化成树状结构
if (isTree) {
menus = this.initMenu(menus);
return success("获取菜单成功", menus);
}
return success("获取菜单成功", menus, menus.size());
}
return error(400, "获取菜单失败");
}
/**
* 接口功能:获取菜单列表,其中该角色拥有的菜单的checkArr字段为"1"
*
* @param roleId 角色ID。0表示获取所有的状态正常的菜单
* @return 全部角色列表,其中指定角色拥有的菜单的checkArr字段为"1"
*/
@GetMapping("/listForRole/{roleId}")
@ResponseBody
public BaseResult getMenuListForRole(@PathVariable String roleId) {
try {
List<SysMenu> menus = menuService.getMenuListForRole(Integer.parseInt(roleId));
if (null != menus) {
return success("获取菜单列表成功", menus);
}
return error(400, "获取菜单失败");
} catch (Exception e) {
return error(400, "发生错误:" + e.getMessage());
}
}
/**
* 接口功能:根据角色ID获取菜单/权限
*
* @param roleId 角色ID
* @return 该角色具有的菜单/权限列表
*/
@GetMapping("/listByRoleId/{roleId}")
@ResponseBody
public BaseResult getMenuListByRoleId(@PathVariable String roleId) {
try {
List<SysMenu> menus = menuService.getMenuListByRoleId(Integer.parseInt(roleId));
return success("角色[" + roleId + "]拥有的菜单获取成功!", menus, menus.size());
} catch (Exception e) {
return error(400, "error" + e.getMessage());
}
}
/**
* 接口功能:根据用户ID获取菜单/权限
*
* @param userId 用户ID
* @return 该用户具有的菜单/权限列表
*/
@GetMapping("/listByUserId/{userId}")
@ResponseBody
public BaseResult getMenuListByUserId(@PathVariable String userId) {
try {
List<SysMenu> menus = menuService.getMenuListByUserId(Integer.parseInt(userId), false);
return success("用户[" + userId + "]拥有的菜单获取成功!", menus, menus.size());
} catch (Exception e) {
return error(400, "发生错误:" + e.getMessage());
}
}
/**
* 接口功能:更新菜单
*
* @param menu 菜单实体
* @return 菜单更新结果
*/
@PostMapping("/update")
@ResponseBody
@AnnotationSaveReLog
public BaseResult updateMenu(@Validated SysMenu menu) {
// 执行修改菜单操作
if (menuService.saveMenu(menu) > 0) {
return success("更新菜单成功");
}
return error(400, "更新菜单失败");
}
/**
* 接口功能:根据ID修改菜单状态
*
* @param status 菜单新状态:1-正常 0-禁用
* @param menuIds 需要修改状态的菜单ID数组
* @return 菜单状态修改结果
*/
@PostMapping("/changeStatus/{status}")
@ResponseBody
@AnnotationSaveReLog
public BaseResult changeMenuStatus(@PathVariable String status, Integer[] menuIds) {
try {
int[] result = menuService.changeStatus(Integer.parseInt(status), menuIds);
if (result[0] > 0) {
return success(result[0] + "个菜单状态更新成功," + result[1] + "个失败。");
}
return error(400, "菜单状态更新失败!");
} catch (Exception e) {
return error(400, "error" + e.getMessage());
}
}
/**
* 接口功能:根据ID删除菜单
*
* @param id 菜单ID
* @return 删除结果
*/
@PostMapping("/remove")
@ResponseBody
@AnnotationSaveReLog
public BaseResult removeMenu(String id) {
try {
if (menuService.deleteMenu(Integer.parseInt(id)) > 0) {
return success("菜单删除成功");
}
return error(400, "菜单删除失败");
} catch (Exception e) {
return error(400, "发生错误:" + e.getMessage());
}
}
/**
* 【注意:正常来说,这种工具应该以工具类的形式定义。但本项目中,我们只在此控制类中使用一次,所以就写在各个文件中】
* <p>
* 构造菜单树状列表数据
*
* @param menuList 查询到的菜单列表
* @return 合并后的树状列表
*/
private List<SysMenu> initMenu(List<SysMenu> menuList) {
// 如果菜单为空,直接返回空
if (menuList.isEmpty()) {
return null;
}
// 定义新的菜单列表,用来返回
List<SysMenu> retMenuList = new ArrayList<>();
// 循环遍历:查找顶级菜单(有的项目中是顶部导航菜单)
for (SysMenu aMenuList : menuList) {
// 顶级菜单的特征是父级ID为 -1
if (null != aMenuList.getParentId() && -1 == aMenuList.getParentId()) {
retMenuList.add(aMenuList);
}
}
//遍历所有菜单,将二级菜单添加至对应的一级菜单内
for (SysMenu menu : retMenuList) {
menu.setChild(getChild(menu.getId(), menuList));
}
//返回构建后的树状菜单
return retMenuList;
}
/**
* 设置子菜单(递归调用)
*
* @param parentId 父级菜单ID
* @param menuList 全部菜单列表
* @return 子菜单结果集合
*/
private List<SysMenu> getChild(Integer parentId, List<SysMenu> menuList) {
List<SysMenu> result = new ArrayList<>();
// 遍历,将子菜单添加进父菜单项内
for (SysMenu menu : menuList) {
if (null != menu.getParentId() && parentId.equals(menu.getParentId())) {
result.add(menu);
}
}
// 继续遍历二级菜单是否有子菜单(递归)
for (SysMenu menu : result) {
menu.setChild(getChild(menu.getId(), menuList));
}
//递归终止条件
if (result.size() == 0) {
return null;
}
//返回结果集
return result;
}
}
@@ -0,0 +1,282 @@
package com.zxdmy.excite.admin.controller.system;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.SysRole;
import com.zxdmy.excite.system.service.ISysRoleService;
import com.zxdmy.excite.system.service.ISysUserRoleService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* 系统角色表 前端控制器
*
* @author 沈松
* @since 2021-09-23
*/
@Controller
@AllArgsConstructor
@RequestMapping("/system/role")
public class SysRoleController extends BaseController {
ISysRoleService roleService;
ISysUserRoleService userRoleService;
/**
* @return 页面:【角色管理】页面入口
*/
@RequestMapping("index")
public String index() {
return "system/role/index";
}
/**
* @return 页面:【角色管理-添加角色】页面入口
*/
@RequestMapping("goAdd")
public String goAdd() {
return "system/role/add";
}
/**
* @param id 角色ID
* @param map map
* @return 页面:【角色管理-编辑角色】页面入口
*/
@RequestMapping("goEdit/{id}")
public String goEdit(@PathVariable String id, ModelMap map) {
try {
SysRole role = roleService.getRole(Integer.parseInt(id));
if (null != role) {
map.put("role", role);
return "system/role/edit";
} else {
map.put("code", 500);
map.put("msg", "可能原因:该角色禁止编辑,该角色已被禁用!");
return "error/error";
}
} catch (Exception e) {
// 发生异常,一般就是数字转换出错
System.err.println(e.getMessage());
return "error/500";
}
}
@RequestMapping("goShowUser/{id}")
public String showUser(@PathVariable String id, ModelMap map) {
try {
SysRole role = roleService.getRole(Integer.parseInt(id));
if (null == role) {
map.put("code", 500);
map.put("msg", "可能原因:该角色禁止编辑,该角色已被禁用!");
return "error/error";
} else {
map.put("role", role);
return "system/role/authUser";
}
} catch (Exception e) {
// 发生异常,一般就是数字转换出错
System.err.println(e.getMessage());
return "error/500";
}
}
/**
* 接口功能:添加角色,并支持同时分配权限
*
* @param role 角色实体
* @param menuIds 该角色拥有的菜单ID,数组类型:[1,2,3,4,5,6],前端传递字符串格式:1,2,3,4
* @return 添加结果
*/
@PostMapping("/add")
@ResponseBody
@AnnotationSaveReLog
public BaseResult addRole(@Validated SysRole role, Integer[] menuIds) {
try {
if (roleService.saveRole(role, menuIds) > 0) {
return success("菜单角色成功");
}
return error(400, "菜单角色失败");
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
/**
* 接口功能:通过角色ID获取角色信息
*
* @param id 角色ID
* @return 指定角色的信息
*/
@GetMapping("/get/{id}")
@ResponseBody
@AnnotationSaveReLog
public BaseResult getRole(@PathVariable String id) {
try {
SysRole role = roleService.getRole(Integer.parseInt(id));
if (null != role) {
return success("获取角色成功", role);
}
return error(400, "获取角色失败");
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
/**
* 接口功能:获取所有角色,支持条件搜索
*
* @param page 页号
* @param limit 当前页数目
* @param name 搜索字段:名称
* @param permission 搜索字段:权限字符
* @return 符合要求的角色列表
*/
@GetMapping("/list")
@ResponseBody
public BaseResult getRoleList(Integer page, Integer limit, String name, String permission) {
try {
Page<SysRole> rolePage = roleService.getPage(page, limit, name, permission);
return success("获取角色列表成功", rolePage.getRecords(), (int) rolePage.getTotal());
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
/**
* 接口功能:获取获取所有正常的角色,为用户模块所用(添加、编辑用户)
* 其中:如果指定ID(即ID不为0),则该用户的角色列表中,已分配的角色属性中的checkArr=1
*
* @param userId 用户ID。如果为0,则表示获取所有列表
* @return JSON结果
*/
@GetMapping("/listForUser/{userId}")
@ResponseBody
public BaseResult getRoleListForUser(@PathVariable String userId) {
try {
List<SysRole> roleList = roleService.getListByUserId(Integer.parseInt(userId));
return success("获取角色列表成功", roleList, roleList.size());
} catch (Exception e) {
return error(500, "error:" + e.getMessage());
}
}
/**
* 接口功能:更新角色接口
*
* @param role 角色实体
* @param menuIds 该角色拥有的菜单ID,数组类型:[1,2,3,4,5,6],前端发送数据格式为字符串:1,2,3,4
* @return 结果
*/
@PostMapping("/update")
@ResponseBody
@AnnotationSaveReLog
public BaseResult updateRole(@Validated SysRole role, Integer[] menuIds) {
try {
if (roleService.saveRole(role, menuIds) > 0) {
return success("更新角色成功");
}
return error(400, "更新角色失败,请重试");
} catch (Exception e) {
return error(500, "error:" + e.getMessage());
}
}
/**
* 接口功能:更新角色状态
*
* @param status 角色新状态:1-正常 0-禁用
* @param roleIds 角色ID列表,数组类型:[1,2,3,4,5,6]
* @return 修改结果
*/
@PostMapping("/changeStatus/{status}")
@ResponseBody
@AnnotationSaveReLog
public BaseResult changeStatus(@PathVariable String status, Integer[] roleIds) {
try {
int[] result = roleService.changeStatus(Integer.parseInt(status), roleIds);
if (result[0] > 0) {
return success(result[0] + "个角色状态更新成功," + result[1] + "个失败!");
} else
return error(400, "更新角色状态失败,请重试");
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
/**
* 接口功能:删除指定角色,包含该角色的权限信息,以及撤销分配给某些用户的角色
*
* @param roleIds 要删除的角色ID列表
* @return 结果
*/
@PostMapping("/delete")
@ResponseBody
@AnnotationSaveReLog
public BaseResult removeRole(Integer[] roleIds) {
try {
int[] result = roleService.deleteRoleById(roleIds);
// 没有失败的
if (result[1] == 0 && result[2] == 0) {
return success(200, "删除成功!");
}
// 没有成功的
else if (result[0] == 0) {
return error(result[1] + "个角色删除失败!" + result[2] + "个角色因已授权用户,请取消授权后再删除!");
}
// 有成功有失败的
else {
return success(200, result[0] + "个角色删除成功!" + result[1] + "个角色删除失败!" + result[2] + "个角色已授权用户,请取消授权后再删除!");
}
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
/**
* 接口功能:将指定角色分配给系列用户,或者取消某角色分配给的用户
*
* @param type 操作类型:auth-添加授权 | revoke-取消授权
* @param roleId 用户ID
* @param userIds 角色信息列表
* @return 分配结果
*/
@PostMapping("/authUser/{type}")
@ResponseBody
@AnnotationSaveReLog
public BaseResult authForUser(@PathVariable("type") String type, String roleId, Integer[] userIds) {
try {
// 添加授权
if (type.equals("auth")) {
if (roleService.authRoleForUsers(Integer.parseInt(roleId), userIds))
return success(200, "添加授权成功!");
else
return error("授权失败,请重试!");
}
// 取消授权
else if (type.equals("revoke")) {
int[] result = roleService.revokeRoleForUsers(Integer.parseInt(roleId), userIds);
if (result[1] == 0)
return success(200, "取消授权成功!");
else if (result[0] == 0)
return error("取消授权失败,请重试!");
else
return success(result[0] + "个用户取消授权成功," + result[1] + "个失败!");
}
return error("访问错误!");
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
}
@@ -0,0 +1,456 @@
package com.zxdmy.excite.admin.controller.system;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.config.ExciteConfig;
import com.zxdmy.excite.common.enums.ReturnCode;
import com.zxdmy.excite.common.enums.SystemCode;
import com.zxdmy.excite.common.service.RedisService;
import com.zxdmy.excite.framework.aop.AnnotationSaveLoginLog;
import com.zxdmy.excite.framework.aop.AnnotationSaveReLog;
import com.zxdmy.excite.system.entity.SysUser;
import com.zxdmy.excite.system.service.ISysUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.List;
/**
* 系统用户表 前端控制器
*
* @author 沈松
* @since 2021-09-01
*/
@Tag(name = "后台用户控制器")
@Controller
@AllArgsConstructor
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
private ISysUserService userService;
// private RedisService redisUtils;
private ExciteConfig exciteConfig;
/**
* 访问页面:用户管理 - 列表页面
*
* @return 跳转至列表页面
*/
@RequestMapping("index")
public String index() {
return "system/user/index";
}
/**
* 访问页面:用户管理 - 添加用户页面
*
* @return 跳转至添加用户页面
*/
@RequestMapping("goAdd")
public String goAdd() {
return "system/user/add";
}
/**
* 访问页面:用户管理 - 编辑用户信息页面
*
* @return 跳转至编辑用户页面
*/
@RequestMapping("goEdit/{id}")
public String goEdit(@PathVariable String id, ModelMap map) {
// 获取该用户的信息
SysUser user = userService.getById(id);
// 加载至前端
if (user == null) {
map.put("code", 404);
map.put("msg", "用户不存在!");
return "error/error";
}
map.put("user", user);
return "system/user/edit";
}
/**
* 访问页面:用户管理 - 为用户分配角色页面
*
* @return 跳转至编辑用户页面
*/
@RequestMapping("goAuthRole/{id}")
public String goAuthRole(@PathVariable String id, ModelMap map) {
// 获取该用户的信息
SysUser user = userService.getById(id);
// 加载至前端
if (user == null) {
map.put("code", 404);
map.put("msg", "用户不存在!");
return "error/error";
}
map.put("user", user);
return "system/user/authRole";
}
/**
* 接口功能:用户登录
* 基本逻辑:校验前端信息-->校验验证码-->校验用户名、密码-->登录
*
* @param username 用户名
* @param password 密码
* @param captcha 验证码
* @param remember 是否记住登录状态 1-记住 | 0-不记住(记住登录状态后,关闭浏览器,不退出。不记住登录状态,关闭浏览器后即退出登录。只有手动退出才可以)
* @return JSON:登录结果
*/
@PostMapping(value = "/login")
@ResponseBody
@AnnotationSaveLoginLog
public BaseResult login(String username, String password,String remember) {
// 如果提交的信息有空信息
if (StrUtil.hasBlank(username, password)) {
return error("用户名、密码或验证码不能为空!");
}
// 前后端同域:使用session存储验证码。如果不同域:使用redis
HttpSession session = request.getSession();
// 如果验证码session不为空,表示以获取验证码
// 使用用户名和密码登录
SysUser user = userService.login(username, SecureUtil.md5(this.decrypt(password)));
// 如果用户不为空,则登录成功
if (null != user) {
// 账号状态正常
if (SystemCode.STATUS_N.getCode() != user.getStatus()) {
// 保持登录与否
StpUtil.login(user.getId(), "1".equals(remember));
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
return success("登录成功!", tokenInfo);
}
// 账号已被封禁
else
return error("该账号已被封禁,请联系系统管理员");
}
// 登录失败
else {
return error("登录失败:用户名或密码错误");
}
}
/**
* 接口功能:退出登录
*
* @return JSON:退出登录结果
*/
@PostMapping(value = "/logout")
@ResponseBody
public BaseResult logout() {
if (StpUtil.isLogin()) {
StpUtil.logout();
return success("已退出登录!");
}
return error("请求失败,未登录任何账户");
}
/**
* 接口功能:获取用户列表
*
* @param page 当前页面
* @param limit 每页请求数
* @param username 检索用户名
* @param account 检索电话或邮箱
* @return JSON:用户列表 | 错误信息
*/
@GetMapping(value = "/list")
@ResponseBody
public BaseResult getUserList(Integer page, Integer limit, String username, String account) {
Page<SysUser> userPage = userService.getPage(page, limit, username, account);
if (null != userPage) {
return success("查询成功", userPage.getRecords(), (int) userPage.getTotal());
} else {
return error("查询失败,用户不存在");
}
}
/**
* 接口功能:添加用户
* 基本逻辑:接收前端的用户信息-->校验与初始化新用户信息-->添加至[用户表]-->获取新添加用户的ID-->用户ID与角色ID添加至[用户角色关联表].
*
* @param user 用户信息
* @param roleIds 用户分配的角色信息
* @return JSON:成败结果
* @apiNote 启用注解[@AnnotationSaveReLog]保存请求日志
*/
@PostMapping(value = "/add")
@ResponseBody
@AnnotationSaveReLog
public BaseResult add(SysUser user, Integer[] roleIds) {
// 新建用户:其邮箱或手机号、密码不能为空,因为这是登录凭证.
if (null != user && null != user.getPassword() && (null != user.getLoginName() || null != user.getPhone())) {
// 解密
user.setPassword(SecureUtil.md5(this.decrypt(user.getPassword())));
// 添加
if (userService.save(user, roleIds) > 0) {
return success("新用户添加成功!");
} else {
return error("新用户添加失败,请重试!");
}
}
return error("用户信息(账号或手机号、密码)不能为空,请重试!");
}
/**
* 接口功能:更新用户基本信息(不含角色信息)
*
* @param user 用户信息
* @return JSON:成败结果
* @apiNote 启用注解[@AnnotationSaveReLog]保存请求日志
*/
@PostMapping(value = "/update")
@ResponseBody
@AnnotationSaveReLog
public BaseResult update(SysUser user) {
// 编辑用户基本信息:用户名、头像、性别、邮箱和手机号。
if (null != user && null != user.getId()) {
// 其他信息(状态、密码)不能通过此接口修改,故其应为null.
if (null == user.getStatus() && null == user.getPassword()) {
if (userService.save(user, null) > 0) {
return success("用户信息编辑成功!");
} else {
return error("用户信息编辑失败,请重试!");
}
} else {
return error("接口请求信息错误!");
}
} else {
return error("用户信息不能为空,请重试!");
}
}
/**
* 接口功能:删除用户
* 基本逻辑:删除该用户的角色信息[用户-角色关联表]-->删除用户
*
* @param userIds 用户ID列表
* @return JSON:成败
* @apiNote 启用注解[@AnnotationSaveReLog]保存请求日志
*/
@PostMapping(value = "/delete")
@ResponseBody
@AnnotationSaveReLog
public BaseResult delete(Integer[] userIds) {
try {
if (userService.deleteUserById(userIds)[0] > 0) {
return success("用户删除成功");
}
return error("用户删除失败");
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
/**
* 接口功能:给指定用户分配角色
*
* @param id 用户ID
* @param roleIds 角色信息列表
* @return 分配结果
*/
@PostMapping(value = "/authRole")
@ResponseBody
public BaseResult setRole(String id, Integer[] roleIds) {
try {
if (userService.setRoleForUser(Integer.parseInt(id), roleIds)) {
return success(200, "分配角色成功!");
}
return success("分配角色失败,请重试!");
} catch (Exception e) {
return error("发生错误:" + e.getMessage());
}
}
/**
* 接口功能:改变用户的状态
*
* @param status 新状态:1-正常 0-禁用
* @param userIds 用户ID列表
* @return 修改结果
*/
@PostMapping(value = "/changeStatus/{status}")
@ResponseBody
public BaseResult changeStatus(@PathVariable String status, Integer[] userIds) {
try {
int[] result = userService.changeStatus(Integer.parseInt(status), userIds);
// 没有失败
if (result[0] != 0 && result[1] == 0) {
return success(200, "用户状态修改成功!");
}
// 有成功的
else if (result[0] != 0) {
return success(200, result[0] + "个角色状态更新成功," + result[1] + "个失败!");
} else {
return success(500, "用户状态修改失败,请重试!");
}
} catch (Exception e) {
return error(500, "发生错误:" + e.getMessage());
}
}
/**
* 接口功能:重置密码
*
* @param userId 用户ID
* @param newPassword 新密码
* @param newPassword2 新密码
* @return 重置结果
*/
@PostMapping(value = "/resetPassword")
@ResponseBody
@AnnotationSaveReLog
public BaseResult resetPassword(String userId, String newPassword, String newPassword2) {
if (null == userId || null == newPassword || null == newPassword2) {
return error("输入信息有误,请重新输入!");
}
// 密码先解密
newPassword = this.decrypt(newPassword);
newPassword2 = this.decrypt(newPassword2);
// 密码相同
if (newPassword.equals(newPassword2)) {
SysUser user = new SysUser();
try {
user.setId(Integer.parseInt(userId));
// 密码MD5加密
user.setPassword(SecureUtil.md5(newPassword));
if (userService.save(user, null) > 0) {
return success("密码重置成功!");
} else {
error("密码重置失败,请重试!");
}
} catch (Exception e) {
return error(e.getMessage());
}
}
return error("密码重置失败,新密码不一致!");
}
/**
* 接口功能:获取指定角色所分配的用户列表(拥有/不拥有此角色)
*
* @param roleId 角色ID
* @param have 是否用于此角色:0-不拥有 | 1-拥有
* @return 用户列表
*/
@GetMapping("/listForRole/{have}/{roleId}")
@ResponseBody
public BaseResult getUserListForRole(@PathVariable("have") String have, @PathVariable("roleId") String roleId) {
try {
// 拥有 此角色
List<SysUser> userList;
if (have.equals("1")) {
userList = userService.getUserListByRoleId(Integer.parseInt(roleId));
}
// 不拥有 此角色
else {
userList = userService.getUserListByRoleIdNotIn(Integer.parseInt(roleId));
}
return success(200, "获取成功", userList);
} catch (Exception e) {
return error(e.getMessage());
}
}
/**
* 访问页面:用户个人信息管理 - 修改用户信息
*
* @return 跳转至编辑用户页面
*/
@RequestMapping("center/setting")
public String goSetting(ModelMap map) {
SysUser user = userService.getById(StpUtil.getLoginIdAsInt());
if (user != null) {
map.put("user", user);
return "system/userCenter/setting";
}
map.put("code", 404);
map.put("msg", "访问错误!");
return "error/error";
}
/**
* 访问页面:用户管理 - 编辑用户信息页面
*
* @return 跳转至编辑用户页面
*/
@RequestMapping("center/password")
public String goChangePassword() {
return "system/userCenter/password";
}
/**
* 接口功能:个人中心保存用户信息接口
*
* @return 结果
*/
@PostMapping(value = "/center/saveSetting")
@ResponseBody
public BaseResult saveSetting(SysUser user) {
user.setId(StpUtil.getLoginIdAsInt());
// if (userService.save(user, null) > 0) {
// return success(200, "修改成功");
// }
return error("修改失败,此接口暂不开放!");
}
/**
* 接口功能:个人中心修改用户密码接口
*
* @param oldPassword 旧密码
* @param newPassword1 新密码
* @param newPassword2 新密码
* @return 修改结果
*/
@PostMapping(value = "/center/changePassword")
@ResponseBody
public BaseResult changePassword(String oldPassword, String newPassword1, String newPassword2) {
if (!newPassword1.equals(newPassword2)) {
return error("新密码不一致!");
}
return error("修改失败,此接口暂不开放!");
}
/**
* 私有方法:解密密码
*
* @param encrypt 加密密码
* @return 解密密码
*/
private String decrypt(String encrypt) {
// 根据私钥生成新的对象
RSA rsa = new RSA(exciteConfig.getRsaPrivateKey(), null);
byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey);
return StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);
}
}
@@ -0,0 +1,107 @@
package com.zxdmy.excite.admin.controller.tool;
import com.zxdmy.excite.common.base.BaseController;
import com.zxdmy.excite.common.base.BaseResult;
import com.zxdmy.excite.common.entity.CaptchaDomain;
import com.zxdmy.excite.common.service.CaptchaService;
import com.zxdmy.excite.common.service.RedisService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.Random;
/**
* <p>
* 生成验证码接口
* </p>
*
* @author 沈松
* @since 2021-10-04 0004 21:16
*/
@Controller
@AllArgsConstructor
@RequestMapping("/tool/captcha")
public class CaptchaController extends BaseController {
private CaptchaService captchaService;
private RedisService redisUtils;
/**
* 获取验证码接口
*
* @param type 类型,char - 字符(默认) | math - 一位数算式 | math2 - 两位数算式
* @return 结果
*/
@GetMapping("/get")
@ResponseBody
public BaseResult getCaptcha(@RequestParam(value = "type", required = false, defaultValue = "char") String type) {
// 生成验证码实体
CaptchaDomain captchaDomain = captchaService.createGoogleCaptcha(type);
if (null != captchaDomain) {
// 将验证码保存至redis,包含前缀
redisUtils.set(captchaDomain.getToken(), captchaDomain.getCode(), 300L);
// 无用信息设空
captchaDomain.setText(null);
captchaDomain.setCode(null);
// 返回前端信息
return success("获取验证码成功", captchaDomain);
} else {
return error(400, "获取验证码失败,请重试。");
}
}
/**
* 直接输出图片
*
* @param type 类型,char - 字符(默认) | math - 一位数算式 | math2 - 两位数算式
*/
@GetMapping("/get/image")
public void getCaptchaImage(@RequestParam(value = "type", required = false, defaultValue = "math") String type) {
ServletOutputStream out = null;
Random random = new SecureRandom();
// int rand = random.nextInt(2);
CaptchaDomain captchaDomain;
// if (rand == 0) {
// 生成验证码实体
captchaDomain = captchaService.createGoogleCaptcha(type);
// } else {
// captchaDomain = captchaService.createHutoolCaptcha(160, 60);
// }
// 将验证码保存至session
HttpSession session = request.getSession();
session.setAttribute("captcha",captchaDomain.getCode());
// 输出图片
try {
response.setContentType("image/jpeg");
out = response.getOutputStream();
ImageIO.write(captchaDomain.getImage(), "jpg", out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
+194
View File
@@ -0,0 +1,194 @@
# 项目服务配置
server:
port: 8077 # 端口号
servlet:
context-path: / #项目访问路径
# 自定义的配置信息
excite:
name: Lt-Cloud # 项目名
allow-redis: true # 开启redis缓存
rsa-public-key: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxo7epYQqWu4Dgr52LZIn+Y9T3wf2t1NCnh+DpbY3CSBdTDbTyoJdMJm0cat3E7sWcCGqZb2U8Kdtg12ycybhiyuNIc9tXqjYZqBk4ocjuk2QshNFBWU9hgLioKCsbGnCvUY4bB/SuuKUGmNl+CRT7kcehU6u+i3ML88V2LQQKuQIDAQAB"
rsa-private-key: "MIICdAIBADANBgkqhkiG9w0BAQEFAASCAl4wggJaAgEAAoGBALGjt6lhCpa7gOCvnYtkif5j1PfB/a3U0KeH4OltjcJIF1MNtPKgl0wmbRxq3cTuxZwIaplvZTwp22DXbJzJuGLK40hz21eqNhmoGTihyO6TZCyE0UFZT2GAuKgoKxsacK9RjhsH9K64pQaY2X4JFPuRx6FTq76LcwvzxXYtBAq5AgMBAAECfxC5ld7K1gp+wJctnedLlKegE/Wf8prsCCputNKFHE/UecjEqfJ+yPAKEv9SlFuIKOdiuZWTbl+xqgJt9UTzCD8t3E7WTi6yejmhIw1WcmFnDvh7G/AFdfYSxKJ29ak+CEc93SlfaURtxYco71qbjkrUnJi9ALIei4k8i+cEe9ECQQDXq/fm+MiMFTwZEjAimEbu2SZ6E70hbva520WOCkyDDnAvYZ76jtR35rDcIrXEPGGIBKf527iYEpiRriji4CBlAkEA0tstVP+j0UdIb8K1DZ7jj9pKVsBH/5HxLGtE5qk5GnqVwyI3C39/Y1kGY2hkt+7HHQ/uCa29AraymOTntahZxQJBAIsmXTAc2+fl23yhi4UGkt2QJY8mJSTpHy8TFnFqm6sDKcaoSZaHiPZDVWDy1CvkeVj1CBvhc9xKQz3bDG41BTECQGLSPCW5BhLgQK+4Zlhy3h4eZXbQ+S1rPcfeolUkfFHPn/7rOzcVUyPBpn/SflnB++m//ITmu03ZSEzmAz6dHy0CQHRgMPKVPzi70ToLwsWcnhZT6fUv/rkyYIRn4K40l13HNM/6Jj0zEaSMw/Ib4wJx/9l3QgiazeUO0usylxfprug="
# Spring相关配置
spring:
# 数据库链接配置
datasource:
name: druidDataSource
type: com.alibaba.druid.pool.DruidDataSource
# 链接地址,这里需要修改自己的数据库IP和数据库名
url: jdbc:mysql://rm-gw0feo75m96osiy49ko.mysql.cn-chengdu.rds.aliyuncs.com:3306/lingtao_file_cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: admin_666888
password: Admin_666888
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
# 链接地址,这里需要修改自己的数据库IP和数据库名
# url: jdbc:mysql://127.0.0.1:3306/db_excite_cms?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
# username: chen # 数据库用户名
# password: 123456 # 数据库密码
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
# 连接驱动类名
# MySQL 8.x: com.mysql.cj.jdbc.Driver
# MySQL 5.x: com.mysql.jdbc.Driver
# driver-class-name: com.mysql.cj.jdbc.Driver
# 以下是开启监控相关配置
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: admin
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
redis:
# Redis服务器地址
host: localhost
# password:
# Redis服务器连接端口
port: 6379
# 连接超时时间(记得添加单位,Duration)
timeout: 100000ms
# Redis默认情况下有16个分片,这里配置具体使用的分片
database: 0
# 自定义属性:开启自定义前缀
allow-prefix: true
# 自定义属性:key的前缀
prefix: "com.zxdmy.excite:"
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制) 默认 8
max-active: 100
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
max-wait: -1ms
# 连接池中的最大空闲连接 默认 8
max-idle: 8
# 连接池中的最小空闲连接 默认 0
min-idle: 0
thymeleaf:
cache: false #开发时关闭缓存,不然没法实时看到页面
mode: LEGACYHTML5 #用非严格的HTML(标签不必严格遵守W3C标准)
encoding: UTF-8 # 编码格式
servlet:
content-type: text/html #内容类型为HTML
prefix: classpath:/templates/
suffix: .html
devtools:
restart:
enabled: true
livereload:
enabled: true
# Mybatis Plus 相关配置
mybatis-plus:
# 配置Mapper映射文件
mapper-locations: classpath*:/mapper/**/**Mapper.xml
# 实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.zxdmy.excite.system.entity;com.zxdmy.excite.common.entity
configuration:
# 自动驼峰命名
map-underscore-to-camel-case: true
auto-mapping-behavior: full
cache-enabled: false
# 打印SQL
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
global-config:
db-config:
# 主键类型 0:"数据库ID自增", 1:"用户输入ID", 2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: auto
# 驼峰下划线转换
table-underline: true
# 逻辑删除
logic-delete-value: 1
logic-not-delete-value: 0
# OpenApi 接口文档信息配置
springdoc:
api-docs:
# 开启或关闭swagger,关闭后,无法访问和查看接口文档
enabled: true
swagger-ui:
# 打开swagger的地址。当前:http://localhost:8181/swagger
path: /swagger
csrf:
enabled: true # 开启跨域访问
# 包扫描路径,多个package用英文逗号分隔。如果配置了分组,可以不用设置此项。
# packages-to-scan: com.zxdmy.excite.system.controller,com.zxdmy.excite.system.entity
# 分组配置,
group-configs:
# 分组名
- group: system
# 匹配方式1:按路径匹配
pathsToMatch: /system/**
# # 分组名
# - group: system
# # 匹配方式2:按包路径匹配;多个package用英文逗号分隔
# packagesToScan: com.zxdmy.excite.system
# Sa-Token配置(权限配置使用)
sa-token:
# token名称 (同时也是cookie名称)
token-name: "com.zxdmy.excite"
# token有效期,单位s 默认30天(2592000), -1代表永不过期
timeout: 259200
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒,-1表示永不过期
activity-timeout: 7200
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# token风格
token-style: uuid
# 是否输出操作日志
is-log: true
aliyun:
oss:
#你自己阿里云账户的endpoint
endpoint: oss-cn-hangzhou.aliyuncs.com
#你自己阿里云账户的accessKeyId
accessKeyId: LTAI5tE7wuNkeT9jZ42bQnyr
#你自己阿里云账户的accessKeySecret
accessKeySecret: NnutvWhKl4HbQFSad3HosYbCkEkbjN
#你自己阿里云账户的bucketName
bucketName: ltcloudfile
#Oss前缀路径
prefix_dir: yangcai365_design
region: oss-cn-hangzhou
#外网访问域名
endpointExternal: http://oss-cn-hangzhou.aliyuncs.com
#内网访问域名
endpointInternal: http://oss-cn-hangzhou-internal.aliyuncs.com
+40
View File
@@ -0,0 +1,40 @@
/*#####################################################
# #
# _oo0oo_ #
# o8888888o #
# 88" . "88 #
# (| -_- |) #
# 0\ = /0 #
# ___/`---'\___ #
# .' \\|???? |# '. #
# / \\|||? :? |||# \ #
# / _||||| -:- |||||- \ #
# |?? | \\\? -? #/ |?? | #
# | \_|? ''\---/''? |_/ | #
# \? .-\__? '-'? ___/-. / #
# ___'. .'? /--.--\? `. .'___ #
# ."" '<? `.___\_<|>_/___.' >' "". #
# | | :? `- \`.;`\ _ /`;.`/ - ` : | | #
# \? \ `_.?? \_ __\ /__ _/?? .-` /? / #
# =====`-.____`.___ \_____/___.-`___.-'===== #
# `=---=' #
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #
# #
# 佛祖保佑 永无BVG #
# #
#####################################################*/
┌─────────────────────────────────────────────┐
│ 🙏 南无阿弥陀佛 🙏 │
│ 🐛 永无bug 🎯 │
│ │
│ 🌸 Spring Boot 加持中... │
│ 🪷 代码清净无染 │
│ 📿 运行稳定如常 │
└─────────────────────────────────────────────┘
应用: ${spring.application.name}
端口: ${server.port}
环境: ${spring.profiles.active:default}
内存: ${java.vm.name} ${java.vm.version}
@@ -0,0 +1,4 @@
{
"code": 1,
"msg": "服务端清理缓存成功"
}
@@ -0,0 +1,245 @@
{
"homeInfo": {
"title": "首页",
"href": "page/welcome-1.html?t=1"
},
"logoInfo": {
"title": "LAYUI MINI",
"image": "images/logo.png",
"href": ""
},
"menuInfo": [
{
"title": "常规管理",
"icon": "fa fa-address-book",
"href": "",
"target": "_self",
"child": [
{
"title": "主页模板",
"href": "",
"icon": "fa fa-home",
"target": "_self",
"child": [
{
"title": "主页一",
"href": "page/welcome-1.html",
"icon": "fa fa-tachometer",
"target": "_self"
},
{
"title": "主页二",
"href": "page/welcome-2.html",
"icon": "fa fa-tachometer",
"target": "_self"
},
{
"title": "主页三",
"href": "page/welcome-3.html",
"icon": "fa fa-tachometer",
"target": "_self"
}
]
},
{
"title": "菜单管理",
"href": "page/menu.html",
"icon": "fa fa-window-maximize",
"target": "_self"
},
{
"title": "系统设置",
"href": "page/setting.html",
"icon": "fa fa-gears",
"target": "_self"
},
{
"title": "表格示例",
"href": "page/table.html",
"icon": "fa fa-file-text",
"target": "_self"
},
{
"title": "表单示例",
"href": "",
"icon": "fa fa-calendar",
"target": "_self",
"child": [
{
"title": "普通表单",
"href": "page/form.html",
"icon": "fa fa-list-alt",
"target": "_self"
},
{
"title": "分步表单",
"href": "page/form-step.html",
"icon": "fa fa-navicon",
"target": "_self"
}
]
},
{
"title": "登录模板",
"href": "",
"icon": "fa fa-flag-o",
"target": "_self",
"child": [
{
"title": "登录-1",
"href": "page/login-1.html",
"icon": "fa fa-stumbleupon-circle",
"target": "_blank"
},
{
"title": "登录-2",
"href": "page/login-2.html",
"icon": "fa fa-viacoin",
"target": "_blank"
},
{
"title": "登录-3",
"href": "page/login-3.html",
"icon": "fa fa-tags",
"target": "_blank"
}
]
},
{
"title": "异常页面",
"href": "",
"icon": "fa fa-home",
"target": "_self",
"child": [
{
"title": "404页面",
"href": "page/404.html",
"icon": "fa fa-hourglass-end",
"target": "_self"
}
]
},
{
"title": "其它界面",
"href": "",
"icon": "fa fa-snowflake-o",
"target": "",
"child": [
{
"title": "按钮示例",
"href": "page/button.html",
"icon": "fa fa-snowflake-o",
"target": "_self"
},
{
"title": "弹出层",
"href": "page/layer.html",
"icon": "fa fa-shield",
"target": "_self"
}
]
}
]
},
{
"title": "组件管理",
"icon": "fa fa-lemon-o",
"href": "",
"target": "_self",
"child": [
{
"title": "图标列表",
"href": "page/icon.html",
"icon": "fa fa-dot-circle-o",
"target": "_self"
},
{
"title": "图标选择",
"href": "page/icon-picker.html",
"icon": "fa fa-adn",
"target": "_self"
},
{
"title": "颜色选择",
"href": "page/color-select.html",
"icon": "fa fa-dashboard",
"target": "_self"
},
{
"title": "下拉选择",
"href": "page/table-select.html",
"icon": "fa fa-angle-double-down",
"target": "_self"
},
{
"title": "文件上传",
"href": "page/upload.html",
"icon": "fa fa-arrow-up",
"target": "_self"
},
{
"title": "富文本编辑器",
"href": "page/editor.html",
"icon": "fa fa-edit",
"target": "_self"
},
{
"title": "省市县区选择器",
"href": "page/area.html",
"icon": "fa fa-rocket",
"target": "_self"
}
]
},
{
"title": "其它管理",
"icon": "fa fa-slideshare",
"href": "",
"target": "_self",
"child": [
{
"title": "多级菜单",
"href": "",
"icon": "fa fa-meetup",
"target": "",
"child": [
{
"title": "按钮1",
"href": "page/button.html?v=1",
"icon": "fa fa-calendar",
"target": "_self",
"child": [
{
"title": "按钮2",
"href": "page/button.html?v=2",
"icon": "fa fa-snowflake-o",
"target": "_self",
"child": [
{
"title": "按钮3",
"href": "page/button.html?v=3",
"icon": "fa fa-snowflake-o",
"target": "_self"
},
{
"title": "表单4",
"href": "page/form.html?v=1",
"icon": "fa fa-calendar",
"target": "_self"
}
]
}
]
}
]
},
{
"title": "失效菜单",
"href": "page/error.html",
"icon": "fa fa-superpowers",
"target": "_self"
}
]
}
]
}
@@ -0,0 +1,254 @@
{
"code": 0,
"msg": "",
"count": 19,
"data": [
{
"authorityId": 1,
"authorityName": "系统管理",
"orderNumber": 1,
"menuUrl": null,
"menuIcon": "layui-icon-set",
"createTime": "2018/06/29 11:05:41",
"authority": null,
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 0,
"parentId": -1
},
{
"authorityId": 2,
"authorityName": "用户管理",
"orderNumber": 2,
"menuUrl": "system/user",
"menuIcon": null,
"createTime": "2018/06/29 11:05:41",
"authority": null,
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 0,
"parentId": 1
},
{
"authorityId": 3,
"authorityName": "查询用户",
"orderNumber": 3,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/07/21 13:54:16",
"authority": "user:view",
"checked": 0,
"updateTime": "2018/07/21 13:54:16",
"isMenu": 1,
"parentId": 2
},
{
"authorityId": 4,
"authorityName": "添加用户",
"orderNumber": 4,
"menuUrl": null,
"menuIcon": null,
"createTime": "2018/06/29 11:05:41",
"authority": "user:add",
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 1,
"parentId": 2
},
{
"authorityId": 5,
"authorityName": "修改用户",
"orderNumber": 5,
"menuUrl": null,
"menuIcon": null,
"createTime": "2018/06/29 11:05:41",
"authority": "user:edit",
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 1,
"parentId": 2
},
{
"authorityId": 6,
"authorityName": "删除用户",
"orderNumber": 6,
"menuUrl": null,
"menuIcon": null,
"createTime": "2018/06/29 11:05:41",
"authority": "user:delete",
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 1,
"parentId": 2
},
{
"authorityId": 7,
"authorityName": "角色管理",
"orderNumber": 7,
"menuUrl": "system/role",
"menuIcon": null,
"createTime": "2018/06/29 11:05:41",
"authority": null,
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 0,
"parentId": 1
},
{
"authorityId": 8,
"authorityName": "查询角色",
"orderNumber": 8,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/07/21 13:54:59",
"authority": "role:view",
"checked": 0,
"updateTime": "2018/07/21 13:54:58",
"isMenu": 1,
"parentId": 7
},
{
"authorityId": 9,
"authorityName": "添加角色",
"orderNumber": 9,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/06/29 11:05:41",
"authority": "role:add",
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 1,
"parentId": 7
},
{
"authorityId": 10,
"authorityName": "修改角色",
"orderNumber": 10,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/06/29 11:05:41",
"authority": "role:edit",
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 1,
"parentId": 7
},
{
"authorityId": 11,
"authorityName": "删除角色",
"orderNumber": 11,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/06/29 11:05:41",
"authority": "role:delete",
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 1,
"parentId": 7
},
{
"authorityId": 12,
"authorityName": "角色权限管理",
"orderNumber": 12,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/06/29 11:05:41",
"authority": "role:auth",
"checked": 0,
"updateTime": "2018/07/13 15:27:18",
"isMenu": 1,
"parentId": 7
},
{
"authorityId": 13,
"authorityName": "权限管理",
"orderNumber": 13,
"menuUrl": "system/authorities",
"menuIcon": null,
"createTime": "2018/06/29 11:05:41",
"authority": null,
"checked": 0,
"updateTime": "2018/07/13 15:45:13",
"isMenu": 0,
"parentId": 1
},
{
"authorityId": 14,
"authorityName": "查询权限",
"orderNumber": 14,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/07/21 13:55:57",
"authority": "authorities:view",
"checked": 0,
"updateTime": "2018/07/21 13:55:56",
"isMenu": 1,
"parentId": 13
},
{
"authorityId": 15,
"authorityName": "添加权限",
"orderNumber": 15,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/06/29 11:05:41",
"authority": "authorities:add",
"checked": 0,
"updateTime": "2018/06/29 11:05:41",
"isMenu": 1,
"parentId": 13
},
{
"authorityId": 16,
"authorityName": "修改权限",
"orderNumber": 16,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/07/13 09:13:42",
"authority": "authorities:edit",
"checked": 0,
"updateTime": "2018/07/13 09:13:42",
"isMenu": 1,
"parentId": 13
},
{
"authorityId": 17,
"authorityName": "删除权限",
"orderNumber": 17,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/06/29 11:05:41",
"authority": "authorities:delete",
"checked": 0,
"updateTime": "2018/06/29 11:05:41",
"isMenu": 1,
"parentId": 13
},
{
"authorityId": 18,
"authorityName": "登录日志",
"orderNumber": 18,
"menuUrl": "system/loginRecord",
"menuIcon": null,
"createTime": "2018/06/29 11:05:41",
"authority": null,
"checked": 0,
"updateTime": "2018/06/29 11:05:41",
"isMenu": 0,
"parentId": 1
},
{
"authorityId": 19,
"authorityName": "查询登录日志",
"orderNumber": 19,
"menuUrl": "",
"menuIcon": "",
"createTime": "2018/07/21 13:56:43",
"authority": "loginRecord:view",
"checked": 0,
"updateTime": "2018/07/21 13:56:43",
"isMenu": 1,
"parentId": 18
}
]
}
@@ -0,0 +1,127 @@
{
"code": 0,
"msg": "",
"count": 1000,
"data": [
{
"id": 10000,
"username": "user-0",
"sex": "女",
"city": "城市-0",
"sign": "签名-0",
"experience": 255,
"logins": 24,
"wealth": 82830700,
"classify": "作家",
"score": 57
},
{
"id": 10001,
"username": "user-1",
"sex": "男",
"city": "城市-1",
"sign": "签名-1",
"experience": 884,
"logins": 58,
"wealth": 64928690,
"classify": "词人",
"score": 27
},
{
"id": 10002,
"username": "user-2",
"sex": "女",
"city": "城市-2",
"sign": "签名-2",
"experience": 650,
"logins": 77,
"wealth": 6298078,
"classify": "酱油",
"score": 31
},
{
"id": 10003,
"username": "user-3",
"sex": "女",
"city": "城市-3",
"sign": "签名-3",
"experience": 362,
"logins": 157,
"wealth": 37117017,
"classify": "诗人",
"score": 68
},
{
"id": 10004,
"username": "user-4",
"sex": "男",
"city": "城市-4",
"sign": "签名-4",
"experience": 807,
"logins": 51,
"wealth": 76263262,
"classify": "作家",
"score": 6
},
{
"id": 10005,
"username": "user-5",
"sex": "女",
"city": "城市-5",
"sign": "签名-5",
"experience": 173,
"logins": 68,
"wealth": 60344147,
"classify": "作家",
"score": 87
},
{
"id": 10006,
"username": "user-6",
"sex": "女",
"city": "城市-6",
"sign": "签名-6",
"experience": 982,
"logins": 37,
"wealth": 57768166,
"classify": "作家",
"score": 34
},
{
"id": 10007,
"username": "user-7",
"sex": "男",
"city": "城市-7",
"sign": "签名-7",
"experience": 727,
"logins": 150,
"wealth": 82030578,
"classify": "作家",
"score": 28
},
{
"id": 10008,
"username": "user-8",
"sex": "男",
"city": "城市-8",
"sign": "签名-8",
"experience": 951,
"logins": 133,
"wealth": 16503371,
"classify": "词人",
"score": 14
},
{
"id": 10009,
"username": "user-9",
"sex": "女",
"city": "城市-9",
"sign": "签名-9",
"experience": 484,
"logins": 25,
"wealth": 86801934,
"classify": "词人",
"score": 75
}
]
}
@@ -0,0 +1,23 @@
{
"code": 0,
"msg": "",
"count": 16,
"data": [
{ "id":"001", "username":"张玉林", "sex":"女" },
{ "id":"002", "username":"刘晓军", "sex":"男" },
{ "id":"003", "username":"张恒", "sex":"男" },
{ "id":"004", "username":"朱一", "sex":"男" },
{ "id":"005", "username":"刘佳能", "sex":"女" },
{ "id":"006", "username":"晓梅", "sex":"女" },
{ "id":"007", "username":"马冬梅", "sex":"女" },
{ "id":"008", "username":"刘晓庆", "sex":"女" },
{ "id":"009", "username":"刘晓庆", "sex":"女" },
{ "id":"010", "username":"刘晓庆", "sex":"女" },
{ "id":"011", "username":"刘晓庆", "sex":"女" },
{ "id":"012", "username":"刘晓庆", "sex":"女" },
{ "id":"013", "username":"刘晓庆", "sex":"女" },
{ "id":"014", "username":"刘晓庆", "sex":"女" },
{ "id":"015", "username":"刘晓庆", "sex":"女" },
{ "id":"016", "username":"刘晓庆", "sex":"女" }
]
}
@@ -0,0 +1,10 @@
{
"code": 1,
"msg": "上传成功",
"data": {
"url": [
"../images/logo.png",
"../images/captcha.jpg"
]
}
}
@@ -0,0 +1,927 @@
/**
配色方案(如有需要,请自行配置)
*/
/**头部-配色*/
.layui-layout-admin .layui-header {
background-color: #1aa094 !important;
}
.layui-header > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover {
background-color: #197971 !important;
}
.layui-header .layuimini-header-content > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover {
background-color: #197971 !important;
}
/**logo-配色*/
.layui-layout-admin .layuimini-logo {
background-color: #ffffff !important;
}
/**左侧-配色*/
.layui-side.layui-bg-black, .layui-side.layui-bg-black > .layuimini-menu-left > ul {
background-color: #ffffff !important;
}
.layuimini-menu-left .layui-nav .layui-nav-child a:hover:not(.layui-this) {
background-color: #3b3f4b;
}
/**左侧菜单选中-配色*/
.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 {
background-color: #1aa094 !important;
}
/**头部样式 */
.layui-layout-admin .header {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
.layuimini-header-menu, .layui-header {
height: 60px !important;
}
.layuimini-header-menu > .layui-nav-item {
color: #1b1d21;
height: 60px !important;
line-height: 60px !important;
}
.layui-header > .layui-layout-right > .layui-nav-item {
height: 60px !important;
line-height: 60px !important;
}
.layui-layout-left {
left: 295px !important;
}
.layui-nav.layui-layout-left.layuimini-header-menu.layuimini-pc-show {
font-weight: bold;
transition: all .2s;
}
/**logo演示(通用) */
.layui-layout-admin .layuimini-logo {
font-weight: bold;
color: #ffffff !important;
height: 60px !important;
line-height: 60px !important;
overflow: hidden;
line-height: 64px;
transition: all .2s !important;
}
.layui-layout-admin .layuimini-logo img {
display: inline-block;
height: 40px;
vertical-align: middle;
}
.layui-layout-admin .layuimini-logo h1 {
display: inline-block;
margin: 0 0 0 12px;
color: #ffffff;
font-weight: 600;
font-size: 20px;
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
vertical-align: middle;
}
/**缩放工具(通用) */
.layuimini-tool {
position: absolute !important;
top: 0;
left: 235px;
width: 60px;
height: 100%;
line-height: 60px;
text-align: center;
color: #ffffff !important;
transition: all .2s;
}
/**缩放工具(缩放) */
.layuimini-tool i {
display: block;
color: #bbe3df;
width: 32px;
height: 32px;
line-height: 32px;
border-radius: 3px;
text-align: center;
margin-top: 15px;
cursor: pointer;
}
/**tab选项卡 */
.layuimini-tab {
margin: 0px;
overflow: hidden;
height: 100% !important;
}
.layuimini-tab .layui-tab-content {
height: calc(100% - 37px) !important;
}
.layuimini-tab .layui-tab-content .layui-tab-item {
height: 100%;
}
.layuimini-tab .layui-tab-content {
padding: 0px;
}
.layuimini-tab .layui-tab-title {
border: none;
border: 1px solid whitesmoke;
background-color: white;
}
.layuimini-tab .layui-tab-title li {
border-right: 1px solid whitesmoke;
color: dimgray;
}
.layuimini-tab .layui-tab-title .layui-tab-bar {
display: none;
}
.layuimini-tab .layui-tab-title .layui-this:after {
display: none;
}
.layuimini-tab .layui-tab-title .layuimini-tab-active {
display: inline-block;
background-color: lightgray;
width: 9px;
height: 9px;
border-radius: 30px;
margin-right: 5px;
}
.layuimini-tab .layui-tab-title .layui-this .layuimini-tab-active {
background-color: #1aa094;
}
.layuimini-tab > .layui-tab-title, .layuimini-tab > .close-box {
height: 35px !important;
}
.layuimini-tab > .layui-tab-title li, .layuimini-tab > .close-box li {
line-height: 35px !important;
}
.layuimini-tab .layui-tab-title span {
color: #616161;
}
.layuimini-tab .layui-tab-title .layui-this span {
color: #070707;
}
.layuimini-tab .layui-tab-title .layui-tab-close {
font-size: 12px !important;
width: 14px !important;
height: 14px !important;
line-height: 16px !important;
}
.layuimini-tab .layui-tab-title .layui-tab-close:hover {
border-radius: 4em;
background: #ff5722;
}
.layuimini-tab .layui-tab-title .disable-close + .layui-tab-close {
display: none;
}
.layuimini-tab .layui-tab-title .able-close + .layui-tab-close {
display: inline-block;
}
.layuimini-tab .layui-tab-control > li {
position: absolute;
top: 0px;
height: 35px;
line-height: 35px;
width: 35px;
text-align: center;
background-color: white;
border-top: whitesmoke 1px solid;
border-bottom: whitesmoke 1px solid;
}
.layuimini-tab .layuimini-tab-roll-left {
left: 0px;
border-right: whitesmoke 1px solid;
border-left: whitesmoke 1px solid;
}
.layuimini-tab .layuimini-tab-roll-right {
right: 35px;
border-left: 1px solid whitesmoke;
}
.layuimini-tab .layui-tab-tool {
right: 0px;
border-left: 1px solid whitesmoke;
}
.layuimini-tab .layui-tab-control .layui-tab-tool,
.layuimini-tab .layui-tab-control .layuimini-tab-roll-left,
.layuimini-tab .layui-tab-control .layuimini-tab-roll-right {
display: none;
}
.layuimini-tab.layui-tab-roll .layui-tab-control .layuimini-tab-roll-left,
.layuimini-tab.layui-tab-roll .layui-tab-control .layuimini-tab-roll-right {
display: block;
}
.layuimini-tab.layui-tab-roll .layui-tab-control .layuimini-tab-roll-right {
right: 0px;
border-right: 1px solid whitesmoke;
}
.layuimini-tab.layui-tab-roll .layui-tab-title {
padding-left: 35px;
padding-right: 35px;
}
.layuimini-tab.layui-tab-tool .layui-tab-control .layui-tab-tool {
display: block;
}
.layuimini-tab.layui-tab-tool .layui-tab-title {
padding-left: 0px;
padding-right: 35px;
}
.layuimini-tab.layui-tab-rollTool .layui-tab-title {
padding-left: 35px;
padding-right: 80px;
}
.layuimini-tab.layui-tab-rollTool .layui-tab-control .layuimini-tab-roll-left,
.layuimini-tab.layui-tab-rollTool .layui-tab-control .layuimini-tab-roll-right,
.layuimini-tab.layui-tab-rollTool .layui-tab-control .layui-tab-tool {
display: block;
}
.layuimini-tab .layui-tab-tool .layui-nav {
position: absolute;
height: 43px !important;
top: 0;
width: 100%;
height: 100%;
padding: 0;
background: 0 0;
}
.layuimini-tab .layui-tab-tool .layui-nav-item {
height: 35px;
}
.layuimini-tab .layui-tab-tool .layui-nav-bar {
display: none;
}
.layuimini-tab .layui-tab-tool .layui-nav-child {
left: auto;
top: 45px;
right: 3px;
width: 120px;
border: 1px solid whitesmoke;
}
.layuimini-tab .layui-tab-tool .layui-this a {
background-color: #009688;
}
.layuimini-tab-loading {
position: absolute;
display: none;
width: 100%;
height: calc(100% - 37px);
top: 37px;
z-index: 19;
background-color: #fff
}
.layuimini-tab-loading.close {
animation: close 1s;
-webkit-animation: close 1s;
animation-fill-mode: forwards;
}
/**左侧菜单栏 (通用) */
.layui-side.layui-bg-black {
transition: all .2s;
}
.layui-side.layui-bg-black > .layuimini-menu-left > ul {
transition: all .2s;
}
.layui-side.layui-bg-black > .layuimini-menu-left > ul > .layui-nav-item:first-child {
border-top: 1px solid #4b5461;
}
.layuimini-menu-left .layui-nav .layui-nav-item a {
height: 40px;
line-height: 40px;
padding-right: 30px;
}
.layuimini-menu-left .layui-nav .layui-nav-item > a {
padding-top: 5px;
padding-bottom: 5px;
}
.layuimini-menu-left .layui-nav .layui-nav-child .layui-nav-child {
background: 0 0 !important
}
.layuimini-menu-left .layui-nav .layui-nav-more {
right: 15px;
}
.layuimini-menu-left .layui-nav .layui-nav-item a:hover {
background-color: transparent !important;
}
.layuimini-menu-left .layui-nav {
background-color: transparent !important;
}
/**左侧菜单栏 (正常) */
.layui-layout-body .layui-nav-itemed .layui-nav-child a, .layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-child a {
padding-left: 35px;
}
.layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-child .layui-nav-child a {
padding-left: 45px;
}
.layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-child .layui-nav-child .layui-nav-child a {
padding-left: 55px;
}
.layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-child .layui-nav-child .layui-nav-child .layui-nav-child a {
padding-left: 65px;
}
.layui-layout-body .layuimini-menu-left .layui-nav .layui-nav-itemed > .layui-nav-child {
padding: 5px 0;
}
/**内容主体(通用) */
.layui-layout-admin .layui-body {
overflow: hidden;
bottom: 0px !important;
top: 60px !important;
transition: all .2s;
}
/**选择配色方案 */
.layuimini-color .color-title {
padding: 10px 0 10px 20px;
border-bottom: 1px solid #d9dada;
margin-bottom: 8px;
}
.layuimini-color .color-content {
padding: 10px 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;
}
/**其它 */
.layui-tab-item {
width: 100% !important;
height: 100% !important;
}
.layui-nav-item.layui-this {
background-color: #1b1d21;
}
.layui-width-height {
width: 100%;
height: 95%;
}
.layui-tab {
margin: 0 0 0 0;
z-index: 99999;
}
.text-center {
height: 30px !important;
line-height: 30px !important;
text-align: center !important;
}
.layui-nav {
padding: 0 !important;
}
.layui-nav .layui-this:after, .layui-nav-bar, .layui-nav-tree .layui-nav-itemed:after {
width: 0 !important;
height: 0 !important;
}
.layui-layout-admin .layui-side {
top: 60px !important;
}
.layui-tab-card {
box-shadow: 0px 0px 0px #888888;
border-bottom: 0;
}
/**自定义滚动条样式 */
::-webkit-scrollbar {
display: none
}
/*移动端遮罩层*/
.layuimini-make {
position: fixed;
left: 0;
right: 0;
bottom: 0;
top: 0;
z-index: 1000;
background: rgba(0, 0, 0, .5);
display: none;
}
.layuimini-mini .layui-header {
z-index: 1001;
}
/**初始化加载层*/
.layuimini-loader {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #ffffff;
z-index: 999999;
}
.layuimini-loader .layuimini-loader-inner {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #1E9FFF;
animation: spin 2s linear infinite;
}
.layuimini-loader .layuimini-loader-inner:before {
content: "";
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #1E9FFF;
animation: spin 3s linear infinite;
}
.layuimini-loader .layuimini-loader-inner:after {
content: "";
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #1E9FFF;
animation: spin 1.5s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
to {
transform: rotate(1turn);
}
}
/*系统设置*/
.layuimini-color .layui-word-aux {
position: absolute;
left: 60px;
top: 12px;
font-size: 12px;
}
.layuimini-color .layui-input-block {
margin-left: 15px;
min-height: 36px;
}
.layuimini-color .more-menu-list {
width: 100%;
margin-top: 30px;
}
.layuimini-color .more-menu-item:first-child {
border-top: 1px solid #e8e8e8;
}
.layuimini-color .more-menu-item .layui-icon {
font-size: 18px;
padding-right: 10px;
}
.layuimini-color .more-menu-item {
color: #595959;
height: 50px;
line-height: 50px;
font-size: 16px;
padding: 0 25px;
border-bottom: 1px solid #e8e8e8;
font-style: normal;
display: block;
}
.layuimini-color .more-menu-item:hover {
background-color: whitesmoke;
}
.layuimini-color .more-menu-item:after {
color: #8c8c8c;
right: 16px;
content: "\e602";
position: absolute;
font-family: layui-icon !important;
}
/**
鼠标右键
*/
.layuimini-tab-mousedown {
display: none;
width: 80px;
position: absolute;
top: 0px !important;
left: 0px !important;
}
.layuimini-tab-mousedown dd a {
padding: 0 5px;
color: #484545;
}
.layuimini-tab-make{
position: absolute;
top: 36px;
bottom: 0px;
width: 100%;
background: rgb(255, 255, 255,0);
padding: 0px;
overflow: hidden;
}
/**
菜单缩放
*/
.popup-tips .layui-layer-TipsG{
display: none;
}
.popup-tips.layui-layer-tips .layui-layer-content{
padding: 0;
}
.popup-tips .layui-nav-tree{
width: 150px;
border-radius: 10px;
}
/**左侧菜单字体间距*/
.layuimini-menu-left .layui-nav-item a span {
letter-spacing: 1px;
}
/**头部菜单字体间距*/
.layui-layout-admin .layui-header .layuimini-header-menu.layuimini-pc-show,.layui-layout-admin .layui-header .layuimini-header-menu.layuimini-mobile-show {
letter-spacing: 1px;
}
/**左侧菜单更多下拉样式*/
.layuimini-menu-left .layui-nav-more,.layuimini-menu-left-zoom .layui-nav-more {
font-family: layui-icon !important;
font-size: 12px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow: hidden;
width: auto;
height: auto;
line-height: normal;
border: none;
display: inline-block;
margin-top: -6px !important;
}
.layuimini-menu-left .layui-nav-child .layui-nav-more {
margin-top: -6px !important;
}
.layuimini-menu-left .layui-nav .layui-nav-mored,.layuimini-menu-left .layui-nav-itemed>a .layui-nav-more{
margin-top: -9px!important;
}
.layuimini-menu-left-zoom.layui-nav .layui-nav-mored,.layuimini-menu-left-zoom.layui-nav-itemed>a .layui-nav-more{
margin-top: -9px!important;
}
.layuimini-menu-left .layui-nav-more:before,.layuimini-menu-left-zoom .layui-nav-more:before {
content: "\e61a";
}
.layuimini-menu-left .layui-nav-itemed > a > .layui-nav-more,.layuimini-menu-left-zoom .layui-nav-itemed > a > .layui-nav-more {
transform: rotate(180deg);
-ms-transform: rotate(180deg);
-moz-transform: rotate(180deg);
-webkit-transform: rotate(180deg);
-o-transform: rotate(180deg);
width: 12px;
text-align: center;
border-style:none;
}
.layuimini-menu-left .layui-nav-itemed > a > .layui-nav-more:before,.layuimini-menu-left-zoom .layui-nav-itemed > a > .layui-nav-more:before {
content: '\e61a';
background-color: transparent;
display: inline-block;
vertical-align: middle;
}
/**修复左侧菜单字体不对齐的问题*/
.layuimini-menu-left .layui-nav-item a .fa,.layuimini-menu-left .layui-nav-item a .layui-icon{
width: 20px;
}
/**
PC版样式
*/
@media screen and (min-width: 1025px) {
/**头部样式(缩放) */
.layuimini-mini .layui-layout-left.layuimini-header-menu.layuimini-pc-show {
left: 155px !important;
}
/**logo演示(缩放) */
.layuimini-mini .layui-layout-admin .layuimini-logo {
width: 60px !important;
}
.layuimini-mini .layui-layout-admin .layuimini-logo h1 {
display: none;
}
/**左侧菜单栏(缩放) */
.layuimini-mini .layuimini-menu-left {
width: 80px !important;
}
.layuimini-mini .layui-side.layui-bg-black, .layuimini-mini .layuimini-menu-left > ul, .layuimini-mini .layuimini-menu-left > ul li i {
width: 60px !important;
}
.layuimini-mini .layuimini-menu-left > ul li span:first-child {
display: none;
}
.layuimini-mini .layuimini-menu-left > ul li span:last-child {
float: right;
right: 7px;
}
.layuimini-mini .layuimini-menu-left .layui-nav .layui-nav-item a {
height: 40px;
line-height: 40px;
padding-right: 0px !important;
}
/**内容主体(缩放) */
.layuimini-mini .layui-layout-admin .layui-body {
left: 60px !important;
}
.layuimini-mini .layuimini-tool {
left: 95px !important;
}
.layuimini-pc-show{
display: block;
}
.layuimini-mobile-show{
display: none;
}
/**菜单缩放*/
.layuimini-mini .layuimini-menu-left .layui-nav-more,.layuimini-mini .layuimini-menu-left .layui-nav-child{
display: none;!important;
}
}
/**
手机自适应样式
*/
@media screen and (max-width: 1024px) {
/**
修复低版本IOS不能滑动问题, 但还是有问题, 低版本IOS部分情况下子页面无法自适应
*/
.layuimini-tab .layui-tab-content .layui-tab-item {
-webkit-overflow-scrolling: touch;
overflow: scroll;
width: 100%;
height: 100%;
}
.layuimini-tab .layui-tab-content .layui-tab-item iframe {
height: 100%;
width: 100%;
}
.layuimini-pc-show{
display: none;
}
.layuimini-mobile-show{
display: block;
}
.layuimini-header-content {
left: 0;
}
.layui-layout-admin .layui-body .layui-tab-item.layui-show {
border-top: 1px solid #e2e2e2;
}
.layuimini-all .layui-layout-left.layuimini-header-menu {
left: 15px !important
}
.layuimini-mini .layui-layout-left.layuimini-header-menu {
left: 205px !important
}
.layui-layout-admin .layui-nav.layui-layout-right > li:not(.layuimini-setting) {
width: 40px !important;
}
.layui-layout-admin .layui-nav.layui-layout-right > li:not(.layuimini-setting) a {
padding: 0 15px;
}
.layuimini-all .layui-layout-admin .layui-body {
left: 0px !important;
}
.layuimini-mini .layui-layout-admin .layuimini-menu-left, .layuimini-mini .layui-header .layuimini-logo {
left: 0;
transition: left .2s;
z-index: 1001 !important;
}
.layuimini-all .layui-layout-admin .layuimini-menu-left, .layuimini-all .layui-header .layuimini-logo {
left: -200px;
transition: left .2s;
top: 0;
z-index: 1002;
}
.layuimini-mini .layui-layout-admin .layui-body {
left: 0!important;
transition: left .2s;
top: 0;
z-index: 998;
}
.layuimini-mini .layuimini-make {
display: block;
}
.layuimini-multi-module .layuimini-header-content .layuimini-tool {
display: none;
}
.layuimini-single-module .layuimini-header-content .layuimini-tool {
left: 15px;
}
.layuimini-mini .layuimini-site-mobile {
display: none !important;
}
.layuimini-site-mobile {
display: block !important;
position: fixed;
z-index: 100000;
bottom: 15px;
left: 15px;
width: 40px;
height: 40px;
line-height: 40px;
border-radius: 2px;
text-align: center;
background-color: rgba(0, 0, 0, .7);
color: #fff;
}
.layuimini-header-content {
z-index: 997;
}
/*修复UC之类的浏览器点击无效*/
.layuimini-make {
cursor: pointer;
}
.layuimini-site-mobile {
cursor: pointer;
}
}
@media screen and (max-width: 550px){
/**头部右侧数据*/
.layuimini-multi-module.layuimini-mini .layuimini-header-content .layui-layout-right {
display: none;
}
}
@@ -0,0 +1,275 @@
.main-body {
top: 50%;
left: 50%;
position: absolute;
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
overflow: hidden;
}
.login-main .login-bottom .center .item input {
display: inline-block;
width: 227px;
height: 22px;
padding: 0;
position: absolute;
border: 0;
outline: 0;
font-size: 14px;
letter-spacing: 0;
}
.login-main .login-bottom .center .item .icon-1 {
background: url(/images/icon-login.png) no-repeat 1px 0;
}
.login-main .login-bottom .center .item .icon-2 {
background: url(/images/icon-login.png) no-repeat -54px 0;
}
.login-main .login-bottom .center .item .icon-3 {
background: url(/images/icon-login.png) no-repeat -106px 0;
}
.login-main .login-bottom .center .item .icon-4 {
background: url(/images/icon-login.png) no-repeat 0 -43px;
position: absolute;
right: -10px;
cursor: pointer;
}
.login-main .login-bottom .center .item .icon-5 {
background: url(/images/icon-login.png) no-repeat -55px -43px;
}
.login-main .login-bottom .center .item .icon-6 {
background: url(/images/icon-login.png) no-repeat 0 -93px;
position: absolute;
right: -10px;
margin-top: 8px;
cursor: pointer;
}
.login-main .login-bottom .tip .icon-nocheck {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 2px;
border: solid 1px #9abcda;
position: relative;
top: 2px;
margin: 1px 8px 1px 1px;
cursor: pointer;
}
.login-main .login-bottom .tip .icon-check {
margin: 0 7px 0 0;
width: 14px;
height: 14px;
border: none;
background: url(/images/icon-login.png) no-repeat -111px -48px;
}
.login-main .login-bottom .center .item .icon {
display: inline-block;
width: 33px;
height: 22px;
}
.login-main .login-bottom .center .item {
width: 288px;
height: 35px;
border-bottom: 1px solid #dae1e6;
margin-bottom: 35px;
}
.login-main {
width: 428px;
position: relative;
float: left;
}
.login-main .login-top {
height: 87px;
background-color: #148be4;
border-radius: 12px 12px 0 0;
font-family: SourceHanSansCN-Regular;
font-size: 30px;
font-weight: 400;
font-stretch: normal;
letter-spacing: 0;
color: #fff;
line-height: 87px;
text-align: center;
overflow: hidden;
-webkit-transform: rotate(0);
-moz-transform: rotate(0);
-ms-transform: rotate(0);
-o-transform: rotate(0);
transform: rotate(0);
}
.login-main .login-top .bg1 {
display: inline-block;
width: 74px;
height: 74px;
background: #fff;
opacity: .1;
border-radius: 0 74px 0 0;
position: absolute;
left: 0;
top: 43px;
}
.login-main .login-top .bg2 {
display: inline-block;
width: 94px;
height: 94px;
background: #fff;
opacity: .1;
border-radius: 50%;
position: absolute;
right: -16px;
top: -16px;
}
.login-main .login-bottom {
width: 428px;
background: #fff;
border-radius: 0 0 12px 12px;
padding-bottom: 23px;
}
.login-main .login-bottom .center {
width: 288px;
margin: 0 auto;
padding-top: 30px;
padding-bottom: 0px;
position: relative;
}
.login-main .login-bottom .tip {
clear: both;
height: 16px;
line-height: 16px;
width: 288px;
margin: 0 auto;
}
body {
background: url(/images/bg-login.jpg) 0% 0% / cover no-repeat;
position: static;
font-size: 14px;
}
input::-webkit-input-placeholder {
color: #a6aebf;
}
input::-moz-placeholder { /* Mozilla Firefox 19+ */
color: #a6aebf;
}
input:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
color: #a6aebf;
}
input:-ms-input-placeholder { /* Internet Explorer 10-11 */
color: #a6aebf;
}
input:-webkit-autofill { /* 取消Chrome记住密码的背景颜色 */
-webkit-box-shadow: 0 0 0 1000px white inset !important;
}
html {
height: 100%;
}
.login-main .login-bottom .tip {
clear: both;
height: 16px;
line-height: 16px;
width: 288px;
margin: 0 auto;
}
.login-main .login-bottom .tip .login-tip {
font-family: MicrosoftYaHei;
font-size: 14px;
font-weight: 400;
font-stretch: normal;
letter-spacing: 0;
color: #9abcda;
cursor: pointer;
}
.login-main .login-bottom .tip .forget-password {
font-stretch: normal;
letter-spacing: 0;
color: #1391ff;
text-decoration: none;
position: absolute;
right: 62px;
}
.login-main .login-bottom .login-btn {
width: 288px;
height: 40px;
background-color: #1E9FFF;
border-radius: 16px;
margin: 24px auto 0;
text-align: center;
line-height: 40px;
color: #fff;
font-size: 14px;
letter-spacing: 0;
cursor: pointer;
border: none;
}
.login-main .login-bottom .center .item .validateImg {
position: absolute;
right: 1px;
cursor: pointer;
height: 36px;
border: 1px solid #e6e6e6;
}
.footer {
left: 0;
bottom: 0;
color: #fff;
width: 100%;
position: absolute;
text-align: center;
line-height: 30px;
padding-bottom: 10px;
text-shadow: #000 0.1em 0.1em 0.1em;
font-size: 14px;
}
.padding-5 {
padding: 5px !important;
}
.footer a, .footer span {
color: #fff;
}
@media screen and (max-width: 428px) {
.login-main {
width: 360px !important;
}
.login-main .login-top {
width: 360px !important;
}
.login-main .login-bottom {
width: 360px !important;
}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,143 @@
body {
background-image: url("/images/bg-login.jpg");
background-repeat: no-repeat;
background-size: cover;
min-height: 100vh;
}
body:before {
content: "";
background-color: rgba(0, 0, 0, .2);
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.login-wrapper {
max-width: 420px;
padding: 20px;
margin: 0 auto;
position: relative;
box-sizing: border-box;
z-index: 2;
}
.login-wrapper > .layui-form {
padding: 25px 30px;
background-color: #fff;
box-shadow: 0 3px 6px -1px rgba(0, 0, 0, 0.19);
box-sizing: border-box;
border-radius: 4px;
}
.login-wrapper > .layui-form > h2 {
color: #333;
font-size: 18px;
text-align: center;
margin-bottom: 25px;
}
.login-wrapper > .layui-form > .layui-form-item {
margin-bottom: 25px;
position: relative;
}
.login-wrapper > .layui-form > .layui-form-item:last-child {
margin-bottom: 0;
}
.login-wrapper > .layui-form > .layui-form-item > .layui-input {
height: 46px;
line-height: 1;
border-radius: 2px !important;
}
.login-wrapper .layui-input-icon-group > .layui-input {
padding-left: 46px;
}
.login-wrapper .layui-input-icon-group > .layui-icon {
width: 46px;
height: 46px;
line-height: 46px;
font-size: 20px;
color: #909399;
position: absolute;
left: 0;
top: 0;
text-align: center;
}
.login-wrapper > .layui-form > .layui-form-item.login-captcha-group {
padding-right: 135px;
}
.login-wrapper > .layui-form > .layui-form-item.login-captcha-group > .login-captcha {
height: 46px;
width: 120px;
cursor: pointer;
box-sizing: border-box;
border: 1px solid #e6e6e6;
border-radius: 2px !important;
position: absolute;
right: 0;
top: 0;
}
.login-wrapper > .layui-form > .layui-form-item > .layui-form-checkbox {
margin: 0 !important;
padding-left: 25px;
}
.login-wrapper > .layui-form > .layui-form-item > .layui-form-checkbox > .layui-icon {
width: 15px !important;
height: 15px !important;
}
.login-wrapper > .layui-form .layui-btn-fluid {
height: 48px;
line-height: 48px;
font-size: 16px;
border-radius: 2px !important;
}
.login-wrapper > .layui-form > .layui-form-item.login-oauth-group > a > .layui-icon {
font-size: 26px;
}
.login-copyright {
color: #eee;
padding-bottom: 20px;
text-align: center;
position: relative;
z-index: 1;
}
@media screen and (min-height: 550px) {
.login-wrapper {
margin: -250px auto 0;
position: absolute;
top: 50%;
left: 0;
right: 0;
width: 100%;
}
.login-copyright {
position: absolute;
bottom: 0;
right: 0;
left: 0;
}
}
.layui-btn {
background-color: #5FB878;
border-color: #5FB878;
}
.layui-link {
color: #5FB878 !important;
}
@@ -0,0 +1,114 @@
body {
margin: 15px 15px 15px 15px;
background: #f2f2f2;
}
.layuimini-container {
border: 1px solid #f2f2f2;
border-radius: 5px;
background-color: #ffffff
}
.layuimini-main {
margin: 10px 10px 10px 10px;
}
/**必填红点 */
.layuimini-form > .layui-form-item > .required:after {
content: '*';
color: red;
position: absolute;
margin-left: 4px;
font-weight: bold;
line-height: 1.8em;
top: 6px;
right: 5px;
}
.layuimini-form > .layui-form-item > .layui-form-label {
width: 120px !important;
}
.layuimini-form > .layui-form-item > .layui-input-block {
margin-left: 150px !important;
}
.layuimini-form > .layui-form-item > .layui-input-block > tip {
display: inline-block;
margin-top: 10px;
line-height: 10px;
font-size: 10px;
color: #a29c9c;
}
/**搜索框*/
.layuimini-container .table-search-fieldset {
margin: 0;
border: 1px solid #e6e6e6;
padding: 10px 20px 5px 20px;
color: #6b6b6b;
}
/**自定义滚动条样式 */
::-webkit-scrollbar {
width: 6px;
height: 6px
}
::-webkit-scrollbar-track {
background-color: transparent;
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
border-radius: 2em;
}
::-webkit-scrollbar-thumb {
background-color: #9c9da0;
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
border-radius: 2em
}
/* 树形选择器 */
.selectContent {
display: none;
position: absolute;
z-index: 999;
padding-bottom: 4px;
overflow-y: scroll;
max-height: 210px;
background-color: #FAFAFA;
border: 1px solid rgb(204, 204, 204);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.select-tree {
cursor: pointer;
}
.select-tree + .layui-edge {
position: absolute;
right: 10px;
top: 50%;
margin-top: -3px;
border-width: 6px;
border-top: 6px solid #c2c2c2;
}
/*树状图下拉框样式*/
.trg{
width: 0;
height: 0;
border-left: 3px solid transparent;
border-right: 3px solid transparent;
border-top: 6px solid black;;
position: absolute;
left:181px;
top:8px;
}
.org-select{
cursor: default;
z-index: -1;
width:200px;
}
@@ -0,0 +1,98 @@
/*头部右侧背景色 headerRightBg */
.layui-layout-admin .layui-header {
background-color: #ffffff !important;
}
/*头部右侧选中背景色 headerRightBgThis */
.layui-layout-admin .layui-header .layuimini-header-content > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover {
background-color: #e4e4e4 !important;
}
/*头部右侧字体颜色 headerRightColor */
.layui-layout-admin .layui-header .layui-nav .layui-nav-item a {
color: rgba(107, 107, 107, 0.7);
}
/**头部右侧下拉字体颜色 headerRightChildColor */
.layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child a {
color: rgba(107, 107, 107, 0.7) !important;
}
/*头部右侧鼠标选中 headerRightColorThis */
.layui-header .layuimini-menu-header-pc.layui-nav .layui-nav-item a:hover, .layui-header .layuimini-header-menu.layuimini-pc-show.layui-nav .layui-this a {
color: #565656 !important;
}
/*头部右侧更多下拉颜色 headerRightNavMore */
.layui-header .layui-nav .layui-nav-more {
border-top-color: rgba(160, 160, 160, 0.7) !important;
}
/*头部右侧更多下拉颜色 headerRightNavMore */
.layui-header .layui-nav .layui-nav-mored, .layui-header .layui-nav-itemed > a .layui-nav-more {
border-color: transparent transparent rgba(160, 160, 160, 0.7) !important;
}
/**头部右侧更多下拉配置色 headerRightNavMoreBg headerRightNavMoreColor */
.layui-header .layui-nav .layui-nav-child dd.layui-this a, .layui-header .layui-nav-child dd.layui-this, .layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child .layui-this a {
background-color: #154d96 !important;
color: #ffffff !important;
}
/*头部缩放按钮样式 headerRightToolColor */
.layui-layout-admin .layui-header .layuimini-tool i {
color: #565656;
}
/*logo背景颜色 headerLogoBg */
.layui-layout-admin .layuimini-logo {
background-color: #ffffff !important;
}
/*logo字体颜色 headerLogoColor */
.layui-layout-admin .layuimini-logo h1 {
color: rgb(191, 187, 187);
}
/*左侧菜单更多下拉样式 leftMenuNavMore */
.layuimini-menu-left .layui-nav .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-more {
border-top-color: rgb(191, 187, 187);
}
/*左侧菜单更多下拉样式 leftMenuNavMore */
.layuimini-menu-left .layui-nav .layui-nav-mored, .layuimini-menu-left .layui-nav-itemed > a .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-mored, .layuimini-menu-left-zoom.layui-nav-itemed > a .layui-nav-more {
border-color: transparent transparent rgb(191, 187, 187) !important;
}
/*左侧菜单背景 leftMenuBg */
.layui-side.layui-bg-black, .layui-side.layui-bg-black > .layuimini-menu-left > ul, .layuimini-menu-left-zoom > ul {
background-color: #ffffff !important;
}
/*左侧菜单选中背景 leftMenuBgThis */
.layuimini-menu-left .layui-nav-tree .layui-this, .layuimini-menu-left .layui-nav-tree .layui-this > a, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this a, .layuimini-menu-left-zoom.layui-nav-tree .layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-this > a, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this a {
background-color: #154d96 !important
}
/*左侧菜单子菜单背景 leftMenuChildBg */
.layuimini-menu-left .layui-nav-itemed > .layui-nav-child {
background-color: #ffffff !important;
}
/*左侧菜单字体颜色 leftMenuColor */
.layuimini-menu-left .layui-nav .layui-nav-item a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a {
color: rgb(40, 31, 31) !important;
}
/*左侧菜单选中字体颜色 leftMenuColorThis */
.layuimini-menu-left , .layuimini-menu-left .layui-nav .layui-this a, .layuimini-menu-left-zoom.layui-nav .layui-this a {
color: #fac45f !important;
}
.layui-nav .layui-nav-item a:hover, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a:hover{
color: #fac45f !important;
}
/**tab选项卡选中颜色 tabActiveColor */
.layuimini-tab .layui-tab-title .layui-this .layuimini-tab-active {
background-color: #1e9fff;
}
@@ -0,0 +1,136 @@
.layui-card {
border: 1px solid #f2f2f2;
border-radius: 5px;
}
.icon {
margin-right: 10px;
color: #1aa094;
}
.icon-cray {
color: #ffb800 !important;
}
.icon-blue {
color: #1e9fff !important;
}
.icon-tip {
color: #ff5722 !important;
}
.layuimini-qiuck-module {
text-align: center;
margin-top: 10px
}
.layuimini-qiuck-module a i {
display: inline-block;
width: 100%;
height: 70px;
line-height: 70px;
text-align: center;
border-radius: 2px;
font-size: 30px;
background-color: #F8F8F8;
color: #333;
transition: all .3s;
-webkit-transition: all .3s;
}
.layuimini-qiuck-module a cite {
position: relative;
top: 2px;
display: block;
color: #666;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
font-size: 14px;
}
.welcome-module {
width: 100%;
height: 115px;
}
.panel {
background-color: #fff;
border: 1px solid transparent;
border-radius: 3px;
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
box-shadow: 0 1px 1px rgba(0, 0, 0, .05)
}
.panel-body {
padding: 10px
}
.panel-title {
margin-top: 0;
margin-bottom: 0;
font-size: 12px;
color: inherit
}
.label {
display: inline;
padding: .2em .6em .3em;
font-size: 75%;
font-weight: 700;
line-height: 1;
color: #fff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: .25em;
margin-top: .3em;
}
.layui-red {
color: red
}
.main_btn > p {
height: 40px;
}
.layui-bg-number {
background-color: #F8F8F8;
}
.layuimini-notice:hover {
background: #f6f6f6;
}
.layuimini-notice {
padding: 7px 16px;
clear: both;
font-size: 12px !important;
cursor: pointer;
position: relative;
transition: background 0.2s ease-in-out;
}
.layuimini-notice-title, .layuimini-notice-label {
padding-right: 70px !important;
text-overflow: ellipsis !important;
overflow: hidden !important;
white-space: nowrap !important;
}
.layuimini-notice-title {
line-height: 28px;
font-size: 14px;
}
.layuimini-notice-extra {
position: absolute;
top: 50%;
margin-top: -8px;
right: 16px;
display: inline-block;
height: 16px;
color: #999;
}
Binary file not shown.
@@ -0,0 +1,33 @@
{"code":0,"msg":"PDF","count":1000,
"data":[
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""},
{"id":0,"username":"公司规章制度","city":"2026-01-02 00:00:00","sign":"张三","experience":255,"logins":24,"wealth":82830700,"classify":"PDF","score":""}
]}
Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long
@@ -0,0 +1,32 @@
/**
* date:2019/08/16
* author:Mr.Chung
* description:此处放layui自定义扩展
* version:2.0.4
*/
window.rootPath = (function (src) {
src = document.scripts[document.scripts.length - 1].src;
return src.substring(0, src.lastIndexOf("/") + 1);
})();
layui.config({
base: rootPath + "lay-module/",
version: true
}).extend({
miniAdmin: "layuimini/miniAdmin", // layuimini后台扩展
miniMenu: "layuimini/miniMenu", // layuimini菜单扩展
miniTab: "layuimini/miniTab", // layuimini tab扩展
miniTheme: "layuimini/miniTheme", // layuimini 主题扩展
miniTongji: "layuimini/miniTongji", // layuimini 统计扩展
step: 'step-lay/step', // 分步表单扩展
dtree: 'dtree/dtree', // 分步表单扩展
treetable: 'treetable-lay/treetable', //table树形扩展
treeTable: 'treetable-lay-3.x/treeTable', //table树形扩展
tableSelect: 'tableSelect/tableSelect', // table选择扩展
iconPickerFa: 'iconPicker/iconPickerFa', // fa图标选择扩展
echarts: 'echarts/echarts', // echarts图表扩展
echartsTheme: 'echarts/echartsTheme', // echarts图表主题扩展
wangEditor: 'wangEditor/wangEditor', // wangEditor富文本扩展
layarea: 'layarea/layarea', // 省市县区三级联动下拉选择器
});
@@ -0,0 +1,113 @@
/**************** 主题换肤 ****************/
/* 默认风格*/
.dtree-theme-item-this{background-color: #d2d2d2!important;}
.dtree-theme-item:hover{background-color: #eaeceb!important;}
.dtree-theme-item cite{font-size:12px!important;}
.dtree-theme-item:hover cite{color:#fe7786!important;}
.dtree-theme-dtreefont{font-size: 16px!important;}
.dtree-theme-ficon{color:#000!important;}
.dtree-theme-icon{color:orange!important;}
.dtree-theme-checkbox:hover{color:#fe7786!important;}
.dtree-theme-choose{color:#fe7786!important;}
/* layui主题风格*/
.dtree-layui-item-this{background: none!important;}
.dtree-layui-item:hover{background: none!important;}
.dtree-layui-item cite{font-size:14px!important;}
.dtree-layui-item:hover cite{opacity:0.5;filter:Alpha(opacity=50);text-decoration: underline;}
.dtree-layui-dtreefont{font-size: 18px!important;}
.dtree-layui-ficon{font-size: 18px!important;color:#393D49!important;}
.dtree-layui-icon{color:#666!important;}
.dtree-layui-checkbox:hover{color:#5FB878!important;}
.dtree-layui-choose{color:#5FB878!important;}
/* laySimple主题风格*/
.dtree-laySimple-item-this{background-color: #d2d2d2!important;}
.dtree-laySimple-item:hover{background-color: #eaeceb!important;}
.dtree-laySimple-item cite{font-size:12px!important;}
.dtree-laySimple-item:hover cite{color:#01AAED!important;}
.dtree-laySimple-dtreefont{font-size: 16px!important;}
.dtree-laySimple-ficon{font-size: 14px!important;color:#393D49!important;}
.dtree-laySimple-icon{color:#393D49!important;}
.dtree-laySimple-checkbox:hover{color:#01AAED!important;}
.dtree-laySimple-choose{color:#01AAED!important;}
/**************** 树基础 ****************/
/* 菜单栏*/
.dtree-menubar {padding-left: 10px;}
.dtree-menubar .layui-btn-group .layui-btn-sm{height: 20px;line-height: 20px;padding: 0 5px;font-size: 12px;}
.dtree-menubar .layui-btn-group .layui-btn-sm i{font-size: 12px!important;}
/* 工具栏*/
.dtree-toolbar{position: absolute;z-index: 940520;padding: 0;background-color: #eceaeb;}
.dtree-toolbar .layui-nav-child{position: static;}
.dtree-toolbar .layui-nav-child dd{cursor: pointer;}
.dtree-toolbar .layui-nav-child dd a i{font-size:16px;display: inline-block;margin: 0px 1px;color:#fe7786;}
.dtree-toolbar .layui-nav-child dd a i:hover{font-weight: bold;}
.dtree-toolbar .layui-nav-bar{display: none!important;}
.dtree-toolbar-tool{padding: 30px;}
.dtree-toolbar-fixed{position: absolute;right: 5px;top: 2px;font-style: normal;transition: all .3s;-webkit-transition: all .3s;}
/*.dtree-toolbar-fixed a{border:1px solid #fe7786;}*/
.dtree-toolbar-fixed a i{font-size:14px;display: inline-block;margin: 0px 1px;color:#fe7786;}
.dtree-toolbar-fixed a i:hover{opacity:0.8;filter:Alpha(opacity=80);}
/* 树基本*/
.dtree{width:260px;}
.dtree-nav-item{line-height:33px;padding-left:16px;}
.dtree-nav-ul-sid{display: none;}
.dtree-none-text{font-size: 12px;text-align: center;color: gray;}
/* 树线*/
.dtree-nav-first-line,.dtree-nav-line,.dtree-nav-last-line{position: relative;}
.dtree-nav-first-line:before{content:"";position: absolute;height: 0;border-left: 1px dotted #c0c4cc;}
.dtree-nav-first-line:after{content:"";position: absolute;height: 0;border-top: 1px dotted #c0c4cc;}
.dtree-nav-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 100%;border-left: 1px dotted #c0c4cc;}
.dtree-nav-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;}
.dtree-nav-last-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 17px;border-left: 1px dotted #c0c4cc;}
.dtree-nav-last-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;}
/* 图标及复选框*/
.dtreefont{cursor: pointer;}
.dtreefont-special{margin: 0 4px;}
.dtree-nav-checkbox-div{display: inline-block;}
.dtree-nav-checkbox-div>i{display: inline-block;margin: 0px 1px;}
.dtree-nav-checkbox-div>i:last-child{margin-right: 4px;}
.dtree-nav-checkbox-div>i:hover{opacity:0.8;filter:Alpha(opacity=80);}
/* 行 文字*/
.dtree-nav-div{display:block;vertical-align:top;position:relative;}
.dtree-nav-div cite{font-style: normal;cursor: pointer;}
.dtree-nav-div:hover cite{opacity:0.7;filter:Alpha(opacity=70);transition: all .3s;-webkit-transition: all .3s;}
/* 规则属性*/
.dtree-nav-show {display: block!important;}
.dtree-nav-hide {display: none!important;}
.dtree-nav-this {}
.dtree-icon-hide {opacity:0;filter:Alpha(opacity=0);}
.dtree-icon-null-open,.dtree-icon-null-close,.dtree-icon-null{margin: 0 2px;}
.dtree-disabled{cursor: not-allowed; color:#c2c2c2!important;}
.dtree-disabled:hover{color:#c2c2c2!important;}
.dtree-nav-div cite.dtree-disabled{font-style: normal; cursor: not-allowed; color:#c2c2c2!important;}
.dtree-nav-div>cite.dtree-disabled:hover{color:#c2c2c2!important;}
/** 下拉树属性*/
.dtree-select{position: absolute;max-height: 500px;height: 350px;overflow: auto;width: 99%;z-index: 123;display: none;border:1px solid silver;top: 42px;}
.dtree-select-show{display: block!important;}
.dtree-select-up{top: auto; bottom: 42px;}
/* 简单适配*/
@media screen and (max-width:1700px) and (min-width:1300px){
.dtree-nav-item {padding-left: 15px;}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,229 @@
@font-face {
font-family: 'dtreefont';
src: url('dtreefont.eot?x3m8fp');
src: url('dtreefont.eot?x3m8fp#iefix') format('embedded-opentype'),
url('dtreefont.ttf?x3m8fp') format('truetype'),
url('dtreefont.woff?x3m8fp') format('woff'),
url('dtreefont.svg?x3m8fp#dtreefont') format('svg');
font-weight: normal;
font-style: normal;
}
[class^="dtree-icon-"], [class*=" dtree-icon-"] {
/* use !important to prevent issues with browser extensions that change font */
font-family: 'dtreefont' !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
}
.dtree-icon-xiangxia1:before {
content: "\e771";
}
.dtree-icon-normal-file:before {
content: "\e60c";
}
.dtree-icon-xiangyou:before {
content: "\e78f";
}
.dtree-icon-ok-circle:before {
content: "\1005";
}
.dtree-icon-close1:before {
content: "\1006";
}
.dtree-icon-close-fill:before {
content: "\1007";
}
.dtree-icon-jian1:before {
content: "\e600";
}
.dtree-icon-jia1:before {
content: "\e601";
}
.dtree-icon-bianji:before {
content: "\e602";
}
.dtree-icon-yonghu:before {
content: "\e603";
}
.dtree-icon-shijian:before {
content: "\e606";
}
.dtree-icon-fuxuankuang-banxuan:before {
content: "\e607";
}
.dtree-icon-star:before {
content: "\e608";
}
.dtree-icon-wenjianjiazhankai:before {
content: "\e60e";
}
.dtree-icon-xiangmuxiaoxi:before {
content: "\e60f";
}
.dtree-icon-search2:before {
content: "\e615";
}
.dtree-icon-weibiaoti5:before {
content: "\e618";
}
.dtree-icon-layim-theme:before {
content: "\e61b";
}
.dtree-icon-shuye1:before {
content: "\e61e";
}
.dtree-icon-add-circle:before {
content: "\e61f";
}
.dtree-icon-xinxipilu:before {
content: "\e620";
}
.dtree-icon-set-sm:before {
content: "\e621";
}
.dtree-icon-about:before {
content: "\e623";
}
.dtree-icon-chart-screen:before {
content: "\e62a";
}
.dtree-icon-delete1:before {
content: "\e640";
}
.dtree-icon-share3:before {
content: "\e641";
}
.dtree-icon-youjian:before {
content: "\e642";
}
.dtree-icon-check:before {
content: "\e645";
}
.dtree-icon-close:before {
content: "\e646";
}
.dtree-icon-favorfill:before {
content: "\e64b";
}
.dtree-icon-favor:before {
content: "\e64c";
}
.dtree-icon-fuxuankuangxuanzhong:before {
content: "\e652";
}
.dtree-icon-fenguangbaobiao:before {
content: "\e655";
}
.dtree-icon-jian:before {
content: "\e656";
}
.dtree-icon-jia:before {
content: "\e657";
}
.dtree-icon-fenzhijigou:before {
content: "\e658";
}
.dtree-icon-roundcheckfill:before {
content: "\e659";
}
.dtree-icon-roundcheck:before {
content: "\e65a";
}
.dtree-icon-roundclosefill:before {
content: "\e65b";
}
.dtree-icon-roundclose:before {
content: "\e65c";
}
.dtree-icon-roundrightfill:before {
content: "\e65d";
}
.dtree-icon-roundright:before {
content: "\e65e";
}
.dtree-icon-like:before {
content: "\e66c";
}
.dtree-icon-samefill:before {
content: "\e671";
}
.dtree-icon-same:before {
content: "\e672";
}
.dtree-icon-evaluate:before {
content: "\e674";
}
.dtree-icon-circle1:before {
content: "\e687";
}
.dtree-icon-radio:before {
content: "\e688";
}
.dtree-icon-caidan_xunzhang:before {
content: "\e68e";
}
.dtree-icon-pulldown:before {
content: "\e6a0";
}
.dtree-icon-pullup:before {
content: "\e6a1";
}
.dtree-icon-refresh:before {
content: "\e6a4";
}
.dtree-icon-qrcode1:before {
content: "\e6b0";
}
.dtree-icon-profile1:before {
content: "\e6b7";
}
.dtree-icon-home1:before {
content: "\e6b8";
}
.dtree-icon-homefill:before {
content: "\e6bb";
}
.dtree-icon-roundaddfill:before {
content: "\e6d8";
}
.dtree-icon-roundadd:before {
content: "\e6d9";
}
.dtree-icon-fuxuankuang:before {
content: "\e6f2";
}
.dtree-icon-wefill:before {
content: "\e6f5";
}
.dtree-icon-sort:before {
content: "\e701";
}
.dtree-icon-repair:before {
content: "\e738";
}
.dtree-icon-shujudaping:before {
content: "\e742";
}
.dtree-icon-dian:before {
content: "\e7a5";
}
.dtree-icon-search_list_light:before {
content: "\e807";
}
.dtree-icon-round_list_light:before {
content: "\e82b";
}
.dtree-icon-star-fill:before {
content: "\e832";
}
.dtree-icon-rate:before {
content: "\e833";
}
.dtree-icon-move-up:before {
content: "\ea47";
}
.dtree-icon-move-down:before {
content: "\ea48";
}
@@ -0,0 +1,80 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="icomoon" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="896" descent="-128" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" d="" />
<glyph unicode="&#x1005;" glyph-name="ok-circle" d="M516.152-63.152c-60.696 0-119.595 11.895-175.057 35.353-53.555 22.652-101.646 55.073-142.936 96.365-41.291 41.291-73.713 89.382-96.364 142.936-23.458 55.462-35.353 114.36-35.353 175.056s11.895 119.595 35.353 175.057c22.652 53.555 55.073 101.646 96.364 142.936 41.29 41.291 89.382 73.713 142.936 96.364 55.462 23.458 114.36 35.353 175.057 35.353s119.595-11.895 175.057-35.353c53.555-22.652 101.645-55.073 142.936-96.364s73.712-89.381 96.364-142.936c23.459-55.462 35.353-114.36 35.353-175.057s-11.894-119.594-35.353-175.056c-22.652-53.555-55.072-101.645-96.364-142.936s-89.382-73.713-142.936-96.365c-55.461-23.458-114.36-35.353-175.057-35.353zM516.152 774.87c-214.116 0-388.312-174.196-388.312-388.312s174.196-388.312 388.312-388.312 388.312 174.196 388.312 388.312-174.195 388.312-388.312 388.312zM434.749 132.831l-225.256 225.257 79.595 79.594 145.661-145.661 308.47 308.468 79.594-79.595z" />
<glyph unicode="&#x1006;" glyph-name="close1" d="M783.483 701.249l-271.483-271.474-271.483 271.474c-10.082 10.083-26.429 10.083-36.51 0-10.083-10.082-10.083-26.429 0-36.509l271.481-271.475-271.48-271.477c-10.083-10.081-10.083-26.428 0-36.508 10.082-10.082 26.429-10.082 36.51 0l271.482 271.475 271.483-271.475c10.082-10.082 26.429-10.082 36.513 0 10.081 10.083 10.081 26.428 0 36.508l-271.486 271.477 271.485 271.474c10.081 10.083 10.081 26.429 0 36.509-10.083 10.082-26.431 10.082-36.512 0.001z" />
<glyph unicode="&#x1007;" glyph-name="close-fill" d="M512 822.022c-217.475 0-394.423-176.949-394.423-394.423s176.948-394.422 394.423-394.422c217.473 0 394.422 176.948 394.422 394.422s-176.949 394.423-394.422 394.423zM702.229 270.93c8.031-8.031 8.031-21.052 0-29.083s-21.052-8.031-29.083 0l-161.145 161.146-161.146-161.145c-8.031-8.031-21.052-8.031-29.083 0s-8.031 21.052 0 29.083l161.146 161.146-161.145 161.145c-8.031 8.031-8.031 21.052 0 29.083s21.052 8.031 29.083 0l161.146-161.146 161.144 161.146c8.031 8.031 21.052 8.031 29.083 0s8.031-21.052 0-29.083l-161.146-161.146 161.146-161.146z" />
<glyph unicode="&#xe600;" glyph-name="jian1" d="M512.135 776.711c-216.356 0-392.38-176.025-392.38-392.38s176.025-392.38 392.38-392.38c216.356 0 392.381 176.024 392.381 392.38s-176.026 392.38-392.381 392.38zM512.135 40.996c-189.317 0-343.333 154.017-343.333 343.335s154.016 343.333 343.333 343.333c189.318 0 343.333-154.016 343.333-343.333 0-189.319-154.016-343.335-343.333-343.335zM659.278 408.854h-294.285c-13.556 0-24.524-10.968-24.524-24.523 0-13.531 10.968-24.524 24.524-24.524h294.285c13.556 0 24.524 10.993 24.524 24.524 0 13.555-10.968 24.523-24.524 24.523z" />
<glyph unicode="&#xe601;" glyph-name="jia1" d="M511.515 775.812c-215.609 0-391.030-175.421-391.030-391.031s175.421-391.031 391.031-391.031c215.611 0 391.031 175.42 391.031 391.031s-175.42 391.031-391.032 391.031zM511.515 42.63c-188.665 0-342.151 153.484-342.151 342.151s153.486 342.152 342.151 342.152c188.666 0 342.153-153.486 342.153-342.152s-153.487-342.151-342.153-342.151zM658.152 409.221h-122.196v122.197c0 13.508-10.931 24.439-24.44 24.439s-24.439-10.931-24.439-24.439v-122.197h-122.196c-13.511 0-24.44-10.931-24.44-24.439 0-13.484 10.931-24.439 24.44-24.439h122.195v-122.197c0-13.484 10.931-24.439 24.439-24.439 13.51 0 24.44 10.955 24.44 24.439v122.197h122.196c13.51 0 24.44 10.955 24.44 24.439 0.001 13.509-10.93 24.44-24.439 24.44z" />
<glyph unicode="&#xe602;" glyph-name="bianji" d="M468.551 64.961l402.683 477.563c25.851 30.583 21.845 76.822-8.738 102.551l-148.306 125.247c-30.583 25.851-76.822 21.845-102.551-8.738l-402.804-477.563-23.301-254.62c-0.85-9.345 2.913-18.569 10.073-24.637s16.869-8.253 25.972-5.825l246.974 66.021zM582.512 636.825l170.757-143.937-291.635-345.885-170.757 144.058 291.635 345.763zM676.569 725.783l148.427-125.125c6.068-5.098 6.796-14.442 1.699-20.511l-36.166-42.962-170.636 143.937 36.166 42.962c5.098 6.068 14.563 6.796 20.511 1.699zM246.701 65.447l15.899 173.185 152.189-128.281-168.087-44.905z" />
<glyph unicode="&#xe603;" glyph-name="yonghu" d="M701.812 584.689c0-99.168-80.394-179.563-179.568-179.563-99.164 0-179.556 80.39-179.556 179.563 0 99.168 80.395 179.564 179.556 179.564 99.174 0 179.568-80.39 179.568-179.564zM780.721 159.555c0-123.196-115.728-140.102-258.479-140.102-142.74 0-258.468 16.894-258.468 140.094 0 123.192 115.726 223.067 258.479 223.067 142.749 0.003 258.468-99.869 258.468-223.056z" />
<glyph unicode="&#xe606;" glyph-name="shijian" d="M512 839.111c-250.311 0-455.111-204.8-455.111-455.111s204.8-455.111 455.111-455.111 455.111 204.8 455.111 455.111-204.8 455.111-455.111 455.111M512-14.222c-221.867 0-398.222 176.355-398.222 398.222s176.355 398.222 398.222 398.222 398.222-176.355 398.222-398.222-176.355-398.222-398.222-398.222M512 384v284.444h-56.889v-341.333h284.445v56.889z" />
<glyph unicode="&#xe607;" glyph-name="fuxuankuang-banxuan" d="M229.8 5.4c-50 0-90.7 40.7-90.7 90.7v284.3l752.9 1.5v-285.8c0-50-40.7-90.7-90.7-90.7h-571.5zM781.438-6h-535.875c-66.188 0-120.094 53.906-120.094 120.094v535.875c0 66.188 53.906 120.094 120.094 120.094h535.781c66.188 0 120.094-53.906 120.094-120.094v-535.875c0.094-66.188-53.813-120.094-120-120.094zM245.563 699.937c-27.563 0-49.969-22.406-49.969-49.969v-535.875c0-27.563 22.406-49.969 49.969-49.969h535.781c27.563 0 49.969 22.406 49.969 49.969v535.875c0 27.563-22.406 49.969-49.969 49.969h-535.781zM245.563 699.937" />
<glyph unicode="&#xe608;" glyph-name="star" d="M749.625-84.153c-15.673 0-31.246 3.883-45.084 11.307l-192.526 103.637-192.469-103.609c-31.204-16.64-70.315-14.393-99.044 5.305-29.511 20.338-44.743 55.922-38.841 90.695l37.703 225.252-162.702 162.475c-25.003 24.889-33.465 60.985-22.059 94.194 11.349 32.91 40.064 56.576 74.965 61.753l221.326 32.896 96.128 199.58c15.488 32.085 48.853 52.807 84.992 52.807 36.167 0 69.518-20.736 84.964-52.807l96.156-199.58 221.298-32.91c34.873-5.163 63.616-28.8 74.98-61.696 11.392-33.28 2.944-69.362-22.030-94.251l-162.759-162.46 37.746-225.28c5.845-34.773-9.387-70.357-38.812-90.638-15.986-10.908-34.617-16.668-53.931-16.668zM512.014 91.548c4.636 0 9.273-1.138 13.483-3.385l205.938-110.862c12.373-6.642 28.316-5.803 39.936 2.133 11.392 7.836 17.124 21.006 14.891 34.304l-40.164 239.758c-1.508 9.088 1.451 18.332 7.964 24.832l173.141 172.843c9.458 9.429 12.686 23.026 8.405 35.484-4.38 12.672-15.701 21.874-29.525 23.922l-236.217 35.129c-9.316 1.38-17.365 7.296-21.447 15.787l-102.699 213.148c-6.030 12.53-19.257 20.608-33.707 20.608s-27.691-8.092-33.764-20.622l-102.642-213.134c-4.082-8.491-12.132-14.407-21.447-15.787l-236.231-35.129c-13.625-2.034-25.202-11.435-29.54-23.993-4.267-12.416-1.024-25.984 8.434-35.399l173.113-172.857c6.514-6.5 9.472-15.744 7.964-24.832l-40.135-239.744c-2.247-13.312 3.484-26.439 14.976-34.361 11.435-7.836 27.349-8.775 39.95-2.062l205.852 110.834c4.196 2.247 8.832 3.385 13.468 3.385zM200.32 439.211c-6.841 0-12.885 4.964-14.023 11.947-1.252 7.751 4.011 15.061 11.762 16.313l9.444 1.536c7.794 1.337 15.061-4.011 16.313-11.762s-4.011-15.061-11.762-16.313l-9.444-1.536c-0.754-0.128-1.536-0.185-2.29-0.185zM252.544 447.687c-6.684 0-12.644 4.722-13.938 11.534-1.493 7.708 3.556 15.175 11.264 16.654l153.927 29.696 58.055 133.148c3.157 7.182 11.548 10.496 18.716 7.353 7.211-3.143 10.51-11.52 7.367-18.716l-61.056-140.018c-1.877-4.295-5.746-7.396-10.354-8.277l-161.28-31.118c-0.91-0.185-1.806-0.256-2.702-0.256z" />
<glyph unicode="&#xe60c;" glyph-name="normal-file" d="M192 800v-832h640v620.992l-8.992 10.016-192 192-10.016 8.992h-428.992zM256 736h320v-192h192v-512h-512v704zM640 689.984l82.016-81.984h-82.016v82.016z" />
<glyph unicode="&#xe60e;" glyph-name="wenjianjiazhankai" d="M333.206 491.863h504.3v56.012c-0.012 61.888-50.179 112.055-112.066 112.067h-224.113c0 61.893-50.174 112.067-112.067 112.067v0h-224.133c-61.888-0.012-112.055-50.179-112.067-112.066v-560.313c0-14.289 2.964-27.837 7.832-40.39l160.246 320.535c36.685 55.779 50.191 112.088 112.067 112.088zM893.539 435.83h-504.279c-61.897 0-75.424-56.309-112.067-112.067l-168.121-280.145c0-61.897 50.191-56.033 112.067-56.033h504.3c61.876 0 75.403-11.96 112.067 56.033l168.079 280.145c0 0.006 0 0.014 0 0.021 0 61.881-50.164 112.045-112.045 112.045v0z" />
<glyph unicode="&#xe60f;" glyph-name="xiangmuxiaoxi" horiz-adv-x="1152" d="M578.575 733.268l-3.164 1.919c6.997-9.237 6.804-5.094 3.164-1.919v0zM177.111 329.683l358.478-161.157c31.662-14.924 45.32-14.924 79.641 0l358.479 161.158c17.676 8.218 24.14 47.012 24.14 67.918-23.022-11.541-55.653-27.978-56.318-28.158l-366.12-168.771-366.123 168.771c1.239-0.787-32.389 14.441-56.317 28.158 0-20.425 5.136-57.829 24.14-67.92v0zM575.411 31.842l-366.123 168.829c1.239-0.786-32.389 14.442-56.317 28.099 0-20.424 5.136-57.828 24.14-67.92l358.478-161.094c31.662-14.985 45.32-14.985 79.641 0l358.479 161.096c17.676 8.278 24.14 47.074 24.14 67.92-23.022-11.48-55.653-27.975-56.318-28.099l-366.12-168.831zM177.111 498.453l358.478-161.157c31.662-14.925 45.32-14.925 79.641 0l358.479 161.157c26.376 12.327 27.284 64.656 0 79.581l-358.478 189.27c-28.158 16.708-47.979 15.831-79.641 0l-358.479-189.27c-27.283-17.584-28.158-64.656 0-79.581v0zM575.411 735.187c0.374-0.122 0.702-0.314 0.97-0.522l365.152-196.392-366.122-154.329-366.123 154.328 366.123 196.915z" />
<glyph unicode="&#xe615;" glyph-name="search2" d="M439.323 120.522c-49.28 0-97.098 9.657-142.127 28.7-43.48 18.389-82.523 44.706-116.044 78.226s-59.841 72.561-78.231 116.039c-19.043 45.028-28.7 92.845-28.7 142.123 0 49.284 9.656 97.105 28.7 142.133 18.389 43.479 44.71 82.52 78.232 116.039 33.519 33.515 72.563 59.833 116.044 78.219 45.027 19.040 92.846 28.695 142.126 28.695s97.099-9.654 142.127-28.695c43.481-18.386 82.526-44.704 116.045-78.221 33.521-33.518 59.842-72.56 78.231-116.039 19.042-45.029 28.7-92.849 28.7-142.133 0-49.278-9.657-97.095-28.702-142.123-18.389-43.477-44.708-82.52-78.229-116.039s-72.564-59.839-116.044-78.227c-45.028-19.043-92.847-28.698-142.128-28.698zM439.323 797.483c-171.976 0-311.888-139.906-311.888-311.875s139.912-311.874 311.888-311.874 311.888 139.907 311.888 311.874-139.912 311.875-311.888 311.875zM890.678-48.735c-22.122 0-42.904 8.562-58.542 24.115l-157.464 152.645 37.039 38.206 157.888-153.059c5.607-5.607 13.092-8.693 21.078-8.693 7.983 0 15.465 3.087 21.071 8.691 5.616 5.622 8.716 13.127 8.716 21.123 0 7.981-3.092 15.463-8.703 21.068l-0.302 0.307-152.746 157.563 38.208 37.035 152.612-157.427c15.571-15.638 24.145-36.423 24.145-58.549 0-22.196-8.626-43.055-24.287-58.736-15.668-15.666-36.515-24.288-58.714-24.288zM281.015 327.245c-42.34 42.321-65.653 98.584-65.644 158.421 0.008 59.818 23.319 116.075 65.638 158.408l37.635-37.62c-66.607-66.63-66.61-175.001-0.007-241.577l-37.621-37.632z" />
<glyph unicode="&#xe618;" glyph-name="weibiaoti5" horiz-adv-x="1025" d="M458.632 712.273c12.75-33.75 48.75-57 86.25-58.5 10.5 0 12 0 21.75 0h354c31.5 0 57.75-27 57.75-58.5v-523.5c0-31.5-26.25-58.5-57.75-58.5h-808.5c-31.5 0-57.75 27-57.75 58.5v640.5c0 31.5 26.25 58.5 57.75 58.5h288.75M400.882 770.023v0c27.75-1.5 50.25-35.25 57.75-58.5" />
<glyph unicode="&#xe61b;" glyph-name="layim-theme" d="M958.831 538.643l-218.171 154.111h-100.54l-3.978-9.333c-0.371-0.872-38.022-86.861-124.773-88.667-35.692 0.764-67.207 15.5-93.681 43.828-20.659 22.106-30.375 44.584-30.457 44.777l-3.955 9.394h-100.588l-218.171-154.11 104.802-158.887 89.957 65.020-19.016-368.053h542.826l-19.016 368.052 89.957-65.019 104.803 158.887zM730.105 507.204l20.655-399.781h-478.174l20.656 399.781-115.939-83.798-36.324 55.070 159.44 111.642-19.276 30.639-160.079-112.090-14.548 22.056 185.921 131.33h71.078c5.332-10.044 15.434-26.78 30.952-43.581 32.048-34.696 72.257-53.486 116.346-54.411v-0.032c0.204 0.003 0.406 0.012 0.61 0.016 0.204-0.003 0.406-0.013 0.61-0.016v0.032c44.074 0.925 84.359 19.704 116.567 54.38 15.624 16.821 25.815 33.58 31.188 43.612h71.121l185.921-131.33-14.548-22.056-160.080 112.088-19.276-30.639 159.44-111.642-36.324-55.070-115.939 83.8z" />
<glyph unicode="&#xe61e;" glyph-name="shuye1" d="M515.2 734.4c1.3 0 2.4-0.2 3.4-0.6 27-11 216.1-231.5 212.2-426.3-3.2-163.8-151.2-176.9-198.1-176.9-8.9 0-14.1 0.5-14.1 0.5s-258.5 22-220 246.2c37.2 216.1 182 357 216.6 357.1M515.2 768c-52.5 0-122.8-93.3-136.4-112-40.7-56.1-93.7-149-115.1-273.2-12.5-72.5 1.5-134.1 41.5-183.3 72.6-89.2 204.6-101.4 210.2-101.9 1-0.1 7.3-0.6 17.3-0.6 110.9 0 230.4 55.1 233.5 209.9 2.2 111.7-52.9 224.7-99.4 299.8-41.3 66.5-104.3 145.8-134.2 158-5.5 2.2-11.3 3.3-17.4 3.3zM518.6 0.4c-9.8 0-17.7 7.5-17.7 16.8v716.6c0 9.3 7.9 16.8 17.7 16.8s17.7-7.5 17.7-16.8v-716.6c0-9.3-7.9-16.8-17.7-16.8zM518.6 459.7c-5.4 0-10.7 2.3-14.2 6.8-5.8 7.5-4.2 18 3.6 23.5l130.2 92.2c7.8 5.5 18.9 4 24.7-3.5s4.2-18-3.6-23.5l-130.2-92.2c-3.1-2.2-6.8-3.3-10.5-3.3zM518.6 225.1c-5.3 0-10.5 2.2-14 6.5-6 7.3-4.6 17.9 3.1 23.6l202.9 150.5c7.7 5.7 18.8 4.4 24.8-2.9s4.6-17.9-3.1-23.6l-202.8-150.5c-3.3-2.4-7.1-3.6-10.9-3.6zM518.6 323c-4.2 0-8.5 1.4-11.9 4.4l-185.3 160.2c-7.2 6.2-7.8 16.9-1.2 23.8s17.7 7.4 25 1.2l185.4-160.2c7.2-6.2 7.8-16.9 1.2-23.8-3.6-3.7-8.4-5.6-13.2-5.6z" />
<glyph unicode="&#xe61f;" glyph-name="add-circle" d="M675.040 412.736h-127.040v127.264c0 20.064-16.288 36.32-36.32 36.32-20.064 0-36.32-16.192-36.32-36.32v-127.232h-127.072c-20.064 0-36.352-16.32-36.352-36.352 0-20.064 16.224-36.352 36.352-36.352h127.072v-127.232c0-20 16.256-36.384 36.32-36.384 20.032 0 36.32 16.256 36.32 36.384v127.136h127.040c19.968 0 36.352 16.256 36.352 36.384-0.032 20.096-16.256 36.384-36.352 36.384v0zM511.328 830.56c-250.24 0-453.952-203.616-453.952-453.952s203.712-453.952 453.952-453.952c250.336 0 453.984 203.584 453.984 453.952 0 250.336-203.616 453.952-453.984 453.952v0zM511.328-20.576c-219.040 0-397.184 178.176-397.184 397.152 0 219.104 178.144 397.216 397.184 397.216s397.216-178.112 397.216-397.216c0.032-218.944-178.176-397.152-397.216-397.152v0zM511.328-20.576" />
<glyph unicode="&#xe620;" glyph-name="xinxipilu" d="M369.647 225.683l-19.005 50.72-19.053-50.72h-50.704l41.179-31.699-18.989-57.093 47.566 34.888 47.583-34.888-19.036 57.093 41.206 31.699h-50.748zM350.643 453.792l-19.053-50.784h-50.704l41.179-31.714-18.989-57.068 47.566 34.895 47.583-34.895-19.036 57.068 41.206 31.714h-50.749l-19.004 50.784zM711.864 399.995h-207.876c-13.243 0-23.97-10.729-23.97-23.985 0-13.243 10.727-23.985 23.97-23.985h207.877c13.259 0 24.002 10.743 24.002 23.985-0.001 13.255-10.744 23.985-24.003 23.985zM767.831 767.778h-511.697c-70.645 0-127.908-57.263-127.908-127.925v-511.706c0-70.645 57.263-127.925 127.908-127.925h511.697c70.662 0 127.941 57.28 127.941 127.925v511.706c0 70.661-57.28 127.925-127.941 127.925zM516.231 719.806h163.153v-151.067l-67.988 42.786c-7.512 4.733-17.069 4.778-24.625 0.125l-70.539-43.411v151.566zM847.785 144.137c0-52.969-42.943-95.944-95.927-95.944h-479.733c-52.969 0-95.927 42.975-95.927 95.944v479.739c0 52.985 42.957 95.93 95.927 95.93h197.491v-193.277c0-8.447 4.578-16.223 11.948-20.346s16.395-3.937 23.579 0.499l93.695 57.652 91.446-57.527c3.78-2.389 8.089-3.592 12.43-3.592 3.873 0 7.745 0.968 11.258 2.904 7.42 4.108 12.040 11.931 12.040 20.41v193.277h25.846c52.984 0 95.927-42.944 95.927-95.93v-479.739zM711.864 208.099h-207.876c-13.243 0-23.97-10.711-23.97-23.985 0-13.243 10.727-23.985 23.97-23.985h207.877c13.259 0 24.002 10.743 24.002 23.985-0.001 13.275-10.744 23.985-24.003 23.985z" />
<glyph unicode="&#xe621;" glyph-name="set-sm" d="M946.367 405.895c0.020 21.85-13.040 38.49-31.74 41.57-18.69 3.070-79.050 13.010-85.99 14.14-6.95 1.15-14.090 8.070-15.4 11.45-1.32 3.37-8.94 22.2-11.87 29.46-2.95 7.27-1.92 16.58 4.39 25.52 6.3 8.93 39.9 55.87 48.38 67.72 8.49 11.87 8.65 34.61-4.84 48.39-13.48 13.78-47.75 47.090-56.73 55.86-8.99 8.76-31.080 8.64-42.67 0.43-11.58-8.2-71.69-51.010-71.69-51.010s-9.97-6.89-20.67-2.64c-10.7 4.24-33.43 14.070-33.43 14.070s-7.19 5.43-9.68 19.79c-2.5 14.37-11.11 65.28-14.070 82.7-2.97 17.42-20.67 29.62-37.83 29.46-17.16-0.14-57.91 0-74.33 0s-32.26-15.68-34.75-29.46c-2.49-13.79-11.56-69.16-14.070-84.45-2.52-15.3-11.44-18.48-11.44-18.48s-19.56-8.060-29.91-12.31c-10.34-4.26-15.39-2.64-30.35 7.48-14.95 10.11-44.74 31.030-63.040 43.83-18.3 12.81-38.12 7.92-49.26-3.52s-36.060-35.77-51.020-50.43c-14.95-14.66-12.61-37.54 0.58-55.71 13.2-18.18 32.34-45.43 41.35-58.21s10.84-19.5 8.36-26.82c-2.49-7.34-6.64-16.58-11.43-27.72-4.81-11.13-9.69-13.64-27.86-17.010-17.36-3.21-58.42-9.92-77.4-13.31-18.99-3.37-30.66-21.43-30.66-41.81v-64.66c0-24.34 13.2-37.24 38.42-41.93s62.66-10.66 74.77-12.61c12.1-1.95 17.67-6.6 21.41-15.54 3.73-8.94 5.13-10.12 9.37-22.57 4.26-12.47 6.46-15.55-4.98-31.67-11.44-16.13-34.31-48.11-46.030-64.51-11.74-16.4-6.45-37.83 4.98-49.85 11.44-12.030 35.47-35.64 48.97-48.97 13.49-13.33 35.19-16.28 53.36-3.52 18.19 12.75 54.98 38.99 65.69 46.62 10.7 7.63 21.91 5.28 27.85 2.94 5.94-2.35 11.25-4.6 22-9.1 10.73-4.48 13.85-11.2 16.41-23.45 2.57-12.24 10.19-56.85 13.93-78.59 3.75-21.72 18.91-33.43 40.62-33.72 21.7-0.29 33.27-0.12 61.57 0 28.29 0.13 41.86 12.61 45.45 31.38 3.59 18.76 12.45 72.94 14.22 83.72 1.78 10.76 5.94 14.73 13.63 18.47 7.7 3.74 14.32 6.47 26.84 11.88 12.51 5.4 18.91 0.66 27.7-5.72 8.8-6.39 47.51-33.78 63.78-45.31 16.28-11.53 36.73-10.33 51.9 4.4 15.18 14.73 31.62 30.99 49.27 48.38 17.64 17.4 12.16 39.59 4.4 51.46-7.77 11.88-44.49 62.95-49.71 70.23-5.21 7.28-4.4 18.62-1.75 24.63 2.64 6.010 8.44 18.24 11.72 25.22 3.29 6.97 9.6 11.22 18.18 12.9 8.58 1.69 62.72 11 83.75 14.61 21.030 3.64 31.11 19.92 31.26 39.92 0.15 20.020 0.070 48.61 0.090 65.98zM908.587 338.615c0.21-5.76-4.66-10.65-8.82-11.38-4.17-0.73-63.26-11.38-81.48-14.29-18.21-2.92-33.23-15.070-38.72-28.060-3.98-9.44-5.47-13.51-10.59-26.96-5.12-13.44-4.64-32.19 2.56-42.26 7.2-10.080 46.82-64.9 50.38-70.45s4.27-11.95-1.28-17.5-40.99-41.2-47.39-47.39c-6.41-6.19-11.83-4.8-18.79 0-6.95 4.8-39.61 26.39-64.44 44.36-16.96 12.28-32.82 12.43-48.7 6.020-15.87-6.42 1.28 0.28-22.2-8.97s-30.23-27.62-33.73-48.24c-3.5-20.63-10.67-62.98-11.95-70.45s-5.55-11.1-13.66-11.1h-64.9c-8.11 0-11.74 2.99-14.52 11.95-2.77 8.97-10.030 54.87-12.8 74.29-2.78 19.43-13.82 36.12-24.77 40.56-10.94 4.45-4.98 2.14-27.32 11.1-22.34 8.97-39.63 4.5-51.23-3.84-11.61-8.34-58.64-42.69-65.33-46.96-6.68-4.28-14.65-3.28-18.35 0.42s-40.56 40.56-46.54 46.54c-5.98 5.98-5.36 12.92 0 20.49 5.36 7.58 28.39 40.76 40.99 57.95 12.59 17.2 17.93 34.74 9.82 53.49-8.12 18.74-4.42 10.24-12.39 28.6-7.96 18.36-24.28 24.46-38.42 26.9-14.14 2.43-68.88 11.53-76.85 13.23-7.97 1.71-11.95 7.26-11.95 14.090v66.18c0 9.53 7.67 12.44 12.38 13.23 4.7 0.8 54.22 9.18 73 12.39 18.79 3.2 36.36 11.32 43.55 29.030 7.19 17.7 4.27 11.1 11.1 27.32 6.83 16.23 3.8 33.94-7.68 49.96-11.49 16.010-38.85 54-44.4 61.9s-5.77 12.6 0.85 19.21c6.62 6.62 42.050 42.48 46.96 46.97 4.91 4.48 12.070 5.4 18.36 0.85 6.3-4.55 49.31-35.65 64.040-46.11s32.35-12.56 49.1-5.55c16.75 7.020 10.25 4.48 26.9 11.1s24.84 19.090 28.18 39.71c3.33 20.61 11.95 74.14 12.81 77.7 0.85 3.55 5.55 10.46 11.74 10.46s65.82-0.070 69.8 0c3.99 0.070 10.3-3.29 11.32-9.18 1.020-5.9 13.020-74.29 14.94-86.25 1.92-11.95 15.58-28.57 25.54-32.73s21.35-8.75 31.31-13.090c9.97-4.34 30.13-1.91 36.15 2.28 6.030 4.18 70.52 48.81 75.43 52.37s11.52 3.27 17.64-2.85 43.34-43.19 47.54-47.53c4.19-4.34 4.66-8.66 1.14-13.66-3.53-5.010-36.72-51.8-47.54-67.46-10.81-15.65-11.73-33.73-5.41-48.96 6.33-15.22 3.99-9.39 9.11-21.91 5.13-12.53 16.28-29.030 33.59-31.88s76.92-12.74 84.82-13.95c7.9-1.21 11.1-7.18 11.1-13.37s-0.21-62.55 0-68.32zM526.833 573.195c-110.45 0-200-89.54-200-200s89.55-200 200-200c110.46 0 200 89.54 200 200s-89.54 200-200 200zM526.833 208.195c-91.12 0-165 73.87-165 165s73.88 165 165 165c91.13 0 165-73.87 165-165s-73.87-165-165-165z" />
<glyph unicode="&#xe623;" glyph-name="about" d="M514.272 834.608c-249.517 0-451.79-202.273-451.79-451.79s202.273-451.79 451.79-451.79 451.79 202.273 451.79 451.79-202.273 451.79-451.79 451.79zM514.272-20.129c-222.541 0-402.947 180.406-402.947 402.947s180.406 402.947 402.947 402.947 402.947-180.406 402.947-402.947-180.405-402.947-402.947-402.947zM514.295 593.979c-9.446-10.361-14.308-22.952-14.308-37.484 0-11.96 3.887-22.396 11.535-30.458 7.783-8.211 17.854-12.451 29.314-12.451 9.312 0 23.139 2.85 35.783 16.901 9.866 10.641 14.867 23.438 14.867 37.693 0 11.681-4.032 21.901-11.744 29.832-16.815 17.311-47.382 15.436-65.446-4.035zM549.461 293.283c-12.111-11.542-20.59-18.759-26.237-23.316 2.77 14.954 9.976 44.614 27.33 103.023 17.298 57.89 18.799 67.992 18.799 72.956 0 8.657-3.637 16.335-9.922 21.643-14.125 11.662-39.035 9.35-69.131-7.678-16.779-9.408-34.596-24.76-54.493-46.577l-10.377-11.542 34.425-26.549 8.819 8.715c9.573 9.293 16.086 15.352 20.412 19.394-26.295-86.46-39.093-140.191-39.093-164.262 0-10.907 3.172-19.971 9.573-26.839 6.46-7.039 15.51-10.737 25.892-10.737 10.146 0 21.792 3.926 35.922 11.949 12.741 7.212 31.883 23.030 58.642 48.191l10.838 10.392-31.307 30.475-10.091-9.238z" />
<glyph unicode="&#xe62a;" glyph-name="chart-screen" d="M963.931 179.219v34.824l-37.355-2.676v483.487h-235.163v70.463h-361.152v-70.463h-234.57v-480.81h-35.621v-34.824h432.583v-141.229h-90.314v-35.307h216.754v35.307h-90.314v141.228h435.153zM366.213 730.008h289.004v-35.307h-289.004v35.307zM364.818 332.731l-142.594 73.521 14.296 27.737 123.239-63.524 173.928 159.755 127.581-92.635 93.138 122.414 24.842-18.898-111.608-146.737-131.636 95.622-171.186-157.256z" />
<glyph unicode="&#xe640;" glyph-name="delete1" d="M738.923 24.288h-451.956c-27.2 0-49.327 21.603-49.327 48.157v418.017c0 26.548 22.129 48.147 49.327 48.147h451.956c27.2 0 49.327-21.598 49.327-48.147v-418.017c0-26.555-22.129-48.157-49.327-48.157zM286.966 494.547c-4.447 0-7.168-2.644-7.168-4.084v-418.017c0-1.443 2.722-4.093 7.168-4.093h451.956c4.448 0 7.168 2.651 7.168 4.093v418.017c0 1.44-2.722 4.084-7.168 4.084h-451.956zM832.199 496.302h-640.401c-27.201 0-49.327 20.131-49.327 44.876v61.045c0 24.74 22.128 44.867 49.327 44.867h640.401c27.2 0 49.327-20.127 49.327-44.867v-61.045c0-24.744-22.129-44.876-49.327-44.876zM184.631 541.327c0.387-0.733 2.722-2.866 7.168-2.866h640.401c4.445 0 6.782 2.132 7.168 2.867v60.741c-0.393 0.736-2.733 2.863-7.168 2.863h-640.401c-4.437 0-6.776-2.128-7.168-2.863v-60.742zM600.748 605.354h-174.546c-27.201 0-49.327 20.13-49.327 44.876v10.736c0 24.74 22.128 44.867 49.327 44.867h174.546c27.2 0 49.327-20.126 49.327-44.867v-10.736c0-24.745-22.128-44.876-49.327-44.876zM419.034 650.378c0.387-0.733 2.722-2.865 7.168-2.865h174.546c4.446 0 6.782 2.131 7.168 2.865v10.432c-0.393 0.736-2.734 2.862-7.168 2.862h-174.546c-4.437 0-6.776-2.126-7.168-2.862v-10.432zM404.099 430.833h-30.097c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.916-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM659.583 430.833h-30.097c-7.298 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.097c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM531.841 430.833h-30.098c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213z" />
<glyph unicode="&#xe641;" glyph-name="share3" d="M769.714 306.453c-51.754 0-97.702-24.851-126.571-63.269l-248.664 124.757c3.93 13.798 6.034 28.364 6.034 43.424 0 16.496-2.527 32.399-7.211 47.35l247.724 124.288c28.71-40.052 75.647-66.151 128.687-66.151 87.388 0 158.229 70.84 158.229 158.229s-70.841 158.229-158.229 158.229c-87.389 0-158.229-70.841-158.229-158.229 0-6.046 0.352-12.009 1.011-17.88l-261.275-131.085c-28.371 26.943-66.723 43.479-108.938 43.479-87.388 0-158.229-70.84-158.229-158.229s70.84-158.229 158.229-158.229c43.752 0 83.354 17.758 111.997 46.459l258.676-129.779c-0.964-7.062-1.474-14.266-1.474-21.592 0-87.389 70.84-158.229 158.229-158.229s158.229 70.84 158.229 158.229c-0.001 87.387-70.836 158.228-158.225 158.228v0z" />
<glyph unicode="&#xe642;" glyph-name="youjian" d="M896.699 598.971c0 23.926-19.428 43.444-43.444 43.444h-684.849c-24.016 0-43.444-19.428-43.444-43.444v-433.090c0-23.926 19.428-43.444 43.444-43.444h684.939c23.926 0 43.444 19.428 43.444 43.444v433.090zM544.111 346.762l-0.18-0.18c-17.629-16.19-45.243-16.19-62.782 0.090l-284.769 256.166h633.85l-286.118-256.076zM383.737 380.672l-219.198-194.014v391.175l219.198-197.162zM413.779 354.048l40.566-36.338c15.92-14.661 36.518-22.487 58.105-22.487 0 0 0.090 0 0.090 0 21.587 0 42.185 7.825 58.015 22.397l42.994 38.407 218.929-193.924h-635.559l216.86 191.945zM642.871 382.471l214.251 191.675v-381.371l-214.251 189.696z" />
<glyph unicode="&#xe645;" glyph-name="check" d="M887.904 597.792c-12.864 12.064-33.152 11.488-45.216-1.408l-426.752-454.368-233.12 229.696c-12.608 12.416-32.864 12.288-45.28-0.32-12.416-12.576-12.256-32.864 0.352-45.248l256.48-252.672c0.096-0.096 0.224-0.128 0.32-0.224s0.128-0.224 0.224-0.32c2.016-1.92 4.448-3.008 6.784-4.288 1.152-0.672 2.144-1.664 3.36-2.144 3.776-1.472 7.776-2.24 11.744-2.24 4.192 0 8.384 0.832 12.288 2.496 1.312 0.544 2.336 1.664 3.552 2.368 2.4 1.408 4.896 2.592 6.944 4.672 0.096 0.096 0.128 0.256 0.224 0.352 0.064 0.096 0.192 0.128 0.288 0.224l449.184 478.208c12.16 12.832 11.488 33.088-1.376 45.216z" />
<glyph unicode="&#xe646;" glyph-name="close" d="M557.312 382.752l265.28 263.904c12.544 12.48 12.608 32.704 0.128 45.248-12.512 12.576-32.704 12.608-45.248 0.128l-265.344-263.936-263.040 263.84c-12.448 12.48-32.704 12.544-45.248 0.064-12.512-12.48-12.544-32.736-0.064-45.28l262.976-263.776-265.152-263.744c-12.544-12.48-12.608-32.704-0.128-45.248 6.24-6.272 14.464-9.44 22.688-9.44 8.16 0 16.32 3.104 22.56 9.312l265.216 263.808 265.44-266.24c6.24-6.272 14.432-9.408 22.656-9.408 8.192 0 16.352 3.136 22.592 9.344 12.512 12.48 12.544 32.704 0.064 45.248l-265.376 266.176z" />
<glyph unicode="&#xe64b;" glyph-name="favorfill" d="M957.216 491.68c-3.808 11.36-13.632 19.68-25.504 21.504l-270.336 41.728-120.8 258.624c-5.248 11.232-16.544 18.432-28.928 18.464 0 0-0.032 0-0.064 0-12.384 0-23.648-7.136-28.928-18.336l-121.856-258.016-270.72-40.8c-11.872-1.792-21.728-10.048-25.568-21.408s-0.992-23.936 7.36-32.512l196.448-202.080-46.88-284.8c-1.984-12.096 3.104-24.256 13.12-31.328 9.984-7.072 23.168-7.808 33.888-1.92l241.824 133.024 241.312-133.856c4.832-2.624 10.176-3.968 15.52-3.968 0.256 0 0.48 0 0.64 0 17.696 0 32 14.304 32 32 0 3.968-0.704 7.776-2.016 11.296l-44.896 278.688 196.928 201.248c8.32 8.544 11.232 21.088 7.456 32.448z" />
<glyph unicode="&#xe64c;" glyph-name="favor" d="M767.104-63.936c-5.344 0-10.688 1.344-15.52 4.032l-241.312 133.856-241.824-133.024c-10.72-5.92-23.904-5.152-33.888 1.92-10.016 7.072-15.104 19.264-13.12 31.328l46.88 284.736-196.448 202.080c-8.256 8.512-11.168 20.928-7.456 32.192 3.68 11.296 13.312 19.616 25.024 21.632l155.072 26.592c17.632 2.944 33.984-8.736 36.96-26.144s-8.704-33.952-26.144-36.96l-95.168-16.32 165.344-170.080c7.072-7.296 10.272-17.504 8.64-27.488l-38.816-235.68 199.616 109.824c9.632 5.312 21.344 5.312 30.944-0.064l199.168-110.464-38.016 235.776c-1.632 10.016 1.632 20.224 8.704 27.456l164.672 168.256-225.664 34.816c-10.56 1.632-19.584 8.416-24.128 18.080l-99.2 212.384-100.064-211.84c-7.552-16-26.624-22.816-42.624-15.264-15.968 7.552-22.816 26.624-15.264 42.624l129.152 273.44c5.312 11.2 16.576 18.336 28.928 18.336 0 0 0.032 0 0.064 0 12.416-0.032 23.68-7.232 28.928-18.464l120.8-258.624 270.336-41.728c11.872-1.824 21.696-10.144 25.504-21.504 3.776-11.36 0.864-23.936-7.488-32.48l-196.928-201.216 45.92-284.864c1.952-12.096-3.2-24.256-13.216-31.296-5.472-3.936-11.904-5.856-18.368-5.856z" />
<glyph unicode="&#xe652;" glyph-name="fuxuankuangxuanzhong" d="M734.155 767.755h-444.348c-89.223 0-161.563-72.339-161.563-161.58v-444.349c0-89.231 72.34-161.58 161.563-161.58h444.348c89.252 0 161.601 72.349 161.601 161.58v444.349c-0.001 89.242-72.35 161.58-161.601 161.58zM425.844 225.948l-1.055 1.055-1.054-1.055-139.548 139.539 37.003 37.011 103.602-103.601 260.606 260.587 36.983-37.003-296.537-296.534z" />
<glyph unicode="&#xe655;" glyph-name="fenguangbaobiao" d="M892-16h-760c-11.046 0-20 8.954-20 20s8.954 20 20 20v0h760c11.046 0 20-8.954 20-20s-8.954-20-20-20v0zM232 344h-40c-22.091 0-40-17.909-40-40v0-200c0-22.091 17.909-40 40-40v0h40c22.091 0 40 17.909 40 40v0 200c0 22.091-17.909 40-40 40v0zM192 104v200h40v-200zM432 584h-40c-22.091 0-40-17.909-40-40v0-440c0-22.091 17.909-40 40-40h40c22.091 0 40 17.909 40 40v0 440c0 22.091-17.909 40-40 40v0zM392 104v440h40v-440zM632 504h-40c-22.091 0-40-17.909-40-40v0-360c0-22.091 17.909-40 40-40h40c22.091 0 40 17.909 40 40v0 360c0 22.091-17.909 40-40 40v0zM592 104v360h40v-360zM832 784h-40c-22.091 0-40-17.909-40-40v0-640c0-22.091 17.909-40 40-40h40c22.091 0 40 17.909 40 40v0 640c0 22.091-17.909 40-40 40v0zM792 104v640h40v-640z" />
<glyph unicode="&#xe656;" glyph-name="jian" d="M887.157 25.931h-736.333v737.887h736.333v-737.887zM189.66 64.767h658.661v660.215h-658.661v-660.215zM741.91 376.233h-446.616c-10.874 0-19.418 8.544-19.418 19.418s8.544 19.418 19.418 19.418h446.616c10.874 0 19.418-8.544 19.418-19.418s-8.544-19.418-19.418-19.418z" />
<glyph unicode="&#xe657;" glyph-name="jia" d="M887.157 25.931h-736.333v737.887h736.333v-737.887zM189.66 64.767h658.661v660.215h-658.661v-660.215zM741.91 376.233h-446.616c-10.874 0-19.418 8.544-19.418 19.418s8.544 19.418 19.418 19.418h446.616c10.874 0 19.418-8.544 19.418-19.418s-8.544-19.418-19.418-19.418zM518.991 161.081c-10.874 0-19.418 8.544-19.418 19.418v429.528c0 10.874 8.544 19.418 19.418 19.418s19.418-8.544 19.418-19.418v-429.528c0-10.097-8.544-19.418-19.418-19.418z" />
<glyph unicode="&#xe658;" glyph-name="fenzhijigou" d="M822.689 422.836v19.418h-291.271v58.254h-38.836v-58.254h-291.271v-97.090h38.836v58.254h252.435v-58.254h38.836v58.254h252.435v-58.254h38.836v77.672zM356.655 733.525h310.689c21.449 0 38.836-17.388 38.836-38.836v0-155.345c0-21.449-17.388-38.836-38.836-38.836h-310.689c-21.449 0-38.836 17.388-38.836 38.836v0 155.345c0 21.449 17.388 38.836 38.836 38.836v0zM162.475 345.164h116.508c21.449 0 38.836-17.388 38.836-38.836v-233.017c0-21.449-17.388-38.836-38.836-38.836v0h-116.508c-21.449 0-38.836 17.388-38.836 38.836v0 233.017c0 21.449 17.388 38.836 38.836 38.836v0zM181.893 306.328c-10.724 0-19.418-8.694-19.418-19.418v0-194.181c0-10.724 8.694-19.418 19.418-19.418v0h77.672c10.724 0 19.418 8.694 19.418 19.418v194.181c0 10.724-8.694 19.418-19.418 19.418v0h-77.672zM453.746 345.164h116.508c21.449 0 38.836-17.388 38.836-38.836v-233.017c0-21.449-17.388-38.836-38.836-38.836v0h-116.508c-21.449 0-38.836 17.388-38.836 38.836v0 233.017c0 21.449 17.388 38.836 38.836 38.836v0zM473.164 306.328c-10.724 0-19.418-8.694-19.418-19.418v0-194.181c0-10.724 8.694-19.418 19.418-19.418v0h77.672c10.724 0 19.418 8.694 19.418 19.418v194.181c0 10.724-8.694 19.418-19.418 19.418v0h-77.672zM745.017 345.164h116.508c21.449 0 38.836-17.388 38.836-38.836v-233.017c0-21.449-17.388-38.836-38.836-38.836v0h-116.508c-21.449 0-38.836 17.388-38.836 38.836v0 233.017c0 21.449 17.388 38.836 38.836 38.836v0zM764.435 306.328c-10.724 0-19.418-8.694-19.418-19.418v0-194.181c0-10.724 8.694-19.418 19.418-19.418v0h77.672c10.724 0 19.418 8.694 19.418 19.418v194.181c0 10.724-8.694 19.418-19.418 19.418v0h-77.672z" />
<glyph unicode="&#xe659;" glyph-name="roundcheckfill" d="M512 830.016c-245.92 0-446.016-200.096-446.016-446.016 0-245.952 200.064-446.016 446.016-446.016s446.016 200.064 446.016 446.016c0 245.92-200.064 446.016-446.016 446.016zM727.232 457.568l-256.224-259.008c-0.064-0.064-0.192-0.096-0.256-0.192-0.096-0.064-0.096-0.192-0.192-0.256-2.048-1.984-4.576-3.2-6.944-4.544-1.184-0.672-2.144-1.696-3.392-2.176-3.84-1.536-7.904-2.336-11.968-2.336-4.096 0-8.224 0.8-12.096 2.4-1.28 0.544-2.304 1.632-3.52 2.304-2.368 1.344-4.832 2.528-6.88 4.544-0.064 0.064-0.096 0.192-0.16 0.256-0.064 0.096-0.192 0.096-0.256 0.192l-126.016 129.504c-12.32 12.672-12.032 32.928 0.64 45.248 12.672 12.288 32.896 12.064 45.248-0.64l103.264-106.112 233.28 235.84c12.416 12.576 32.704 12.704 45.248 0.256 12.512-12.448 12.64-32.704 0.224-45.28z" />
<glyph unicode="&#xe65a;" glyph-name="roundcheck" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 767.712c-211.584 0-383.712-172.128-383.712-383.712 0-211.552 172.128-383.712 383.712-383.712 211.552 0 383.712 172.16 383.712 383.712 0 211.584-172.16 383.712-383.712 383.712zM726.976 502.816c-12.544 12.448-32.832 12.32-45.248-0.256l-233.28-235.84-103.264 106.112c-12.352 12.704-32.608 12.928-45.248 0.64-12.672-12.32-12.96-32.608-0.64-45.248l126.016-129.504c0.064-0.096 0.192-0.096 0.256-0.192 0.064-0.064 0.096-0.192 0.16-0.256 2.016-1.984 4.512-3.2 6.88-4.544 1.248-0.672 2.24-1.792 3.52-2.304 3.872-1.6 8-2.4 12.096-2.4 4.064 0 8.128 0.8 11.968 2.336 1.248 0.512 2.208 1.536 3.392 2.176 2.4 1.344 4.896 2.528 6.944 4.544 0.064 0.064 0.096 0.192 0.192 0.256 0.064 0.096 0.16 0.128 0.256 0.192l256.224 259.008c12.448 12.608 12.32 32.864-0.224 45.28z" />
<glyph unicode="&#xe65b;" glyph-name="roundclosefill" d="M512 832c-247.008 0-448-200.96-448-448s200.96-448 448-448c247.008 0 448 200.96 448 448s-200.96 448-448 448zM694.752 246.016c12.48-12.544 12.448-32.768-0.064-45.248-6.24-6.208-14.4-9.344-22.592-9.344-8.224 0-16.416 3.136-22.656 9.408l-137.6 138.016-138.048-136.576c-6.24-6.144-14.368-9.248-22.496-9.248-8.256 0-16.48 3.168-22.752 9.504-12.416 12.576-12.32 32.8 0.256 45.248l137.888 136.384-137.376 137.824c-12.48 12.512-12.448 32.768 0.064 45.248 12.512 12.512 32.736 12.448 45.248-0.064l137.568-137.984 138.048 136.576c12.544 12.448 32.832 12.32 45.248-0.256 12.448-12.576 12.32-32.832-0.256-45.248l-137.888-136.384 137.408-137.856z" />
<glyph unicode="&#xe65c;" glyph-name="roundclose" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 767.712c-211.584 0-383.712-172.128-383.712-383.712 0-211.552 172.128-383.712 383.712-383.712 211.552 0 383.712 172.16 383.712 383.712 0 211.584-172.16 383.712-383.712 383.712zM557.056 382.624l138.368 136.864c12.576 12.416 12.672 32.672 0.256 45.248s-32.704 12.672-45.248 0.256l-138.56-137.024-136.448 136.864c-12.512 12.512-32.736 12.576-45.248 0.064-12.512-12.48-12.544-32.736-0.064-45.248l136.256-136.672-137.376-135.904c-12.576-12.448-12.672-32.672-0.256-45.248 6.272-6.336 14.496-9.504 22.752-9.504 8.128 0 16.256 3.104 22.496 9.248l137.568 136.064 138.688-139.136c6.24-6.272 14.432-9.408 22.656-9.408 8.192 0 16.352 3.136 22.592 9.344 12.512 12.48 12.544 32.704 0.064 45.248l-138.496 138.944z" />
<glyph unicode="&#xe65d;" glyph-name="roundrightfill" d="M512 832c-247.040 0-448-200.96-448-448s200.96-448 448-448 448 200.96 448 448-200.96 448-448 448zM661.76 360.032l-160.256-158.496c-6.24-6.144-14.368-9.248-22.496-9.248-8.256 0-16.512 3.168-22.752 9.504-12.416 12.576-12.32 32.8 0.256 45.248l137.408 135.904-136.288 136.672c-12.48 12.512-12.448 32.768 0.064 45.248 12.512 12.512 32.768 12.448 45.248-0.064l158.912-159.36c0.032-0.032 0.032-0.064 0.064-0.096s0.064-0.032 0.096-0.064c2.944-2.976 5.056-6.432 6.592-10.048 0.064-0.128 0.224-0.256 0.256-0.384 4.736-11.616 2.368-25.44-7.104-34.816z" />
<glyph unicode="&#xe65e;" glyph-name="roundright" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 768c-211.744 0-384-172.256-384-384s172.256-384 384-384c211.744 0 384 172.256 384 384s-172.256 384-384 384zM668.832 394.848c-0.032 0.128-0.192 0.256-0.256 0.384-1.536 3.616-3.648 7.072-6.592 10.048-0.032 0.032-0.064 0.032-0.096 0.064s-0.032 0.064-0.064 0.096l-158.912 159.36c-12.48 12.512-32.736 12.576-45.248 0.064-12.512-12.48-12.544-32.736-0.064-45.248l136.288-136.672-137.408-135.904c-12.576-12.448-12.672-32.672-0.256-45.248 6.24-6.336 14.496-9.504 22.752-9.504 8.128 0 16.256 3.104 22.496 9.248l160.256 158.496c9.504 9.376 11.872 23.2 7.104 34.816z" />
<glyph unicode="&#xe66c;" glyph-name="like" d="M512-32c-28.928 0-57.92 12.672-86.624 41.376l-319.104 322.624c-38.208 47.648-74.272 92.672-74.272 180 0 141.152 114.848 256 256 256 53.088 0 104-16.096 147.296-46.592 14.432-10.176 17.92-30.144 7.712-44.608-10.176-14.432-30.080-17.92-44.608-7.712-32.384 22.848-70.592 34.912-110.4 34.912-105.888 0-192-86.112-192-192 0-61.408 20.288-90.112 59.168-138.688l315.584-318.816c15.968-15.968 28.864-22.304 41.248-22.496 12.704-0.192 24.928 6.176 41.376 22.624l316.672 319.904c26.016 28.192 57.952 75.776 57.952 137.472 0 105.888-86.112 192-192 192-48.064 0-94.080-17.856-129.536-50.272l-134.080-134.112c-12.512-12.512-32.736-12.512-45.248 0s-12.512 32.736 0 45.248l135.104 135.136c48.32 44.192 109.664 68 173.76 68 141.152 0 256-114.848 256-256 0-82.368-41.152-144.288-75.68-181.696l-317.568-320.8c-28.8-28.832-57.792-41.504-86.752-41.504z" />
<glyph unicode="&#xe671;" glyph-name="samefill" d="M352 544h128v-128h-128v128zM918.624 22.624l-145.664 145.664c56.672 66.944 91.040 153.344 91.040 247.712 0 211.744-172.256 384-384 384s-384-172.256-384-384c0-211.744 172.256-384 384-384 94.368 0 180.768 34.368 247.712 91.040l145.664-145.664c6.24-6.24 14.432-9.376 22.624-9.376s16.384 3.136 22.624 9.376c12.512 12.512 12.512 32.736 0 45.248zM288 384v192c0 17.664 14.336 32 32 32h192c17.664 0 32-14.336 32-32v-192c0-17.664-14.336-32-32-32h-192c-17.664 0-32 14.336-32 32zM640 288c0-17.696-14.304-32-32-32h-160c-17.664 0-32 14.304-32 32s14.336 32 32 32h128v128c0 17.664 14.304 32 32 32s32-14.336 32-32v-160z" />
<glyph unicode="&#xe672;" glyph-name="same" d="M512 352h-192c-17.664 0-32 14.336-32 32v192c0 17.664 14.336 32 32 32h192c17.664 0 32-14.336 32-32v-192c0-17.664-14.336-32-32-32zM352 416h128v128h-128v-128zM608 256h-160c-17.664 0-32 14.304-32 32s14.336 32 32 32h128v128c0 17.664 14.304 32 32 32s32-14.336 32-32v-160c0-17.696-14.304-32-32-32zM896-32c-8.192 0-16.384 3.136-22.624 9.376l-167.104 167.104c-12.512 12.512-12.512 32.736 0 45.248 60.448 60.448 93.728 140.832 93.728 226.272 0 176.448-143.552 320-320 320s-320-143.552-320-320c0-176.448 143.552-320 320-320 39.328 0 77.76 7.072 114.176 20.96 16.448 6.24 35.008-1.984 41.312-18.496 6.272-16.512-1.984-35.008-18.496-41.312-43.712-16.672-89.792-25.152-136.992-25.152-211.744 0-384 172.256-384 384s172.256 384 384 384c211.744 0 384-172.256 384-384 0-91.808-32-178.72-90.784-247.968l145.408-145.408c12.512-12.512 12.512-32.736 0-45.248-6.24-6.24-14.432-9.376-22.624-9.376z" />
<glyph unicode="&#xe674;" glyph-name="evaluate" d="M405.536-36.128c-8.8 0-17.568 3.584-23.904 10.688-83.232 93.216-217.856 94.112-220.64 94.112-0.096 0-0.096 0-0.192 0-17.568 0-31.904 14.176-32.032 31.744-0.128 17.664 14.016 32.064 31.648 32.256 6.656 0.352 165.664 0.192 268.96-115.488 11.776-13.184 10.624-33.408-2.56-45.184-6.080-5.44-13.696-8.128-21.28-8.128zM620.128-36.064c-7.776 0-15.584 2.816-21.76 8.544-12.96 12-13.76 32.256-1.728 45.216 106.976 115.52 262.752 115.392 268.896 115.136 17.696-0.192 31.872-14.656 31.68-32.32-0.192-17.568-14.464-31.68-32-31.68-0.096 0-0.16 0-0.256 0v0c-2.656 0-134.56-0.864-221.376-94.624-6.272-6.848-14.88-10.272-23.456-10.272zM563.712 126.688h-101.408c-3.232 0-6.368 0.48-9.344 1.408-108.256 13.888-200.256 76.704-259.552 177.44-68.832 116.992-84.608 268.576-39.2 377.216 4.896 11.68 16.224 19.392 28.896 19.648l9.632 0.096c60.96 0 117.888-11.52 169.696-34.304 37.44 68.448 80.192 120.384 127.328 154.688 2.496 2.176 5.344 4 8.512 5.344v0c9.888 4.288 21.376 3.36 30.432-2.528 1.568-1.024 3.040-2.176 4.384-3.456 47.264-34.688 88.832-85.856 126.464-155.744 52.832 23.872 111.072 35.968 173.632 35.968l9.792-0.096c12.672-0.256 24-7.968 28.896-19.648 45.408-108.672 29.664-260.256-39.232-377.248-59.296-100.672-151.264-163.52-259.488-177.44-3.040-0.832-6.176-1.344-9.44-1.344zM468 190.688h90.016c0.672 0.128 1.376 0.224 2.080 0.32 115.712 12.864 182.080 87.072 217.376 147.008 54.048 91.872 70.432 211.936 42.528 300.32-58.24-1.888-111.616-16.16-158.816-42.528-7.712-4.288-16.832-5.184-25.184-2.624-8.384 2.624-15.328 8.608-19.2 16.512-32.448 66.368-67.232 115.2-105.824 148.48-38.624-33.216-74.176-82.4-105.92-146.592-3.872-7.808-10.72-13.696-19.040-16.32-8.32-2.656-17.28-1.76-24.96 2.4-46.208 25.12-98.336 38.784-155.008 40.64-27.904-88.384-11.52-208.448 42.528-300.288 35.296-59.936 101.632-134.112 217.312-147.008 0.704-0.096 1.408-0.192 2.112-0.32zM512.768-64c-17.664 0-32 14.304-32 32v190.688c0 17.696 14.336 32 32 32s32-14.304 32-32v-190.688c-0.032-17.696-14.336-32-32-32z" />
<glyph unicode="&#xe687;" glyph-name="circle1" d="M511.998 847.999c-256.259 0-463.998-207.739-463.998-464 0-256.258 207.739-463.998 463.998-463.998 256.263 0 464.002 207.741 464.002 463.998 0 256.261-207.739 464-464.002 464zM512.002-16.001c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400 0-220.912-179.086-400-399.998-400z" />
<glyph unicode="&#xe688;" glyph-name="radio" d="M320.5 383.5c0-106.039 85.961-192 192-192s192 85.961 192 192v0c0 106.039-85.961 192-192 192s-192-85.961-192-192v0zM511.998 847.999c-256.259 0-463.998-207.739-463.998-464 0-256.258 207.739-463.998 463.998-463.998 256.263 0 464.002 207.741 464.002 463.998 0 256.261-207.739 464-464.002 464zM512.002-16.001c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400 0-220.912-179.086-400-399.998-400z" />
<glyph unicode="&#xe68e;" glyph-name="caidan_xunzhang" d="M649.791 471.365l70.787 105.298c2.628 3.877 4.197 8.656 4.203 13.803v139.135c0 27.283-22.199 49.47-49.47 49.47h-330.637c-27.272 0-49.47-22.187-49.47-49.47v-139.134c0.005-5.026 1.5-9.701 4.068-13.609l-0.058 0.094 69.518-106.517c-72.239-46.568-120.17-127.733-120.17-219.891 0-144.158 117.272-261.432 261.431-261.432s261.432 117.272 261.432 261.431c0 92.777-48.581 174.409-121.634 220.822zM509.992 511.976c-0.018 0-0.040 0-0.062 0-19.184 0-37.885-2.066-55.893-5.987l1.727 0.315v223.298h108.457v-223.298c-16.281 3.606-34.982 5.672-54.164 5.672-0.022 0-0.045 0-0.067 0h0.003zM675.311 598.004l-61.62-91.659v223.257h61.62v-131.598zM344.674 729.602h61.62v-226.209l-61.62 94.431v131.779zM509.992 38.582c-116.887 0-211.962 95.087-211.962 211.961s95.074 211.962 211.962 211.962 211.962-95.087 211.962-211.962-95.075-211.962-211.961-211.962zM509.993 423.338c-95.268 0-172.782-77.513-172.782-172.794s77.513-172.795 172.782-172.795c95.292 0 172.805 77.514 172.805 172.795s-77.513 172.794-172.805 172.794zM509.993 127.219c-67.997 0-123.312 55.328-123.312 123.325s55.315 123.323 123.312 123.323 123.337-55.327 123.337-123.324-55.339-123.325-123.337-123.325z" />
<glyph unicode="&#xe6a0;" glyph-name="pulldown" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 768c-211.744 0-384-172.256-384-384s172.256-384 384-384c211.744 0 384 172.256 384 384s-172.256 384-384 384zM694.56 373.856c-12.544 12.608-33.376 12.64-45.952 0.064l-104.608-103.904v306.656c0 17.76-14.208 32.16-32 32.16-17.76 0-32-14.4-32-32.16v-308.32l-105.216 106.688c-12.48 12.608-32.704 12.736-45.312 0.256-12.64-12.512-12.672-32.896-0.192-45.504l159.36-161.056c6.272-6.336 14.592-9.568 22.88-9.568 8.16 0 16.384 3.168 22.624 9.312 0.032 0.064 0.032 0.064 0.064 0.128 0.032 0 0.064 0 0.096 0.064l160.192 159.68c12.576 12.544 12.608 32.928 0.064 45.504z" />
<glyph unicode="&#xe6a1;" glyph-name="pullup" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 768c-211.744 0-384-172.256-384-384s172.256-384 384-384c211.744 0 384 172.256 384 384s-172.256 384-384 384zM694.464 437.632l-158.496 160.256c-9.344 9.472-23.168 11.84-34.784 7.136-0.736-0.288-1.312-0.992-2.016-1.344-2.976-1.472-5.952-3.072-8.448-5.536-0.032-0.032-0.032-0.064-0.064-0.096s-0.064-0.032-0.096-0.064l-159.36-158.912c-12.512-12.48-12.544-32.736-0.064-45.248 6.24-6.272 14.464-9.408 22.656-9.408 8.16 0 16.352 3.104 22.592 9.344l103.616 103.296v-305.056c0-17.696 14.336-32 32-32s32 14.304 32 32v306.752l104.96-106.112c6.24-6.336 14.496-9.504 22.752-9.504 8.128 0 16.256 3.072 22.496 9.248 12.576 12.416 12.704 32.672 0.256 45.248z" />
<glyph unicode="&#xe6a4;" glyph-name="refresh" d="M939.456 639.776c-16.672 5.984-34.976-2.72-40.896-19.36l-24.768-69.344c-28.992 65.312-74.784 122.72-133.088 165.92-185.376 137.28-449.408 99.776-588.384-83.648-67.264-88.768-95.616-198.176-79.84-308.032 15.84-110.304 74.208-207.776 164.352-274.496 75.424-55.808 163.808-82.752 251.456-82.752 128.032 0 254.56 57.44 336.992 166.272 36.48 48.128 61.472 102.080 74.208 160.416 3.776 17.248-7.136 34.304-24.416 38.080-17.216 3.712-34.304-7.104-38.080-24.416-10.784-49.184-31.872-94.752-62.72-135.456-117.888-155.52-341.92-187.232-499.392-70.72-76.288 56.48-125.664 138.912-139.072 232.16-13.344 92.8 10.656 185.248 67.488 260.288 117.856 155.584 341.792 187.424 499.328 70.848 57.024-42.24 99.84-100.608 122.976-166.624l-109.984 42.944c-16.416 6.368-35.008-1.696-41.44-18.176s1.728-35.008 18.176-41.44l161.856-63.2c3.808-1.472 7.744-2.208 11.616-2.208 0.544 0 1.024 0.192 1.568 0.224 1.216-0.128 2.432-0.64 3.648-0.64 13.12 0 25.472 8.16 30.112 21.248l57.632 161.184c5.984 16.672-2.688 35.008-19.328 40.928z" />
<glyph unicode="&#xe6b0;" glyph-name="qrcode1" d="M419.2 736v-256h-256v256h256M419.2 800h-256c-35.2 0-64-28.8-64-64v-256c0-35.2 28.8-64 64-64h256c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM899.2 736v-256h-256v256h256M899.2 800h-256c-35.2 0-64-28.8-64-64v-256c0-35.2 28.8-64 64-64h256c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM419.2 288v-256h-256v256h256M419.2 352h-256c-35.2 0-64-28.8-64-64v-256c0-35.2 28.8-64 64-64h256c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM611.2 0c-19.2 0-32 12.8-32 32v256c0 19.2 12.8 32 32 32s32-12.8 32-32v-256c0-16-16-32-32-32zM768 0c-19.2 0-32 12.8-32 32v256c0 19.2 12.8 32 32 32s32-12.8 32-32v-256c0-16-16-32-32-32zM931.2 0c-19.2 0-32 12.8-32 32v256c0 19.2 12.8 32 32 32s32-12.8 32-32v-256c0-16-16-32-32-32z" />
<glyph unicode="&#xe6b7;" glyph-name="profile1" d="M768 512c0 160-128 288-288 288s-288-128-288-288c0-108.8 57.6-201.6 147.2-249.6-121.6-48-214.4-153.6-240-288-3.2-16 6.4-35.2 25.6-38.4h3.2c16 0 28.8 9.6 32 25.6 28.8 150.4 160 259.2 313.6 262.4h6.4c160 0 288 128 288 288zM256 512c0 124.8 99.2 224 224 224s224-99.2 224-224c0-121.6-99.2-220.8-220.8-224h-9.6c-121.6 3.2-217.6 102.4-217.6 224zM896 192h-256c-19.2 0-32-12.8-32-32v-192c0-19.2 12.8-32 32-32h256c19.2 0 32 12.8 32 32v192c0 16-12.8 32-32 32zM864 0h-192v128h192v-128zM736 32h32c19.2 0 32 12.8 32 32s-12.8 32-32 32h-32c-19.2 0-32-12.8-32-32s16-32 32-32z" />
<glyph unicode="&#xe6b8;" glyph-name="home1" d="M96 416c-9.6 0-19.2 3.2-25.6 12.8-12.8 12.8-9.6 35.2 3.2 44.8l377.6 310.4c35.2 25.6 86.4 25.6 118.4 0l377.6-307.2c12.8-9.6 16-32 3.2-44.8s-32-16-44.8-3.2l-374.4 300.8c-9.6 6.4-28.8 6.4-38.4 0l-377.6-307.2c-6.4-6.4-12.8-6.4-19.2-6.4zM816-32h-208c-19.2 0-32 12.8-32 32v150.4c0 22.4-38.4 44.8-67.2 44.8s-64-19.2-64-44.8v-150.4c0-19.2-12.8-32-32-32h-201.6c-48 0-83.2 35.2-83.2 80v304c0 19.2 12.8 32 32 32s32-12.8 32-32v-304c0-9.6 6.4-16 19.2-16h172.8v118.4c0 64 67.2 108.8 128 108.8s131.2-44.8 131.2-108.8v-118.4h176c9.6 0 16 0 16 19.2v300.8c0 19.2 12.8 32 32 32s32-12.8 32-32v-304c-3.2-48-35.2-80-83.2-80z" />
<glyph unicode="&#xe6bb;" glyph-name="homefill" d="M947.2 473.6l-374.4 307.2c-32 25.6-86.4 25.6-118.4 0l-377.6-310.4c-12.8-6.4-16-22.4-9.6-35.2 3.2-12.8 16-19.2 28.8-19.2h32v-364.8c0-48 35.2-83.2 83.2-83.2h204.8c19.2 0 32 12.8 32 32v147.2c0 22.4 35.2 44.8 64 44.8s67.2-22.4 67.2-44.8v-147.2c0-19.2 12.8-32 32-32h208c48 0 80 32 80 83.2v364.8h32c12.8 0 25.6 9.6 28.8 22.4s0 25.6-12.8 35.2z" />
<glyph unicode="&#xe6d8;" glyph-name="roundaddfill" d="M828.704 699.424c-84.608 84.192-197.056 130.56-316.704 130.56s-232.128-46.368-316.736-130.56c-84.64-84.224-131.264-196.256-131.264-315.424 0-119.2 46.624-231.2 131.232-315.424 84.608-84.192 197.088-130.56 316.736-130.56s232.128 46.368 316.704 130.56c84.672 84.256 131.296 196.288 131.264 315.456 0.032 119.168-46.56 231.168-131.232 315.392zM736 352h-192v-192c0-17.696-14.336-32-32-32s-32 14.304-32 32v192h-192c-17.664 0-32 14.336-32 32s14.336 32 32 32h192v192c0 17.664 14.336 32 32 32s32-14.336 32-32v-192h192c17.696 0 32-14.336 32-32s-14.304-32-32-32z" />
<glyph unicode="&#xe6d9;" glyph-name="roundadd" d="M512-62.016c-119.648 0-232.128 46.368-316.736 130.56-84.64 84.256-131.264 196.256-131.264 315.456 0 119.168 46.624 231.2 131.232 315.424 84.608 84.192 197.088 130.56 316.736 130.56s232.128-46.368 316.704-130.56c84.672-84.224 131.264-196.256 131.264-315.392 0.032-119.2-46.592-231.232-131.264-315.456-84.544-84.192-197.024-130.592-316.672-130.592zM512 766.016c-102.624 0-199.072-39.744-271.584-111.936-72.48-72.128-112.416-168.064-112.416-270.080s39.904-197.952 112.384-270.048c72.512-72.192 168.96-111.936 271.584-111.936 102.592 0 199.072 39.744 271.584 111.936 72.48 72.16 112.416 168.064 112.384 270.080 0 102.016-39.904 197.92-112.384 270.016-72.48 72.192-168.96 111.968-271.552 111.968zM736 416h-192v192c0 17.664-14.336 32-32 32s-32-14.336-32-32v-192h-192c-17.664 0-32-14.336-32-32s14.336-32 32-32h192v-192c0-17.696 14.336-32 32-32s32 14.304 32 32v192h192c17.696 0 32 14.336 32 32s-14.304 32-32 32z" />
<glyph unicode="&#xe6f2;" glyph-name="fuxuankuang" d="M768 768h-512c-70.4 0-128-57.6-128-128v-512c0-70.4 57.6-128 128-128h512c70.4 0 128 57.6 128 128v512c0 70.4-57.6 128-128 128zM832 128c0-35.2-28.8-64-64-64h-512c-35.2 0-64 28.8-64 64v512c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64v-512z" />
<glyph unicode="&#xe6f5;" glyph-name="wefill" d="M768 163.2c-6.4 0-12.8 3.2-19.2 6.4-12.8 9.6-16 32-6.4 44.8 38.4 48 57.6 105.6 57.6 166.4 0 64-25.6 128-70.4 176-12.8 12.8-9.6 32 3.2 44.8s32 9.6 44.8-3.2c54.4-60.8 86.4-140.8 86.4-220.8 0-73.6-25.6-147.2-73.6-204.8-3.2-6.4-12.8-9.6-22.4-9.6zM275.2 163.2c-9.6 0-16 3.2-22.4 9.6-57.6 57.6-92.8 134.4-92.8 214.4s32 156.8 92.8 214.4c12.8 12.8 32 12.8 44.8 0s12.8-32 0-44.8c-44.8-48-73.6-108.8-73.6-169.6s25.6-121.6 73.6-169.6c12.8-12.8 12.8-32 0-44.8-6.4-6.4-12.8-9.6-22.4-9.6zM224 0c-6.4 0-16 3.2-22.4 6.4l-48 48c-76.8 92.8-121.6 208-121.6 329.6s44.8 240 124.8 329.6c16 16 28.8 32 44.8 44.8 16 9.6 35.2 9.6 48-3.2s9.6-32-3.2-44.8c-16-12.8-28.8-25.6-41.6-41.6-70.4-76.8-108.8-179.2-108.8-284.8s38.4-204.8 105.6-284.8c12.8-16 25.6-28.8 41.6-41.6 12.8-12.8 16-32 3.2-44.8-3.2-6.4-12.8-12.8-22.4-12.8zM800 0c-9.6 0-16 3.2-22.4 9.6-12.8 12.8-12.8 32 0 44.8 28.8 28.8 54.4 54.4 64 67.2 57.6 76.8 86.4 166.4 86.4 262.4 0 102.4-35.2 201.6-99.2 278.4-16 19.2-32 35.2-51.2 51.2-12.8 12.8-16 32-3.2 44.8s32 16 44.8 3.2c22.4-19.2 41.6-38.4 57.6-57.6 73.6-89.6 115.2-201.6 115.2-320 0-108.8-35.2-211.2-99.2-297.6-16-22.4-51.2-57.6-70.4-76.8-6.4-6.4-12.8-9.6-22.4-9.6zM672 489.6c-19.2 16-44.8 25.6-70.4 22.4s-48-16-64-35.2l-25.6-32-25.6 32c-32 41.6-92.8 48-134.4 12.8-19.2-16-32-41.6-32-67.2-3.2-25.6 6.4-51.2 22.4-73.6l96-118.4c19.2-22.4 44.8-35.2 70.4-35.2h3.2c28.8-3.2 57.6 12.8 76.8 35.2l96 118.4c32 41.6 25.6 105.6-12.8 140.8z" />
<glyph unicode="&#xe701;" glyph-name="sort" d="M384 576h512c17.696 0 32 14.336 32 32s-14.304 32-32 32h-512c-17.664 0-32-14.336-32-32s14.336-32 32-32zM896 416h-512c-17.664 0-32-14.336-32-32s14.336-32 32-32h512c17.696 0 32 14.336 32 32s-14.304 32-32 32zM896 192h-512c-17.664 0-32-14.304-32-32s14.336-32 32-32h512c17.696 0 32 14.304 32 32s-14.304 32-32 32zM128 608c0 35.346 28.654 64 64 64s64-28.654 64-64v0c0-35.346-28.654-64-64-64s-64 28.654-64 64v0zM128 384c0 35.346 28.654 64 64 64s64-28.654 64-64v0c0-35.346-28.654-64-64-64s-64 28.654-64 64v0zM128 160c0 35.346 28.654 64 64 64s64-28.654 64-64v0c0-35.346-28.654-64-64-64s-64 28.654-64 64v0z" />
<glyph unicode="&#xe738;" glyph-name="repair" d="M816.672-41.344c-8.192 0-16.384 3.136-22.624 9.376l-213.952 213.952c-12.512 12.512-12.512 32.736 0 45.248s32.736 12.512 45.248 0l191.328-191.328 33.408 33.376-190.848 190.848c-12.512 12.512-12.512 32.736 0 45.248s32.736 12.512 45.248 0l213.472-213.472c6.016-6.016 9.376-14.112 9.376-22.624s-3.36-16.64-9.376-22.624l-78.656-78.624c-6.272-6.24-14.464-9.376-22.624-9.376zM590.752 768c0 0.032 0 0.064 0 0.064 1.472 4.16 2.048 8.352 1.792 12.512 0 0 0 0 0 0s-0.032 0.064-0.032 0.096c-0.256 4.128-1.312 8.096-3.104 11.776-0.352 0.704-0.896 1.248-1.28 1.92-1.632 2.848-3.456 5.472-5.952 7.712-0.928 0.864-2.080 1.376-3.136 2.112-1.92 1.376-3.616 3.008-5.888 3.968-0.608 0.256-1.248 0.384-1.888 0.608-0.032 0-0.064 0.032-0.096 0.032-114.144 46.624-243.808 20.704-331.072-66.592-0.768-0.736-1.056-1.792-1.76-2.624-0.864-0.704-1.888-0.992-2.688-1.792l-161.984-161.344c-6.016-6.016-9.408-14.144-9.408-22.656s3.36-16.64 9.376-22.656l98.304-98.304c6.016-6.016 14.144-9.376 22.624-9.376s16.64 3.36 22.624 9.376l56.032 56.032 68.192-68.224c6.24-6.24 14.432-9.376 22.624-9.376s16.384 3.136 22.624 9.376c12.512 12.48 12.512 32.736 0 45.248l-90.816 90.848c-12.512 12.512-32.736 12.512-45.248 0l-56.032-56.032-52.992 53.024 139.264 138.72c0.832 0.8 1.12 1.888 1.824 2.752 0.864 0.704 1.92 0.992 2.72 1.824 40 39.936 91.296 63.072 144.864 68.768-2.208-1.664-4.384-3.392-6.56-5.12-8.96-6.784-17.632-14.016-25.664-22.048-0.544-0.544-0.736-1.248-1.216-1.824-19.232-19.36-35.936-41.024-49.568-64.512-2.464-4.224-4.768-8.448-7.008-12.736l0.416-0.224c-12.288-24.64-12.288-53.664 0.48-78.144 1.536-2.944 3.52-5.504 5.76-7.744 0.768-0.96 1.088-2.112 1.984-2.976l70.432-70.464c6.24-6.24 14.432-9.376 22.624-9.376s16.384 3.136 22.624 9.376c12.512 12.48 12.512 32.736 0 45.248l-67.072 67.072c-2.624 6.112-2.688 13.024 0.448 18.976 0.16 0.288 0.128 0.608 0.256 0.896 1.44 2.656 2.848 5.344 4.384 7.968 11.008 18.944 24.48 36.448 40.064 52.032 4.096 4.096 8.608 7.648 12.96 11.456 30.144 25.28 67.232 40.864 106.816 43.136 0.576 0.032 1.056 0.352 1.632 0.416 3.616 0.384 7.104 1.184 10.368 2.72 0.512 0.256 0.896 0.64 1.376 0.896 3.168 1.696 6.048 3.776 8.512 6.496 0.256 0.288 0.384 0.64 0.608 0.928 2.080 2.464 4.128 4.928 5.44 8.064 0.288 0.576 0.192 1.152 0.416 1.696zM289.536-64.032c-28.384 0-56.928 6.368-82.624 18.432-9.408 4.448-16.096 13.184-17.888 23.456-1.792 10.24 1.504 20.736 8.896 28.128l88.064 88.096-33.056 33.024-87.52-87.488c-7.424-7.424-18.048-10.848-28.384-8.832-10.336 1.888-19.104 8.704-23.392 18.304-32.736 72.64-17.088 159.072 38.944 215.104 50.048 50.080 126.048 68.384 193.952 47.040l238.688 238.72c-21.28 67.712-3.648 143.264 47.040 193.952 36.128 36.16 84.256 56.064 135.456 56.064 27.264 0 54.816-5.92 79.648-17.12 9.568-4.32 16.448-13.056 18.304-23.392 1.92-10.336-1.408-20.96-8.832-28.384l-88.8-88.8 33.024-33.056 89.376 89.344c7.392 7.392 17.92 10.72 28.128 8.896 10.272-1.792 19.040-8.48 23.456-17.888 34.496-73.376 19.424-160.96-37.536-217.92-36.096-36.096-84.128-56-135.296-56-20.704 0-41.536 3.392-61.216 9.952l-237.12-237.12c22.688-68.48 5.44-145.024-46.048-196.544-36.064-36.096-84.128-55.968-135.264-55.968zM282.592 0.16c36.352-2.112 71.36 11.392 96.992 37.024 37.952 37.952 47.936 96.384 24.864 145.408-5.76 12.224-3.232 26.72 6.336 36.256l266.816 266.848c9.536 9.536 24.032 12.032 36.256 6.336 47.936-22.56 108-12.544 145.408 24.864 25.952 25.92 38.784 61.408 36.992 96.96l-72.576-72.544c-6.016-6.016-14.112-9.376-22.624-9.376v0c-8.512 0-16.64 3.36-22.624 9.376l-78.272 78.272c-12.512 12.512-12.512 32.736 0 45.248l71.040 71.040c-35.072 0.896-68.8-12.384-93.696-37.28-37.92-37.92-48.064-94.272-25.856-143.552 5.44-12.128 2.848-26.368-6.56-35.776l-267.936-267.968c-9.376-9.376-23.648-11.936-35.776-6.56-47.68 21.504-106.624 11.104-143.584-25.856-25.504-25.536-38.464-59.392-37.408-93.856l69.92 69.92c12.512 12.512 32.736 12.512 45.248 0l78.304-78.272c6.016-6.016 9.376-14.112 9.376-22.624 0-8.48-3.36-16.64-9.376-22.624l-71.264-71.264z" />
<glyph unicode="&#xe742;" glyph-name="shujudaping" d="M120.406 675.469v-523.031h776.719v523.031h-776.719zM865.344 184.125h-713.25v459.656h713.25v-459.656zM706.813 516.937c-17.531 0-31.688-14.156-31.688-31.688 0-3.844 0.656-7.5 1.875-10.875l-121.313-94.313c-5.813 6.188-14.063 10.125-23.25 10.125-8.719 0-16.688-3.563-22.406-9.281l-59.625 59.625c1.781 3.938 2.813 8.438 2.813 13.031 0 17.531-14.156 31.688-31.688 31.688s-31.688-14.156-31.688-31.688c0-4.031 0.75-7.875 2.156-11.438l-74.25-61.875c-5.813 6.094-13.969 9.938-22.969 9.938-17.531 0-31.688-14.156-31.688-31.688s14.156-31.688 31.688-31.688c17.531 0 31.688 14.156 31.688 31.688 0 4.031-0.75 7.875-2.156 11.438l74.25 61.875c5.813-6.094 13.969-9.938 22.969-9.938 8.719 0 16.688 3.563 22.406 9.281l59.625-59.625c-1.781-3.938-2.813-8.438-2.813-13.031 0-17.531 14.156-31.688 31.688-31.688s31.688 14.156 31.688 31.688c0 3.844-0.656 7.5-1.875 10.875l121.406 94.313c5.813-6.188 14.063-10.125 23.25-10.125 17.531 0 31.688 14.156 31.688 31.688s-14.25 31.688-31.781 31.688zM294.688 342.656c-8.719 0-15.844 7.125-15.844 15.844s7.125 15.844 15.844 15.844c8.719 0 15.844-7.125 15.844-15.844s-7.031-15.844-15.844-15.844zM421.531 437.719c-8.719 0-15.844 7.125-15.844 15.844s7.125 15.844 15.844 15.844 15.844-7.125 15.844-15.844-7.125-15.844-15.844-15.844zM532.531 342.656c-8.719 0-15.844 7.125-15.844 15.844s7.125 15.844 15.844 15.844 15.844-7.125 15.844-15.844-7.125-15.844-15.844-15.844zM706.813 469.406c-8.719 0-15.844 7.125-15.844 15.844s7.125 15.844 15.844 15.844c8.719 0 15.844-7.125 15.844-15.844s-7.031-15.844-15.844-15.844zM593.938 136.594l33.656-95.063h-253.594l33.656 95.063h-33.469l-47.719-126.844h348.75l-47.719 126.844h-33.563zM849.5 627.937h-681.563v-15.844h681.563v15.844z" />
<glyph unicode="&#xe771;" glyph-name="xiangxia1" d="M163.397 606.831c-40.578 0-66.525-54.185-35.441-85.258l349.262-349.278c20.032-20.032 49.824-20.032 69.854 0l349.274 349.278c30.305 30.294 6.678 85.258-34.929 85.258h-698.021zM959.524 37.208" />
<glyph unicode="&#xe78f;" glyph-name="xiangyou" d="M289.169 35.397c0-40.578 54.185-66.525 85.258-35.441l349.278 349.262c20.032 20.032 20.032 49.824 0 69.854l-349.278 349.274c-30.294 30.305-85.258 6.678-85.258-34.929v-698.021zM858.792 831.524" />
<glyph unicode="&#xe7a5;" glyph-name="dian" d="M352 384c0-88.366 71.634-160 160-160s160 71.634 160 160v0c0 88.366-71.634 160-160 160s-160-71.634-160-160v0z" />
<glyph unicode="&#xe807;" glyph-name="search_list_light" d="M953.6 100.267l-145.067 192c53.333 44.8 89.6 113.067 89.6 187.733-2.133 136.533-110.933 245.333-247.467 245.333-134.4 0-245.333-108.8-245.333-245.333s110.933-245.333 245.333-245.333c44.8 0 85.333 12.8 121.6 32v-2.133l145.067-192c4.267-6.4 10.667-8.533 17.067-8.533 4.267 0 8.533 2.133 12.8 4.267 10.667 8.533 12.8 23.467 6.4 32zM448 480c0 110.933 91.733 202.667 202.667 202.667s202.667-91.733 202.667-202.667-91.733-202.667-202.667-202.667-202.667 91.733-202.667 202.667zM128 618.667h192c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333h-192c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333zM128 405.333c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h128c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333h-128zM467.2 194.133h-341.333c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h341.333c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333z" />
<glyph unicode="&#xe82b;" glyph-name="round_list_light" d="M512 832c-247.467 0-448-200.533-448-448s200.533-448 448-448 448 200.533 448 448-200.533 448-448 448zM512-21.333c-224 0-405.333 181.333-405.333 405.333s181.333 405.333 405.333 405.333 405.333-181.333 405.333-405.333-181.333-405.333-405.333-405.333zM746.667 554.667h-298.667c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h298.667c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333zM277.333 533.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM746.667 405.333h-298.667c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h298.667c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333zM277.333 384c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM746.667 256h-298.667c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h298.667c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333zM277.333 234.667c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0z" />
<glyph unicode="&#xe832;" glyph-name="star-fill" d="M752-43.2c-9.6 0-20.8 3.2-30.4 8l-208 104-209.6-104c-20.8-11.2-48-9.6-67.2 4.8s-30.4 40-25.6 64l43.2 224-164.8 153.6c-17.6 17.6-24 44.8-17.6 67.2 8 24 27.2 41.6 52.8 44.8l228.8 41.6 102.4 208c11.2 22.4 33.6 36.8 57.6 36.8s48-14.4 57.6-36.8l102.4-208 228.8-40c24-3.2 44.8-20.8 51.2-44.8 8-24 1.6-49.6-16-67.2l-164.8-155.2 41.6-224c4.8-25.6-6.4-49.6-25.6-64-9.6-8-22.4-12.8-36.8-12.8z" />
<glyph unicode="&#xe833;" glyph-name="rate" d="M959.008 489.984l-308 47.008-139.008 295.008-139.008-295.008-308-47.008 223.008-228-52.992-324 276.992 152.992 276.992-152.992-52.992 324zM512 156l-208-116.992 40 235.008-179.008 182.016 242.016 32 104.992 224 104-224 240.992-34.016-176.992-180.992 36.992-235.008z" />
<glyph unicode="&#xea47;" glyph-name="move-up" d="M704 384v-384h64v384h160l-192 192-192-192zM64 704h96v-64h-96v64zM192 704h96v-64h-96v64zM320 704h64v-96h-64v96zM64 480h64v-96h-64v96zM160 448h96v-64h-96v64zM288 448h96v-64h-96v64zM64 608h64v-96h-64v96zM320 576h64v-96h-64v96zM320 192v-192h-192v192h192zM384 256h-320v-320h320v320z" />
<glyph unicode="&#xea48;" glyph-name="move-down" d="M768 192v384h-64v-384h-160l192-192 192 192zM320 640v-192h-192v192h192zM384 704h-320v-320h320v320zM64 256h96v-64h-96v64zM192 256h96v-64h-96v64zM320 256h64v-96h-64v96zM64 32h64v-96h-64v96zM160 0h96v-64h-96v64zM288 0h96v-64h-96v64zM64 160h64v-96h-64v96zM320 128h64v-96h-64v96z" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 60 KiB

@@ -0,0 +1,283 @@
{
"data": [{
"cls": "dtree-icon-xiangxia1",
"uncode": "e771"
},
{
"cls": "dtree-icon-xiangyou",
"uncode": "e78f"
},
{
"cls": "dtree-icon-jian",
"uncode": "e656"
},
{
"cls": "dtree-icon-jia",
"uncode": "e657"
},
{
"cls": "dtree-icon-weibiaoti5",
"uncode": "e618"
},
{
"cls": "dtree-icon-wenjianjiazhankai",
"uncode": "e60e"
},
{
"cls": "dtree-icon-dian",
"uncode": "e7a5"
},
{
"cls": "dtree-icon-yonghu",
"uncode": "e603"
},
{
"cls": "dtree-icon-fenzhijigou",
"uncode": "e658"
},
{
"cls": "dtree-icon-fenguangbaobiao",
"uncode": "e655"
},
{
"cls": "dtree-icon-xinxipilu",
"uncode": "e620"
},
{
"cls": "dtree-icon-shuye1",
"uncode": "e61e"
},
{
"cls": "dtree-icon-caidan_xunzhang",
"uncode": "e68e"
},
{
"cls": "dtree-icon-normal-file",
"uncode": "e60c"
},
{
"cls": "dtree-icon-roundclose",
"uncode": "e65c"
},
{
"cls": "dtree-icon-bianji",
"uncode": "e602"
},
{
"cls": "dtree-icon-roundadd",
"uncode": "e6d9"
},
{
"cls": "dtree-icon-fuxuankuangxuanzhong",
"uncode": "e652"
},
{
"cls": "dtree-icon-fuxuankuang",
"uncode": "e6f2"
},
{
"cls": "dtree-icon-fuxuankuang-banxuan",
"uncode": "e607"
},
{
"cls": "dtree-icon-search_list_light",
"uncode": "e807"
},
{
"cls": "dtree-icon-move-up",
"uncode": "ea47"
},
{
"cls": "dtree-icon-move-down",
"uncode": "ea48"
},
{
"cls": "dtree-icon-delete1",
"uncode": "e640"
},
{
"cls": "dtree-icon-refresh",
"uncode": "e6a4"
},
{
"cls": "dtree-icon-roundcheckfill",
"uncode": "e659"
},
{
"cls": "dtree-icon-roundclosefill",
"uncode": "e65b"
},
{
"cls": "dtree-icon-roundcheck",
"uncode": "e65a"
},
{
"cls": "dtree-icon-pulldown",
"uncode": "e6a0"
},
{
"cls": "dtree-icon-pullup",
"uncode": "e6a1"
},
{
"cls": "dtree-icon-set-sm",
"uncode": "e621"
},
{
"cls": "dtree-icon-rate",
"uncode": "e833"
},
{
"cls": "dtree-icon-jian1",
"uncode": "e600"
},
{
"cls": "dtree-icon-jia1",
"uncode": "e601"
},
{
"cls": "dtree-icon-shijian",
"uncode": "e606"
},
{
"cls": "dtree-icon-check",
"uncode": "e645"
},
{
"cls": "dtree-icon-close",
"uncode": "e646"
},
{
"cls": "dtree-icon-favorfill",
"uncode": "e64b"
},
{
"cls": "dtree-icon-favor",
"uncode": "e64c"
},
{
"cls": "dtree-icon-roundrightfill",
"uncode": "e65d"
},
{
"cls": "dtree-icon-roundright",
"uncode": "e65e"
},
{
"cls": "dtree-icon-samefill",
"uncode": "e671"
},
{
"cls": "dtree-icon-same",
"uncode": "e672"
},
{
"cls": "dtree-icon-qrcode1",
"uncode": "e6b0"
},
{
"cls": "dtree-icon-profile1",
"uncode": "e6b7"
},
{
"cls": "dtree-icon-home1",
"uncode": "e6b8"
},
{
"cls": "dtree-icon-homefill",
"uncode": "e6bb"
},
{
"cls": "dtree-icon-roundaddfill",
"uncode": "e6d8"
},
{
"cls": "dtree-icon-wefill",
"uncode": "e6f5"
},
{
"cls": "dtree-icon-sort",
"uncode": "e701"
},
{
"cls": "dtree-icon-round_list_light",
"uncode": "e82b"
},
{
"cls": "dtree-icon-search2",
"uncode": "e615"
},
{
"cls": "dtree-icon-close1",
"uncode": "1006"
},
{
"cls": "dtree-icon-close-fill",
"uncode": "1007"
},
{
"cls": "dtree-icon-chart-screen",
"uncode": "e62a"
},
{
"cls": "dtree-icon-star",
"uncode": "e608"
},
{
"cls": "dtree-icon-ok-circle",
"uncode": "1005"
},
{
"cls": "dtree-icon-add-circle",
"uncode": "e61f"
},
{
"cls": "dtree-icon-about",
"uncode": "e623"
},
{
"cls": "dtree-icon-circle1",
"uncode": "e687"
},
{
"cls": "dtree-icon-radio",
"uncode": "e688"
},
{
"cls": "dtree-icon-star-fill",
"uncode": "e832"
},
{
"cls": "dtree-icon-shujudaping",
"uncode": "e742"
},
{
"cls": "dtree-icon-share3",
"uncode": "e641"
},
{
"cls": "dtree-icon-youjian",
"uncode": "e642"
},
{
"cls": "dtree-icon-repair",
"uncode": "e738"
},
{
"cls": "dtree-icon-evaluate",
"uncode": "e674"
},
{
"cls": "dtree-icon-like",
"uncode": "e66c"
},
{
"cls": "dtree-icon-layim-theme",
"uncode": "e61b"
},
{
"cls": "dtree-icon-xiangmuxiaoxi",
"uncode": "e60f"
}
]
}
@@ -0,0 +1,332 @@
大改》 修复 》 优化 》 新增 》 更新 》 移除
基础属性 》 checkbar属性 》 menubar属性 》 toolbar属性 》 iframe属性 》 基础方法 》 内置方法
------------------------v2.5.8(2020/?/?)【优化】:------------------------
【修复】toolbar模块修复:默认编辑页面中,提交失败的问题。
【修复】menubar模块修复:点击收缩节点按钮导致树数据节点错乱,重复加载节点的问题。
【修复】基础数据模块修复:当复选框字段存在且传递数据为null的时候,解析失败的问题。
【优化】异步模块优化:success回调函数现在可以存在返回值,返回的值为你重新设置的树的数据。
【优化】toolbar模块优化:当toolbarShow设置为[]时,点击右键会出现一个白色的小框的问题。
【优化】toolbar模块优化:点击pullup按钮导致树数据节点错乱,重复加载节点的问题。
------------------------v2.5.7(2020/01/19)【优化】:------------------------
【修复】select模块修复:当设置默认值时,存在点击select面板后,默认值消失的问题。
【修复】select模块修复:带复选框的下拉树设置默认值无效的问题。
【修复】内置属性修复:修复response设置了checked和type映射却无效的问题
【新增】内置函数新增:fuzzySearch,模糊查询,搜索节点,保留父节点。
【优化】内置函数优化:setDisabledNodes,现支持传入单个数据、带分隔符的字符串、数组、二维数组。
【新增】内置函数新增:setDisabledNode,设置单个节点的禁用
【优化】内置函数优化:cancelDisabledNodes,现支持传入单个数据、带分隔符的字符串、数组、二维数组。
【新增】内置函数新增:cancelDisabledNode,设置单个节点的取消禁用
【优化】内置函数优化:getDisabledNodesParam,现支持传入单个数据、带分隔符的字符串、数组、二维数组。
【优化】内置函数优化:setHideNodes,现支持传入单个数据、带分隔符的字符串、数组、二维数组。
【新增】内置函数新增:setHideNode,设置单个节点的隐藏
【优化】内置函数优化:cancelHideNodes,现支持传入单个数据、带分隔符的字符串、数组、二维数组。
【新增】内置函数新增:cancelHideNode,设置单个节点的取消隐藏
【优化】内置函数优化:getHideNodesParam,现支持传入单个数据、带分隔符的字符串、数组、二维数组。
【优化】内置函数优化:chooseDataInit,现支持传入单个数据、带分隔符的字符串、数组、二维数组(多级复选框)。
【新增】基础方法新增:getCheckbarJsonArrParam,获取基于返回参数的树的复选框参数,选中数据横向存储
【新增】基础方法新增:beforeSend,异步加载发送ajax请求之前的回调
【新增】基础方法新增:serialize,序列化json对象
【优化】基础方法优化:success方法,新增一个入参,表示是否第一次渲染数据,并支持在增量加载时,加载子节点时也可以回调该方法。
【优化】基础方法优化:done方法,新增一个入参,表示是否第一次渲染数据,并支持在增量加载时,在加载子节点时也可以回调该方法。
【优化】内置方法优化:dataInit方法,仅支持一个节点改变背景色的优化。
【优化】内置方法优化:init方法,入参新增一个异步加载完成后的回调函数,内部使用。
【优化】内置方法优化:getChild方法,入参新增一个异步加载完成后的回调函数,内部使用。
【优化】异步加载优化:使用data加载,也会出现load效果。
【优化】toolbat模块优化:当设置dataFormat时,默认的增删改数据中会出现dataFormat配置的元素,优化之后仅获取文字。
【优化】select模块优化:自适应当前组件的位置,向上或向下展开树。
【新增】基础属性新增:asyncLoad,异步加载初始加载层级树组
【新增】基础属性新增:selectCardHeight,树面板的高度
【新增】内置方法新增:loadTreeInit,初始化加载树
【新增】内置方法新增:loadChildTreeInit,初始化加载子节点
【新增】内置方法新增:dataLoadTree,用data加载树
【新增】内置方法新增:asyncLoadTree,异步加载树
------------------------v2.5.6(2019/10/24)【新增】:------------------------
【修复】标签属性修复:ul标签上data-value属性设置无效的问题
【优化】数据格式:获取格式中的basicData和recordData将提前转化为JSON格式,不在需要手动转换。
【优化】基础方法优化:render,支持加载下拉树
【优化】基础方法优化:reload,支持重载下拉树
【新增】基础属性新增:bak,内置属性,备份Html。
【新增】事件监听:changeSelect,下拉树面板开闭状态改变后,触发事件。
【新增】内置方法新增:rollbackHtml,基于备份的Html数据回滚
【新增】内置方法新增:setDisabledAllNodes,设置全部节点为disabled
【新增】内置方法新增:reloadSelectSetting,重新设置下拉树的基本参数
【新增】内置方法新增:reloadSelectDom,重新渲染下拉树的Dom结构
【新增】内置方法新增:selectCheckboxVal,设置复选框模式中的下拉树的值
【新增】内置方法新增:getCheckbarJsonArrParam,获取基于返回参数的树的复选框参数数组
【新增】内置方法新增:checkAllNode,复选框全选
【新增】内置方法新增:cancelCheckedNode,取消全部复选框选中
【新增】内置方法新增:invertCheckedNode,反选复选框
【新增】内置方法新增:removeCheckedNode,删除选中节点
------------------------v2.5.5(2019/10/12)【新增】:------------------------
【修复】内置方法修复:partialRefreshEdit,支持修改parentId后及时返显到下挂节点
【优化】单页模式中树的缓存问题
【优化】基础属性优化,开启line时,toolbar的fixed显示不正常
【优化】基础属性优化,开启line时,div选中 悬停背景对齐
【优化】基础方法优化:success方法的放置位置,可以将不同的数据格式在success方法内做转换,或添加根节点。
【优化】iframe模块优化:将原来用iframe包住的属性提出,撤销iframe这一层。
【优化】内置属性优化:scroll属性更名为scroll。
【优化】内置方法优化:当异步加载出现异常时,以文字形式而非弹框形式提示。
【新增】标签属性新增:ul标签上新增data-value属性,用于指定下拉树的初始展示值
【新增】基础属性新增:width,设置树的宽度
【新增】基础属性新增:select,设置树模式为下拉树
【新增】基础属性新增:selectTips,设置下拉树时的输入框提示文字
【新增】基础属性新增:selectInputName,设置下拉树内部表单标签的name
【新增】基础属性新增:selectInitVal,设置下拉树的初始展示值
【新增】基础属性新增:withCredentials,用于开启生成跨域的XHR对象,设置后可指定同源session,默认false。
【新增】基础方法新增:set,可以增加同一次引用中,dtree的公共属性指定,所有基础属性都可以指定。
【新增】基础方法新增:renderSelect,初始化下拉树
【新增】基础方法新增:selectVal,设置下拉树的初始展示值
【新增】内置方法新增:selectVal,设置下拉树的初始展示值
【新增】内置方法新增:selectSetting,设置下拉树的初始元素
【新增】内置方法新增:renderSelectDom,渲染下拉树的Dom结构
【新增】内置方法新增:clickNodeCheckbar,点击节点选中复选框
【更新】内置方法更新:getNoneDom方法,添加errText子方法,显示错误信息。
------------------------v2.5.4(2019/6/14)【修复】:------------------------
【修复】内置方法中,使用data方法获取值不到的问题。
【优化】基础属性优化:ficon,可以设置Array型数据,与icon的配置方式相同
【优化】基础属性优化:skin,其中设置layui看起来更像layui的风格,新增laySimple风格,遵从简约版layui树形菜单。
【优化】内置方法优化:涉及样式的一系列内置方法优化
【新增】基础属性新增:height,调整高度,与table用法一致
【新增】基础属性新增:response中新增ficonClass,可以指定一级图标样式。
【新增】内置方法新增:cancelNavThis,取消选中div。
【更新】内置方法更新:parseData:增加对ficonClass属性的解析
【更新】内置方法更新:changeCheck,可以通过传递参数的方式传递复选框dom。
【移除】基础属性移除:dot,移除一级图标小圆点的单独设置,改为在ficon中配置,与icon的配置方式相同
【移除】基础属性移除:firstIconArray,与nodeIconArray合并。
------------------------v2.5.0(2019/6/01)【适配】:------------------------
【适配】对layui2.5适配
【修复】基础属性修复,error方法,现在可以正确的获取参数列表中的参数,如无定义则默认打印textStatus。
【修复】基础属性修复,complete方法,现在可以正确的获取参数列表中的参数
【优化】一系列内置方法优化
【新增】基础属性新增:line,用于指定树线
【新增】内置方法新增:showLine:用于显示树线
【新增】内置方法新增:showLineLi:作用在单个LI显示树线
------------------------v2.5.0(2019/5/20)【大版本】:------------------------
【大改】数据格式:reponse中isLast属性更换为last属性。
【大改】数据格式:reponse中isChecked属性更换为checked属性。
【大改】数据格式:defaultRequest中isLeaf属性更换为leaf属性。
【大改】数据格式:defaultRequest中isChecked属性更换为checked属性。
【大改】内置属性:record开启后,原来记录节点的全部数据(排除children和basicData)改为只记录用户自定义的数据(同样排除children和basicData
【修复】toolbar模块修复:自定义的toolbar的回调函数的第二个$div参数修复,现在可以取到值
【修复】toolbar模块修复:内置函数:changeTreeNodeEdit中的title未定义的问题。
【修复】menubar模块修复:将dtree放在form中,menubar的默认按钮单击之后会提交表单的问题。
【修复】iframe模块修复:配置了iframeDefaultRequest时,只会显示iframeDefaultRequest中的参数的问题。
【优化】toolbar模块优化:内置的三个按钮中的label均加上title提示
【优化】基础方法优化:render方法和reload方法中,如果树在当前页面中被加载过一次了,再次加载会从缓存中取出树,并将树上次点击的节点作为参数记录下载,现在优化为还是从缓存中取,但是会重置上次记录的参数。
【优化】内置函数优化:getLiItemDom 当parentId为0时组件自动判定为false从而使用内置parentId的问题。
【新增】基础属性新增:iconfont属性,用于定义使用图标数组或string
【新增】基础属性新增:iconfontStyle属性,用于自定义树的每个关键部位使用的图标
【新增】基础属性新增:accordion属性,用于开启手风琴模式
【新增】基础属性新增:contentType属性,用于可以显示配置发送信息至服务器时内容编码类型
【新增】基础属性新增:response属性中新增disabled,标识节点禁用。
【新增】基础属性新增:response属性中新增isHide,标识节点隐藏。
【新增】基础属性新增:formatter属性,用于对树展示节点的文字信息格式化处理。
【新增】基础属性新增:errDataShow属性,标识是否在递归数据出现错误后,显示错误信息。
【新增】基础属性新增:none,用于定于树初始化未加载节点时的提示文字。
【新增】基础属性新增:error:用于异步加载中出现异常时的用户自定义函数。
【新增】基础属性新增:errDataShow属性,标识是否在递归数据出现错误后,显示错误信息。
【新增】基础属性新增:drawable属性,用于开启拖拽。
【新增】基础方法新增:getParam: 获取指定节点选中值
【新增】基础方法新增:getAllParentParam 获取指定节点的全部上级节点
【新增】基础方法新增:initNoAllCheck: 复选框半选状态初始化设置
【新增】基础方法新增:initAllCheck: 复选框选中状态初始化设置
【新增】基础方法新增:click:模拟单击事件
【新增】checkbar模块新增:checkbarData新增属性:"halfChoose",用于记录选中和半选中的数据
【新增】menubar模块新增:menubar内置新增三个默认方法:checkAll:全选,unCheckAll:全不选,invertAll:反选
【新增】toolbar模块新增:toolbar内置新增两个默认方法:pulldown:展开当前节点下的全部节点,pullup:收缩当前节点下的全部节点
【新增】toolbar模块新增:toolbar新增属性:toolbarWay,工具栏显示方式,contextmenu:右键,follow:跟随节点,fixed:固定在节点右侧
【新增】toolbar模块新增:toolbarBtn中新增一系列的属性(id、placeholder、verify、defElem、readonly、disabled、filter
【新增】toolbar模块新增:toolbarBtn中,optionsData支持使用function回调
【新增】内置属性新增:errNode属性,记录在渲染节点时有问题的数据。
【新增】内置属性新增:usefontStyle属性,用于最终指定树的每个关键部位使用的图标
【新增】内置方法新增:replaceDom:替换节点的dom值,或指定值。
【新增】内置方法新增:partialRefreshAdd:局部刷新树--当前节点新增子节点时
【新增】内置方法新增:partialRefreshEdit:局部刷新树--当前节点选中时
【新增】内置方法新增:partialRefreshDel:局部刷新树--当前节点选中被删除时
【新增】内置方法新增:ensureTheme:确认最终主题。
【新增】内置方法新增:useDefaultOrUserDefineFnodeStyle:赋值一级图标
【新增】内置方法新增:useDefaultOrUserDefineSnodeStyle:赋值二级图标
【新增】内置方法新增:useDefaultOrUserDefineCheckboxStyle:赋值复选框图标
【新增】内置方法新增:useDefaultOrUserDefineMenubarStyle:赋值菜单栏图标
【新增】内置方法新增:useDefaultOrUserDefineMenubarExtStyle:赋值扩展菜单栏图标
【新增】内置方法新增:useDefaultOrUserDefineToolbarStyle:赋值扩展菜单栏图标
【新增】内置方法新增:useDefaultOrUserDefineToolbarExtStyle:赋值扩展工具栏图标
【新增】内置方法新增:operateIcon: 设置图标的展开关闭,以及展开时/关闭时是最后一级图标的处理
【新增】内置方法新增:msgErrNode: 判断在数据加载时是否存在错误数据,并是否打印错误数据
【新增】内置方法新增:getParam: 获取指定节点选中值
【新增】内置方法新增:getAllParentParam 获取指定节点的全部上级节点
【新增】内置方法新增:getNodeDom: 根据具体的id获取基于当前id的div以及对应的其他dom元素
【新增】内置方法新增:getNode: 获取指定节点Div
【新增】内置方法新增:accordionUL: 开启手风琴模式时对其他节点的处理
【新增】内置方法新增:setDisabledNodes 设置节点为disabled
【新增】内置方法新增:cancelDisabledNodes:将节点的disabled取消
【新增】内置方法新增:getDisabledNodesParam 获取指定disabled节点的值
【新增】内置方法新增:getAllDisabledNodesParam 获取全部disabled节点的值
【新增】内置方法新增:setHideNodes 设置节点为hide
【新增】内置方法新增:cancelHideNodes 将节点的hide取消
【新增】内置方法新增:getHideNodesParam 获取指定hide节点的值
【新增】内置方法新增:getAllHideNodesParam 获取全部hide节点的值
【新增】内置方法新增:toolbarHide:隐藏toolbar
【新增】内置方法新增:toolbarMethodtoolbar内置方法
【新增】内置方法新增:toolbarListenertoolbar内置监听
【新增】内置方法新增:getNowNodeOrNull:获取当前选中div,没有选中则为null
【新增】内置方法新增:navThis:选中div
【新增】内置方法新增:getNoneDom:当无节点数据时显示dom信息
【新增】内置方法新增:dynamicToolbarDom:在节点后动态绑定fixed和follow条件的工具栏
【更新】内置方法更新:setToolbarDom,设置工具栏按钮,现在区别开来哪种toolbar的创建方式
【更新】内置方法更新:changeTreeNodeAdd新增一个回传参数:refresh,用于新增完成后,局部刷新
【更新】内置方法更新:parseData新增一个回传参数:fmtTitle,用于获取formatter标记过的内容,原来的title函数只获取原始title信息
------------------------v2.4.5_finally(2018/12/22)【修复】:------------------------
1.【修复】单页应用中,未开启toolbar导致body上的所有事件失效。
2.【优化】更新dist文件夹中的dtree压缩
3.【优化】toolbar模块优化:新增节点时,当开启了record参数时不会将参数新增到节点上的问题。
------------------------v2.4.5_finally(2018/12/21)【优化】:------------------------
1.【优化】menubar模块优化:点击收缩时,当前页的所有树都收缩的问题。
2.【优化】menubar模块优化:点击删除复选框时,展开和收缩节点会报错,现在改为删除的节点如果有子集的话,子集会一并删除,但是回调函数中只会提供你勾中的数据。
3.【优化】基础方法优化:dataInit方法回显数据时,当前选中的数据无法被获取到的问题。
4.【优化】基础方法优化:parseData方法的basicData()方法,basicData如果未指定,前端的该项属性无数据,而不是""
5.【优化】异步属性优化:使用data加载时,可以允许指定的data为[]。
6.【优化】异步属性优化:使用data加载时,现在也有success和done的回调
7.【新增】checkbar模块新增:checkbarType新增属性:"only",用于模拟单选,只能同时选择一个复选框。
8.【新增】异步回调方法新增:新增success回调,用于数据加载完毕后的回调,在done之前执行
9.【新增】异步属性新增:filterRequest属性,用于过滤树自动发起的请求中你不需要的参数。
10.【新增】基础属性新增:record属性,开启数据记录模式,用于记录用户提供的JSON数据串中,指定当前节点的JSON数据(排除basicData字段和children字段)
11.【新增】基础属性新增:load属性,是否开启加载遮罩。
12.【新增】内置函数新增:getFilterRequestParam,获取filterParam过滤后的requestParam
------------------------v2.4.5_finally_beta(2018/12/07)【大改】:------------------------
0.【新增】提供的内容中新增dist/dtree.js压缩js文件。
1.【大改】csscss样式均加上dtree前缀。
2.【大改】图标:iconfont更改为dtreefont。
3.【大改】事件监听:图标点击事件返回的参数改为一个JSON对象,具体查看基础文档的事件监听。
4.【大改】事件监听:节点点击事件返回的参数改为一个JSON对象,具体查看基础文档的事件监听。
5.【大改】事件监听:节点双击事件返回的参数改为一个JSON对象,具体查看基础文档的事件监听。
6.【大改】事件监听:复选框点击事件返回的参数改为一个JSON对象,具体查看基础文档的事件监听。
7.【大改】事件监听:iframe加载完毕事件返回的参数改为一个JSON对象,具体查看基础文档的事件监听。
8.【新增】基础方法新增:getChildParam,获取全部下级节点
9.【新增】menubar模块新增:menubarTips属性,用于指定menubar的依附方式。
10.【新增】toolbar模块新增:toolbarFun新增loadToolbarBefore函数,用于呈现右键菜单之前调用的函数。
11.【新增】内置函数新增:initTreePlus 用于初始化菜单栏和工具栏的div。
12.【新增】内置函数新增:openTreePlus 用于开启工具栏和菜单栏。
13.【新增】内置函数新增:getMenubarDom 用于获取菜单栏。
14.【新增】内置函数新增:getExtMenubarDom 用于获取扩展菜单栏。
15.【新增】内置函数新增:getMenubarToolDom 用于获取依附在工具栏的菜单栏。
16.【新增】内置函数新增:getExtMenubarToolDom 用于获取依附在工具栏的扩展菜单栏。
17.【新增】内置函数新增:menubarMethod 用于menubar内置调用方法。
17.【新增】内置函数新增:menubarListener 用于menubar内置监听。
18.【新增】内置函数新增:setToolbarDom 用于设置工具栏按钮。
19.【新增】内置函数新增:unbindBrowserEvent 用于解绑浏览器事件。
19.【新增】内置属性新增:response属性中新增spread。
20.【优化】优化了图标显示。
21.【优化】toolbar模块:单页应用中,右键菜单的显示位置问题。
22.【优化】menubar模块:在开启了toolbar模块时按钮点击失效的问题。
23.【优化】iframe模块:iframeuUrl指定了"?"时,实际发送的url会出现两个"?"的问题。
23.【优化】数据格式:默认数据格式中非必须指定isLast属性,移除level属性的作用。
24.【修复】数据格式:在开启了list风格参数时,修复必须指定isLast返回的问题和设置initLevel无效的问题。
25.【修复】toolbar模块:新增节点返回json格式后显示数据未定义的问题。
26.【移除】内置函数移除:refreshTree,现放置在menubarMethod方法中。
27.【移除】内置函数移除:openAllNode,现放置在menubarMethod方法中。
28.【移除】内置函数移除:closeAllNode,现放置在menubarMethod方法中。
28.【移除】内置函数移除:loadChildTree。
29.【移除】内置函数移除:openMenubar。
30.【移除】内置函数移除:openToolbar。
31.【移除】内置属性移除:level。
32.【移除】内置属性移除:response属性中移除level。
------------------------v2.4.5(2018/11/30)【修复】:------------------------
1.【修复】基础方法修复:dataInit方法的返回数据异常。
2.【修复】基础方法修复:render函数自动识别是否重载树,代码再次修复(针对单页应用)。
3.【新增】内置函数新增:refreshTree,用于刷新树。
4.【新增】内置函数新增:parseData 用于解析数据。
5.【优化】checkbar模块:checkArr属性支持传递字符串。
6.【修复】toolbar模块:拼接新增节点内容的代码异常 。
------------------------v2.4.5(2018/11/25)【修复】:------------------------
1.【修复】render函数自动识别是否重载树,代码修复。
2.【修复】内部代码bug。
3.【优化】修改了右键菜单弹出的动画效果。
------------------------v2.4.5(2018/11/25)【新增】:------------------------
1.【优化】优化了图标显示。
2.【新增】内置图标新增。
3.【新增】ficon属性:用于用户自定义一级图标
4.【新增】firstIconArray属性:用于用户自定义扩展一级图标
5.【新增】异步加载模块添加headers属性。
6.【新增】toolbar模块:新增属性toolbarExt,用于自定义扩展工具栏右键菜单按钮
7.【新增】checkbar模块:新增checkbarFun中的回调方法:chooseBefore,用于复选框点击前回调
8.【新增】内置函数新增:changeCheck,用于改变复选框状态。
9.【优化】render函数自动识别是否重载树。
10.【优化】内部代码优化。
11.【更新】更新了帮助文档
------------------------v2.4.5(2018/11/23)【修复】:------------------------
1.【修复】toolbar模块点击删除按钮时,控制台报错。
2.【修复】配置了dot:false时,toolbar模块新增节点后一级图标不显示的问题。
3.【修复】内置函数优化:initNoAllCheck,修复了显示bug
4.【新增】内置函数新增:initAllCheck,复选框选中状态初始化设置
5.【新增】内置函数新增:checkStatus,设置复选框选中/未选中/半选
6.【优化】toolbar模块:点击删除时,当删除了某个节点下的最后一个子节点,那该节点也会改变样式变成叶子节点。
7.【优化】toolbar模块:addTreeNode方法优化,ajax请求不限于同步,方法无需返回
8.【新增】内置函数新增:changeTreeNodeAdd,新增节点后改变节点内容
9.【优化】toolbar模块:editTreeNode方法优化,ajax请求不限于同步,方法无需返回
10.【新增】内置函数新增:changeTreeNodeEdit,编辑节点后改变节点内容
11.【优化】toolbar模块:delTreeNode方法优化,ajax请求不限于同步,方法无需返回
12.【新增】内置函数新增:changeTreeNodeDel,删除节点后改变节点内容
13.【优化】toolbar模块:editTreeLoad方法优化,ajax请求不限于同步,方法无需返回
14.【新增】内置函数新增:changeTreeNodeDone,编辑页打开后显示编辑页内容
15.【更新】更新了帮助文档
------------------------v2.4.5(2018/11/22)【修复】:------------------------
1.【修复】树重载时,使用data属性会造成数据重复加载问题。
2.【修复】输出参数的字段,spared修改为spread(之前单词拼错了。。。。)。
3.【新增】toolbar模块中新增属性:toolbarStyle,用于自定义toolbar的显示文字,弹框大小。
4.【移除】基础属性中移除了addIndex属性。
5.【新增】skin属性:用于用户自定义主题。
6.【更新】更新了帮助文档
------------------------v2.4.5(2018/11/21)【修复】:------------------------
1.【修复】使用dataFormat属性时,直接使用data属性配置节点内容失效的问题。
2.【修复】parentId为null导致节点数据加载失效的问题。
3.【优化】反选节点时将选中哪一级的节点展开,单选和多选均生效。
4.【新增】dot属性,用于用户自定义一级图标中的小圆点是否显示。
5.【更新】更新了帮助文档
------------------------v2.4.5(2018/11/21)【新增】:------------------------
1.【新增】toolbar取消按钮的显示,开始绑定右键点击事件。
2.【新增】toolbar模块新增一个属性:scroll 用于绑定树的上级div容器,让树可以显示滚动条的div容器,右键菜单绑定必填项。
3.【新增】toolbar模块新增编辑页数据回显功能。
4.【新增】树加载完毕后的回调函数
5.【新增】dataStyle属性,用于用户配置layui通用的json数据风格
6.【新增】dataFormat属性,用于用户自定义data中的数据格式(即支持传入一个大的list)
7.【更新】更新了帮助文档
------------------------v2.4.5(2018/11/09)【优化】:------------------------
1.【优化】更新了图标库,精简了图标(60个)
------------------------v2.4.5(2018/11/09)【初始】:------------------------
1.【初始】基本树形展示,无限级,支持自定义修改树的展示图标
2.【初始】支持异步/同步数据加载,支持静态数据加载,支持数据缓存
3.【初始】支持自定义返回json格式,支持自定义异步/同步加载参数
4.【初始】支持复选框,1-N级,支持复选框的四种选中形式,支持记录复选框选中/更改数据的回调
5.【初始】支持工具栏,即可直接修改当前树节点,新增/ 编辑/删除等
6.【初始】支持菜单栏,即可直接对树进行全部节点展开/收缩、删除全部选中节点、刷新树、搜索树等
7.【初始】支持加载iframe,即点击树节点时,可以带上一个访问iframe的url,这个设计在左树右内容风格的页面极为有用
8.【初始】支持数据回调,单击节点回调、双击节点回调、复选框选中回调、iframe加载完毕回调等
9.【初始】支持数据获取,即获取当前选中节点数据,当前选中复选框节点数据等
10.【初始】支持数据反显,即加载树之后将需要反显的节点高亮显示或选中
File diff suppressed because one or more lines are too long
@@ -0,0 +1,492 @@
layui.define(function(exports) {
exports('echartsTheme',
{
"color": [
"#3fb1e3",
"#6be6c1",
"#626c91",
"#a0a7e6",
"#c4ebad",
"#96dee8"
],
"backgroundColor": "rgba(252,252,252,0)",
"textStyle": {},
"title": {
"textStyle": {
"color": "#666666"
},
"subtextStyle": {
"color": "#999999"
}
},
"line": {
"itemStyle": {
"normal": {
"borderWidth": "3"
}
},
"lineStyle": {
"normal": {
"width": "4"
}
},
"symbolSize": "10",
"symbol": "emptyCircle",
"smooth": true
},
"radar": {
"itemStyle": {
"normal": {
"borderWidth": "3"
}
},
"lineStyle": {
"normal": {
"width": "4"
}
},
"symbolSize": "10",
"symbol": "emptyCircle",
"smooth": true
},
"bar": {
"itemStyle": {
"normal": {
"barBorderWidth": 0,
"barBorderColor": "#ccc"
},
"emphasis": {
"barBorderWidth": 0,
"barBorderColor": "#ccc"
}
}
},
"pie": {
"itemStyle": {
"normal": {
"borderWidth": 0,
"borderColor": "#ccc"
},
"emphasis": {
"borderWidth": 0,
"borderColor": "#ccc"
}
}
},
"scatter": {
"itemStyle": {
"normal": {
"borderWidth": 0,
"borderColor": "#ccc"
},
"emphasis": {
"borderWidth": 0,
"borderColor": "#ccc"
}
}
},
"boxplot": {
"itemStyle": {
"normal": {
"borderWidth": 0,
"borderColor": "#ccc"
},
"emphasis": {
"borderWidth": 0,
"borderColor": "#ccc"
}
}
},
"parallel": {
"itemStyle": {
"normal": {
"borderWidth": 0,
"borderColor": "#ccc"
},
"emphasis": {
"borderWidth": 0,
"borderColor": "#ccc"
}
}
},
"sankey": {
"itemStyle": {
"normal": {
"borderWidth": 0,
"borderColor": "#ccc"
},
"emphasis": {
"borderWidth": 0,
"borderColor": "#ccc"
}
}
},
"funnel": {
"itemStyle": {
"normal": {
"borderWidth": 0,
"borderColor": "#ccc"
},
"emphasis": {
"borderWidth": 0,
"borderColor": "#ccc"
}
}
},
"gauge": {
"itemStyle": {
"normal": {
"borderWidth": 0,
"borderColor": "#ccc"
},
"emphasis": {
"borderWidth": 0,
"borderColor": "#ccc"
}
}
},
"candlestick": {
"itemStyle": {
"normal": {
"color": "#e6a0d2",
"color0": "transparent",
"borderColor": "#e6a0d2",
"borderColor0": "#3fb1e3",
"borderWidth": "2"
}
}
},
"graph": {
"itemStyle": {
"normal": {
"borderWidth": 0,
"borderColor": "#ccc"
}
},
"lineStyle": {
"normal": {
"width": "1",
"color": "#cccccc"
}
},
"symbolSize": "10",
"symbol": "emptyCircle",
"smooth": true,
"color": [
"#3fb1e3",
"#6be6c1",
"#626c91",
"#a0a7e6",
"#c4ebad",
"#96dee8"
],
"label": {
"normal": {
"textStyle": {
"color": "#ffffff"
}
}
}
},
"map": {
"itemStyle": {
"normal": {
"areaColor": "#eeeeee",
"borderColor": "#aaaaaa",
"borderWidth": 0.5
},
"emphasis": {
"areaColor": "rgba(63,177,227,0.25)",
"borderColor": "#3fb1e3",
"borderWidth": 1
}
},
"label": {
"normal": {
"textStyle": {
"color": "#ffffff"
}
},
"emphasis": {
"textStyle": {
"color": "rgb(63,177,227)"
}
}
}
},
"geo": {
"itemStyle": {
"normal": {
"areaColor": "#eeeeee",
"borderColor": "#aaaaaa",
"borderWidth": 0.5
},
"emphasis": {
"areaColor": "rgba(63,177,227,0.25)",
"borderColor": "#3fb1e3",
"borderWidth": 1
}
},
"label": {
"normal": {
"textStyle": {
"color": "#ffffff"
}
},
"emphasis": {
"textStyle": {
"color": "rgb(63,177,227)"
}
}
}
},
"categoryAxis": {
"axisLine": {
"show": true,
"lineStyle": {
"color": "#cccccc"
}
},
"axisTick": {
"show": false,
"lineStyle": {
"color": "#333"
}
},
"axisLabel": {
"show": true,
"textStyle": {
"color": "#999999"
}
},
"splitLine": {
"show": true,
"lineStyle": {
"color": [
"#eeeeee"
]
}
},
"splitArea": {
"show": false,
"areaStyle": {
"color": [
"rgba(250,250,250,0.05)",
"rgba(200,200,200,0.02)"
]
}
}
},
"valueAxis": {
"axisLine": {
"show": true,
"lineStyle": {
"color": "#cccccc"
}
},
"axisTick": {
"show": false,
"lineStyle": {
"color": "#333"
}
},
"axisLabel": {
"show": true,
"textStyle": {
"color": "#999999"
}
},
"splitLine": {
"show": true,
"lineStyle": {
"color": [
"#eeeeee"
]
}
},
"splitArea": {
"show": false,
"areaStyle": {
"color": [
"rgba(250,250,250,0.05)",
"rgba(200,200,200,0.02)"
]
}
}
},
"logAxis": {
"axisLine": {
"show": true,
"lineStyle": {
"color": "#cccccc"
}
},
"axisTick": {
"show": false,
"lineStyle": {
"color": "#333"
}
},
"axisLabel": {
"show": true,
"textStyle": {
"color": "#999999"
}
},
"splitLine": {
"show": true,
"lineStyle": {
"color": [
"#eeeeee"
]
}
},
"splitArea": {
"show": false,
"areaStyle": {
"color": [
"rgba(250,250,250,0.05)",
"rgba(200,200,200,0.02)"
]
}
}
},
"timeAxis": {
"axisLine": {
"show": true,
"lineStyle": {
"color": "#cccccc"
}
},
"axisTick": {
"show": false,
"lineStyle": {
"color": "#333"
}
},
"axisLabel": {
"show": true,
"textStyle": {
"color": "#999999"
}
},
"splitLine": {
"show": true,
"lineStyle": {
"color": [
"#eeeeee"
]
}
},
"splitArea": {
"show": false,
"areaStyle": {
"color": [
"rgba(250,250,250,0.05)",
"rgba(200,200,200,0.02)"
]
}
}
},
"toolbox": {
"iconStyle": {
"normal": {
"borderColor": "#999999"
},
"emphasis": {
"borderColor": "#666666"
}
}
},
"legend": {
"textStyle": {
"color": "#999999"
}
},
"tooltip": {
"axisPointer": {
"lineStyle": {
"color": "#cccccc",
"width": 1
},
"crossStyle": {
"color": "#cccccc",
"width": 1
}
}
},
"timeline": {
"lineStyle": {
"color": "#626c91",
"width": 1
},
"itemStyle": {
"normal": {
"color": "#626c91",
"borderWidth": 1
},
"emphasis": {
"color": "#626c91"
}
},
"controlStyle": {
"normal": {
"color": "#626c91",
"borderColor": "#626c91",
"borderWidth": 0.5
},
"emphasis": {
"color": "#626c91",
"borderColor": "#626c91",
"borderWidth": 0.5
}
},
"checkpointStyle": {
"color": "#3fb1e3",
"borderColor": "rgba(63,177,227,0.15)"
},
"label": {
"normal": {
"textStyle": {
"color": "#626c91"
}
},
"emphasis": {
"textStyle": {
"color": "#626c91"
}
}
}
},
"visualMap": {
"color": [
"#2a99c9",
"#afe8ff"
]
},
"dataZoom": {
"backgroundColor": "rgba(255,255,255,0)",
"dataBackgroundColor": "rgba(222,222,222,1)",
"fillerColor": "rgba(114,230,212,0.25)",
"handleColor": "#cccccc",
"handleSize": "100%",
"textStyle": {
"color": "#999999"
}
},
"markPoint": {
"label": {
"normal": {
"textStyle": {
"color": "#ffffff"
}
},
"emphasis": {
"textStyle": {
"color": "#ffffff"
}
}
}
}
});
});
@@ -0,0 +1,399 @@
/**
* fa图标选择器 根据开源项目https://gitee.com/wujiawei0926/iconpicker修改而来
* @author wujiawei0926@yeah.net chung@99php.cn
* @version 1.1
*/
layui.define(['laypage', 'form'], function (exports) {
"use strict";
var IconPicker = function () {
this.v = '1.1';
}, _MOD = 'iconPickerFa',
_this = this,
$ = layui.jquery,
laypage = layui.laypage,
form = layui.form,
BODY = 'body',
TIPS = '请选择图标';
/**
* 渲染组件
*/
IconPicker.prototype.render = function (options) {
var opts = options,
// DOM选择器
elem = opts.elem,
// 数据类型:fontClass/unicode
url = opts.url,
// 是否分页:true/false
page = opts.page == null ? true : opts.page,
// 每页显示数量
limit = opts.limit == null ? 12 : opts.limit,
// 是否开启搜索:true/false
search = opts.search == null ? true : opts.search,
// 每个图标格子的宽度:'43px'或'20%'
cellWidth = opts.cellWidth,
// 点击回调
click = opts.click,
// 渲染成功后的回调
success = opts.success,
// json数据
data = {},
// 唯一标识
tmp = new Date().getTime(),
// 初始化时input的值
ORIGINAL_ELEM_VALUE = $(elem).val(),
TITLE = 'layui-select-title',
TITLE_ID = 'layui-select-title-' + tmp,
ICON_BODY = 'layui-iconpicker-' + tmp,
PICKER_BODY = 'layui-iconpicker-body-' + tmp,
PAGE_ID = 'layui-iconpicker-page-' + tmp,
LIST_BOX = 'layui-iconpicker-list-box',
selected = 'layui-form-selected',
unselect = 'layui-unselect';
var a = {
init: function () {
data = common.getData(url);
a.hideElem().createSelect().createBody().toggleSelect();
a.preventEvent().inputListen();
common.loadCss();
if (success) {
success(this.successHandle());
}
return a;
},
successHandle: function () {
var d = {
options: opts,
data: data,
id: tmp,
elem: $('#' + ICON_BODY)
};
return d;
},
/**
* 隐藏elem
*/
hideElem: function () {
$(elem).hide();
return a;
},
/**
* 绘制select下拉选择框
*/
createSelect: function () {
var oriIcon = '<i class="fa">';
// 默认图标
if (ORIGINAL_ELEM_VALUE === '') {
ORIGINAL_ELEM_VALUE = 'fa-adjust';
}
oriIcon = '<i class="fa ' + ORIGINAL_ELEM_VALUE + '">';
oriIcon += '</i>';
var selectHtml = '<div class="layui-iconpicker layui-unselect layui-form-select" id="' + ICON_BODY + '">' +
'<div class="' + TITLE + '" id="' + TITLE_ID + '">' +
'<div class="layui-iconpicker-item">' +
'<span class="layui-iconpicker-icon layui-unselect">' +
oriIcon +
'</span>' +
'<i class="layui-edge"></i>' +
'</div>' +
'</div>' +
'<div class="layui-anim layui-anim-upbit" style="">' +
'123' +
'</div>';
$(elem).after(selectHtml);
return a;
},
/**
* 展开/折叠下拉框
*/
toggleSelect: function () {
var item = '#' + TITLE_ID + ' .layui-iconpicker-item,#' + TITLE_ID + ' .layui-iconpicker-item .layui-edge';
a.event('click', item, function (e) {
var $icon = $('#' + ICON_BODY);
if ($icon.hasClass(selected)) {
$icon.removeClass(selected).addClass(unselect);
} else {
// 隐藏其他picker
$('.layui-form-select').removeClass(selected);
// 显示当前picker
$icon.addClass(selected).removeClass(unselect);
}
e.stopPropagation();
});
return a;
},
/**
* 绘制主体部分
*/
createBody: function () {
// 获取数据
var searchHtml = '';
if (search) {
searchHtml = '<div class="layui-iconpicker-search">' +
'<input class="layui-input">' +
'<i class="layui-icon">&#xe615;</i>' +
'</div>';
}
// 组合dom
var bodyHtml = '<div class="layui-iconpicker-body" id="' + PICKER_BODY + '">' +
searchHtml +
'<div class="' + LIST_BOX + '"></div> ' +
'</div>';
$('#' + ICON_BODY).find('.layui-anim').eq(0).html(bodyHtml);
a.search().createList().check().page();
return a;
},
/**
* 绘制图标列表
* @param text 模糊查询关键字
* @returns {string}
*/
createList: function (text) {
var d = data,
l = d.length,
pageHtml = '',
listHtml = $('<div class="layui-iconpicker-list">')//'<div class="layui-iconpicker-list">';
// 计算分页数据
var _limit = limit, // 每页显示数量
_pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1), // 总计多少页
_id = PAGE_ID;
// 图标列表
var icons = [];
for (var i = 0; i < l; i++) {
var obj = d[i];
// 判断是否模糊查询
if (text && obj.indexOf(text) === -1) {
continue;
}
// 是否自定义格子宽度
var style = '';
if (cellWidth !== null) {
style += ' style="width:' + cellWidth + '"';
}
// 每个图标dom
var icon = '<div class="layui-iconpicker-icon-item" title="' + obj + '" ' + style + '>';
icon += '<i class="fa ' + obj + '"></i>';
icon += '</div>';
icons.push(icon);
}
// 查询出图标后再分页
l = icons.length;
_pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1);
for (var i = 0; i < _pages; i++) {
// 按limit分块
var lm = $('<div class="layui-iconpicker-icon-limit" id="layui-iconpicker-icon-limit-' + tmp + (i + 1) + '">');
for (var j = i * _limit; j < (i + 1) * _limit && j < l; j++) {
lm.append(icons[j]);
}
listHtml.append(lm);
}
// 无数据
if (l === 0) {
listHtml.append('<p class="layui-iconpicker-tips">无数据</p>');
}
// 判断是否分页
if (page) {
$('#' + PICKER_BODY).addClass('layui-iconpicker-body-page');
pageHtml = '<div class="layui-iconpicker-page" id="' + PAGE_ID + '">' +
'<div class="layui-iconpicker-page-count">' +
'<span id="' + PAGE_ID + '-current">1</span>/' +
'<span id="' + PAGE_ID + '-pages">' + _pages + '</span>' +
' (<span id="' + PAGE_ID + '-length">' + l + '</span>)' +
'</div>' +
'<div class="layui-iconpicker-page-operate">' +
'<i class="layui-icon" id="' + PAGE_ID + '-prev" data-index="0" prev>&#xe603;</i> ' +
'<i class="layui-icon" id="' + PAGE_ID + '-next" data-index="2" next>&#xe602;</i> ' +
'</div>' +
'</div>';
}
$('#' + ICON_BODY).find('.layui-anim').find('.' + LIST_BOX).html('').append(listHtml).append(pageHtml);
return a;
},
// 阻止Layui的一些默认事件
preventEvent: function () {
var item = '#' + ICON_BODY + ' .layui-anim';
a.event('click', item, function (e) {
e.stopPropagation();
});
return a;
},
// 分页
page: function () {
var icon = '#' + PAGE_ID + ' .layui-iconpicker-page-operate .layui-icon';
$(icon).unbind('click');
a.event('click', icon, function (e) {
var elem = e.currentTarget,
total = parseInt($('#' + PAGE_ID + '-pages').html()),
isPrev = $(elem).attr('prev') !== undefined,
// 按钮上标的页码
index = parseInt($(elem).attr('data-index')),
$cur = $('#' + PAGE_ID + '-current'),
// 点击时正在显示的页码
current = parseInt($cur.html());
// 分页数据
if (isPrev && current > 1) {
current = current - 1;
$(icon + '[prev]').attr('data-index', current);
} else if (!isPrev && current < total) {
current = current + 1;
$(icon + '[next]').attr('data-index', current);
}
$cur.html(current);
// 图标数据
$('#' + ICON_BODY + ' .layui-iconpicker-icon-limit').hide();
$('#layui-iconpicker-icon-limit-' + tmp + current).show();
e.stopPropagation();
});
return a;
},
/**
* 搜索
*/
search: function () {
var item = '#' + PICKER_BODY + ' .layui-iconpicker-search .layui-input';
a.event('input propertychange', item, function (e) {
var elem = e.target,
t = $(elem).val();
a.createList(t);
});
return a;
},
/**
* 点击选中图标
*/
check: function () {
var item = '#' + PICKER_BODY + ' .layui-iconpicker-icon-item';
a.event('click', item, function (e) {
var el = $(e.currentTarget).find('.fa'),
icon = '';
var clsArr = el.attr('class').split(/[\s\n]/),
cls = clsArr[1],
icon = cls;
$('#' + TITLE_ID).find('.layui-iconpicker-item .fa').html('').attr('class', clsArr.join(' '));
$('#' + ICON_BODY).removeClass(selected).addClass(unselect);
$(elem).val(icon).attr('value', icon);
// 回调
if (click) {
click({
icon: icon
});
}
});
return a;
},
// 监听原始input数值改变
inputListen: function () {
var el = $(elem);
a.event('change', elem, function () {
var value = el.val();
})
// el.change(function(){
// });
return a;
},
event: function (evt, el, fn) {
$(BODY).on(evt, el, fn);
}
};
var common = {
/**
* 加载样式表
*/
loadCss: function () {
var css = '.layui-iconpicker {max-width: 280px;}.layui-iconpicker .layui-anim{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-iconpicker-item{border:1px solid #e6e6e6;width:90px;height:38px;border-radius:4px;cursor:pointer;position:relative;}.layui-iconpicker-icon{border-right:1px solid #e6e6e6;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;width:60px;height:100%;float:left;text-align:center;background:#fff;transition:all .3s;}.layui-iconpicker-icon i{line-height:38px;font-size:18px;}.layui-iconpicker-item > .layui-edge{left:70px;}.layui-iconpicker-item:hover{border-color:#D2D2D2!important;}.layui-iconpicker-item:hover .layui-iconpicker-icon{border-color:#D2D2D2!important;}.layui-iconpicker.layui-form-selected .layui-anim{display:block;}.layui-iconpicker-body{padding:6px;}.layui-iconpicker .layui-iconpicker-list{background-color:#fff;border:1px solid #ccc;border-radius:4px;}.layui-iconpicker .layui-iconpicker-icon-item{display:inline-block;width:21.1%;line-height:36px;text-align:center;cursor:pointer;vertical-align:top;height:36px;margin:4px;border:1px solid #ddd;border-radius:2px;transition:300ms;}.layui-iconpicker .layui-iconpicker-icon-item i.layui-icon{font-size:17px;}.layui-iconpicker .layui-iconpicker-icon-item:hover{background-color:#eee;border-color:#ccc;-webkit-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;-moz-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;box-shadow:0 0 2px #aaa,0 0 2px #fff inset;text-shadow:0 0 1px #fff;}.layui-iconpicker-search{position:relative;margin:0 0 6px 0;border:1px solid #e6e6e6;border-radius:2px;transition:300ms;}.layui-iconpicker-search:hover{border-color:#D2D2D2!important;}.layui-iconpicker-search .layui-input{cursor:text;display:inline-block;width:86%;border:none;padding-right:0;margin-top:1px;}.layui-iconpicker-search .layui-icon{position:absolute;top:11px;right:4%;}.layui-iconpicker-tips{text-align:center;padding:8px 0;cursor:not-allowed;}.layui-iconpicker-page{margin-top:6px;margin-bottom:-6px;font-size:12px;padding:0 2px;}.layui-iconpicker-page-count{display:inline-block;}.layui-iconpicker-page-operate{display:inline-block;float:right;cursor:default;}.layui-iconpicker-page-operate .layui-icon{font-size:12px;cursor:pointer;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit{display:none;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit:first-child{display:block;}';
var $style = $('head').find('style[iconpicker]');
if ($style.length === 0) {
$('head').append('<style rel="stylesheet" iconpicker>' + css + '</style>');
}
},
/**
* 获取数据
*/
getData: function (url) {
var iconlist = [];
$.ajax({
url: url,
type: 'get',
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
async: false,
success: function (ret) {
var exp = /fa-var-(.*):/ig;
var result;
while ((result = exp.exec(ret)) != null) {
iconlist.push('fa-' + result[1]);
}
},
error: function (xhr, textstatus, thrown) {
layer.msg('fa图标接口有误');
}
});
return iconlist;
}
};
a.init();
return new IconPicker();
};
/**
* 选中图标
* @param filter lay-filter
* @param iconName 图标名称,自动识别fontClass/unicode
*/
IconPicker.prototype.checkIcon = function (filter, iconName) {
var el = $('*[lay-filter=' + filter + ']'),
p = el.next().find('.layui-iconpicker-item .fa'),
c = iconName;
if (c.indexOf('#xe') > 0) {
p.html(c);
} else {
p.html('').attr('class', 'fa ' + c);
}
el.attr('value', c).val(c);
};
var iconPicker = new IconPicker();
exports(_MOD, iconPicker);
});
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,350 @@
/**
* date:2020/02/27
* author:Mr.Chung
* version:2.0
* description:layuimini 主体框架扩展
*/
layui.define(["jquery", "miniMenu", "element","miniTab", "miniTheme"], function (exports) {
var $ = layui.$,
layer = layui.layer,
miniMenu = layui.miniMenu,
miniTheme = layui.miniTheme,
element = layui.element ,
miniTab = layui.miniTab;
if (!/http(s*):\/\//.test(location.href)) {
var tips = "请先将项目部署至web容器(Apache/Tomcat/Nginx/IIS/等),否则部分数据将无法显示";
return layer.alert(tips);
}
var miniAdmin = {
/**
* 后台框架初始化
* @param options.iniUrl 后台初始化接口地址
* @param options.clearUrl 后台清理缓存接口
* @param options.urlHashLocation URL地址hash定位
* @param options.bgColorDefault 默认皮肤
* @param options.multiModule 是否开启多模块
* @param options.menuChildOpen 是否展开子菜单
* @param options.loadingTime 初始化加载时间
* @param options.pageAnim iframe窗口动画
* @param options.maxTabNum 最大的tab打开数量
*/
render: function (options) {
options.iniUrl = options.iniUrl || null;
options.clearUrl = options.clearUrl || null;
options.urlHashLocation = options.urlHashLocation || false;
options.bgColorDefault = options.bgColorDefault || 0;
options.multiModule = options.multiModule || false;
options.menuChildOpen = options.menuChildOpen || false;
options.loadingTime = options.loadingTime || 1;
options.pageAnim = options.pageAnim || false;
options.maxTabNum = options.maxTabNum || 20;
$.getJSON(options.iniUrl, function (data) {
if (data == null) {
miniAdmin.error('暂无菜单信息')
} else {
miniAdmin.renderLogo(data.logoInfo);
miniAdmin.renderClear(options.clearUrl);
miniAdmin.renderHome(data.homeInfo);
miniAdmin.renderAnim(options.pageAnim);
miniAdmin.listen();
miniMenu.render({
menuList: data.menuInfo,
multiModule: options.multiModule,
menuChildOpen: options.menuChildOpen
});
miniTab.render({
filter: 'layuiminiTab',
urlHashLocation: options.urlHashLocation,
multiModule: options.multiModule,
menuChildOpen: options.menuChildOpen,
maxTabNum: options.maxTabNum,
menuList: data.menuInfo,
homeInfo: data.homeInfo,
listenSwichCallback: function () {
miniAdmin.renderDevice();
}
});
miniTheme.render({
bgColorDefault: options.bgColorDefault,
listen: true,
});
miniAdmin.deleteLoader(options.loadingTime);
}
}).fail(function () {
miniAdmin.error('菜单接口有误');
});
},
/**
* 初始化logo
* @param data
*/
renderLogo: function (data) {
var html = '<a href="' + data.href + '"><img src="' + data.image + '" alt="logo"><h1>' + data.title + '</h1></a>';
$('.layuimini-logo').html(html);
},
/**
* 初始化首页
* @param data
*/
renderHome: function (data) {
sessionStorage.setItem('layuiminiHomeHref', data.href);
$('#layuiminiHomeTabId').html('<span class="layuimini-tab-active"></span><span class="disable-close">' + data.title + '</span><i class="layui-icon layui-unselect layui-tab-close">ဆ</i>');
$('#layuiminiHomeTabId').attr('lay-id', data.href);
$('#layuiminiHomeTabIframe').html('<iframe width="100%" height="100%" frameborder="no" border="0" marginwidth="0" marginheight="0" src="' + data.href + '"></iframe>');
},
/**
* 初始化缓存地址
* @param clearUrl
*/
renderClear: function (clearUrl) {
$('.layuimini-clear').attr('data-href',clearUrl);
},
/**
* 初始化iframe窗口动画
* @param anim
*/
renderAnim: function (anim) {
if (anim) {
$('#layuimini-bg-color').after('<style id="layuimini-page-anim">' +
'.layui-tab-item.layui-show {animation:moveTop 1s;-webkit-animation:moveTop 1s;animation-fill-mode:both;-webkit-animation-fill-mode:both;position:relative;height:100%;-webkit-overflow-scrolling:touch;}\n' +
'@keyframes moveTop {0% {opacity:0;-webkit-transform:translateY(30px);-ms-transform:translateY(30px);transform:translateY(30px);}\n' +
' 100% {opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}\n' +
'}\n' +
'@-o-keyframes moveTop {0% {opacity:0;-webkit-transform:translateY(30px);-ms-transform:translateY(30px);transform:translateY(30px);}\n' +
' 100% {opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}\n' +
'}\n' +
'@-moz-keyframes moveTop {0% {opacity:0;-webkit-transform:translateY(30px);-ms-transform:translateY(30px);transform:translateY(30px);}\n' +
' 100% {opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}\n' +
'}\n' +
'@-webkit-keyframes moveTop {0% {opacity:0;-webkit-transform:translateY(30px);-ms-transform:translateY(30px);transform:translateY(30px);}\n' +
' 100% {opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}\n' +
'}' +
'</style>');
}
},
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 if (el.webkitRequestFullscreen) {
el.webkitRequestFullscreen();
} else if (el.mozRequestFullScreen) {
el.mozRequestFullScreen();
} else {
miniAdmin.error('浏览器不支持全屏调用!');
}
},
/**
* 退出全屏
*/
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 if (el.mozCancelFullScreen) {
el.mozCancelFullScreen();
} else if (el.webkitCancelFullScreen) {
el.webkitCancelFullScreen();
} else {
miniAdmin.error('浏览器不支持全屏调用!');
}
},
/**
* 初始化设备端
*/
renderDevice: function () {
if (miniAdmin.checkMobile()) {
$('.layuimini-tool i').attr('data-side-fold', 1);
$('.layuimini-tool i').attr('class', 'fa fa-outdent');
$('.layui-layout-body').removeClass('layuimini-mini');
$('.layui-layout-body').addClass('layuimini-all');
}
},
/**
* 初始化加载时间
* @param loadingTime
*/
deleteLoader: function (loadingTime) {
setTimeout(function () {
$('.layuimini-loader').fadeOut();
}, loadingTime * 1000)
},
/**
* 成功
* @param title
* @returns {*}
*/
success: function (title) {
return layer.msg(title, {icon: 1, shade: this.shade, scrollbar: false, time: 2000, shadeClose: true});
},
/**
* 失败
* @param title
* @returns {*}
*/
error: function (title) {
return layer.msg(title, {icon: 2, shade: this.shade, scrollbar: false, time: 3000, shadeClose: true});
},
/**
* 判断是否为手机
* @returns {boolean}
*/
checkMobile: function () {
var ua = navigator.userAgent.toLocaleLowerCase();
var pf = navigator.platform.toLocaleLowerCase();
var isAndroid = (/android/i).test(ua) || ((/iPhone|iPod|iPad/i).test(ua) && (/linux/i).test(pf))
|| (/ucweb.*linux/i.test(ua));
var isIOS = (/iPhone|iPod|iPad/i).test(ua) && !isAndroid;
var isWinPhone = (/Windows Phone|ZuneWP7/i).test(ua);
var clientWidth = document.documentElement.clientWidth;
if (!isAndroid && !isIOS && !isWinPhone && clientWidth > 1024) {
return false;
} else {
return true;
}
},
/**
* 监听
*/
listen: function () {
/**
* 清理
*/
$('body').on('click', '[data-clear]', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
sessionStorage.clear();
// 判断是否清理服务端
var clearUrl = $(this).attr('data-href');
if (clearUrl != undefined && clearUrl != '' && clearUrl != null) {
$.getJSON(clearUrl, function (data, status) {
layer.close(loading);
if (data.code != 1) {
return miniAdmin.error(data.msg);
} else {
return miniAdmin.success(data.msg);
}
}).fail(function () {
layer.close(loading);
return miniAdmin.error('清理缓存接口有误');
});
} else {
layer.close(loading);
return miniAdmin.success('清除缓存成功');
}
});
/**
* 刷新
*/
$('body').on('click', '[data-refresh]', function () {
$(".layui-tab-item.layui-show").find("iframe")[0].contentWindow.location.reload();
miniAdmin.success('刷新成功');
});
/**
* 监听提示信息
*/
$("body").on("mouseenter", ".layui-nav-tree .menu-li", function () {
if (miniAdmin.checkMobile()) {
return false;
}
var classInfo = $(this).attr('class'),
tips = $(this).prop("innerHTML"),
isShow = $('.layuimini-tool i').attr('data-side-fold');
if (isShow == 0 && tips) {
tips = "<ul class='layuimini-menu-left-zoom layui-nav layui-nav-tree layui-this'><li class='layui-nav-item layui-nav-itemed'>"+tips+"</li></ul>" ;
window.openTips = layer.tips(tips, $(this), {
tips: [2, '#2f4056'],
time: 300000,
skin:"popup-tips",
success:function (el) {
var left = $(el).position().left - 10 ;
$(el).css({ left:left });
element.render();
}
});
}
});
$("body").on("mouseleave", ".popup-tips", function () {
if (miniAdmin.checkMobile()) {
return false;
}
var isShow = $('.layuimini-tool i').attr('data-side-fold');
if (isShow == 0) {
try {
layer.close(window.openTips);
} catch (e) {
console.log(e.message);
}
}
});
/**
* 全屏
*/
$('body').on('click', '[data-check-screen]', function () {
var check = $(this).attr('data-check-screen');
if (check == 'full') {
miniAdmin.fullScreen();
$(this).attr('data-check-screen', 'exit');
$(this).html('<i class="fa fa-compress"></i>');
} else {
miniAdmin.exitFullScreen();
$(this).attr('data-check-screen', 'full');
$(this).html('<i class="fa fa-arrows-alt"></i>');
}
});
/**
* 点击遮罩层
*/
$('body').on('click', '.layuimini-make', function () {
miniAdmin.renderDevice();
});
}
};
exports("miniAdmin", miniAdmin);
});
@@ -0,0 +1,250 @@
/**
* date:2020/02/27
* author:Mr.Chung
* version:2.0
* description:layuimini 菜单框架扩展
*/
layui.define(["element","laytpl" ,"jquery"], function (exports) {
var element = layui.element,
$ = layui.$,
laytpl = layui.laytpl,
layer = layui.layer;
var miniMenu = {
/**
* 菜单初始化
* @param options.menuList 菜单数据信息
* @param options.multiModule 是否开启多模块
* @param options.menuChildOpen 是否展开子菜单
*/
render: function (options) {
options.menuList = options.menuList || [];
options.multiModule = options.multiModule || false;
options.menuChildOpen = options.menuChildOpen || false;
if (options.multiModule) {
miniMenu.renderMultiModule(options.menuList, options.menuChildOpen);
} else {
miniMenu.renderSingleModule(options.menuList, options.menuChildOpen);
}
miniMenu.listen();
},
/**
* 单模块
* @param menuList 菜单数据
* @param menuChildOpen 是否默认展开
*/
renderSingleModule: function (menuList, menuChildOpen) {
menuList = menuList || [];
var leftMenuHtml = '',
childOpenClass = '',
leftMenuCheckDefault = 'layui-this';
var me = this ;
if (menuChildOpen) childOpenClass = ' layui-nav-itemed';
leftMenuHtml = this.renderLeftMenu(menuList,{ childOpenClass:childOpenClass }) ;
$('.layui-layout-body').addClass('layuimini-single-module'); //单模块标识
$('.layuimini-header-menu').remove();
$('.layuimini-menu-left').html(leftMenuHtml);
element.init();
},
/**
* 渲染一级菜单
*/
compileMenu: function(menu,isSub){
var menuHtml = '<li {{#if( d.menu){ }} data-menu="{{d.menu}}" {{#}}} class="layui-nav-item menu-li {{d.childOpenClass}} {{d.className}}" {{#if( d.id){ }} id="{{d.id}}" {{#}}}> <a {{#if( d.href){ }} layuimini-href="{{d.href}}" {{#}}} {{#if( d.target){ }} target="{{d.target}}" {{#}}} href="javascript:;">{{#if( d.icon){ }} <i class="{{d.icon}}"></i> {{#}}} <span class="layui-left-nav">{{d.title}}</span></a> {{# if(d.children){}} {{d.children}} {{#}}} </li>' ;
if(isSub){
menuHtml = '<dd class="menu-dd {{d.childOpenClass}} {{ d.className }}"> <a href="javascript:;" {{#if( d.menu){ }} data-menu="{{d.menu}}" {{#}}} {{#if( d.id){ }} id="{{d.id}}" {{#}}} {{#if(( !d.child || !d.child.length ) && d.href){ }} layuimini-href="{{d.href}}" {{#}}} {{#if( d.target){ }} target="{{d.target}}" {{#}}}> {{#if( d.icon){ }} <i class="{{d.icon}}"></i> {{#}}} <span class="layui-left-nav"> {{d.title}}</span></a> {{# if(d.children){}} {{d.children}} {{#}}}</dd>'
}
return laytpl(menuHtml).render(menu);
},
compileMenuContainer :function(menu,isSub){
var wrapperHtml = '<ul class="layui-nav layui-nav-tree layui-left-nav-tree {{d.className}}" id="{{d.id}}">{{d.children}}</ul>' ;
if(isSub){
wrapperHtml = '<dl class="layui-nav-child ">{{d.children}}</dl>' ;
}
if(!menu.children){
return "";
}
return laytpl(wrapperHtml).render(menu);
},
each:function(list,callback){
var _list = [];
for(var i = 0 ,length = list.length ; i<length ;i++ ){
_list[i] = callback(i,list[i]) ;
}
return _list ;
},
renderChildrenMenu:function(menuList,options){
var me = this ;
menuList = menuList || [] ;
var html = this.each(menuList,function (idx,menu) {
if(menu.child && menu.child.length){
menu.children = me.renderChildrenMenu(menu.child,{ childOpenClass: options.childOpenClass || '' });
}
menu.className = "" ;
menu.childOpenClass = options.childOpenClass || ''
return me.compileMenu(menu,true)
}).join("");
return me.compileMenuContainer({ children:html },true)
},
renderLeftMenu :function(leftMenus,options){
options = options || {};
var me = this ;
var leftMenusHtml = me.each(leftMenus || [],function (idx,leftMenu) { // 左侧菜单遍历
var children = me.renderChildrenMenu(leftMenu.child, { childOpenClass:options.childOpenClass });
var leftMenuHtml = me.compileMenu({
href: leftMenu.href,
target: leftMenu.target,
childOpenClass: options.childOpenClass,
icon: leftMenu.icon,
title: leftMenu.title,
children: children,
className: '',
});
return leftMenuHtml ;
}).join("");
leftMenusHtml = me.compileMenuContainer({ id:options.parentMenuId,className:options.leftMenuCheckDefault,children:leftMenusHtml }) ;
return leftMenusHtml ;
},
/**
* 多模块
* @param menuList 菜单数据
* @param menuChildOpen 是否默认展开
*/
renderMultiModule: function (menuList, menuChildOpen) {
menuList = menuList || [];
var me = this ;
var headerMenuHtml = '',
headerMobileMenuHtml = '',
leftMenuHtml = '',
leftMenuCheckDefault = 'layui-this',
childOpenClass = '',
headerMenuCheckDefault = 'layui-this';
if (menuChildOpen) childOpenClass = ' layui-nav-itemed';
var headerMenuHtml = this.each(menuList, function (index, val) { //顶部菜单渲染
var menu = 'multi_module_' + index ;
var id = menu+"HeaderId";
var topMenuItemHtml = "" ;
topMenuItemHtml = me.compileMenu({
className:headerMenuCheckDefault,
menu:menu,
id:id,
title:val.title,
href:"",
target:"",
children:""
});
leftMenuHtml+=me.renderLeftMenu(val.child,{
parentMenuId:menu,
childOpenClass:childOpenClass,
leftMenuCheckDefault:leftMenuCheckDefault
});
headerMobileMenuHtml +=me.compileMenu({ id:id,menu:menu,id:id,icon:val.icon, title:val.title, },true);
headerMenuCheckDefault = "";
leftMenuCheckDefault = "layui-hide" ;
return topMenuItemHtml ;
}).join("");
$('.layui-layout-body').addClass('layuimini-multi-module'); //多模块标识
$('.layuimini-menu-header-pc').html(headerMenuHtml); //电脑
$('.layuimini-menu-left').html(leftMenuHtml);
$('.layuimini-menu-header-mobile').html(headerMobileMenuHtml); //手机
element.init();
},
/**
* 监听
*/
listen: function () {
/**
* 菜单模块切换
*/
$('body').on('click', '[data-menu]', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
var menuId = $(this).attr('data-menu');
// header
$(".layuimini-header-menu .layui-nav-item.layui-this").removeClass('layui-this');
$(this).addClass('layui-this');
// left
$(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this").addClass('layui-hide');
$(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this.layui-hide").removeClass('layui-this');
$("#" + menuId).removeClass('layui-hide');
$("#" + menuId).addClass('layui-this');
layer.close(loading);
});
/**
* 菜单缩放
*/
$('body').on('click', '.layuimini-site-mobile', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
var isShow = $('.layuimini-tool [data-side-fold]').attr('data-side-fold');
if (isShow == 1) { // 缩放
$('.layuimini-tool [data-side-fold]').attr('data-side-fold', 0);
$('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-indent');
$('.layui-layout-body').removeClass('layuimini-all');
$('.layui-layout-body').addClass('layuimini-mini');
} else { // 正常
$('.layuimini-tool [data-side-fold]').attr('data-side-fold', 1);
$('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-outdent');
$('.layui-layout-body').removeClass('layuimini-mini');
$('.layui-layout-body').addClass('layuimini-all');
layer.close(window.openTips);
}
element.init();
layer.close(loading);
});
/**
* 菜单缩放
*/
$('body').on('click', '[data-side-fold]', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
var isShow = $('.layuimini-tool [data-side-fold]').attr('data-side-fold');
if (isShow == 1) { // 缩放
$('.layuimini-tool [data-side-fold]').attr('data-side-fold', 0);
$('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-indent');
$('.layui-layout-body').removeClass('layuimini-all');
$('.layui-layout-body').addClass('layuimini-mini');
// $(".menu-li").each(function (idx,el) {
// $(el).addClass("hidden-sub-menu");
// });
} else { // 正常
$('.layuimini-tool [data-side-fold]').attr('data-side-fold', 1);
$('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-outdent');
$('.layui-layout-body').removeClass('layuimini-mini');
$('.layui-layout-body').addClass('layuimini-all');
// $(".menu-li").each(function (idx,el) {
// $(el).removeClass("hidden-sub-menu");
// });
layer.close(window.openTips);
}
element.init();
layer.close(loading);
});
/**
* 手机端点开模块
*/
$('body').on('click', '.layuimini-header-menu.layuimini-mobile-show dd', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
var check = $('.layuimini-tool [data-side-fold]').attr('data-side-fold');
if(check === "1"){
$('.layuimini-site-mobile').trigger("click");
element.init();
}
layer.close(loading);
});
},
};
exports("miniMenu", miniMenu);
});
@@ -0,0 +1,582 @@
/**
* date:2020/02/27
* author:Mr.Chung
* version:2.0
* description:layuimini tab框架扩展
*/
layui.define(["element", "layer", "jquery"], function (exports) {
var element = layui.element,
layer = layui.layer,
$ = layui.$;
var miniTab = {
/**
* 初始化tab
* @param options
*/
render: function (options) {
options.filter = options.filter || null;
options.multiModule = options.multiModule || false;
options.urlHashLocation = options.urlHashLocation || false;
options.maxTabNum = options.maxTabNum || 20;
options.menuList = options.menuList || []; // 后期菜单想改为不操作dom, 而是直接操作初始化传过来的数据
options.homeInfo = options.homeInfo || {};
options.listenSwichCallback = options.listenSwichCallback || function () {
};
miniTab.listen(options);
miniTab.listenRoll();
miniTab.listenSwitch(options);
miniTab.listenHash(options);
},
/**
* 新建tab窗口
* @param options.tabId
* @param options.href
* @param options.title
* @param options.isIframe
* @param options.maxTabNum
*/
create: function (options) {
options.tabId = options.tabId || null;
options.href = options.href || null;
options.title = options.title || null;
options.isIframe = options.isIframe || false;
options.maxTabNum = options.maxTabNum || 20;
if ($(".layuimini-tab .layui-tab-title li").length >= options.maxTabNum) {
layer.msg('Tab窗口已达到限定数量,请先关闭部分Tab');
return false;
}
var ele = element;
if (options.isIframe) ele = parent.layui.element;
ele.tabAdd('layuiminiTab', {
title: '<span class="layuimini-tab-active"></span><span>' + options.title + '</span><i class="layui-icon layui-unselect layui-tab-close">ဆ</i>' //用于演示
, content: '<iframe width="100%" height="100%" frameborder="no" border="0" marginwidth="0" marginheight="0" src="' + options.href + '"></iframe>'
, id: options.tabId
});
$('.layuimini-menu-left').attr('layuimini-tab-tag', 'add');
sessionStorage.setItem('layuiminimenu_' + options.tabId, options.title);
},
/**
* 切换选项卡
* @param tabId
*/
change: function (tabId) {
element.tabChange('layuiminiTab', tabId);
},
/**
* 删除tab窗口
* @param tabId
* @param isParent
*/
delete: function (tabId, isParent) {
// 未知BUG,不知道是不是layui问题,必须先删除元素
$(".layuimini-tab .layui-tab-title .layui-unselect.layui-tab-bar").remove();
if (isParent === true) {
parent.layui.element.tabDelete('layuiminiTab', tabId);
} else {
element.tabDelete('layuiminiTab', tabId);
}
},
/**
* 在iframe层打开新tab方法
*/
openNewTabByIframe: function (options) {
options.href = options.href || null;
options.title = options.title || null;
var loading = parent.layer.load(0, {shade: false, time: 2 * 1000});
if (options.href === null || options.href === undefined) options.href = new Date().getTime();
var checkTab = miniTab.check(options.href, true);
if (!checkTab) {
miniTab.create({
tabId: options.href,
href: options.href,
title: options.title,
isIframe: true,
});
}
parent.layui.element.tabChange('layuiminiTab', options.href);
parent.layer.close(loading);
},
/**
* 在iframe层关闭当前tab方法
*/
deleteCurrentByIframe: function () {
var ele = $(".layuimini-tab .layui-tab-title li.layui-this", parent.document);
if (ele.length > 0) {
var layId = $(ele[0]).attr('lay-id');
miniTab.delete(layId, true);
}
},
/**
* 判断tab窗口
*/
check: function (tabId, isIframe) {
// 判断选项卡上是否有
var checkTab = false;
if (isIframe === undefined || isIframe === false) {
$(".layui-tab-title li").each(function () {
var checkTabId = $(this).attr('lay-id');
if (checkTabId != null && checkTabId === tabId) {
checkTab = true;
}
});
} else {
parent.layui.$(".layui-tab-title li").each(function () {
var checkTabId = $(this).attr('lay-id');
if (checkTabId != null && checkTabId === tabId) {
checkTab = true;
}
});
}
return checkTab;
},
/**
* 开启tab右键菜单
* @param tabId
* @param left
*/
openTabRignMenu: function (tabId, left) {
miniTab.closeTabRignMenu();
var menuHtml = '<div class="layui-unselect layui-form-select layui-form-selected layuimini-tab-mousedown layui-show" data-tab-id="' + tabId + '" style="left: ' + left + 'px!important">\n' +
'<dl>\n' +
'<dd><a href="javascript:;" layuimini-tab-menu-close="current"><i class="layui-icon layui-icon-close"></i> 关闭当前</a></dd>\n' +
'<dd><a href="javascript:;" layuimini-tab-menu-close="other"><i class="layui-icon layui-icon-reduce-circle"></i> 关闭其他</a></dd>\n' +
'<dd><a href="javascript:;" layuimini-tab-menu-close="all"><i class="layui-icon layui-icon-close-fill"></i> 关闭全部</a></dd>\n' +
'</dl>\n' +
'</div>';
var makeHtml = '<div class="layuimini-tab-make"></div>';
$('.layuimini-tab .layui-tab-title').after(menuHtml);
$('.layuimini-tab .layui-tab-content').after(makeHtml);
},
/**
* 关闭tab右键菜单
*/
closeTabRignMenu: function () {
$('.layuimini-tab-mousedown').remove();
$('.layuimini-tab-make').remove();
},
/**
* 查询菜单信息
* @param href
* @param menuList
*/
searchMenu: function (href, menuList) {
var menu;
for (key in menuList) {
var item = menuList[key];
if (item.href === href) {
menu = item;
break;
}
if (item.child) {
newMenu = miniTab.searchMenu(href, item.child);
if (newMenu) {
menu = newMenu;
break;
}
}
}
return menu;
},
/**
* 监听
* @param options
*/
listen: function (options) {
options = options || {};
options.maxTabNum = options.maxTabNum || 20;
/**
* 打开新窗口
*/
$('body').on('click', '[layuimini-href]', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
var tabId = $(this).attr('layuimini-href'),
href = $(this).attr('layuimini-href'),
title = $(this).text(),
target = $(this).attr('target');
var el = $("[layuimini-href='" + href + "']", ".layuimini-menu-left");
layer.close(window.openTips);
if (el.length) {
$(el).closest(".layui-nav-tree").find(".layui-this").removeClass("layui-this");
$(el).parent().addClass("layui-this");
}
if (target === '_blank') {
layer.close(loading);
window.open(href, "_blank");
return false;
}
if (tabId === null || tabId === undefined) tabId = new Date().getTime();
var checkTab = miniTab.check(tabId);
if (!checkTab) {
miniTab.create({
tabId: tabId,
href: href,
title: title,
isIframe: false,
maxTabNum: options.maxTabNum,
});
}
element.tabChange('layuiminiTab', tabId);
layer.close(loading);
});
/**
* 在iframe子菜单上打开新窗口
*/
$('body').on('click', '[layuimini-content-href]', function () {
var loading = parent.layer.load(0, {shade: false, time: 2 * 1000});
var tabId = $(this).attr('layuimini-content-href'),
href = $(this).attr('layuimini-content-href'),
title = $(this).attr('data-title'),
target = $(this).attr('target');
if (target === '_blank') {
parent.layer.close(loading);
window.open(href, "_blank");
return false;
}
if (tabId === null || tabId === undefined) tabId = new Date().getTime();
var checkTab = miniTab.check(tabId, true);
if (!checkTab) {
miniTab.create({
tabId: tabId,
href: href,
title: title,
isIframe: true,
maxTabNum: options.maxTabNum,
});
}
parent.layui.element.tabChange('layuiminiTab', tabId);
parent.layer.close(loading);
});
/**
* 关闭选项卡
**/
$('body').on('click', '.layuimini-tab .layui-tab-title .layui-tab-close', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
var $parent = $(this).parent();
var tabId = $parent.attr('lay-id');
if (tabId !== undefined || tabId !== null) {
miniTab.delete(tabId);
}
layer.close(loading);
});
/**
* 选项卡操作
*/
$('body').on('click', '[layuimini-tab-close]', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
var closeType = $(this).attr('layuimini-tab-close');
$(".layuimini-tab .layui-tab-title li").each(function () {
var tabId = $(this).attr('lay-id');
var id = $(this).attr('id');
var isCurrent = $(this).hasClass('layui-this');
if (id !== 'layuiminiHomeTabId') {
if (closeType === 'all') {
miniTab.delete(tabId);
} else {
if (closeType === 'current' && isCurrent) {
miniTab.delete(tabId);
} else if (closeType === 'other' && !isCurrent) {
miniTab.delete(tabId);
}
}
}
});
layer.close(loading);
});
/**
* 禁用网页右键
*/
$(".layuimini-tab .layui-tab-title").unbind("mousedown").bind("contextmenu", function (e) {
e.preventDefault();
return false;
});
/**
* 注册鼠标右键
*/
$('body').on('mousedown', '.layuimini-tab .layui-tab-title li', function (e) {
var left = $(this).offset().left - $('.layuimini-tab ').offset().left + ($(this).width() / 2),
tabId = $(this).attr('lay-id');
if (e.which === 3) {
miniTab.openTabRignMenu(tabId, left);
}
});
/**
* 关闭tab右键菜单
*/
$('body').on('click', '.layui-body,.layui-header,.layuimini-menu-left,.layuimini-tab-make', function () {
miniTab.closeTabRignMenu();
});
/**
* tab右键选项卡操作
*/
$('body').on('click', '[layuimini-tab-menu-close]', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
var closeType = $(this).attr('layuimini-tab-menu-close'),
currentTabId = $('.layuimini-tab-mousedown').attr('data-tab-id');
$(".layuimini-tab .layui-tab-title li").each(function () {
var tabId = $(this).attr('lay-id');
var id = $(this).attr('id');
if (id !== 'layuiminiHomeTabId') {
if (closeType === 'all') {
miniTab.delete(tabId);
} else {
if (closeType === 'current' && currentTabId === tabId) {
miniTab.delete(tabId);
} else if (closeType === 'other' && currentTabId !== tabId) {
miniTab.delete(tabId);
}
}
}
});
miniTab.closeTabRignMenu();
layer.close(loading);
});
},
/**
* 监听tab切换
* @param options
*/
listenSwitch: function (options) {
options.filter = options.filter || null;
options.multiModule = options.multiModule || false;
options.urlHashLocation = options.urlHashLocation || false;
options.listenSwichCallback = options.listenSwichCallback || function () {
};
element.on('tab(' + options.filter + ')', function (data) {
var tabId = $(this).attr('lay-id');
if (options.urlHashLocation) {
location.hash = '/' + tabId;
}
if (typeof options.listenSwichCallback === 'function') {
options.listenSwichCallback();
}
// 判断是否为新增窗口
if ($('.layuimini-menu-left').attr('layuimini-tab-tag') === 'add') {
$('.layuimini-menu-left').attr('layuimini-tab-tag', 'no')
} else {
$("[layuimini-href]").parent().removeClass('layui-this');
if (options.multiModule) {
miniTab.listenSwitchMultiModule(tabId);
} else {
miniTab.listenSwitchSingleModule(tabId);
}
}
miniTab.rollPosition();
});
},
/**
* 监听hash变化
* @param options
* @returns {boolean}
*/
listenHash: function (options) {
options.urlHashLocation = options.urlHashLocation || false;
options.maxTabNum = options.maxTabNum || 20;
options.homeInfo = options.homeInfo || {};
options.menuList = options.menuList || [];
if (!options.urlHashLocation) return false;
var tabId = location.hash.replace(/^#\//, '');
if (tabId === null || tabId === undefined || tabId ==='') return false;
// 判断是否为首页
if(tabId ===options.homeInfo.href) return false;
// 判断是否为右侧菜单
var menu = miniTab.searchMenu(tabId, options.menuList);
if (menu !== undefined) {
miniTab.create({
tabId: tabId,
href: tabId,
title: menu.title,
isIframe: false,
maxTabNum: options.maxTabNum,
});
$('.layuimini-menu-left').attr('layuimini-tab-tag', 'no');
element.tabChange('layuiminiTab', tabId);
return false;
}
// 判断是否为快捷菜单
var isSearchMenu = false;
$("[layuimini-content-href]").each(function () {
if ($(this).attr("layuimini-content-href") === tabId) {
var title = $(this).attr("data-title");
miniTab.create({
tabId: tabId,
href: tabId,
title: title,
isIframe: false,
maxTabNum: options.maxTabNum,
});
$('.layuimini-menu-left').attr('layuimini-tab-tag', 'no');
element.tabChange('layuiminiTab', tabId);
isSearchMenu = true;
return false;
}
});
if (isSearchMenu) return false;
// 既不是右侧菜单、快捷菜单,就直接打开
var title = sessionStorage.getItem('layuiminimenu_' + tabId) === null ? tabId : sessionStorage.getItem('layuiminimenu_' + tabId);
miniTab.create({
tabId: tabId,
href: tabId,
title: title,
isIframe: false,
maxTabNum: options.maxTabNum,
});
element.tabChange('layuiminiTab', tabId);
return false;
},
/**
* 监听滚动
*/
listenRoll: function () {
$(".layuimini-tab-roll-left").click(function () {
miniTab.rollClick("left");
});
$(".layuimini-tab-roll-right").click(function () {
miniTab.rollClick("right");
});
},
/**
* 单模块切换
* @param tabId
*/
listenSwitchSingleModule: function (tabId) {
$("[layuimini-href]").each(function () {
if ($(this).attr("layuimini-href") === tabId) {
// 自动展开菜单栏
var addMenuClass = function ($element, type) {
if (type === 1) {
$element.addClass('layui-this');
if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-this')) {
$(".layuimini-header-menu li").attr('class', 'layui-nav-item');
} else {
addMenuClass($element.parent().parent(), 2);
}
} else {
$element.addClass('layui-nav-itemed');
if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-nav-itemed')) {
$(".layuimini-header-menu li").attr('class', 'layui-nav-item');
} else {
addMenuClass($element.parent().parent(), 2);
}
}
};
addMenuClass($(this).parent(), 1);
return false;
}
});
},
/**
* 多模块切换
* @param tabId
*/
listenSwitchMultiModule: function (tabId) {
$("[layuimini-href]").each(function () {
if ($(this).attr("layuimini-href") === tabId) {
// 自动展开菜单栏
var addMenuClass = function ($element, type) {
if (type === 1) {
$element.addClass('layui-this');
if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-this')) {
var moduleId = $element.parent().attr('id');
$(".layuimini-header-menu li").attr('class', 'layui-nav-item');
$("#" + moduleId + "HeaderId").addClass("layui-this");
$(".layuimini-menu-left .layui-nav.layui-nav-tree").attr('class', 'layui-nav layui-nav-tree layui-hide');
$("#" + moduleId).attr('class', 'layui-nav layui-nav-tree layui-this');
} else {
addMenuClass($element.parent().parent(), 2);
}
} else {
$element.addClass('layui-nav-itemed');
if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-nav-itemed')) {
var moduleId = $element.parent().attr('id');
$(".layuimini-header-menu li").attr('class', 'layui-nav-item');
$("#" + moduleId + "HeaderId").addClass("layui-this");
$(".layuimini-menu-left .layui-nav.layui-nav-tree").attr('class', 'layui-nav layui-nav-tree layui-hide');
$("#" + moduleId).attr('class', 'layui-nav layui-nav-tree layui-this');
} else {
addMenuClass($element.parent().parent(), 2);
}
}
};
addMenuClass($(this).parent(), 1);
return false;
}
});
},
/**
* 自动定位
*/
rollPosition: function () {
var $tabTitle = $('.layuimini-tab .layui-tab-title');
var autoLeft = 0;
$tabTitle.children("li").each(function () {
if ($(this).hasClass('layui-this')) {
return false;
} else {
autoLeft += $(this).outerWidth();
}
});
$tabTitle.animate({
scrollLeft: autoLeft - $tabTitle.width() / 3
}, 200);
},
/**
* 点击滚动
* @param direction
*/
rollClick: function (direction) {
var $tabTitle = $('.layuimini-tab .layui-tab-title');
var left = $tabTitle.scrollLeft();
if ('left' === direction) {
$tabTitle.animate({
scrollLeft: left - 450
}, 200);
} else {
$tabTitle.animate({
scrollLeft: left + 450
}, 200);
}
}
};
exports("miniTab", miniTab);
});
@@ -0,0 +1,475 @@
/**
* date:2020/02/28
* author:Mr.Chung
* version:2.0
* description:layuimini tab框架扩展
*/
layui.define(["jquery", "layer"], function (exports) {
var $ = layui.$,
layer = layui.layer;
var miniTheme = {
/**
* 主题配置项
* @param bgcolorId
* @returns {{headerLogo, menuLeftHover, headerRight, menuLeft, headerRightThis, menuLeftThis}|*|*[]}
*/
config: function (bgcolorId) {
var bgColorConfig = [
{
headerRightBg: '#ffffff', //头部右侧背景色
headerRightBgThis: '#e4e4e4', //头部右侧选中背景色,
headerRightColor: 'rgba(107, 107, 107, 0.7)', //头部右侧字体颜色,
headerRightChildColor: 'rgba(107, 107, 107, 0.7)', //头部右侧下拉字体颜色,
headerRightColorThis: '#565656', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(160, 160, 160, 0.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#034f86', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#565656', //头部缩放按钮样式,
headerLogoBg: '#ffffff', //logo背景颜色,
headerLogoColor: 'rgb(191, 187, 187)', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#ffffff', //左侧菜单背景,
leftMenuBgThis: '#1E9FFF', //左侧菜单选中背景,
leftMenuChildBg: '#ffffff', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(40, 31, 31)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#c2bb34', //tab选项卡选中颜色,
},
{
headerRightBg: '#23262e', //头部右侧背景色
headerRightBgThis: '#0c0c0c', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#1aa094', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#0c0c0c', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#23262e', //左侧菜单背景,
leftMenuBgThis: '#737373', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#23262e', //tab选项卡选中颜色,
},
{
headerRightBg: '#ffa4d1', //头部右侧背景色
headerRightBgThis: '#bf7b9d', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#ffa4d1', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#e694bd', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#1f1f1f', //左侧菜单背景,
leftMenuBgThis: '#737373', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#ffa4d1', //tab选项卡选中颜色,
},
{
headerRightBg: '#1aa094', //头部右侧背景色
headerRightBgThis: '#197971', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#1aa094', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#0c0c0c', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#23262e', //左侧菜单背景,
leftMenuBgThis: '#1aa094', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#1aa094', //tab选项卡选中颜色,
},
{
headerRightBg: '#1e9fff', //头部右侧背景色
headerRightBgThis: '#0069b7', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#1e9fff', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#0c0c0c', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#1f1f1f', //左侧菜单背景,
leftMenuBgThis: '#1e9fff', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#1e9fff', //tab选项卡选中颜色,
},
{
headerRightBg: '#ffb800', //头部右侧背景色
headerRightBgThis: '#d09600', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#d09600', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#243346', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#2f4056', //左侧菜单背景,
leftMenuBgThis: '#8593a7', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#ffb800', //tab选项卡选中颜色,
},
{
headerRightBg: '#e82121', //头部右侧背景色
headerRightBgThis: '#ae1919', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#ae1919', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#0c0c0c', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#1f1f1f', //左侧菜单背景,
leftMenuBgThis: '#3b3f4b', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#e82121', //tab选项卡选中颜色,
},
{
headerRightBg: '#963885', //头部右侧背景色
headerRightBgThis: '#772c6a', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#772c6a', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#243346', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#2f4056', //左侧菜单背景,
leftMenuBgThis: '#586473', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#963885', //tab选项卡选中颜色,
},
{
headerRightBg: '#2D8CF0', //头部右侧背景色
headerRightBgThis: '#0069b7', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#0069b7', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#0069b7', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#1f1f1f', //左侧菜单背景,
leftMenuBgThis: '#2D8CF0', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#2d8cf0', //tab选项卡选中颜色,
},
{
headerRightBg: '#ffb800', //头部右侧背景色
headerRightBgThis: '#d09600', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#d09600', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#d09600', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#2f4056', //左侧菜单背景,
leftMenuBgThis: '#3b3f4b', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#ffb800', //tab选项卡选中颜色,
},
{
headerRightBg: '#e82121', //头部右侧背景色
headerRightBgThis: '#ae1919', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#ae1919', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#d91f1f', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#1f1f1f', //左侧菜单背景,
leftMenuBgThis: '#3b3f4b', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#e82121', //tab选项卡选中颜色,
},
{
headerRightBg: '#963885', //头部右侧背景色
headerRightBgThis: '#772c6a', //头部右侧选中背景色,
headerRightColor: 'rgba(255,255,255,.7)', //头部右侧字体颜色,
headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
headerRightNavMore: 'rgba(255,255,255,.7)', //头部右侧更多下拉颜色,
headerRightNavMoreBg: '#772c6a', //头部右侧更多下拉列表选中背景色,
headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
headerLogoBg: '#772c6a', //logo背景颜色,
headerLogoColor: '#ffffff', //logo字体颜色,
leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
leftMenuBg: '#2f4056', //左侧菜单背景,
leftMenuBgThis: '#626f7f', //左侧菜单选中背景,
leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
leftMenuColor: 'rgb(191, 187, 187)', //左侧菜单字体颜色,
leftMenuColorThis: '#ffffff', //左侧菜单选中字体颜色,
tabActiveColor: '#963885', //tab选项卡选中颜色,
}
];
if (bgcolorId === undefined) {
return bgColorConfig;
} else {
return bgColorConfig[bgcolorId];
}
},
/**
* 初始化
* @param options
*/
render: function (options) {
options.bgColorDefault = options.bgColorDefault || false;
options.listen = options.listen || false;
var bgcolorId = sessionStorage.getItem('layuiminiBgcolorId');
if (bgcolorId === null || bgcolorId === undefined || bgcolorId === '') {
bgcolorId = options.bgColorDefault;
}
miniTheme.buildThemeCss(bgcolorId);
if (options.listen) miniTheme.listen(options);
},
/**
* 构建主题样式
* @param bgcolorId
* @returns {boolean}
*/
buildThemeCss: function (bgcolorId) {
if (!bgcolorId) {
return false;
}
var bgcolorData = miniTheme.config(bgcolorId);
var styleHtml = '/*头部右侧背景色 headerRightBg */\n' +
'.layui-layout-admin .layui-header {\n' +
' background-color: ' + bgcolorData.headerRightBg + ' !important;\n' +
'}\n' +
'\n' +
'/*头部右侧选中背景色 headerRightBgThis */\n' +
'.layui-layout-admin .layui-header .layuimini-header-content > ul > .layui-nav-item.layui-this, .layuimini-tool i:hover {\n' +
' background-color: ' + bgcolorData.headerRightBgThis + ' !important;\n' +
'}\n' +
'\n' +
'/*头部右侧字体颜色 headerRightColor */\n' +
'.layui-layout-admin .layui-header .layui-nav .layui-nav-item a {\n' +
' color: ' + bgcolorData.headerRightColor + ';\n' +
'}\n' +
'/**头部右侧下拉字体颜色 headerRightChildColor */\n' +
'.layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child a {\n' +
' color: ' + bgcolorData.headerRightChildColor + '!important;\n' +
'}\n'+
'\n' +
'/*头部右侧鼠标选中 headerRightColorThis */\n' +
'.layui-header .layuimini-menu-header-pc.layui-nav .layui-nav-item a:hover, .layui-header .layuimini-header-menu.layuimini-pc-show.layui-nav .layui-this a {\n' +
' color: ' + bgcolorData.headerRightColorThis + ' !important;\n' +
'}\n' +
'\n' +
'/*头部右侧更多下拉颜色 headerRightNavMore */\n' +
'.layui-header .layui-nav .layui-nav-more {\n' +
' border-top-color: ' + bgcolorData.headerRightNavMore + ' !important;\n' +
'}\n' +
'\n' +
'/*头部右侧更多下拉颜色 headerRightNavMore */\n' +
'.layui-header .layui-nav .layui-nav-mored, .layui-header .layui-nav-itemed > a .layui-nav-more {\n' +
' border-color: transparent transparent ' + bgcolorData.headerRightNavMore + ' !important;\n' +
'}\n' +
'\n' +
'/**头部右侧更多下拉配置色 headerRightNavMoreBg headerRightNavMoreColor */\n' +
'.layui-header .layui-nav .layui-nav-child dd.layui-this a, .layui-header .layui-nav-child dd.layui-this, .layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child .layui-this a {\n' +
' background-color: ' + bgcolorData.headerRightNavMoreBg + ' !important;\n' +
' color:' + bgcolorData.headerRightNavMoreColor + ' !important;\n' +
'}\n' +
'\n' +
'/*头部缩放按钮样式 headerRightToolColor */\n' +
'.layui-layout-admin .layui-header .layuimini-tool i {\n' +
' color: ' + bgcolorData.headerRightToolColor + ';\n' +
'}\n' +
'\n' +
'/*logo背景颜色 headerLogoBg */\n' +
'.layui-layout-admin .layuimini-logo {\n' +
' background-color: ' + bgcolorData.headerLogoBg + ' !important;\n' +
'}\n' +
'\n' +
'/*logo字体颜色 headerLogoColor */\n' +
'.layui-layout-admin .layuimini-logo h1 {\n' +
' color: ' + bgcolorData.headerLogoColor + ';\n' +
'}\n' +
'\n' +
'/*左侧菜单更多下拉样式 leftMenuNavMore */\n' +
'.layuimini-menu-left .layui-nav .layui-nav-more,.layuimini-menu-left-zoom.layui-nav .layui-nav-more {\n' +
' border-top-color: ' + bgcolorData.leftMenuNavMore + ';\n' +
'}\n' +
'\n' +
'/*左侧菜单更多下拉样式 leftMenuNavMore */\n' +
'.layuimini-menu-left .layui-nav .layui-nav-mored, .layuimini-menu-left .layui-nav-itemed > a .layui-nav-more, .layuimini-menu-left-zoom.layui-nav .layui-nav-mored, .layuimini-menu-left-zoom.layui-nav-itemed > a .layui-nav-more {\n' +
' border-color: transparent transparent ' + bgcolorData.leftMenuNavMore + ' !important;\n' +
'}\n' +
'\n' +
'/*左侧菜单背景 leftMenuBg */\n' +
'.layui-side.layui-bg-black, .layui-side.layui-bg-black > .layuimini-menu-left > ul, .layuimini-menu-left-zoom > ul {\n' +
' background-color: ' + bgcolorData.leftMenuBg + ' !important;\n' +
'}\n' +
'\n' +
'/*左侧菜单选中背景 leftMenuBgThis */\n' +
'.layuimini-menu-left .layui-nav-tree .layui-this, .layuimini-menu-left .layui-nav-tree .layui-this > a, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left .layui-nav-tree .layui-nav-child dd.layui-this a, .layuimini-menu-left-zoom.layui-nav-tree .layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-this > a, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this, .layuimini-menu-left-zoom.layui-nav-tree .layui-nav-child dd.layui-this a {\n' +
' background-color: ' + bgcolorData.leftMenuBgThis + ' !important\n' +
'}\n' +
'\n' +
'/*左侧菜单子菜单背景 leftMenuChildBg */\n' +
'.layuimini-menu-left .layui-nav-itemed > .layui-nav-child{\n' +
' background-color: ' + bgcolorData.leftMenuChildBg + ' !important;\n' +
'}\n' +
'\n' +
'/*左侧菜单字体颜色 leftMenuColor */\n' +
'.layuimini-menu-left .layui-nav .layui-nav-item a, .layuimini-menu-left-zoom.layui-nav .layui-nav-item a {\n' +
' color: ' + bgcolorData.leftMenuColor + ' !important;\n' +
'}\n' +
'\n' +
'/*左侧菜单选中字体颜色 leftMenuColorThis */\n' +
'.layuimini-menu-left .layui-nav , .layuimini-menu-left .layui-nav .layui-this a, .layuimini-menu-left-zoom.layui-nav , .layuimini-menu-left-zoom.layui-nav .layui-this a {\n' +
' color:' + bgcolorData.leftMenuColorThis + ' !important;\n' +
'}\n' +
'\n' +
'/**tab选项卡选中颜色 tabActiveColor */\n' +
'.layuimini-tab .layui-tab-title .layui-this .layuimini-tab-active {\n' +
' background-color: ' + bgcolorData.tabActiveColor + ';\n' +
'}\n';
$('#layuimini-bg-color').html(styleHtml);
},
/**
* 构建主题选择html
* @param options
* @returns {string}
*/
buildBgColorHtml: function (options) {
options.bgColorDefault = options.bgColorDefault || 0;
var bgcolorId = parseInt(sessionStorage.getItem('layuiminiBgcolorId'));
if (isNaN(bgcolorId)) bgcolorId = options.bgColorDefault;
var bgColorConfig = miniTheme.config();
var html = '';
$.each(bgColorConfig, function (key, val) {
if (key === bgcolorId) {
html += '<li class="layui-this" data-select-bgcolor="' + key + '">\n';
} else {
html += '<li data-select-bgcolor="' + key + '">\n';
}
html += '<a href="javascript:;" data-skin="skin-blue" style="" class="clearfix full-opacity-hover">\n' +
'<div><span style="display:block; width: 20%; float: left; height: 12px; background: ' + val.headerLogoBg + ';"></span><span style="display:block; width: 80%; float: left; height: 12px; background: ' + val.headerRightBg + ';"></span></div>\n' +
'<div><span style="display:block; width: 20%; float: left; height: 40px; background: ' + val.leftMenuBg + ';"></span><span style="display:block; width: 80%; float: left; height: 40px; background: #ffffff;"></span></div>\n' +
'</a>\n' +
'</li>';
});
return html;
},
/**
* 监听
* @param options
*/
listen: function (options) {
$('body').on('click', '[data-bgcolor]', function () {
var loading = layer.load(0, {shade: false, time: 2 * 1000});
var clientHeight = (document.documentElement.clientHeight) - 60;
var bgColorHtml = miniTheme.buildBgColorHtml(options);
var html = '<div class="layuimini-color">\n' +
'<div class="color-title">\n' +
'<span>配色方案</span>\n' +
'</div>\n' +
'<div class="color-content">\n' +
'<ul>\n' + bgColorHtml + '</ul>\n' +
'</div>\n' +
'<div class="more-menu-list">\n' +
'<a class="more-menu-item" href="https://shensong.gitee.io/#/" target="_blank"><i class="layui-icon layui-icon-read" style="font-size: 19px;"></i> 开发文档</a>\n' +
'<a class="more-menu-item" href="https://gitee.com/ExciteTeam/ExciteCMS-SpringBoot-Layui?_from=demo" target="_blank"><i class="layui-icon layui-icon-tabs" style="font-size: 16px;"></i> 开源地址</a>\n' +
'<a class="more-menu-item" href="https://excite.zxdmy.com/#/ " target="_blank"><i class="layui-icon layui-icon-theme"></i> 官方网站</a>\n' +
'</div>' +
'</div>';
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,
success: function (index, layero) {
},
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);
miniTheme.render({
bgColorDefault: bgcolorId,
listen: false,
});
});
}
};
exports("miniTheme", miniTheme);
})
;
@@ -0,0 +1,40 @@
/**
* date:2020/03/01
* author:Mr.Chung
* version:2.0
* description:layuimini 统计框架扩展
*/
layui.define(["jquery"], function (exports) {
var $ = layui.$;
var miniTongji = {
/**
* 初始化
* @param options
*/
render: function (options) {
options.specific = options.specific || false;
options.domains = options.domains || [];
var domain = window.location.hostname;
if (options.specific === false || (options.specific === true && options.domains.indexOf(domain) >=0)) {
miniTongji.listen();
}
},
/**
* 监听统计代码
*/
listen: function () {
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?d97abf6d61c21d773f97835defbdef4e";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
}
};
exports("miniTongji", miniTongji);
});
@@ -0,0 +1,79 @@
.lay-step {
font-size: 0;
width: 400px;
margin: 0 auto;
max-width: 100%;
padding-left: 200px;
}
.step-item {
display: inline-block;
line-height: 26px;
position: relative;
font-size: 14px;
}
.step-item-tail {
width: 100%;
padding: 0 10px;
position: absolute;
left: 0;
top: 13px;
}
.step-item-tail i {
display: inline-block;
width: 100%;
height: 1px;
vertical-align: top;
background: #c2c2c2;
position: relative;
}
.step-item-tail .step-item-tail-done {
background: #009688;
}
.step-item-head {
position: relative;
display: inline-block;
height: 26px;
width: 26px;
text-align: center;
vertical-align: top;
color: #009688;
border: 1px solid #009688;
border-radius: 50%;
background: #ffffff;
}
.step-item-head.step-item-head-active {
background: #009688;
color: #ffffff;
}
.step-item-main {
display: block;
position: relative;
margin-left: -50%;
margin-right: 50%;
padding-left: 26px;
text-align: center;
}
.step-item-main-title {
font-weight: bolder;
color: #555555;
}
.step-item-main-desc {
color: #aaaaaa;
}
.lay-step + [carousel-item]:before {
display: none;
}
.lay-step + [carousel-item] > * {
background-color: transparent;
}
@@ -0,0 +1,101 @@
layui.define(['layer', 'carousel'], function (exports) {
var $ = layui.jquery;
var layer = layui.layer;
var carousel = layui.carousel;
// 添加步骤条dom节点
var renderDom = function (elem, stepItems, postion) {
var stepDiv = '<div class="lay-step">';
for (var i = 0; i < stepItems.length; i++) {
stepDiv += '<div class="step-item">';
// 线
if (i < (stepItems.length - 1)) {
if (i < postion) {
stepDiv += '<div class="step-item-tail"><i class="step-item-tail-done"></i></div>';
} else {
stepDiv += '<div class="step-item-tail"><i class=""></i></div>';
}
}
// 数字
var number = stepItems[i].number;
if (!number) {
number = i + 1;
}
if (i == postion) {
stepDiv += '<div class="step-item-head step-item-head-active"><i class="layui-icon">' + number + '</i></div>';
} else if (i < postion) {
stepDiv += '<div class="step-item-head"><i class="layui-icon layui-icon-ok"></i></div>';
} else {
stepDiv += '<div class="step-item-head "><i class="layui-icon">' + number + '</i></div>';
}
// 标题和描述
var title = stepItems[i].title;
var desc = stepItems[i].desc;
if (title || desc) {
stepDiv += '<div class="step-item-main">';
if (title) {
stepDiv += '<div class="step-item-main-title">' + title + '</div>';
}
if (desc) {
stepDiv += '<div class="step-item-main-desc">' + desc + '</div>';
}
stepDiv += '</div>';
}
stepDiv += '</div>';
}
stepDiv += '</div>';
$(elem).prepend(stepDiv);
// 计算每一个条目的宽度
var bfb = 100 / stepItems.length;
$('.step-item').css('width', bfb + '%');
};
var step = {
// 渲染步骤条
render: function (param) {
param.indicator = 'none'; // 不显示指示器
param.arrow = 'always'; // 始终显示箭头
param.autoplay = false; // 关闭自动播放
if (!param.stepWidth) {
param.stepWidth = '400px';
}
// 渲染轮播图
carousel.render(param);
// 渲染步骤条
var stepItems = param.stepItems;
renderDom(param.elem, stepItems, 0);
$('.lay-step').css('width', param.stepWidth);
//监听轮播切换事件
carousel.on('change(' + param.filter + ')', function (obj) {
$(param.elem).find('.lay-step').remove();
renderDom(param.elem, stepItems, obj.index);
$('.lay-step').css('width', param.stepWidth);
});
// 隐藏左右箭头按钮
$(param.elem).find('.layui-carousel-arrow').css('display', 'none');
// 去掉轮播图的背景颜色
$(param.elem).css('background-color', 'transparent');
},
// 下一步
next: function (elem) {
$(elem).find('.layui-carousel-arrow[lay-type=add]').trigger('click');
},
// 上一步
pre: function (elem) {
$(elem).find('.layui-carousel-arrow[lay-type=sub]').trigger('click');
}
};
layui.link(layui.cache.base + 'step-lay/step.css');
exports('step', step);
});
@@ -0,0 +1,272 @@
layui.define(['table', 'jquery', 'form'], function (exports) {
"use strict";
var MOD_NAME = 'tableSelect',
$ = layui.jquery,
table = layui.table,
form = layui.form;
var tableSelect = function () {
this.v = '1.1.0';
};
/**
* 初始化表格选择器
*/
tableSelect.prototype.render = function (opt) {
var elem = $(opt.elem);
var tableDone = opt.table.done || function(){};
//默认设置
opt.searchKey = opt.searchKey || 'keyword';
opt.searchPlaceholder = opt.searchPlaceholder || '关键词搜索';
opt.checkedKey = opt.checkedKey;
opt.table.page = opt.table.page || true;
opt.table.height = opt.height || 315;
//最小宽度
opt.width = opt.width || '530';
//多搜索条件
opt.searchType = opt.searchType || 'one';
opt.searchList = opt.searchList || [{key: opt.searchKey, placeholder: opt.searchPlaceholder}];
elem.off('click').on('click', function(e) {
e.stopPropagation();
if($('div.tableSelect').length >= 1){
return false;
}
var t = elem.offset().top + elem.outerHeight()+"px";
var l = elem.offset().left +"px";
var tableName = "tableSelect_table_" + new Date().getTime();
var tableBox = '<div class="tableSelect layui-anim layui-anim-upbit" style="left:'+l+';top:'+t+';border: 1px solid #d2d2d2;background-color: #fff;box-shadow: 0 2px 4px rgba(0,0,0,.12);padding:10px 10px 0 10px;position: absolute;z-index:66666666;margin: 5px 0;border-radius: 2px;min-width:'+opt.width+'px;">';
tableBox += '<div class="tableSelectBar">';
tableBox += '<form class="layui-form" action="" style="display:inline-block;">';
//判断是否多搜索条件
if(opt.searchType == 'more'){
$.each(opt.searchList, function (index, item) {
tableBox += '<input style="display:inline-block;width:190px;height:30px;vertical-align:middle;margin-right:-1px;border: 1px solid #C9C9C9;" type="text" name="'+item.searchKey+'" placeholder="'+item.searchPlaceholder+'" autocomplete="off" class="layui-input">';
});
}else{
tableBox += '<input style="display:inline-block;width:190px;height:30px;vertical-align:middle;margin-right:-1px;border: 1px solid #C9C9C9;" type="text" name="'+opt.searchKey+'" placeholder="'+opt.searchPlaceholder+'" autocomplete="off" class="layui-input">';
}
tableBox += '<button class="layui-btn layui-btn-sm layui-btn-primary tableSelect_btn_search" lay-submit lay-filter="tableSelect_btn_search"><i class="layui-icon layui-icon-search"></i></button>';
tableBox += '</form>';
tableBox += '<button style="float:right;" class="layui-btn layui-btn-sm tableSelect_btn_select">选择<span></span></button>';
tableBox += '</div>';
tableBox += '<table id="'+tableName+'" lay-filter="'+tableName+'"></table>';
tableBox += '</div>';
tableBox = $(tableBox);
$('body').append(tableBox);
//数据缓存
var checkedData = [];
//渲染TABLE
opt.table.elem = "#"+tableName;
opt.table.id = tableName;
opt.table.done = function(res, curr, count){
defaultChecked(res, curr, count);
setChecked(res, curr, count);
tableDone(res, curr, count);
};
var tableSelect_table = table.render(opt.table);
//分页选中保存数组
table.on('radio('+tableName+')', function(obj){
if(opt.checkedKey){
checkedData = table.checkStatus(tableName).data
}
updataButton(table.checkStatus(tableName).data.length)
})
table.on('checkbox('+tableName+')', function(obj){
if(opt.checkedKey){
if(obj.checked){
for (var i=0;i<table.checkStatus(tableName).data.length;i++){
checkedData.push(table.checkStatus(tableName).data[i])
}
}else{
if(obj.type=='all'){
for (var j=0;j<table.cache[tableName].length;j++) {
for (var i=0;i<checkedData.length;i++){
if(checkedData[i][opt.checkedKey] == table.cache[tableName][j][opt.checkedKey]){
checkedData.splice(i,1)
}
}
}
}else{
//因为LAYUI问题,操作到变化全选状态时获取到的obj为空,这里用函数获取未选中的项。
function nu (){
var noCheckedKey = '';
for (var i=0;i<table.cache[tableName].length;i++){
if(!table.cache[tableName][i].LAY_CHECKED){
noCheckedKey = table.cache[tableName][i][opt.checkedKey];
}
}
return noCheckedKey
}
var noCheckedKey = obj.data[opt.checkedKey] || nu();
for (var i=0;i<checkedData.length;i++){
if(checkedData[i][opt.checkedKey] == noCheckedKey){
checkedData.splice(i,1);
}
}
}
}
checkedData = uniqueObjArray(checkedData, opt.checkedKey);
updataButton(checkedData.length)
}else{
updataButton(table.checkStatus(tableName).data.length)
}
});
//渲染表格后选中
function setChecked (res, curr, count) {
for(var i=0;i<res.data.length;i++){
for (var j=0;j<checkedData.length;j++) {
if(res.data[i][opt.checkedKey] == checkedData[j][opt.checkedKey]){
res.data[i].LAY_CHECKED = true;
var index= res.data[i]['LAY_TABLE_INDEX'];
var checkbox = $('#'+tableName+'').next().find('tr[data-index=' + index + '] input[type="checkbox"]');
checkbox.prop('checked', true).next().addClass('layui-form-checked');
var radio = $('#'+tableName+'').next().find('tr[data-index=' + index + '] input[type="radio"]');
radio.prop('checked', true).next().addClass('layui-form-radioed').find("i").html('&#xe643;');
}
}
}
var checkStatus = table.checkStatus(tableName);
if(checkStatus.isAll){
$('#'+tableName+'').next().find('.layui-table-header th[data-field="0"] input[type="checkbox"]').prop('checked', true);
$('#'+tableName+'').next().find('.layui-table-header th[data-field="0"] input[type="checkbox"]').next().addClass('layui-form-checked');
}
updataButton(checkedData.length)
}
//写入默认选中值(puash checkedData)
function defaultChecked (res, curr, count){
if(opt.checkedKey && elem.attr('ts-selected')){
var selected = elem.attr('ts-selected').split(",");
for(var i=0;i<res.data.length;i++){
for(var j=0;j<selected.length;j++){
if(res.data[i][opt.checkedKey] == selected[j]){
checkedData.push(res.data[i])
}
}
}
checkedData = uniqueObjArray(checkedData, opt.checkedKey);
}
}
//更新选中数量
function updataButton (n) {
tableBox.find('.tableSelect_btn_select span').html(n==0?'':'('+n+')')
}
//数组去重
function uniqueObjArray(arr, type){
var newArr = [];
var tArr = [];
if(arr.length == 0){
return arr;
}else{
if(type){
for(var i=0;i<arr.length;i++){
if(!tArr[arr[i][type]]){
newArr.push(arr[i]);
tArr[arr[i][type]] = true;
}
}
return newArr;
}else{
for(var i=0;i<arr.length;i++){
if(!tArr[arr[i]]){
newArr.push(arr[i]);
tArr[arr[i]] = true;
}
}
return newArr;
}
}
}
//FIX位置
var overHeight = (elem.offset().top + elem.outerHeight() + tableBox.outerHeight() - $(window).scrollTop()) > $(window).height();
var overWidth = (elem.offset().left + tableBox.outerWidth()) > $(window).width();
overHeight && tableBox.css({'top':'auto','bottom':'0px'});
overWidth && tableBox.css({'left':'auto','right':'5px'})
//关键词搜索
form.on('submit(tableSelect_btn_search)', function(data){
tableSelect_table.reload({
where: data.field,
page: {
curr: 1
}
});
return false;
});
//双击行选中
table.on('rowDouble('+tableName+')', function(obj){
var checkStatus = {data:[obj.data]};
selectDone(checkStatus);
})
//按钮选中
tableBox.find('.tableSelect_btn_select').on('click', function() {
var checkStatus = table.checkStatus(tableName);
if(checkedData.length > 1){
checkStatus.data = checkedData;
}
selectDone(checkStatus);
})
//写值回调和关闭
function selectDone (checkStatus){
if(opt.checkedKey){
var selected = [];
for(var i=0;i<checkStatus.data.length;i++){
selected.push(checkStatus.data[i][opt.checkedKey])
}
elem.attr("ts-selected",selected.join(","));
}
opt.done(elem, checkStatus);
tableBox.remove();
delete table.cache[tableName];
checkedData = [];
}
//点击其他区域关闭
$(document).mouseup(function(e){
var userSet_con = $(''+opt.elem+',.tableSelect');
if(!userSet_con.is(e.target) && userSet_con.has(e.target).length === 0){
tableBox.remove();
delete table.cache[tableName];
checkedData = [];
}
});
})
}
/**
* 隐藏选择器
*/
tableSelect.prototype.hide = function (opt) {
$('.tableSelect').remove();
}
//自动完成渲染
var tableSelect = new tableSelect();
//FIX 滚动时错位
if(window.top == window.self){
$(window).scroll(function () {
tableSelect.hide();
});
}
exports(MOD_NAME, tableSelect);
})
@@ -0,0 +1,437 @@
/** 最外层容器 */
.ew-tree-table {
margin: 10px 0;
position: relative;
border: 1px solid #e6e6e6;
border-bottom: none;
border-right: none;
}
.ew-tree-table:before, .ew-tree-table:after, .ew-tree-table .ew-tree-table-head:after {
content: "";
background-color: #e6e6e6;
position: absolute;
right: 0;
bottom: 0;
}
.ew-tree-table:before {
width: 1px;
top: 0;
z-index: 1;
}
.ew-tree-table:after, .ew-tree-table .ew-tree-table-head:after {
height: 1px;
left: 0;
}
.ew-tree-table .layui-table {
margin: 0;
position: relative;
table-layout: fixed;
}
/** 表格 */
.ew-tree-table .layui-table td, .ew-tree-table .layui-table th {
border-top: none;
border-left: none;
padding: 0 !important;
}
.ew-tree-table .ew-tree-table-box {
overflow: auto;
position: relative;
}
.ew-tree-table .ew-tree-table-head {
overflow: hidden;
box-sizing: border-box;
background-color: #f2f2f2;
position: relative;
}
/** loading */
.ew-tree-table .ew-tree-table-loading {
padding: 10px 0;
text-align: center;
}
.ew-tree-table .ew-tree-table-loading > i {
color: #999;
font-size: 30px;
}
.ew-tree-table .ew-tree-table-loading.ew-loading-float {
position: absolute;
top: 0;
left: 0;
right: 0;
}
/** 空数据 */
.ew-tree-table .ew-tree-table-empty {
color: #666;
font-size: 14px;
padding: 18px 0;
text-align: center;
display: none;
}
/** 单元格 */
.ew-tree-table-cell.ew-tree-tips-open {
position: absolute;
top: 0;
left: 0;
padding: 0;
z-index: 19891015;
background-color: #fff;
box-shadow: 3px 3px 8px rgba(0, 0, 0, .15);
}
thead .ew-tree-table-cell.ew-tree-tips-open {
background-color: #f2f2f2;
}
.ew-tree-table-cell.ew-tree-tips-open.ew-show-left {
right: 0;
left: auto;
box-shadow: -3px 3px 8px rgba(0, 0, 0, .15);
}
.ew-tree-table-cell.ew-tree-tips-open.ew-show-bottom {
bottom: 0;
top: auto;
box-shadow: 3px -3px 8px rgba(0, 0, 0, .15);
}
.ew-tree-table-cell.ew-tree-tips-open.ew-show-left.ew-show-bottom {
box-shadow: -3px -3px 8px rgba(0, 0, 0, .15);
}
.ew-tree-table-cell > .ew-tree-tips-c {
position: absolute;
right: -6px;
top: -3px;
width: 22px;
height: 22px;
line-height: 22px;
font-size: 16px;
color: #fff;
background-color: #666;
border-radius: 50%;
text-align: center;
cursor: pointer;
display: none;
}
table tr:first-child .ew-tree-table-cell > .ew-tree-tips-c {
top: 0;
}
.ew-tree-table-cell.ew-tree-tips-open > .ew-tree-tips-c {
display: block;
}
.ew-tree-table-cell.ew-tree-tips-open.ew-show-left > .ew-tree-tips-c {
left: -6px;
right: auto;
}
.ew-tree-table-cell > .ew-tree-table-cell-content {
padding: 5px 15px;
line-height: 28px;
}
[lay-size="lg"] .ew-tree-table-cell > .ew-tree-table-cell-content {
line-height: 40px;
}
[lay-size="sm"] .ew-tree-table-cell > .ew-tree-table-cell-content {
padding: 1px 15px;
}
.ew-tree-table-cell.single-line > .ew-tree-table-cell-content {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.ew-tree-table-cell.ew-tree-tips-open > .ew-tree-table-cell-content {
overflow: auto;
padding: 9px 15px;
height: auto;
min-height: 100%;
max-height: 110px;
line-height: inherit;
max-width: 260px;
width: 200px;
width: max-content;
width: -moz-max-content;
box-sizing: border-box;
white-space: normal;
}
.ew-tree-table-cell > .layui-table-grid-down {
box-sizing: border-box;
}
/** 图标列 */
.ew-tree-table .ew-tree-pack {
cursor: pointer;
line-height: 16px;
}
.ew-tree-table .ew-tree-pack > .layui-icon, .ew-tree-table .ew-tree-pack > .ew-tree-icon {
margin-right: 5px;
}
.ew-tree-table .ew-tree-pack > * {
vertical-align: middle;
}
/* 缩进 */
.ew-tree-table .ew-tree-table-indent {
margin-right: 5px;
padding-left: 16px;
}
/* 箭头 */
.ew-tree-table .ew-tree-table-arrow:before {
content: "\e623";
}
.ew-tree-table .ew-tree-table-open .ew-tree-table-arrow:before {
content: "\e625";
}
.ew-tree-table .ew-tree-table-arrow.arrow2 {
font-size: 12px;
font-weight: 600;
line-height: 16px;
height: 16px;
width: 16px;
display: inline-block;
text-align: center;
color: #888;
}
.ew-tree-table .ew-tree-table-arrow.arrow2:before {
content: "\e602";
}
.ew-tree-table .ew-tree-table-open .ew-tree-table-arrow.arrow2:before {
content: "\e61a";
}
.ew-tree-table-arrow.ew-tree-table-arrow-hide {
visibility: hidden;
}
/* 箭头变加载中状态 */
.ew-tree-table .ew-tree-table-loading > td .ew-tree-table-arrow:before {
content: "\e63d" !important;
}
.ew-tree-table .ew-tree-table-loading > td .ew-tree-table-arrow {
margin-right: 0;
}
.ew-tree-table .ew-tree-table-loading > td .ew-tree-table-arrow + * {
margin-left: 5px;
}
.ew-tree-table .ew-tree-table-loading * {
pointer-events: none !important;
}
/** 折叠行 */
.ew-tree-table .ew-tree-tb-hide {
display: none;
}
/** 特殊列调整 */
.ew-tree-table td[data-type="numbers"] > .ew-tree-table-cell,
.ew-tree-table th[data-type="numbers"] > .ew-tree-table-cell,
.ew-tree-table td[data-type="checkbox"] > .ew-tree-table-cell,
.ew-tree-table th[data-type="checkbox"] > .ew-tree-table-cell,
.ew-tree-table td[data-type="radio"] > .ew-tree-table-cell,
.ew-tree-table th[data-type="radio"] > .ew-tree-table-cell,
.ew-tree-table td[data-type="space"] > .ew-tree-table-cell,
.ew-tree-table th[data-type="space"] > .ew-tree-table-cell {
padding-left: 0;
padding-right: 0;
}
/* 单元格内表单元素样式调整 */
.ew-tree-table .layui-form-switch,
.ew-tree-table .layui-form-radio {
margin: 0;
}
/* checkbox列调整 */
.ew-tree-table-checkbox + .layui-form-checkbox {
padding: 0;
}
.ew-tree-table-checkbox + .layui-form-checkbox > .layui-icon {
font-weight: 600;
color: transparent;
transition: background-color .1s linear;
-webkit-transition: background-color .1s linear;
}
.ew-tree-table-checkbox + .layui-form-checkbox.layui-form-checked > .layui-icon {
color: #fff;
}
/* checkbox半选状态 */
.ew-form-indeterminate + .layui-form-checkbox .layui-icon:before {
content: "";
width: 10px;
height: 2px;
background-color: #f1f1f1;
position: absolute;
top: 50%;
left: 50%;
margin: -1px 0 0 -5px;
}
/* radio列调整 */
.ew-tree-table-radio + .layui-form-radio {
padding: 0;
height: 20px;
line-height: 20px;
}
.ew-tree-table-radio + .layui-form-radio > i {
margin: 0;
height: 20px;
font-size: 20px;
line-height: 20px;
}
/** 单元格编辑 */
.ew-tree-table .layui-table td[data-edit] {
cursor: text;
}
.ew-tree-table .ew-tree-table-edit {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
border-radius: 0;
box-shadow: 1px 1px 20px rgba(0, 0, 0, .15);
}
.ew-tree-table .ew-tree-table-edit:focus {
border-color: #5FB878 !important;
}
.ew-tree-table .ew-tree-table-edit.layui-form-danger {
border-color: #FF5722 !important;
}
/** 搜索数据隐藏行 */
.ew-tree-table tr.ew-tree-table-filter-hide {
display: none !important;
}
/** 头部工具栏 */
.ew-tree-table .ew-tree-table-tool {
min-height: 50px;
line-height: 30px;
padding: 10px 15px;
box-sizing: border-box;
background-color: #f2f2f2;
border-bottom: 1px solid #e6e6e6;
}
.ew-tree-table .ew-tree-table-tool .ew-tree-table-tool-right {
float: right;
}
.ew-tree-table .ew-tree-table-tool .ew-tree-table-tool-item {
position: relative;
color: #333;
width: 26px;
height: 26px;
line-height: 26px;
text-align: center;
margin-left: 10px;
display: inline-block;
border: 1px solid #ccc;
box-sizing: border-box;
vertical-align: middle;
-webkit-transition: .3s all;
transition: .3s all;
cursor: pointer;
}
.ew-tree-table .ew-tree-table-tool .ew-tree-table-tool-item:first-child {
margin-left: 0;
}
.ew-tree-table .ew-tree-table-tool .ew-tree-table-tool-item:hover {
border-color: #999;
}
.ew-tree-table .ew-tree-table-tool-right .layui-table-tool-panel {
left: auto;
right: -1px;
z-index: 9999;
}
/* 列宽拖拽调整 */
.ew-tree-table .ew-tb-resize {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 10px;
cursor: col-resize;
}
.ew-tree-table-resizing {
cursor: col-resize;
-ms-user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
}
/* 辅助样式 */
.ew-tree-table .layui-form-switch {
margin: 0;
}
.ew-tree-table .pd-tb-0 {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.ew-tree-table .break-all {
word-break: break-all !important;
}
/** 扩展图标 */
.ew-tree-table .ew-tree-icon-folder:after, .ew-tree-table .ew-tree-icon-file:after {
content: "";
padding: 2px 10px;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
background-repeat: no-repeat;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAE6UlEQVR4Xu2ZPYhcVRiGny9hC0FsTEBCGkFTWIQE/IlpgmKpWAiLyR0XLbYTxEKxkCAEhRCxEOwsjJnJioKIYClWKgqiskIIaCoLYyASVJT87JGspN37LrOXvec777Tzzrnvz7Nn2dnAr6YbiKbTOzwGoHEIDIABaLyBxuP7BjAAjTfQeHzfAAag8QYaj+8bwAA03kDj8X0DGIDGG2g8/lw3QFlhD9fZN7oOF7gYT3NudL5GaGjTAJQP2c1VXgIOExyGkf4/oXCe4I3oeH+EvY/G0qYAKFOWCV4Hdo8mQb+RL7jBE7HE3/3S9hQyAGXGCeDVSiv6lqscief4t1L/g9mWAChTHiD4ZrTXvVbPu9GxrEnbUWkAzPgeOJCglsXo+ChBji2L0AtAmfEgrP/0Z3hdZoF7Y5HLGcJsRQYFgLeAF7fiYSM540x0LI3Ey7bb6AdgytcEh7bd6VYa2MGhOJrmVpurmX4AZlwCds31lPF9+AI32O8/DYUvccqUKwR3jG/DuR29Gd36F1pNv/pvgKwAFK5RuC+e4eeWCWgXgJurFz6LCY8bgA0aSPwr4P/UhVNc43ir3xK2fQPcAr/wO/AewU/Ar6xRqroVdvAnC6zGIlc369sAbLax8er/ofAJOzkVR9e/uZVeBkCqqTrRyeh4RXFtAJSWatQUno0Jp/usG4C+hup9/yJ72BuPcH2jCAag3oEV50vRccYAKFXl1LwdHS8YgJzj9qcqfBoTnjQA/VVlVXwXHfcbgKzz9uf6IToOGoD+orIqDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzGUAxKKyygxA1mXFXAZALCqrzABkXVbMZQDEorLKDEDWZcVcBkAsKqvMAGRdVsxlAMSissoMQNZlxVwGQCwqq8wAZF1WzLUFAMy4BOwSH2jZmBoorMaE/RtZij6/ZcoFgrv7dH5/lA38Eh33zAfAjM+BR0cZz6Y2bqDwY0w4MB8AU04SvOyuq2zg4+h4aj4AzvIwha+qjN+66cLzMeGduQC4+eEy4zywr/U+K8t/hQX2xiJ/zQ/ACgdZ40vgtspKaNducCyOsdJXQO9fAbcOKGc5whofENzVd6jf3/YGTkTHccWFDMD6r4LT3MlOloHHCB4CblceYs3gDfxB4TeCcxReiwmr6hM3BYB6qHX1NGAA6tlqEKcGYJBa6znUANSz1SBODcAgtdZzqAGoZ6tBnBqAQWqt51ADUM9Wgzg1AIPUWs+hBqCerQZxagAGqbWeQw1APVsN4tQADFJrPYcagHq2GsTpf+KxwJB5Cd5mAAAAAElFTkSuQmCC");
}
.ew-tree-table tr.ew-tree-table-open > td .ew-tree-icon-folder:after {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAKwElEQVR4Xu2df9AVVRnHP899gUxmYKhsCpJREEeMakSoiGGCbIxSizIJ7i5OksZkMIxQjlOQyOCQ5o/8RWmkMdz7wjDC5I+hcFSKxEENh4YsEwPJAbVQ8AeQL733NPcKyn3v7r17d8/uvfvus//ec57n+3yf7z179uw5zwp6ZZoByXT0GjwqgIyLQAWgAsg4AxkPX0cAFUDGGch4+DoCqAAyzkDGw9cRQAWQcQYyHr6OACqA5hkw63kfr3IyOQZTIte8BUs9OnibEi/isEcEY8lqpswEHgHMGgbSxTyEyRjGIC1MfM8UGQ4CfyLHWp7jbllEKVNZjBBsIAGYAi7CrcCgCL6S6voM4IrDtqQcptlPQwGYAksRrkpVkIZD5JgmeR5IFe4WgK0rAFPkamBRC3BFd2k4AkwSl83RjfVeC74CMCuZSI6NqQ7d8G9KDJOLK3MEvTwY8BdAga0Io3sBa0vEYWEviCOWEDwFYDoZh+HxWDwmb/R18gzSx0Rv4r0FUORa4EfJ5yomj8IEyfNYTNZTbdZbAAU2IJyb6siOB2+4Qlx+3mvisRiInwC2I4yy6Ke1pgw/E5crWwuiPb373QL+BZzcnpBDobpLHGaF6tnLO6kAenmCG4WXFQH8WhwubURGFn/PhgAMD4nLl7KY4EYxZ0MAcBhhqOTZ14iQrP2eFQGU8/ogeb6qC0LVEs+SAMqRL+ctLpdZlRdFeoH32UBTpLc9Br6XbMMuhLUIm+jmzbZSQUdlV9M++rBTpnI4CWxZGwGS4NSWj2eBh4CbxGG3LaM97agA4mLWnt23gZ+yg8VxbHVTAdhLVNyWHqabKbb3NqgA4k6bTfuG+3GYYvNJRgVgM0FJ2DL8QFxutOVKBWCLyaTsGN6gH0NlKq/bcKkCsMFi0jYMs8XlDhtuVQA2WEzahuH34vJlG25VADZYTN7GPnE4yYZbFYANFlth4y362VjSVgG0Ink2fAon2Xi7qQKwkYxW2OglAtiP4QlgN8LLreAxtT4HcL1cwKGo+FsxAnQDv6HEbTKDv0QNQPtHYyBpAZSPm7mSp/ymS682YCA5ARiWMYS5Mon/tUHcCuEoA0kJ4AZx+KGy3n4MJCGA9eJwXqPQzSJyjGAMJU5s1FZ/r8NAH7roYIdM5T9BeIpXAIaXOMKZcgkH/MCYIp8GvgN8A/hQENDaJhADrwG/oy9X1BNDvAIQZkqee+okfwGGa9qq4FQgblPVaC85xsp09nqhjlMAO9nBCK9tTGYjfdhLJ3BRqqhMK1jDdoYw2msCHqcAypsZ53txZoqVo9pz08pnKnEbLhKXe3tij1MAk8VhQ0+HZjWj6GZ7KklMM2jD3eJW5lpVV5wC+IA47K8RQJEVwMVp5jKV2H3OR8YjAMPL4vLRmuSvoYMjvAoMTCWJ6Qa9Vhy+mdQIsEEcJtcIYCWjybE13TymFL2wVPK1dZ/iGgE8S7KYTi7F8KuUUphu2AlPAsu1eose9/9lwPfSzWRq0Q8Xh53J3AI6+IRM4681AiiwBeEzqaUwrcANh8Slvxf8OG4BXezg/T0XgCpr/afxX4S+aeUxtbgNfxCXSUkJYJs4nKXP/20ll5vFYV4yAjCsEJdve9z/y8/+5TUAvZJmwDBDXArJCADmicPNHgLQ5d+kE3/Mn+Hj4vK3ZARg+KK4POIxAdyEMKFVHGTWb/m7Cc9zgl9tgTgmgd5LwAUOIrrZI3EhGraIyzg/v7YFsFcchnhMAE+nm38kHrw6BMMycfl+MgLwObRoikwDVmk+WsCAcJnkWZ6MAOA6cWo/MGUKXI/optAWpB9KnC0zeDoZAQh5ydf+002BhxHOaQkBWXZqKHGQE+odIrU7BxBGSZ7yd/uqLlOsbArVV8DJi9FzUe54GDYF4L0EvIpTKLEr+djVIz67gOIRgOFpcTnb499f3u69VtPREgbmiMPt9TzbHAHuEYeZHgtASxB+3JLws+40x3iZXv/rb/YE4PNhJlNgPWKnnk3W89l0/APo3+gIuT0BwBfEqf3SqCnwCsKHmwavHaIy8Kw4jGxkxKYAapaAzSoGU2JPIxD6ewwMGDrFxWlk2Y4ADHvE5WMe9//zEf2Cd6MkxPJ7wIqidgQAnieATYGfIFwTS4BqtD4DwjmS59FGNNkRgM+WY1Pkt8DXGoHQ32NgoItB9U5lH/NoRwAwXRxWe6wB9N4vj8SQM4smXxCHU4PYsyOADs6Uafz9eIdmDQM54l8XIAg4bROagXXicGGQ3jYE4L0EXOBcpPZwaBBQ2iYiA4YF4la+AN/wsiGAP4vDWI8ngKsQljZEoA3iYOA8cVgfxHB0Afi8cDBF1mgBiCApiKGN8BHJ80oQy9EFAHPF4VaPCeDzwPAgILSNRQYML4nL4KAWowtAmCh5/lg1AXyAE3mDg0FBaDurDASqynbMY3QBQO0S8Eomkqt9L2A1TDXmx8AScVgYlJ6oAnhRHIZ6TADnI9wQFIS2s8rAheKwLqjFqAJ4UBwu8BBAESEfFIS2s8hAjlNlOi8EtRhNAIZrxWWBxwSwvCh0RlAQ2s4SA4YD4jKoGWvRBCB8S/KVx713L6MTwGb4t932UXGa230dTQAlzpAZ1Sd+TIHxCI/ZjkztBWKg6aLcUQTgtwQ8B6ldFwgEXxtFY8DnXEY9o+EFYHhK3Eqh56rLFCu1gWvqA0SLTHsHYkAY2ezHOMILAJaLw2UeAih/BuaTgQBrI3sM1KkDFM8IADV7zs2d9KV/pQ5Qzl5kaikQA4bHxWV8oLbHNYoyAnxeHDZVPQEUGIvwZLMgtL0VBm4XhznNWgovAI8956aTWRh+2SwIbW+BgQbfZvDzEFYAu8XhFI/7/53Ady2EoyaaZ+AscdjWbLdwAjDcL27tZk9T5ClgTLMgtH1EBhrUAYpjEljzxkkLQUZMYrTuW8UJ98cLOwLUfH3CrORT5JofgqLFrb2PMuD5SB6EnXACgNPFYUfVE0Anl5TPowdxqm2sM3C5OPwijNXmBeCz4GCK3AbMDgNC+0RkwDBOXLaEseIngOeAEZ4GDU+Iy2drngAKbEb4XBgQ2icCAwHqADU/CSzwJFK71fuoobvEYVbV8P9OJfA3tRBkhESG7/qMOIwK2917BCiwDuHrPiPAbHG5o0oAqxlJt3ct2rDAtF9ABnyKcwfsjd8tYDH4bCwUJki++n2/KVbOoXtWow4KRNuFZsDzXGZQa34jgP+xLq8l4CI3gnc9+qBAtF0IBgwH6MdgmcrhEL0rXbwFUP68WxevIQyoMmzYJS7DPCaAGxEmhgWh/UIyIMyXPDeF7O0vgPIvpsB1CFf2MH6fOEzxEIBWAo+ShXB915PnfBFMuO7v9PIcASoCWMEH6VNZ7Hlvl6lhsbhc3WMCOJxuysfA9EqKAUO5+P7MeiVgg0LxFUBFBEW+AtwH9DlqsObQgSlWvgBetTM4qHNt1zQD+zEs7PkU1rSV4zrUFcDRW0G50NMtwDBKjJAZ1f92U2ApUlshPAoo7fsuA12YCt+bgXvpxyMylW6b/DQUwDFnZiWn4fLPqPccm+DVVnQGAgsguiu10I4MqADaMSsJYlIBJEh2O7pSAbRjVhLEpAJIkOx2dKUCaMesJIhJBZAg2e3oSgXQjllJEJMKIEGy29GVCqAds5IgJhVAgmS3oysVQDtmJUFM/wdaDlOuM5Eu/AAAAABJRU5ErkJggg==")
}
.ew-tree-table .ew-tree-icon-file:after {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAJNUlEQVR4Xu2dXYxdVRXHf2tghhYaoba1Qk1owIwmfVBaTKRgQqMPlGjig2nDnDsF0whSnwqJ4SNoU2OLUSNPVDSx2t47hEkxaQMBI1hB/EiE6osYqjGUYPGjCihN6Uy525wzt7UdZu7ZZ87a5949Z52XeVl77bX//9/d52vvM4IdtVZAaj16GzwGQM0hMAAMgJorUPPh2wxgANRcgZoP32YAA6DmCtR8+DYDGADVKuB2s4BB1gMbEYZxLEFYDlxQbSU97+0Ejn8hHMPxR4R9LOZxuZGTVVZW2QzgxlnGBNuBUYSLqhxkNH05jgN7GeIrsoF/VlF3cADcQc7nKHfiuM+M97Q0BUH4GpfxbVnHKc9WcwoLCoBrsRjHYwhr51Rd3Rs5foXwaUl4PZQUwQBwLa4AngZWhiq+JnlfBj4pCX8JMd4gALgxluJ4Hrg8RNE1zHkE4WoZ4Zj22NUBcOMsZILnEFZrF1vrfI5DDHGdbOCEpg76ADTZiXCXZpGWq6OAsFNGuEdTD1UA3B7exwDpdLUgt0jHqwjjwH6EF0NMb7k19DAgO03CKtp8pvNM5AO55TjeZoCVMsLfc2M9A3QBaPEQcGtO328hbOYw+2Qbbc8653WY28YAw3yONrsRLswZ7Pck4TYtQdQAcOMMMckbwMIuxaVPua6VhBe0BjCf8rgWa4Bf5jwVPcEgl8gGJjTGrgfAGDfgeCKnqC2SsEuj8Pmaw7W4HXiw6/iE9TLCkxoa6AHQyopOi5/5cLzCCq4M/WRLQ5Re5ug8Of1z11tox3el0UXrAgPQA6DJQYTru/R9ryTsKFBbbUNdK7vS/3qXH9PPpcE6DYH0AGjxEjA8a1Ft1sgohzSKnu853MNcRburVocl4UMaOugB0MxeYMx+BTt14fKmRtHzPYcb5+LOBfVsp9Pj0mCRhg56ALRw3QqSxPYgFDHMVaSnAVDElQpjDYAKxe7HrgyAfnSlwpoMgArF7seuDIB+dKXCmgyACsXux64MgH50pcKaDIAKxe7HrgyAfnSlwpoMgBnEduO8n0m+j+MahCUV+pHf1dQun18zyBdkA3/Lb9A9wgCYpk9nj8EfEC4tK27Q9o7XGOIjZXf2GADTAWjyQ4Sbg5qnl3yvJGwqk84AePcMkO6VSxdSxnAck4RlZQo1AN4NwF+By8qIWmHbo5Kwokx/BkDcp4A9kpQ7XRkA0wGY2nPw+yguAoVVZTd0GgAz3Qbu5VIGsr0H1wLvLTPFBmj772xJd5vbZJTXyuY3AMoqGHl7AyByA8uWbwCUVTDy9gZA5AaWLd8AKKtg5O0NgMgNLFu+AVBWwcjbGwCRG1i2fAOgrIKRtzcAIjewbPkGQFkFI29vAERuYNnyDYCZXgbZmsAzqmjtto5md7CtCTz3F1E/AGxN4DkE1A+AVvb9fFsT2MGgjgDYmsCz5oD6ARDXKcDWBE6/iC9LbOc7xLYmsK6ngHTcztYE1vc2sOyDldja24Og2BxTrtcAUBY0tnQGQGyOKddrACgLGls6AyA2x5TrNQCUBY0tnQEQm2PK9RoAyoLGls4AiM0x5XoNAGVBY0tnAMTmmHK9BsAMgqp+J1D5u37K/mMATFM02JpApe/6GQCB/8eNC7sgpPR3/QyA0ACEXRNY+rt+BkB4AEKuCSz9XT8DIDQAYU8BpdfwGQChAQj1ncD0IlDhu34GQGAAUoGV1wSqftfPAKgAAG2RQ+Rzu1nAIOuBjQjDOJYgLAcu0Oyv7Crr07VEszdQU7wQudw4y5hgOzCKcFGIPs7OaQCEVtgzvzvI+RzlThz3VWF8p6wJSXRmFJsBPI2eKazzdPIxhLUl0syl6RFJWDmXhtPbGABzVNG1uAJ4GnSMKFSG4zfS4JpCbWYJNgDmoKIbYymO54HL59C8fBPHj6TBLeUTgQFQUEU3zkImeA5hdcGmeuHCRhlhXCOhAVBQRddkJ8JdBZtphr/DIEtkA29qJDUACqjY2aF8BGFBbjPHq0j2K92P8KKMcKxbGzfGKhy/ABbn5N4vCZ/N7d8zwADwFCoNc63sv5XcmtPkLYTNHGafbKPtk76A+dDmwzLKSz55fWIMAB+VUvPHGWKSN4CFXZqcTP+djSS84JmWQuY7xqRB4pvbJ84A8FEpBWCMG3A8kRO+RRJ2eaZMZ5SPAj/zmPbTlEd5h6tkE//wze8TZwD4qDQ1/T8I3D5ruOMVVnClrOOUT8rMfMczCO/JjXdM4vi4jHIoN7ZggAHgKZhrchDh+i7h90rCDp90hcwHB9wiCXt8cheNMQA8FXOt7MJreNbwNmt8fqEFzU/t3ywNfuBZZuEwA8BTMtfkOMKFs4YPcknevblr8jHgKa9pf6qjQtcUnkM5J8wA8FSt7Dr9zHzJLvgWeXYZ3Py0DgPA040yABQ237FVGjzgWVqpME0A/tuVbsfF0uA/partYeO5AtDP5uvOAE3+hPDBWT0aYLXcxO966GGprucCQL+brw3AswifmFVlxz3SYGcpF3rYuCgA7mHW0uYn3ud8x93S4P6qh6h3CmiyC+GLXQAo9KCkaiHy+isCQMf8p3IeG/+/yx6ZrzsDtLgReLyrkI4vSSN7ohbd4QvAHMzfLg2+2itB9GaA9GXJBK93vVeGk7RZ6/PApFeCzNavDwCuxaeAAwV++fdLg7t7OVY1ANJBeL8udXyehEdFssecURx5AAB3AN8EzvMakOMBabDVKzZgkC4AYyynzcveCybgEYQDPgsmAmrgldoDAK88WVCfmK96DXB69K7JNxC+7K9GzSL7yPwwAKSLJid5Fri6Ztb6DHeXJGzxCawqRvUUcGYWmFo2/duerJmvSrni/fSd+UFmgDMQTG2c+Clkf+t+fEeS7CKx744gM8BZEKQrXNPbouv6buTVFHQSx83S4JFquiveS1AAsgvehxhkEXdUvHmyuBL6LZ5hgK39/v4jOABnZoN0+/QkO3DcVOEuWn1bu2V0vA38mPP4Vr8bf3oYlQFwFgjpXcJ6HBshe3u4NMQHFII7ny7UlOy/maYbPtI3oY9yigOyiePB+1bsoHIAFGu3VAoKGAAKIsacwgCI2T2F2g0ABRFjTmEAxOyeQu0GgIKIMacwAGJ2T6F2A0BBxJhTGAAxu6dQuwGgIGLMKf4HAR/hrhUhGSQAAAAASUVORK5CYII=")
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,18 @@
.treeTable-empty {
width: 20px;
display: inline-block;
}
.treeTable-icon {
cursor: pointer;
}
.treeTable-icon .layui-icon-triangle-d:before {
content: "\e623";
}
.treeTable-icon.open .layui-icon-triangle-d:before {
content: "\e625";
background-color: transparent;
}
@@ -0,0 +1,206 @@
layui.define(['layer', 'table'], function (exports) {
var $ = layui.jquery;
var layer = layui.layer;
var table = layui.table;
var treetable = {
// 渲染树形表格
render: function (param) {
// 检查参数
if (!treetable.checkParam(param)) {
return;
}
// 获取数据
if (param.data) {
treetable.init(param, param.data);
} else {
$.getJSON(param.url, param.where, function (res) {
treetable.init(param, res.data);
});
}
},
// 渲染表格
init: function (param, data) {
var mData = [];
var doneCallback = param.done;
var tNodes = data;
// 补上id和pid字段
for (var i = 0; i < tNodes.length; i++) {
var tt = tNodes[i];
if (!tt.id) {
if (!param.treeIdName) {
layer.msg('参数treeIdName不能为空', {icon: 5});
return;
}
tt.id = tt[param.treeIdName];
}
if (!tt.pid) {
if (!param.treePidName) {
layer.msg('参数treePidName不能为空', {icon: 5});
return;
}
tt.pid = tt[param.treePidName];
}
}
// 对数据进行排序
var sort = function (s_pid, data) {
for (var i = 0; i < data.length; i++) {
if (data[i].pid == s_pid) {
var len = mData.length;
if (len > 0 && mData[len - 1].id == s_pid) {
mData[len - 1].isParent = true;
}
mData.push(data[i]);
sort(data[i].id, data);
}
}
};
sort(param.treeSpid, tNodes);
// 重写参数
param.url = undefined;
param.data = mData;
param.page = {
count: param.data.length,
limit: param.data.length
};
param.cols[0][param.treeColIndex].templet = function (d) {
var mId = d.id;
var mPid = d.pid;
var isDir = d.isParent;
var emptyNum = treetable.getEmptyNum(mPid, mData);
var iconHtml = '';
for (var i = 0; i < emptyNum; i++) {
iconHtml += '<span class="treeTable-empty"></span>';
}
if (isDir) {
iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>';
} else {
iconHtml += '<i class="layui-icon layui-icon-file"></i>';
}
iconHtml += '&nbsp;&nbsp;';
var ttype = isDir ? 'dir' : 'file';
var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
};
param.done = function (res, curr, count) {
$(param.elem).next().addClass('treeTable');
$('.treeTable .layui-table-page').css('display', 'none');
$(param.elem).next().attr('treeLinkage', param.treeLinkage);
// 绑定事件换成对body绑定
/*$('.treeTable .treeTable-icon').click(function () {
treetable.toggleRows($(this), param.treeLinkage);
});*/
if (param.treeDefaultClose) {
treetable.foldAll(param.elem);
}
if (doneCallback) {
doneCallback(res, curr, count);
}
};
// 渲染表格
table.render(param);
},
// 计算缩进的数量
getEmptyNum: function (pid, data) {
var num = 0;
if (!pid) {
return num;
}
var tPid;
for (var i = 0; i < data.length; i++) {
if (pid == data[i].id) {
num += 1;
tPid = data[i].pid;
break;
}
}
return num + treetable.getEmptyNum(tPid, data);
},
// 展开/折叠行
toggleRows: function ($dom, linkage) {
var type = $dom.attr('lay-ttype');
if ('file' == type) {
return;
}
var mId = $dom.attr('lay-tid');
var isOpen = $dom.hasClass('open');
if (isOpen) {
$dom.removeClass('open');
} else {
$dom.addClass('open');
}
$dom.closest('tbody').find('tr').each(function () {
var $ti = $(this).find('.treeTable-icon');
var pid = $ti.attr('lay-tpid');
var ttype = $ti.attr('lay-ttype');
var tOpen = $ti.hasClass('open');
if (mId == pid) {
if (isOpen) {
$(this).hide();
if ('dir' == ttype && tOpen == isOpen) {
$ti.trigger('click');
}
} else {
$(this).show();
if (linkage && 'dir' == ttype && tOpen == isOpen) {
$ti.trigger('click');
}
}
}
});
},
// 检查参数
checkParam: function (param) {
if (!param.treeSpid && param.treeSpid != 0) {
layer.msg('参数treeSpid不能为空', {icon: 5});
return false;
}
if (!param.treeColIndex && param.treeColIndex != 0) {
layer.msg('参数treeColIndex不能为空', {icon: 5});
return false;
}
return true;
},
// 展开所有
expandAll: function (dom) {
$(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
var $ti = $(this).find('.treeTable-icon');
var ttype = $ti.attr('lay-ttype');
var tOpen = $ti.hasClass('open');
if ('dir' == ttype && !tOpen) {
$ti.trigger('click');
}
});
},
// 折叠所有
foldAll: function (dom) {
$(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
var $ti = $(this).find('.treeTable-icon');
var ttype = $ti.attr('lay-ttype');
var tOpen = $ti.hasClass('open');
if ('dir' == ttype && tOpen) {
$ti.trigger('click');
}
});
}
};
layui.link(layui.cache.base + 'treetable-lay/treetable.css');
// 给图标列绑定事件
$('body').on('click', '.treeTable .treeTable-icon', function () {
var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage');
if ('true' == treeLinkage) {
treetable.toggleRows($(this), true);
} else {
treetable.toggleRows($(this), false);
}
});
exports('treetable', treetable);
});

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