Showing preview only (943K chars total). Download the full file or copy to clipboard to get everything.
Repository: lastwhispers/permission
Branch: master
Commit: f60271b4a713
Files: 292
Total size: 840.9 KB
Directory structure:
gitextract_5zy55ld6/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── docker/
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── mysql/
│ │ ├── conf/
│ │ │ └── my.cnf
│ │ └── init/
│ │ └── init.sql
│ └── redis/
│ └── Dockerfile
├── permission.iml
├── pom.xml
├── resource/
│ ├── shell/
│ │ ├── delmysqldump.sh
│ │ ├── mysqldump.sh
│ │ ├── permission.sh
│ │ └── 使用crontab.md
│ └── sql/
│ └── permission.sql
└── src/
├── main/
│ ├── java/
│ │ └── cn/
│ │ └── lastwhisper/
│ │ ├── core/
│ │ │ ├── annotation/
│ │ │ │ └── LogAnno.java
│ │ │ ├── aop/
│ │ │ │ └── LogAopAspect.java
│ │ │ ├── shiro/
│ │ │ │ └── Realm.java
│ │ │ ├── task/
│ │ │ │ └── GoBackTask.java
│ │ │ └── util/
│ │ │ └── UserUtils.java
│ │ └── modular/
│ │ ├── controller/
│ │ │ ├── LogController.java
│ │ │ ├── MenuController.java
│ │ │ ├── RoleController.java
│ │ │ └── UserController.java
│ │ ├── mapper/
│ │ │ ├── LogMapper.java
│ │ │ ├── LogMapper.xml
│ │ │ ├── MenuMapper.java
│ │ │ ├── MenuMapper.xml
│ │ │ ├── RoleMapper.java
│ │ │ ├── RoleMapper.xml
│ │ │ ├── UserMapper.java
│ │ │ └── UserMapper.xml
│ │ ├── pojo/
│ │ │ ├── Log.java
│ │ │ ├── Menu.java
│ │ │ ├── Role.java
│ │ │ └── User.java
│ │ ├── service/
│ │ │ ├── LogService.java
│ │ │ ├── MenuService.java
│ │ │ ├── RoleService.java
│ │ │ ├── UserService.java
│ │ │ └── impl/
│ │ │ ├── LogServiceImpl.java
│ │ │ ├── MenuServiceImpl.java
│ │ │ ├── RoleServiceImpl.java
│ │ │ └── UserServiceImpl.java
│ │ └── vo/
│ │ ├── EasyUIDataGridResult.java
│ │ ├── EasyUIOptionalTreeNode.java
│ │ ├── GlobalResult.java
│ │ └── Tree.java
│ ├── resources/
│ │ ├── applicationContext.xml
│ │ ├── applicationContext_jedis.xml
│ │ ├── applicationContext_shiro.xml
│ │ ├── db-local.properties
│ │ ├── db.properties
│ │ ├── log4j.properties
│ │ ├── reset.sql
│ │ ├── springmvc.xml
│ │ └── sqlMapConfig.xml
│ └── webapp/
│ ├── WEB-INF/
│ │ └── web.xml
│ ├── adminjs/
│ │ ├── index.js
│ │ └── themes/
│ │ ├── default/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── gray/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ └── icon.css
│ ├── casual.html
│ ├── css/
│ │ ├── default.css
│ │ ├── login.css
│ │ └── table.css
│ ├── dept.html
│ ├── emp.html
│ ├── error.html
│ ├── index.html
│ ├── js/
│ │ ├── config.js
│ │ ├── crud.js
│ │ ├── download.js
│ │ ├── menu.js
│ │ ├── roleMenuSet.js
│ │ ├── search.js
│ │ └── userRoleSet.js
│ ├── log.html
│ ├── login.html
│ ├── menu.html
│ ├── role.html
│ ├── roleMenuSet.html
│ ├── sale.html
│ ├── ui/
│ │ ├── date.js
│ │ ├── download.js
│ │ ├── easyloader.js
│ │ ├── locale/
│ │ │ ├── easyui-lang-af.js
│ │ │ ├── easyui-lang-ar.js
│ │ │ ├── easyui-lang-bg.js
│ │ │ ├── easyui-lang-ca.js
│ │ │ ├── easyui-lang-cs.js
│ │ │ ├── easyui-lang-cz.js
│ │ │ ├── easyui-lang-da.js
│ │ │ ├── easyui-lang-de.js
│ │ │ ├── easyui-lang-el.js
│ │ │ ├── easyui-lang-en.js
│ │ │ ├── easyui-lang-es.js
│ │ │ ├── easyui-lang-fr.js
│ │ │ ├── easyui-lang-it.js
│ │ │ ├── easyui-lang-jp.js
│ │ │ ├── easyui-lang-nl.js
│ │ │ ├── easyui-lang-pl.js
│ │ │ ├── easyui-lang-pt_BR.js
│ │ │ ├── easyui-lang-ru.js
│ │ │ ├── easyui-lang-sv_SE.js
│ │ │ ├── easyui-lang-tr.js
│ │ │ ├── easyui-lang-zh_CN.js
│ │ │ └── easyui-lang-zh_TW.js
│ │ └── themes/
│ │ ├── black/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tooltip.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── bootstrap/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tooltip.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── default/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tooltip.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── gray/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tooltip.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── icon.css
│ │ └── metro/
│ │ ├── accordion.css
│ │ ├── calendar.css
│ │ ├── combo.css
│ │ ├── combobox.css
│ │ ├── datagrid.css
│ │ ├── datebox.css
│ │ ├── dialog.css
│ │ ├── easyui.css
│ │ ├── layout.css
│ │ ├── linkbutton.css
│ │ ├── menu.css
│ │ ├── menubutton.css
│ │ ├── messager.css
│ │ ├── pagination.css
│ │ ├── panel.css
│ │ ├── progressbar.css
│ │ ├── propertygrid.css
│ │ ├── searchbox.css
│ │ ├── slider.css
│ │ ├── spinner.css
│ │ ├── splitbutton.css
│ │ ├── tabs.css
│ │ ├── tooltip.css
│ │ ├── tree.css
│ │ ├── validatebox.css
│ │ └── window.css
│ ├── user.html
│ └── userRoleSet.html
└── test/
└── java/
└── cn/
└── lastwhisper/
├── GoBackTest.java
└── MD5.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
*.js linguist-language=java
*.css linguist-language=java
*.html linguist-language=java
*.jsp linguist-language=java
================================================
FILE: .gitignore
================================================
/target/
.idea
================================================
FILE: LICENSE
================================================
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.
================================================
FILE: README.md
================================================
>该项目源码地址:https://github.com/lastwhispers/permission
项目在线地址:http://39.105.49.50:8080/permission/login.html
初始用户:
系统管理员:admin/admin
经理:manager/manager
销售主管:salemanager/salemanager
销售员:saler/saler
临时工:casual/casual
# 1. 简介
基于SSM框架简单的后台管理系统,整合spring + springmvc + shiro + mybatis + esayui。包含许多基础模块(用户管理、角色管理、菜单管理、角色权限管理、用户角色管理、日志管理、数据库监控)。
# 2. 项目演示
## 2.1 登录
使用md5加密,shiro权限校验

## 2.2 用户管理
**(1)ajax异步模糊搜索**


**(2)新增**


**(3)修改**
点击修改

填写修改的信息

**(4)删除**
选中一行,即可删除


**(5)导出excel**
支持excel导出


**(6)excel导入**
支持excel导入,并更新导入信息。
修改excel已存在的数据,并新增一行。

将修改的excel导入系统



## 2.3 角色管理
与用户管理类似。

## 2.4 菜单管理
菜单管理对应系统左侧的菜单,不同权限用户看到不同的菜单。

并且支持菜单的添加修改删除,以及菜单详细内容的修改。


## 2.5 角色权限管理
通过角色控制用户可以看到的菜单。

## 2.6 用户角色管理
在该页面给用户设置角色,可以是多个角色。



刷新页面,新增的角色生效。

## 2.7 日志管理
使用aop日志,记录用户的操作。刚才的操作日志,都被记录了下来。

## 2.8 数据库监控
集成druid的监控页面。

# 3. 系统权限设计思路
1) 每个用户登陆进去看到的菜单应该取决于他们所拥有的权限,对于不同的用户,他们进入系统后看到的菜单可能是不同的。
2) 如果对每个用户都去设置权限,操作起来是非常繁琐的。实际中很多用户的权限是一样的。我们把这多个权限合起来,给它一个名称叫角色(有的系统称为“用户组”)。这样我们通过角色设置权限,即一个角色可以有多个权限(菜单项),一个权限也可以被多个角色同时拥有。在这种情况下,角色和权限之间就是典型的多对多关联
3) 每个角色包含了很多权限(菜单),那么用户指定为某种角色,即拥有该角色的权限。实际中一个用户可能同时拥有多种角色,而一个角色又包含了很多个用户。那么用户与角色之间又是典型的多对多关系。
4) 一个标准的权限系统包括哪些表呢?刚才我们提到了用户、角色、权限,这就是三张表。用户与角色的关系是多对多,对于多对多关系,我们通常会使用中间表来存储它们的关系。那么对应的角色与权限的关系,也会有中间表。因此,权限系统涉及的表就有5个了。

通过用户对应的角色加载角色对应的菜单。
集成shiro做后端url级别鉴权、方法级别鉴权,甚至方法内的鉴权。由于shiro鉴权每次都要查询数据库,所以使用redis缓存菜单信息。
# 4. 日志系统设计思路
使用aop环绕通知记录方法的操作。
参考:https://www.jianshu.com/p/59ca84fadbaf
# 5. 如何运行项目
## 5.1 本地运行
找到resource目录里面有redis和sql文件
**第一步:启动redis和mysql**
**第二步:导入resource/sql/permission.sql文件,不是classpath下面的reset.sql**
**第三步:导入项目,修改db.properties中的数据库账号密码**
**第四步:启动maven项目**
## 5.2 Dockerfile
提前打好war,或者重写Dockerfile命令构建war
```shell script
# 构建镜像
docker build -t gj/permission .
# 运行
docker run -d -p 8081:8080 gj/permission
```
## 5.3 docker-compose
提前打好war
```shell script
# war、dockerfile、docker-compose在同一目录
docker-compose up -d
# 查看镜像
docker-compose ps
# 移除镜像
docker-compose down
```
## 5.4 其他
弹窗在adminjs/index.js的start()方法,可以修改或者关闭
js/crud.js封装了所有的crud前端的代码
================================================
FILE: docker/Dockerfile
================================================
FROM hub.c.163.com/library/tomcat
MAINTAINER lastwhisper lastwhisper@yeah.net
# copy war到container的tomcat中
COPY permission.war /usr/local/tomcat/webapps
================================================
FILE: docker/docker-compose.yml
================================================
version: "3"
services:
permission:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
links:
- redis
- mysql
redis:
image: hub.c.163.com/library/redis:latest
ports:
- "63790:6379"
networks:
- my-bridge
mysql:
image: hub.c.163.com/library/mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 391054950.gg
ports:
- "33060:3306"
volumes:
- /root/mysql/db:/var/lib/mysql
- /root/mysql/conf/my.cnf:/etc/my.cnf
- /root/mysql/init:/docker-entrypoint-initdb.d/
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
================================================
FILE: docker/mysql/conf/my.cnf
================================================
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
================================================
FILE: docker/mysql/init/init.sql
================================================
/*
Navicat Premium Data Transfer
Source Server : 本地数据库-mysql5.7
Source Server Type : MySQL
Source Server Version : 50724
Source Host : localhost:3306
Source Schema : permission
Target Server Type : MySQL
Target Server Version : 50724
File Encoding : 65001
Date: 03/05/2019 13:10:50
*/
create database permission;
use permission;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for log
-- ----------------------------
DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`operateor` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`operateType` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`operateDate` datetime(0) NULL DEFAULT NULL,
`operateResult` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 51 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for menu
-- ----------------------------
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
`menuid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '编号',
`menuname` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '对应URL',
`icon` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标样式',
`pid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上一级菜单编号',
`is_parent` tinyint(1) NULL DEFAULT NULL COMMENT '该菜单是否为父菜单,1为true,0为false',
PRIMARY KEY (`menuid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of menu
-- ----------------------------
INSERT INTO `menu` VALUES ('0', '系统菜单', '-', 'icon-sys', '-1', 1);
INSERT INTO `menu` VALUES ('100', '系统管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('101', '用户管理', 'user.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('102', '角色管理', 'role.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('103', '菜单管理', 'menu.html', 'icon-log', '100', 1);
INSERT INTO `menu` VALUES ('104', '角色权限管理', 'roleMenuSet.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('105', '用户角色管理', 'userRoleSet.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('106', '日志管理', 'log.html', 'icon-log', '100', 1);
INSERT INTO `menu` VALUES ('107', '数据库监控', 'druid/index.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('200', '人事管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('201', '部门', 'dept.html', 'icon-log', '200', 0);
INSERT INTO `menu` VALUES ('202', '员工', 'emp.html', 'icon-log', '200', 0);
INSERT INTO `menu` VALUES ('300', '销售管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('301', '销售额统计', 'sale.html', 'icon-log', '300', 0);
INSERT INTO `menu` VALUES ('400', '临时工管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('401', '临时工计件', 'casual.html', 'icon-log', '400', 0);
-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`uuid` int(10) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
PRIMARY KEY (`uuid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES (1, '系统管理员');
INSERT INTO `role` VALUES (2, '经理');
INSERT INTO `role` VALUES (3, '销售主管');
INSERT INTO `role` VALUES (4, '销售员');
INSERT INTO `role` VALUES (5, '临时工');
-- ----------------------------
-- Table structure for role_menu
-- ----------------------------
DROP TABLE IF EXISTS `role_menu`;
CREATE TABLE `role_menu` (
`menuuuid` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单ID',
`roleuuid` int(10) NULL DEFAULT NULL COMMENT '菜单ID'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色菜单中间表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of role_menu
-- ----------------------------
INSERT INTO `role_menu` VALUES ('100', 1);
INSERT INTO `role_menu` VALUES ('101', 1);
INSERT INTO `role_menu` VALUES ('102', 1);
INSERT INTO `role_menu` VALUES ('103', 1);
INSERT INTO `role_menu` VALUES ('104', 1);
INSERT INTO `role_menu` VALUES ('105', 1);
INSERT INTO `role_menu` VALUES ('106', 1);
INSERT INTO `role_menu` VALUES ('107', 1);
INSERT INTO `role_menu` VALUES ('200', 2);
INSERT INTO `role_menu` VALUES ('201', 2);
INSERT INTO `role_menu` VALUES ('202', 2);
INSERT INTO `role_menu` VALUES ('300', 3);
INSERT INTO `role_menu` VALUES ('301', 3);
INSERT INTO `role_menu` VALUES ('300', 4);
INSERT INTO `role_menu` VALUES ('301', 4);
INSERT INTO `role_menu` VALUES ('400', 5);
INSERT INTO `role_menu` VALUES ('401', 5);
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登陆名',
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`user_pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户密码',
`user_birthday` date NULL DEFAULT NULL COMMENT '出生日期',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 269 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (221, 'admin', '我是系统管理员', '3ef7164d1f6167cb9f2658c07d3c2f0a', '2019-04-04');
INSERT INTO `user` VALUES (262, 'manager', '我是经理', 'bb2ec153e560c6cb94a35b370eb7a07b', '2019-05-02');
INSERT INTO `user` VALUES (263, 'salemanager', '我是销售主管', '40fd0e9ba2e7241cb04c49a7663464c1', '2019-05-06');
INSERT INTO `user` VALUES (264, 'saler', '我是销售员', '846366204c8cc44abdedf5f201da0b00', '2019-05-20');
INSERT INTO `user` VALUES (265, 'casual', '我是临时工', '130131080b677e15df326f8114c426a3', '2019-05-04');
-- ----------------------------
-- Table structure for user_role
-- ----------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`userid` int(11) NULL DEFAULT NULL COMMENT '员工编号',
`roleuuid` int(11) NULL DEFAULT NULL COMMENT '角色编号'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户角色中间表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES (265, 5);
INSERT INTO `user_role` VALUES (264, 4);
INSERT INTO `user_role` VALUES (263, 3);
INSERT INTO `user_role` VALUES (262, 2);
INSERT INTO `user_role` VALUES (221, 1);
INSERT INTO `user_role` VALUES (221, 5);
SET FOREIGN_KEY_CHECKS = 1;
================================================
FILE: docker/redis/Dockerfile
================================================
FROM hub.c.163.com/library/redis:latest
MAINTAINER lastwhisper gaojun56@163.com
# 安装ping、ip等
================================================
FILE: permission.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<descriptors>
<deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" />
</descriptors>
<webroots>
<root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
</webroots>
<sourceRoots>
<root url="file://$MODULE_DIR$/src/main/java" />
<root url="file://$MODULE_DIR$/src/main/resources" />
</sourceRoots>
</configuration>
</facet>
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:4.3.18.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:4.3.18.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:4.3.18.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:4.3.18.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:4.3.18.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:4.3.18.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:4.3.18.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:4.3.18.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:4.3.18.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.10" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.10" level="project" />
<orderEntry type="library" name="Maven: org.aspectj:aspectjrt:1.8.0" level="project" />
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.8.0" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.3.0" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.1.26" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid:1.0.20" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.2.3" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:4.1.4" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:0.9.5" level="project" />
<orderEntry type="library" name="Maven: javax.servlet:jstl:1.2" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.58" level="project" />
<orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.2" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.4" level="project" />
<orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.21" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.9" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:jsp-api:2.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:servlet-api:2.5" level="project" />
<orderEntry type="library" name="Maven: redis.clients:jedis:2.7.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-aspectj:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi:3.15" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.10" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
</component>
</module>
================================================
FILE: pom.xml
================================================
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.lastwhisper</groupId>
<artifactId>permission</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Spring版本号 -->
<spring.version>4.3.18.RELEASE</spring.version>
<jackson.version>2.9.10.1</jackson.version>
</properties>
<dependencies>
<!-- Spring相关包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- AOP相关包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.0</version>
</dependency>
<!-- MyBatis相关包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!-- MySQL相关包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>
<!-- Spring集成MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<!-- PageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.4</version>
</dependency>
<!-- JSP标准标签库 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<!-- -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<!-- 日志相关包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<!-- 单元测试相关包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-aspectj</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.sql</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.sql</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<!-- 添加添加jdk1.8插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/permission</path>
</configuration>
</plugin>
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-war-plugin</artifactId>-->
<!-- <version>2.6</version>-->
<!-- <configuration>-->
<!-- <failOnMissingWebXml>false</failOnMissingWebXml>-->
<!-- </configuration>-->
<!-- </plugin>-->
<!-- 配置打包时跳过测试 ,首次配置使用的时候会自动联网进行下载 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M4</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
================================================
FILE: resource/shell/delmysqldump.sh
================================================
#! /bin/bash
find /root/backformysql/ -mtime +7 -name "*.sql" -exec rm -rf {} \;
================================================
FILE: resource/shell/mysqldump.sh
================================================
#! /bin/bash
echo "mysqldump start ..."
mysqldump -uroot -proot -P 3306 permission > /root/backformysql/DB_permission_`date +%Y_%m_%d_%H_%M_%s`.sql
#导出数据库结构mysqldump -uroot -d 数据库名> test.sql
#导出表结构mysqldump -uroot -d 数据库名 表名> test.sql
echo "mysqldump success ok !"
================================================
FILE: resource/shell/permission.sh
================================================
#!/bin/bash
# 还原数据库
mysql -uroot -proot -P 3306 < reset.sql
# 清空redis
cd /usr/local/redis-5/bin/
db=0
#可以用第一个参数指定需求清除的库
if [ -n "$1" ];then
db=$1
fi
./redis-cli -h 127.0.0.1 -p 6379 -a root <<END
select ${db}
flushdb
END
================================================
FILE: resource/shell/使用crontab.md
================================================
# crontab -e写入如下内容
```shell script
0 */12 * * * /root/mysqldump.sh # 每隔12个小时备份一次数据库
0 */2 * * * /root/permission.sh # 每隔两个小时还原一次数据库和redis
```
# crontab的几个服务命令
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
================================================
FILE: resource/sql/permission.sql
================================================
/*
Navicat Premium Data Transfer
Source Server : 本地数据库-mysql5.7
Source Server Type : MySQL
Source Server Version : 50724
Source Host : localhost:3306
Source Schema : permission
Target Server Type : MySQL
Target Server Version : 50724
File Encoding : 65001
Date: 03/05/2019 13:10:50
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for log
-- ----------------------------
DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`operateor` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`operateType` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`operateDate` datetime(0) NULL DEFAULT NULL,
`operateResult` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 51 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for menu
-- ----------------------------
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
`menuid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '编号',
`menuname` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '对应URL',
`icon` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标样式',
`pid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上一级菜单编号',
`is_parent` tinyint(1) NULL DEFAULT NULL COMMENT '该菜单是否为父菜单,1为true,0为false',
PRIMARY KEY (`menuid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of menu
-- ----------------------------
INSERT INTO `menu` VALUES ('0', '系统菜单', '-', 'icon-sys', '-1', 1);
INSERT INTO `menu` VALUES ('100', '系统管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('101', '用户管理', 'user.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('102', '角色管理', 'role.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('103', '菜单管理', 'menu.html', 'icon-log', '100', 1);
INSERT INTO `menu` VALUES ('104', '角色权限管理', 'roleMenuSet.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('105', '用户角色管理', 'userRoleSet.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('106', '日志管理', 'log.html', 'icon-log', '100', 1);
INSERT INTO `menu` VALUES ('107', '数据库监控', 'druid/index.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('200', '人事管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('201', '部门', 'dept.html', 'icon-log', '200', 0);
INSERT INTO `menu` VALUES ('202', '员工', 'emp.html', 'icon-log', '200', 0);
INSERT INTO `menu` VALUES ('300', '销售管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('301', '销售额统计', 'sale.html', 'icon-log', '300', 0);
INSERT INTO `menu` VALUES ('400', '临时工管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('401', '临时工计件', 'casual.html', 'icon-log', '400', 0);
-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`uuid` int(10) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
PRIMARY KEY (`uuid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES (1, '系统管理员');
INSERT INTO `role` VALUES (2, '经理');
INSERT INTO `role` VALUES (3, '销售主管');
INSERT INTO `role` VALUES (4, '销售员');
INSERT INTO `role` VALUES (5, '临时工');
-- ----------------------------
-- Table structure for role_menu
-- ----------------------------
DROP TABLE IF EXISTS `role_menu`;
CREATE TABLE `role_menu` (
`menuuuid` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单ID',
`roleuuid` int(10) NULL DEFAULT NULL COMMENT '菜单ID'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色菜单中间表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of role_menu
-- ----------------------------
INSERT INTO `role_menu` VALUES ('100', 1);
INSERT INTO `role_menu` VALUES ('101', 1);
INSERT INTO `role_menu` VALUES ('102', 1);
INSERT INTO `role_menu` VALUES ('103', 1);
INSERT INTO `role_menu` VALUES ('104', 1);
INSERT INTO `role_menu` VALUES ('105', 1);
INSERT INTO `role_menu` VALUES ('106', 1);
INSERT INTO `role_menu` VALUES ('107', 1);
INSERT INTO `role_menu` VALUES ('200', 2);
INSERT INTO `role_menu` VALUES ('201', 2);
INSERT INTO `role_menu` VALUES ('202', 2);
INSERT INTO `role_menu` VALUES ('300', 3);
INSERT INTO `role_menu` VALUES ('301', 3);
INSERT INTO `role_menu` VALUES ('300', 4);
INSERT INTO `role_menu` VALUES ('301', 4);
INSERT INTO `role_menu` VALUES ('400', 5);
INSERT INTO `role_menu` VALUES ('401', 5);
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登陆名',
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`user_pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户密码',
`user_birthday` date NULL DEFAULT NULL COMMENT '出生日期',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 269 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (221, 'admin', '我是系统管理员', '3ef7164d1f6167cb9f2658c07d3c2f0a', '2019-04-04');
INSERT INTO `user` VALUES (262, 'manager', '我是经理', 'bb2ec153e560c6cb94a35b370eb7a07b', '2019-05-02');
INSERT INTO `user` VALUES (263, 'salemanager', '我是销售主管', '40fd0e9ba2e7241cb04c49a7663464c1', '2019-05-06');
INSERT INTO `user` VALUES (264, 'saler', '我是销售员', '846366204c8cc44abdedf5f201da0b00', '2019-05-20');
INSERT INTO `user` VALUES (265, 'casual', '我是临时工', '130131080b677e15df326f8114c426a3', '2019-05-04');
-- ----------------------------
-- Table structure for user_role
-- ----------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`userid` int(11) NULL DEFAULT NULL COMMENT '员工编号',
`roleuuid` int(11) NULL DEFAULT NULL COMMENT '角色编号'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户角色中间表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES (265, 5);
INSERT INTO `user_role` VALUES (264, 4);
INSERT INTO `user_role` VALUES (263, 3);
INSERT INTO `user_role` VALUES (262, 2);
INSERT INTO `user_role` VALUES (221, 1);
INSERT INTO `user_role` VALUES (221, 5);
SET FOREIGN_KEY_CHECKS = 1;
================================================
FILE: src/main/java/cn/lastwhisper/core/annotation/LogAnno.java
================================================
package cn.lastwhisper.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 日志注解
*
* @author lastwhisper
*
*/
@Target(ElementType.METHOD) // 方法注解
@Retention(RetentionPolicy.RUNTIME) // 运行时可见
public @interface LogAnno {
String operateType();// 记录日志的操作类型
}
================================================
FILE: src/main/java/cn/lastwhisper/core/aop/LogAopAspect.java
================================================
package cn.lastwhisper.core.aop;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.Date;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import cn.lastwhisper.core.annotation.LogAnno;
import cn.lastwhisper.core.util.UserUtils;
import cn.lastwhisper.modular.pojo.Log;
import cn.lastwhisper.modular.pojo.User;
import cn.lastwhisper.modular.service.LogService;
/**
* AOP实现日志
*
* @author 最后的轻语_dd43
*
*/
@Order(3)
@Component
@Aspect
public class LogAopAspect {
// 日志Service
@Autowired
private LogService logService;
/**
* 环绕通知记录日志通过注解匹配到需要增加日志功能的方法
*
* @param pjp
* @return
* @throws Throwable
*/
@Around("@annotation(cn.lastwhisper.core.annotation.LogAnno)")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
// 1.方法执行前的处理,相当于前置通知
// 获取方法签名
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
// 获取方法
Method method = methodSignature.getMethod();
// 获取方法上面的注解
LogAnno logAnno = method.getAnnotation(LogAnno.class);
// 获取操作描述的属性值
String operateType = logAnno.operateType();
// 创建一个日志对象(准备记录日志)
Log log = new Log();
log.setOperatetype(operateType);// 操作说明
// 当前登录的用户
User user = UserUtils.getSubjectUser();
// 设置操作人账号
log.setOperateor(user.getUser_code());
String ip = UserUtils.getIpAddress();
log.setIp(ip);
Object result = null;
try {
// 让代理方法执行
result = pjp.proceed();
// 2.相当于后置通知(方法成功执行之后走这里)
log.setOperateresult("正常");// 设置操作结果
} catch (SQLException e) {
// 3.相当于异常通知部分
log.setOperateresult("异常");// 设置操作结果
} finally {
// 4.相当于最终通知
log.setOperatedate(new Date());// 设置操作日期
logService.addLog(log);// 添加日志记录
}
return result;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/core/shiro/Realm.java
================================================
package cn.lastwhisper.core.shiro;
import java.util.List;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import cn.lastwhisper.modular.pojo.Menu;
import cn.lastwhisper.modular.pojo.User;
import cn.lastwhisper.modular.service.MenuService;
import cn.lastwhisper.modular.service.UserService;
public class Realm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Autowired
private MenuService menusService;
/**
* 授权方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println("授权中......");
//获取当前登录的用户
User user = (User)principals.getPrimaryPrincipal();
//获取用户的所有菜单
List<Menu> menus = menusService.findMenuListByUserid(user.getUser_id());
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
for (Menu menu : menus) {
info.addStringPermission(menu.getMenuname());
}
return info;
}
/**
* 认证方法
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
System.out.println("认证中......");
UsernamePasswordToken upt = (UsernamePasswordToken)token;
String pwd = new String(upt.getPassword());
// // 根据用户名和密码查找用户
User user = userService.findUserByCodeAndPwd(upt.getUsername(), pwd);
if(user != null) {
//返回认证信息
//参数1:主角,就是登陆的用户
//参数2:证书,就是凭证,对应密码
//参数3:当前realm的名称
return new SimpleAuthenticationInfo(user, pwd, getName());
}
return null;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/core/task/GoBackTask.java
================================================
package cn.lastwhisper.core.task;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
/**
*
* @author lastwhisper
* @date 2020/2/16
*/
@Component
public class GoBackTask implements ApplicationContextAware {
private static Logger logger = LoggerFactory.getLogger(GoBackTask.class);
private static ApplicationContext applicationContext;
@Autowired
private JedisPool jedisPool;
/**
* CronTrigger配置完整格式为: [秒][分][小时][日][月][周][年]
* (cron = "0/2 * * * * ?") //每两秒
*
* 每3小时重置mysql和redis
*
*/
@Scheduled(cron = "0 0 0/3 * * ?")
public void goBack() {
// 清空缓存
flushRedis();
// 重置mysql
resetDb();
}
private void flushRedis() {
try (Jedis jedis = jedisPool.getResource()) {
jedis.flushAll();
} catch (Exception ignored) {
}
}
private void resetDb() {
logger.info("数据库重置开始");
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) applicationContext.getBean("sqlSessionFactory");
SqlSession sqlSession = sqlSessionFactory.openSession();
Connection conn = sqlSession.getConnection();
ScriptRunner runner = new ScriptRunner(conn);
Resources.setCharset(StandardCharsets.UTF_8); //设置字符集,不然中文乱码插入错误
runner.setLogWriter(null);//设置是否输出日志
// 绝对路径读取
// 从class目录下直接读取
Reader read;
try {
read = Resources.getResourceAsReader("reset.sql");
runner.runScript(read);
} catch (IOException e) {
e.printStackTrace();
} finally {
runner.closeConnection();
}
logger.info("数据库重置完毕");
}
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
applicationContext = context;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/core/util/UserUtils.java
================================================
/**
* @Title: RoleService.java
* @Package cn.lastwhisper.service
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午2:45:32
* @version V1.0
*/
package cn.lastwhisper.core.util;
import javax.servlet.http.HttpServletRequest;
import org.apache.shiro.SecurityUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import cn.lastwhisper.modular.pojo.User;
/**
*
* @ClassName: UserUtils
* @Description:获取当前登录的用户
* @author: 最后的轻语_dd43
* @date: 2019年4月5日
*/
public class UserUtils {
/**
*
* @Title: getSubjectUser
* @Description: 获取shiro中登录的用户
* @return
*/
public static User getSubjectUser() {
User user = (User) SecurityUtils.getSubject().getPrincipal();
return user;
}
/**
*
* @Title: removeSubjectUser
* @Description: 从shiro中移除登录的用户
* @author: 最后的轻语_dd43
*/
public static void removeSubjectUser() {
SecurityUtils.getSubject().logout();
}
/**
*
* @Title: getRequest
* @Description: 获取当前的request
* @author: 最后的轻语_dd43
* @return
*/
public static HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
}
/**
* 获取IP地址的方法
*
* @return
*/
public static String getIpAddress() {
HttpServletRequest request = getRequest();
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/**
*
* @Title: getSessionUser
* @Description: 获取session中登录的用户(开启shiro后失效)
* @return
*/
@Deprecated
public static User getSessionUser() {
return (User)getRequest().getSession().getAttribute("user");
}
/**
*
* @Title: setSessionUser
* @Description: 将当前登录的用户信息放入session(开启shiro后失效)
* @param user
*/
@Deprecated
public static void setSessionUser(User user) {
getRequest().getSession().setAttribute("user", user);
}
/**
*
* @Title: removeSessionUser
* @Description: 从session中移除user(开启shiro后失效)
* @author: 最后的轻语_dd43
*/
@Deprecated
public static void removeSessionUser() {
getRequest().getSession().removeAttribute("user");;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/controller/LogController.java
================================================
/**
* @Title: RoleController.java
* @Package cn.lastwhisper.controller
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午3:00:04
* @version V1.0
*/
package cn.lastwhisper.modular.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.lastwhisper.modular.vo.EasyUIDataGridResult;
import cn.lastwhisper.modular.pojo.Log;
import cn.lastwhisper.modular.service.LogService;
/**
*
* @ClassName: LogController
* @Description: 日志
* @author: 最后的轻语_dd43
* @date: 2019年5月1日
*/
@Controller
public class LogController {
@Autowired
private LogService logService;
/**
*
* @Title: rolelistByPage
* @Description: 返回分页日志
* @author: 最后的轻语_dd43
* @param log
* @param page
* @param rows
* @return
*/
@RequestMapping("/log/loglistByPage")
@ResponseBody
public EasyUIDataGridResult rolelistByPage(Log log,
@RequestParam(value = "page", required = true, defaultValue = "1") Integer page,
@RequestParam(value = "rows", required = true, defaultValue = "10") Integer rows) {
EasyUIDataGridResult result = logService.findLoglistByPage(page, rows, log);
return result;
}
/**
*
* @Title: searchLogOperateor
* @Description: 模糊查询用户名
* @author: 最后的轻语_dd43
* @param q
* @return
*/
@RequestMapping(value = "/log/searchLogOperateor", method = RequestMethod.POST)
@ResponseBody
public List<Log> searchLogOperateor(String q) {
List<Log> operateor = logService.findLogOperateor(q);
return operateor;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/controller/MenuController.java
================================================
/**
* @Title: MenuController.java
* @Package cn.lastwhisper.controller
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午5:05:32
* @version V1.0
*/
package cn.lastwhisper.modular.controller;
import java.util.List;
import cn.lastwhisper.core.annotation.LogAnno;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.lastwhisper.modular.vo.GlobalResult;
import cn.lastwhisper.modular.vo.Tree;
import cn.lastwhisper.core.util.UserUtils;
import cn.lastwhisper.modular.pojo.Menu;
import cn.lastwhisper.modular.pojo.User;
import cn.lastwhisper.modular.service.MenuService;
/**
* @ClassName: MenuController
* @Description:菜单管理
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
@Controller
public class MenuController {
@Autowired
private MenuService menuService;
/**
* 查找所有
* @author Zoe
* @date 2019年2月15日下午3:46:48
* @return
*/
@RequestMapping(value="/menu/menulist")
@ResponseBody
public List<Tree> findAll() {
return menuService.findMenuList();
}
/**
* 根据菜单id查找菜单,显示菜单详情
* @author Zoe
* @date 2019年2月15日下午8:15:02
* @param menuid 主键
* @return
*/
@RequestMapping("/menu/menufindById")
@ResponseBody
public List<Menu> findById(String menuid) {
return menuService.findMenuById(menuid);
}
/**
* 添加数据
* @author Zoe
* @date 2019年2月15日下午9:47:56
* @param menu 菜单对象
* @return
*/
@LogAnno(operateType = "添加权限菜单")
@RequestMapping(value="/menu/menuadd")
@ResponseBody
public GlobalResult insert(Menu menu) {
return menuService.addMenu(menu);
}
/**
* 根据id删除数据[修改状态]
* @author Zoe
* @date 2019年2月15日下午9:47:41
* @param menuid 主键
* @return
*/
@LogAnno(operateType = "修改权限菜单")
@RequestMapping(value="/menu/menudelete")
@ResponseBody
public GlobalResult deleteById(String menuid) {
return menuService.deleteMenuById(menuid);
}
/**
* 根据id修改数据
* @author Zoe
* @date 2019年2月15日下午9:48:22
* @param menu 菜单对象
* @return
*/
@LogAnno(operateType = "更新权限菜单")
@RequestMapping(value="/menu/menuupdate")
@ResponseBody
public GlobalResult updateById(Menu menu) {
return menuService.updateMenuById(menu);
}
/**
*
* @Title: loadMenu
* @Description: 根据session中的user_id加载菜单
* @return Menu
* @author 最后的轻语_dd43
* @date 2019年2月16日下午9:18:20
*/
@RequestMapping(value="/menu/loadMenus")
@ResponseBody
public Menu loadMenus() {
User user = UserUtils.getSubjectUser();
Menu menus = null;
if(user!=null) {
menus = menuService.findMenuByUserid(user.getUser_id());
}
return menus;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/controller/RoleController.java
================================================
package cn.lastwhisper.modular.controller;
import java.util.List;
import cn.lastwhisper.core.annotation.LogAnno;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.lastwhisper.modular.vo.EasyUIDataGridResult;
import cn.lastwhisper.modular.vo.EasyUIOptionalTreeNode;
import cn.lastwhisper.modular.vo.GlobalResult;
import cn.lastwhisper.modular.pojo.Role;
import cn.lastwhisper.modular.service.RoleService;
/**
* @ClassName: RoleController
* @Description:接收角色相关请求
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
@Controller
public class RoleController {
@Autowired
private RoleService roleService;
/**
*
* @Title: findRoleByEnble
* @Description: 查询角色列表
* @param page
* @param rows
* @return EasyUIDataGridResult
* @author 最后的轻语_dd43
* @date 2019年2月14日下午6:48:36
*/
@RequestMapping("/role/rolelistByPage")
@ResponseBody
public EasyUIDataGridResult rolelistByPage(Role role,
@RequestParam(value = "page", required = true, defaultValue = "1") Integer page,
@RequestParam(value = "rows", required = true, defaultValue = "10") Integer rows) {
EasyUIDataGridResult result = roleService.findRolelistByPage(page, rows, role);
return result;
}
/**
*
* @Title: searchRoleName
* @Description: 角色名自动补全
* @param q
* @return
*/
@RequestMapping(value = "/role/searchRoleName", method = RequestMethod.POST)
@ResponseBody
public List<Role> searchRoleName(String q) {
List<Role> roleName = roleService.findRoleName(q);
return roleName;
}
/**
*
* @Title: updateRole
* @Description: 接收更新角色的数据
* @param role
* @return GlobalResult
* @author 最后的轻语_dd43
* @date 2019年2月14日下午8:19:07
*/
@LogAnno(operateType = "更新角色")
@RequestMapping(value = "/role/roleupdate" , method = RequestMethod.POST)
@ResponseBody
public GlobalResult updateRole(Role role) {
GlobalResult result = roleService.updateRole(role);
return result;
}
/**
*
* @Title: addRole
* @Description: 添加角色
* @param role
* @return GlobalResult
* @author 最后的轻语_dd43
* @date 2019年2月15日上午11:52:43
*/
@LogAnno(operateType = "添加角色 ")
@RequestMapping(value = "/role/roleadd" , method = RequestMethod.POST)
@ResponseBody
public GlobalResult addRole(Role role) {
GlobalResult result = roleService.addRole(role);
return result;
}
/**
* 删除角色
* @param role 角色
*/
@LogAnno(operateType = "删除角色")
@RequestMapping(value = "/role/roledelete" , method = RequestMethod.POST)
@ResponseBody
public GlobalResult deleteRole(Role role) {
GlobalResult result = roleService.deleteRoleById(role.getUuid());
return result;
}
/**
*
* @Title: rolelistByEnble
* @Description: 返回datagrid格式json
* @return EasyUIDataGridResult
* @author 最后的轻语_dd43
* @date 2019年2月16日下午12:36:00
*/
@RequestMapping(value = "/role/rolelist")
@ResponseBody
public EasyUIDataGridResult rolelist() {
EasyUIDataGridResult result = roleService.findRoleList();
return result;
}
/**
*
* @Title: findRoleMenuByRoleid
* @Description: 根据角色id加载对应权限菜单
* @param roleuuid
* @return List<EasyUIOptionalTreeNode>
* @author 最后的轻语_dd43
* @date 2019年2月16日下午7:19:56
*/
@RequestMapping(value = "/role/findRoleMenuByRoleid" , method = RequestMethod.POST)
@ResponseBody
public List<EasyUIOptionalTreeNode> findRoleMenuByRoleid(
@RequestParam(value = "id", required = true)Integer roleuuid) {
return roleService.findRoleMenuByRoleid(roleuuid);
}
/**
*
* @Title: updateRoleMenu
* @Description: 更新角色权限菜单
* @param roleuuid
* @param checkedIds
* @return GlobalResult
* @author 最后的轻语_dd43
* @date 2019年2月16日下午8:16:05
*/
@LogAnno(operateType = "更新角色权限菜单")
@RequestMapping(value = "/role/updateRoleMenu" , method = RequestMethod.POST)
@ResponseBody
public GlobalResult updateRoleMenu(
@RequestParam(value = "id", required = true) Integer roleuuid,
@RequestParam(value = "checkedIds", required = true) String checkedIds) {
GlobalResult result = roleService.updateRoleMenu(roleuuid, checkedIds);
return result;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/controller/UserController.java
================================================
package cn.lastwhisper.modular.controller;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import cn.lastwhisper.core.annotation.LogAnno;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import cn.lastwhisper.modular.vo.EasyUIDataGridResult;
import cn.lastwhisper.modular.vo.EasyUIOptionalTreeNode;
import cn.lastwhisper.modular.vo.GlobalResult;
import cn.lastwhisper.core.util.UserUtils;
import cn.lastwhisper.modular.pojo.Log;
import cn.lastwhisper.modular.pojo.User;
import cn.lastwhisper.modular.service.LogService;
import cn.lastwhisper.modular.service.UserService;
/**
*
* @ClassName: UserController
* @Description:用户相关操作请求接收器
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
@Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
private LogService logService;
/**
*
* @Title: login
* @Description: 用户登录
* @param user_code
* @param user_pwd
* @return
*/
@RequestMapping(value = "/user/login", method = RequestMethod.POST)
@ResponseBody
public GlobalResult login(String user_code, String user_pwd) {
try {
// 1.创建令牌
UsernamePasswordToken token = new UsernamePasswordToken(user_code, user_pwd);
// 2.获取主题subject
Subject subject = SecurityUtils.getSubject();
// 3.执行login方法
subject.login(token);
// 4.登录日志记录
Log log = new Log();
log.setOperatedate(new Date());
log.setOperateor(user_code);
log.setOperateresult("正常");
log.setOperatetype("登录");
log.setIp(UserUtils.getIpAddress());
logService.addLog(log);
return GlobalResult.build(200, "");
} catch (AuthenticationException e) {
e.printStackTrace();
return GlobalResult.build(400, "账号或密码错误");
} catch (SQLException e) {
e.printStackTrace();
return GlobalResult.build(500, "服务端错误");
}
}
/**
*
* @Title: login
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param user 查询参数
* @param page 当前页
* @param rows 页面大小
* @return
*/
@RequestMapping(value = "/user/userlistByPage", method = RequestMethod.POST)
@ResponseBody
public EasyUIDataGridResult userlistByPage(User user,
@RequestParam(value = "page", required = true, defaultValue = "1") Integer page,
@RequestParam(value = "rows", required = true, defaultValue = "10") Integer rows) {
return userService.findUserlistByPage(user, page, rows);
}
/**
*
* @Title: searchUserName
* @Description: 用户名自动补全
* @param q
* @return
*/
@RequestMapping(value = "/user/searchUserName", method = RequestMethod.POST)
@ResponseBody
public List<User> searchUserName(String q) {
List<User> userName = userService.findUserName(q);
return userName;
}
/**
*
* @Title: login
* @Description: 添加用户
* @param user 被添加的用户信息
* @return
*/
@LogAnno(operateType = "添加用户")
@RequestMapping(value = "/user/useradd", method = RequestMethod.POST)
@ResponseBody
public GlobalResult useradd(User user) {
return userService.addUser(user);
}
/**
*
* @Title: userupdate
* @Description: 更新用户信息
* @param user 被修改的用户信息
* @return
*/
@LogAnno(operateType = "更新用户")
@RequestMapping(value = "/user/userupdate", method = RequestMethod.POST)
@ResponseBody
public GlobalResult userupdate(User user) {
return userService.updateUser(user);
}
@LogAnno(operateType = "更新密码")
@RequestMapping(value = "/user/updatePwd", method = RequestMethod.POST)
@ResponseBody
public GlobalResult updatePwd(String oldPwd, String newPwd) {
User user = UserUtils.getSubjectUser();
GlobalResult result = userService.updatePwd(user, oldPwd, newPwd);
// 密码修改完成后移除当前用户
UserUtils.removeSubjectUser();
;
return result;
}
/**
*
* @Title: userdelete
* @Description: 根据user封装的条件删除用户
* @param user 封装的条件
* @return
*/
@LogAnno(operateType = "删除用户")
@RequestMapping(value = "/user/userdelete", method = RequestMethod.POST)
@ResponseBody
public GlobalResult userdelete(User user) {
return userService.deleteUser(user.getUser_id());
}
/**
*
* @Title: findUserRole
* @Description: esayui tree默认POST方法
* @param user_id
* @return List<EasyUIOptionalTreeNode>
* @author gj
* @date 2019年2月16日下午3:23:42
*/
@RequestMapping(value = "/user/findUserRole", method = { RequestMethod.POST })
@ResponseBody
public List<EasyUIOptionalTreeNode> findUserRole(@RequestParam(value = "id", required = true) Integer user_id) {
List<EasyUIOptionalTreeNode> treeList = userService.findUserRole(user_id);
return treeList;
}
/**
*
* @Title: updateUserRole
* @Description: 更新用户对应的权限
* @param user_id
* @param checkedIds
* @return GlobalResult
* @author gj
* @date 2019年2月16日下午4:05:33
*/
@LogAnno(operateType = "更新用户对应角色")
@RequestMapping(value = "/user/updateUserRole", method = { RequestMethod.POST })
@ResponseBody
public GlobalResult updateUserRole(@RequestParam(value = "id", required = true) Integer user_id,
@RequestParam(value = "checkedIds", required = true) String checkedIds) {
GlobalResult result = userService.updateUserRole(user_id, checkedIds);
return result;
}
/**
*
* @Title: showName
* @Description: 显示用户名
* @return GlobalResult
* @author gj
* @date 2019年2月21日下午12:02:45
*/
@RequestMapping(value = "/user/showName")
@ResponseBody
public GlobalResult showName() {
GlobalResult result = null;
if (UserUtils.getSubjectUser() == null) {
result = GlobalResult.build(400, "用户未登录");
} else {
result = GlobalResult.build(200, UserUtils.getSubjectUser().getUser_name());
}
return result;
}
/**
*
* @Title: logout
* @Description: 登出
* @return Map
* @author gj
* @date 2019年2月21日下午1:02:53
*/
@RequestMapping(value = "/user/logout")
@ResponseBody
public String logout() {
// 登录日志记录
Log log = new Log();
log.setOperatedate(new Date());
log.setOperateor(UserUtils.getSubjectUser().getUser_code());
log.setOperateresult("正常");
log.setOperatetype("注销");
log.setIp(UserUtils.getIpAddress());
try {
logService.addLog(log);
} catch (SQLException e) {
e.printStackTrace();
}
UserUtils.removeSubjectUser();
return null;
}
/**
*
* @Title: userexport
* @Description: 根据user条件,导出对应的数据
* @param user 封装的条件
* @return
*/
@LogAnno(operateType = "导出用户信息Excel")
@RequestMapping(value = "/user/userexport", method = RequestMethod.POST)
@ResponseBody
public void userexport(User user, HttpServletResponse response) {
String filename = "Users_exportBy" + UserUtils.getSubjectUser().getUser_name() + ".xls";
// 响应对象
try {
// 设置输出流,实现下载文件
response.setHeader("Content-Disposition",
"attachment;filename=" + new String(filename.getBytes(), "ISO-8859-1"));
userService.export(response.getOutputStream(), user);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* @Title: userdoImport
* @Description: 导入用户信息excel
* @author: 最后的轻语_dd43
* @return
*/
@LogAnno(operateType = "导入用户信息Excel")
@RequestMapping(value = "/user/userdoImport", method = RequestMethod.POST)
@ResponseBody
public GlobalResult userdoImport(MultipartFile file) {
try {
userService.doImport(file.getInputStream());
return new GlobalResult(200, "文件上传成功", null);
} catch (IOException e) {
e.printStackTrace();
return new GlobalResult(400, "文件上传失败", null);
}
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/LogMapper.java
================================================
package cn.lastwhisper.modular.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cn.lastwhisper.modular.pojo.Log;
/**
* @ClassName: LogMapper
* @Description:TODO(这里用一句话描述这个类的作用)
* @author: 最后的轻语_dd43
* @date: 2019年4月30日
*/
public interface LogMapper {
/**
* @Title: insertLog
* @Description: 向数据库添加日志
* @author: 最后的轻语_dd43
* @param log
* @return
*/
int insertLog(Log log);
/**
*
* @Title: selectUserlistByPage
* @Description: 查询
* @author: 最后的轻语_dd43
* @param log
* @return
*/
public List<Log> selectLoglistByPage(Log log);
/**
*
* @Title: selectLogOperateor
* @Description: 模糊查询操作人
* @author: 最后的轻语_dd43
* @param operateor
* @return
*/
public List<Log> selectLogOperateor(@Param("operateor")String operateor);
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/LogMapper.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.lastwhisper.modular.mapper.LogMapper">
<select id="selectLoglistByPage" parameterType="log"
resultType="log">
select * from log
<if test="operateor!=null">
where
operateor like CONCAT('%',#{operateor},'%' )
</if>
</select>
<!-- 根据操作人模糊查询操作人 自动补全 -->
<select id="selectLogOperateor" parameterType="java.lang.String"
resultType="log">
select distinct operateor from log
where
operateor like CONCAT('%',#{operateor},'%' )
</select>
<insert id="insertLog" parameterType="int">
insert into log
values(0
<if test='operateor!=null'>
,#{operateor}
</if>
<if test='operateor==null'>
,null
</if>
<if test='operatetype!=null'>
,#{operatetype}
</if>
<if test='operatetype==null'>
,null
</if>
<if test='operatedate!=null'>
,#{operatedate}
</if>
<if test='operatedate==null'>
,null
</if>
<if test='operateresult!=null'>
,#{operateresult}
</if>
<if test='operateresult==null'>
,null
</if>
<if test='ip!=null'>
,#{ip}
</if>
<if test='ip==null'>
,null
</if>
);
</insert>
</mapper>
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/MenuMapper.java
================================================
package cn.lastwhisper.modular.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cn.lastwhisper.modular.vo.Tree;
import cn.lastwhisper.modular.pojo.Menu;
/**
* @ClassName: MenuMapper
* @Description:TODO(这里用一句话描述这个类的作用)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
public interface MenuMapper {
/**
*
* @Title: selectMenuList
* @Description: 查找所有数据
* @author: 最后的轻语_dd43
* @return
*/
List<Tree> selectMenuList();
/**
*
* @Title: selectMenuById
* @Description: 根据菜单id查找菜单,显示菜单详情
* @author: 最后的轻语_dd43
* @param menuid
* @return
*/
List<Menu> selectMenuById(@Param("menuid") String menuid);
/**
*
* @Title: insertMenu
* @Description: 添加数据
* @author: 最后的轻语_dd43
* @param Menu
* @return
*/
Integer insertMenu(Menu Menu);
/**
*
* @Title: deleteMenuById
* @Description: 根据id删除数据[修改状态]
* @author: 最后的轻语_dd43
* @param menuid
* @return
*/
Integer deleteMenuById(String menuid);
/**
*
* @Title: updateMenuById
* @Description: 根据id修改数据
* @author: 最后的轻语_dd43
* @param Menu
* @return
*/
Integer updateMenuById(Menu Menu);
/**
*
* @Title: selectMenuIdName
* @Description: 根据pid获取所有权限菜单(menuid,menuname)
* @return List<Menu>
* @author 最后的轻语_dd43
* @date 2019年2月16日下午7:05:10
*/
public List<Menu> selectMenuIdName(@Param("pid") String pid);
/**
*
* @Title: selectMenuByUserid
* @Description: 根据userid加载对应菜单
* @param userid
* @return List<Menu>
* @author 最后的轻语_dd43
* @date 2019年2月16日下午8:40:39
*/
public List<Menu> selectMenuByUserid(@Param("userid") Integer userid);
/**
*
* @Title: selectMenu
* @Description: 查询所有菜单的所有属性
* @param pid
* @return List<Menu>
* @author 最后的轻语_dd43
* @date 2019年2月16日下午9:04:26
*/
public List<Menu> selectMenu(@Param("pid") String pid);
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/MenuMapper.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.lastwhisper.modular.mapper.MenuMapper">
<!-- 初始化菜单树 -->
<resultMap type="cn.lastwhisper.modular.vo.Tree" id="menuTree">
<id column="menuid" property="id" javaType="java.lang.String" />
<result column="menuname" property="text" javaType="java.lang.String" />
<collection column="menuid" property="children" select="selectChild"/>
</resultMap>
<!-- 查找一级菜单 -->
<!-- 先查询菜单根级目录 -->
<!-- 这里的返回结果必须为resultMap,并且值为上面构建的resultMap的id的值 -->
<select id="selectMenuList" resultMap="menuTree">
select * from menu where menuid='0'
</select>
<!-- 查询二级菜单 -->
<select id="selectChild" resultMap="menuTree">
select * from menu where pid = #{menuid}
</select>
<!-- 查询所有菜单的id、name -->
<select id="selectMenuIdName" resultType="menu">
SELECT menuid,menuname FROM menu where pid = #{pid}
</select>
<!-- 查询所有菜单的所有属性 -->
<select id="selectMenu" resultType="menu">
SELECT menuid,menuname,url,icon,pid FROM menu where pid = #{pid}
</select>
<!-- 根据userid加载对应菜单 -->
<select id="selectMenuByUserid" resultType="menu">
SELECT
DISTINCT menu.menuid,menu.menuname,menu.url,menu.icon,menu.pid
FROM
user_role,
role,
role_menu,
menu
WHERE
user_role.roleuuid = role.uuid
AND role.uuid = role_menu.roleuuid
AND role_menu.menuuuid = menu.menuid
AND user_role.userid = #{userid}
</select>
<!-- 查询菜单结束 -->
<!-- 根据id查询菜单 -->
<select id="selectMenuById" parameterType="java.lang.String" resultType="menu">
select * from menu where menuid = #{menuid}
</select>
<!-- 插入数据 -->
<insert id="insertMenu" parameterType="menu">
insert into menu values(
<if test='menuid != null and menuid != ""'>
#{menuid}
</if>
<if test='menuid == null or menuid == ""'>
null
</if>
<if test='menuname != null and menuname != ""'>
,#{menuname}
</if>
<if test='menuname == null or menuname == ""'>
,null
</if>
<if test='url != null and url != "" '>
,#{url}
</if>
<if test='url == null or url == ""'>
,null
</if>
<if test='icon != null and icon != ""'>
,#{icon}
</if>
<if test='icon == null or icon == ""'>
,null
</if>
<if test='pid != null and pid != ""'>
,#{pid}
</if>
<if test='pid == null or pid == ""'>
,null
</if>
<if test='is_parent != null'>
,#{is_parent}
</if>
<if test='is_parent == null'>
,null
</if>
);
</insert>
<!-- 根据id删除数据-->
<update id="deleteMenuById">
delete from menu where menuid = #{0}
</update>
<!-- 根据id修改数据 -->
<update id="updateMenuById" parameterType="menu">
update menu
<trim prefix="set" suffixOverrides="," suffix="where menuid = #{menuid}">
<if test='menuname != null and menuname != ""'>
menuname = #{menuname},
</if>
<if test='url != null and url != "" '>
url = #{url},
</if>
<if test='icon != null and icon != ""'>
icon = #{icon},
</if>
<if test='pid != null and pid != ""'>
pid = #{pid},
</if>
<if test='is_parent != null'>
is_parent = #{is_parent}
</if>
</trim>
</update>
</mapper>
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/RoleMapper.java
================================================
package cn.lastwhisper.modular.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cn.lastwhisper.modular.pojo.Role;
/**
* @ClassName: RoleMapper
* @Description:TODO(这里用一句话描述这个类的作用)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
public interface RoleMapper {
/**
*
* @Title: selectRoleByPage
* @Description: 根据条件查询所有角色
* @param role
* @return List<Role>
* @author 最后的轻语_dd43
* @date 2019年2月14日下午7:12:56
*/
public List<Role> selectRolelistByPage(Role role);
/**
*
* @Title: selectAllRole
* @Description: 查询所有角色
* @param role
* @return List<Role>
* @author 最后的轻语_dd43
* @date 2019年2月16日下午12:28:09
*/
public List<Role> selectRoleList();
/**
*
* @Title: selectRoleName
* @Description: 查询角色,自动补全
* @param name
* @return
*/
public List<Role> selectRoleName(@Param("name")String name);
/**
*
* @Title: selectRoleMenuidByRoleid
* @Description: 根据角色id获取对应的权限菜单id
* @param roleuuid
* @return List<Integer>
* @author 最后的轻语_dd43
* @date 2019年2月16日下午4:35:08
*/
public List<String> selectRoleMenuidByRoleid(@Param("roleuuid") Integer roleuuid);
/**
*
* @Title: selectUseridByRoleuuid
* @Description: 根据角色id获取对应的用户id
* @param roleuuid
* @return List<Integer>
* @author 最后的轻语_dd43
* @date 2019年2月17日上午11:18:02
*/
public List<Integer> selectUseridByRoleuuid(@Param("roleuuid") Integer roleuuid);
/**
*
* @Title: updateRole
* @Description: 更新角色信息
* @param role
* @return Integer
* @author 最后的轻语_dd43
* @date 2019年2月14日下午8:22:57
*/
public Integer updateRole(Role role);
/**
*
* @Title: insertRole
* @Description: 添加角色
* @param role
* @return Integer
* @author 最后的轻语_dd43
* @date 2019年2月15日上午11:50:36
*/
public Integer insertRole(Role role);
/**
*
* @Title: insertRolemenu
* @Description: 新增角色权限菜单关系
* @param menuuuid
* @param roleuuid void
* @author 最后的轻语_dd43
* @date 2019年2月16日下午8:07:02
*/
public void insertRolemenu(@Param("menuuuid") String menuuuid, @Param("roleuuid") Integer roleuuid);
/**
*
* @Title: deleteRoleByid
* @Description: 根据id删除对应角色
* @param uuid
* @return
*/
public Integer deleteRoleById(@Param("uuid") Integer uuid);
/**
*
* @Title: deleteMenuidByRoleid
* @Description: 根据roleuuid删除拥有的角色信息
* @param roleuuid void
* @author 最后的轻语_dd43
* @date 2019年2月16日下午8:05:53
*/
public void deleteMenuidByRoleid(@Param("roleuuid") Integer roleuuid);
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/RoleMapper.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.lastwhisper.modular.mapper.RoleMapper">
<!-- 查询 -->
<!-- 查询所有角色role,使用name模糊查询、enabl精准查询 -->
<select id="selectRolelistByPage" parameterType="role"
resultType="role">
select uuid,name from role
<if test='name!=null'>
where
<if test='name!=null'>
name LIKE CONCAT('%',#{name},'%' )
</if>
</if>
</select>
<!-- 查询该角色id(roleuuid)下的菜单id(menuuid) -->
<select id="selectRoleMenuidByRoleid" resultType="string">
select
role_menu.menuuuid from role_menu WHERE
role_menu.roleuuid=#{roleuuid}
</select>
<!-- 查询所有角色的uuid、name -->
<select id="selectRoleList" resultType="role">
SELECT uuid,name from role
</select>
<select id="selectUseridByRoleuuid" resultType="int">
SELECT userid
FROM user_role WHERE roleuuid = #{roleuuid}
</select>
<!-- 根据角色模糊查询角色 自动补全 -->
<select id="selectRoleName"
parameterType="java.lang.String" resultType="role">
select name from role
where
name like CONCAT('%',#{name},'%' )
</select>
<!-- 查询结束 -->
<!-- 新增开始 -->
<!-- 新增角色 -->
<insert id="insertRole" parameterType="role">
insert into role VALUES(0,#{name})
</insert>
<!-- 新增角色权限菜单关系 -->
<insert id="insertRolemenu">
INSERT INTO role_menu VALUES(#{menuuuid},#{roleuuid})
</insert>
<!-- 新增结束 -->
<!-- 更新开始 -->
<!-- 根据uuid更新角色 -->
<update id="updateRole" parameterType="role" >
UPDATE role
SET NAME = #{name}
WHERE
uuid = #{uuid}
</update>
<!-- 更新结束 -->
<!-- 删除开始 -->
<delete id="deleteRoleById">
delete from role where uuid = #{uuid}
</delete>
<!-- 根据roleuuid删除拥有的角色信息 -->
<delete id="deleteMenuidByRoleid">
delete from role_menu where roleuuid = #{roleuuid}
</delete>
<!-- 删除结束 -->
</mapper>
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/UserMapper.java
================================================
package cn.lastwhisper.modular.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cn.lastwhisper.modular.pojo.Role;
import cn.lastwhisper.modular.pojo.User;
/**
*
* @ClassName: UserMapper
* @Description:mybatis的接口,用于操作用户相关表
* @author: 最后的轻语_dd43
* @date: 2019年4月5日
*/
public interface UserMapper {
/**
*
* @Title: selectUserBycodeAndpwd
* @Description: 根据user_code和user_pwd查询user表
* @param user_code 账号
* @param user_pwd 密码
* @return
*/
public User selectUserBycodeAndpwd(@Param("user_code") String user_code,
@Param("user_pwd") String user_pwd);
/**
*
* @Title: selectUserList
* @Description: 查询所有用户信息
* @param user 查询条件
* @return
*/
public List<User> selectUserlistByPage(User user);
/**
*
* @Title: selectUserName
* @Description: 查询用户姓名,自动补全
* @param user_name
* @return
*/
public List<User> selectUserName(@Param("user_name")String user_name);
/**
*
* @Title: selectUserRole
* @Description: 根据userid获取用户对应的角色,例如user_id=221
* @return List<Role>
* @author gj
* @date 2019年2月16日下午2:50:20
*/
public List<Role> selectUserRole(@Param("user_id") Integer user_id);
/**
*
* @Title: selectUserByUserCode
* @Description: 证据用户账号查询对应用户
* @author: 最后的轻语_dd43
* @param user_code 用户账号
* @return
*/
public List<User> selectUserByUserCode(String user_code);
/**
*
* @Title: insertUser
* @Description: 添加用户
* @param user 用户
* @return
*/
public Integer insertUser(User user);
/**
*
* @Title: addUserRole
* @Description: 给用户添加角色
* @param user_id
* @param roleuuid
* @return int
* @author gj
* @date 2019年2月16日下午3:53:14
*/
public void insertUserRole(@Param("user_id") Integer user_id,@Param("roleuuid") Integer roleuuid);
/**
*
* @Title: updateUser
* @Description: 更新用户信息
* @param user 用户信息
* @return
*/
public Integer updateUser(User user);
/**
*
* @Title: updatePwd
* @Description: 更新密码
* @author: 最后的轻语_dd43
* @return
*/
public Integer updatePwdById(@Param("user_id") Integer user_id,@Param("user_pwd") String user_pwd);
/**
*
* @Title: updateUser
* @Description: 更新用户信息根据用户账号
* @param user 用户账号
* @return
*/
public Integer updateUserByUserCode(User user);
/**
*
* @Title: deleteUserById
* @Description: 根据主键删除用户信息
* @param user_id 主键
* @return
*/
public Integer deleteUserById(@Param("user_id") Integer user_id);
/**
*
* @Title: deleteUserRole
* @Description: 删除用户关联的角色id
* @param user_id
* @return int
* @author gj
* @date 2019年2月16日下午3:51:24
*/
public void deleteUserRole(@Param("user_id") Integer user_id);
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/UserMapper.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.lastwhisper.modular.mapper.UserMapper">
<!-- 根据user_code和user_pwd查询user表 -->
<select id="selectUserBycodeAndpwd"
parameterType="java.lang.String" resultType="user">
select * from user
where
user_code=#{user_code} and
user_pwd=#{user_pwd}
</select>
<select id="selectUserlistByPage" parameterType="user"
resultType="user">
SELECT
*
FROM
user
<if test="user_name!=null">
where
user_name like '%${user_name}%'
</if>
</select>
<!-- 根据用户名模糊查询用户 自动补全 -->
<select id="selectUserName" parameterType="java.lang.String"
resultType="user">
select user_name from user
where
user_name like concat('%', #{user_name}, '%')
</select>
<!-- 查询用户对应的角色id -->
<select id="selectUserRole" resultType="role">
select uuid from
user_role,role where user_role.userid=#{user_id} and
user_role.roleuuid = role.uuid;
</select>
<!-- 查询账号对应的用户 -->
<select id="selectUserByUserCode"
parameterType="java.lang.String" resultType="user">
select
user_code,user_name,user_birthday from user
where
user_code =
#{user_code}
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="user">
insert into user
values
(0
<if test='user_code!=null'>
,#{user_code}
</if>
<if test='user_code==null'>
,null
</if>
<if test='user_name!=null'>
,#{user_name}
</if>
<if test='user_name==null'>
,null
</if>
<if test='user_pwd!=null'>
,#{user_pwd}
</if>
<if test='user_pwd==null'>
,null
</if>
<if test='user_birthday!=null'>
,#{user_birthday}
</if>
<if test='user_birthday==null'>
,null
</if>
);
</insert>
<!-- 给用户添加对应角色信息 -->
<insert id="insertUserRole">
insert into user_role VALUES(#{user_id},#{roleuuid})
</insert>
<!-- 更新用户信息根据与用户编号 -->
<update id="updateUser" parameterType="user">
update user set
<if test='user_code!=null'>
user_code = #{user_code}
</if>
<if test='user_name!=null'>
,user_name = #{user_name}
</if>
<if test='user_pwd!=null'>
,user_pwd = #{user_pwd}
</if>
<if test='user_birthday!=null'>
,user_birthday = #{user_birthday}
</if>
where
<if test='user_id!=null'>
user_id = #{user_id}
</if>
</update>
<!-- 更新用户密码 -->
<update id="updatePwdById" parameterType="user">
update user set
<if test='user_pwd!=null'>
user_pwd = #{user_pwd}
</if>
where
<if test='user_id!=null'>
user_id = #{user_id}
</if>
</update>
<!-- 更新用户信息根据账号 -->
<update id="updateUserByUserCode" parameterType="user">
update user set
<if test='user_name!=null'>
user_name = #{user_name}
</if>
<if test='user_pwd!=null'>
,user_pwd = #{user_pwd}
</if>
<if test='user_birthday!=null'>
,user_birthday = #{user_birthday}
</if>
where
<if test='user_code!=null'>
user_code = #{user_code}
</if>
</update>
<!-- 根据主键删除用户 -->
<delete id="deleteUserById">
delete from user where
user_id=#{user_id}
</delete>
<!-- 根据用户id删除对应角色 -->
<delete id="deleteUserRole">
delete from user_role where userid = #{user_id}
</delete>
</mapper>
================================================
FILE: src/main/java/cn/lastwhisper/modular/pojo/Log.java
================================================
package cn.lastwhisper.modular.pojo;
import java.util.Date;
public class Log {
private Integer id;
private String operateor;
private String operatetype;
private Date operatedate;
private String operateresult;
private String ip;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOperateor() {
return operateor;
}
public void setOperateor(String operateor) {
this.operateor = operateor == null ? null : operateor.trim();
}
public String getOperatetype() {
return operatetype;
}
public void setOperatetype(String operatetype) {
this.operatetype = operatetype == null ? null : operatetype.trim();
}
public Date getOperatedate() {
return operatedate;
}
public void setOperatedate(Date operatedate) {
this.operatedate = operatedate;
}
public String getOperateresult() {
return operateresult;
}
public void setOperateresult(String operateresult) {
this.operateresult = operateresult == null ? null : operateresult.trim();
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/pojo/Menu.java
================================================
/**
* @Title: Menu.java
* @Package cn.lastwhisper.pojo
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午3:41:53
* @version V1.0
*/
package cn.lastwhisper.modular.pojo;
import java.util.LinkedList;
import java.util.List;
/**
* @ClassName: Menu
* @Description:TODO(这里用一句话描述这个类的作用)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
public class Menu {
private String menuid;// 编号
private String menuname;// 名称
private String url;// 对应URL
private String icon;// 图标样式
private String pid;// 上一级菜单编号
private Integer is_parent;// 该菜单是否为父菜单,1为true,0为false
private List<Menu> menus = new LinkedList<Menu>();
/**
* @Title: getMenuid <BR>
* @Description: please write your description <BR>
* @return: String <BR>
*/
public String getMenuid() {
return menuid;
}
/**
* @param menuid the menuid to set
*/
public void setMenuid(String menuid) {
this.menuid = menuid;
}
/**
* @Title: getMenuname <BR>
* @Description: please write your description <BR>
* @return: String <BR>
*/
public String getMenuname() {
return menuname;
}
/**
* @param menuname the menuname to set
*/
public void setMenuname(String menuname) {
this.menuname = menuname;
}
/**
* @Title: getUrl <BR>
* @Description: please write your description <BR>
* @return: String <BR>
*/
public String getUrl() {
return url;
}
/**
* @param url the url to set
*/
public void setUrl(String url) {
this.url = url;
}
/**
* @Title: getIcon <BR>
* @Description: please write your description <BR>
* @return: String <BR>
*/
public String getIcon() {
return icon;
}
/**
* @param icon the icon to set
*/
public void setIcon(String icon) {
this.icon = icon;
}
/**
* @Title: getPid <BR>
* @Description: please write your description <BR>
* @return: String <BR>
*/
public String getPid() {
return pid;
}
/**
* @param pid the pid to set
*/
public void setPid(String pid) {
this.pid = pid;
}
/**
* @Title: getIs_parent <BR>
* @Description: please write your description <BR>
* @return: Integer <BR>
*/
public Integer getIs_parent() {
return is_parent;
}
/**
* @param is_parent the is_parent to set
*/
public void setIs_parent(Integer is_parent) {
this.is_parent = is_parent;
}
/**
* @Title: getMenus <BR>
* @Description: please write your description <BR>
* @return: List<Menu> <BR>
*/
public List<Menu> getMenus() {
return menus;
}
/**
* @param menus the menus to set
*/
public void setMenus(List<Menu> menus) {
this.menus = menus;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/pojo/Role.java
================================================
/**
* @Title: Role.java
* @Package cn.lastwhisper.pojo
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午2:34:44
* @version V1.0
*/
package cn.lastwhisper.modular.pojo;
/**
* @ClassName: Role
* @Description:角色实体类
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
public class Role {
//编号
private Integer uuid;
//名称
private String name;
/**
* @Title: getUuid <BR>
* @Description: please write your description <BR>
* @return: Integer <BR>
*/
public Integer getUuid() {
return uuid;
}
/**
* @param uuid the uuid to set
*/
public void setUuid(Integer uuid) {
this.uuid = uuid;
}
/**
* @Title: getName <BR>
* @Description: please write your description <BR>
* @return: String <BR>
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/pojo/User.java
================================================
package cn.lastwhisper.modular.pojo;
import java.io.Serializable;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
/**
*
* @ClassName: User
* @Description:用户实体类
* @author: 最后的轻语_dd43
* @date: 2019年4月5日
*/
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private Integer user_id;
private String user_name;
private String user_code;
//不转换json字符串
@JsonIgnore
private String user_pwd;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date user_birthday;
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_code() {
return user_code;
}
public void setUser_code(String user_code) {
this.user_code = user_code;
}
public String getUser_pwd() {
return user_pwd;
}
public void setUser_pwd(String user_pwd) {
this.user_pwd = user_pwd;
}
/**
* @Title: getUser_birthday <BR>
* @Description: please write your description <BR>
* @return: Date <BR>
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
public Date getUser_birthday() {
return user_birthday;
}
/**
* @param user_birthday the user_birthday to set
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
public void setUser_birthday(Date user_birthday) {
this.user_birthday = user_birthday;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/service/LogService.java
================================================
package cn.lastwhisper.modular.service;
import java.sql.SQLException;
import java.util.List;
import cn.lastwhisper.modular.vo.EasyUIDataGridResult;
import cn.lastwhisper.modular.pojo.Log;
/**
* 日志Service
*
* @author lastwhisper
*
*/
public interface LogService {
/**
* 增加日志
* @param log
* @return
* @throws SQLException
*/
public boolean addLog(Log log) throws SQLException;
/**
* @Title: findLoglistByPage
* @Description: 查询日志
* @author: 最后的轻语_dd43
* @param page
* @param rows
* @param log
* @return
*/
public EasyUIDataGridResult findLoglistByPage(Integer page, Integer rows, Log log);
/**
* @Title: findLogOperateor
* @Description: 模糊查询用户名
* @author: 最后的轻语_dd43
* @param q
* @return
*/
public List<Log> findLogOperateor(String q);
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/service/MenuService.java
================================================
/**
* @Title: MenuService.java
* @Package cn.lastwhisper.service
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午5:10:15
* @version V1.0
*/
package cn.lastwhisper.modular.service;
import java.util.List;
import cn.lastwhisper.modular.vo.GlobalResult;
import cn.lastwhisper.modular.vo.Tree;
import cn.lastwhisper.modular.pojo.Menu;
/**
* @ClassName: MenuService
* @Description:TODO(这里用一句话描述这个类的作用)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
public interface MenuService {
/**
*
* @Title: findMenuList
* @Description: 查找所有数据
* @author: 最后的轻语_dd43
* @return
*/
List<Tree> findMenuList();
/**
*
* @Title: findMenuById
* @Description: 根据菜单id查找菜单,显示菜单详情
* @author: 最后的轻语_dd43
* @param menuid
* @return
*/
List<Menu> findMenuById(String menuid);
/**
*
* @Title: addMenu
* @Description: 添加数据
* @author: 最后的轻语_dd43
* @param Menu
* @return
*/
GlobalResult addMenu(Menu Menu);
/**
*
* @Title: deleteMenuById
* @Description: 根据id删除数据
* @author: 最后的轻语_dd43
* @param menuid
* @return
*/
GlobalResult deleteMenuById(String menuid);
/**
*
* @Title: updateMenuById
* @Description: 根据id修改数据
* @author: 最后的轻语_dd43
* @param Menu
* @return
*/
GlobalResult updateMenuById(Menu Menu);
/**
*
* @Title: findMenuByUserid
* @Description: 根据userid加载对应菜单
* @param userid
* @return Menu
* @author gj
* @date 2019年2月16日下午8:43:39
*/
Menu findMenuByUserid(Integer userid);
/**
*
* @Title: findMenuListByUserid
* @Description: 根据userid加载对应菜单无序列表
* @param userid
* @return List<Menu>
* @author gj
* @date 2019年2月17日下午8:55:10
*/
List<Menu> findMenuListByUserid(Integer userid);
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/service/RoleService.java
================================================
/**
* @Title: RoleService.java
* @Package cn.lastwhisper.service
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午2:45:32
* @version V1.0
*/
package cn.lastwhisper.modular.service;
import java.util.List;
import cn.lastwhisper.modular.vo.EasyUIDataGridResult;
import cn.lastwhisper.modular.vo.EasyUIOptionalTreeNode;
import cn.lastwhisper.modular.vo.GlobalResult;
import cn.lastwhisper.modular.pojo.Role;
/**
*
* @ClassName: RoleService
* @Description: 处理角色相关业务
* @author: 最后的轻语_dd43
* @date: 2019年2月14日 下午6:31:37
*/
public interface RoleService {
/**
*
* @Title: findRoleByPage
* @Description: 根据查询条件所有角色
* @param page
* @param rows
* @param role
* @return EasyUIDataGridResult
* @author 最后的轻语_dd43
* @date 2019年2月14日下午7:08:40
*/
public EasyUIDataGridResult findRolelistByPage(Integer page, Integer rows,Role role);
/**
*
* @Title: findRoleByEnble
* @Description: 查询所有可用的角色
* @return EasyUIDataGridResult
* @author 最后的轻语_dd43
* @date 2019年2月16日下午12:34:06
*/
public EasyUIDataGridResult findRoleList();
/**
*
* @Title: findUserName
* @Description: like查询角色名
* @param q 角色名
* @return
*/
public List<Role> findRoleName(String q);
/**
*
* @Title: updateRole
* @Description: 更新角色的名称或者状态
* @param role
* @return ManagerResult
* @author 最后的轻语_dd43
* @date 2019年2月14日下午8:18:37
*/
public GlobalResult updateRole(Role role);
/**
*
* @Title: addRole
* @Description: 添加角色
* @param role
* @return ManagerResult
* @author 最后的轻语_dd43
* @date 2019年2月14日下午10:11:23
*/
public GlobalResult addRole(Role role);
/**
*
* @Title: deleteRoleById
* @Description: 根据uuid删除角色
* @param uuid
* @return
*/
public GlobalResult deleteRoleById(Integer uuid);
/**
*
* @Title: findRoleMenu
* @Description: 获取角色菜单权限
-- 1.根据角色id获取对应的权限菜单id,比如角色id roleuuid=1
select role_menu.menuuuid from role,role_menu WHERE role_menu.roleuuid=1;
-- 2.获取所有权限菜单(menuid,menuname)
SELECT menuid,menuname FROM menu;
* @param roleuuid
* @return List<EasyUIOptionalTreeNode>
* @author 最后的轻语_dd43
* @date 2019年2月16日下午4:40:34
*/
public List<EasyUIOptionalTreeNode> findRoleMenuByRoleid(Integer roleuuid);
/**
*
* @Title: updateRoleMenu
* @Description: 更新角色权限菜单
* @param roleuuid
* @param checkedIds
* @return ManagerResult
* @author 最后的轻语_dd43
* @date 2019年2月16日下午8:10:20
*/
public GlobalResult updateRoleMenu(Integer roleuuid, String checkedIds);
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/service/UserService.java
================================================
package cn.lastwhisper.modular.service;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import cn.lastwhisper.modular.vo.EasyUIDataGridResult;
import cn.lastwhisper.modular.vo.EasyUIOptionalTreeNode;
import cn.lastwhisper.modular.vo.GlobalResult;
import cn.lastwhisper.modular.pojo.Role;
import cn.lastwhisper.modular.pojo.User;
/**
*
* @ClassName: UserService
* @Description:处理用户相关业务
* @author: 最后的轻语_dd43
* @date: 2019年4月5日
*/
public interface UserService {
/**
*
* @Title: findUserByCodeAndPwd
* @Description: 根据账号和密码查找用户
* @param user_code 账号
* @param user_pwd 密码
* @return
*/
public User findUserByCodeAndPwd(String user_code, String user_pwd);
/**
*
* @Title: findUserList
* @Description: 查询用户分页信息
* @param page 当前页
* @param rows 页面大小
* @return
*/
public EasyUIDataGridResult findUserlistByPage(User user,Integer page, Integer rows);
/**
*
* @Title: findUserName
* @Description: like查询用户名
* @param q 用户名
* @return
*/
public List<User> findUserName(String q);
/**
* @Title: findUserRole
* @Description: 查询所有角色,并设置选中的用户角色为true
* -- 1.获取用户对应的角色,例如user_id=221 select uuid
* from user_role,role where user_role.userid=221 and
* user_role.roleuuid = role.uuid and role.enble=1;
* -- 2.获取所有角色
* select uuid,name from role where role.enble=1; --
* -- 3.封装返回值将用户对应的角色设置为true,uuid、name
* @param user_id
* @return List<Tree>
* @date 2019年2月16日下午2:56:10
*/
List<EasyUIOptionalTreeNode> findUserRole(Integer user_id);
/**
*
* @Title: findUserRoleByUserid
* @Description: 根据用户id查询对应的角色
* @param user_id
* @return List<Role>
* @date 2019年2月21日下午12:08:37
*/
List<Role> findUserRoleByUserid(Integer user_id);
/**
*
* @Title: updateUserRole
* @Description: 更新用户对应的角色
* @param user_id
* @param checkedIds
* @return Integer
* @date 2019年2月16日下午3:57:33
*/
GlobalResult updateUserRole(Integer user_id, String checkedIds);
/**
*
* @Title: addUser
* @Description: 添加用户
* @param user 用户
* @return
*/
public GlobalResult addUser(User user);
/**
*
* @Title: updateUser
* @Description: 更新用户信息
* @param 用户信息
* @return
*/
public GlobalResult updateUser(User user);
/**
*
* @Title: updatePwd
* @Description: 更新用户的密码
* @author: 最后的轻语_dd43
* @param user 当前用户
* @param oldPwd 旧密码
* @param newPwd 新密码
* @return
*/
public GlobalResult updatePwd(User user,String oldPwd,String newPwd);
/**
*
* @Title: deleteUser
* @Description: 删除用户
* @param userId
* @return
*/
public GlobalResult deleteUser(Integer user_id);
/**
*
* @Title: export
* @Description: 导出excel
* @author: 最后的轻语_dd43
* @param os
* @param user
*/
public void export(OutputStream os, User user);
/**
*
* @Title: doImport
* @Description: 导入excel
* @author: 最后的轻语_dd43
* @param is
* @throws IOException
*/
public void doImport(InputStream is) throws IOException;
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/service/impl/LogServiceImpl.java
================================================
package cn.lastwhisper.modular.service.impl;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import cn.lastwhisper.modular.vo.EasyUIDataGridResult;
import cn.lastwhisper.modular.mapper.LogMapper;
import cn.lastwhisper.modular.pojo.Log;
import cn.lastwhisper.modular.service.LogService;
/**
*
* @ClassName: LogServiceImpl
* @Description: 日志管理
* @author: 最后的轻语_dd43
* @date: 2019年4月30日
*/
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@Service
public class LogServiceImpl implements LogService {
@Autowired
private LogMapper logMapper;
@Override
public boolean addLog(Log log) throws SQLException {
return logMapper.insertLog(log) > 0;
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public EasyUIDataGridResult findLoglistByPage(Integer page, Integer rows, Log log) {
PageHelper.startPage(page, rows);
List<Log> list = logMapper.selectLoglistByPage(log);
PageInfo<Log> pageInfo = new PageInfo<>(list);
EasyUIDataGridResult result = new EasyUIDataGridResult();
result.setTotal((int) pageInfo.getTotal());
result.setRows(pageInfo.getList());
return result;
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public List<Log> findLogOperateor(String q) {
return logMapper.selectLogOperateor(q);
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/service/impl/MenuServiceImpl.java
================================================
package cn.lastwhisper.modular.service.impl;
import cn.lastwhisper.modular.mapper.MenuMapper;
import cn.lastwhisper.modular.pojo.Menu;
import cn.lastwhisper.modular.service.MenuService;
import cn.lastwhisper.modular.vo.GlobalResult;
import cn.lastwhisper.modular.vo.Tree;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: MenuServiceImpl
* @Description: 菜单相关的操作
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@Service
public class MenuServiceImpl implements MenuService {
private static Logger logger = LoggerFactory.getLogger(MenuServiceImpl.class);
@Autowired
private MenuMapper menuMapper;
@Autowired
private JedisPool jedisPool;
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public List<Tree> findMenuList() {
return menuMapper.selectMenuList();
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public List<Menu> findMenuById(String menuid) {
return menuMapper.selectMenuById(menuid);
}
@Override
public GlobalResult addMenu(Menu menu) {
// 设置默认添加的菜单的状态为使用中
Integer insertCount = menuMapper.insertMenu(menu);
if (insertCount != null && insertCount > 0) {
// 更新标签为父标签
Menu m = new Menu();
m.setMenuid(menu.getPid());
m.setIs_parent(1);
if (200 == updateMenuById(m).getStatus()) {
batchDel();
return new GlobalResult(200, "数据添加成功", null);
} else {
return new GlobalResult(400, "数据添加失败", null);
}
} else {
return new GlobalResult(400, "数据添加失败", null);
}
}
/**
* 根据id删除数据
*
* @author
* @date 2019年2月15日下午9:51:50
* @param menuid 主键
* @return
*/
@Override
public GlobalResult deleteMenuById(String menuid) {
Integer deleteCount = menuMapper.deleteMenuById(menuid);
if (deleteCount != null && deleteCount > 0) {
batchDel();
return new GlobalResult(200, "数据删除成功", null);
} else {
return new GlobalResult(400, "数据删除失败", null);
}
}
/**
* @author
* @date 2019年2月15日下午9:51:50
* @param menu
* @return
*/
@Override
public GlobalResult updateMenuById(Menu menu) {
Integer updateCount = menuMapper.updateMenuById(menu);
if (updateCount != null && updateCount > 0) {
batchDel();
return new GlobalResult(200, "数据修改成功", null);
} else {
return new GlobalResult(400, "数据修改失败", null);
}
}
/**
* 根据key前缀批量删除缓存
*
* @return
*/
private void batchDel() {
try (Jedis jedis = jedisPool.getResource()) {
jedis.flushAll();
} catch (Exception ignored) {
}
}
/**
*
* @Title: cloneMenu
* @Description: 复制menu
* @author: 最后的轻语_dd43
* @param src
* @return
*/
private Menu cloneMenu(Menu src) {
Menu menu = new Menu();
menu.setIcon(src.getIcon());
menu.setMenuid(src.getMenuid());
menu.setMenuname(src.getMenuname());
menu.setUrl(src.getUrl());
menu.setMenus(new ArrayList<Menu>());
return menu;
}
@Override
public Menu findMenuByUserid(Integer userid) {
// 从缓存中读取数据
Jedis jedis = jedisPool.getResource();
Menu menu;
try {
String easyuiMenusJson = jedis.get("menusEasyui_" + userid);
if (easyuiMenusJson == null) {
// 获取根菜单
List<Menu> root = menuMapper.selectMenu("-1");
// 用户下的菜单集合 找数据库
// List<Menu> userMenus = menuMapper.selectMenuByUserid(userid);
// 用户下的菜单集合 找缓存
List<Menu> userMenus = findMenuListByUserid(userid);
// 根菜单
menu = cloneMenu(root.get(0));
// 暂存一级菜单
Menu _m1 = null;
// 暂存二级菜单
Menu _m2 = null;
// 获取全部的一级菜单
List<Menu> parentMenus = menuMapper.selectMenu("0");
// 循环一级菜单
for (Menu m1 : parentMenus) {
_m1 = cloneMenu(m1);
// 获取当前一级菜单的所有二级菜单
List<Menu> leafMenus = menuMapper.selectMenu(_m1.getMenuid());
// 循环匹配二级菜单
for (Menu m2 : leafMenus) {
for (Menu userMenu : userMenus) {
if (userMenu.getMenuid().equals(m2.getMenuid())) {
// 将二级菜单加入一级菜单
_m2 = cloneMenu(m2);
_m1.getMenus().add(_m2);
}
}
}
// 有二级菜单我们才加进来
if (_m1.getMenus().size() > 0) {
// 把一级菜单加入到根菜单下
menu.getMenus().add(_m1);
}
}
logger.debug("从数据库读取,设置缓存");
// System.out.println("从数据库读取,设置缓存");
jedis.set("menusEasyui_" + userid, JSON.toJSONString(menu));
} else {
menu = JSON.parseObject(easyuiMenusJson, Menu.class);
// menu = JSON.parseArray(easyuiMenusJson, Menu.class).get(0);
// System.out.println("从缓存读取");
logger.debug("从缓存读取");
}
} finally {
if(jedis!=null)jedis.close();
}
return menu;
}
@Override
public List<Menu> findMenuListByUserid(Integer userid) {
Jedis jedis = jedisPool.getResource();
List<Menu> menuList;
try {
String menuListJson = jedis.get("menusList_" + userid);
if (menuListJson == null) {
// 1.从数据库中查出来,放入缓存中
menuList = menuMapper.selectMenuByUserid(userid);
jedis.set("menusList_" + userid, JSON.toJSONString(menuList));
logger.debug("从数据库中查询menuList");
} else {
// 2.直接从缓存中拿
logger.debug("从缓存中查询menuList" + menuListJson);
menuList = JSON.parseArray(menuListJson, Menu.class);
}
} finally {
if(jedis!=null)jedis.close();
}
return menuList;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/service/impl/RoleServiceImpl.java
================================================
/**
* @Title: RoleServiceImpl.java
* @Package cn.lastwhisper.service.impl
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午2:52:25
* @version V1.0
*/
package cn.lastwhisper.modular.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import cn.lastwhisper.core.annotation.LogAnno;
import cn.lastwhisper.modular.vo.EasyUIDataGridResult;
import cn.lastwhisper.modular.vo.EasyUIOptionalTreeNode;
import cn.lastwhisper.modular.vo.GlobalResult;
import cn.lastwhisper.modular.mapper.MenuMapper;
import cn.lastwhisper.modular.mapper.RoleMapper;
import cn.lastwhisper.modular.pojo.Menu;
import cn.lastwhisper.modular.pojo.Role;
import cn.lastwhisper.modular.service.RoleService;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/**
* @ClassName: RoleServiceImpl
* @Description:TODO(这里用一句话描述这个类的作用)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@Service
public class RoleServiceImpl implements RoleService {
@Autowired
private RoleMapper roleMapper;
@Autowired
private MenuMapper menuMapper;
// @Autowired
// private Jedis jedis;
@Autowired
private JedisPool jedisPool;
@Transactional(propagation =Propagation.NOT_SUPPORTED)
@Override
public EasyUIDataGridResult findRolelistByPage(Integer page, Integer rows, Role role) {
// 1.分页查询
PageHelper.startPage(page, rows);
List<Role> list = roleMapper.selectRolelistByPage(role);
PageInfo<Role> pageInfo = new PageInfo<>(list);
// 2.封装EasyUIDataGridResult
EasyUIDataGridResult result = new EasyUIDataGridResult();
result.setTotal((int) pageInfo.getTotal());
result.setRows(pageInfo.getList());
// 3.返回分页的结果
return result;
}
@Transactional(propagation =Propagation.NOT_SUPPORTED)
@Override
public List<Role> findRoleName(String q) {
List<Role> list = roleMapper.selectRoleName(q);
return list;
}
@Override
public GlobalResult updateRole(Role role) {
try {
if (role != null) {
Integer row = roleMapper.updateRole(role);
if (row > 0) {
return new GlobalResult(200, "角色信息更新成功", null);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return new GlobalResult(400, "角色信息更新失败", null);
}
@Override
public GlobalResult addRole(Role role) {
if (role != null) {
Integer row = roleMapper.insertRole(role);
if (row > 0) {
return new GlobalResult(200, "角色信息添加成功", null);
}
}
return new GlobalResult(400, "角色信息添加失败", null);
}
@Transactional(propagation =Propagation.NOT_SUPPORTED)
@Override
public EasyUIDataGridResult findRoleList() {
List<Role> list = roleMapper.selectRoleList();
EasyUIDataGridResult result = new EasyUIDataGridResult();
result.setRows(list);
result.setTotal(list.size());
return result;
}
@Override
public GlobalResult deleteRoleById(Integer uuid) {
if (uuid == null) {
return new GlobalResult(400, "角色id为空,添加失败!", 400);
}
Integer integer = roleMapper.deleteRoleById(uuid);
if (integer == 0) {
return new GlobalResult(400, "用户删除失败", null);
} else {
return new GlobalResult(200, "用户删除成功", null);
}
}
@Override
public List<EasyUIOptionalTreeNode> findRoleMenuByRoleid(Integer roleUuid) {
// 1.根据角色id获取角色对应的菜单id
List<String> menuIdList = roleMapper.selectRoleMenuidByRoleid(roleUuid);
// 2.获取一级菜单
List<Menu> parentMenu = menuMapper.selectMenuIdName("0");
// 3.当前角色对象对应的菜单权限
List<EasyUIOptionalTreeNode> treeList = new ArrayList<EasyUIOptionalTreeNode>();
// 暂存一级菜单
EasyUIOptionalTreeNode t1 = null;
// 暂存二级菜单
EasyUIOptionalTreeNode t2 = null;
// 一级菜单遍历
for (Menu m1 : parentMenu) {
t1 = new EasyUIOptionalTreeNode();
t1.setId(m1.getMenuid());
t1.setText(m1.getMenuname());
List<Menu> leafMenu = menuMapper.selectMenuIdName(m1.getMenuid());
// 二级菜单遍历
for (Menu m2 : leafMenu) {
t2 = new EasyUIOptionalTreeNode();
t2.setId(m2.getMenuid());
t2.setText(m2.getMenuname());
// 如果角色下包含有这个权限菜单,让它勾选上
for (String menuId : menuIdList) {
if (m2.getMenuid().equals(menuId)) {
t2.setChecked(true);
}
}
t1.getChildren().add(t2);
}
treeList.add(t1);
}
return treeList;
}
@Override
public GlobalResult updateRoleMenu(Integer roleuuid, String checkedIds) {
Jedis jedis = jedisPool.getResource();
try {
// 清空角色下的权限菜单
roleMapper.deleteMenuidByRoleid(roleuuid);
// 权限角色id
if (checkedIds != null) {
String[] ids = checkedIds.split(",");
for (String menuUuid : ids) {
roleMapper.insertRolemenu(menuUuid, roleuuid);
}
}
List<Integer> userIdList = roleMapper.selectUseridByRoleuuid(roleuuid);
for (Integer userId : userIdList) {
jedis.del("menusEasyui_" + userId);
jedis.del("menusList_" + userId);
}
System.out.println("更新角色对应的对应的权限菜单 ,清除缓存");
} catch (Exception e) {
e.printStackTrace();
}finally {
if(jedis!=null)jedis.close();
}
return GlobalResult.build(200, "权限设置成功");
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/service/impl/UserServiceImpl.java
================================================
package cn.lastwhisper.modular.service.impl;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import cn.lastwhisper.core.annotation.LogAnno;
import cn.lastwhisper.modular.vo.EasyUIDataGridResult;
import cn.lastwhisper.modular.vo.EasyUIOptionalTreeNode;
import cn.lastwhisper.modular.vo.GlobalResult;
import cn.lastwhisper.modular.mapper.RoleMapper;
import cn.lastwhisper.modular.mapper.UserMapper;
import cn.lastwhisper.modular.pojo.Role;
import cn.lastwhisper.modular.pojo.User;
import cn.lastwhisper.modular.service.UserService;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/**
*
* @ClassName: UserServiceImpl
* @Description: 用户相关
* @author: 最后的轻语_dd43
* @date: 2019年4月30日
*/
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleMapper roleMapper;
@Autowired
private JedisPool jedisPool;
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public User findUserByCodeAndPwd(String user_code, String user_pwd) {
// 密码加密
user_pwd = encrypt(user_pwd, user_code);
System.out.println(user_pwd);
// 获取数据库用户信息
return userMapper.selectUserBycodeAndpwd(user_code, user_pwd);
}
/**
* 加密
*
* @param source 密码
* @param salt 账号
*/
private String encrypt(String source, String salt) {
int hashIterations = 2;
Md5Hash md5 = new Md5Hash(source, salt, hashIterations);
return md5.toString();
}
@RequiresPermissions("用户管理")
@Override
public GlobalResult addUser(User user) {
if (user == null) {
return new GlobalResult(400, "用户信息为空,添加失败!", null);
}
// 密码不为空时,对密码进行加密
if ("".equals(user.getUser_pwd())) {
user.setUser_pwd(null);
} else {
String user_pwd = encrypt(user.getUser_pwd(), user.getUser_code());
user.setUser_pwd(user_pwd);
}
Integer integer = userMapper.insertUser(user);
if (integer == 0) {
return new GlobalResult(400, "用户添加失败", null);
} else {
return new GlobalResult(200, "用户添加成功", null);
}
}
@RequiresPermissions("用户管理")
@Override
public GlobalResult updateUser(User user) {
if (user == null) {
return new GlobalResult(400, "用户信息为空,修改失败!", 400);
}
// 密码不为空时,对密码进行加密
if ("".equals(user.getUser_pwd())) {
user.setUser_pwd(null);
} else {
String user_pwd = encrypt(user.getUser_pwd(), user.getUser_code());
user.setUser_pwd(user_pwd);
}
Integer integer = userMapper.updateUser(user);
if (integer == 0) {
return new GlobalResult(400, "用户信息更新失败", null);
} else {
return new GlobalResult(200, "用户信息更新成功", null);
}
}
@RequiresPermissions("用户管理")
@Override
public GlobalResult deleteUser(Integer user_id) {
try (Jedis jedis = jedisPool.getResource()) {
if (user_id == null) {
return new GlobalResult(400, "用户id为空,添加失败!", 400);
}
Integer integer = userMapper.deleteUserById(user_id);
if (integer == 0) {
return new GlobalResult(400, "用户删除失败", null);
} else {
// 删除用户下的所有角色
userMapper.deleteUserRole(user_id);
// 删除用户下的所有缓存
jedis.del("menusEasyui_" + user_id);
jedis.del("menusList_" + user_id);
return new GlobalResult(200, "用户删除成功", null);
}
}
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public EasyUIDataGridResult findUserlistByPage(User user, Integer page, Integer rows) {
PageHelper.startPage(page, rows);
List<User> list = userMapper.selectUserlistByPage(user);
PageInfo<User> pageInfo = new PageInfo<>(list);
EasyUIDataGridResult result = new EasyUIDataGridResult();
result.setTotal((int) pageInfo.getTotal());
result.setRows(pageInfo.getList());
return result;
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public List<User> findUserName(String q) {
return userMapper.selectUserName(q);
}
@LogAnno(operateType = "更新用户密码")
@Override
public GlobalResult updatePwd(User user, String oldPwd, String newPwd) {
String msg = "用户未登录";
// 用户登录了
if (user != null) {
String encryptOldPwd = encrypt(oldPwd, user.getUser_code());
// 用户密码正确
if (encryptOldPwd.equals(user.getUser_pwd())) {
String user_pwd = encrypt(newPwd, user.getUser_code());
Integer row = userMapper.updatePwdById(user.getUser_id(), user_pwd);
if (row > 0) {
return new GlobalResult(200, "密码修改成功", null);
} else {
msg = "密码修改失败";
}
} else {
msg = "密码错误";
}
}
return new GlobalResult(400, msg, null);
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public List<EasyUIOptionalTreeNode> findUserRole(Integer user_id) {
// 1.获取当前用户的所有角色
List<Role> userRoleList = userMapper.selectUserRole(user_id);
// 2.获取系统中所有角色
List<Role> roleList = roleMapper.selectRoleList();
// 3.设置返回值
List<EasyUIOptionalTreeNode> treeList = new ArrayList<EasyUIOptionalTreeNode>();
EasyUIOptionalTreeNode t1 = null;
// 4.封装返回值将用户对应的角色设置为true
for (Role role : roleList) {
t1 = new EasyUIOptionalTreeNode();
t1.setId(role.getUuid() + "");
t1.setText(role.getName());
// 如果用户拥有这个角色,设为true
for (Role userRole : userRoleList) {
if (userRole.getUuid().equals(role.getUuid())) {
t1.setChecked(true);
}
}
treeList.add(t1);
}
return treeList;
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public List<Role> findUserRoleByUserid(Integer user_id) {
return userMapper.selectUserRole(user_id);
}
@LogAnno(operateType = "更新用户对应角色")
@Override
public GlobalResult updateUserRole(Integer user_id, String checkedIds) {
try (Jedis jedis = jedisPool.getResource()) {
// 先删除用户下的所有角色
userMapper.deleteUserRole(user_id);
if (checkedIds != null) {
String[] ids = checkedIds.split(",");
for (String roleuuid : ids) {
// 设置用户的角色
userMapper.insertUserRole(user_id, Integer.parseInt(roleuuid));
}
}
// 清除缓存
jedis.del("menusEasyui_" + user_id);
jedis.del("menusList_" + user_id);
System.out.println("更新用户对应的角色 ,清除缓存");
} catch (Exception e) {
e.printStackTrace();
}
return GlobalResult.build(200, "保存成功");
}
/**
* 导出excel文件
*/
@LogAnno(operateType = "excel导出用户信息")
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public void export(OutputStream os, User user) {
// 获取所有供应商信息
List<User> UserList = userMapper.selectUserlistByPage(user);
// 1.创建excel工作薄
HSSFWorkbook wk = new HSSFWorkbook();
// 2.创建一个工作表
HSSFSheet sheet = wk.createSheet("系统用户");
// 3.写入表头
HSSFRow row = sheet.createRow(0);
// 表头
String[] headerName = { "账号", "密码", "真实姓名 ", "出生日期 " };
// 列宽
int[] columnWidths = { 6000, 6000, 6000, 6000 };
HSSFCell cell = null;
for (int i = 0; i < headerName.length; i++) {
// 创建表头单元格
cell = row.createCell(i);
// 向表头单元格写值
cell.setCellValue(headerName[i]);
sheet.setColumnWidth(i, columnWidths[i]);
}
// 4.向内容单元格写值
int i = 1;
for (User u : UserList) {
row = sheet.createRow(i);
row.createCell(0).setCellValue(u.getUser_code());// 账号
row.createCell(1).setCellValue("********");// 密码
if (u.getUser_name() != null) {
row.createCell(2).setCellValue(u.getUser_name());// "真实姓名
}
if (u.getUser_birthday() != null) {
HSSFCellStyle style_date = wk.createCellStyle();
DataFormat df = wk.createDataFormat();
style_date.setDataFormat(df.getFormat("yyyy-MM-dd"));
row.createCell(3).setCellValue(u.getUser_birthday());// 出生日期
sheet.getRow(i).getCell(3).setCellStyle(style_date);
}
i++;
}
try {
// 写入到输出流中
wk.write(os);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭工作簿
wk.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 数据导入
*/
@LogAnno(operateType = "excel导入用户信息")
@Override
public void doImport(InputStream is) throws IOException {
HSSFWorkbook wb = null;
try {
wb = new HSSFWorkbook(is);
HSSFSheet sheet = wb.getSheetAt(0);
// 读取数据
// 最后一行的行号
int lastRow = sheet.getLastRowNum();
User user = null;
for (int i = 1; i <= lastRow; i++) {
// 账号
user = new User();
user.setUser_code(sheet.getRow(i).getCell(0).getStringCellValue());
// 判断是否已经存在,通过账号来判断
List<User> list = userMapper.selectUserByUserCode(user.getUser_code());
if (list.size() > 0) {
// 说明存在用户,需要更新
user = list.get(0);
}
HSSFCell cell = null;
// 密码
cell = sheet.getRow(i).getCell(1);
cell.setCellType(CellType.STRING);
if(!cell.getStringCellValue().equals("********")) {
user.setUser_pwd(encrypt(cell.getStringCellValue(), user.getUser_code()));
}
// 真实姓名
cell = sheet.getRow(i).getCell(2);
cell.setCellType(CellType.STRING);
user.setUser_name(sheet.getRow(i).getCell(2).getStringCellValue());
// 出生日期
cell = sheet.getRow(i).getCell(3);
cell.setCellType(CellType.NUMERIC);
// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
// Date birthday = df.parse(sheet.getRow(i).getCell(3).getDateCellValue());
user.setUser_birthday(sheet.getRow(i).getCell(3).getDateCellValue());
if (list.size() == 0) {
// 说明不存在用户信息,需要新增
userMapper.insertUser(user);
} else {
// 更新用户信息
userMapper.updateUserByUserCode(user);
}
}
} finally {
if (null != wb) {
try {
wb.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/vo/EasyUIDataGridResult.java
================================================
/**
* @Title: RoleService.java
* @Package cn.lastwhisper.service
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午2:45:32
* @version V1.0
*/
package cn.lastwhisper.modular.vo;
import java.io.Serializable;
import java.util.List;
/**
*
* @ClassName: EasyUIDataGridResult
* @Description:easyui分页
* @author: 最后的轻语_dd43
* @date: 2019年4月6日
*/
public class EasyUIDataGridResult implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 数据库中总记录数
*/
private Integer total;
/**
* 当前页数据
*/
private List<?> rows;
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public List<?> getRows() {
return rows;
}
public void setRows(List<?> rows) {
this.rows = rows;
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/vo/EasyUIOptionalTreeNode.java
================================================
/**
* @Title: RoleService.java
* @Package cn.lastwhisper.service
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午2:45:32
* @version V1.0
*/
package cn.lastwhisper.modular.vo;
import java.util.ArrayList;
import java.util.List;
public class EasyUIOptionalTreeNode {
private String id;// 菜单id
private String text;// 菜单名称
private boolean checked;// 是否为选中
private List<EasyUIOptionalTreeNode> children = new ArrayList<EasyUIOptionalTreeNode>();// 下级菜单
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
public List<EasyUIOptionalTreeNode> getChildren() {
return children;
}
public void setChildren(List<EasyUIOptionalTreeNode> children) {
this.children = children;
}
@Override
public String toString() {
return "EasyUIOptionalTreeNode [id=" + id + ", text=" + text + ", checked=" + checked + ", children=" + children
+ "]";
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/vo/GlobalResult.java
================================================
/**
* @Title: RoleService.java
* @Package cn.lastwhisper.service
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年4月6日 下午2:45:32
* @version V1.0
*/
package cn.lastwhisper.modular.vo;
import java.io.Serializable;
/**
*
* @ClassName: GlobalResult
* @Description:全局返回值
* @author: 最后的轻语_dd43
* @date: 2019年4月5日
*/
public class GlobalResult implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
// 响应业务状态
private Integer status;
// 响应消息
private String msg;
// 响应中的数据
private Object data;
public static GlobalResult build(Integer status, String msg, Object data) {
return new GlobalResult(status, msg, data);
}
public static GlobalResult ok(Object data) {
return new GlobalResult(data);
}
public static GlobalResult ok() {
return new GlobalResult(null);
}
public GlobalResult() {
}
public static GlobalResult build(Integer status, String msg) {
return new GlobalResult(status, msg, null);
}
public GlobalResult(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public GlobalResult(Object data) {
this.status = 200;
this.msg = "OK";
this.data = data;
}
public Boolean isOK() {
return this.status == 200;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "ManagerResult [status=" + status + ", msg=" + msg + ", data=" + data + "]";
}
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/vo/Tree.java
================================================
package cn.lastwhisper.modular.vo;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import cn.lastwhisper.modular.pojo.Menu;
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class Tree {
private String id;//菜单id
private String text;//菜单名称
private Integer status;//是否已删除
private boolean checked;//是否为选中
private List<Menu> children;// 下级菜单
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
public List<Menu> getChildren() {
if(null == children) {
children = new ArrayList<>();
}
return children;
}
public void setChildren(List<Menu> children) {
this.children = children;
}
@Override
public String toString() {
return "Tree [id=" + id + ", text=" + text + ", status=" + status + ", checked=" + checked + ", children="
+ children + "]";
}
}
================================================
FILE: src/main/resources/applicationContext.xml
================================================
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<!-- 加载配置文件 -->
<!-- <context:property-placeholder location="classpath:db-local.properties" />-->
<context:property-placeholder location="classpath:db.properties" />
<!-- 注解开发 -->
<!-- 自动扫描组件,这里要把controler下面的 controller去除,他们是在spring3-servlet.xml中配置的,如果不去除会影响事务管理的。 -->
<context:component-scan
base-package="cn.lastwhisper.*">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 数据源,使用Druid -->
<bean id="dataSource"
class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="maxActive" value="20" />
<property name="initialSize" value="20" />
<property name="minIdle" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxOpenPreparedStatements" value="20" />
<!-- 配置监控统计拦截的filters,和防sql注入 -->
<property name="filters" value="stat,wall" />
</bean>
<!-- sqlSessinFactory -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的配置文件 -->
<property name="configLocation"
value="classpath:sqlMapConfig.xml" />
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置mapper扫描,并创建mapper.java的实例对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"
value="cn.lastwhisper.modular.mapper" />
<property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory" />
</bean>
<!-- 事务管理器 对mybatis操作数据库事务控制,spring使用jdbc的事务控制类 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启注解AOP -->
<aop:aspectj-autoproxy/>
<!-- 注解方式配置事物,为了配合自定义注解 -->
<tx:annotation-driven
transaction-manager="transactionManager" proxy-target-class="true"
order="200" />
<!--开启任务调度-->
<task:annotation-driven/>
</beans>
================================================
FILE: src/main/resources/applicationContext_jedis.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--JedisPool这个bean的构造方法需要多个参数-->
<bean class="redis.clients.jedis.JedisPool" id="jedisPool" >
<constructor-arg name="host" value="${redis.host}"/>
<constructor-arg name="port" value="${redis.port}"/>
<!-- <constructor-arg name="password" value="${redis.password}"/>-->
<constructor-arg name="timeout" value="${redis.timeout}"/>
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
</bean>
<bean class="redis.clients.jedis.JedisPoolConfig" id="jedisPoolConfig">
<property name="maxIdle" value="${maxIdle}" />
<property name="maxTotal" value="${maxActive}" />
<property name="maxWaitMillis" value="${maxWait}" />
<property name="testOnBorrow" value="${testOnBorrow}" />
<property name="blockWhenExhausted" value="${blockWhenExhausted}" />
</bean>
</beans>
================================================
FILE: src/main/resources/applicationContext_shiro.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- shiro的过滤工厂,相当默认的加载了9个过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 安全管理器,shiro核心组件(大脑) Facade模式 -->
<property name="securityManager" ref="securityManager"/>
<!-- 用户如果没有登陆,当他在访问资源的时候,就会自动跳转到登陆的页面 -->
<property name="loginUrl" value="/login.html"/>
<!-- 当用户没有访问某项资源权限的时候,跳转到该页面 -->
<property name="unauthorizedUrl" value="/error.html"/>
<property name="successUrl" value="/index.html"/>
<!-- 过滤链的定义:定义URL访问的时候对应的认证或授权时处理的过滤器 -->
<property name="filterChainDefinitions">
<value>
/error.html = anon
/login.html = anon
/index.html = anon
/user.html = perms["用户管理"]
/user/user* = perms["用户管理"]
/role.html = perms["角色管理"]
/role/role* = perms["角色管理"]
/menu.html = perms["菜单管理"]
/menu/menu* = perms["菜单管理"]
/roleMenuSet.html = perms["角色权限管理"]
/role/findRoleMenuByRoleid = perms["角色权限管理"]
/role/role/updateRoleMenu = perms["角色权限管理"]
/userRoleSet.html = perms["用户角色管理"]
/user/findUserRole = perms["用户角色管理"]
/user/updateUserRole = perms["用户角色管理"]
/log.html = perms["日志管理"]
/log/* = perms["日志管理"]
/druid/index.html = perms["数据库监控"]
/dept.html = perms["部门"]
/emp.html = perms["员工"]
/sale.html = perms["销售额统计"]
/casual.html = perms["临时工计件"]
/*.html = authc
/menu/* = authc
/*=authc
</value>
</property>
</bean>
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="realm"/>
</bean>
<!-- 自定义的realm -->
<bean id="realm" class="cn.lastwhisper.core.shiro.Realm"/>
<!-- 启动shiro注解 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
<!-- 默认使用JDK代理 ,如被代理类没有实现接口,必须使用下列配置开启 cglib代理 -->
<property name="proxyTargetClass" value="true"/>
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
<!-- 对安全管理器 增强代码 , spring 后处理器 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
</beans>
================================================
FILE: src/main/resources/db-local.properties
================================================
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://mysql:3306/permission
jdbc.username=root
jdbc.password=391054950.gg
#ip地址
redis.host=redis
#端口号
redis.port=6379
#如果有密码
redis.password=
#客户端超时时间单位是毫秒 默认是2000
redis.timeout=3000
#最大空闲数
maxIdle=300
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
maxActive=1000
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
maxTotal=1000
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
maxWait=1000
#在空闲时检查有效性, 默认false
testOnBorrow=false
#连接耗尽是否阻塞,false代表抛异常,true代表阻塞直到超时,默认为true
blockWhenExhausted=false
#下面的不是必须的配置
#连接的最小空闲时间 默认1800000毫秒(30分钟)
minEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
numTestsPerEvictionRun=1024
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
timeBetweenEvictionRunsMillis=30000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个,数据量大的时候建议关闭
testWhileIdle=true
================================================
FILE: src/main/resources/db.properties
================================================
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://mysql:3306/permission
jdbc.username=root
jdbc.password=root
#ip地址
redis.host=redis
#端口号
redis.port=6379
#如果有密码
redis.password=
#客户端超时时间单位是毫秒 默认是2000
redis.timeout=3000
#最大空闲数
maxIdle=300
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
maxActive=1000
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
maxTotal=1000
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
maxWait=1000
#在空闲时检查有效性, 默认false
testOnBorrow=false
#连接耗尽是否阻塞,false代表抛异常,true代表阻塞直到超时,默认为true
blockWhenExhausted=false
#下面的不是必须的配置
#连接的最小空闲时间 默认1800000毫秒(30分钟)
minEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
numTestsPerEvictionRun=1024
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
timeBetweenEvictionRunsMillis=30000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个,数据量大的时候建议关闭
testWhileIdle=true
================================================
FILE: src/main/resources/log4j.properties
================================================
# Global logging configuration\uff0c\u5efa\u8bae\u5f00\u53d1\u73af\u5883\u4e2d\u8981\u7528debug
log4j.rootLogger=INFO, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
[java] view plain copy
<span style="font-size:12px;">log4j.rootLogger = ${log.level},Console,default,allfile
log4j.logger.com.ibatis=info
log4j.logger.java.sql=info
log4j.logger.cn.lastwhisper=info
================================================
FILE: src/main/resources/reset.sql
================================================
SET NAMES utf8mb4;
truncate table `menu`;
truncate table `role`;
truncate table `role_menu`;
truncate table `user`;
truncate table `user_role`;
---------------------------
-- Records of menu
-- ----------------------------
INSERT INTO `menu` VALUES ('0', '系统菜单', '-', 'icon-sys', '-1', 1);
INSERT INTO `menu` VALUES ('100', '系统管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('101', '用户管理', 'user.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('102', '角色管理', 'role.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('103', '菜单管理', 'menu.html', 'icon-log', '100', 1);
INSERT INTO `menu` VALUES ('104', '角色权限管理', 'roleMenuSet.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('105', '用户角色管理', 'userRoleSet.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('106', '日志管理', 'log.html', 'icon-log', '100', 1);
INSERT INTO `menu` VALUES ('107', '数据库监控', 'druid/index.html', 'icon-log', '100', 0);
INSERT INTO `menu` VALUES ('200', '人事管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('201', '部门', 'dept.html', 'icon-log', '200', 0);
INSERT INTO `menu` VALUES ('202', '员工', 'emp.html', 'icon-log', '200', 0);
INSERT INTO `menu` VALUES ('300', '销售管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('301', '销售额统计', 'sale.html', 'icon-log', '300', 0);
INSERT INTO `menu` VALUES ('400', '临时工管理', '-', 'icon-sys', '0', 1);
INSERT INTO `menu` VALUES ('401', '临时工计件', 'casual.html', 'icon-log', '400', 0);
-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES (1, '系统管理员');
INSERT INTO `role` VALUES (2, '经理');
INSERT INTO `role` VALUES (3, '销售主管');
INSERT INTO `role` VALUES (4, '销售员');
INSERT INTO `role` VALUES (5, '临时工');
-- ----------------------------
-- Records of role_menu
-- ----------------------------
INSERT INTO `role_menu` VALUES ('100', 1);
INSERT INTO `role_menu` VALUES ('101', 1);
INSERT INTO `role_menu` VALUES ('102', 1);
INSERT INTO `role_menu` VALUES ('103', 1);
INSERT INTO `role_menu` VALUES ('104', 1);
INSERT INTO `role_menu` VALUES ('105', 1);
INSERT INTO `role_menu` VALUES ('106', 1);
INSERT INTO `role_menu` VALUES ('107', 1);
INSERT INTO `role_menu` VALUES ('200', 2);
INSERT INTO `role_menu` VALUES ('201', 2);
INSERT INTO `role_menu` VALUES ('202', 2);
INSERT INTO `role_menu` VALUES ('300', 3);
INSERT INTO `role_menu` VALUES ('301', 3);
INSERT INTO `role_menu` VALUES ('300', 4);
INSERT INTO `role_menu` VALUES ('301', 4);
INSERT INTO `role_menu` VALUES ('400', 5);
INSERT INTO `role_menu` VALUES ('401', 5);
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (221, 'admin', '我是系统管理员', '3ef7164d1f6167cb9f2658c07d3c2f0a', '2019-04-04');
INSERT INTO `user` VALUES (262, 'manager', '我是经理', 'bb2ec153e560c6cb94a35b370eb7a07b', '2019-05-02');
INSERT INTO `user` VALUES (263, 'salemanager', '我是销售主管', '40fd0e9ba2e7241cb04c49a7663464c1', '2019-05-06');
INSERT INTO `user` VALUES (264, 'saler', '我是销售员', '846366204c8cc44abdedf5f201da0b00', '2019-05-20');
INSERT INTO `user` VALUES (265, 'casual', '我是临时工', '130131080b677e15df326f8114c426a3', '2019-05-04');
-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES (265, 5);
INSERT INTO `user_role` VALUES (264, 4);
INSERT INTO `user_role` VALUES (263, 3);
INSERT INTO `user_role` VALUES (262, 2);
INSERT INTO `user_role` VALUES (221, 1);
INSERT INTO `user_role` VALUES (221, 5);
================================================
FILE: src/main/resources/springmvc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
<!-- 扫描所有的controller 但是不扫描service -->
<context:component-scan
base-package="cn.lastwhisper.modular.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>
<!-- 注解实例化控制层 -->
<mvc:annotation-driven />
<!-- 配置多媒体处理器 -->
<!-- 注意:这里id必须填写:multipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 最大上传文件大小 -->
<property name="maxUploadSize" value="8388608" />
</bean>
</beans>
================================================
FILE: src/main/resources/sqlMapConfig.xml
================================================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 全局性设置懒加载。如果设为‘false',则所有相关联的都会被初始化加载。 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 当设置为‘true'的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 -->
<setting name="aggressiveLazyLoading" value="false" />
</settings>
<!-- 配置别名 -->
<typeAliases>
<!-- 批量扫描别名 -->
<package name="cn.lastwhisper.modular.pojo" />
</typeAliases>
<!-- 由于整合不在此处扫描mapper包 -->
<!-- 配置分页插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
================================================
FILE: src/main/webapp/WEB-INF/web.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>permission</display-name>
<!-- Spring初始化 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.liveBeansView.mbeanDomain</param-name>
<param-value>dev</param-value>
</context-param>
<!-- shiro过滤器 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>*.html</url-pattern>
<url-pattern>*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
<url-pattern>/adminjs/*</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/images/*</url-pattern>
<url-pattern>/js/*</url-pattern>
<url-pattern>/ui/*</url-pattern>
</servlet-mapping>
<!-- springmvc初始化 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- post请求utf-8编码 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- druid监控 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<!-- 添加Web应用等监控 -->
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
<init-param>
<param-name>profileEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>principalCookieName</param-name>
<param-value>USER_COOKIE</param-value>
</init-param>
<init-param>
<param-name>principalSessionName</param-name>
<param-value>USER_SESSION</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>login.html</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
================================================
FILE: src/main/webapp/adminjs/index.js
================================================
window.onload = function () {
$('#loading-mask').fadeOut();
};
var onlyOpenTitle = "欢迎使用";// 不允许关闭的标签的标题
var _menus = {
"icon": "icon-sys",
"menuid": "0",
"menuname": "系统菜单",
"menus": [{
"icon": "icon-sys",
"menuid": "100",
"menuname": "基础数据",
"menus": [{
"icon": "icon-sys",
"menuid": "101",
"menuname": "商品类型管理",
"url": "goodstype.html"
}, {
"icon": "icon-sys",
"menuid": "102",
"menuname": "商品管理",
"url": "goods.html"
}]
}]
};
var interval = '';
$(function () {
// 显示登陆用户名
showName();
// 获取菜单数据
$.ajax({
url: 'menu/loadMenus',
type: 'post',
dataType: 'json',
success: function (rtn) {
// 给菜单赋值
_menus = rtn;
InitLeftMenu();
}
});
// 初始化标签页
tabClose();
tabCloseEven();
// 安全退出
$('#loginOut').bind('click', function () {
$.ajax({
url: 'user/logout',
success: function () {
location.href = "login.html";
}
});
});
// 定时加载start的弹窗
// start();
// interval = window.setInterval(function () {
// start();
// }, 7000);
});
/**
* 取消定时任务
*/
function cancelStart() {
window.clearInterval(interval);
}
/**
* 页面加载时右下角弹出提示审批框操作
*/
function start() {
$.messager.show({
title: '公告',
msg: '测试消息:<font size="4" > 给个start呗 </font><br />' +
' <a target="_blank" style="color:red;size:3" href="https://github.com/ggb2312/Permission" >给</a> ' +
' <a href="javascript:void(0);">不给</a>' +
' <a href="javascript:void(0);" onclick="cancelStart()">不在弹出</a>',
timeout: 5000,
showType: 'slide',
});
}
/**
* 显示登陆用户名
*/
function showName() {
$.ajax({
url: 'user/showName',
dataType: 'json',
contentType: 'utf-8',
success: function (rtn) {
if (rtn.status == 200) {
$('#user_name').html(rtn.msg);
} else if (rtn.status == 400) {
$.messager.confirm('确认对话框', '您未登录,请先登录系统!!!', function (r) {
if (r) {
window.location.href = "login.html";
} else {
window.location.href = "login.html";
}
});
}
}
});
}
// 初始化左侧
function InitLeftMenu() {
$("#nav").accordion({
animate: true,
fit: true,
border: true
});
var selectedPanelname = '';
$.each(_menus.menus, function (i, n) {
var menulist = '';
menulist += '<ul class="navlist">';
$.each(n.menus, function (j, o) {
menulist += '<li><div ><a ref="' + o.menuid + '" href="#" rel="'
+ o.url + '" ><span class="icon ' + o.icon
+ '" > </span><span class="nav">' + o.menuname
+ '</span></a></div> ';
// if(o.child && o.child.length>0) {
// // li.find('div').addClass('icon-arrow');
//
// menulist += '<ul class="third_ul">';
// $.each(o.child,function(k,p){ menulist += '<li><div><a
// ref="'+p.menuid+'" href="#" rel="' + p.url + '" ><span
// class="icon '+p.icon+'" > </span><span class="nav">' +
// p.menuname + '</span></a></div> </li>' }); menulist += '</ul>'; }
menulist += '</li>';
})
menulist += '</ul>';
$('#nav').accordion('add', {
title: n.menuname,
content: menulist,
border: false,
iconCls: 'icon ' + n.icon
});
if (i == 0)
selectedPanelname = n.menuname;
});
$('#nav').accordion('select', selectedPanelname);
$('.navlist li a').click(function () {
var tabTitle = $(this).children('.nav').text();
var url = $(this).attr("rel");
var menuid = $(this).attr("ref");
var icon = $(this).find('.icon').attr('class');
var third = find(menuid);
if (third && third.child && third.child.length > 0) {
$('.third_ul').slideUp();
var ul = $(this).parent().next();
if (ul.is(":hidden"))
ul.slideDown();
else
ul.slideUp();
} else {
addTab(tabTitle, url, icon);
$('.navlist li div').removeClass("selected");
$(this).parent().addClass("selected");
}
}).hover(function () {
$(this).parent().addClass("hover");
}, function () {
$(this).parent().removeClass("hover");
});
// 选中第一个
// var panels = $('#nav').accordion('panels');
// var t = panels[0].panel('options').title;
// $('#nav').accordion('select', t);
}
// 获取左侧导航的图标
function getIcon(menuid) {
var icon = 'icon ';
$.each(_menus.menus, function (i, n) {
$.each(n.menus, function (j, o) {
if (o.menuid == menuid) {
icon += o.icon;
}
})
})
return icon;
}
function find(menuid) {
var obj = null;
$.each(_menus.menus, function (i, n) {
$.each(n.menus, function (j, o) {
if (o.menuid == menuid) {
obj = o;
}
});
});
return obj;
}
function addTab(subtitle, url, icon) {
if (!$('#tabs').tabs('exists', subtitle)) {
$('#tabs').tabs('add', {
title: subtitle,
content: createFrame(url),
closable: true,
icon: icon
});
} else {
$('#tabs').tabs('select', subtitle);
$('#mm-tabupdate').click();
}
tabClose();
}
function createFrame(url) {
var s = '<iframe scrolling="auto" frameborder="0" src="' + url
+ '" style="width:100%;height:100%;"></iframe>';
return s;
}
function tabClose() {
/* 双击关闭TAB选项卡 */
$(".tabs-inner").dblclick(function () {
var subtitle = $(this).children(".tabs-closable").text();
$('#tabs').tabs('close', subtitle);
})
/* 为选项卡绑定右键 */
$(".tabs-inner").bind('contextmenu', function (e) {
$('#mm').menu('show', {
left: e.pageX,
top: e.pageY
});
var subtitle = $(this).children(".tabs-closable").text();
$('#mm').data("currtab", subtitle);
$('#tabs').tabs('select', subtitle);
return false;
});
}
// 绑定右键菜单事件
function tabCloseEven() {
$('#mm').menu({
onClick: function (item) {
closeTab(item.id);
}
});
return false;
}
function closeTab(action) {
var alltabs = $('#tabs').tabs('tabs');
var currentTab = $('#tabs').tabs('getSelected');
var allTabtitle = [];
$.each(alltabs, function (i, n) {
allTabtitle.push($(n).panel('options').title);
})
switch (action) {
case "refresh":
var iframe = $(currentTab.panel('options').content);
var src = iframe.attr('src');
$('#tabs').tabs('update', {
tab: currentTab,
options: {
content: createFrame(src)
}
})
break;
case "close":
var currtab_title = currentTab.panel('options').title;
$('#tabs').tabs('close', currtab_title);
break;
case "closeall":
$.each(allTabtitle, function (i, n) {
if (n != onlyOpenTitle) {
$('#tabs').tabs('close', n);
}
});
break;
case "closeother":
var currtab_title = currentTab.panel('options').title;
$.each(allTabtitle, function (i, n) {
if (n != currtab_title && n != onlyOpenTitle) {
$('#tabs').tabs('close', n);
}
});
break;
case "closeright":
var tabIndex = $('#tabs').tabs('getTabIndex', currentTab);
if (tabIndex == alltabs.length - 1) {
alert('亲,后边没有啦 ^@^!!');
return false;
}
$.each(allTabtitle, function (i, n) {
if (i > tabIndex) {
if (n != onlyOpenTitle) {
$('#tabs').tabs('close', n);
}
}
});
break;
case "closeleft":
var tabIndex = $('#tabs').tabs('getTabIndex', currentTab);
if (tabIndex == 1) {
alert('亲,前边那个上头有人,咱惹不起哦。 ^@^!!');
return false;
}
$.each(allTabtitle, function (i, n) {
if (i < tabIndex) {
if (n != onlyOpenTitle) {
$('#tabs').tabs('close', n);
}
}
});
break;
case "exit":
$('#closeMenu').menu('hide');
break;
}
}
// 弹出信息窗口 title:标题 msgString:提示信息 msgType:信息类型 [error,info,question,warning]
function msgShow(title, msgString, msgType) {
$.messager.alert(title, msgString, msgType);
}
// 设置登录窗口
function openPwd() {
$('#w').dialog({
title: '修改密码',
width: 300,
height: 180,
modal: true,
closed: true,
buttons: [{
text: '保存',
iconCls: 'icon-save',
handler: function () {
// 提交保存
var oldPwd = $('#txtOldPass').val();
var newPwd = $('#txtNewPass').val();
var rePwd = $('#txtRePass').val();
if (oldPwd === '') {
$.messager.alert('提示', '原密码不能为空', 'info');
return;
}
if (newPwd === '') {
$.messager.alert('提示', '新密码不能为空', 'info');
return;
}
if (rePwd !== newPwd) {
$.messager.alert('提示', '确认密码不一致', 'info');
return;
}
$.ajax({
url: 'user/updatePwd',
data: {
"oldPwd": oldPwd,
"newPwd": newPwd
},
dataType: 'json',
type: 'post',
success: function (rtn) {
$.messager.alert('提示', rtn.msg, 'info', function () {
if (rtn.status === 200) {
$('#w').dialog('close');
// 清空内容
$('#txtOldPass').val('');
$('#txtNewPass').val('');
$('#txtRePass').val('');
}
});
}
});
}
}, {
text: '关闭',
iconCls: 'icon-cancel',
handler: function () {
}
}]
});
}
// 关闭登录窗口
function closePwd() {
$('#w').window('close');
}
// 修改密码
function serverLogin() {
var $newpass = $('#txtNewPass');
var $rePass = $('#txtRePass');
if ($newpass.val() === '') {
msgShow('系统提示', '请输入密码!', 'warning');
return false;
}
if ($rePass.val() === '') {
msgShow('系统提示', '请在一次输入密码!', 'warning');
return false;
}
if ($newpass.val() !== $rePass.val()) {
msgShow('系统提示', '两次密码不一至!请重新输入', 'warning');
return false;
}
$.post('/ajax/editpassword.ashx?newpass=' + $newpass.val(), function (msg) {
msgShow('系统提示', '恭喜,密码修改成功!<br>您的新密码为:' + msg, 'info');
$newpass.val('');
$rePass.val('');
close();
})
}
$(function () {
openPwd();
$('#editpass').click(function () {
$('#w').window('open');
});
$('#btnEp').click(function () {
serverLogin();
});
$('#btnCancel').click(function () {
closePwd();
})
});
================================================
FILE: src/main/webapp/adminjs/themes/default/accordion.css
================================================
.accordion{
background:#fff;
overflow:hidden;
}
.accordion .accordion-header{
background:#E0ECFF;
border-top-width:0;
cursor:pointer;
}
.accordion .accordion-header .panel-title{
font-weight:normal;
}
.accordion .accordion-header-selected .panel-title{
font-weight:bold;
}
.accordion-noborder .accordion-header{
border-width:0 0 1px;
}
.accordion-noborder .accordion-body{
border-width:0px;
}
.accordion-collapse{
background:url('images/accordion_collapse.png') no-repeat;
}
.accordion-expand{
background:url('images/accordion_expand.png') no-repeat;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/calendar.css
================================================
.calendar{
background:#fff;
border:1px solid #A4BED4;
padding:1px;
overflow:hidden;
}
.calendar-noborder{
border:0px;
}
.calendar-header{
position:relative;
background:#E0ECFF;
font-size:12px;
height:22px;
}
.calendar-title{
text-align:center;
height:22px;
}
.calendar-title span{
position:relative;
top:2px;
line-height:12px;
display:inline-block;
padding:3px;
cursor:pointer;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
.calendar-prevmonth,.calendar-nextmonth,.calendar-prevyear,.calendar-nextyear{
position:absolute;
top:4px;
width:14px;
height:14px;
line-height:12px;
cursor:pointer;
font-size:1px;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
.calendar-prevmonth{
left:20px;
background:url('images/calendar_prevmonth.gif') no-repeat 3px 2px;
}
.calendar-nextmonth{
right:20px;
background:url('images/calendar_nextmonth.gif') no-repeat 3px 2px;
}
.calendar-prevyear{
left:3px;
background:url('images/calendar_prevyear.gif') no-repeat 1px 2px;
}
.calendar-nextyear{
right:3px;
background:url('images/calendar_nextyear.gif') no-repeat 1px 2px;
}
.calendar-body{
font-size:12px;
position:relative;
}
.calendar-body table{
width:100%;
height:100%;
border:1px solid #eee;
font-size:12px;
}
.calendar-body th,.calendar-body td{
text-align:center;
}
.calendar-body th{
background:#fafafa;
color:#888;
}
.calendar-day{
color:#222;
cursor:pointer;
border:1px solid #fff;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
.calendar-sunday{
color:#CC2222;
}
.calendar-saturday{
color:#00ee00;
}
.calendar-today{
color:#0000ff;
}
.calendar-other-month{
opacity:0.3;
filter:alpha(opacity=30);
}
.calendar-hover{
border:1px solid red;
}
.calendar-selected{
background:#FBEC88;
border:1px solid red;
}
.calendar-nav-hover{
background-color:#FBEC88;
}
.calendar-menu{
position:absolute;
top:0px;
left:0px;
width:180px;
height:150px;
padding:5px;
font-size:12px;
background:#fafafa;
opacity:0.8;
filter:alpha(opacity=80);
display:none;
overflow:hidden;
}
.calendar-menu-year-inner{
text-align:center;
padding-bottom:5px;
}
.calendar-menu-year{
width:40px;
text-align:center;
border:1px solid #ccc;
padding:2px;
font-weight:bold;
}
.calendar-menu-prev,.calendar-menu-next{
display:inline-block;
width:21px;
height:21px;
vertical-align:top;
cursor:pointer;
}
.calendar-menu-prev{
margin-right:10px;
background:url('images/calendar_prevyear.gif') no-repeat 5px 6px;
}
.calendar-menu-next{
margin-left:10px;
background:url('images/calendar_nextyear.gif') no-repeat 5px 6px;
}
.calendar-menu-hover{
background-color:#FBEC88;
}
.calendar-menu-month-inner table{
width:100%;
height:100%;
}
.calendar-menu-month{
text-align:center;
cursor:pointer;
border:1px solid #fafafa;
font-weight:bold;
color:#666;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/combo.css
================================================
.combo{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #A4BED4;
background:#fff;
}
.combo-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.combo-arrow{
background:#E0ECF9 url('images/combo_arrow.gif') no-repeat 3px 4px;
width:18px;
height:20px;
overflow:hidden;
display:inline-block;
vertical-align:top;
cursor:pointer;
opacity:0.6;
filter:alpha(opacity=60);
}
.combo-arrow-hover{
opacity:1.0;
filter:alpha(opacity=100);
}
.combo-panel{
background:#fff;
overflow:auto;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/combobox.css
================================================
.combobox-item{
padding:2px;
font-size:12px;
padding:3px;
padding-right:0px;
}
.combobox-item-hover{
background:#fafafa;
}
.combobox-item-selected{
background:#FBEC88;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/datagrid.css
================================================
.datagrid .panel-body{
overflow:hidden;
}
.datagrid-wrap{
position:relative;
}
.datagrid-view{
position:relative;
overflow:hidden;
}
.datagrid-view1{
position:absolute;
overflow:hidden;
left:0px;
top:0px;
}
.datagrid-view2{
position:absolute;
overflow:hidden;
left:210px;
top:0px;
}
.datagrid-mask{
position:absolute;
left:0;
top:0;
background:#ccc;
opacity:0.3;
filter:alpha(opacity=30);
display:none;
}
.datagrid-mask-msg{
position:absolute;
left:100px;
top:50px;
width:auto;
height:16px;
padding:12px 5px 10px 30px;
background:#fff url('images/pagination_loading.gif') no-repeat scroll 5px 10px;
border:2px solid #6593CF;
color:#222;
display:none;
}
.datagrid-sort-desc .datagrid-sort-icon{
padding:2px 13px 3px 0px;
background:url('images/datagrid_sort_desc.gif') no-repeat center center;
}
.datagrid-sort-asc .datagrid-sort-icon{
padding:2px 13px 3px 0px;
background:url('images/datagrid_sort_asc.gif') no-repeat center center;
}
.datagrid-toolbar{
height:28px;
background:#efefef;
padding:1px 2px;
border-bottom:1px solid #ccc;
}
.datagrid-btn-separator{
float:left;
height:24px;
border-left:1px solid #ccc;
border-right:1px solid #fff;
margin:2px 1px;
}
.datagrid-pager{
background:#efefef;
border-top:1px solid #ccc;
position:relative;
}
.datagrid-header{
overflow:hidden;
background:#fafafa url('images/datagrid_header_bg.gif') repeat-x left bottom;
border-bottom:1px solid #ccc;
cursor:default;
}
.datagrid-header-inner{
float:left;
width:10000px;
}
.datagrid-header td{
border-right:1px dotted #ccc;
font-size:12px;
font-weight:normal;
background:#fafafa url('images/datagrid_header_bg.gif') repeat-x left bottom;
border-bottom:1px dotted #ccc;
border-top:1px dotted #fff;
}
.datagrid-header td.datagrid-header-over{
background:#EBF3FD;
}
.datagrid-header .datagrid-cell{
margin:0;
padding:3px 4px;
white-space:nowrap;
word-wrap:normal;
overflow:hidden;
text-align:center;
}
.datagrid-header .datagrid-cell-group{
margin:0;
padding:4px 2px 4px 4px;
white-space:nowrap;
word-wrap:normal;
overflow:hidden;
text-align:center;
}
.datagrid-header-rownumber{
width:25px;
text-align:center;
margin:0px;
padding:3px 0px;
}
.datagrid-td-rownumber{
background:#fafafa url('images/datagrid_header_bg.gif') repeat-x left bottom;
}
.datagrid-cell-rownumber{
width:25px;
text-align:center;
margin:0px;
padding:3px 0px;
color:#000;
}
.datagrid-body{
margin:0;
padding:0;
overflow:auto;
zoom:1;
}
.datagrid-view1 .datagrid-body-inner{
padding-bottom:20px;
}
.datagrid-view1 .datagrid-body{
overflow:hidden;
}
.datagrid-footer{
overflow:hidden;
}
.datagrid-footer-inner{
border-top:1px solid #ccc;
width:10000px;
float:left;
}
.datagrid-body td,.datagrid-footer td{
font-size:12px;
border-right:1px dotted #ccc;
border-bottom:1px dotted #ccc;
overflow:hidden;
padding:0;
margin:0;
}
.datagrid-body .datagrid-cell,.datagrid-footer .datagrid-cell{
overflow:hidden;
margin:0;
padding:0px 4px;
white-space:nowrap;
word-wrap:normal;
height:18px;
line-height:18px;
}
.datagrid-row-editing .datagrid-cell{
height:auto;
}
.datagrid-header-check{
padding:3px 6px;
}
.datagrid-cell-check{
padding:3px 6px;
font-size:1px;
overflow:hidden;
}
.datagrid-header-check input{
margin:0;
padding:0;
width:15px;
height:15px;
}
.datagrid-cell-check input{
margin:0;
padding:0;
width:15px;
height:15px;
}
.datagrid-row{
height:25px;
}
.datagrid-row-collapse{
background:url('images/datagrid_row_collapse.gif') no-repeat center center;
}
.datagrid-row-expand{
background:url('images/datagrid_row_expand.gif') no-repeat center center;
}
.datagrid-row-alt{
background:#EEEEFF;
}
.datagrid-row-over{
background:#D0E5F5;
cursor:default;
}
.datagrid-row-selected{
background:#FBEC88;
}
.datagrid-resize-proxy{
position:absolute;
width:1px;
top:0;
height:10000px;
background:red;
cursor:e-resize;
display:none;
}
.datagrid-body .datagrid-editable{
padding:0;
}
.datagrid-body .datagrid-editable table{
width:100%;
height:100%;
}
.datagrid-body .datagrid-editable td{
border:0;
padding:0;
}
.datagrid-body .datagrid-editable .datagrid-editable-input{
width:100%;
font-size:12px;
border:1px solid #A4BED4;
padding:3px 2px;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/datebox.css
================================================
.datebox .combo-arrow{
background:url('images/datebox_arrow.png') no-repeat center center;
}
.datebox-calendar-inner{
height:180px;
}
.datebox-button{
height:18px;
padding:2px 5px;
font-size:12px;
background-color:#fafafa;
text-align:center;
}
.datebox-current,.datebox-close{
float:left;
color:#888;
text-decoration:none;
font-weight:bold;
}
.datebox-close{
float:right;
}
.datebox-ok{
color:#888;
text-decoration:none;
font-weight:bold;
}
.datebox-button-hover{
color:#A4BED4;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/dialog.css
================================================
.dialog-content{
overflow:auto;
}
.dialog-toolbar{
background:#fafafa;
padding:2px 5px;
border-bottom:1px solid #eee;
}
.dialog-tool-separator{
float:left;
height:24px;
border-left:1px solid #ccc;
border-right:1px solid #fff;
margin:2px 1px;
}
.dialog-button{
border-top:1px solid #eee;
background:#fafafa;
padding:5px 5px;
text-align:right;
}
.dialog-button .l-btn{
margin-left:5px;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/easyui.css
================================================
.accordion{
background:#fff;
overflow:hidden;
}
.accordion .accordion-header{
background:#E0ECFF;
border-top-width:0;
cursor:pointer;
}
.accordion .accordion-header .panel-title{
font-weight:normal;
}
.accordion .accordion-header-selected .panel-title{
font-weight:bold;
}
.accordion-noborder .accordion-header{
border-width:0 0 1px;
}
.accordion-noborder .accordion-body{
border-width:0px;
}
.accordion-collapse{
background:url('images/accordion_collapse.png') no-repeat;
}
.accordion-expand{
background:url('images/accordion_expand.png') no-repeat;
}
.calendar{
background:#fff;
border:1px solid #A4BED4;
padding:1px;
overflow:hidden;
}
.calendar-noborder{
border:0px;
}
.calendar-header{
position:relative;
background:#E0ECFF;
font-size:12px;
height:22px;
}
.calendar-title{
text-align:center;
height:22px;
}
.calendar-title span{
position:relative;
top:2px;
line-height:12px;
display:inline-block;
padding:3px;
cursor:pointer;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
.calendar-prevmonth,.calendar-nextmonth,.calendar-prevyear,.calendar-nextyear{
position:absolute;
top:4px;
width:14px;
height:14px;
line-height:12px;
cursor:pointer;
font-size:1px;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
.calendar-prevmonth{
left:20px;
background:url('images/calendar_prevmonth.gif') no-repeat 3px 2px;
}
.calendar-nextmonth{
right:20px;
background:url('images/calendar_nextmonth.gif') no-repeat 3px 2px;
}
.calendar-prevyear{
left:3px;
background:url('images/calendar_prevyear.gif') no-repeat 1px 2px;
}
.calendar-nextyear{
right:3px;
background:url('images/calendar_nextyear.gif') no-repeat 1px 2px;
}
.calendar-body{
font-size:12px;
position:relative;
}
.calendar-body table{
width:100%;
height:100%;
border:1px solid #eee;
font-size:12px;
}
.calendar-body th,.calendar-body td{
text-align:center;
}
.calendar-body th{
background:#fafafa;
color:#888;
}
.calendar-day{
color:#222;
cursor:pointer;
border:1px solid #fff;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
.calendar-sunday{
color:#CC2222;
}
.calendar-saturday{
color:#00ee00;
}
.calendar-today{
color:#0000ff;
}
.calendar-other-month{
opacity:0.3;
filter:alpha(opacity=30);
}
.calendar-hover{
border:1px solid red;
}
.calendar-selected{
background:#FBEC88;
border:1px solid red;
}
.calendar-nav-hover{
background-color:#FBEC88;
}
.calendar-menu{
position:absolute;
top:0px;
left:0px;
width:180px;
height:150px;
padding:5px;
font-size:12px;
background:#fafafa;
opacity:0.8;
filter:alpha(opacity=80);
display:none;
overflow:hidden;
}
.calendar-menu-year-inner{
text-align:center;
padding-bottom:5px;
}
.calendar-menu-year{
width:40px;
text-align:center;
border:1px solid #ccc;
padding:2px;
font-weight:bold;
}
.calendar-menu-prev,.calendar-menu-next{
display:inline-block;
width:21px;
height:21px;
vertical-align:top;
cursor:pointer;
}
.calendar-menu-prev{
margin-right:10px;
background:url('images/calendar_prevyear.gif') no-repeat 5px 6px;
}
.calendar-menu-next{
margin-left:10px;
background:url('images/calendar_nextyear.gif') no-repeat 5px 6px;
}
.calendar-menu-hover{
background-color:#FBEC88;
}
.calendar-menu-month-inner table{
width:100%;
height:100%;
}
.calendar-menu-month{
text-align:center;
cursor:pointer;
border:1px solid #fafafa;
font-weight:bold;
color:#666;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
.combo{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #A4BED4;
background:#fff;
}
.combo-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.combo-arrow{
background:#E0ECF9 url('images/combo_arrow.gif') no-repeat 3px 4px;
width:18px;
height:20px;
overflow:hidden;
display:inline-block;
vertical-align:top;
cursor:pointer;
opacity:0.6;
filter:alpha(opacity=60);
}
.combo-arrow-hover{
opacity:1.0;
filter:alpha(opacity=100);
}
.combo-panel{
background:#fff;
overflow:auto;
}
.combobox-item{
padding:2px;
font-size:12px;
padding:3px;
padding-right:0px;
}
.combobox-item-hover{
background:#fafafa;
}
.combobox-item-selected{
background:#FBEC88;
}.datagrid .panel-body{
overflow:hidden;
}
.datagrid-wrap{
position:relative;
}
.datagrid-view{
position:relative;
overflow:hidden;
}
.datagrid-view1{
position:absolute;
overflow:hidden;
left:0px;
top:0px;
}
.datagrid-view2{
position:absolute;
overflow:hidden;
left:210px;
top:0px;
}
.datagrid-mask{
position:absolute;
left:0;
top:0;
background:#ccc;
opacity:0.3;
filter:alpha(opacity=30);
display:none;
}
.datagrid-mask-msg{
position:absolute;
left:100px;
top:50px;
width:auto;
height:16px;
padding:12px 5px 10px 30px;
background:#fff url('images/pagination_loading.gif') no-repeat scroll 5px 10px;
border:2px solid #6593CF;
color:#222;
display:none;
}
.datagrid-sort-desc .datagrid-sort-icon{
padding:2px 13px 3px 0px;
background:url('images/datagrid_sort_desc.gif') no-repeat center center;
}
.datagrid-sort-asc .datagrid-sort-icon{
padding:2px 13px 3px 0px;
background:url('images/datagrid_sort_asc.gif') no-repeat center center;
}
.datagrid-toolbar{
height:28px;
background:#efefef;
padding:1px 2px;
border-bottom:1px solid #ccc;
}
.datagrid-btn-separator{
float:left;
height:24px;
border-left:1px solid #ccc;
border-right:1px solid #fff;
margin:2px 1px;
}
.datagrid-pager{
background:#efefef;
border-top:1px solid #ccc;
position:relative;
}
.datagrid-header{
overflow:hidden;
background:#fafafa url('images/datagrid_header_bg.gif') repeat-x left bottom;
border-bottom:1px solid #ccc;
cursor:default;
}
.datagrid-header-inner{
float:left;
width:10000px;
}
.datagrid-header td{
border-right:1px dotted #ccc;
font-size:12px;
font-weight:normal;
background:#fafafa url('images/datagrid_header_bg.gif') repeat-x left bottom;
border-bottom:1px dotted #ccc;
border-top:1px dotted #fff;
}
.datagrid-header td.datagrid-header-over{
background:#EBF3FD;
}
.datagrid-header .datagrid-cell{
margin:0;
padding:3px 4px;
white-space:nowrap;
word-wrap:normal;
overflow:hidden;
text-align:center;
}
.datagrid-header .datagrid-cell-group{
margin:0;
padding:4px 2px 4px 4px;
white-space:nowrap;
word-wrap:normal;
overflow:hidden;
text-align:center;
}
.datagrid-header-rownumber{
width:25px;
text-align:center;
margin:0px;
padding:3px 0px;
}
.datagrid-td-rownumber{
background:#fafafa url('images/datagrid_header_bg.gif') repeat-x left bottom;
}
.datagrid-cell-rownumber{
width:25px;
text-align:center;
margin:0px;
padding:3px 0px;
color:#000;
}
.datagrid-body{
margin:0;
padding:0;
overflow:auto;
zoom:1;
}
.datagrid-view1 .datagrid-body-inner{
padding-bottom:20px;
}
.datagrid-view1 .datagrid-body{
overflow:hidden;
}
.datagrid-footer{
overflow:hidden;
}
.datagrid-footer-inner{
border-top:1px solid #ccc;
width:10000px;
float:left;
}
.datagrid-body td,.datagrid-footer td{
font-size:12px;
border-right:1px dotted #ccc;
border-bottom:1px dotted #ccc;
overflow:hidden;
padding:0;
margin:0;
}
.datagrid-body .datagrid-cell,.datagrid-footer .datagrid-cell{
overflow:hidden;
margin:0;
padding:0px 4px;
white-space:nowrap;
word-wrap:normal;
height:18px;
line-height:18px;
}
.datagrid-row-editing .datagrid-cell{
height:auto;
}
.datagrid-header-check{
padding:3px 6px;
}
.datagrid-cell-check{
padding:3px 6px;
font-size:1px;
overflow:hidden;
}
.datagrid-header-check input{
margin:0;
padding:0;
width:15px;
height:15px;
}
.datagrid-cell-check input{
margin:0;
padding:0;
width:15px;
height:15px;
}
.datagrid-row{
height:25px;
}
.datagrid-row-collapse{
background:url('images/datagrid_row_collapse.gif') no-repeat center center;
}
.datagrid-row-expand{
background:url('images/datagrid_row_expand.gif') no-repeat center center;
}
.datagrid-row-alt{
background:#EEEEFF;
}
.datagrid-row-over{
background:#D0E5F5;
cursor:default;
}
.datagrid-row-selected{
background:#FBEC88;
}
.datagrid-resize-proxy{
position:absolute;
width:1px;
top:0;
height:10000px;
background:red;
cursor:e-resize;
display:none;
}
.datagrid-body .datagrid-editable{
padding:0;
}
.datagrid-body .datagrid-editable table{
width:100%;
height:100%;
}
.datagrid-body .datagrid-editable td{
border:0;
padding:0;
}
.datagrid-body .datagrid-editable .datagrid-editable-input{
width:100%;
font-size:12px;
border:1px solid #A4BED4;
padding:3px 2px;
}
.datebox .combo-arrow{
background:url('images/datebox_arrow.png') no-repeat center center;
}
.datebox-calendar-inner{
height:180px;
}
.datebox-button{
height:18px;
padding:2px 5px;
font-size:12px;
background-color:#fafafa;
text-align:center;
}
.datebox-current,.datebox-close{
float:left;
color:#888;
text-decoration:none;
font-weight:bold;
}
.datebox-close{
float:right;
}
.datebox-ok{
color:#888;
text-decoration:none;
font-weight:bold;
}
.datebox-button-hover{
color:#A4BED4;
}
.dialog-content{
overflow:auto;
}
.dialog-toolbar{
background:#fafafa;
padding:2px 5px;
border-bottom:1px solid #eee;
}
.dialog-tool-separator{
float:left;
height:24px;
border-left:1px solid #ccc;
border-right:1px solid #fff;
margin:2px 1px;
}
.dialog-button{
border-top:1px solid #eee;
background:#fafafa;
padding:5px 5px;
text-align:right;
}
.dialog-button .l-btn{
margin-left:5px;
}.layout{
position:relative;
overflow:hidden;
margin:0;
padding:0;
}
.layout-panel{
position:absolute;
overflow:hidden;
}
.layout-panel-east,.layout-panel-west{
z-index:2;
}
.layout-panel-north,.layout-panel-south{
z-index:3;
}
.layout-button-up{
background:url('images/layout_button_up.gif') no-repeat;
}
.layout-button-down{
background:url('images/layout_button_down.gif') no-repeat;
}
.layout-button-left{
background:url('images/layout_button_left.gif') no-repeat;
}
.layout-button-right{
background:url('images/layout_button_right.gif') no-repeat;
}
.layout-expand{
position:absolute;
padding:0px 5px;
padding:0px;
background:#D2E0F2;
font-size:1px;
cursor:pointer;
z-index:1;
}
.layout-expand .panel-header{
background:transparent;
border-bottom-width:0px;
}
.layout-expand .panel-header .panel-tool{
top: 5px;
}
.layout-expand .panel-body{
overflow:hidden;
}
.layout-expand-over{
background:#E1F0F2;
}
.layout-body{
overflow:auto;
background:#fff;
}
.layout-split-proxy-h{
position:absolute;
width:5px;
background:#ccc;
font-size:1px;
cursor:e-resize;
display:none;
z-index:5;
}
.layout-split-proxy-v{
position:absolute;
height:5px;
background:#ccc;
font-size:1px;
cursor:n-resize;
display:none;
z-index:5;
}
.layout-split-north{
border-bottom:5px solid #D2E0F2;
}
.layout-split-south{
border-top:5px solid #D2E0F2;
}
.layout-split-east{
border-left:5px solid #D2E0F2;
}
.layout-split-west{
border-right:5px solid #D2E0F2;
}
.layout-mask{
position:absolute;
background:#fafafa;
filter:alpha(opacity=10);
opacity:0.10;
z-index:4;
}
a.l-btn{
color:#444;
background:url('images/button_a_bg.gif') no-repeat top right;
font-size:12px;
text-decoration:none;
display:inline-block;
zoom:1;
height:24px;
padding-right:18px;
cursor:pointer;
outline:none;
}
a.l-btn-plain{
background:transparent;
padding-right:5px;
border:1px solid transparent;
_border:0px solid #efefef;
_padding:1px 6px 1px 1px;
}
a.l-btn-disabled{
color:#ccc;
opacity:0.5;
filter:alpha(opacity=50);
cursor:default;
}
a.l-btn span.l-btn-left{
display:inline-block;
background:url('images/button_span_bg.gif') no-repeat top left;
padding:4px 0px 4px 18px;
line-height:16px;
height:16px;
}
a.l-btn-plain span.l-btn-left{
background:transparent;
padding-left:5px;
}
a.l-btn span span.l-btn-text{
display:inline-block;
height:16px;
line-height:16px;
padding:0px;
}
a.l-btn span span span.l-btn-empty{
display:inline-block;
padding:0px;
width:16px;
}
a:hover.l-btn{
background-position: bottom right;
outline:none;
}
a:hover.l-btn span.l-btn-left{
background-position: bottom left;
}
a:hover.l-btn-plain{
border:1px solid #7eabcd;
background:url('images/button_plain_hover.png') repeat-x left bottom;
_padding:0px 5px 0px 0px;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
a:hover.l-btn-disabled{
background-position:top right;
}
a:hover.l-btn-disabled span.l-btn-left{
background-position:top left;
}
a.l-btn .l-btn-focus{
outline:#0000FF dotted thin;
}
.menu{
position:absolute;
background:#f0f0f0 url('images/menu.gif') repeat-y;
margin:0;
padding:2px;
border:1px solid #ccc;
overflow:hidden;
}
.menu-item{
position:relative;
margin:0;
padding:0;
height:22px;
line-height:20px;
overflow:hidden;
font-size:12px;
cursor:pointer;
border:1px solid transparent;
_border:1px solid #f0f0f0;
}
.menu-text{
position:absolute;
left:28px;
top:0px;
}
.menu-icon{
position:absolute;
width:16px;
height:16px;
top:3px;
left:2px;
}
.menu-rightarrow{
position: absolute;
width:4px;
height:7px;
top:7px;
right:5px;
background:url('images/menu_rightarrow.png') no-repeat;
}
.menu-sep{
margin:3px 0px 3px 24px;
line-height:2px;
fon
gitextract_5zy55ld6/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── docker/
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── mysql/
│ │ ├── conf/
│ │ │ └── my.cnf
│ │ └── init/
│ │ └── init.sql
│ └── redis/
│ └── Dockerfile
├── permission.iml
├── pom.xml
├── resource/
│ ├── shell/
│ │ ├── delmysqldump.sh
│ │ ├── mysqldump.sh
│ │ ├── permission.sh
│ │ └── 使用crontab.md
│ └── sql/
│ └── permission.sql
└── src/
├── main/
│ ├── java/
│ │ └── cn/
│ │ └── lastwhisper/
│ │ ├── core/
│ │ │ ├── annotation/
│ │ │ │ └── LogAnno.java
│ │ │ ├── aop/
│ │ │ │ └── LogAopAspect.java
│ │ │ ├── shiro/
│ │ │ │ └── Realm.java
│ │ │ ├── task/
│ │ │ │ └── GoBackTask.java
│ │ │ └── util/
│ │ │ └── UserUtils.java
│ │ └── modular/
│ │ ├── controller/
│ │ │ ├── LogController.java
│ │ │ ├── MenuController.java
│ │ │ ├── RoleController.java
│ │ │ └── UserController.java
│ │ ├── mapper/
│ │ │ ├── LogMapper.java
│ │ │ ├── LogMapper.xml
│ │ │ ├── MenuMapper.java
│ │ │ ├── MenuMapper.xml
│ │ │ ├── RoleMapper.java
│ │ │ ├── RoleMapper.xml
│ │ │ ├── UserMapper.java
│ │ │ └── UserMapper.xml
│ │ ├── pojo/
│ │ │ ├── Log.java
│ │ │ ├── Menu.java
│ │ │ ├── Role.java
│ │ │ └── User.java
│ │ ├── service/
│ │ │ ├── LogService.java
│ │ │ ├── MenuService.java
│ │ │ ├── RoleService.java
│ │ │ ├── UserService.java
│ │ │ └── impl/
│ │ │ ├── LogServiceImpl.java
│ │ │ ├── MenuServiceImpl.java
│ │ │ ├── RoleServiceImpl.java
│ │ │ └── UserServiceImpl.java
│ │ └── vo/
│ │ ├── EasyUIDataGridResult.java
│ │ ├── EasyUIOptionalTreeNode.java
│ │ ├── GlobalResult.java
│ │ └── Tree.java
│ ├── resources/
│ │ ├── applicationContext.xml
│ │ ├── applicationContext_jedis.xml
│ │ ├── applicationContext_shiro.xml
│ │ ├── db-local.properties
│ │ ├── db.properties
│ │ ├── log4j.properties
│ │ ├── reset.sql
│ │ ├── springmvc.xml
│ │ └── sqlMapConfig.xml
│ └── webapp/
│ ├── WEB-INF/
│ │ └── web.xml
│ ├── adminjs/
│ │ ├── index.js
│ │ └── themes/
│ │ ├── default/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── gray/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ └── icon.css
│ ├── casual.html
│ ├── css/
│ │ ├── default.css
│ │ ├── login.css
│ │ └── table.css
│ ├── dept.html
│ ├── emp.html
│ ├── error.html
│ ├── index.html
│ ├── js/
│ │ ├── config.js
│ │ ├── crud.js
│ │ ├── download.js
│ │ ├── menu.js
│ │ ├── roleMenuSet.js
│ │ ├── search.js
│ │ └── userRoleSet.js
│ ├── log.html
│ ├── login.html
│ ├── menu.html
│ ├── role.html
│ ├── roleMenuSet.html
│ ├── sale.html
│ ├── ui/
│ │ ├── date.js
│ │ ├── download.js
│ │ ├── easyloader.js
│ │ ├── locale/
│ │ │ ├── easyui-lang-af.js
│ │ │ ├── easyui-lang-ar.js
│ │ │ ├── easyui-lang-bg.js
│ │ │ ├── easyui-lang-ca.js
│ │ │ ├── easyui-lang-cs.js
│ │ │ ├── easyui-lang-cz.js
│ │ │ ├── easyui-lang-da.js
│ │ │ ├── easyui-lang-de.js
│ │ │ ├── easyui-lang-el.js
│ │ │ ├── easyui-lang-en.js
│ │ │ ├── easyui-lang-es.js
│ │ │ ├── easyui-lang-fr.js
│ │ │ ├── easyui-lang-it.js
│ │ │ ├── easyui-lang-jp.js
│ │ │ ├── easyui-lang-nl.js
│ │ │ ├── easyui-lang-pl.js
│ │ │ ├── easyui-lang-pt_BR.js
│ │ │ ├── easyui-lang-ru.js
│ │ │ ├── easyui-lang-sv_SE.js
│ │ │ ├── easyui-lang-tr.js
│ │ │ ├── easyui-lang-zh_CN.js
│ │ │ └── easyui-lang-zh_TW.js
│ │ └── themes/
│ │ ├── black/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tooltip.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── bootstrap/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tooltip.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── default/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tooltip.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── gray/
│ │ │ ├── accordion.css
│ │ │ ├── calendar.css
│ │ │ ├── combo.css
│ │ │ ├── combobox.css
│ │ │ ├── datagrid.css
│ │ │ ├── datebox.css
│ │ │ ├── dialog.css
│ │ │ ├── easyui.css
│ │ │ ├── layout.css
│ │ │ ├── linkbutton.css
│ │ │ ├── menu.css
│ │ │ ├── menubutton.css
│ │ │ ├── messager.css
│ │ │ ├── pagination.css
│ │ │ ├── panel.css
│ │ │ ├── progressbar.css
│ │ │ ├── propertygrid.css
│ │ │ ├── searchbox.css
│ │ │ ├── slider.css
│ │ │ ├── spinner.css
│ │ │ ├── splitbutton.css
│ │ │ ├── tabs.css
│ │ │ ├── tooltip.css
│ │ │ ├── tree.css
│ │ │ ├── validatebox.css
│ │ │ └── window.css
│ │ ├── icon.css
│ │ └── metro/
│ │ ├── accordion.css
│ │ ├── calendar.css
│ │ ├── combo.css
│ │ ├── combobox.css
│ │ ├── datagrid.css
│ │ ├── datebox.css
│ │ ├── dialog.css
│ │ ├── easyui.css
│ │ ├── layout.css
│ │ ├── linkbutton.css
│ │ ├── menu.css
│ │ ├── menubutton.css
│ │ ├── messager.css
│ │ ├── pagination.css
│ │ ├── panel.css
│ │ ├── progressbar.css
│ │ ├── propertygrid.css
│ │ ├── searchbox.css
│ │ ├── slider.css
│ │ ├── spinner.css
│ │ ├── splitbutton.css
│ │ ├── tabs.css
│ │ ├── tooltip.css
│ │ ├── tree.css
│ │ ├── validatebox.css
│ │ └── window.css
│ ├── user.html
│ └── userRoleSet.html
└── test/
└── java/
└── cn/
└── lastwhisper/
├── GoBackTest.java
└── MD5.java
SYMBOL INDEX (293 symbols across 37 files)
FILE: docker/mysql/init/init.sql
type `log` (line 26) | CREATE TABLE `log` (
type `menu` (line 40) | CREATE TABLE `menu` (
type `role` (line 74) | CREATE TABLE `role` (
type `role_menu` (line 93) | CREATE TABLE `role_menu` (
type `user` (line 123) | CREATE TABLE `user` (
type `user_role` (line 145) | CREATE TABLE `user_role` (
FILE: resource/sql/permission.sql
type `log` (line 24) | CREATE TABLE `log` (
type `menu` (line 38) | CREATE TABLE `menu` (
type `role` (line 72) | CREATE TABLE `role` (
type `role_menu` (line 91) | CREATE TABLE `role_menu` (
type `user` (line 121) | CREATE TABLE `user` (
type `user_role` (line 143) | CREATE TABLE `user_role` (
FILE: src/main/java/cn/lastwhisper/core/aop/LogAopAspect.java
class LogAopAspect (line 27) | @Order(3)
method aroundAdvice (line 42) | @Around("@annotation(cn.lastwhisper.core.annotation.LogAnno)")
FILE: src/main/java/cn/lastwhisper/core/shiro/Realm.java
class Realm (line 22) | public class Realm extends AuthorizingRealm {
method doGetAuthorizationInfo (line 31) | @Override
method doGetAuthenticationInfo (line 48) | @Override
FILE: src/main/java/cn/lastwhisper/core/task/GoBackTask.java
class GoBackTask (line 28) | @Component
method goBack (line 44) | @Scheduled(cron = "0 0 0/3 * * ?")
method flushRedis (line 52) | private void flushRedis() {
method resetDb (line 59) | private void resetDb() {
method setApplicationContext (line 82) | @Override
FILE: src/main/java/cn/lastwhisper/core/util/UserUtils.java
class UserUtils (line 26) | public class UserUtils {
method getSubjectUser (line 33) | public static User getSubjectUser() {
method removeSubjectUser (line 43) | public static void removeSubjectUser() {
method getRequest (line 53) | public static HttpServletRequest getRequest() {
method getIpAddress (line 63) | public static String getIpAddress() {
method getSessionUser (line 89) | @Deprecated
method setSessionUser (line 100) | @Deprecated
method removeSessionUser (line 110) | @Deprecated
FILE: src/main/java/cn/lastwhisper/modular/controller/LogController.java
class LogController (line 32) | @Controller
method rolelistByPage (line 47) | @RequestMapping("/log/loglistByPage")
method searchLogOperateor (line 64) | @RequestMapping(value = "/log/searchLogOperateor", method = RequestMet...
FILE: src/main/java/cn/lastwhisper/modular/controller/MenuController.java
class MenuController (line 32) | @Controller
method findAll (line 43) | @RequestMapping(value="/menu/menulist")
method findById (line 56) | @RequestMapping("/menu/menufindById")
method insert (line 68) | @LogAnno(operateType = "添加权限菜单")
method deleteById (line 82) | @LogAnno(operateType = "修改权限菜单")
method updateById (line 96) | @LogAnno(operateType = "更新权限菜单")
method loadMenus (line 112) | @RequestMapping(value="/menu/loadMenus")
FILE: src/main/java/cn/lastwhisper/modular/controller/RoleController.java
class RoleController (line 26) | @Controller
method rolelistByPage (line 40) | @RequestMapping("/role/rolelistByPage")
method searchRoleName (line 56) | @RequestMapping(value = "/role/searchRoleName", method = RequestMethod...
method updateRole (line 72) | @LogAnno(operateType = "更新角色")
method addRole (line 88) | @LogAnno(operateType = "添加角色 ")
method deleteRole (line 100) | @LogAnno(operateType = "删除角色")
method rolelist (line 115) | @RequestMapping(value = "/role/rolelist")
method findRoleMenuByRoleid (line 130) | @RequestMapping(value = "/role/findRoleMenuByRoleid" , method = Reques...
method updateRoleMenu (line 146) | @LogAnno(operateType = "更新角色权限菜单")
FILE: src/main/java/cn/lastwhisper/modular/controller/UserController.java
class UserController (line 39) | @Controller
method login (line 54) | @RequestMapping(value = "/user/login", method = RequestMethod.POST)
method userlistByPage (line 91) | @RequestMapping(value = "/user/userlistByPage", method = RequestMethod...
method searchUserName (line 106) | @RequestMapping(value = "/user/searchUserName", method = RequestMethod...
method useradd (line 120) | @LogAnno(operateType = "添加用户")
method userupdate (line 134) | @LogAnno(operateType = "更新用户")
method updatePwd (line 141) | @LogAnno(operateType = "更新密码")
method userdelete (line 160) | @LogAnno(operateType = "删除用户")
method findUserRole (line 176) | @RequestMapping(value = "/user/findUserRole", method = { RequestMethod...
method updateUserRole (line 193) | @LogAnno(operateType = "更新用户对应角色")
method showName (line 210) | @RequestMapping(value = "/user/showName")
method logout (line 230) | @RequestMapping(value = "/user/logout")
method userexport (line 257) | @LogAnno(operateType = "导出用户信息Excel")
method userdoImport (line 281) | @LogAnno(operateType = "导入用户信息Excel")
FILE: src/main/java/cn/lastwhisper/modular/mapper/LogMapper.java
type LogMapper (line 15) | public interface LogMapper {
method insertLog (line 24) | int insertLog(Log log);
method selectLoglistByPage (line 33) | public List<Log> selectLoglistByPage(Log log);
method selectLogOperateor (line 42) | public List<Log> selectLogOperateor(@Param("operateor")String operateor);
FILE: src/main/java/cn/lastwhisper/modular/mapper/MenuMapper.java
type MenuMapper (line 16) | public interface MenuMapper {
method selectMenuList (line 24) | List<Tree> selectMenuList();
method selectMenuById (line 34) | List<Menu> selectMenuById(@Param("menuid") String menuid);
method insertMenu (line 44) | Integer insertMenu(Menu Menu);
method deleteMenuById (line 54) | Integer deleteMenuById(String menuid);
method updateMenuById (line 64) | Integer updateMenuById(Menu Menu);
method selectMenuIdName (line 74) | public List<Menu> selectMenuIdName(@Param("pid") String pid);
method selectMenuByUserid (line 85) | public List<Menu> selectMenuByUserid(@Param("userid") Integer userid);
method selectMenu (line 96) | public List<Menu> selectMenu(@Param("pid") String pid);
FILE: src/main/java/cn/lastwhisper/modular/mapper/RoleMapper.java
type RoleMapper (line 15) | public interface RoleMapper {
method selectRolelistByPage (line 25) | public List<Role> selectRolelistByPage(Role role);
method selectRoleList (line 36) | public List<Role> selectRoleList();
method selectRoleName (line 44) | public List<Role> selectRoleName(@Param("name")String name);
method selectRoleMenuidByRoleid (line 55) | public List<String> selectRoleMenuidByRoleid(@Param("roleuuid") Intege...
method selectUseridByRoleuuid (line 66) | public List<Integer> selectUseridByRoleuuid(@Param("roleuuid") Integer...
method updateRole (line 77) | public Integer updateRole(Role role);
method insertRole (line 88) | public Integer insertRole(Role role);
method insertRolemenu (line 99) | public void insertRolemenu(@Param("menuuuid") String menuuuid, @Param(...
method deleteRoleById (line 108) | public Integer deleteRoleById(@Param("uuid") Integer uuid);
method deleteMenuidByRoleid (line 118) | public void deleteMenuidByRoleid(@Param("roleuuid") Integer roleuuid);
FILE: src/main/java/cn/lastwhisper/modular/mapper/UserMapper.java
type UserMapper (line 16) | public interface UserMapper {
method selectUserBycodeAndpwd (line 25) | public User selectUserBycodeAndpwd(@Param("user_code") String user_code,
method selectUserlistByPage (line 34) | public List<User> selectUserlistByPage(User user);
method selectUserName (line 42) | public List<User> selectUserName(@Param("user_name")String user_name);
method selectUserRole (line 52) | public List<Role> selectUserRole(@Param("user_id") Integer user_id);
method selectUserByUserCode (line 61) | public List<User> selectUserByUserCode(String user_code);
method insertUser (line 70) | public Integer insertUser(User user);
method insertUserRole (line 82) | public void insertUserRole(@Param("user_id") Integer user_id,@Param("r...
method updateUser (line 90) | public Integer updateUser(User user);
method updatePwdById (line 99) | public Integer updatePwdById(@Param("user_id") Integer user_id,@Param(...
method updateUserByUserCode (line 107) | public Integer updateUserByUserCode(User user);
method deleteUserById (line 115) | public Integer deleteUserById(@Param("user_id") Integer user_id);
method deleteUserRole (line 126) | public void deleteUserRole(@Param("user_id") Integer user_id);
FILE: src/main/java/cn/lastwhisper/modular/pojo/Log.java
class Log (line 5) | public class Log {
method getId (line 18) | public Integer getId() {
method setId (line 22) | public void setId(Integer id) {
method getOperateor (line 26) | public String getOperateor() {
method setOperateor (line 30) | public void setOperateor(String operateor) {
method getOperatetype (line 34) | public String getOperatetype() {
method setOperatetype (line 38) | public void setOperatetype(String operatetype) {
method getOperatedate (line 42) | public Date getOperatedate() {
method setOperatedate (line 46) | public void setOperatedate(Date operatedate) {
method getOperateresult (line 50) | public String getOperateresult() {
method setOperateresult (line 54) | public void setOperateresult(String operateresult) {
method getIp (line 58) | public String getIp() {
method setIp (line 62) | public void setIp(String ip) {
FILE: src/main/java/cn/lastwhisper/modular/pojo/Menu.java
class Menu (line 20) | public class Menu {
method getMenuid (line 33) | public String getMenuid() {
method setMenuid (line 39) | public void setMenuid(String menuid) {
method getMenuname (line 47) | public String getMenuname() {
method setMenuname (line 53) | public void setMenuname(String menuname) {
method getUrl (line 61) | public String getUrl() {
method setUrl (line 67) | public void setUrl(String url) {
method getIcon (line 75) | public String getIcon() {
method setIcon (line 81) | public void setIcon(String icon) {
method getPid (line 89) | public String getPid() {
method setPid (line 95) | public void setPid(String pid) {
method getIs_parent (line 103) | public Integer getIs_parent() {
method setIs_parent (line 109) | public void setIs_parent(Integer is_parent) {
method getMenus (line 117) | public List<Menu> getMenus() {
method setMenus (line 123) | public void setMenus(List<Menu> menus) {
FILE: src/main/java/cn/lastwhisper/modular/pojo/Role.java
class Role (line 17) | public class Role {
method getUuid (line 27) | public Integer getUuid() {
method setUuid (line 33) | public void setUuid(Integer uuid) {
method getName (line 41) | public String getName() {
method setName (line 47) | public void setName(String name) {
FILE: src/main/java/cn/lastwhisper/modular/pojo/User.java
class User (line 19) | public class User implements Serializable{
method getUser_id (line 30) | public Integer getUser_id() {
method setUser_id (line 33) | public void setUser_id(Integer user_id) {
method getUser_name (line 36) | public String getUser_name() {
method setUser_name (line 39) | public void setUser_name(String user_name) {
method getUser_code (line 42) | public String getUser_code() {
method setUser_code (line 45) | public void setUser_code(String user_code) {
method getUser_pwd (line 48) | public String getUser_pwd() {
method setUser_pwd (line 51) | public void setUser_pwd(String user_pwd) {
method getUser_birthday (line 59) | @DateTimeFormat(pattern = "yyyy-MM-dd")
method setUser_birthday (line 67) | @DateTimeFormat(pattern = "yyyy-MM-dd")
FILE: src/main/java/cn/lastwhisper/modular/service/LogService.java
type LogService (line 15) | public interface LogService {
method addLog (line 22) | public boolean addLog(Log log) throws SQLException;
method findLoglistByPage (line 33) | public EasyUIDataGridResult findLoglistByPage(Integer page, Integer ro...
method findLogOperateor (line 42) | public List<Log> findLogOperateor(String q);
FILE: src/main/java/cn/lastwhisper/modular/service/MenuService.java
type MenuService (line 23) | public interface MenuService {
method findMenuList (line 32) | List<Tree> findMenuList();
method findMenuById (line 42) | List<Menu> findMenuById(String menuid);
method addMenu (line 52) | GlobalResult addMenu(Menu Menu);
method deleteMenuById (line 62) | GlobalResult deleteMenuById(String menuid);
method updateMenuById (line 72) | GlobalResult updateMenuById(Menu Menu);
method findMenuByUserid (line 82) | Menu findMenuByUserid(Integer userid);
method findMenuListByUserid (line 92) | List<Menu> findMenuListByUserid(Integer userid);
FILE: src/main/java/cn/lastwhisper/modular/service/RoleService.java
type RoleService (line 26) | public interface RoleService {
method findRolelistByPage (line 38) | public EasyUIDataGridResult findRolelistByPage(Integer page, Integer r...
method findRoleList (line 47) | public EasyUIDataGridResult findRoleList();
method findRoleName (line 56) | public List<Role> findRoleName(String q);
method updateRole (line 67) | public GlobalResult updateRole(Role role);
method addRole (line 77) | public GlobalResult addRole(Role role);
method deleteRoleById (line 85) | public GlobalResult deleteRoleById(Integer uuid);
method findRoleMenuByRoleid (line 100) | public List<EasyUIOptionalTreeNode> findRoleMenuByRoleid(Integer roleu...
method updateRoleMenu (line 111) | public GlobalResult updateRoleMenu(Integer roleuuid, String checkedIds);
FILE: src/main/java/cn/lastwhisper/modular/service/UserService.java
type UserService (line 21) | public interface UserService {
method findUserByCodeAndPwd (line 30) | public User findUserByCodeAndPwd(String user_code, String user_pwd);
method findUserlistByPage (line 39) | public EasyUIDataGridResult findUserlistByPage(User user,Integer page,...
method findUserName (line 47) | public List<User> findUserName(String q);
method findUserRole (line 62) | List<EasyUIOptionalTreeNode> findUserRole(Integer user_id);
method findUserRoleByUserid (line 71) | List<Role> findUserRoleByUserid(Integer user_id);
method updateUserRole (line 81) | GlobalResult updateUserRole(Integer user_id, String checkedIds);
method addUser (line 90) | public GlobalResult addUser(User user);
method updateUser (line 98) | public GlobalResult updateUser(User user);
method updatePwd (line 109) | public GlobalResult updatePwd(User user,String oldPwd,String newPwd);
method deleteUser (line 117) | public GlobalResult deleteUser(Integer user_id);
method export (line 127) | public void export(OutputStream os, User user);
method doImport (line 137) | public void doImport(InputStream is) throws IOException;
FILE: src/main/java/cn/lastwhisper/modular/service/impl/LogServiceImpl.java
class LogServiceImpl (line 27) | @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Prop...
method addLog (line 33) | @Override
method findLoglistByPage (line 38) | @Transactional(propagation = Propagation.NOT_SUPPORTED)
method findLogOperateor (line 50) | @Transactional(propagation = Propagation.NOT_SUPPORTED)
FILE: src/main/java/cn/lastwhisper/modular/service/impl/MenuServiceImpl.java
class MenuServiceImpl (line 29) | @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Prop...
method findMenuList (line 41) | @Transactional(propagation = Propagation.NOT_SUPPORTED)
method findMenuById (line 47) | @Transactional(propagation = Propagation.NOT_SUPPORTED)
method addMenu (line 53) | @Override
method deleteMenuById (line 81) | @Override
method updateMenuById (line 98) | @Override
method batchDel (line 114) | private void batchDel() {
method cloneMenu (line 129) | private Menu cloneMenu(Menu src) {
method findMenuByUserid (line 139) | @Override
method findMenuListByUserid (line 197) | @Override
FILE: src/main/java/cn/lastwhisper/modular/service/impl/RoleServiceImpl.java
class RoleServiceImpl (line 41) | @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Prop...
method findRolelistByPage (line 54) | @Transactional(propagation =Propagation.NOT_SUPPORTED)
method findRoleName (line 69) | @Transactional(propagation =Propagation.NOT_SUPPORTED)
method updateRole (line 76) | @Override
method addRole (line 91) | @Override
method findRoleList (line 102) | @Transactional(propagation =Propagation.NOT_SUPPORTED)
method deleteRoleById (line 112) | @Override
method findRoleMenuByRoleid (line 125) | @Override
method updateRoleMenu (line 162) | @Override
FILE: src/main/java/cn/lastwhisper/modular/service/impl/UserServiceImpl.java
class UserServiceImpl (line 46) | @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Prop...
method findUserByCodeAndPwd (line 59) | @Transactional(propagation = Propagation.NOT_SUPPORTED)
method encrypt (line 75) | private String encrypt(String source, String salt) {
method addUser (line 82) | @RequiresPermissions("用户管理")
method updateUser (line 103) | @RequiresPermissions("用户管理")
method deleteUser (line 124) | @RequiresPermissions("用户管理")
method findUserlistByPage (line 145) | @Transactional(propagation = Propagation.NOT_SUPPORTED)
method findUserName (line 157) | @Transactional(propagation = Propagation.NOT_SUPPORTED)
method updatePwd (line 163) | @LogAnno(operateType = "更新用户密码")
method findUserRole (line 186) | @Transactional(propagation = Propagation.NOT_SUPPORTED)
method findUserRoleByUserid (line 212) | @Transactional(propagation = Propagation.NOT_SUPPORTED)
method updateUserRole (line 218) | @LogAnno(operateType = "更新用户对应角色")
method export (line 244) | @LogAnno(operateType = "excel导出用户信息")
method doImport (line 305) | @LogAnno(operateType = "excel导入用户信息")
FILE: src/main/java/cn/lastwhisper/modular/vo/EasyUIDataGridResult.java
class EasyUIDataGridResult (line 20) | public class EasyUIDataGridResult implements Serializable {
method getTotal (line 35) | public Integer getTotal() {
method setTotal (line 39) | public void setTotal(Integer total) {
method getRows (line 43) | public List<?> getRows() {
method setRows (line 47) | public void setRows(List<?> rows) {
FILE: src/main/java/cn/lastwhisper/modular/vo/EasyUIOptionalTreeNode.java
class EasyUIOptionalTreeNode (line 14) | public class EasyUIOptionalTreeNode {
method getId (line 20) | public String getId() {
method setId (line 23) | public void setId(String id) {
method getText (line 26) | public String getText() {
method setText (line 29) | public void setText(String text) {
method isChecked (line 32) | public boolean isChecked() {
method setChecked (line 35) | public void setChecked(boolean checked) {
method getChildren (line 38) | public List<EasyUIOptionalTreeNode> getChildren() {
method setChildren (line 41) | public void setChildren(List<EasyUIOptionalTreeNode> children) {
method toString (line 44) | @Override
FILE: src/main/java/cn/lastwhisper/modular/vo/GlobalResult.java
class GlobalResult (line 21) | public class GlobalResult implements Serializable{
method build (line 37) | public static GlobalResult build(Integer status, String msg, Object da...
method ok (line 41) | public static GlobalResult ok(Object data) {
method ok (line 45) | public static GlobalResult ok() {
method GlobalResult (line 49) | public GlobalResult() {
method build (line 53) | public static GlobalResult build(Integer status, String msg) {
method GlobalResult (line 57) | public GlobalResult(Integer status, String msg, Object data) {
method GlobalResult (line 63) | public GlobalResult(Object data) {
method isOK (line 69) | public Boolean isOK() {
method getStatus (line 73) | public Integer getStatus() {
method setStatus (line 77) | public void setStatus(Integer status) {
method getMsg (line 81) | public String getMsg() {
method setMsg (line 85) | public void setMsg(String msg) {
method getData (line 89) | public Object getData() {
method setData (line 93) | public void setData(Object data) {
method toString (line 100) | @Override
FILE: src/main/java/cn/lastwhisper/modular/vo/Tree.java
class Tree (line 10) | @JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
method getStatus (line 17) | public Integer getStatus() {
method setStatus (line 20) | public void setStatus(Integer status) {
method getId (line 23) | public String getId() {
method setId (line 26) | public void setId(String id) {
method getText (line 29) | public String getText() {
method setText (line 32) | public void setText(String text) {
method isChecked (line 35) | public boolean isChecked() {
method setChecked (line 38) | public void setChecked(boolean checked) {
method getChildren (line 41) | public List<Menu> getChildren() {
method setChildren (line 47) | public void setChildren(List<Menu> children) {
method toString (line 50) | @Override
FILE: src/main/webapp/adminjs/index.js
function cancelStart (line 68) | function cancelStart() {
function start (line 75) | function start() {
function showName (line 90) | function showName() {
function InitLeftMenu (line 112) | function InitLeftMenu() {
function getIcon (line 189) | function getIcon(menuid) {
function find (line 202) | function find(menuid) {
function addTab (line 215) | function addTab(subtitle, url, icon) {
function createFrame (line 230) | function createFrame(url) {
function tabClose (line 236) | function tabClose() {
function tabCloseEven (line 258) | function tabCloseEven() {
function closeTab (line 269) | function closeTab(action) {
function msgShow (line 345) | function msgShow(title, msgString, msgType) {
function openPwd (line 350) | function openPwd() {
function closePwd (line 413) | function closePwd() {
function serverLogin (line 418) | function serverLogin() {
FILE: src/main/webapp/js/crud.js
function del (line 171) | function del(selected) {
function edit (line 190) | function edit() {
FILE: src/main/webapp/js/menu.js
function loadTree (line 107) | function loadTree() {
function disposeTree (line 120) | function disposeTree(data) {
function loadDataGrid (line 166) | function loadDataGrid(menuid) {
function insertData (line 273) | function insertData() {
function deleteData (line 304) | function deleteData(menuid) {
function updateData (line 334) | function updateData() {
function renameMenu (line 365) | function renameMenu() {
FILE: src/main/webapp/js/search.js
function reloadgrid (line 47) | function reloadgrid() {
FILE: src/main/webapp/ui/easyloader.js
function _4 (line 16) | function _4(_5,_6){
function _9 (line 33) | function _9(_a,_b){
function _c (line 41) | function _c(_d,_e){
function _10 (line 52) | function _10(_11,_12){
function _17 (line 89) | function _17(_18,_19){
FILE: src/test/java/cn/lastwhisper/GoBackTest.java
class GoBackTest (line 12) | public class GoBackTest {
method main (line 14) | public static void main(String[] args){
FILE: src/test/java/cn/lastwhisper/MD5.java
class MD5 (line 19) | public class MD5 {
method encrypt (line 27) | private static String encrypt(String source, String salt) {
method main (line 31) | public static void main(String[] args) {
Condensed preview — 292 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (959K chars).
[
{
"path": ".gitattributes",
"chars": 115,
"preview": "*.js linguist-language=java\n*.css linguist-language=java\n*.html linguist-language=java\n*.jsp linguist-language=java"
},
{
"path": ".gitignore",
"chars": 15,
"preview": "/target/\n.idea\n"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 5759,
"preview": ">该项目源码地址:https://github.com/lastwhispers/permission\n项目在线地址:http://39.105.49.50:8080/permission/login.html\n初始用户: \n系统管理员:"
},
{
"path": "docker/Dockerfile",
"chars": 153,
"preview": "FROM hub.c.163.com/library/tomcat\nMAINTAINER lastwhisper lastwhisper@yeah.net\n# copy war到container的tomcat中\nCOPY permissi"
},
{
"path": "docker/docker-compose.yml",
"chars": 674,
"preview": "version: \"3\"\n\nservices:\n permission:\n build:\n context: .\n dockerfile: Dockerfile\n ports:\n - \"8080:"
},
{
"path": "docker/mysql/conf/my.cnf",
"chars": 146,
"preview": "[mysqld]\nuser=mysql\ndefault-storage-engine=INNODB\ncharacter-set-server=utf8\n[client]\ndefault-character-set=utf8\n[mysql]\n"
},
{
"path": "docker/mysql/init/init.sql",
"chars": 7321,
"preview": "/*\n Navicat Premium Data Transfer\n\n Source Server : 本地数据库-mysql5.7\n Source Server Type : MySQL\n Source Server"
},
{
"path": "docker/redis/Dockerfile",
"chars": 93,
"preview": "FROM hub.c.163.com/library/redis:latest\nMAINTAINER lastwhisper gaojun56@163.com\n# 安装ping、ip等\n"
},
{
"path": "permission.iml",
"chars": 5732,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule=\"true"
},
{
"path": "pom.xml",
"chars": 9070,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n "
},
{
"path": "resource/shell/delmysqldump.sh",
"chars": 82,
"preview": "#! /bin/bash\nfind /root/backformysql/ -mtime +7 -name \"*.sql\" -exec rm -rf {} \\;\n"
},
{
"path": "resource/shell/mysqldump.sh",
"chars": 265,
"preview": "#! /bin/bash\necho \"mysqldump start ...\"\nmysqldump -uroot -proot -P 3306 permission > /root/backformysql/DB_permission_`d"
},
{
"path": "resource/shell/permission.sh",
"chars": 231,
"preview": "#!/bin/bash\n# 还原数据库\nmysql -uroot -proot -P 3306 < reset.sql\n\n# 清空redis\ncd /usr/local/redis-5/bin/\ndb=0\n#可以用第一个参数指定需求清除的库"
},
{
"path": "resource/shell/使用crontab.md",
"chars": 311,
"preview": "# crontab -e写入如下内容\n```shell script\n0 */12 * * * /root/mysqldump.sh # 每隔12个小时备份一次数据库\n0 */2 * * * /root/permission.sh # 每"
},
{
"path": "resource/sql/permission.sql",
"chars": 7277,
"preview": "/*\n Navicat Premium Data Transfer\n\n Source Server : 本地数据库-mysql5.7\n Source Server Type : MySQL\n Source Server"
},
{
"path": "src/main/java/cn/lastwhisper/core/annotation/LogAnno.java",
"chars": 394,
"preview": "package cn.lastwhisper.core.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;"
},
{
"path": "src/main/java/cn/lastwhisper/core/aop/LogAopAspect.java",
"chars": 2004,
"preview": "package cn.lastwhisper.core.aop;\n\nimport java.lang.reflect.Method;\nimport java.sql.SQLException;\nimport java.util.Date;\n"
},
{
"path": "src/main/java/cn/lastwhisper/core/shiro/Realm.java",
"chars": 1955,
"preview": "package cn.lastwhisper.core.shiro;\n\n\nimport java.util.List;\n\nimport org.apache.shiro.authc.AuthenticationException;\nimpo"
},
{
"path": "src/main/java/cn/lastwhisper/core/task/GoBackTask.java",
"chars": 2547,
"preview": "package cn.lastwhisper.core.task;\n\nimport org.apache.ibatis.io.Resources;\nimport org.apache.ibatis.jdbc.ScriptRunner;\nim"
},
{
"path": "src/main/java/cn/lastwhisper/core/util/UserUtils.java",
"chars": 2812,
"preview": "/** \n * @Title: RoleService.java \n * @Package cn.lastwhisper.service \n * @Description: TODO(用一句话描述该文件做什么)\n * @auth"
},
{
"path": "src/main/java/cn/lastwhisper/modular/controller/LogController.java",
"chars": 1878,
"preview": "/** \n * @Title: RoleController.java \n * @Package cn.lastwhisper.controller \n * @Description: TODO(用一句话描述该文件做什么)\n *"
},
{
"path": "src/main/java/cn/lastwhisper/modular/controller/MenuController.java",
"chars": 2742,
"preview": "/** \n * @Title: MenuController.java \n * @Package cn.lastwhisper.controller \n * @Description: TODO(用一句话描述该文件做什么)\n *"
},
{
"path": "src/main/java/cn/lastwhisper/modular/controller/RoleController.java",
"chars": 4297,
"preview": "package cn.lastwhisper.modular.controller;\n\n\nimport java.util.List;\n\nimport cn.lastwhisper.core.annotation.LogAnno;\nimpo"
},
{
"path": "src/main/java/cn/lastwhisper/modular/controller/UserController.java",
"chars": 7862,
"preview": "package cn.lastwhisper.modular.controller;\n\nimport java.io.IOException;\nimport java.sql.SQLException;\nimport java.util.D"
},
{
"path": "src/main/java/cn/lastwhisper/modular/mapper/LogMapper.java",
"chars": 855,
"preview": "package cn.lastwhisper.modular.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\n\nimport cn.l"
},
{
"path": "src/main/java/cn/lastwhisper/modular/mapper/LogMapper.xml",
"chars": 1244,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\nPUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n\"http://mybatis.org/"
},
{
"path": "src/main/java/cn/lastwhisper/modular/mapper/MenuMapper.java",
"chars": 1886,
"preview": "package cn.lastwhisper.modular.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\n\nimport cn.l"
},
{
"path": "src/main/java/cn/lastwhisper/modular/mapper/MenuMapper.xml",
"chars": 3183,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\nPUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n\"http://mybatis.org/"
},
{
"path": "src/main/java/cn/lastwhisper/modular/mapper/RoleMapper.java",
"chars": 2477,
"preview": "package cn.lastwhisper.modular.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\n\nimport cn.l"
},
{
"path": "src/main/java/cn/lastwhisper/modular/mapper/RoleMapper.xml",
"chars": 1832,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\nPUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n\"http://mybatis.org/"
},
{
"path": "src/main/java/cn/lastwhisper/modular/mapper/UserMapper.java",
"chars": 2694,
"preview": "package cn.lastwhisper.modular.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\n\nimport cn.l"
},
{
"path": "src/main/java/cn/lastwhisper/modular/mapper/UserMapper.xml",
"chars": 3178,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\nPUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n\"http://mybatis.org/"
},
{
"path": "src/main/java/cn/lastwhisper/modular/pojo/Log.java",
"chars": 1270,
"preview": "package cn.lastwhisper.modular.pojo;\n\nimport java.util.Date;\n\npublic class Log {\n private Integer id;\n\n private St"
},
{
"path": "src/main/java/cn/lastwhisper/modular/pojo/Menu.java",
"chars": 2646,
"preview": "/** \n * @Title: Menu.java \n * @Package cn.lastwhisper.pojo \n * @Description: TODO(用一句话描述该文件做什么)\n * @author: 最后的轻语_"
},
{
"path": "src/main/java/cn/lastwhisper/modular/pojo/Role.java",
"chars": 955,
"preview": "/** \n * @Title: Role.java \n * @Package cn.lastwhisper.pojo \n * @Description: TODO(用一句话描述该文件做什么)\n * @author: 最后的轻语_"
},
{
"path": "src/main/java/cn/lastwhisper/modular/pojo/User.java",
"chars": 1690,
"preview": "\npackage cn.lastwhisper.modular.pojo;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\nimport org.springframework.f"
},
{
"path": "src/main/java/cn/lastwhisper/modular/service/LogService.java",
"chars": 843,
"preview": "package cn.lastwhisper.modular.service;\n\nimport java.sql.SQLException;\nimport java.util.List;\n\nimport cn.lastwhisper.mod"
},
{
"path": "src/main/java/cn/lastwhisper/modular/service/MenuService.java",
"chars": 1785,
"preview": "/** \n * @Title: MenuService.java \n * @Package cn.lastwhisper.service \n * @Description: TODO(用一句话描述该文件做什么)\n * @auth"
},
{
"path": "src/main/java/cn/lastwhisper/modular/service/RoleService.java",
"chars": 2512,
"preview": "/** \n * @Title: RoleService.java \n * @Package cn.lastwhisper.service \n * @Description: TODO(用一句话描述该文件做什么)\n * @auth"
},
{
"path": "src/main/java/cn/lastwhisper/modular/service/UserService.java",
"chars": 3118,
"preview": "package cn.lastwhisper.modular.service;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputSt"
},
{
"path": "src/main/java/cn/lastwhisper/modular/service/impl/LogServiceImpl.java",
"chars": 1706,
"preview": "package cn.lastwhisper.modular.service.impl;\n\nimport java.sql.SQLException;\nimport java.util.List;\n\nimport org.springfra"
},
{
"path": "src/main/java/cn/lastwhisper/modular/service/impl/MenuServiceImpl.java",
"chars": 5637,
"preview": "\npackage cn.lastwhisper.modular.service.impl;\n\nimport cn.lastwhisper.modular.mapper.MenuMapper;\nimport cn.lastwhisper.mo"
},
{
"path": "src/main/java/cn/lastwhisper/modular/service/impl/RoleServiceImpl.java",
"chars": 5388,
"preview": "/** \n * @Title: RoleServiceImpl.java \n * @Package cn.lastwhisper.service.impl \n * @Description: TODO(用一句话描述该文件做什么)"
},
{
"path": "src/main/java/cn/lastwhisper/modular/service/impl/UserServiceImpl.java",
"chars": 10311,
"preview": "package cn.lastwhisper.modular.service.impl;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.Out"
},
{
"path": "src/main/java/cn/lastwhisper/modular/vo/EasyUIDataGridResult.java",
"chars": 860,
"preview": "/** \n * @Title: RoleService.java \n * @Package cn.lastwhisper.service \n * @Description: TODO(用一句话描述该文件做什么)\n * @auth"
},
{
"path": "src/main/java/cn/lastwhisper/modular/vo/EasyUIOptionalTreeNode.java",
"chars": 1177,
"preview": "/** \n * @Title: RoleService.java \n * @Package cn.lastwhisper.service \n * @Description: TODO(用一句话描述该文件做什么)\n * @auth"
},
{
"path": "src/main/java/cn/lastwhisper/modular/vo/GlobalResult.java",
"chars": 2048,
"preview": "/** \n * @Title: RoleService.java \n * @Package cn.lastwhisper.service \n * @Description: TODO(用一句话描述该文件做什么)\n * @auth"
},
{
"path": "src/main/java/cn/lastwhisper/modular/vo/Tree.java",
"chars": 1253,
"preview": "package cn.lastwhisper.modular.vo;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.fasterxml.jackson.ann"
},
{
"path": "src/main/resources/applicationContext.xml",
"chars": 3483,
"preview": "<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t "
},
{
"path": "src/main/resources/applicationContext_jedis.xml",
"chars": 1076,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://ww"
},
{
"path": "src/main/resources/applicationContext_shiro.xml",
"chars": 2952,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n xmlns:xsi=\"http"
},
{
"path": "src/main/resources/db-local.properties",
"chars": 821,
"preview": "jdbc.driver=com.mysql.jdbc.Driver\njdbc.url=jdbc:mysql://mysql:3306/permission\njdbc.username=root\njdbc.password=391054950"
},
{
"path": "src/main/resources/db.properties",
"chars": 813,
"preview": "jdbc.driver=com.mysql.jdbc.Driver\njdbc.url=jdbc:mysql://mysql:3306/permission\njdbc.username=root\njdbc.password=root\n\n#ip"
},
{
"path": "src/main/resources/log4j.properties",
"chars": 521,
"preview": "# Global logging configuration\\uff0c\\u5efa\\u8bae\\u5f00\\u53d1\\u73af\\u5883\\u4e2d\\u8981\\u7528debug\nlog4j.rootLogger=INFO, s"
},
{
"path": "src/main/resources/reset.sql",
"chars": 3478,
"preview": "\nSET NAMES utf8mb4;\n\ntruncate table `menu`;\ntruncate table `role`;\ntruncate table `role_menu`;\ntruncate table `user`;\ntr"
},
{
"path": "src/main/resources/springmvc.xml",
"chars": 1621,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www"
},
{
"path": "src/main/resources/sqlMapConfig.xml",
"chars": 839,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE configuration\nPUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n\"http://myba"
},
{
"path": "src/main/webapp/WEB-INF/web.xml",
"chars": 3841,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns=\"http://jav"
},
{
"path": "src/main/webapp/adminjs/index.js",
"chars": 12117,
"preview": "window.onload = function () {\n $('#loading-mask').fadeOut();\n};\nvar onlyOpenTitle = \"欢迎使用\";// 不允许关闭的标签的标题\n\nvar _menus"
},
{
"path": "src/main/webapp/adminjs/themes/default/accordion.css",
"chars": 564,
"preview": ".accordion{\n\tbackground:#fff;\n\toverflow:hidden;\n}\n.accordion .accordion-header{\n\tbackground:#E0ECFF;\n\tborder-top-width:0"
},
{
"path": "src/main/webapp/adminjs/themes/default/calendar.css",
"chars": 2856,
"preview": ".calendar{\n\tbackground:#fff;\n\tborder:1px solid #A4BED4;\n\tpadding:1px;\n\toverflow:hidden;\n}\n.calendar-noborder{\n\tborder:0p"
},
{
"path": "src/main/webapp/adminjs/themes/default/combo.css",
"chars": 647,
"preview": ".combo{\n\tdisplay:inline-block;\n\twhite-space:nowrap;\n\tfont-size:12px;\n\tmargin:0;\n\tpadding:0;\n\tborder:1px solid #A4BED4;\n\t"
},
{
"path": "src/main/webapp/adminjs/themes/default/combobox.css",
"chars": 175,
"preview": ".combobox-item{\n\tpadding:2px;\n\tfont-size:12px;\n\tpadding:3px;\n\tpadding-right:0px;\n}\n.combobox-item-hover{\n\tbackground:#fa"
},
{
"path": "src/main/webapp/adminjs/themes/default/datagrid.css",
"chars": 4229,
"preview": ".datagrid .panel-body{\n\toverflow:hidden;\n}\n.datagrid-wrap{\n\tposition:relative;\n}\n.datagrid-view{\n\tposition:relative;\n\tov"
},
{
"path": "src/main/webapp/adminjs/themes/default/datebox.css",
"chars": 497,
"preview": ".datebox .combo-arrow{\n\tbackground:url('images/datebox_arrow.png') no-repeat center center;\n}\n.datebox-calendar-inner{\n\t"
},
{
"path": "src/main/webapp/adminjs/themes/default/dialog.css",
"chars": 399,
"preview": ".dialog-content{\n\toverflow:auto;\n}\n.dialog-toolbar{\n\tbackground:#fafafa;\n\tpadding:2px 5px;\n\tborder-bottom:1px solid #eee"
},
{
"path": "src/main/webapp/adminjs/themes/default/easyui.css",
"chars": 31021,
"preview": ".accordion{\n\tbackground:#fff;\n\toverflow:hidden;\n}\n.accordion .accordion-header{\n\tbackground:#E0ECFF;\n\tborder-top-width:0"
},
{
"path": "src/main/webapp/adminjs/themes/default/layout.css",
"chars": 1586,
"preview": ".layout{\n\tposition:relative;\n\toverflow:hidden;\n\tmargin:0;\n\tpadding:0;\n}\n.layout-panel{\n\tposition:absolute;\n\toverflow:hid"
},
{
"path": "src/main/webapp/adminjs/themes/default/linkbutton.css",
"chars": 1433,
"preview": "a.l-btn{\n\tcolor:#444;\n\tbackground:url('images/button_a_bg.gif') no-repeat top right;\n\tfont-size:12px;\n\ttext-decoration:n"
},
{
"path": "src/main/webapp/adminjs/themes/default/menu.css",
"chars": 1313,
"preview": ".menu{\n\tposition:absolute;\n\tbackground:#f0f0f0 url('images/menu.gif') repeat-y;\n\tmargin:0;\n\tpadding:2px;\n\tborder:1px sol"
},
{
"path": "src/main/webapp/adminjs/themes/default/menubutton.css",
"chars": 443,
"preview": ".m-btn-downarrow{\n\tdisplay:inline-block;\n\twidth:12px;\n\tline-height:14px;\n\t*line-height:15px;\n\tbackground:url('images/men"
},
{
"path": "src/main/webapp/adminjs/themes/default/messager.css",
"chars": 659,
"preview": ".messager-body{\n\tpadding:5px 10px;\n}\n.messager-button{\n\ttext-align:center;\n\tpadding-top:10px;\n}\n.messager-icon{\n\tfloat:l"
},
{
"path": "src/main/webapp/adminjs/themes/default/pagination.css",
"chars": 900,
"preview": ".pagination{\n\tzoom:1;\n}\n.pagination table{\n\tfloat:left;\n\theight:30px;\n}\n.pagination-btn-separator{\n\tfloat:left;\n\theight:"
},
{
"path": "src/main/webapp/adminjs/themes/default/panel.css",
"chars": 1578,
"preview": ".panel{\n\toverflow:hidden;\n\tfont-size:12px;\n}\n.panel-header{\n\tpadding:5px;\n\tline-height:15px;\n\tcolor:#15428b;\n\tfont-weigh"
},
{
"path": "src/main/webapp/adminjs/themes/default/progressbar.css",
"chars": 300,
"preview": ".progressbar{\n\tborder:1px solid #99BBE8;\n\tborder-radius:5px;\n\toverflow:hidden;\n}\n.progressbar-text{\n\ttext-align:center;\n"
},
{
"path": "src/main/webapp/adminjs/themes/default/propertygrid.css",
"chars": 563,
"preview": ".propertygrid .datagrid-view1 .datagrid-body,.propertygrid .datagrid-group{\n\tbackground:#E0ECFF;\n}\n.propertygrid .datagr"
},
{
"path": "src/main/webapp/adminjs/themes/default/searchbox.css",
"chars": 1055,
"preview": ".searchbox{\n\tdisplay:inline-block;\n\twhite-space:nowrap;\n\tfont-size:12px;\n\tmargin:0;\n\tpadding:0;\n\tborder:1px solid #A4BED"
},
{
"path": "src/main/webapp/adminjs/themes/default/slider.css",
"chars": 1257,
"preview": ".slider{\n}\n.slider-disabled{\n\topacity:0.5;\n\tfilter:alpha(opacity=50);\n}\n.slider-h{\n\theight:22px;\n}\n.slider-v{\n\twidth:22p"
},
{
"path": "src/main/webapp/adminjs/themes/default/spinner.css",
"chars": 695,
"preview": ".spinner{\n\tdisplay:inline-block;\n\twhite-space:nowrap;\n\tfont-size:12px;\n\tmargin:0;\n\tpadding:0;\n\tborder:1px solid #A4BED4;"
},
{
"path": "src/main/webapp/adminjs/themes/default/splitbutton.css",
"chars": 769,
"preview": ".s-btn-downarrow{\n\tdisplay:inline-block;\n\twidth:16px;\n\tline-height:14px;\n\t*line-height:15px;\n\tbackground:url('images/men"
},
{
"path": "src/main/webapp/adminjs/themes/default/tabs.css",
"chars": 3708,
"preview": ".tabs-container{\n\toverflow:hidden;\n\tbackground:#fff;\n}\n.tabs-header{\n\tborder:1px solid #8DB2E3;\n\tbackground:#E0ECFF;\n\tbo"
},
{
"path": "src/main/webapp/adminjs/themes/default/tree.css",
"chars": 3441,
"preview": ".tree{\n\tfont-size:12px;\n\tmargin:0;\n\tpadding:0;\n\tlist-style-type:none;\n}\n.tree li{\n\twhite-space:nowrap;\n}\n.tree li ul{\n\tl"
},
{
"path": "src/main/webapp/adminjs/themes/default/validatebox.css",
"chars": 605,
"preview": ".validatebox-invalid{\n\tbackground:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;\n}\n.validatebox-tip{"
},
{
"path": "src/main/webapp/adminjs/themes/default/window.css",
"chars": 1349,
"preview": ".window {\n\tfont-size:12px;\n\tposition:absolute;\n\toverflow:hidden;\n\tbackground:transparent url('images/panel_title.png');\n"
},
{
"path": "src/main/webapp/adminjs/themes/gray/accordion.css",
"chars": 564,
"preview": ".accordion{\n\tbackground:#fff;\n\toverflow:hidden;\n}\n.accordion .accordion-header{\n\tbackground:#efefef;\n\tborder-top-width:0"
},
{
"path": "src/main/webapp/adminjs/themes/gray/calendar.css",
"chars": 2856,
"preview": ".calendar{\n\tbackground:#fff;\n\tborder:1px solid #d3d3d3;\n\tpadding:1px;\n\toverflow:hidden;\n}\n.calendar-noborder{\n\tborder:0p"
},
{
"path": "src/main/webapp/adminjs/themes/gray/combo.css",
"chars": 647,
"preview": ".combo{\n\tdisplay:inline-block;\n\twhite-space:nowrap;\n\tfont-size:12px;\n\tmargin:0;\n\tpadding:0;\n\tborder:1px solid #d3d3d3;\n\t"
},
{
"path": "src/main/webapp/adminjs/themes/gray/combobox.css",
"chars": 175,
"preview": ".combobox-item{\n\tpadding:2px;\n\tfont-size:12px;\n\tpadding:3px;\n\tpadding-right:0px;\n}\n.combobox-item-hover{\n\tbackground:#fa"
},
{
"path": "src/main/webapp/adminjs/themes/gray/datagrid.css",
"chars": 4223,
"preview": ".datagrid .panel-body{\n\toverflow:hidden;\n}\n.datagrid-wrap{\n\tposition:relative;\n}\n.datagrid-view{\n\tposition:relative;\n\tov"
},
{
"path": "src/main/webapp/adminjs/themes/gray/datebox.css",
"chars": 497,
"preview": ".datebox .combo-arrow{\n\tbackground:url('images/datebox_arrow.png') no-repeat center center;\n}\n.datebox-calendar-inner{\n\t"
},
{
"path": "src/main/webapp/adminjs/themes/gray/dialog.css",
"chars": 399,
"preview": ".dialog-content{\n\toverflow:auto;\n}\n.dialog-toolbar{\n\tbackground:#fafafa;\n\tpadding:2px 5px;\n\tborder-bottom:1px solid #eee"
},
{
"path": "src/main/webapp/adminjs/themes/gray/easyui.css",
"chars": 30910,
"preview": ".accordion{\n\tbackground:#fff;\n\toverflow:hidden;\n}\n.accordion .accordion-header{\n\tbackground:#efefef;\n\tborder-top-width:0"
},
{
"path": "src/main/webapp/adminjs/themes/gray/layout.css",
"chars": 1586,
"preview": ".layout{\n\tposition:relative;\n\toverflow:hidden;\n\tmargin:0;\n\tpadding:0;\n}\n.layout-panel{\n\tposition:absolute;\n\toverflow:hid"
},
{
"path": "src/main/webapp/adminjs/themes/gray/linkbutton.css",
"chars": 1430,
"preview": "a.l-btn{\n\tcolor:#444;\n\tbackground:url('images/button_a_bg.gif') no-repeat top right;\n\tfont-size:12px;\n\ttext-decoration:n"
},
{
"path": "src/main/webapp/adminjs/themes/gray/menu.css",
"chars": 1312,
"preview": ".menu{\n\tposition:absolute;\n\tbackground:#f0f0f0 url('images/menu.gif') repeat-y;\n\tmargin:0;\n\tpadding:2px;\n\tborder:1px sol"
},
{
"path": "src/main/webapp/adminjs/themes/gray/menubutton.css",
"chars": 443,
"preview": ".m-btn-downarrow{\n\tdisplay:inline-block;\n\twidth:12px;\n\tline-height:14px;\n\t*line-height:15px;\n\tbackground:url('images/men"
},
{
"path": "src/main/webapp/adminjs/themes/gray/messager.css",
"chars": 659,
"preview": ".messager-body{\n\tpadding:5px 10px;\n}\n.messager-button{\n\ttext-align:center;\n\tpadding-top:10px;\n}\n.messager-icon{\n\tfloat:l"
},
{
"path": "src/main/webapp/adminjs/themes/gray/pagination.css",
"chars": 900,
"preview": ".pagination{\n\tzoom:1;\n}\n.pagination table{\n\tfloat:left;\n\theight:30px;\n}\n.pagination-btn-separator{\n\tfloat:left;\n\theight:"
},
{
"path": "src/main/webapp/adminjs/themes/gray/panel.css",
"chars": 1578,
"preview": ".panel{\n\toverflow:hidden;\n\tfont-size:12px;\n}\n.panel-header{\n\tpadding:5px;\n\tline-height:15px;\n\tcolor:#3F3F3F;\n\tfont-weigh"
},
{
"path": "src/main/webapp/adminjs/themes/gray/progressbar.css",
"chars": 297,
"preview": ".progressbar{\n\tborder:1px solid #D3D3D3;\n\tborder-radius:5px;\n\toverflow:hidden;\n}\n.progressbar-text{\n\ttext-align:center;\n"
},
{
"path": "src/main/webapp/adminjs/themes/gray/propertygrid.css",
"chars": 563,
"preview": ".propertygrid .datagrid-view1 .datagrid-body,.propertygrid .datagrid-group{\n\tbackground:#fafafa;\n}\n.propertygrid .datagr"
},
{
"path": "src/main/webapp/adminjs/themes/gray/searchbox.css",
"chars": 1055,
"preview": ".searchbox{\n\tdisplay:inline-block;\n\twhite-space:nowrap;\n\tfont-size:12px;\n\tmargin:0;\n\tpadding:0;\n\tborder:1px solid #d3d3d"
},
{
"path": "src/main/webapp/adminjs/themes/gray/slider.css",
"chars": 1257,
"preview": ".slider{\n}\n.slider-disabled{\n\topacity:0.5;\n\tfilter:alpha(opacity=50);\n}\n.slider-h{\n\theight:22px;\n}\n.slider-v{\n\twidth:22p"
},
{
"path": "src/main/webapp/adminjs/themes/gray/spinner.css",
"chars": 695,
"preview": ".spinner{\n\tdisplay:inline-block;\n\twhite-space:nowrap;\n\tfont-size:12px;\n\tmargin:0;\n\tpadding:0;\n\tborder:1px solid #d3d3d3;"
},
{
"path": "src/main/webapp/adminjs/themes/gray/splitbutton.css",
"chars": 769,
"preview": ".s-btn-downarrow{\n\tdisplay:inline-block;\n\twidth:16px;\n\tline-height:14px;\n\t*line-height:15px;\n\tbackground:url('images/men"
},
{
"path": "src/main/webapp/adminjs/themes/gray/tabs.css",
"chars": 3608,
"preview": ".tabs-container{\n\toverflow:hidden;\n\tbackground:#fff;\n}\n.tabs-header{\n\tborder:1px solid #D3D3D3;\n\tbackground:#efefef;\n\tbo"
},
{
"path": "src/main/webapp/adminjs/themes/gray/tree.css",
"chars": 3441,
"preview": ".tree{\n\tfont-size:12px;\n\tmargin:0;\n\tpadding:0;\n\tlist-style-type:none;\n}\n.tree li{\n\twhite-space:nowrap;\n}\n.tree li ul{\n\tl"
},
{
"path": "src/main/webapp/adminjs/themes/gray/validatebox.css",
"chars": 605,
"preview": ".validatebox-invalid{\n\tbackground:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;\n}\n.validatebox-tip{"
},
{
"path": "src/main/webapp/adminjs/themes/gray/window.css",
"chars": 1351,
"preview": ".window {\n\tfont-size:12px;\n\tposition:absolute;\n\toverflow:hidden;\n\tbackground:#eee url('images/panel_title.gif') repeat-x"
},
{
"path": "src/main/webapp/adminjs/themes/icon.css",
"chars": 1317,
"preview": ".icon-blank{\n\tbackground:url('icons/blank.gif') no-repeat;\n}\n.icon-add{\n\tbackground:url('icons/edit_add.png') no-repeat;"
},
{
"path": "src/main/webapp/casual.html",
"chars": 114,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>临时工计件页面</title>\n</head>\n<body>\n临时工计件页面\n</body>\n</html>"
},
{
"path": "src/main/webapp/css/default.css",
"chars": 2146,
"preview": "*{font-size:12px; font-family:Tahoma,Verdana,微软雅黑,新宋体}\nbody{background:#D2E0F2; }\na{ color:Black; text-decoration:none;"
},
{
"path": "src/main/webapp/css/login.css",
"chars": 5716,
"preview": "/* CSS Document */\n/* Download by http://www.codefans.net\n* Basic Cascading Style Sheet\n* Intructions: none\n* Version: 1"
},
{
"path": "src/main/webapp/css/table.css",
"chars": 424,
"preview": "table.hovertable {\n\tfont-family: verdana,arial,sans-serif;\n\tfont-size:9px;\n\tcolor:#333333;\n\twidth:100%;\n\tborder-collapse"
},
{
"path": "src/main/webapp/dept.html",
"chars": 110,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>部门管理</title>\n</head>\n<body>\n部门管理页面\n</body>\n</html>"
},
{
"path": "src/main/webapp/emp.html",
"chars": 110,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>员工管理页面</title>\n</head>\n<body>\n员工管理\n</body>\n</html>"
},
{
"path": "src/main/webapp/error.html",
"chars": 121,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>Insert title here</title>\n</head>\n<body>\n权限不足\n</body>\n</html"
},
{
"path": "src/main/webapp/index.html",
"chars": 4273,
"preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transiti"
},
{
"path": "src/main/webapp/js/config.js",
"chars": 27,
"preview": "var baseName = \"permission\""
},
{
"path": "src/main/webapp/js/crud.js",
"chars": 4354,
"preview": "/**\n * esayui通用增删改查以及导入导出\n */\n//提交的方法名称\nvar method = \"\";\nvar listParam = \"\";\nvar saveParam = \"\";\n$(function() {\n\t// 加载表格"
},
{
"path": "src/main/webapp/js/download.js",
"chars": 347,
"preview": "// Ajax 文件下载\n$.download = function(url, data){ // 获得url和data\n var inputs = ''; \n $.each(data, function(name,"
},
{
"path": "src/main/webapp/js/menu.js",
"chars": 7719,
"preview": "$(function() {\n\tloadTree();\n\t// 添加数据对话框\n\t$('#insertDlg').dialog({\n\t\ttitle : '添加数据',\n\t\twidth : 360,\n\t\theight : 200,\n\t\tclo"
},
{
"path": "src/main/webapp/js/roleMenuSet.js",
"chars": 1671,
"preview": "/**\n * \n */\n$(function() {\n\t$('#grid').datagrid({ \n\t url:'role/rolelistByPage',\n\t frozenColumns : [ [ {\n\t\t\tfiel"
},
{
"path": "src/main/webapp/js/search.js",
"chars": 1283,
"preview": "/**\n * esayui通用搜索\n */\n$(function() {\n\t// 自动补全\n\t$('#inputtable').combobox(\n\t\t\t{\n\t\t\t\tprompt : '输入关键字后自动搜索',\n\t\t\t\tmode : 're"
},
{
"path": "src/main/webapp/js/userRoleSet.js",
"chars": 1753,
"preview": "$(function() {\n\t$('#grid').datagrid({\n\t\turl : 'user/userlistByPage',\n\t\tfrozenColumns : [ [ {\n\t\t\tfield : 'ck',\n\t\t\tcheckbo"
},
{
"path": "src/main/webapp/log.html",
"chars": 2039,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>角色管理</title>\n<link rel=\"stylesheet\" type=\"text/css\"\n\thref=\"u"
},
{
"path": "src/main/webapp/login.html",
"chars": 2403,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>基于SSM框架的后台权限管理系统</title>\n<link rel=\"stylesheet\" type=\"text/"
},
{
"path": "src/main/webapp/menu.html",
"chars": 3552,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>菜单管理</title>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"ui"
},
{
"path": "src/main/webapp/role.html",
"chars": 1940,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>角色管理</title>\n<link rel=\"stylesheet\" type=\"text/css\"\n\thref=\"u"
},
{
"path": "src/main/webapp/roleMenuSet.html",
"chars": 1689,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>角色权限设置</title>\n<link rel=\"stylesheet\" type=\"text/css\"\n\thref="
},
{
"path": "src/main/webapp/sale.html",
"chars": 114,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>销售额统计页面</title>\n</head>\n<body>\n销售额统计页面\n</body>\n</html>"
},
{
"path": "src/main/webapp/ui/date.js",
"chars": 1120,
"preview": "// 对Date的扩展,将 Date 转化为指定格式的String \n// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符, \n// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 "
},
{
"path": "src/main/webapp/ui/download.js",
"chars": 347,
"preview": "// Ajax 文件下载\n$.download = function(url, data){ // 获得url和data\n var inputs = ''; \n $.each(data, function(name,"
},
{
"path": "src/main/webapp/ui/easyloader.js",
"chars": 6513,
"preview": "/**\n * jQuery EasyUI 1.3.5\n * \n * Copyright (c) 2009-2013 www.jeasyui.com. All rights reserved.\n *\n * Licensed under th"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-af.js",
"chars": 1906,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Bladsy';\n\t$.fn.pagination.defaults.afterPageText = 'Va"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-ar.js",
"chars": 1934,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'صفحة';\n\t$.fn.pagination.defaults.afterPageText = 'من {"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-bg.js",
"chars": 1943,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Страница';\n\t$.fn.pagination.defaults.afterPageText = '"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-ca.js",
"chars": 1972,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Pàgina';\n\t$.fn.pagination.defaults.afterPageText = 'de"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-cs.js",
"chars": 1938,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Strana';\n\t$.fn.pagination.defaults.afterPageText = 'z "
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-cz.js",
"chars": 2072,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Strana';\n\t$.fn.pagination.defaults.afterPageText = 'z "
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-da.js",
"chars": 1904,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Page';\n\t$.fn.pagination.defaults.afterPageText = 'af {"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-de.js",
"chars": 2518,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Seite';\n\t$.fn.pagination.defaults.afterPageText = 'von"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-el.js",
"chars": 2090,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Σελίδα';\n\t$.fn.pagination.defaults.afterPageText = 'απ"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-en.js",
"chars": 1991,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Page';\n\t$.fn.pagination.defaults.afterPageText = 'of {"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-es.js",
"chars": 2102,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Página';\n\t$.fn.pagination.defaults.afterPageTex"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-fr.js",
"chars": 2003,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Page';\n\t$.fn.pagination.defaults.afterPageText = 'de {"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-it.js",
"chars": 2008,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Pagina';\n\t$.fn.pagination.defaults.afterPageText = 'di"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-jp.js",
"chars": 1827,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'ページ';\n\t$.fn.pagination.defaults.afterPageText = '{page"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-nl.js",
"chars": 1902,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Pagina';\n\t$.fn.pagination.defaults.afterPageText = 'va"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-pl.js",
"chars": 2001,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Strona';\n\t$.fn.pagination.defaults.afterPageText = 'z "
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-pt_BR.js",
"chars": 1976,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Página';\n\t$.fn.pagination.defaults.afterPageText = 'de"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-ru.js",
"chars": 2056,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = 'Страница';\n\t$.fn.pagination.defaults.afterPageText = '"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-sv_SE.js",
"chars": 2168,
"preview": "if ($.fn.pagination) {\n $.fn.pagination.defaults.beforePageText = 'Sida';\n $.fn.pagination.defaults.afterPageText "
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-tr.js",
"chars": 2511,
"preview": "if ($.fn.pagination){\n $.fn.pagination.defaults.beforePageText = 'Sayfa';\n $.fn.pagination.defaults.afterPageText "
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-zh_CN.js",
"chars": 2254,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = '第';\n\t$.fn.pagination.defaults.afterPageText = '共{pages"
},
{
"path": "src/main/webapp/ui/locale/easyui-lang-zh_TW.js",
"chars": 1757,
"preview": "if ($.fn.pagination){\n\t$.fn.pagination.defaults.beforePageText = '第';\n\t$.fn.pagination.defaults.afterPageText = '共{pages"
},
{
"path": "src/main/webapp/ui/themes/black/accordion.css",
"chars": 829,
"preview": ".accordion {\n overflow: hidden;\n border-width: 1px;\n border-style: solid;\n}\n.accordion .accordion-header {\n border-w"
},
{
"path": "src/main/webapp/ui/themes/black/calendar.css",
"chars": 3620,
"preview": ".calendar {\n border-width: 1px;\n border-style: solid;\n padding: 1px;\n overflow: hidden;\n}\n.calendar table {\n border"
},
{
"path": "src/main/webapp/ui/themes/black/combo.css",
"chars": 1005,
"preview": ".combo {\n display: inline-block;\n white-space: nowrap;\n margin: 0;\n padding: 0;\n border-width: 1px;\n border-style:"
},
{
"path": "src/main/webapp/ui/themes/black/combobox.css",
"chars": 387,
"preview": ".combobox-item,\n.combobox-group {\n font-size: 12px;\n padding: 3px;\n padding-right: 0px;\n}\n.combobox-item-disabled {\n "
},
{
"path": "src/main/webapp/ui/themes/black/datagrid.css",
"chars": 5028,
"preview": ".datagrid .panel-body {\n overflow: hidden;\n position: relative;\n}\n.datagrid-view {\n position: relative;\n overflow: h"
},
{
"path": "src/main/webapp/ui/themes/black/datebox.css",
"chars": 616,
"preview": ".datebox-calendar-inner {\n height: 180px;\n}\n.datebox-button {\n height: 18px;\n padding: 2px 5px;\n text-align: center;"
},
{
"path": "src/main/webapp/ui/themes/black/dialog.css",
"chars": 478,
"preview": ".dialog-content {\n overflow: auto;\n}\n.dialog-toolbar {\n padding: 2px 5px;\n}\n.dialog-tool-separator {\n float: left;\n "
},
{
"path": "src/main/webapp/ui/themes/black/easyui.css",
"chars": 47526,
"preview": ".panel {\n overflow: hidden;\n text-align: left;\n margin: 0;\n border: 0;\n -moz-border-radius: 0 0 0 0;\n -webkit-bord"
},
{
"path": "src/main/webapp/ui/themes/black/layout.css",
"chars": 1681,
"preview": ".layout {\n position: relative;\n overflow: hidden;\n margin: 0;\n padding: 0;\n z-index: 0;\n}\n.layout-panel {\n positio"
},
{
"path": "src/main/webapp/ui/themes/black/linkbutton.css",
"chars": 3796,
"preview": "a.l-btn {\n background-position: right 0;\n text-decoration: none;\n display: inline-block;\n zoom: 1;\n height: 24px;\n "
},
{
"path": "src/main/webapp/ui/themes/black/menu.css",
"chars": 2028,
"preview": ".menu {\n position: absolute;\n margin: 0;\n padding: 2px;\n border-width: 1px;\n border-style: solid;\n overflow: hidde"
},
{
"path": "src/main/webapp/ui/themes/black/menubutton.css",
"chars": 679,
"preview": ".m-btn-downarrow {\n display: inline-block;\n width: 16px;\n height: 16px;\n line-height: 16px;\n font-size: 12px;\n _ve"
},
{
"path": "src/main/webapp/ui/themes/black/messager.css",
"chars": 758,
"preview": ".messager-body {\n padding: 10px;\n overflow: hidden;\n}\n.messager-button {\n text-align: center;\n padding-top: 10px;\n}\n"
},
{
"path": "src/main/webapp/ui/themes/black/pagination.css",
"chars": 1552,
"preview": ".pagination {\n zoom: 1;\n}\n.pagination table {\n float: left;\n height: 30px;\n}\n.pagination td {\n border: 0;\n}\n.paginat"
},
{
"path": "src/main/webapp/ui/themes/black/panel.css",
"chars": 2697,
"preview": ".panel {\n overflow: hidden;\n text-align: left;\n margin: 0;\n border: 0;\n -moz-border-radius: 0 0 0 0;\n -webkit-bord"
},
{
"path": "src/main/webapp/ui/themes/black/progressbar.css",
"chars": 644,
"preview": ".progressbar {\n border-width: 1px;\n border-style: solid;\n -moz-border-radius: 5px 5px 5px 5px;\n -webkit-border-radiu"
},
{
"path": "src/main/webapp/ui/themes/black/propertygrid.css",
"chars": 710,
"preview": ".propertygrid .datagrid-view1 .datagrid-body td {\n padding-bottom: 1px;\n border-width: 0 1px 0 0;\n}\n.propertygrid .dat"
},
{
"path": "src/main/webapp/ui/themes/black/searchbox.css",
"chars": 1653,
"preview": ".searchbox {\n display: inline-block;\n white-space: nowrap;\n margin: 0;\n padding: 0;\n border-width: 1px;\n border-st"
},
{
"path": "src/main/webapp/ui/themes/black/slider.css",
"chars": 1590,
"preview": ".slider-disabled {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.slider-h {\n height: 22px;\n}\n.slider-v {\n width: 22p"
},
{
"path": "src/main/webapp/ui/themes/black/spinner.css",
"chars": 1094,
"preview": ".spinner {\n display: inline-block;\n white-space: nowrap;\n margin: 0;\n padding: 0;\n border-width: 1px;\n border-styl"
},
{
"path": "src/main/webapp/ui/themes/black/splitbutton.css",
"chars": 972,
"preview": ".s-btn-downarrow {\n display: inline-block;\n margin: 0 0 0 4px;\n padding: 0 0 0 1px;\n width: 14px;\n height: 16px;\n "
},
{
"path": "src/main/webapp/ui/themes/black/tabs.css",
"chars": 8201,
"preview": ".tabs-container {\n overflow: hidden;\n}\n.tabs-header {\n border-width: 1px;\n border-style: solid;\n border-bottom-width"
},
{
"path": "src/main/webapp/ui/themes/black/tooltip.css",
"chars": 1903,
"preview": ".tooltip {\n position: absolute;\n display: none;\n z-index: 9900000;\n outline: none;\n opacity: 1;\n filter: alpha(opa"
},
{
"path": "src/main/webapp/ui/themes/black/tree.css",
"chars": 3422,
"preview": ".tree {\n margin: 0;\n padding: 0;\n list-style-type: none;\n}\n.tree li {\n white-space: nowrap;\n}\n.tree li ul {\n list-s"
},
{
"path": "src/main/webapp/ui/themes/black/validatebox.css",
"chars": 222,
"preview": ".validatebox-invalid {\n background-image: url('images/validatebox_warning.png');\n background-repeat: no-repeat;\n back"
},
{
"path": "src/main/webapp/ui/themes/black/window.css",
"chars": 1961,
"preview": ".window {\n overflow: hidden;\n padding: 5px;\n border-width: 1px;\n border-style: solid;\n}\n.window .window-header {\n b"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/accordion.css",
"chars": 835,
"preview": ".accordion {\n overflow: hidden;\n border-width: 1px;\n border-style: solid;\n}\n.accordion .accordion-header {\n border-w"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/calendar.css",
"chars": 3638,
"preview": ".calendar {\n border-width: 1px;\n border-style: solid;\n padding: 1px;\n overflow: hidden;\n}\n.calendar table {\n border"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/combo.css",
"chars": 1017,
"preview": ".combo {\n display: inline-block;\n white-space: nowrap;\n margin: 0;\n padding: 0;\n border-width: 1px;\n border-style:"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/combobox.css",
"chars": 393,
"preview": ".combobox-item,\n.combobox-group {\n font-size: 12px;\n padding: 3px;\n padding-right: 0px;\n}\n.combobox-item-disabled {\n "
},
{
"path": "src/main/webapp/ui/themes/bootstrap/datagrid.css",
"chars": 5052,
"preview": ".datagrid .panel-body {\n overflow: hidden;\n position: relative;\n}\n.datagrid-view {\n position: relative;\n overflow: h"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/datebox.css",
"chars": 619,
"preview": ".datebox-calendar-inner {\n height: 180px;\n}\n.datebox-button {\n height: 18px;\n padding: 2px 5px;\n text-align: center;"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/dialog.css",
"chars": 487,
"preview": ".dialog-content {\n overflow: auto;\n}\n.dialog-toolbar {\n padding: 2px 5px;\n}\n.dialog-tool-separator {\n float: left;\n "
},
{
"path": "src/main/webapp/ui/themes/bootstrap/easyui.css",
"chars": 48159,
"preview": ".panel {\n overflow: hidden;\n text-align: left;\n margin: 0;\n border: 0;\n -moz-border-radius: 0 0 0 0;\n -webkit-bord"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/layout.css",
"chars": 1678,
"preview": ".layout {\n position: relative;\n overflow: hidden;\n margin: 0;\n padding: 0;\n z-index: 0;\n}\n.layout-panel {\n positio"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/linkbutton.css",
"chars": 3814,
"preview": "a.l-btn {\n background-position: right 0;\n text-decoration: none;\n display: inline-block;\n zoom: 1;\n height: 24px;\n "
},
{
"path": "src/main/webapp/ui/themes/bootstrap/menu.css",
"chars": 2040,
"preview": ".menu {\n position: absolute;\n margin: 0;\n padding: 2px;\n border-width: 1px;\n border-style: solid;\n overflow: hidde"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/menubutton.css",
"chars": 685,
"preview": ".m-btn-downarrow {\n display: inline-block;\n width: 16px;\n height: 16px;\n line-height: 16px;\n font-size: 12px;\n _ve"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/messager.css",
"chars": 761,
"preview": ".messager-body {\n padding: 10px;\n overflow: hidden;\n}\n.messager-button {\n text-align: center;\n padding-top: 10px;\n}\n"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/pagination.css",
"chars": 1555,
"preview": ".pagination {\n zoom: 1;\n}\n.pagination table {\n float: left;\n height: 30px;\n}\n.pagination td {\n border: 0;\n}\n.paginat"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/panel.css",
"chars": 2706,
"preview": ".panel {\n overflow: hidden;\n text-align: left;\n margin: 0;\n border: 0;\n -moz-border-radius: 0 0 0 0;\n -webkit-bord"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/progressbar.css",
"chars": 647,
"preview": ".progressbar {\n border-width: 1px;\n border-style: solid;\n -moz-border-radius: 5px 5px 5px 5px;\n -webkit-border-radiu"
},
{
"path": "src/main/webapp/ui/themes/bootstrap/propertygrid.css",
"chars": 716,
"preview": ".propertygrid .datagrid-view1 .datagrid-body td {\n padding-bottom: 1px;\n border-width: 0 1px 0 0;\n}\n.propertygrid .dat"
}
]
// ... and 92 more files (download for full content)
About this extraction
This page contains the full source code of the lastwhispers/permission GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 292 files (840.9 KB), approximately 276.6k tokens, and a symbol index with 293 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.