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
================================================
================================================
FILE: pom.xml
================================================
4.0.0
cn.lastwhisper
permission
0.0.1-SNAPSHOT
war
http://maven.apache.org
UTF-8
4.3.18.RELEASE
2.9.10.1
org.springframework
spring-core
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-tx
${spring.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
org.aspectj
aspectjrt
1.8.0
org.aspectj
aspectjweaver
1.8.0
org.mybatis
mybatis
3.3.0
mysql
mysql-connector-java
5.1.26
com.alibaba
druid
1.0.20
org.mybatis
mybatis-spring
1.2.3
com.github.pagehelper
pagehelper
4.1.4
javax.servlet
jstl
1.2
com.alibaba
fastjson
1.2.58
commons-fileupload
commons-fileupload
1.4
commons-logging
commons-logging
1.2
org.apache.commons
commons-lang3
3.4
log4j
log4j
1.2.17
org.slf4j
slf4j-api
1.7.21
junit
junit
4.9
javax.servlet
jsp-api
2.0
provided
javax.servlet
servlet-api
2.5
provided
redis.clients
jedis
2.7.2
org.apache.shiro
shiro-core
1.2.3
org.apache.shiro
shiro-web
1.2.3
org.apache.shiro
shiro-spring
1.2.3
org.apache.shiro
shiro-aspectj
1.2.3
org.apache.poi
poi
3.15
src/main/java
**/*.properties
**/*.xml
**/*.sql
false
src/main/resources
**/*.properties
**/*.xml
**/*.sql
false
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
1.8
1.8
UTF-8
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
8080
/permission
org.apache.maven.plugins
maven-surefire-plugin
3.0.0-M4
true
================================================
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 < 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 searchLogOperateor(String q) {
List 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 findAll() {
return menuService.findMenuList();
}
/**
* 根据菜单id查找菜单,显示菜单详情
* @author Zoe
* @date 2019年2月15日下午8:15:02
* @param menuid 主键
* @return
*/
@RequestMapping("/menu/menufindById")
@ResponseBody
public List 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 searchRoleName(String q) {
List 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
* @author 最后的轻语_dd43
* @date 2019年2月16日下午7:19:56
*/
@RequestMapping(value = "/role/findRoleMenuByRoleid" , method = RequestMethod.POST)
@ResponseBody
public List 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 searchUserName(String q) {
List 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
* @author gj
* @date 2019年2月16日下午3:23:42
*/
@RequestMapping(value = "/user/findUserRole", method = { RequestMethod.POST })
@ResponseBody
public List findUserRole(@RequestParam(value = "id", required = true) Integer user_id) {
List 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 selectLoglistByPage(Log log);
/**
*
* @Title: selectLogOperateor
* @Description: 模糊查询操作人
* @author: 最后的轻语_dd43
* @param operateor
* @return
*/
public List selectLogOperateor(@Param("operateor")String operateor);
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/LogMapper.xml
================================================
select * from log
where
operateor like CONCAT('%',#{operateor},'%' )
select distinct operateor from log
where
operateor like CONCAT('%',#{operateor},'%' )
insert into log
values(0
,#{operateor}
,null
,#{operatetype}
,null
,#{operatedate}
,null
,#{operateresult}
,null
,#{ip}
,null
);
================================================
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 selectMenuList();
/**
*
* @Title: selectMenuById
* @Description: 根据菜单id查找菜单,显示菜单详情
* @author: 最后的轻语_dd43
* @param menuid
* @return
*/
List 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
* @author 最后的轻语_dd43
* @date 2019年2月16日下午7:05:10
*/
public List selectMenuIdName(@Param("pid") String pid);
/**
*
* @Title: selectMenuByUserid
* @Description: 根据userid加载对应菜单
* @param userid
* @return List
* @author 最后的轻语_dd43
* @date 2019年2月16日下午8:40:39
*/
public List selectMenuByUserid(@Param("userid") Integer userid);
/**
*
* @Title: selectMenu
* @Description: 查询所有菜单的所有属性
* @param pid
* @return List
* @author 最后的轻语_dd43
* @date 2019年2月16日下午9:04:26
*/
public List selectMenu(@Param("pid") String pid);
}
================================================
FILE: src/main/java/cn/lastwhisper/modular/mapper/MenuMapper.xml
================================================
select * from menu where pid = #{menuid}
================================================
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
* @author 最后的轻语_dd43
* @date 2019年2月14日下午7:12:56
*/
public List selectRolelistByPage(Role role);
/**
*
* @Title: selectAllRole
* @Description: 查询所有角色
* @param role
* @return List
* @author 最后的轻语_dd43
* @date 2019年2月16日下午12:28:09
*/
public List selectRoleList();
/**
*
* @Title: selectRoleName
* @Description: 查询角色,自动补全
* @param name
* @return
*/
public List selectRoleName(@Param("name")String name);
/**
*
* @Title: selectRoleMenuidByRoleid
* @Description: 根据角色id获取对应的权限菜单id
* @param roleuuid
* @return List
* @author 最后的轻语_dd43
* @date 2019年2月16日下午4:35:08
*/
public List selectRoleMenuidByRoleid(@Param("roleuuid") Integer roleuuid);
/**
*
* @Title: selectUseridByRoleuuid
* @Description: 根据角色id获取对应的用户id
* @param roleuuid
* @return List
* @author 最后的轻语_dd43
* @date 2019年2月17日上午11:18:02
*/
public List 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
================================================
select uuid,name from role
where
name LIKE CONCAT('%',#{name},'%' )
SELECT uuid,name from role
SELECT userid
FROM user_role WHERE roleuuid = #{roleuuid}
select name from role
where
name like CONCAT('%',#{name},'%' )
insert into role VALUES(0,#{name})
UPDATE role
SET NAME = #{name}
WHERE
uuid = #{uuid}
delete from role where uuid = #{uuid}
================================================
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 selectUserlistByPage(User user);
/**
*
* @Title: selectUserName
* @Description: 查询用户姓名,自动补全
* @param user_name
* @return
*/
public List selectUserName(@Param("user_name")String user_name);
/**
*
* @Title: selectUserRole
* @Description: 根据userid获取用户对应的角色,例如user_id=221
* @return List
* @author gj
* @date 2019年2月16日下午2:50:20
*/
public List selectUserRole(@Param("user_id") Integer user_id);
/**
*
* @Title: selectUserByUserCode
* @Description: 证据用户账号查询对应用户
* @author: 最后的轻语_dd43
* @param user_code 用户账号
* @return
*/
public List 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
================================================
select * from user
where
user_code=#{user_code} and
user_pwd=#{user_pwd}
SELECT
*
FROM
user
where
user_name like '%${user_name}%'
select user_name from user
where
user_name like concat('%', #{user_name}, '%')
select uuid from
user_role,role where user_role.userid=#{user_id} and
user_role.roleuuid = role.uuid;
select
user_code,user_name,user_birthday from user
where
user_code =
#{user_code}
insert into user
values
(0
,#{user_code}
,null
,#{user_name}
,null
,#{user_pwd}
,null
,#{user_birthday}
,null
);
insert into user_role VALUES(#{user_id},#{roleuuid})
update user set
user_code = #{user_code}
,user_name = #{user_name}
,user_pwd = #{user_pwd}
,user_birthday = #{user_birthday}
where
user_id = #{user_id}
update user set
user_pwd = #{user_pwd}
where
user_id = #{user_id}
update user set
user_name = #{user_name}
,user_pwd = #{user_pwd}
,user_birthday = #{user_birthday}
where
user_code = #{user_code}
delete from user where
user_id=#{user_id}
delete from user_role where userid = #{user_id}
================================================
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 menus = new LinkedList();
/**
* @Title: getMenuid
* @Description: please write your description
* @return: String
*/
public String getMenuid() {
return menuid;
}
/**
* @param menuid the menuid to set
*/
public void setMenuid(String menuid) {
this.menuid = menuid;
}
/**
* @Title: getMenuname
* @Description: please write your description
* @return: String
*/
public String getMenuname() {
return menuname;
}
/**
* @param menuname the menuname to set
*/
public void setMenuname(String menuname) {
this.menuname = menuname;
}
/**
* @Title: getUrl
* @Description: please write your description
* @return: String
*/
public String getUrl() {
return url;
}
/**
* @param url the url to set
*/
public void setUrl(String url) {
this.url = url;
}
/**
* @Title: getIcon
* @Description: please write your description
* @return: String
*/
public String getIcon() {
return icon;
}
/**
* @param icon the icon to set
*/
public void setIcon(String icon) {
this.icon = icon;
}
/**
* @Title: getPid
* @Description: please write your description
* @return: String
*/
public String getPid() {
return pid;
}
/**
* @param pid the pid to set
*/
public void setPid(String pid) {
this.pid = pid;
}
/**
* @Title: getIs_parent
* @Description: please write your description
* @return: Integer
*/
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
* @Description: please write your description
* @return: List
*/
public List getMenus() {
return menus;
}
/**
* @param menus the menus to set
*/
public void setMenus(List 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
* @Description: please write your description
* @return: Integer
*/
public Integer getUuid() {
return uuid;
}
/**
* @param uuid the uuid to set
*/
public void setUuid(Integer uuid) {
this.uuid = uuid;
}
/**
* @Title: getName
* @Description: please write your description
* @return: String
*/
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
* @Description: please write your description
* @return: Date
*/
@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 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 findMenuList();
/**
*
* @Title: findMenuById
* @Description: 根据菜单id查找菜单,显示菜单详情
* @author: 最后的轻语_dd43
* @param menuid
* @return
*/
List 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
* @author gj
* @date 2019年2月17日下午8:55:10
*/
List 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 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
* @author 最后的轻语_dd43
* @date 2019年2月16日下午4:40:34
*/
public List 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 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
* @date 2019年2月16日下午2:56:10
*/
List findUserRole(Integer user_id);
/**
*
* @Title: findUserRoleByUserid
* @Description: 根据用户id查询对应的角色
* @param user_id
* @return List
* @date 2019年2月21日下午12:08:37
*/
List 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 list = logMapper.selectLoglistByPage(log);
PageInfo 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 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 findMenuList() {
return menuMapper.selectMenuList();
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public List 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());
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 root = menuMapper.selectMenu("-1");
// 用户下的菜单集合 找数据库
// List userMenus = menuMapper.selectMenuByUserid(userid);
// 用户下的菜单集合 找缓存
List userMenus = findMenuListByUserid(userid);
// 根菜单
menu = cloneMenu(root.get(0));
// 暂存一级菜单
Menu _m1 = null;
// 暂存二级菜单
Menu _m2 = null;
// 获取全部的一级菜单
List parentMenus = menuMapper.selectMenu("0");
// 循环一级菜单
for (Menu m1 : parentMenus) {
_m1 = cloneMenu(m1);
// 获取当前一级菜单的所有二级菜单
List 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 findMenuListByUserid(Integer userid) {
Jedis jedis = jedisPool.getResource();
List 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 list = roleMapper.selectRolelistByPage(role);
PageInfo 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 findRoleName(String q) {
List 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 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 findRoleMenuByRoleid(Integer roleUuid) {
// 1.根据角色id获取角色对应的菜单id
List menuIdList = roleMapper.selectRoleMenuidByRoleid(roleUuid);
// 2.获取一级菜单
List parentMenu = menuMapper.selectMenuIdName("0");
// 3.当前角色对象对应的菜单权限
List treeList = new ArrayList();
// 暂存一级菜单
EasyUIOptionalTreeNode t1 = null;
// 暂存二级菜单
EasyUIOptionalTreeNode t2 = null;
// 一级菜单遍历
for (Menu m1 : parentMenu) {
t1 = new EasyUIOptionalTreeNode();
t1.setId(m1.getMenuid());
t1.setText(m1.getMenuname());
List 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 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 list = userMapper.selectUserlistByPage(user);
PageInfo 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 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 findUserRole(Integer user_id) {
// 1.获取当前用户的所有角色
List userRoleList = userMapper.selectUserRole(user_id);
// 2.获取系统中所有角色
List roleList = roleMapper.selectRoleList();
// 3.设置返回值
List treeList = new ArrayList();
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 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 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 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 children = new ArrayList();// 下级菜单
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 getChildren() {
return children;
}
public void setChildren(List 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 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 getChildren() {
if(null == children) {
children = new ArrayList<>();
}
return children;
}
public void setChildren(List 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
================================================
================================================
FILE: src/main/resources/applicationContext_jedis.xml
================================================
================================================
FILE: src/main/resources/applicationContext_shiro.xml
================================================
/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
================================================
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
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
================================================
================================================
FILE: src/main/resources/sqlMapConfig.xml
================================================
================================================
FILE: src/main/webapp/WEB-INF/web.xml
================================================
permission
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath*:applicationContext*.xml
spring.profiles.active
dev
spring.profiles.default
dev
spring.liveBeansView.mbeanDomain
dev
shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
shiroFilter
*.html
*
default
*.html
/adminjs/*
/css/*
/images/*
/js/*
/ui/*
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
springmvc
/
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
characterEncodingFilter
/*
DruidStatView
com.alibaba.druid.support.http.StatViewServlet
DruidStatView
/druid/*
DruidWebStatFilter
com.alibaba.druid.support.http.WebStatFilter
exclusions
*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
profileEnable
true
principalCookieName
USER_COOKIE
principalSessionName
USER_SESSION
DruidWebStatFilter
/*
login.html
index.html
default.html
default.htm
default.jsp
================================================
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: '测试消息: 给个start呗 ' +
' 给 ' +
' 不给 ' +
' 不在弹出 ',
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 += '';
$.each(n.menus, function (j, o) {
menulist += ' ';
// if(o.child && o.child.length>0) {
// // li.find('div').addClass('icon-arrow');
//
// menulist += '';
// $.each(o.child,function(k,p){ menulist += ' ' }); menulist += ' '; }
menulist += ' ';
})
menulist += ' ';
$('#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 = '';
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('系统提示', '恭喜,密码修改成功! 您的新密码为:' + 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;
font-size:2px;
background:url('images/menu_sep.png') repeat-x;
}
.menu-active{
border:1px solid #7eabcd;
background:#fafafa;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
.menu-shadow{
position:absolute;
background:#ddd;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.menu-item-disabled{
opacity:0.5;
filter:alpha(opacity=50);
cursor:default;
}
.menu-active-disabled{
border-color:#d3d3d3;
}
.m-btn-downarrow{
display:inline-block;
width:12px;
line-height:14px;
*line-height:15px;
background:url('images/menu_downarrow.png') no-repeat 4px center;
}
a.m-btn-active{
background-position: bottom right;
}
a.m-btn-active span.l-btn-left{
background-position: bottom left;
}
a.m-btn-plain-active{
background:transparent;
border:1px solid #7eabcd;
_padding:0px 5px 0px 0px;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
.messager-body{
padding:5px 10px;
}
.messager-button{
text-align:center;
padding-top:10px;
}
.messager-icon{
float:left;
width:47px;
height:35px;
}
.messager-error{
background:url('images/messager_error.gif') no-repeat scroll left top;
}
.messager-info{
background:url('images/messager_info.gif') no-repeat scroll left top;
}
.messager-question{
background:url('images/messager_question.gif') no-repeat scroll left top;
}
.messager-warning{
background:url('images/messager_warning.gif') no-repeat scroll left top;
}
.messager-input{
width: 262px;
border:1px solid #ccc;
}
.messager-progress{
padding:10px;
}
.messager-p-msg{
margin-bottom:5px;
}.pagination{
zoom:1;
}
.pagination table{
float:left;
height:30px;
}
.pagination-btn-separator{
float:left;
height:24px;
border-left:1px solid #ccc;
border-right:1px solid #fff;
margin:3px 1px;
}
.pagination-num{
border:1px solid #ccc;
margin:0 2px;
}
.pagination-page-list{
margin:0px 6px;
}
.pagination-info{
float:right;
padding-right:6px;
padding-top:8px;
font-size:12px;
}
.pagination span{
font-size:12px;
}
.pagination-first{
background:url('images/pagination_first.gif') no-repeat;
}
.pagination-prev{
background:url('images/pagination_prev.gif') no-repeat;
}
.pagination-next{
background:url('images/pagination_next.gif') no-repeat;
}
.pagination-last{
background:url('images/pagination_last.gif') no-repeat;
}
.pagination-load{
background:url('images/pagination_load.png') no-repeat;
}
.pagination-loading{
background:url('images/pagination_loading.gif') no-repeat;
}
.panel{
overflow:hidden;
font-size:12px;
}
.panel-header{
padding:5px;
line-height:15px;
color:#15428b;
font-weight:bold;
font-size:12px;
background:url('images/panel_title.png') repeat-x;
position:relative;
border:1px solid #99BBE8;
}
.panel-title{
background:url('images/blank.gif') no-repeat;
}
.panel-header-noborder{
border-width:0px;
border-bottom:1px solid #99BBE8;
}
.panel-body{
overflow:auto;
border:1px solid #99BBE8;
border-top-width:0px;
}
.panel-body-noheader{
border-top-width:1px;
}
.panel-body-noborder{
border-width:0px;
}
.panel-with-icon{
padding-left:18px;
}
.panel-icon{
position:absolute;
left:5px;
top:4px;
width:16px;
height:16px;
}
.panel-tool{
position:absolute;
right:5px;
top:4px;
}
.panel-tool a{
display:inline-block;
width:16px;
height:16px;
opacity:0.6;
filter:alpha(opacity=60);
margin-left:2px;
}
.panel-tool a:hover{
opacity:1;
filter:alpha(opacity=100);
}
.panel-tool-close{
background:url('images/panel_tools.gif') no-repeat -16px 0px;
}
.panel-tool-min{
background:url('images/panel_tools.gif') no-repeat 0px 0px;
}
.panel-tool-max{
background:url('images/panel_tools.gif') no-repeat 0px -16px;
}
.panel-tool-restore{
background:url('images/panel_tools.gif') no-repeat -16px -16px;
}
.panel-tool-collapse{
background:url('images/panel_tool_collapse.gif') no-repeat;
}
.panel-tool-expand{
background:url('images/panel_tool_expand.gif') no-repeat;
}
.panel-loading{
padding:11px 0px 10px 30px;
background:url('images/panel_loading.gif') no-repeat 10px 10px;
}
.panel-noscroll{
overflow:hidden;
}
.progressbar{
border:1px solid #99BBE8;
border-radius:5px;
overflow:hidden;
}
.progressbar-text{
text-align:center;
color:#15428b;
position:absolute;
}
.progressbar-value{
background-color:#FF8D40;
border-radius:5px;
border-top-right-radius:0px;
border-bottom-right-radius:0px;
width:0;
}
.propertygrid .datagrid-view1 .datagrid-body,.propertygrid .datagrid-group{
background:#E0ECFF;
}
.propertygrid .datagrid-group{
height:21px;
overflow:hidden;
}
.propertygrid .datagrid-view1 .datagrid-body td{
border-color:#E0ECFF;
}
.propertygrid .datagrid-view1 .datagrid-row-over,.propertygrid .datagrid-view1 .datagrid-row-selected{
background:#E0ECFF;
}
.propertygrid .datagrid-group span{
color:#416AA3;
font-weight:bold;
padding-left:4px;
}
.propertygrid .datagrid-row-collapse,.propertygrid .datagrid-row-expand{
background-position:3px center;
}.searchbox{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #A4BED4;
background:#fff;
}
.searchbox-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.searchbox-button{
background:url('images/searchbox_button.png') no-repeat center center;
width:18px;
height:20px;
overflow:hidden;
display:inline-block;
vertical-align:top;
cursor:pointer;
opacity:0.6;
filter:alpha(opacity=60);
}
.searchbox-button-hover{
opacity:1.0;
filter:alpha(opacity=100);
}
.searchbox-prompt{
font-size:12px;
color:#ccc;
}
.searchbox a.l-btn-plain{
background-color:#E0ECF9;
height:20px;
border:0;
padding:0 6px 0 0;
vertical-align:top;
}
.searchbox a.l-btn .l-btn-left{
padding:2px 0 2px 2px;
}
.searchbox a.l-btn-plain:hover{
-moz-border-radius:0px;
-webkit-border-radius: 0px;
border:0;
padding:0 6px 0 0;
}
.searchbox a.m-btn-plain-active{
-moz-border-radius:0px;
-webkit-border-radius: 0px;
}.slider{
}
.slider-disabled{
opacity:0.5;
filter:alpha(opacity=50);
}
.slider-h{
height:22px;
}
.slider-v{
width:22px;
}
.slider-inner{
position:relative;
height:6px;
top:7px;
border:1px solid #99BBE8;
background:#fafafa;
border-radius:3px;
}
.slider-handle{
position:absolute;
display:block;
outline:none;
width:20px;
height:20px;
top:-7px;
margin-left:-10px;
background:url('images/slider_handle.png') no-repeat;
}
.slider-tip{
position:absolute;
display:inline-block;
line-height:12px;
white-space:nowrap;
top:-22px;
}
.slider-rule{
position:relative;
top:15px;
}
.slider-rule span{
position:absolute;
display:inline-block;
font-size:0;
height:5px;
border-left:1px solid #999;
}
.slider-rulelabel{
position:relative;
top:20px;
}
.slider-rulelabel span{
position:absolute;
display:inline-block;
color:#999;
}
.slider-v .slider-inner{
width:6px;
left:7px;
top:0;
float:left;
}
.slider-v .slider-handle{
left:3px;
margin-top:-10px;
}
.slider-v .slider-tip{
left:-10px;
margin-top:-6px;
}
.slider-v .slider-rule{
float:left;
top:0;
left:16px;
}
.slider-v .slider-rule span{
width:5px;
height:'auto';
border-left:0;
border-top:1px solid #999;
}
.slider-v .slider-rulelabel{
float:left;
top:0;
left:23px;
}
.spinner{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #A4BED4;
}
.spinner-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.spinner-arrow{
display:inline-block;
vertical-align:top;
margin:0;
padding:0;
}
.spinner-arrow-up,.spinner-arrow-down{
display:block;
background:#E0ECF9 url('images/spinner_arrow_up.gif') no-repeat 5px 2px;
font-size:1px;
width:18px;
height:10px;
}
.spinner-arrow-down{
background:#E0ECF9 url('images/spinner_arrow_down.gif') no-repeat 5px 3px;
}
.spinner-arrow-hover{
background-color:#ECF9F9;
}.s-btn-downarrow{
display:inline-block;
width:16px;
line-height:14px;
*line-height:15px;
background:url('images/menu_downarrow.png') no-repeat 9px center;
}
a.s-btn-active{
background-position: bottom right;
}
a.s-btn-active span.l-btn-left{
background-position: bottom left;
}
a.s-btn-active .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
a:hover.l-btn .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
a.s-btn-plain-active{
background:transparent;
border:1px solid #7eabcd;
_padding:0px 5px 0px 0px;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
a.s-btn-plain-active .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}.tabs-container{
overflow:hidden;
background:#fff;
}
.tabs-header{
border:1px solid #8DB2E3;
background:#E0ECFF;
border-bottom:0px;
position:relative;
overflow:hidden;
padding:0px;
padding-top:2px;
overflow:hidden;
}
.tabs-header-noborder{
border:0px;
}
.tabs-header-plain{
border:0px;
background:transparent;
}
.tabs-scroller-left{
position:absolute;
left:0px;
top:-1px;
width:18px;
height:28px!important;
height:30px;
border:1px solid #8DB2E3;
font-size:1px;
display:none;
cursor:pointer;
background:#E0ECFF url('images/tabs_leftarrow.png') no-repeat 1px 5px;
}
.tabs-scroller-right{
position:absolute;
right:0;
top:-1px;
width:18px;
height:28px!important;
height:30px;
border:1px solid #8DB2E3;
font-size:1px;
display:none;
cursor:pointer;
background:#E0ECFF url('images/tabs_rightarrow.png') no-repeat 2px 5px;
}
.tabs-tool{
position:absolute;
top:-1px;
border:1px solid #8DB2E3;
padding:1px;
background:#E0ECFF;
overflow:hidden;
}
.tabs-header-plain .tabs-scroller-left{
top:2px;
height:25px!important;
height:27px;
}
.tabs-header-plain .tabs-scroller-right{
top:2px;
height:25px!important;
height:27px;
}
.tabs-header-plain .tabs-tool{
top:2px;
padding-top:0;
}
.tabs-scroller-over{
background-color:#ECF9F9;
}
.tabs-wrap{
position:relative;
left:0px;
overflow:hidden;
width:100%;
margin:0px;
padding:0px;
}
.tabs-scrolling{
margin-left:18px;
margin-right:18px;
}
.tabs{
list-style-type:none;
height:26px;
margin:0px;
padding:0px;
padding-left:4px;
font-size:12px;
width:5000px;
border-bottom:1px solid #8DB2E3;
}
.tabs li{
float:left;
display:inline-block;
margin-right:4px;
margin-bottom:-1px;
padding:0;
position:relative;
border:1px solid #8DB2E3;
-moz-border-radius-topleft:5px;
-moz-border-radius-topright:5px;
-webkit-border-top-left-radius:5px;
-webkit-border-top-right-radius:5px;
}
.tabs li a.tabs-inner{
display:inline-block;
text-decoration:none;
color:#416AA3;
background:url('images/tabs_enabled.png') repeat-x left top;
margin:0px;
padding:0px 10px;
height:25px;
line-height:25px;
text-align:center;
white-space:nowrap;
-moz-border-radius-topleft:5px;
-moz-border-radius-topright:5px;
-webkit-border-top-left-radius:5px;
-webkit-border-top-right-radius:5px;
}
.tabs li a.tabs-inner:hover{
background:url('images/tabs_active.png') repeat-x left bottom;
}
.tabs li.tabs-selected{
border:1px solid #8DB2E3;
border-bottom:1px solid #fff;
}
.tabs li.tabs-selected a.tabs-inner{
color:#416AA3;
font-weight:bold;
background:#fff;
background:#7eabcd url('images/tabs_active.png') repeat-x left bottom;
outline: none;
}
.tabs li.tabs-selected a:hover.tabs-inner{
cursor:default;
pointer:default;
}
.tabs-p-tool{
position:absolute;
right:16px;
top:7px;
display:block;
}
.tabs-p-tool a{
display:inline-block;
font-size:1px;
width:12px;
height:12px;
opacity:0.6;
filter:alpha(opacity=60);
}
.tabs-p-tool a:hover{
opacity:1;
filter:alpha(opacity=100);
cursor:hand;
cursor:pointer;
background-color:#8DB2E3;
}
.tabs-with-icon{
padding-left:18px;
}
.tabs-icon{
position:absolute;
width:16px;
height:16px;
left:10px;
top:5px;
}
.tabs-closable{
padding-right:8px;
}
.tabs li a.tabs-close{
position:absolute;
font-size:1px;
display:block;
padding:0px;
width:11px;
height:11px;
top:7px;
right:5px;
opacity:0.6;
filter:alpha(opacity=60);
background:url('images/tabs_close.gif') no-repeat 2px 2px;
}
.tabs li a:hover.tabs-close{
opacity:1;
filter:alpha(opacity=100);
cursor:hand;
cursor:pointer;
background-color:#8DB2E3;
}
.tabs-panels{
margin:0px;
padding:0px;
border:1px solid #8DB2E3;
border-top:0px;
overflow:hidden;
}
.tabs-panels-noborder{
border:0px;
}
.tree{
font-size:12px;
margin:0;
padding:0;
list-style-type:none;
}
.tree li{
white-space:nowrap;
}
.tree li ul{
list-style-type:none;
margin:0;
padding:0;
}
.tree-node{
height:18px;
white-space:nowrap;
cursor:pointer;
}
.tree-indent{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-hit{
cursor:pointer;
}
.tree-expanded{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
background:url('images/tree_arrows.gif') no-repeat -18px 0px;
}
.tree-expanded-hover{
background:url('images/tree_arrows.gif') no-repeat -50px 0px;
}
.tree-collapsed{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
background:url('images/tree_arrows.gif') no-repeat 0px 0px;
}
.tree-collapsed-hover{
background:url('images/tree_arrows.gif') no-repeat -32px 0px;
}
.tree-lines .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -36px -54px;
}
.tree-lines .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat 0px -36px;
}
.tree-lines .tree-node-last .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -18px 0px;
}
.tree-lines .tree-node-last .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat -36px -36px;
}
.tree-lines .tree-root-first .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -18px -54px;
}
.tree-lines .tree-root-first .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat -18px -36px;
}
.tree-lines .tree-root-one .tree-expanded{
background:url('images/tree_elbow.png') no-repeat 0px -18px;
}
.tree-lines .tree-root-one .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat 0px -72px;
}
.tree-line{
background:url('images/tree_elbow.png') no-repeat 0px -54px;
}
.tree-join{
background:url('images/tree_elbow.png') no-repeat -18px -18px;
}
.tree-joinbottom{
background:url('images/tree_elbow.png') no-repeat 0px 0px;
}
.tree-folder{
display:inline-block;
background:url('images/tree_folder.gif') no-repeat;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-folder-open{
background:url('images/tree_folder_open.gif') no-repeat;
}
.tree-file{
display:inline-block;
background:url('images/tree_file.gif') no-repeat;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-loading{
background:url('images/tree_loading.gif') no-repeat;
}
.tree-title{
display:inline-block;
text-decoration:none;
vertical-align:middle;
padding:1px 2px 1px 2px;
white-space:nowrap;
}
.tree-node-hover{
background:#fafafa;
}
.tree-node-selected{
background:#FBEC88;
}
.tree-checkbox{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-checkbox0{
background:url('images/tree_checkbox_0.gif') no-repeat;
}
.tree-checkbox1{
background:url('images/tree_checkbox_1.gif') no-repeat;
}
.tree-checkbox2{
background:url('images/tree_checkbox_2.gif') no-repeat;
}
.tree-node-proxy{
font-size:12px;
padding:1px 2px 1px 18px;
background:#fafafa;
border:1px solid #ccc;
z-index:9900000;
}
.tree-dnd-yes{
background:url('images/tree_dnd_yes.png') no-repeat 0 center;
}
.tree-dnd-no{
background:url('images/tree_dnd_no.png') no-repeat 0 center;
}
.tree-node-top{
border-top:1px dotted red;
}
.tree-node-bottom{
border-bottom:1px dotted red;
}
.tree-node-append .tree-title{
border:1px dotted red;
}
.tree-editor{
border:1px solid #ccc;
font-size:12px;
line-height:16px;
width:80px;
position:absolute;
top:0;
}
.validatebox-invalid{
background:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;
}
.validatebox-tip{
position:absolute;
width:200px;
height:auto;
display:none;
z-index:9900000;
}
.validatebox-tip-content{
display:inline-block;
position:absolute;
top:0px;
left:10px;
padding:3px 5px;
border:1px solid #CC9933;
background:#FFFFCC;
z-index:9900001;
font-size:12px;
}
.validatebox-tip-pointer{
background:url('images/validatebox_pointer.gif') no-repeat left top;
display:inline-block;
width:10px;
height:19px;
position:absolute;
left:1px;
top:0px;
z-index:9900002;
}
.window {
font-size:12px;
position:absolute;
overflow:hidden;
background:transparent url('images/panel_title.png');
padding:5px;
border:1px solid #99BBE8;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
}
.window-shadow{
position:absolute;
background:#ddd;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window .window-header{
background:transparent;
padding:2px 0px 4px 0px;
}
.window .window-body{
background:#fff;
border:1px solid #99BBE8;
border-top-width:0px;
}
.window .window-body-noheader{
border-top-width:1px;
}
.window .window-header .panel-icon{
left:1px;
top:1px;
}
.window .window-header .panel-with-icon{
padding-left:18px;
}
.window .window-header .panel-tool{
top:0px;
right:1px;
}
.window-proxy{
position:absolute;
overflow:hidden;
border:1px dashed #15428b;
}
.window-proxy-mask{
position:absolute;
background:#fafafa;
filter:alpha(opacity=10);
opacity:0.10;
}
.window-mask{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
filter:alpha(opacity=40);
opacity:0.40;
background:#ccc;
font-size:1px;
*zoom:1;
overflow:hidden;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/layout.css
================================================
.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;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/linkbutton.css
================================================
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;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/menu.css
================================================
.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;
font-size:2px;
background:url('images/menu_sep.png') repeat-x;
}
.menu-active{
border:1px solid #7eabcd;
background:#fafafa;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
.menu-shadow{
position:absolute;
background:#ddd;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.menu-item-disabled{
opacity:0.5;
filter:alpha(opacity=50);
cursor:default;
}
.menu-active-disabled{
border-color:#d3d3d3;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/menubutton.css
================================================
.m-btn-downarrow{
display:inline-block;
width:12px;
line-height:14px;
*line-height:15px;
background:url('images/menu_downarrow.png') no-repeat 4px center;
}
a.m-btn-active{
background-position: bottom right;
}
a.m-btn-active span.l-btn-left{
background-position: bottom left;
}
a.m-btn-plain-active{
background:transparent;
border:1px solid #7eabcd;
_padding:0px 5px 0px 0px;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/messager.css
================================================
.messager-body{
padding:5px 10px;
}
.messager-button{
text-align:center;
padding-top:10px;
}
.messager-icon{
float:left;
width:47px;
height:35px;
}
.messager-error{
background:url('images/messager_error.gif') no-repeat scroll left top;
}
.messager-info{
background:url('images/messager_info.gif') no-repeat scroll left top;
}
.messager-question{
background:url('images/messager_question.gif') no-repeat scroll left top;
}
.messager-warning{
background:url('images/messager_warning.gif') no-repeat scroll left top;
}
.messager-input{
width: 262px;
border:1px solid #ccc;
}
.messager-progress{
padding:10px;
}
.messager-p-msg{
margin-bottom:5px;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/pagination.css
================================================
.pagination{
zoom:1;
}
.pagination table{
float:left;
height:30px;
}
.pagination-btn-separator{
float:left;
height:24px;
border-left:1px solid #ccc;
border-right:1px solid #fff;
margin:3px 1px;
}
.pagination-num{
border:1px solid #ccc;
margin:0 2px;
}
.pagination-page-list{
margin:0px 6px;
}
.pagination-info{
float:right;
padding-right:6px;
padding-top:8px;
font-size:12px;
}
.pagination span{
font-size:12px;
}
.pagination-first{
background:url('images/pagination_first.gif') no-repeat;
}
.pagination-prev{
background:url('images/pagination_prev.gif') no-repeat;
}
.pagination-next{
background:url('images/pagination_next.gif') no-repeat;
}
.pagination-last{
background:url('images/pagination_last.gif') no-repeat;
}
.pagination-load{
background:url('images/pagination_load.png') no-repeat;
}
.pagination-loading{
background:url('images/pagination_loading.gif') no-repeat;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/panel.css
================================================
.panel{
overflow:hidden;
font-size:12px;
}
.panel-header{
padding:5px;
line-height:15px;
color:#15428b;
font-weight:bold;
font-size:12px;
background:url('images/panel_title.png') repeat-x;
position:relative;
border:1px solid #99BBE8;
}
.panel-title{
background:url('images/blank.gif') no-repeat;
}
.panel-header-noborder{
border-width:0px;
border-bottom:1px solid #99BBE8;
}
.panel-body{
overflow:auto;
border:1px solid #99BBE8;
border-top-width:0px;
}
.panel-body-noheader{
border-top-width:1px;
}
.panel-body-noborder{
border-width:0px;
}
.panel-with-icon{
padding-left:18px;
}
.panel-icon{
position:absolute;
left:5px;
top:4px;
width:16px;
height:16px;
}
.panel-tool{
position:absolute;
right:5px;
top:4px;
}
.panel-tool a{
display:inline-block;
width:16px;
height:16px;
opacity:0.6;
filter:alpha(opacity=60);
margin-left:2px;
}
.panel-tool a:hover{
opacity:1;
filter:alpha(opacity=100);
}
.panel-tool-close{
background:url('images/panel_tools.gif') no-repeat -16px 0px;
}
.panel-tool-min{
background:url('images/panel_tools.gif') no-repeat 0px 0px;
}
.panel-tool-max{
background:url('images/panel_tools.gif') no-repeat 0px -16px;
}
.panel-tool-restore{
background:url('images/panel_tools.gif') no-repeat -16px -16px;
}
.panel-tool-collapse{
background:url('images/panel_tool_collapse.gif') no-repeat;
}
.panel-tool-expand{
background:url('images/panel_tool_expand.gif') no-repeat;
}
.panel-loading{
padding:11px 0px 10px 30px;
background:url('images/panel_loading.gif') no-repeat 10px 10px;
}
.panel-noscroll{
overflow:hidden;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/progressbar.css
================================================
.progressbar{
border:1px solid #99BBE8;
border-radius:5px;
overflow:hidden;
}
.progressbar-text{
text-align:center;
color:#15428b;
position:absolute;
}
.progressbar-value{
background-color:#FF8D40;
border-radius:5px;
border-top-right-radius:0px;
border-bottom-right-radius:0px;
width:0;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/propertygrid.css
================================================
.propertygrid .datagrid-view1 .datagrid-body,.propertygrid .datagrid-group{
background:#E0ECFF;
}
.propertygrid .datagrid-group{
height:21px;
overflow:hidden;
}
.propertygrid .datagrid-view1 .datagrid-body td{
border-color:#E0ECFF;
}
.propertygrid .datagrid-view1 .datagrid-row-over,.propertygrid .datagrid-view1 .datagrid-row-selected{
background:#E0ECFF;
}
.propertygrid .datagrid-group span{
color:#416AA3;
font-weight:bold;
padding-left:4px;
}
.propertygrid .datagrid-row-collapse,.propertygrid .datagrid-row-expand{
background-position:3px center;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/searchbox.css
================================================
.searchbox{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #A4BED4;
background:#fff;
}
.searchbox-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.searchbox-button{
background:url('images/searchbox_button.png') no-repeat center center;
width:18px;
height:20px;
overflow:hidden;
display:inline-block;
vertical-align:top;
cursor:pointer;
opacity:0.6;
filter:alpha(opacity=60);
}
.searchbox-button-hover{
opacity:1.0;
filter:alpha(opacity=100);
}
.searchbox-prompt{
font-size:12px;
color:#ccc;
}
.searchbox a.l-btn-plain{
background-color:#E0ECF9;
height:20px;
border:0;
padding:0 6px 0 0;
vertical-align:top;
}
.searchbox a.l-btn .l-btn-left{
padding:2px 0 2px 2px;
}
.searchbox a.l-btn-plain:hover{
-moz-border-radius:0px;
-webkit-border-radius: 0px;
border:0;
padding:0 6px 0 0;
}
.searchbox a.m-btn-plain-active{
-moz-border-radius:0px;
-webkit-border-radius: 0px;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/slider.css
================================================
.slider{
}
.slider-disabled{
opacity:0.5;
filter:alpha(opacity=50);
}
.slider-h{
height:22px;
}
.slider-v{
width:22px;
}
.slider-inner{
position:relative;
height:6px;
top:7px;
border:1px solid #99BBE8;
background:#fafafa;
border-radius:3px;
}
.slider-handle{
position:absolute;
display:block;
outline:none;
width:20px;
height:20px;
top:-7px;
margin-left:-10px;
background:url('images/slider_handle.png') no-repeat;
}
.slider-tip{
position:absolute;
display:inline-block;
line-height:12px;
white-space:nowrap;
top:-22px;
}
.slider-rule{
position:relative;
top:15px;
}
.slider-rule span{
position:absolute;
display:inline-block;
font-size:0;
height:5px;
border-left:1px solid #999;
}
.slider-rulelabel{
position:relative;
top:20px;
}
.slider-rulelabel span{
position:absolute;
display:inline-block;
color:#999;
}
.slider-v .slider-inner{
width:6px;
left:7px;
top:0;
float:left;
}
.slider-v .slider-handle{
left:3px;
margin-top:-10px;
}
.slider-v .slider-tip{
left:-10px;
margin-top:-6px;
}
.slider-v .slider-rule{
float:left;
top:0;
left:16px;
}
.slider-v .slider-rule span{
width:5px;
height:'auto';
border-left:0;
border-top:1px solid #999;
}
.slider-v .slider-rulelabel{
float:left;
top:0;
left:23px;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/spinner.css
================================================
.spinner{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #A4BED4;
}
.spinner-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.spinner-arrow{
display:inline-block;
vertical-align:top;
margin:0;
padding:0;
}
.spinner-arrow-up,.spinner-arrow-down{
display:block;
background:#E0ECF9 url('images/spinner_arrow_up.gif') no-repeat 5px 2px;
font-size:1px;
width:18px;
height:10px;
}
.spinner-arrow-down{
background:#E0ECF9 url('images/spinner_arrow_down.gif') no-repeat 5px 3px;
}
.spinner-arrow-hover{
background-color:#ECF9F9;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/splitbutton.css
================================================
.s-btn-downarrow{
display:inline-block;
width:16px;
line-height:14px;
*line-height:15px;
background:url('images/menu_downarrow.png') no-repeat 9px center;
}
a.s-btn-active{
background-position: bottom right;
}
a.s-btn-active span.l-btn-left{
background-position: bottom left;
}
a.s-btn-active .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
a:hover.l-btn .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
a.s-btn-plain-active{
background:transparent;
border:1px solid #7eabcd;
_padding:0px 5px 0px 0px;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
a.s-btn-plain-active .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/tabs.css
================================================
.tabs-container{
overflow:hidden;
background:#fff;
}
.tabs-header{
border:1px solid #8DB2E3;
background:#E0ECFF;
border-bottom:0px;
position:relative;
overflow:hidden;
padding:0px;
padding-top:2px;
overflow:hidden;
}
.tabs-header-noborder{
border:0px;
}
.tabs-header-plain{
border:0px;
background:transparent;
}
.tabs-scroller-left{
position:absolute;
left:0px;
top:-1px;
width:18px;
height:28px!important;
height:30px;
border:1px solid #8DB2E3;
font-size:1px;
display:none;
cursor:pointer;
background:#E0ECFF url('images/tabs_leftarrow.png') no-repeat 1px 5px;
}
.tabs-scroller-right{
position:absolute;
right:0;
top:-1px;
width:18px;
height:28px!important;
height:30px;
border:1px solid #8DB2E3;
font-size:1px;
display:none;
cursor:pointer;
background:#E0ECFF url('images/tabs_rightarrow.png') no-repeat 2px 5px;
}
.tabs-tool{
position:absolute;
top:-1px;
border:1px solid #8DB2E3;
padding:1px;
background:#E0ECFF;
overflow:hidden;
}
.tabs-header-plain .tabs-scroller-left{
top:2px;
height:25px!important;
height:27px;
}
.tabs-header-plain .tabs-scroller-right{
top:2px;
height:25px!important;
height:27px;
}
.tabs-header-plain .tabs-tool{
top:2px;
padding-top:0;
}
.tabs-scroller-over{
background-color:#ECF9F9;
}
.tabs-wrap{
position:relative;
left:0px;
overflow:hidden;
width:100%;
margin:0px;
padding:0px;
}
.tabs-scrolling{
margin-left:18px;
margin-right:18px;
}
.tabs{
list-style-type:none;
height:26px;
margin:0px;
padding:0px;
padding-left:4px;
font-size:12px;
width:5000px;
border-bottom:1px solid #8DB2E3;
}
.tabs li{
float:left;
display:inline-block;
margin-right:4px;
margin-bottom:-1px;
padding:0;
position:relative;
border:1px solid #8DB2E3;
-moz-border-radius-topleft:5px;
-moz-border-radius-topright:5px;
-webkit-border-top-left-radius:5px;
-webkit-border-top-right-radius:5px;
}
.tabs li a.tabs-inner{
display:inline-block;
text-decoration:none;
color:#416AA3;
background:url('images/tabs_enabled.png') repeat-x left top;
margin:0px;
padding:0px 10px;
height:25px;
line-height:25px;
text-align:center;
white-space:nowrap;
-moz-border-radius-topleft:5px;
-moz-border-radius-topright:5px;
-webkit-border-top-left-radius:5px;
-webkit-border-top-right-radius:5px;
}
.tabs li a.tabs-inner:hover{
background:url('images/tabs_active.png') repeat-x left bottom;
}
.tabs li.tabs-selected{
border:1px solid #8DB2E3;
border-bottom:1px solid #fff;
}
.tabs li.tabs-selected a.tabs-inner{
color:#416AA3;
font-weight:bold;
background:#fff;
background:#7eabcd url('images/tabs_active.png') repeat-x left bottom;
outline: none;
}
.tabs li.tabs-selected a:hover.tabs-inner{
cursor:default;
pointer:default;
}
.tabs-p-tool{
position:absolute;
right:16px;
top:7px;
display:block;
}
.tabs-p-tool a{
display:inline-block;
font-size:1px;
width:12px;
height:12px;
opacity:0.6;
filter:alpha(opacity=60);
}
.tabs-p-tool a:hover{
opacity:1;
filter:alpha(opacity=100);
cursor:hand;
cursor:pointer;
background-color:#8DB2E3;
}
.tabs-with-icon{
padding-left:18px;
}
.tabs-icon{
position:absolute;
width:16px;
height:16px;
left:10px;
top:5px;
}
.tabs-closable{
padding-right:8px;
}
.tabs li a.tabs-close{
position:absolute;
font-size:1px;
display:block;
padding:0px;
width:11px;
height:11px;
top:7px;
right:5px;
opacity:0.6;
filter:alpha(opacity=60);
background:url('images/tabs_close.gif') no-repeat 2px 2px;
}
.tabs li a:hover.tabs-close{
opacity:1;
filter:alpha(opacity=100);
cursor:hand;
cursor:pointer;
background-color:#8DB2E3;
}
.tabs-panels{
margin:0px;
padding:0px;
border:1px solid #8DB2E3;
border-top:0px;
overflow:hidden;
}
.tabs-panels-noborder{
border:0px;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/tree.css
================================================
.tree{
font-size:12px;
margin:0;
padding:0;
list-style-type:none;
}
.tree li{
white-space:nowrap;
}
.tree li ul{
list-style-type:none;
margin:0;
padding:0;
}
.tree-node{
height:18px;
white-space:nowrap;
cursor:pointer;
}
.tree-indent{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-hit{
cursor:pointer;
}
.tree-expanded{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
background:url('images/tree_arrows.gif') no-repeat -18px 0px;
}
.tree-expanded-hover{
background:url('images/tree_arrows.gif') no-repeat -50px 0px;
}
.tree-collapsed{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
background:url('images/tree_arrows.gif') no-repeat 0px 0px;
}
.tree-collapsed-hover{
background:url('images/tree_arrows.gif') no-repeat -32px 0px;
}
.tree-lines .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -36px -54px;
}
.tree-lines .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat 0px -36px;
}
.tree-lines .tree-node-last .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -18px 0px;
}
.tree-lines .tree-node-last .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat -36px -36px;
}
.tree-lines .tree-root-first .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -18px -54px;
}
.tree-lines .tree-root-first .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat -18px -36px;
}
.tree-lines .tree-root-one .tree-expanded{
background:url('images/tree_elbow.png') no-repeat 0px -18px;
}
.tree-lines .tree-root-one .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat 0px -72px;
}
.tree-line{
background:url('images/tree_elbow.png') no-repeat 0px -54px;
}
.tree-join{
background:url('images/tree_elbow.png') no-repeat -18px -18px;
}
.tree-joinbottom{
background:url('images/tree_elbow.png') no-repeat 0px 0px;
}
.tree-folder{
display:inline-block;
background:url('images/tree_folder.gif') no-repeat;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-folder-open{
background:url('images/tree_folder_open.gif') no-repeat;
}
.tree-file{
display:inline-block;
background:url('images/tree_file.gif') no-repeat;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-loading{
background:url('images/tree_loading.gif') no-repeat;
}
.tree-title{
display:inline-block;
text-decoration:none;
vertical-align:middle;
padding:1px 2px 1px 2px;
white-space:nowrap;
}
.tree-node-hover{
background:#fafafa;
}
.tree-node-selected{
background:#FBEC88;
}
.tree-checkbox{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-checkbox0{
background:url('images/tree_checkbox_0.gif') no-repeat;
}
.tree-checkbox1{
background:url('images/tree_checkbox_1.gif') no-repeat;
}
.tree-checkbox2{
background:url('images/tree_checkbox_2.gif') no-repeat;
}
.tree-node-proxy{
font-size:12px;
padding:1px 2px 1px 18px;
background:#fafafa;
border:1px solid #ccc;
z-index:9900000;
}
.tree-dnd-yes{
background:url('images/tree_dnd_yes.png') no-repeat 0 center;
}
.tree-dnd-no{
background:url('images/tree_dnd_no.png') no-repeat 0 center;
}
.tree-node-top{
border-top:1px dotted red;
}
.tree-node-bottom{
border-bottom:1px dotted red;
}
.tree-node-append .tree-title{
border:1px dotted red;
}
.tree-editor{
border:1px solid #ccc;
font-size:12px;
line-height:16px;
width:80px;
position:absolute;
top:0;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/validatebox.css
================================================
.validatebox-invalid{
background:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;
}
.validatebox-tip{
position:absolute;
width:200px;
height:auto;
display:none;
z-index:9900000;
}
.validatebox-tip-content{
display:inline-block;
position:absolute;
top:0px;
left:10px;
padding:3px 5px;
border:1px solid #CC9933;
background:#FFFFCC;
z-index:9900001;
font-size:12px;
}
.validatebox-tip-pointer{
background:url('images/validatebox_pointer.gif') no-repeat left top;
display:inline-block;
width:10px;
height:19px;
position:absolute;
left:1px;
top:0px;
z-index:9900002;
}
================================================
FILE: src/main/webapp/adminjs/themes/default/window.css
================================================
.window {
font-size:12px;
position:absolute;
overflow:hidden;
background:transparent url('images/panel_title.png');
padding:5px;
border:1px solid #99BBE8;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
}
.window-shadow{
position:absolute;
background:#ddd;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window .window-header{
background:transparent;
padding:2px 0px 4px 0px;
}
.window .window-body{
background:#fff;
border:1px solid #99BBE8;
border-top-width:0px;
}
.window .window-body-noheader{
border-top-width:1px;
}
.window .window-header .panel-icon{
left:1px;
top:1px;
}
.window .window-header .panel-with-icon{
padding-left:18px;
}
.window .window-header .panel-tool{
top:0px;
right:1px;
}
.window-proxy{
position:absolute;
overflow:hidden;
border:1px dashed #15428b;
}
.window-proxy-mask{
position:absolute;
background:#fafafa;
filter:alpha(opacity=10);
opacity:0.10;
}
.window-mask{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
filter:alpha(opacity=40);
opacity:0.40;
background:#ccc;
font-size:1px;
*zoom:1;
overflow:hidden;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/accordion.css
================================================
.accordion{
background:#fff;
overflow:hidden;
}
.accordion .accordion-header{
background:#efefef;
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/gray/calendar.css
================================================
.calendar{
background:#fff;
border:1px solid #d3d3d3;
padding:1px;
overflow:hidden;
}
.calendar-noborder{
border:0px;
}
.calendar-header{
position:relative;
background:#efefef;
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/gray/combo.css
================================================
.combo{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #d3d3d3;
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/gray/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/gray/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 #ccc;
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:#fafafa;
}
.datagrid-row-over{
background:#efefef;
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 #ccc;
padding:3px 2px;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/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/gray/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/gray/easyui.css
================================================
.accordion{
background:#fff;
overflow:hidden;
}
.accordion .accordion-header{
background:#efefef;
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 #d3d3d3;
padding:1px;
overflow:hidden;
}
.calendar-noborder{
border:0px;
}
.calendar-header{
position:relative;
background:#efefef;
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 #d3d3d3;
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 #ccc;
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:#fafafa;
}
.datagrid-row-over{
background:#efefef;
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 #ccc;
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:#efefef;
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:#fafafa;
}
.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 #efefef;
}
.layout-split-south{
border-top:5px solid #efefef;
}
.layout-split-east{
border-left:5px solid #efefef;
}
.layout-split-west{
border-right:5px solid #efefef;
}
.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 #d3d3d3;
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:#000 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;
font-size:2px;
background:url('images/menu_sep.png') repeat-x;
}
.menu-active{
border:1px solid #d3d3d3;
background:#fafafa;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
.menu-shadow{
position:absolute;
background:#ddd;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.menu-item-disabled{
opacity:0.5;
filter:alpha(opacity=50);
cursor:default;
}
.menu-active-disabled{
border-color:#d3d3d3;
}
.m-btn-downarrow{
display:inline-block;
width:12px;
line-height:14px;
*line-height:15px;
background:url('images/menu_downarrow.png') no-repeat 4px center;
}
a.m-btn-active{
background-position: bottom right;
}
a.m-btn-active span.l-btn-left{
background-position: bottom left;
}
a.m-btn-plain-active{
background:transparent;
border:1px solid #d3d3d3;
_padding:0px 5px 0px 0px;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
.messager-body{
padding:5px 10px;
}
.messager-button{
text-align:center;
padding-top:10px;
}
.messager-icon{
float:left;
width:47px;
height:35px;
}
.messager-error{
background:url('images/messager_error.gif') no-repeat scroll left top;
}
.messager-info{
background:url('images/messager_info.gif') no-repeat scroll left top;
}
.messager-question{
background:url('images/messager_question.gif') no-repeat scroll left top;
}
.messager-warning{
background:url('images/messager_warning.gif') no-repeat scroll left top;
}
.messager-input{
width: 262px;
border:1px solid #ccc;
}
.messager-progress{
padding:10px;
}
.messager-p-msg{
margin-bottom:5px;
}.pagination{
zoom:1;
}
.pagination table{
float:left;
height:30px;
}
.pagination-btn-separator{
float:left;
height:24px;
border-left:1px solid #ccc;
border-right:1px solid #fff;
margin:3px 1px;
}
.pagination-num{
border:1px solid #ccc;
margin:0 2px;
}
.pagination-page-list{
margin:0px 6px;
}
.pagination-info{
float:right;
padding-right:6px;
padding-top:8px;
font-size:12px;
}
.pagination span{
font-size:12px;
}
.pagination-first{
background:url('images/pagination_first.gif') no-repeat;
}
.pagination-prev{
background:url('images/pagination_prev.gif') no-repeat;
}
.pagination-next{
background:url('images/pagination_next.gif') no-repeat;
}
.pagination-last{
background:url('images/pagination_last.gif') no-repeat;
}
.pagination-load{
background:url('images/pagination_load.png') no-repeat;
}
.pagination-loading{
background:url('images/pagination_loading.gif') no-repeat;
}
.panel{
overflow:hidden;
font-size:12px;
}
.panel-header{
padding:5px;
line-height:15px;
color:#3F3F3F;
font-weight:bold;
font-size:12px;
background:url('images/panel_title.gif') repeat-x;
position:relative;
border:1px solid #D3D3D3;
}
.panel-title{
background:url('images/blank.gif') no-repeat;
}
.panel-header-noborder{
border-width:0px;
border-bottom:1px solid #D3D3D3;
}
.panel-body{
overflow:auto;
border:1px solid #D3D3D3;
border-top-width:0px;
}
.panel-body-noheader{
border-top-width:1px;
}
.panel-body-noborder{
border-width:0px;
}
.panel-with-icon{
padding-left:18px;
}
.panel-icon{
position:absolute;
left:5px;
top:4px;
width:16px;
height:16px;
}
.panel-tool{
position:absolute;
right:5px;
top:4px;
}
.panel-tool a{
display:inline-block;
width:16px;
height:16px;
opacity:0.6;
filter:alpha(opacity=60);
margin-left:2px;
}
.panel-tool a:hover{
opacity:1;
filter:alpha(opacity=100);
}
.panel-tool-close{
background:url('images/panel_tools.gif') no-repeat -16px 0px;
}
.panel-tool-min{
background:url('images/panel_tools.gif') no-repeat 0px 0px;
}
.panel-tool-max{
background:url('images/panel_tools.gif') no-repeat 0px -16px;
}
.panel-tool-restore{
background:url('images/panel_tools.gif') no-repeat -16px -16px;
}
.panel-tool-collapse{
background:url('images/panel_tool_collapse.gif') no-repeat;
}
.panel-tool-expand{
background:url('images/panel_tool_expand.gif') no-repeat;
}
.panel-loading{
padding:11px 0px 10px 30px;
background:url('images/panel_loading.gif') no-repeat 10px 10px;
}
.panel-noscroll{
overflow:hidden;
}
.progressbar{
border:1px solid #D3D3D3;
border-radius:5px;
overflow:hidden;
}
.progressbar-text{
text-align:center;
color:#3F3F3F;
position:absolute;
}
.progressbar-value{
background-color:#eee;
border-radius:5px;
border-top-right-radius:0px;
border-bottom-right-radius:0px;
width:0;
}
.propertygrid .datagrid-view1 .datagrid-body,.propertygrid .datagrid-group{
background:#fafafa;
}
.propertygrid .datagrid-group{
height:21px;
overflow:hidden;
}
.propertygrid .datagrid-view1 .datagrid-body td{
border-color:#fafafa;
}
.propertygrid .datagrid-view1 .datagrid-row-over,.propertygrid .datagrid-view1 .datagrid-row-selected{
background:#fafafa;
}
.propertygrid .datagrid-group span{
color:#3F3F3F;
font-weight:bold;
padding-left:4px;
}
.propertygrid .datagrid-row-collapse,.propertygrid .datagrid-row-expand{
background-position:3px center;
}.searchbox{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #d3d3d3;
background:#fff;
}
.searchbox-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.searchbox-button{
background:url('images/searchbox_button.png') no-repeat center center;
width:18px;
height:20px;
overflow:hidden;
display:inline-block;
vertical-align:top;
cursor:pointer;
opacity:0.6;
filter:alpha(opacity=60);
}
.searchbox-button-hover{
opacity:1.0;
filter:alpha(opacity=100);
}
.searchbox-prompt{
font-size:12px;
color:#ccc;
}
.searchbox a.l-btn-plain{
background-color:#efefef;
height:20px;
border:0;
padding:0 6px 0 0;
vertical-align:top;
}
.searchbox a.l-btn .l-btn-left{
padding:2px 0 2px 2px;
}
.searchbox a.l-btn-plain:hover{
-moz-border-radius:0px;
-webkit-border-radius: 0px;
border:0;
padding:0 6px 0 0;
}
.searchbox a.m-btn-plain-active{
-moz-border-radius:0px;
-webkit-border-radius: 0px;
}.slider{
}
.slider-disabled{
opacity:0.5;
filter:alpha(opacity=50);
}
.slider-h{
height:22px;
}
.slider-v{
width:22px;
}
.slider-inner{
position:relative;
height:6px;
top:7px;
border:1px solid #D3D3D3;
background:#fafafa;
border-radius:3px;
}
.slider-handle{
position:absolute;
display:block;
outline:none;
width:20px;
height:20px;
top:-7px;
margin-left:-10px;
background:url('images/slider_handle.png') no-repeat;
}
.slider-tip{
position:absolute;
display:inline-block;
line-height:12px;
white-space:nowrap;
top:-22px;
}
.slider-rule{
position:relative;
top:15px;
}
.slider-rule span{
position:absolute;
display:inline-block;
font-size:0;
height:5px;
border-left:1px solid #999;
}
.slider-rulelabel{
position:relative;
top:20px;
}
.slider-rulelabel span{
position:absolute;
display:inline-block;
color:#999;
}
.slider-v .slider-inner{
width:6px;
left:7px;
top:0;
float:left;
}
.slider-v .slider-handle{
left:3px;
margin-top:-10px;
}
.slider-v .slider-tip{
left:-10px;
margin-top:-6px;
}
.slider-v .slider-rule{
float:left;
top:0;
left:16px;
}
.slider-v .slider-rule span{
width:5px;
height:'auto';
border-left:0;
border-top:1px solid #999;
}
.slider-v .slider-rulelabel{
float:left;
top:0;
left:23px;
}
.spinner{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #d3d3d3;
}
.spinner-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.spinner-arrow{
display:inline-block;
vertical-align:top;
margin:0;
padding:0;
}
.spinner-arrow-up,.spinner-arrow-down{
display:block;
background:#E0ECF9 url('images/spinner_arrow_up.gif') no-repeat 5px 2px;
font-size:1px;
width:18px;
height:10px;
}
.spinner-arrow-down{
background:#E0ECF9 url('images/spinner_arrow_down.gif') no-repeat 5px 3px;
}
.spinner-arrow-hover{
background-color:#ECF9F9;
}.s-btn-downarrow{
display:inline-block;
width:16px;
line-height:14px;
*line-height:15px;
background:url('images/menu_downarrow.png') no-repeat 9px center;
}
a.s-btn-active{
background-position: bottom right;
}
a.s-btn-active span.l-btn-left{
background-position: bottom left;
}
a.s-btn-active .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
a:hover.l-btn .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
a.s-btn-plain-active{
background:transparent;
border:1px solid #d3d3d3;
_padding:0px 5px 0px 0px;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
a.s-btn-plain-active .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}.tabs-container{
overflow:hidden;
background:#fff;
}
.tabs-header{
border:1px solid #D3D3D3;
background:#efefef;
border-bottom:0px;
position:relative;
overflow:hidden;
padding:0px;
padding-top:2px;
overflow:hidden;
}
.tabs-header-noborder{
border:0px;
}
.tabs-header-plain{
border:0px;
background:transparent;
}
.tabs-scroller-left{
position:absolute;
left:0px;
top:-1px;
width:18px;
height:28px!important;
height:30px;
border:1px solid #D3D3D3;
font-size:1px;
display:none;
cursor:pointer;
background:#efefef url('images/tabs_leftarrow.png') no-repeat 1px 5px;
}
.tabs-scroller-right{
position:absolute;
right:0;
top:-1px;
width:18px;
height:28px!important;
height:30px;
border:1px solid #D3D3D3;
font-size:1px;
display:none;
cursor:pointer;
background:#efefef url('images/tabs_rightarrow.png') no-repeat 2px 5px;
}
.tabs-tool{
position:absolute;
top:-1px;
border:1px solid #D3D3D3;
padding:1px;
background:#efefef;
overflow:hidden;
}
.tabs-header-plain .tabs-scroller-left{
top:2px;
height:25px!important;
height:27px;
}
.tabs-header-plain .tabs-scroller-right{
top:2px;
height:25px!important;
height:27px;
}
.tabs-header-plain .tabs-tool{
top:2px;
padding-top:0;
}
.tabs-scroller-over{
background-color:#fafafa;
}
.tabs-wrap{
position:relative;
left:0px;
overflow:hidden;
width:100%;
margin:0px;
padding:0px;
}
.tabs-scrolling{
margin-left:18px;
margin-right:18px;
}
.tabs{
list-style-type:none;
height:26px;
margin:0px;
padding:0px;
padding-left:4px;
font-size:12px;
width:5000px;
border-bottom:1px solid #D3D3D3;
}
.tabs li{
float:left;
display:inline-block;
margin-right:4px;
margin-bottom:-1px;
padding:0;
position:relative;
border:1px solid #D3D3D3;
-moz-border-radius-topleft:5px;
-moz-border-radius-topright:5px;
-webkit-border-top-left-radius:5px;
-webkit-border-top-right-radius:5px;
}
.tabs li a.tabs-inner{
display:inline-block;
text-decoration:none;
color:#3F3F3F;
background:url('images/tabs_enabled.gif') repeat-x left top;
margin:0px;
padding:0px 10px;
height:25px;
line-height:25px;
text-align:center;
white-space:nowrap;
-moz-border-radius-topleft:5px;
-moz-border-radius-topright:5px;
-webkit-border-top-left-radius:5px;
-webkit-border-top-right-radius:5px;
}
.tabs li a.tabs-inner:hover{
background:#fff;
}
.tabs li.tabs-selected{
border:1px solid #D3D3D3;
border-bottom:1px solid #fff;
}
.tabs li.tabs-selected a.tabs-inner{
color:#3F3F3F;
font-weight:bold;
background:#fff;
background:#fff;
outline: none;
}
.tabs li.tabs-selected a:hover.tabs-inner{
cursor:default;
pointer:default;
}
.tabs-p-tool{
position:absolute;
right:16px;
top:7px;
display:block;
}
.tabs-p-tool a{
display:inline-block;
font-size:1px;
width:12px;
height:12px;
opacity:0.6;
filter:alpha(opacity=60);
}
.tabs-p-tool a:hover{
opacity:1;
filter:alpha(opacity=100);
cursor:hand;
cursor:pointer;
background-color:#D3D3D3;
}
.tabs-with-icon{
padding-left:18px;
}
.tabs-icon{
position:absolute;
width:16px;
height:16px;
left:10px;
top:5px;
}
.tabs-closable{
padding-right:8px;
}
.tabs li a.tabs-close{
position:absolute;
font-size:1px;
display:block;
padding:0px;
width:11px;
height:11px;
top:7px;
right:5px;
opacity:0.6;
filter:alpha(opacity=60);
background:url('images/tabs_close.gif') no-repeat 2px 2px;
}
.tabs li a:hover.tabs-close{
opacity:1;
filter:alpha(opacity=100);
cursor:hand;
cursor:pointer;
background-color:#D3D3D3;
}
.tabs-panels{
margin:0px;
padding:0px;
border:1px solid #D3D3D3;
border-top:0px;
overflow:hidden;
}
.tabs-panels-noborder{
border:0px;
}
.tree{
font-size:12px;
margin:0;
padding:0;
list-style-type:none;
}
.tree li{
white-space:nowrap;
}
.tree li ul{
list-style-type:none;
margin:0;
padding:0;
}
.tree-node{
height:18px;
white-space:nowrap;
cursor:pointer;
}
.tree-indent{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-hit{
cursor:pointer;
}
.tree-expanded{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
background:url('images/tree_arrows.gif') no-repeat -18px 0px;
}
.tree-expanded-hover{
background:url('images/tree_arrows.gif') no-repeat -50px 0px;
}
.tree-collapsed{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
background:url('images/tree_arrows.gif') no-repeat 0px 0px;
}
.tree-collapsed-hover{
background:url('images/tree_arrows.gif') no-repeat -32px 0px;
}
.tree-lines .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -36px -54px;
}
.tree-lines .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat 0px -36px;
}
.tree-lines .tree-node-last .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -18px 0px;
}
.tree-lines .tree-node-last .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat -36px -36px;
}
.tree-lines .tree-root-first .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -18px -54px;
}
.tree-lines .tree-root-first .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat -18px -36px;
}
.tree-lines .tree-root-one .tree-expanded{
background:url('images/tree_elbow.png') no-repeat 0px -18px;
}
.tree-lines .tree-root-one .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat 0px -72px;
}
.tree-line{
background:url('images/tree_elbow.png') no-repeat 0px -54px;
}
.tree-join{
background:url('images/tree_elbow.png') no-repeat -18px -18px;
}
.tree-joinbottom{
background:url('images/tree_elbow.png') no-repeat 0px 0px;
}
.tree-folder{
display:inline-block;
background:url('images/tree_folder.gif') no-repeat;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-folder-open{
background:url('images/tree_folder_open.gif') no-repeat;
}
.tree-file{
display:inline-block;
background:url('images/tree_file.gif') no-repeat;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-loading{
background:url('images/tree_loading.gif') no-repeat;
}
.tree-title{
display:inline-block;
text-decoration:none;
vertical-align:middle;
padding:1px 2px 1px 2px;
white-space:nowrap;
}
.tree-node-hover{
background:#fafafa;
}
.tree-node-selected{
background:#FBEC88;
}
.tree-checkbox{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-checkbox0{
background:url('images/tree_checkbox_0.gif') no-repeat;
}
.tree-checkbox1{
background:url('images/tree_checkbox_1.gif') no-repeat;
}
.tree-checkbox2{
background:url('images/tree_checkbox_2.gif') no-repeat;
}
.tree-node-proxy{
font-size:12px;
padding:1px 2px 1px 18px;
background:#fafafa;
border:1px solid #ccc;
z-index:9900000;
}
.tree-dnd-yes{
background:url('images/tree_dnd_yes.png') no-repeat 0 center;
}
.tree-dnd-no{
background:url('images/tree_dnd_no.png') no-repeat 0 center;
}
.tree-node-top{
border-top:1px dotted red;
}
.tree-node-bottom{
border-bottom:1px dotted red;
}
.tree-node-append .tree-title{
border:1px dotted red;
}
.tree-editor{
border:1px solid #ccc;
font-size:12px;
line-height:16px;
width:80px;
position:absolute;
top:0;
}
.validatebox-invalid{
background:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;
}
.validatebox-tip{
position:absolute;
width:200px;
height:auto;
display:none;
z-index:9900000;
}
.validatebox-tip-content{
display:inline-block;
position:absolute;
top:0px;
left:10px;
padding:3px 5px;
border:1px solid #CC9933;
background:#FFFFCC;
z-index:9900001;
font-size:12px;
}
.validatebox-tip-pointer{
background:url('images/validatebox_pointer.gif') no-repeat left top;
display:inline-block;
width:10px;
height:19px;
position:absolute;
left:1px;
top:0px;
z-index:9900002;
}
.window {
font-size:12px;
position:absolute;
overflow:hidden;
background:#eee url('images/panel_title.gif') repeat-x;
padding:5px;
border:1px solid #D3D3D3;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
}
.window-shadow{
position:absolute;
background:#ddd;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window .window-header{
background:transparent;
padding:2px 0px 4px 0px;
}
.window .window-body{
background:#fff;
border:1px solid #D3D3D3;
border-top-width:0px;
}
.window .window-body-noheader{
border-top-width:1px;
}
.window .window-header .panel-icon{
left:1px;
top:1px;
}
.window .window-header .panel-with-icon{
padding-left:18px;
}
.window .window-header .panel-tool{
top:0px;
right:1px;
}
.window-proxy{
position:absolute;
overflow:hidden;
border:1px dashed #3F3F3F;
}
.window-proxy-mask{
position:absolute;
background:#fafafa;
filter:alpha(opacity=10);
opacity:0.10;
}
.window-mask{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
filter:alpha(opacity=40);
opacity:0.40;
background:#ccc;
font-size:1px;
*zoom:1;
overflow:hidden;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/layout.css
================================================
.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:#efefef;
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:#fafafa;
}
.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 #efefef;
}
.layout-split-south{
border-top:5px solid #efefef;
}
.layout-split-east{
border-left:5px solid #efefef;
}
.layout-split-west{
border-right:5px solid #efefef;
}
.layout-mask{
position:absolute;
background:#fafafa;
filter:alpha(opacity=10);
opacity:0.10;
z-index:4;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/linkbutton.css
================================================
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 #d3d3d3;
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:#000 dotted thin;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/menu.css
================================================
.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;
font-size:2px;
background:url('images/menu_sep.png') repeat-x;
}
.menu-active{
border:1px solid #d3d3d3;
background:#fafafa;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
.menu-shadow{
position:absolute;
background:#ddd;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.menu-item-disabled{
opacity:0.5;
filter:alpha(opacity=50);
cursor:default;
}
.menu-active-disabled{
border-color:#d3d3d3;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/menubutton.css
================================================
.m-btn-downarrow{
display:inline-block;
width:12px;
line-height:14px;
*line-height:15px;
background:url('images/menu_downarrow.png') no-repeat 4px center;
}
a.m-btn-active{
background-position: bottom right;
}
a.m-btn-active span.l-btn-left{
background-position: bottom left;
}
a.m-btn-plain-active{
background:transparent;
border:1px solid #d3d3d3;
_padding:0px 5px 0px 0px;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/messager.css
================================================
.messager-body{
padding:5px 10px;
}
.messager-button{
text-align:center;
padding-top:10px;
}
.messager-icon{
float:left;
width:47px;
height:35px;
}
.messager-error{
background:url('images/messager_error.gif') no-repeat scroll left top;
}
.messager-info{
background:url('images/messager_info.gif') no-repeat scroll left top;
}
.messager-question{
background:url('images/messager_question.gif') no-repeat scroll left top;
}
.messager-warning{
background:url('images/messager_warning.gif') no-repeat scroll left top;
}
.messager-input{
width: 262px;
border:1px solid #ccc;
}
.messager-progress{
padding:10px;
}
.messager-p-msg{
margin-bottom:5px;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/pagination.css
================================================
.pagination{
zoom:1;
}
.pagination table{
float:left;
height:30px;
}
.pagination-btn-separator{
float:left;
height:24px;
border-left:1px solid #ccc;
border-right:1px solid #fff;
margin:3px 1px;
}
.pagination-num{
border:1px solid #ccc;
margin:0 2px;
}
.pagination-page-list{
margin:0px 6px;
}
.pagination-info{
float:right;
padding-right:6px;
padding-top:8px;
font-size:12px;
}
.pagination span{
font-size:12px;
}
.pagination-first{
background:url('images/pagination_first.gif') no-repeat;
}
.pagination-prev{
background:url('images/pagination_prev.gif') no-repeat;
}
.pagination-next{
background:url('images/pagination_next.gif') no-repeat;
}
.pagination-last{
background:url('images/pagination_last.gif') no-repeat;
}
.pagination-load{
background:url('images/pagination_load.png') no-repeat;
}
.pagination-loading{
background:url('images/pagination_loading.gif') no-repeat;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/panel.css
================================================
.panel{
overflow:hidden;
font-size:12px;
}
.panel-header{
padding:5px;
line-height:15px;
color:#3F3F3F;
font-weight:bold;
font-size:12px;
background:url('images/panel_title.gif') repeat-x;
position:relative;
border:1px solid #D3D3D3;
}
.panel-title{
background:url('images/blank.gif') no-repeat;
}
.panel-header-noborder{
border-width:0px;
border-bottom:1px solid #D3D3D3;
}
.panel-body{
overflow:auto;
border:1px solid #D3D3D3;
border-top-width:0px;
}
.panel-body-noheader{
border-top-width:1px;
}
.panel-body-noborder{
border-width:0px;
}
.panel-with-icon{
padding-left:18px;
}
.panel-icon{
position:absolute;
left:5px;
top:4px;
width:16px;
height:16px;
}
.panel-tool{
position:absolute;
right:5px;
top:4px;
}
.panel-tool a{
display:inline-block;
width:16px;
height:16px;
opacity:0.6;
filter:alpha(opacity=60);
margin-left:2px;
}
.panel-tool a:hover{
opacity:1;
filter:alpha(opacity=100);
}
.panel-tool-close{
background:url('images/panel_tools.gif') no-repeat -16px 0px;
}
.panel-tool-min{
background:url('images/panel_tools.gif') no-repeat 0px 0px;
}
.panel-tool-max{
background:url('images/panel_tools.gif') no-repeat 0px -16px;
}
.panel-tool-restore{
background:url('images/panel_tools.gif') no-repeat -16px -16px;
}
.panel-tool-collapse{
background:url('images/panel_tool_collapse.gif') no-repeat;
}
.panel-tool-expand{
background:url('images/panel_tool_expand.gif') no-repeat;
}
.panel-loading{
padding:11px 0px 10px 30px;
background:url('images/panel_loading.gif') no-repeat 10px 10px;
}
.panel-noscroll{
overflow:hidden;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/progressbar.css
================================================
.progressbar{
border:1px solid #D3D3D3;
border-radius:5px;
overflow:hidden;
}
.progressbar-text{
text-align:center;
color:#3F3F3F;
position:absolute;
}
.progressbar-value{
background-color:#eee;
border-radius:5px;
border-top-right-radius:0px;
border-bottom-right-radius:0px;
width:0;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/propertygrid.css
================================================
.propertygrid .datagrid-view1 .datagrid-body,.propertygrid .datagrid-group{
background:#fafafa;
}
.propertygrid .datagrid-group{
height:21px;
overflow:hidden;
}
.propertygrid .datagrid-view1 .datagrid-body td{
border-color:#fafafa;
}
.propertygrid .datagrid-view1 .datagrid-row-over,.propertygrid .datagrid-view1 .datagrid-row-selected{
background:#fafafa;
}
.propertygrid .datagrid-group span{
color:#3F3F3F;
font-weight:bold;
padding-left:4px;
}
.propertygrid .datagrid-row-collapse,.propertygrid .datagrid-row-expand{
background-position:3px center;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/searchbox.css
================================================
.searchbox{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #d3d3d3;
background:#fff;
}
.searchbox-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.searchbox-button{
background:url('images/searchbox_button.png') no-repeat center center;
width:18px;
height:20px;
overflow:hidden;
display:inline-block;
vertical-align:top;
cursor:pointer;
opacity:0.6;
filter:alpha(opacity=60);
}
.searchbox-button-hover{
opacity:1.0;
filter:alpha(opacity=100);
}
.searchbox-prompt{
font-size:12px;
color:#ccc;
}
.searchbox a.l-btn-plain{
background-color:#efefef;
height:20px;
border:0;
padding:0 6px 0 0;
vertical-align:top;
}
.searchbox a.l-btn .l-btn-left{
padding:2px 0 2px 2px;
}
.searchbox a.l-btn-plain:hover{
-moz-border-radius:0px;
-webkit-border-radius: 0px;
border:0;
padding:0 6px 0 0;
}
.searchbox a.m-btn-plain-active{
-moz-border-radius:0px;
-webkit-border-radius: 0px;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/slider.css
================================================
.slider{
}
.slider-disabled{
opacity:0.5;
filter:alpha(opacity=50);
}
.slider-h{
height:22px;
}
.slider-v{
width:22px;
}
.slider-inner{
position:relative;
height:6px;
top:7px;
border:1px solid #D3D3D3;
background:#fafafa;
border-radius:3px;
}
.slider-handle{
position:absolute;
display:block;
outline:none;
width:20px;
height:20px;
top:-7px;
margin-left:-10px;
background:url('images/slider_handle.png') no-repeat;
}
.slider-tip{
position:absolute;
display:inline-block;
line-height:12px;
white-space:nowrap;
top:-22px;
}
.slider-rule{
position:relative;
top:15px;
}
.slider-rule span{
position:absolute;
display:inline-block;
font-size:0;
height:5px;
border-left:1px solid #999;
}
.slider-rulelabel{
position:relative;
top:20px;
}
.slider-rulelabel span{
position:absolute;
display:inline-block;
color:#999;
}
.slider-v .slider-inner{
width:6px;
left:7px;
top:0;
float:left;
}
.slider-v .slider-handle{
left:3px;
margin-top:-10px;
}
.slider-v .slider-tip{
left:-10px;
margin-top:-6px;
}
.slider-v .slider-rule{
float:left;
top:0;
left:16px;
}
.slider-v .slider-rule span{
width:5px;
height:'auto';
border-left:0;
border-top:1px solid #999;
}
.slider-v .slider-rulelabel{
float:left;
top:0;
left:23px;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/spinner.css
================================================
.spinner{
display:inline-block;
white-space:nowrap;
font-size:12px;
margin:0;
padding:0;
border:1px solid #d3d3d3;
}
.spinner-text{
font-size:12px;
border:0px;
line-height:20px;
height:20px;
padding:0px;
*height:18px;
*line-height:18px;
_height:18px;
_line-height:18px;
}
.spinner-arrow{
display:inline-block;
vertical-align:top;
margin:0;
padding:0;
}
.spinner-arrow-up,.spinner-arrow-down{
display:block;
background:#E0ECF9 url('images/spinner_arrow_up.gif') no-repeat 5px 2px;
font-size:1px;
width:18px;
height:10px;
}
.spinner-arrow-down{
background:#E0ECF9 url('images/spinner_arrow_down.gif') no-repeat 5px 3px;
}
.spinner-arrow-hover{
background-color:#ECF9F9;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/splitbutton.css
================================================
.s-btn-downarrow{
display:inline-block;
width:16px;
line-height:14px;
*line-height:15px;
background:url('images/menu_downarrow.png') no-repeat 9px center;
}
a.s-btn-active{
background-position: bottom right;
}
a.s-btn-active span.l-btn-left{
background-position: bottom left;
}
a.s-btn-active .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
a:hover.l-btn .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
a.s-btn-plain-active{
background:transparent;
border:1px solid #d3d3d3;
_padding:0px 5px 0px 0px;
-moz-border-radius:3px;
-webkit-border-radius: 3px;
}
a.s-btn-plain-active .s-btn-downarrow{
background:url('images/menu_split_downarrow.png') no-repeat 4px -19px;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/tabs.css
================================================
.tabs-container{
overflow:hidden;
background:#fff;
}
.tabs-header{
border:1px solid #D3D3D3;
background:#efefef;
border-bottom:0px;
position:relative;
overflow:hidden;
padding:0px;
padding-top:2px;
overflow:hidden;
}
.tabs-header-noborder{
border:0px;
}
.tabs-header-plain{
border:0px;
background:transparent;
}
.tabs-scroller-left{
position:absolute;
left:0px;
top:-1px;
width:18px;
height:28px!important;
height:30px;
border:1px solid #D3D3D3;
font-size:1px;
display:none;
cursor:pointer;
background:#efefef url('images/tabs_leftarrow.png') no-repeat 1px 5px;
}
.tabs-scroller-right{
position:absolute;
right:0;
top:-1px;
width:18px;
height:28px!important;
height:30px;
border:1px solid #D3D3D3;
font-size:1px;
display:none;
cursor:pointer;
background:#efefef url('images/tabs_rightarrow.png') no-repeat 2px 5px;
}
.tabs-tool{
position:absolute;
top:-1px;
border:1px solid #D3D3D3;
padding:1px;
background:#efefef;
overflow:hidden;
}
.tabs-header-plain .tabs-scroller-left{
top:2px;
height:25px!important;
height:27px;
}
.tabs-header-plain .tabs-scroller-right{
top:2px;
height:25px!important;
height:27px;
}
.tabs-header-plain .tabs-tool{
top:2px;
padding-top:0;
}
.tabs-scroller-over{
background-color:#fafafa;
}
.tabs-wrap{
position:relative;
left:0px;
overflow:hidden;
width:100%;
margin:0px;
padding:0px;
}
.tabs-scrolling{
margin-left:18px;
margin-right:18px;
}
.tabs{
list-style-type:none;
height:26px;
margin:0px;
padding:0px;
padding-left:4px;
font-size:12px;
width:5000px;
border-bottom:1px solid #D3D3D3;
}
.tabs li{
float:left;
display:inline-block;
margin-right:4px;
margin-bottom:-1px;
padding:0;
position:relative;
border:1px solid #D3D3D3;
-moz-border-radius-topleft:5px;
-moz-border-radius-topright:5px;
-webkit-border-top-left-radius:5px;
-webkit-border-top-right-radius:5px;
}
.tabs li a.tabs-inner{
display:inline-block;
text-decoration:none;
color:#3F3F3F;
background:url('images/tabs_enabled.gif') repeat-x left top;
margin:0px;
padding:0px 10px;
height:25px;
line-height:25px;
text-align:center;
white-space:nowrap;
-moz-border-radius-topleft:5px;
-moz-border-radius-topright:5px;
-webkit-border-top-left-radius:5px;
-webkit-border-top-right-radius:5px;
}
.tabs li a.tabs-inner:hover{
background:#fff;
}
.tabs li.tabs-selected{
border:1px solid #D3D3D3;
border-bottom:1px solid #fff;
}
.tabs li.tabs-selected a.tabs-inner{
color:#3F3F3F;
font-weight:bold;
background:#fff;
background:#fff;
outline: none;
}
.tabs li.tabs-selected a:hover.tabs-inner{
cursor:default;
pointer:default;
}
.tabs-p-tool{
position:absolute;
right:16px;
top:7px;
display:block;
}
.tabs-p-tool a{
display:inline-block;
font-size:1px;
width:12px;
height:12px;
opacity:0.6;
filter:alpha(opacity=60);
}
.tabs-p-tool a:hover{
opacity:1;
filter:alpha(opacity=100);
cursor:hand;
cursor:pointer;
background-color:#D3D3D3;
}
.tabs-with-icon{
padding-left:18px;
}
.tabs-icon{
position:absolute;
width:16px;
height:16px;
left:10px;
top:5px;
}
.tabs-closable{
padding-right:8px;
}
.tabs li a.tabs-close{
position:absolute;
font-size:1px;
display:block;
padding:0px;
width:11px;
height:11px;
top:7px;
right:5px;
opacity:0.6;
filter:alpha(opacity=60);
background:url('images/tabs_close.gif') no-repeat 2px 2px;
}
.tabs li a:hover.tabs-close{
opacity:1;
filter:alpha(opacity=100);
cursor:hand;
cursor:pointer;
background-color:#D3D3D3;
}
.tabs-panels{
margin:0px;
padding:0px;
border:1px solid #D3D3D3;
border-top:0px;
overflow:hidden;
}
.tabs-panels-noborder{
border:0px;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/tree.css
================================================
.tree{
font-size:12px;
margin:0;
padding:0;
list-style-type:none;
}
.tree li{
white-space:nowrap;
}
.tree li ul{
list-style-type:none;
margin:0;
padding:0;
}
.tree-node{
height:18px;
white-space:nowrap;
cursor:pointer;
}
.tree-indent{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-hit{
cursor:pointer;
}
.tree-expanded{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
background:url('images/tree_arrows.gif') no-repeat -18px 0px;
}
.tree-expanded-hover{
background:url('images/tree_arrows.gif') no-repeat -50px 0px;
}
.tree-collapsed{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
background:url('images/tree_arrows.gif') no-repeat 0px 0px;
}
.tree-collapsed-hover{
background:url('images/tree_arrows.gif') no-repeat -32px 0px;
}
.tree-lines .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -36px -54px;
}
.tree-lines .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat 0px -36px;
}
.tree-lines .tree-node-last .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -18px 0px;
}
.tree-lines .tree-node-last .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat -36px -36px;
}
.tree-lines .tree-root-first .tree-expanded{
background:url('images/tree_elbow.png') no-repeat -18px -54px;
}
.tree-lines .tree-root-first .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat -18px -36px;
}
.tree-lines .tree-root-one .tree-expanded{
background:url('images/tree_elbow.png') no-repeat 0px -18px;
}
.tree-lines .tree-root-one .tree-collapsed{
background:url('images/tree_elbow.png') no-repeat 0px -72px;
}
.tree-line{
background:url('images/tree_elbow.png') no-repeat 0px -54px;
}
.tree-join{
background:url('images/tree_elbow.png') no-repeat -18px -18px;
}
.tree-joinbottom{
background:url('images/tree_elbow.png') no-repeat 0px 0px;
}
.tree-folder{
display:inline-block;
background:url('images/tree_folder.gif') no-repeat;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-folder-open{
background:url('images/tree_folder_open.gif') no-repeat;
}
.tree-file{
display:inline-block;
background:url('images/tree_file.gif') no-repeat;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-loading{
background:url('images/tree_loading.gif') no-repeat;
}
.tree-title{
display:inline-block;
text-decoration:none;
vertical-align:middle;
padding:1px 2px 1px 2px;
white-space:nowrap;
}
.tree-node-hover{
background:#fafafa;
}
.tree-node-selected{
background:#FBEC88;
}
.tree-checkbox{
display:inline-block;
width:16px;
height:18px;
vertical-align:middle;
}
.tree-checkbox0{
background:url('images/tree_checkbox_0.gif') no-repeat;
}
.tree-checkbox1{
background:url('images/tree_checkbox_1.gif') no-repeat;
}
.tree-checkbox2{
background:url('images/tree_checkbox_2.gif') no-repeat;
}
.tree-node-proxy{
font-size:12px;
padding:1px 2px 1px 18px;
background:#fafafa;
border:1px solid #ccc;
z-index:9900000;
}
.tree-dnd-yes{
background:url('images/tree_dnd_yes.png') no-repeat 0 center;
}
.tree-dnd-no{
background:url('images/tree_dnd_no.png') no-repeat 0 center;
}
.tree-node-top{
border-top:1px dotted red;
}
.tree-node-bottom{
border-bottom:1px dotted red;
}
.tree-node-append .tree-title{
border:1px dotted red;
}
.tree-editor{
border:1px solid #ccc;
font-size:12px;
line-height:16px;
width:80px;
position:absolute;
top:0;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/validatebox.css
================================================
.validatebox-invalid{
background:#FFFFEE url('images/validatebox_warning.png') no-repeat right 1px;
}
.validatebox-tip{
position:absolute;
width:200px;
height:auto;
display:none;
z-index:9900000;
}
.validatebox-tip-content{
display:inline-block;
position:absolute;
top:0px;
left:10px;
padding:3px 5px;
border:1px solid #CC9933;
background:#FFFFCC;
z-index:9900001;
font-size:12px;
}
.validatebox-tip-pointer{
background:url('images/validatebox_pointer.gif') no-repeat left top;
display:inline-block;
width:10px;
height:19px;
position:absolute;
left:1px;
top:0px;
z-index:9900002;
}
================================================
FILE: src/main/webapp/adminjs/themes/gray/window.css
================================================
.window {
font-size:12px;
position:absolute;
overflow:hidden;
background:#eee url('images/panel_title.gif') repeat-x;
padding:5px;
border:1px solid #D3D3D3;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
}
.window-shadow{
position:absolute;
background:#ddd;
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius: 5px;
-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
}
.window .window-header{
background:transparent;
padding:2px 0px 4px 0px;
}
.window .window-body{
background:#fff;
border:1px solid #D3D3D3;
border-top-width:0px;
}
.window .window-body-noheader{
border-top-width:1px;
}
.window .window-header .panel-icon{
left:1px;
top:1px;
}
.window .window-header .panel-with-icon{
padding-left:18px;
}
.window .window-header .panel-tool{
top:0px;
right:1px;
}
.window-proxy{
position:absolute;
overflow:hidden;
border:1px dashed #3F3F3F;
}
.window-proxy-mask{
position:absolute;
background:#fafafa;
filter:alpha(opacity=10);
opacity:0.10;
}
.window-mask{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
filter:alpha(opacity=40);
opacity:0.40;
background:#ccc;
font-size:1px;
*zoom:1;
overflow:hidden;
}
================================================
FILE: src/main/webapp/adminjs/themes/icon.css
================================================
.icon-blank{
background:url('icons/blank.gif') no-repeat;
}
.icon-add{
background:url('icons/edit_add.png') no-repeat;
}
.icon-edit{
background:url('icons/pencil.png') no-repeat;
}
.icon-remove{
background:url('icons/edit_remove.png') no-repeat;
}
.icon-save{
background:url('icons/filesave.png') no-repeat;
}
.icon-cut{
background:url('icons/cut.png') no-repeat;
}
.icon-ok{
background:url('icons/ok.png') no-repeat;
}
.icon-no{
background:url('icons/no.png') no-repeat;
}
.icon-cancel{
background:url('icons/cancel.png') no-repeat;
}
.icon-reload{
background:url('icons/reload.png') no-repeat;
}
.icon-search{
background:url('icons/search.png') no-repeat;
}
.icon-print{
background:url('icons/print.png') no-repeat;
}
.icon-help{
background:url('icons/help.png') no-repeat;
}
.icon-undo{
background:url('icons/undo.png') no-repeat;
}
.icon-redo{
background:url('icons/redo.png') no-repeat;
}
.icon-back{
background:url('icons/back.png') no-repeat;
}
.icon-sum{
background:url('icons/sum.png') no-repeat;
}
.icon-tip{
background:url('icons/tip.png') no-repeat;
}
.icon-mini-add{
background:url('icons/mini_add.png') no-repeat 2px 2px;
}
.icon-mini-edit{
background:url('icons/mini_edit.png') no-repeat 2px 2px;
}
.icon-mini-refresh{
background:url('icons/mini_refresh.png') no-repeat 3px 2px;
}
================================================
FILE: src/main/webapp/casual.html
================================================
临时工计件页面
临时工计件页面
================================================
FILE: src/main/webapp/css/default.css
================================================
*{font-size:12px; font-family:Tahoma,Verdana,微软雅黑,新宋体}
body{background:#D2E0F2; }
a{ color:Black; text-decoration:none;}
a:hover{ color:Red; text-decoration:underline;}
.textbox03 {border: #878787 1px solid;padding: 4px 3px;font:Verdana, Geneva, sans-serif,宋体;line-height: 14px; background-color: #fff; height: auto; font-size: 14px; font-weight: bold; width: 190px; }
.txt01{font:Verdana, Geneva, sans-serif,宋体;padding:3px 2px 2px 2px; border-width:1px; border-color:#ddd; color:#000;}
.txt {border: #878787 1px solid;padding: 4px 3px;font:Verdana, Geneva, sans-serif,宋体;line-height: 14px; background-color: #fff; height: auto; font-size: 14px;}
.footer{text-align:center;color:#15428B; margin:0px; padding:0px;line-height:23px; font-weight:bold;}
.head a{color:White;text-decoration:underline;}
.navlist{list-style-type:none;margin:0px; padding:10px;}
.navlist li{ padding:0px;}
.navlist li a{line-height:24px;}
.navlist li div{margin:2px 0px;padding-left:10px;padding-top:2px; border:1px dashed #ffffff;}
.navlist li div.hover{border:1px dashed #99BBE8; background:#E0ECFF;cursor:pointer;}
.navlist li div.hover a{color:#416AA3;}
.navlist li div.selected{border:1px solid #99BBE8; background:#E0ECFF;cursor:default;}
.navlist li div.selected a{color:#416AA3; font-weight:bold;}
.third_ul{ list-style-type:none;margin:0px; padding:0px; display:none;}
.third_ul li{ padding-left:20px;}
.icon{ background:url(../images/tabicons.png) no-repeat;width:18px; line-height:18px; display:inline-block;}
.icon-sys{ background-position:0px -200px;}
.icon-set{ background-position:-380px -200px;}
.icon-add{background-position: -20px 0px;}
.icon-nav{background-position: -100px -20px; }
.icon-users{background-position: -100px -480px;}
.icon-role{background-position: -360px -200px;}
.icon-set{background-position: -380px -200px;}
.icon-log{background-position: -380px -80px;}
.icon-delete{ background-position:-140px -120px;}
.icon-edit{ background-position:-380px -320px;}
.icon-magic{ background-position:0px -500px;}
.icon-database{ background-position:-20px -140px;}
.icon-arrow{ background:url('../images/arrow.gif') no-repeat right;}
================================================
FILE: src/main/webapp/css/login.css
================================================
/* CSS Document */
/* Download by http://www.codefans.net
* Basic Cascading Style Sheet
* Intructions: none
* Version: 1.0
* Updated: 2013-03-12
* Author: Zhang Ziyang
* Contact:
* QQ:1060927929
* Email:zzy85620987@163.com
*/
@charset "utf-8";
/***********************CSS RESET*********************/
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,
form,fieldset,input,textarea,p,blockquote,th,td {
padding: 0;
margin: 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
fieldset,img {
border: 0;
}
address,caption,cite,code,dfn,em,strong,th,var {
font-weight: normal;
font-style: normal;
}
ol,ul {
list-style: none;
}
caption,th {
text-align: left;
text-indent:10px;
}
h1,h2,h3,h4,h5,h6 {
font-weight: normal;
font-size: 100%;
}
q:before,q:after {
content:'';
}
abbr,acronym { border: 0;
}
.clear{
clear:both;
}
body{
background:url(../../images/linen-lt.png);
font:12px "microsoft yahei";
color: #565656;
}
input[type="button"],
input[type="submit"],
input[type="reset"] {
background-color: transparent;
padding: 0;
border: 0;
}
h1.title {
font: 32px "microsoft yahei";
margin:10px 20px;
color:#666;
}
/* Forms */
input[type=text],
input[type=password],
textarea {
background: #fafafa;
/* -moz-box-shadow: inset 1px 1px 10px rgba(0,0,0,0.1);
-webkit-box-shadow: inset 1px 1px 10px rgba(0,0,0,0.1);
box-shadow: inset 1px 1px 10px rgba(0,0,0,0.1);*/
border: 1px solid #ddd;
color: #888;
outline:none;
}
::-webkit-scrollbar{width:12px;height:12px}
::-webkit-scrollbar-button:vertical{display:none}
::-webkit-scrollbar-track:vertical{background-color:black}
::-webkit-scrollbar-track-piece{background: #FDFDFD;}
::-webkit-scrollbar-thumb:vertical{background-color:#8E8E8E;border-radius:5px}
::-webkit-scrollbar-thumb:vertical:hover{background-color:#3B3B3B}
::-webkit-scrollbar-corner:vertical{background-color:#535353}
::-webkit-scrollbar-resizer:vertical{background-color:#FF6E00}
@-webkit-keyframes animate-cloud {
from {
background-position: 600px 100%;
}
to {
background-position: 0 100%;
}
}
@-moz-keyframes animate-cloud {
from {
background-position: 600px 100%;
}
to {
background-position: 0 100%;
}
}
@-ms-keyframes animate-cloud {
from {
background-position: 600px 100%;
}
to {
background-position: 0 100%;
}
}
@-o-keyframes animate-cloud {
from {
background-position: 600px 100%;
}
to {
background-position: 0 100%;
}
}
html{
height: 100%;
}
body{
background:url(../images/cloud.png) 0 bottom repeat-x #049ec4;
-webkit-animation: animate-cloud 20s linear infinite;
-moz-animation: animate-cloud 20s linear infinite;
-ms-animation: animate-cloud 20s linear infinite;
-o-animation: animate-cloud 20s linear infinite;
animation: animate-cloud 20s linear infinite;
width: 100%;
height: auto;
}
.signup_container{
width:560px;
height: auto;
margin:9% auto 0;
padding-bottom: 20px;
background: #EDEDED;
text-align: center;
border-radius: 8px;
box-shadow: 1px 2px 4px rgba(0,0,0,0.6);
-webkit-user-select:none;
-ms-user-select:none;
}
h1.signup_title{
width: 100%;
height:70px;
font: 26px/1.4 "microsoft yahei";
text-align: center;
text-indent:0px;
letter-spacing:3px;
color:#FDFDFD;
line-height: 70px;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
background-color: #003399;
}
.signup_container img{
margin:20px 0 0;
}
.signup_container .copyright{
margin:20px 0;
color: #ABABAB;
}
.signup_forms{
width:260px;
margin:30px auto 0;
padding: 0;
text-align: left;
border: 1px solid #ccc;
border-radius: 8px;
box-shadow: inset 0 1px 3px rgba(0,0,0,0.36),0 1px 0 rgba(255,255,255,0.15);
}
.signup_forms .form_row {
position:relative;
border-top:1px solid #CCC;
border-top:1px solid rgba(0,0,0,0.12);
}
.signup_forms label {
display:none
}
.signup_forms input{
width:100%;
padding: 10px 0;
text-indent: 40px;
display:block;
margin:0;
border:0;
outline: none;
font:bold 14px/1.4 "microsoft yahei";
line-height:25px;
color: #888;
}
#signup_name{
background: url('../images/i1.png') no-repeat 9px 15px;
}
#signup_password{
background: url('../images/i2.png') no-repeat 9px 15px;
}
#signup_select{
background: url('../images/i3.png') no-repeat 9px 12px;
}
#d{
position: absolute;
right: 10px;
top: -14px;
cursor: pointer;
}
#userInfo {margin-top:10px}
#admin{
margin-top:32px;
background: #FFF;
padding: 5px;
}
.form_row ul{
background: #EDEDED;
width: 216px;
position: absolute;
display:none;
border:1px solid #CCC;
border-top: none;
cursor: pointer;
}
.form_row li{
width: 100%;
padding: 6px 0;
line-height: 25px;
text-indent:30px;
}
.form_row li:hover{
background:#19B4EA;
color: #FFF;
}
.login-btn-set{
width:260px;
height: auto;
overflow: hidden;
margin:10px auto;
}
.login-btn{
display: block;
float: right;
background: url(../images/login_btn.png) no-repeat;
width: 157px;
height:41px;
}
.login-btn:hover{
background-position: 0 -48px;
}
.login-btn:active{
background-position: 0 -96px;
}
.login-btn-set .rem{
display: block;
float: left;
margin:15px 6px;
background: url(../images/remember.png) no-repeat;
background-position: -2px -23px;
width:90px;
height: 22px;
cursor: pointer;
}
.login-btn-set .rem.selected{
background-position: 0 0;
}
.tip{
background: url(../images/tip.png) no-repeat;
width:32px;
height:32px;
position: absolute;
right: -36px;
top:5px;
}
.tip.ok{
background-position: 0 0;
}
.tip.error{
background-position: 0 -34px;
}
================================================
FILE: src/main/webapp/css/table.css
================================================
table.hovertable {
font-family: verdana,arial,sans-serif;
font-size:9px;
color:#333333;
width:100%;
border-collapse: collapse;
}
table.hovertable th {
border-width: 1px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
}
table.hovertable td.bg {
background-color:#ebf2ff;
}
table.hovertable td {
padding: 4px;
border:1px solid #95B8E7;
}
table.hovertable td.noBorderBottom {
border-bottom:0px;
}
================================================
FILE: src/main/webapp/dept.html
================================================
部门管理
部门管理页面
================================================
FILE: src/main/webapp/emp.html
================================================
员工管理页面
员工管理
================================================
FILE: src/main/webapp/error.html
================================================
Insert title here
权限不足
================================================
FILE: src/main/webapp/index.html
================================================
基于SSM框架的后台权限管理系统
正在加载中,请稍候...
================================================
FILE: src/main/webapp/js/config.js
================================================
var baseName = "permission"
================================================
FILE: src/main/webapp/js/crud.js
================================================
/**
* esayui通用增删改查以及导入导出
*/
//提交的方法名称
var method = "";
var listParam = "";
var saveParam = "";
$(function() {
// 加载表格数据
$('#grid').datagrid({
url : name + 'listByPage' + listParam,
idField : idField,//指明哪一个字段是标识字段。
title : title,
columns : columns,
frozenColumns : [ [ {
field : 'ck',
checkbox : true
}, {
title : '编号',
field : idField,
sortable : true,
width:100
} ] ],
fitColumns:true,
iconCls : 'icon-tip',
singleSelect : true,// 如果为true,则只允许选择一行。
pagination : true,// 如果为true,则在DataGrid控件底部显示分页工具栏。
striped : true,// 是否显示斑马线效果。
collapsible : true, //定义是否显示可折叠按钮。
rownumbers : true,//如果为true,则显示一个行号列。
nowrap : true,//如果为true,则在同一行中显示数据。设置为true可以提高加载性能。
sortName : idField,//定义哪些列可以进行排序。
sortOrder : 'asc',//定义列的排序顺序,只能是'asc'或'desc'。
remoteSort : false,//定义从服务器对数据进行排序。
loading : true,//显示载入状态。
loadMsg : '数据加载中...',// 在从远程站点加载数据的时候显示提示消息。
pageNumber : 1,// 在设置分页属性的时候初始化页码。
pageSize : 50,// 在设置分页属性的时候初始化页面大小。
pageList : [ 10, 20, 30, 40, 50 ],//在设置分页属性的时候 初始化页面大小选择列表。
toolbar : [ {
text : '新增',
iconCls : 'icon-add',
handler : function() {
// 打开前清空表单
$('#editForm').form('clear');
// 设置保存按钮提交的方法为add
method = "add";
// 关闭编辑窗口
$('#editDlg').dialog('open');
}
}, '-', {
text : '修改',
iconCls : 'icon-edit',
handler : function() {
edit();
}
}, '-', {
text : '删除',
iconCls : 'icon-cut',
handler : function() {
// 获取被选中行的数据
var selected = $('#grid').datagrid('getSelected');
del(selected);
}
}, '-', {
text : '导出',
iconCls : 'icon-excel',
handler : function() {
var formData = $('#searchForm').serializeJSON();
// 下载文件
$.download(name + "export" + listParam, formData);
}
}, '-', {
text : '导入',
iconCls : 'icon-save',
handler : function() {
$('#importDlg').dialog('open');
}
} ],
onDblClickRow : function() {
edit();
},
});
var h = 300;
var w = 400;
if (typeof (height) != "undefined") {
h = height;
}
if (typeof (width) != "undefined") {
w = width;
}
// 初始化编辑窗口
$('#editDlg').dialog({
title : '编辑',// 窗口标题
width : w,// 窗口宽度
height : h,// 窗口高度
closed : true,// 窗口是是否为关闭状态, true:表示关闭
modal : true
// 模式窗口
});
// 点击保存按钮
$('#btnSave').bind('click', function() {
// 做表单字段验证,当所有字段都有效的时候返回true。该方法使用validatebox(验证框)插件。
var isValid = $('#editForm').form('validate');
if (isValid == false) {
return;
}
var formData = $('#editForm').serializeJSON();
$.ajax({
url : name + method + saveParam,
data : formData,
dataType : 'json',
type : 'post',
success : function(rtn) {
$.messager.alert("提示", rtn.msg, 'info', function() {
if (rtn.status == 200) {
// 成功的话,我们要关闭窗口
$('#editDlg').dialog('close');
// 刷新表格数据
$('#grid').datagrid('reload');
}
});
}
});
});
// 判断是否有导入的功能
var importForm = document.getElementById('importForm');
if (importForm) {
$('#importDlg').dialog(
{
title : '导入数据',
width : 330,
height : 106,
modal : true,
closed : true,
buttons : [ {
text : '导入',
handler : function() {
$.ajax({
url : name + 'doImport',
data : new FormData($('#importForm')[0]),
type : 'post',
processData : false,
contentType : false,
dataType : 'json',
success : function(data) {
$.messager.alert('提示', data.msg,
'info', function() {
if (data.status==200) {
$('#importDlg').dialog('close');
$('#importForm').form('clear');
$('#grid').datagrid('reload');
}
});
}
});
}
} ]
});
}
});
/**
* 删除
*/
function del(selected) {
$.messager.confirm("确认", "确认要删除吗?", function(yes) {
if (yes) {
$.ajax({
url : name + 'delete',
data : selected,
dataType : 'json',
type : 'post',
success : function(rtn) {
$.messager.alert("提示", rtn.msg, 'info', function() {
// 刷新表格数据
$('#grid').datagrid('reload');
});
}
});
}
});
}
function edit() {
// 清空表单内容
$('#editForm').form('clear');
// 设置保存按钮提交的方法为update
method = "update";
// 弹出窗口
$('#editDlg').dialog('open');
// 获取被选中行的数据
var selected = $('#grid').datagrid('getSelected');
// 加载数据
$('#editForm').form('load', selected);
}
================================================
FILE: src/main/webapp/js/download.js
================================================
// Ajax 文件下载
$.download = function(url, data){ // 获得url和data
var inputs = '';
$.each(data, function(name, value) {
inputs+=' ';
});
$('')
.appendTo('body').submit().remove();
};
================================================
FILE: src/main/webapp/js/menu.js
================================================
$(function() {
loadTree();
// 添加数据对话框
$('#insertDlg').dialog({
title : '添加数据',
width : 360,
height : 200,
closed : true,
modal : true,
buttons : [ {
text : '保存',
handler : function() {
// 访问后台数据
insertData();
}
}, {
text : '关闭',
handler : function() {
// 关闭对话框
$("#insertDlg").dialog('close');
}
} ]
});
// 修改数据对话框
$('#updateDlg').dialog({
title : '修改数据',
width : 400,
height : 260,
closed : true,
modal : true,
buttons : [ {
text : '保存',
handler : function() {
// 访问后台数据
updateData();
}
}, {
text : '关闭',
handler : function() {
// 关闭对话框
$("#updateDlg").dialog('close');
}
} ]
});
// 右键菜单
$('#mm').menu({
onClick : function(item) {
var rowData = $('#grid').datagrid('getData').rows[0];
switch (item.text) {
case '添加':
// 获取当前被选中的节点
var selected = $('#tt').tree('getSelected');
var children = selected.children;
if(children.length==0){
$.messager.alert("提示", "该菜单目录暂时不支持三级以上的菜单", 'warning');
}else{
$("#insertDlg").dialog('open');
}
break;
case '修改':
$("#updateDlg").dialog('open');
// 填充后台数据
if (rowData.is_parent == 1) {
rowData.is_parent = '是';
} else if (rowData.is_parent == 0) {
rowData.is_parent = '否';
}
$('#updateForm').form('load', rowData);
break;
case '重命名':
$("#renameDlg").dialog('open');
// 填充后台数据
$('#renameForm').form('load', rowData);
break;
case '删除':
deleteData(item.id);
break;
}
}
});
// 菜单重命名
$('#renameDlg').dialog({
title : '菜单重命名',
width : 250,
height : 100,
closed : true,
modal : true,
buttons : [ {
text : '保存',
handler : function() {
// 访问后台数据
renameMenu();
}
}, {
text : '关闭',
handler : function() {
// 关闭对话框
$("#renameDlg").dialog('close');
}
} ]
});
});
/**
* 加载两侧菜单
*/
function loadTree() {
$.ajax({
type : 'POST',
url : 'menu/menulist',
dataType : 'json',
success : function(rtn) {
disposeTree(rtn);
}
});
}
/**
* 处理左侧菜单
*/
function disposeTree(data) {
// 加载左侧菜单
$('#tt').tree({
data : data,
onContextMenu : function(e, node) {
e.preventDefault();
var rowData = $('#grid').datagrid('getRows')[0];
if (rowData != null) {
// 找到菜单项
var item = $('#mm').menu('findItem', '删除');
if (1 == rowData.is_parent) {
if (item) {
// 移除菜单项
$('#mm').menu('removeItem', item.target);
}
} else {
if (item == null) {
// 追加一个顶部菜单
$('#mm').menu('appendItem', {
text : '删除',
iconCls : 'icon-cut',
onClick : function(item) {
deleteData(rowData.id);
}
});
}
}
// 显示快捷菜单
$('#mm').menu('show', {
left : e.pageX,
top : e.pageY
});
} else {
$.messager.alert("提示", "请选中后操作", 'warning');
}
},
onClick : function(node) {
// 显示子菜单到datagrid
loadDataGrid(node.id);
}
});
}
/**
* 加载表格数据 menuid:菜单id
*/
function loadDataGrid(menuid) {
$('#grid').datagrid({
url : 'menu/menufindById?menuid=' + menuid,
columns : [ [ {
field : 'menuid',
title : '编号',
width : 100
}, {
field : 'menuname',
title : '名称',
width : 100
}, {
field : 'url',
title : '对应URL',
width : 100
}, {
field : 'icon',
title : '图标样式',
width : 100
}, {
field : 'pid',
title : '上级菜单编号',
width : 100,
}, {
field : 'is_parent',
title : '是否为父菜单',
width : 100,
formatter : function(value, rowData, index) {
if (rowData.is_parent == 1) {
return '是';
} else {
return '否';
}
}
} ] ],
loading : true,
striped : true,
rownumbers : true,
singleSelect : true
});
$('#grid').datagrid({
toolbar : [ {
iconCls : 'icon-add',
text : '添加',
handler : function() {
// 打开添加窗口
var selected = $('#tt').tree('getSelected');
var children = selected.children;
if(children.length==0){
$.messager.alert("提示", "该菜单目录暂时不支持三级以上的菜单", 'warning');
}else{
$("#insertDlg").dialog('open');
}
}
}, '-', {
iconCls : 'icon-save',
text : '修改',
handler : function() {
var rowData = $('#grid').datagrid('getSelected');
if (null != rowData) {
// 打开修改窗口
$('#updateDlg').dialog('open');
// 填充后台数据
if (rowData.is_parent == 1) {
rowData.is_parent = '是';
} else if(rowData.is_parent == 0){
rowData.is_parent = '否';
}
$('#updateForm').form('load', rowData);
} else {
$.messager.alert("提示", "请选中要修改的行", 'error');
}
}
}, '-', {
iconCls : 'icon-cut',
text : '删除',
handler : function() {
// 删除
var rowData = $('#tt').tree('getSelected');
if (null != rowData) {
if (rowData.id % 100 == 0) {
$.messager.alert("提示", "父级菜单不可删除", 'error');
} else {
deleteData(rowData.id);
}
} else {
$.messager.alert("提示", "请选中要删除数据", 'error');
}
}
} ],
onDblClickRow : function(rowIndex, rowData) {
// 打开修改窗口
$('#updateDlg').dialog('open');
// 填充后台数据
if (rowData.is_parent == 1) {
rowData.is_parent = '是';
} else if (rowData.is_parent == 0){
rowData.is_parent = '否';
}
$('#updateForm').form('load', rowData);
}
});
}
/**
* 添加数据
*/
function insertData() {
var rowData = $('#grid').datagrid('getData').rows[0];
// 提交添加数据的表单
var formData = $('#insertForm').serializeJSON();
formData.pid = rowData.menuid;
formData.is_parent = rowData.is_parent;
$.ajax({
type : 'POST',
url : 'menu/menuadd',
data : formData,
dataType : 'json',
success : function(data) {
$.messager.alert("提示", data.msg, 'info', function() {
if (data.status == 200) {
// 刷新表格数据
$('#grid').datagrid('reload');
// 刷新树形菜单
loadTree();
// 关闭对话框
$('#insertDlg').dialog('close');
// 清除表单数据
$('#insertForm').form('clear');
}
});
}
});
}
/**
* 删除数据
*/
function deleteData(menuid) {
var gridData = $('#grid').datagrid('getData').rows[0];
$.messager.confirm('警告', '确认要删除“' + gridData.menuname + '”菜单吗?',function(r) {
if (r) {
$.ajax({
type : 'POST',
url : 'menu/menudelete',
data : {
'menuid' : menuid
},
dataType : 'json',
success : function(data) {
$.messager.alert("提示", data.msg, 'info',function() {
if (data.status == 200) {
// 刷新表格数据
// $('#grid').datagrid('deleteRow', 0);
// loadDataGrid();
// 刷新树形菜单
loadTree();
}
});
}
});
}
});
}
/**
* 修改数据
*/
function updateData() {
var formData = $('#updateForm').serializeJSON();
if(formData.is_parent == '是'){
formData.is_parent = 1;
} else{
formData.is_parent = 0;
}
$.ajax({
type : 'POST',
url : 'menu/menuupdate',
data : formData,
dataType : 'json',
success : function(data) {
$.messager.alert("提示", data.msg, 'info', function() {
if (data.status == 200) {
// 刷新表格数据
$('#grid').datagrid('reload');
// 刷新树形菜单
loadTree();
// 关闭对话框
$('#updateDlg').dialog('close');
// 清除表单数据
$('#updateForm').form('clear');
}
});
}
});
}
/**
* 重命名菜单
*/
function renameMenu() {
var formData = $('#renameForm').serializeJSON();
formData.menuid = $('#tt').tree('getSelected').id;
$.ajax({
type : 'POST',
url : 'menu/menuupdateById',
data : formData,
dataType : 'json',
success : function(data) {
$.messager.alert("提示", data.msg, 'info', function() {
if (data.status == 200) {
// 刷新表格数据
$('#grid').datagrid('reload');
// 刷新树形菜单
loadTree();
// 关闭对话框
$('#renameDlg').dialog('close');
// 清除表单数据
$('#renameForm').form('clear');
}
});
}
});
}
================================================
FILE: src/main/webapp/js/roleMenuSet.js
================================================
/**
*
*/
$(function() {
$('#grid').datagrid({
url:'role/rolelistByPage',
frozenColumns : [ [ {
field : 'ck',
checkbox : true
}, {
title : '编号',
field : 'uuid',
sortable : true,
width:100
} ] ],
columns:[[
{field:'name',title:'名称',width:100}
]],
singleSelect : true,// 如果为true,则只允许选择一行。
pagination : true,// 如果为true,则在DataGrid控件底部显示分页工具栏。
striped : true,// 是否显示斑马线效果。
collapsible : true, //定义是否显示可折叠按钮。
rownumbers : true,//如果为true,则显示一个行号列。
nowrap : true,//如果为true,则在同一行中显示数据。设置为true可以提高加载性能。
sortName : 'uuid',//定义哪些列可以进行排序。
sortOrder : 'desc',//定义列的排序顺序,只能是'asc'或'desc'。
remoteSort : false,//定义从服务器对数据进行排序。
loading : true,//显示载入状态。
loadMsg : '数据加载中...',// 在从远程站点加载数据的时候显示提示消息。
pageNumber : 1,// 在设置分页属性的时候初始化页码。
pageSize : 50,// 在设置分页属性的时候初始化页面大小。
pageList : [ 10, 20, 30, 40, 50 ],//在设置分页属性的时候 初始化页面大小选择列表。
onClickRow:function(rowIndex, rowData){
$('#tree').tree({
url:'role/findRoleMenuByRoleid?id=' + rowData.uuid,
animate:false,
checkbox:true
});
}
});
$('#btnSave').bind("click",function(){
//角色id
var uuid = $('#grid').datagrid("getSelected").uuid;
var nodes = $('#tree').tree('getChecked');
var checkedIds = new Array();
$.each(nodes,function(i,node){
checkedIds.push(node.id);
})
//权限菜单对应id
checkedIds = checkedIds.join(",");
var formData = {'id':uuid,'checkedIds':checkedIds};
$.ajax({
url: 'role/updateRoleMenu',
data: formData,
dataType: 'json',
type: 'post',
success:function(data){
$.messager.alert("提示",data.msg,'info',function(){
});
}
});
});
})
================================================
FILE: src/main/webapp/js/search.js
================================================
/**
* esayui通用搜索
*/
$(function() {
// 自动补全
$('#inputtable').combobox(
{
prompt : '输入关键字后自动搜索',
mode : 'remote',
url : _url,// _url,_value已经在各自的js文件中定义
valueField : _value,
textField : _value,
panelHeight : 'auto',
panelMaxHeight : 150,
editable : true,
hasDownArrow : false,
onBeforeLoad : function(param) {
if (param == null || param.q == null
|| param.q.replace(/ /g, '') == '') {
var value = $(this).combobox('getValue');
if (value) {// 修改的时候才会出现q为空而value不为空
param.id = value;
return true;
}
return false;
}
}
});
//回车事件绑定 搜索框是esayui动态生成的
$('.combo-text').bind('keyup', function(event) {
if (event.keyCode == "13") {
//回车执行查询
//$('#btnSearch').click();
reloadgrid();
}
});
// 点击查询按钮
$('#btnSearch').bind('click', function() {
reloadgrid();
});
// 点击重置按钮
$('#btnReset').bind('click', function() {
$('#searchForm').form('clear');
});
function reloadgrid() {
// 把表单数据转换成json对象
var formData = $('#searchForm').serializeJSON();
$('#grid').datagrid('load', formData);
}
})
================================================
FILE: src/main/webapp/js/userRoleSet.js
================================================
$(function() {
$('#grid').datagrid({
url : 'user/userlistByPage',
frozenColumns : [ [ {
field : 'ck',
checkbox : true
}, {
title : '编号',
field : 'user_id',
sortable : true,
width : 100
} ] ],
columns : [ [ {
field : 'user_code',
title : '账号',
width : 100
}, {
field : 'user_name',
title : '姓名',
width : 100
} ] ],
singleSelect : true,// 如果为true,则只允许选择一行。
pagination : true,// 如果为true,则在DataGrid控件底部显示分页工具栏。
striped : true,// 是否显示斑马线效果。
collapsible : true, // 定义是否显示可折叠按钮。
rownumbers : true,// 如果为true,则显示一个行号列。
nowrap : true,// 如果为true,则在同一行中显示数据。设置为true可以提高加载性能。
sortName : 'user_id',// 定义哪些列可以进行排序。
sortOrder : 'desc',// 定义列的排序顺序,只能是'asc'或'desc'。
remoteSort : false,// 定义从服务器对数据进行排序。
loading : true,//显示载入状态。
loadMsg : '数据加载中...',// 在从远程站点加载数据的时候显示提示消息。
pageNumber : 1,// 在设置分页属性的时候初始化页码。
pageSize : 50,// 在设置分页属性的时候初始化页面大小。
pageList : [ 10, 20, 30, 40, 50 ],// 在设置分页属性的时候 初始化页面大小选择列表。
onClickRow : function(rowIndex, rowData) {
$('#tree').tree({
url : 'user/findUserRole?id=' + rowData.user_id,
animate : true,
checkbox : true
});
}
});
$('#btnSave').bind("click", function() {
// 角色id
var user_id = $('#grid').datagrid("getSelected").user_id;
// 选择的节点
var nodes = $('#tree').tree('getChecked');
var checkedIds = new Array();
$.each(nodes, function(i, node) {
checkedIds.push(node.id);
})
// 权限菜单对应id
checkedIds = checkedIds.join(",");
var formData = {
'id' : user_id,
'checkedIds' : checkedIds
};
$.ajax({
url : 'user/updateUserRole',
data : formData,
dataType : 'json',
type : 'post',
success : function(data) {
$.messager.alert("提示", data.msg, 'info', function() {
});
}
});
});
})
================================================
FILE: src/main/webapp/log.html
================================================
角色管理
================================================
FILE: src/main/webapp/login.html
================================================
基于SSM框架的后台权限管理系统
================================================
FILE: src/main/webapp/menu.html
================================================
菜单管理
================================================
FILE: src/main/webapp/role.html
================================================
角色管理
================================================
FILE: src/main/webapp/roleMenuSet.html
================================================
角色权限设置
================================================
FILE: src/main/webapp/sale.html
================================================
销售额统计页面
销售额统计页面
================================================
FILE: src/main/webapp/ui/date.js
================================================
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function(fmt)
{ //author: meizz
if(isNaN(this.getDate()))
{
return "";
}
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt))
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)
if(new RegExp("("+ k +")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
return fmt;
}
================================================
FILE: src/main/webapp/ui/download.js
================================================
// Ajax 文件下载
$.download = function(url, data){ // 获得url和data
var inputs = '';
$.each(data, function(name, value) {
inputs+=' ';
});
$('')
.appendTo('body').submit().remove();
};
================================================
FILE: src/main/webapp/ui/easyloader.js
================================================
/**
* jQuery EasyUI 1.3.5
*
* Copyright (c) 2009-2013 www.jeasyui.com. All rights reserved.
*
* Licensed under the GPL or commercial licenses
* To use it on other terms please contact us: info@jeasyui.com
* http://www.gnu.org/licenses/gpl.txt
* http://www.jeasyui.com/license_commercial.php
*
*/
(function(){
var _1={draggable:{js:"jquery.draggable.js"},droppable:{js:"jquery.droppable.js"},resizable:{js:"jquery.resizable.js"},linkbutton:{js:"jquery.linkbutton.js",css:"linkbutton.css"},progressbar:{js:"jquery.progressbar.js",css:"progressbar.css"},tooltip:{js:"jquery.tooltip.js",css:"tooltip.css"},pagination:{js:"jquery.pagination.js",css:"pagination.css",dependencies:["linkbutton"]},datagrid:{js:"jquery.datagrid.js",css:"datagrid.css",dependencies:["panel","resizable","linkbutton","pagination"]},treegrid:{js:"jquery.treegrid.js",css:"tree.css",dependencies:["datagrid"]},propertygrid:{js:"jquery.propertygrid.js",css:"propertygrid.css",dependencies:["datagrid"]},panel:{js:"jquery.panel.js",css:"panel.css"},window:{js:"jquery.window.js",css:"window.css",dependencies:["resizable","draggable","panel"]},dialog:{js:"jquery.dialog.js",css:"dialog.css",dependencies:["linkbutton","window"]},messager:{js:"jquery.messager.js",css:"messager.css",dependencies:["linkbutton","window","progressbar"]},layout:{js:"jquery.layout.js",css:"layout.css",dependencies:["resizable","panel"]},form:{js:"jquery.form.js"},menu:{js:"jquery.menu.js",css:"menu.css"},tabs:{js:"jquery.tabs.js",css:"tabs.css",dependencies:["panel","linkbutton"]},menubutton:{js:"jquery.menubutton.js",css:"menubutton.css",dependencies:["linkbutton","menu"]},splitbutton:{js:"jquery.splitbutton.js",css:"splitbutton.css",dependencies:["menubutton"]},accordion:{js:"jquery.accordion.js",css:"accordion.css",dependencies:["panel"]},calendar:{js:"jquery.calendar.js",css:"calendar.css"},combo:{js:"jquery.combo.js",css:"combo.css",dependencies:["panel","validatebox"]},combobox:{js:"jquery.combobox.js",css:"combobox.css",dependencies:["combo"]},combotree:{js:"jquery.combotree.js",dependencies:["combo","tree"]},combogrid:{js:"jquery.combogrid.js",dependencies:["combo","datagrid"]},validatebox:{js:"jquery.validatebox.js",css:"validatebox.css",dependencies:["tooltip"]},numberbox:{js:"jquery.numberbox.js",dependencies:["validatebox"]},searchbox:{js:"jquery.searchbox.js",css:"searchbox.css",dependencies:["menubutton"]},spinner:{js:"jquery.spinner.js",css:"spinner.css",dependencies:["validatebox"]},numberspinner:{js:"jquery.numberspinner.js",dependencies:["spinner","numberbox"]},timespinner:{js:"jquery.timespinner.js",dependencies:["spinner"]},tree:{js:"jquery.tree.js",css:"tree.css",dependencies:["draggable","droppable"]},datebox:{js:"jquery.datebox.js",css:"datebox.css",dependencies:["calendar","combo"]},datetimebox:{js:"jquery.datetimebox.js",dependencies:["datebox","timespinner"]},slider:{js:"jquery.slider.js",dependencies:["draggable"]},tooltip:{js:"jquery.tooltip.js"},parser:{js:"jquery.parser.js"}};
var _2={"af":"easyui-lang-af.js","ar":"easyui-lang-ar.js","bg":"easyui-lang-bg.js","ca":"easyui-lang-ca.js","cs":"easyui-lang-cs.js","cz":"easyui-lang-cz.js","da":"easyui-lang-da.js","de":"easyui-lang-de.js","el":"easyui-lang-el.js","en":"easyui-lang-en.js","es":"easyui-lang-es.js","fr":"easyui-lang-fr.js","it":"easyui-lang-it.js","jp":"easyui-lang-jp.js","nl":"easyui-lang-nl.js","pl":"easyui-lang-pl.js","pt_BR":"easyui-lang-pt_BR.js","ru":"easyui-lang-ru.js","sv_SE":"easyui-lang-sv_SE.js","tr":"easyui-lang-tr.js","zh_CN":"easyui-lang-zh_CN.js","zh_TW":"easyui-lang-zh_TW.js"};
var _3={};
function _4(_5,_6){
var _7=false;
var _8=document.createElement("script");
_8.type="text/javascript";
_8.language="javascript";
_8.src=_5;
_8.onload=_8.onreadystatechange=function(){
if(!_7&&(!_8.readyState||_8.readyState=="loaded"||_8.readyState=="complete")){
_7=true;
_8.onload=_8.onreadystatechange=null;
if(_6){
_6.call(_8);
}
}
};
document.getElementsByTagName("head")[0].appendChild(_8);
};
function _9(_a,_b){
_4(_a,function(){
document.getElementsByTagName("head")[0].removeChild(this);
if(_b){
_b();
}
});
};
function _c(_d,_e){
var _f=document.createElement("link");
_f.rel="stylesheet";
_f.type="text/css";
_f.media="screen";
_f.href=_d;
document.getElementsByTagName("head")[0].appendChild(_f);
if(_e){
_e.call(_f);
}
};
function _10(_11,_12){
_3[_11]="loading";
var _13=_1[_11];
var _14="loading";
var _15=(easyloader.css&&_13["css"])?"loading":"loaded";
if(easyloader.css&&_13["css"]){
if(/^http/i.test(_13["css"])){
var url=_13["css"];
}else{
var url=easyloader.base+"themes/"+easyloader.theme+"/"+_13["css"];
}
_c(url,function(){
_15="loaded";
if(_14=="loaded"&&_15=="loaded"){
_16();
}
});
}
if(/^http/i.test(_13["js"])){
var url=_13["js"];
}else{
var url=easyloader.base+"plugins/"+_13["js"];
}
_4(url,function(){
_14="loaded";
if(_14=="loaded"&&_15=="loaded"){
_16();
}
});
function _16(){
_3[_11]="loaded";
easyloader.onProgress(_11);
if(_12){
_12();
}
};
};
function _17(_18,_19){
var mm=[];
var _1a=false;
if(typeof _18=="string"){
add(_18);
}else{
for(var i=0;i<_18.length;i++){
add(_18[i]);
}
}
function add(_1b){
if(!_1[_1b]){
return;
}
var d=_1[_1b]["dependencies"];
if(d){
for(var i=0;i
员工管理
================================================
FILE: src/main/webapp/userRoleSet.html
================================================
用户角色设置
================================================
FILE: src/test/java/cn/lastwhisper/GoBackTest.java
================================================
package cn.lastwhisper;
import cn.lastwhisper.core.task.GoBackTask;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
* @author lastwhisper
* @date 2020/2/16
*/
public class GoBackTest {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:applicationContext*.xml");
GoBackTask mysqlTask = context.getBean(GoBackTask.class);
mysqlTask.goBack();
}
}
================================================
FILE: src/test/java/cn/lastwhisper/MD5.java
================================================
/**
* @Title: A.java
* @Package cn.lastwhisper
* @Description: TODO(用一句话描述该文件做什么)
* @author: 最后的轻语_dd43
* @date: 2019年5月1日 上午12:17:53
* @version V1.0
*/
package cn.lastwhisper;
import org.apache.shiro.crypto.hash.Md5Hash;
/**
* @ClassName: A
* @Description:TODO(这里用一句话描述这个类的作用)
* @author: 最后的轻语_dd43
* @date: 2019年5月1日
*/
public class MD5 {
/**
* 加密
*
* @param source 密码
* @param salt 账号
* @return
*/
private static String encrypt(String source, String salt) {
Md5Hash md5 = new Md5Hash(source, salt, 2);
return md5.toString();
}
public static void main(String[] args) {
System.out.println(encrypt("admin", "admin"));
}
}