jeesite 怎么输出控制台信息输出到文件

时间:January 10, 2015 |
Java日志体系概览
关于Java的日志API可以概括为日志记录的封装API和日志记录实现两类。前一种的典型代表是Apache Commons Logging和SLF4J,后一种的典型代表有JDK自带的日志实现(java.util.logging 包,JUL)以及著名的Log4j。日志封装API是为日志使用者提供了一种统一的接口,使用者可以根据需求来切换具体日志实现方案。
Java日志API
一般来说,日志API一般包括:
记录器(Logger):日志 API 的使用者通过记录器来发出日志记录请求,并提供日志的内容。在记录日志时,需要指定日志的严重性级别。
格式化器(Formatter):对记录器所记录的文本进行格式化,并添加额外的元数据。
处理器(Handler):把经过格式化之后的日志记录输出到不同的地方。常见的日志输出目标包括控制台、文件和数据库等。
Java日志封装API
在这主要介绍一下目前使用较多的SLF4J日志库,SLF4J 库中核心的 API 是提供工厂方法的 org.slf4j.LoggerFactory 类和记录日志的 org.slf4j.Logger 接口。通过 LoggerFactory 类的 getLogger 方法来获取日志记录器对象。Logger 接口中的方法也是按照不同的严重性级别来进行分组的。
Jeesite中Log4j的使用分析
Jeesite中使用了Log4j日志记录作为实现,下面依次分析一下Log4j的配置文件和封装了Log4j的Manager类。
Log4j的配置
Log4j支持使用Java properties和xml作为配置文件。相对于xml的格式,Java properties更易读。下面以Jeesite中的log4j.properties为例,所有配置项均以log4j开头,主要配置项为rootlogger,输出终端,输出布局模式。
log4j.rootLogger=WARN, Console, RollingFile
Logger是日志记录器,而rootLogger则是所有Logger的祖先,可以通过Logger.getRootLogger()来获取。
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#RollingFile
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=../logs/jeesite.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
Log4j的输出终端,由Appender接口定义。其有多种实现,不同实现就对应则不同的日志输出保存方式。例如:
ConsoleAppender(控制台)
FileAppender(文件)
DailyRollingFileAppender(每天都产生一个日志文件)
RollingFileAppender(文件大小达到指定尺寸时产生一个新的日志文件,文件名称上会自动添加数字序号。)
WriterAppender(将日志信息以流的格式发送到任意指定的地方)
而所有子类Logger均将继承父类Logger的Appender配置。 至于输出布局模式——由Layout接口定义——也有多种实现:
PatternLayout(可以灵活地指定布局模式)
HTMLLayout(以HTML表格形式布局)
SimpleLayout(包含日志信息的级别和信息字符串)
TTCCLayout(包含日志产生的时间、线程、类别等信息)
ConversionPattern使用的是类似于C语言中printf的格式化输出参数:
%c:输出所属的类目,通常就是所在类的全名。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,推荐使用“%d{ABSOLUTE}”
%t:输出产生该日志线程的线程名。
%p:输出优先级。
%m:输出代码中指定的消息。
%n:输出一个回车换行符。Windows平台为“\r\n”,UNIX为“\n”。
所以jeesite中的日志输出格式为:
Output pattern : date [thread] priority category - message
每个Logger都有一个日志记录级别,对应不同程度的信息,按照优先级可以排列如下:ALL&DEBUG&INFO&WARN&ERROR&FATAL&OFF
#Hibernate level
#log4j.logger.org.hibernate=ERROR
log4j.logger.org.hibernate.cache.ehcache.AbstractEhcacheRegionFactory=ERROR
log4j.logger.org.hibernate.search.impl.ConfigContext=ERROR
log4j.logger.net.sf.ehcache.config.CacheConfiguration=ERROR
#Project defalult level
.thinkgem.jeesite=DEBUG
这里分别配置了Hibernate操作数据库的日志记录级别和项目的默认日志记录级别,均为DEBUG,即与程序运行时的流程相关的详细信息。
Log4jManager类
Log4jManager类对于Log4j,主要是对于Log4j的日志记录级别进行管理配置。使用了叫JMX(Java Management Extensions,即Java管理扩展)——一个为应用程序、设备、系统等植入管理功能的框架——对日志记录级别进行管理。此处把Log4j作为Mbean(管理Bean组件)来管理。首先来看一些Getters/Setters函数
@ManagedAttribute(description = &Level of the root logger&)
public String getRootLoggerLevel() {
Logger logger = Logger.getRootLogger();
return logger.getEffectiveLevel().toString();
@ManagedAttribute
public void setRootLoggerLevel(String newLevel) {
Logger logger = Logger.getRootLogger();
Level level = Level.toLevel(newLevel);
logger.setLevel(level);
(&设置Root Logger 级别为{}&, newLevel);
这是对根日志记录器进行日志级别设置和获取。managerLogger对象是通过LoggerFactory.getLogger(Log4jManager.class)这一日志记录器工厂来获取的。
@ManagedOperation(description = &Get logging level of the logger&)
@ManagedOperationParameters({ @ManagedOperationParameter(name = &loggerName&, description = &Logger name&) })
public String getLoggerLevel(String loggerName) {
Logger logger = Logger.getLogger(loggerName);
return logger.getEffectiveLevel().toString();
* 设置Logger的日志级别.
* 如果日志级别名称错误, 设为DEBUG.
@ManagedOperation(description = &Set new logging level to the logger&)
@ManagedOperationParameters({ @ManagedOperationParameter(name = &loggerName&, description = &Logger name&),
@ManagedOperationParameter(name = &newlevel&, description = &New level&) })
public void setLoggerLevel(String loggerName, String newLevel) {
Logger logger = Logger.getLogger(loggerName);
Level level = Level.toLevel(newLevel);
logger.setLevel(level);
(&设置{}级别为{}&, loggerName, newLevel);
同根Logger一样,此处的普通Logger和项目级别的Logger的Setter\Getter方法,也是大同小异的。
SYS模块中的Log部分
这部分的日志log,并未使用日志记录API,而是通过正常模块开发的形式,把一些操作信息存入数据库表(sys_log)中,其保存的信息包含:
// 日志编号
// 日志类型(1:接入日志;2:错误日志)
private User createBy;
private Date createD
// 日志创建时间
private String remoteA
// 操作用户的IP地址
private String requestU
// 操作的URI
// 操作的方式
// 操作提交的数据
private String userA
// 操作用户代理信息
// 异常信息
日志查询可以在登录后台系统后,通过host/sys/log这个url来访问。
添加新评论私信发送成功
检测到您已登录开源中国,是否
项目的发展离不开你的支持,请作者喝杯咖啡吧!
感谢您的开源项目!
Fork 该项目?
使用 fork 功能将在后台会为你创建一个与该项目内容一样的同名项目,你可以在这个新项目里自由的修改内容。
建议只在有意向参与改进该项目时使用 fork 功能。
导入数据表并初始化数据:运行db/init-db.bat文件,报错!
报错信息: [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 19.313s [INFO] Finished at: Wed Sep 09 12:07:55 CST 2015 [INFO] Final Memory: 18M/172M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7: run (default-cli) on project jeesite: An Ant BuildException has occured: java.la ng.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFDateUtil.isCellDateForma tted(Lorg/apache/poi/hssf/usermodel/HSSFC)Z [ERROR] around Ant part ...... @ 22:107 in D:\JAVA\works pace\jeesite\target\antrun\build-main.xml [ERROR] -& [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit ch. [ERROR] Re-run Maven using the -X switch to enable full debug logging.
我也是这个问题,请问你解决了吗?
快速体验
具备运行环境:JDK1.6+、Maven3.0+、MySql5+或Oracle10g+。
修改src\main\resources\jeesite.properties文件中的数据库设置参数。
根据修改参数创建对应MySql或Oracle数据库用户和参数。
运行bin\init-db.bat脚本,即可导入表结构及演示数据(linux操作系统:在控制台中切换至项目根目录,运行命令:mvn antrun:run -Pinit-db)
运行bin\run-tomcat7.bat或bin\run-jetty.bat,启动Web服务器(第一次运行,需要下载依赖jar包,请耐心等待)。
最高管理员账号,用户名:thinkgem 密码:admin
常见问题
有时出现文字乱码:修改Tomcat的server.xml文件的Connector项,增加URIEncoding="UTF-8"
用一段时间提示内存溢出,请修改JVM参数:-Xmx512m -XX:MaxPermSize=256m
为什么新建菜单后看不到新建的菜单?因为授权问题,菜单管理只允许最高管理员账号管理(最高管理员默认账号:thinkgem 密码:admin)。
以上为官方步骤
#####################################by xiaohelong ######################################################################################
编译前准备(更改项目名称、版本、上下文)
1.工程目录本身
2.pom.xml中的一些信息
以下为实践步骤
1.将maven解压至直接放到D:\,并运行安装,配置好Path(配不好path,maven相关的如mvn就运行不了);
2.配置好Myeclipse中的Maven信息
3.修改src\main\resources\jeesite.properties文件中的数据库设置参数。(为了防止出错,最好只改用户名和密码,反正我改了名字就不行了,如果要改在生成工程以后再改 by xiaohelong)
4.连上数据库,建立jeesite库,并选UTF-8
5.进入工程主目录:运行 mvn antrun:run -Pinit-db
6.Eclipse导入maven项目(会下包,我喜欢把所有包放到本地一个地方,这样基本上就不用下什么很快)
myeclipse中如果开启javascript validate,在表态资源超大的情况下会卡死,这就是需要用编辑器把工程主目录下.project中的

org.eclipse.wst.jsdt.core.javascriptValidator




&nature&org.eclipse.wst.jsdt.core.jsNature&/nature&

注释掉,再打开就会很快很快了。。。如果Myeclipse有提示,则要注意不要再打开了。

7.更改用户密码,可以直接上数据库改,好像是md5加密的。
8.玩得愉快,完成。
@SmallStart 请看我的回复
excel导入导入的两个辅助工具类有些问题 无法初始化数据库
配置为:idea14+OSX+jdk1.7+mysql
问题解决了! 现在总结下idea的使用步骤:1.使用idea打开或check from git工程;2.修改jeesite.properties的数据库配置,实际上只修改密码即可(本机测试的话);3.在数据库中创建数据库:jeesite;4.勾选Profiles下的init-db选项;5.找到idea右侧的maven project选项,选择 Plugins 下的antrun--&双击antrun:run即可初始化数据库;5.启动项目时需修改pom.xml文件中init-db下的poi版本为3.9。这么做的原因是虽然有声明poi的版本为3.9 但是在init-db下又指定了低版本的3.2-FINAL,结果项目显示的依赖包是3.2的(于是就jar包冲突了~ ~),但是ImportExcel.java中 import org.apache.poi.ss.usermodel.Cell等在3.2中不存在,详情请移步 以上为小弟愚见。
感谢啊,解决了我的问题
后才可以发表评论mybatis+log4j+springMvc 打印sql语句到控制台_ASP.NET技巧_动态网站制作指南
mybatis+log4j+springMvc 打印sql语句到控制台
来源:人气:728
具体log4j.operties.配置 如下:
# Output pattern : date [thread] priority category - message & FATAL 0 &ERROR 3 &WARN 4 &INFO 6 &DEBUG 7&
log4j.rootLogger=DEBUG, Console, RollingFile
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d %-5p [%c{5}] - %m%n
#--------打印sql语句--------------------#&
#\u\u5C06rootLogger\u7EA7\u522B\u66F4\uADEBUG
#1 \u5B9A\u4E49\u65E5\u5FD7\u8F93\u51FA\u76EE\u\u4E3A\u63A7\u
#\u63A7\u\usql\u8BED\u53E5
log4j.appender.Console.Target = System.out
log4j.appender.Console.Threshold=DEBUG
# mybatis \u663E\u793ASQL\u8BED\u53E5\u90E8\u5206
log4j.logger.org.mybatis=DEBUG
log4j.logger..sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
#--------------------------#
#RollingFile
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=../logs/eoms/eoms.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#log4j.logger.java.sql=DEBUG
#Springframework level
#log4j.logger.org.springframework=ERROR
#Hibernate level
#log4j.logger.org.hibernate=ERROR
#log4j.logger.org.hibernate.cache.ehcache.AbstractEhcacheRegionFactory=ERROR
#log4j.logger.org.hibernate.search.impl.ConfigContext=ERROR
#log4j.logger.net.sf.ehcache.config.CacheConfiguration=ERROR
#Project defalult level
#log4j.logger.org.activiti.engine.impl.persistence=DEBUG
#log4j.logger.org.apache.shiro=DEBUG
.thinkgem.jeesite=DEBUG
.mon.security.shiro=WARN
log4j.logger.JedisUtils=WARN
log4j.logger.LoginController=WARN
log4j.logger.OaNotifyDao.findCount=WARN
注意 要将log4j.rootLogger级别更改为debug
优质网站模板/ jeesite_cas
项目语言:JAVA
权限:read-only(如需更高权限请先加入项目)
jeesite_cas/
Index: listener/WebContextListener.java
===================================================================
--- listener/WebContextListener.java (revision 0)
+++ listener/WebContextListener.java (revision 2)
@@ -0,0 +1,18 @@
+package com.thinkgem.jeesite.modules.sys.
+import javax.servlet.ServletC
+import org.springframework.web.context.WebApplicationC
+import com.thinkgem.jeesite.modules.sys.service.SystemS
+public class WebContextListener extends org.springframework.web.context.ContextLoaderListener {
+ @Override
+ public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {
if (!SystemService.printKeyLoadMessage()){
return super.initWebApplicationContext(servletContext);
Index: security/FormAuthenticationFilter.java
===================================================================
--- security/FormAuthenticationFilter.java (revision 0)
+++ security/FormAuthenticationFilter.java (revision 2)
@@ -0,0 +1,113 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import javax.servlet.ServletR
+import javax.servlet.ServletR
+import javax.servlet.http.HttpServletR
+import org.apache.shiro.authc.AuthenticationE
+import org.apache.shiro.authc.AuthenticationT
+import org.apache.shiro.authc.IncorrectCredentialsE
+import org.apache.shiro.authc.UnknownAccountE
+import org.apache.shiro.web.util.WebU
+import org.slf4j.L
+import org.slf4j.LoggerF
+import org.springframework.stereotype.S
+import com.mon.utils.StringU
+ * 表单验证(包含验证码)过滤类
+ * @author ThinkGem
+ * @version
+public class FormAuthenticationFilter extends org.apache.shiro.web.filter.authc.FormAuthenticationFilter {
+ public static final String DEFAULT_CAPTCHA_PARAM = &validateCode&;
+ public static final String DEFAULT_MOBILE_PARAM = &mobileLogin&;
+ public static final String DEFAULT_MESSAGE_PARAM = &message&;
+ protected Logger logger = LoggerFactory.getLogger(getClass());
+ private String captchaParam = DEFAULT_CAPTCHA_PARAM;
+ private String mobileLoginParam = DEFAULT_MOBILE_PARAM;
+ private String messageParam = DEFAULT_MESSAGE_PARAM;
+ protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
String username = getUsername(request);
String password = getPassword(request);
if (password==null){
password = &&;
boolean rememberMe = isRememberMe(request);
String host = StringUtils.getRemoteAddr((HttpServletRequest)request);
String captcha = getCaptcha(request);
boolean mobile = isMobileLogin(request);
return new UsernamePasswordToken(username, password.toCharArray(), rememberMe, host, captcha, mobile);
+ public String getCaptchaParam() {
return captchaP
+ protected String getCaptcha(ServletRequest request) {
return WebUtils.getCleanParam(request, getCaptchaParam());
+ public String getMobileLoginParam() {
return mobileLoginP
+ protected boolean isMobileLogin(ServletRequest request) {
return WebUtils.isTrue(request, getMobileLoginParam());
+ public String getMessageParam() {
return messageP
* 登录成功之后跳转URL
+ public String getSuccessUrl() {
return super.getSuccessUrl();
+ @Override
+ protected void issueSuccessRedirect(ServletRequest request,
ServletResponse response) throws Exception {
Principal p = UserUtils.getPrincipal();
if (p != null && !p.isMobileLogin()){
WebUtils.issueRedirect(request, response, getSuccessUrl(), null, true);
super.issueSuccessRedirect(request, response);
* 登录失败调用事件
+ @Override
+ protected boolean onLoginFailure(AuthenticationToken token,
AuthenticationException e, ServletRequest request, ServletResponse response) {
logger.debug(&AuthenticationException&);
String className = e.getClass().getName(), message = &&;
if (IncorrectCredentialsException.class.getName().equals(className)
|| UnknownAccountException.class.getName().equals(className)){
message = &用户或密码错误, 请重试.&;
else if (e.getMessage() != null && StringUtils.startsWith(e.getMessage(), &msg:&)){
message = StringUtils.replace(e.getMessage(), &msg:&, &&);
message = &系统出现点问题,请稍后再试!&;
e.printStackTrace(); // 输出到控制台
request.setAttribute(getFailureKeyAttribute(), className);
request.setAttribute(getMessageParam(), message);
\ No newline at end of file
Index: security/SystemAuthorizingRealm.java
===================================================================
--- security/SystemAuthorizingRealm.java (revision 0)
+++ security/SystemAuthorizingRealm.java (revision 2)
@@ -0,0 +1,285 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import java.io.S
+import java.util.C
+import java.util.L
+import javax.annotation.PostC
+import mons.lang3.StringU
+import org.apache.shiro.authc.AuthenticationE
+import org.apache.shiro.authc.AuthenticationI
+import org.apache.shiro.authc.AuthenticationT
+import org.apache.shiro.authc.SimpleAuthenticationI
+import org.apache.shiro.authc.credential.HashedCredentialsM
+import org.apache.shiro.authz.AuthorizationI
+import org.apache.shiro.authz.P
+import org.apache.shiro.authz.SimpleAuthorizationI
+import org.apache.shiro.realm.AuthorizingR
+import org.apache.shiro.session.S
+import org.apache.shiro.subject.PrincipalC
+import org.apache.shiro.util.ByteS
+import org.slf4j.L
+import org.slf4j.LoggerF
+import org.springframework.stereotype.S
+import com.mon.config.G
+import com.mon.servlet.ValidateCodeS
+import com.mon.utils.E
+import com.mon.utils.SpringContextH
+import com.mon.web.S
+import com.thinkgem.jeesite.modules.sys.entity.M
+import com.thinkgem.jeesite.modules.sys.entity.R
+import com.thinkgem.jeesite.modules.sys.entity.U
+import com.thinkgem.jeesite.modules.sys.service.SystemS
+import com.thinkgem.jeesite.modules.sys.utils.LogU
+import com.thinkgem.jeesite.modules.sys.utils.UserU
+import com.thinkgem.jeesite.modules.sys.web.LoginC
+ * 系统安全认证实现类
+ * @author ThinkGem
+ * @version
+//@DependsOn({&userDao&,&roleDao&,&menuDao&})
+public class SystemAuthorizingRealm extends AuthorizingRealm {
+ private Logger logger = LoggerFactory.getLogger(getClass());
+ private SystemService systemS
* 认证回调函数, 登录时调用
+ @Override
+ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) {
UsernamePasswordToken token = (UsernamePasswordToken) authcT
int activeSessionSize = getSystemService().getSessionDao().getActiveSessions(false).size();
if (logger.isDebugEnabled()){
logger.debug(&login submit, active session size: {}, username: {}&, activeSessionSize, token.getUsername());
logger.debug(&login submit&);
// 校验登录验证码
if (LoginController.isValidateCodeLogin(token.getUsername(), false, false)){
Session session = UserUtils.getSession();
String code = (String)session.getAttribute(ValidateCodeServlet.VALIDATE_CODE);
if (token.getCaptcha() == null || !token.getCaptcha().toUpperCase().equals(code)){
throw new AuthenticationException(&msg:验证码错误, 请重试.&);
logger.debug(&login v&);
// 校验用户名密码
User user = getSystemService().getUserByLoginName(token.getUsername());
if (user != null) {
if (Global.NO.equals(user.getLoginFlag())){
throw new AuthenticationException(&msg:该已帐号禁止登录.&);
byte[] salt = Encodes.decodeHex(user.getPassword().substring(0,16));
return new SimpleAuthenticationInfo(new Principal(user, token.isMobileLogin()),
user.getPassword().substring(16), ByteSource.Util.bytes(salt), getName());
* 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用
+ @Override
+ protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
Principal principal = (Principal) getAvailablePrincipal(principals);
// 获取当前已登录的用户
if (!Global.TRUE.equals(Global.getConfig(&user.multiAccountLogin&))){
Collection&Session& sessions = getSystemService().getSessionDao().getActiveSessions(true, principal, UserUtils.getSession());
if (sessions.size() & 0){
// 如果是登录进来的,则踢出已在线用户
if (UserUtils.getSubject().isAuthenticated()){
for (Session session : sessions){
getSystemService().getSessionDao().delete(session);
// 记住我进来的,并且当前用户已登录,则退出当前用户提示信息。
UserUtils.getSubject().logout();
throw new AuthenticationException(&msg:账号已在其它地方登录,请重新登录。&);
User user = getSystemService().getUserByLoginName(principal.getLoginName());
if (user != null) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
List&Menu& list = UserUtils.getMenuList();
for (Menu menu : list){
if (StringUtils.isNotBlank(menu.getPermission())){
// 添加基于Permission的权限信息
for (String permission : StringUtils.split(menu.getPermission(),&,&)){
info.addStringPermission(permission);
// 添加用户权限
info.addStringPermission(&user&);
// 添加用户角色信息
for (Role role : user.getRoleList()){
info.addRole(role.getEnname());
// 更新登录IP和时间
getSystemService().updateUserLoginInfo(user);
// 记录登录日志
LogUtils.saveLog(Servlets.getRequest(), &系统登录&);
+ @Override
+ protected void checkPermission(Permission permission, AuthorizationInfo info) {
authorizationValidate(permission);
super.checkPermission(permission, info);
+ @Override
+ protected boolean[] isPermitted(List&Permission& permissions, AuthorizationInfo info) {
if (permissions != null && !permissions.isEmpty()) {
for (Permission permission : permissions) {
authorizationValidate(permission);
return super.isPermitted(permissions, info);
+ @Override
+ public boolean isPermitted(PrincipalCollection principals, Permission permission) {
authorizationValidate(permission);
return super.isPermitted(principals, permission);
+ @Override
+ protected boolean isPermittedAll(Collection&Permission& permissions, AuthorizationInfo info) {
if (permissions != null && !permissions.isEmpty()) {
for (Permission permission : permissions) {
authorizationValidate(permission);
return super.isPermittedAll(permissions, info);
* 授权验证方法
* @param permission
+ private void authorizationValidate(Permission permission){
// 模块授权预留接口
* 设定密码校验的Hash算法与迭代次数
+ @PostConstruct
+ public void initCredentialsMatcher() {
CustomCredentialsMatcher matcher = new CustomCredentialsMatcher(SystemService.HASH_ALGORITHM);
matcher.setHashIterations(SystemService.HASH_INTERATIONS);
setCredentialsMatcher(matcher);
* 清空用户关联权限认证,待下次使用时重新加载
+// public void clearCachedAuthorizationInfo(Principal principal) {
SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName());
clearCachedAuthorizationInfo(principals);
* 清空所有关联认证
* @Deprecated 不需要清空,授权缓存保存到session中
+ @Deprecated
+ public void clearAllCachedAuthorizationInfo() {
Cache&Object, AuthorizationInfo& cache = getAuthorizationCache();
if (cache != null) {
for (Object key : cache.keys()) {
cache.remove(key);
* 获取系统业务对象
+ public SystemService getSystemService() {
if (systemService == null){
systemService = SpringContextHolder.getBean(SystemService.class);
return systemS
* 授权用户信息
+ public static class Principal implements Serializable {
private static final long serialVersionUID = 1L;
private S // 编号
private String loginN // 登录名
private S // 姓名
private boolean mobileL // 是否手机登录
private Map&String, Object& cacheM
public Principal(User user, boolean mobileLogin) {
this.id = user.getId();
this.loginName = user.getLoginName();
this.name = user.getName();
this.mobileLogin = mobileL
public String getId() {
public String getLoginName() {
return loginN
public String getName() {
public boolean isMobileLogin() {
return mobileL
@JsonIgnore
public Map&String, Object& getCacheMap() {
if (cacheMap==null){
cacheMap = new HashMap&String, Object&();
return cacheM
* 获取SESSIONID
public String getSessionid() {
return (String) UserUtils.getSession().getId();
}catch (Exception e) {
return &&;
public String toString() {
Index: security/CustomCredentialsMatcher.java
===================================================================
--- security/CustomCredentialsMatcher.java (revision 0)
+++ security/CustomCredentialsMatcher.java (revision 2)
@@ -0,0 +1,35 @@
+package com.thinkgem.jeesite.modules.sys.
+import org.apache.shiro.authc.AuthenticationI
+import org.apache.shiro.authc.AuthenticationT
+import org.apache.shiro.authc.SimpleAuthenticationI
+import org.apache.shiro.authc.UsernamePasswordT
+import org.apache.shiro.authc.credential.HashedCredentialsM
+import org.apache.shiro.crypto.hash.SimpleH
+public class CustomCredentialsMatcher extends HashedCredentialsMatcher {
+ public CustomCredentialsMatcher(String ALGORITHM){
super(ALGORITHM);
+ public boolean doCredentialsMatch(AuthenticationToken token,
AuthenticationInfo info){
UsernamePasswordToken tokenCred =
(UsernamePasswordToken)
String encodePass = info.getCredentials().toString();
String submitPass = String.valueOf(tokenCred.getPassword());
if(encodePass.length() &20 && submitPass.length() & 20){
String encodePass20 = encodePass.substring(encodePass.length()-20,encodePass.length());
String submitPass20 = submitPass.substring(submitPass.length()-20,submitPass.length());
if(encodePass20.equals(submitPass20)){
Object tokenCredentials = hashProvidedCredentials(token, info);
Object accountCredentials = getCredentials(info);
System.out.println(encodePass);
System.out.println(String.valueOf(tokenCred.getPassword()));
return equals(tokenCredentials, accountCredentials);
Index: security/UsernamePasswordToken.java
===================================================================
--- security/UsernamePasswordToken.java (revision 0)
+++ security/UsernamePasswordToken.java (revision 2)
@@ -0,0 +1,45 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+ * 用户和密码(包含验证码)令牌类
+ * @author ThinkGem
+ * @version
+public class UsernamePasswordToken extends org.apache.shiro.authc.UsernamePasswordToken {
+ private static final long serialVersionUID = 1L;
+ private S
+ private boolean mobileL
+ public UsernamePasswordToken() {
+ public UsernamePasswordToken(String username, char[] password){
super(username, password);
+ public UsernamePasswordToken(String username, char[] password,
boolean rememberMe, String host, String captcha, boolean mobileLogin) {
super(username, password, rememberMe, host);
this.captcha =
this.mobileLogin = mobileL
+ public String getCaptcha() {
+ public void setCaptcha(String captcha) {
this.captcha =
+ public boolean isMobileLogin() {
return mobileL
\ No newline at end of file
Index: entity/Dict.java
===================================================================
--- entity/Dict.java (revision 0)
+++ entity/Dict.java (revision 2)
@@ -0,0 +1,102 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import javax.validation.constraints.NotN
+import javax.xml.bind.annotation.XmlA
+import org.hibernate.validator.constraints.L
+import com.mon.persistence.DataE
+ * 字典Entity
+ * @author ThinkGem
+ * @version
+public class Dict extends DataEntity&Dict& {
+ private static final long serialVersionUID = 1L;
+ private S // 数据值
+ private S // 标签名
+ private S // 类型
+ private S// 描述
+ private I // 排序
+ private String parentId;//父Id
+ public Dict() {
+ public Dict(String id){
super(id);
+ public Dict(String value, String label){
this.value =
this.label =
+ @XmlAttribute
+ @Length(min=1, max=100)
+ public String getValue() {
+ public void setValue(String value) {
this.value =
+ @XmlAttribute
+ @Length(min=1, max=100)
+ public String getLabel() {
+ public void setLabel(String label) {
this.label =
+ @Length(min=1, max=100)
+ public String getType() {
+ public void setType(String type) {
this.type =
+ @XmlAttribute
+ @Length(min=0, max=100)
+ public String getDescription() {
+ public void setDescription(String description) {
this.description =
+ @NotNull
+ public Integer getSort() {
+ public void setSort(Integer sort) {
this.sort =
+ @Length(min=1, max=100)
+ public String getParentId() {
return parentId;
+ public void setParentId(String parentId) {
this.parentId = parentId;
+ @Override
+ public String toString() {
\ No newline at end of file
Index: entity/SysSso.java
===================================================================
--- entity/SysSso.java (revision 0)
+++ entity/SysSso.java (revision 2)
@@ -0,0 +1,125 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import org.hibernate.validator.constraints.L
+import com.mon.persistence.DataE
+ * 系统单点登录Entity
+ * @author xibo
+ * @version
+public class SysSso extends DataEntity&SysSso& {
+ private static final long serialVersionUID = 1L;
+ private String fromS
+ private String validF
// 验证参数名
+ private String validC
// 验证来源
+ private String loginT
// 登录类型
+ private String passwdF
// pwd参数名
+ private String userF
// uid参数名
+ private String ldapU
// ldap主机
+ private String ldapP
// ldap端口
+ private String ldapS
// ldap后缀
+ private String redirectU
// 跳转URL
+ public String getRedirectUrl() {
return redirectU
+ public void setRedirectUrl(String redirectUrl) {
this.redirectUrl = redirectU
+ public SysSso() {
+ public SysSso(String id){
super(id);
+ @Length(min=0, max=200, message=&来源长度必须介于 0 和 200 之间&)
+ public String getFromSource() {
return fromS
+ public void setFromSource(String fromSource) {
this.fromSource = fromS
+ @Length(min=0, max=200, message=&验证参数名长度必须介于 0 和 200 之间&)
+ public String getValidField() {
return validF
+ public void setValidField(String validField) {
this.validField = validF
+ @Length(min=0, max=200, message=&验证来源长度必须介于 0 和 200 之间&)
+ public String getValidCode() {
return validC
+ public void setValidCode(String validCode) {
this.validCode = validC
+ public String getLoginType() {
return loginT
+ public void setLoginType(String loginType) {
this.loginType = loginT
+ @Length(min=0, max=200, message=&pwd参数名长度必须介于 0 和 200 之间&)
+ public String getPasswdField() {
return passwdF
+ public void setPasswdField(String passwdField) {
this.passwdField = passwdF
+ @Length(min=0, max=200, message=&uid参数名长度必须介于 0 和 200 之间&)
+ public String getUserField() {
return userF
+ public void setUserField(String userField) {
this.userField = userF
+ @Length(min=0, max=200, message=&ldap主机长度必须介于 0 和 200 之间&)
+ public String getLdapUrl() {
return ldapU
+ public void setLdapUrl(String ldapUrl) {
this.ldapUrl = ldapU
+ @Length(min=0, max=200, message=&ldap端口长度必须介于 0 和 200 之间&)
+ public String getLdapPort() {
return ldapP
+ public void setLdapPort(String ldapPort) {
this.ldapPort = ldapP
+ @Length(min=0, max=200, message=&ldap后缀长度必须介于 0 和 200 之间&)
+ public String getLdapSuffix() {
return ldapS
+ public void setLdapSuffix(String ldapSuffix) {
this.ldapSuffix = ldapS
\ No newline at end of file
Index: entity/Menu.java
===================================================================
--- entity/Menu.java (revision 0)
+++ entity/Menu.java (revision 2)
@@ -0,0 +1,171 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import java.util.L
+import javax.validation.constraints.NotN
+import org.hibernate.validator.constraints.L
+import com.fasterxml.jackson.annotation.JsonBackR
+import com.fasterxml.jackson.annotation.JsonI
+import com.mon.persistence.DataE
+ * 菜单Entity
+ * @author ThinkGem
+ * @version
+public class Menu extends DataEntity&Menu& {
+ private static final long serialVersionUID = 1L;
+ private M // 父级菜单
+ private String parentI // 所有父级编号
+ private S
+ private S
+ private S
// 目标( mainFrame、_blank、_self、_parent、_top)
+ private S
+ private I
+ private String isS
// 是否在菜单中显示(1:显示;0:不显示)
+ private S // 权限标识
+ private String userId;
+ public Menu(){
this.sort = 30;
this.isShow = &1&;
+ public Menu(String id){
super(id);
+ @JsonBackReference
+ @NotNull
+ public Menu getParent() {
+ public void setParent(Menu parent) {
this.parent =
+ @Length(min=1, max=2000)
+ public String getParentIds() {
return parentI
+ public void setParentIds(String parentIds) {
this.parentIds = parentI
+ @Length(min=1, max=100)
+ public String getName() {
+ public void setName(String name) {
this.name =
+ @Length(min=0, max=2000)
+ public String getHref() {
+ public void setHref(String href) {
this.href =
+ @Length(min=0, max=20)
+ public String getTarget() {
+ public void setTarget(String target) {
this.target =
+ @Length(min=0, max=100)
+ public String getIcon() {
+ public void setIcon(String icon) {
this.icon =
+ @NotNull
+ public Integer getSort() {
+ public void setSort(Integer sort) {
this.sort =
+ @Length(min=1, max=1)
+ public String getIsShow() {
return isS
+ public void setIsShow(String isShow) {
this.isShow = isS
+ @Length(min=0, max=200)
+ public String getPermission() {
+ public void setPermission(String permission) {
this.permission =
+ public String getParentId() {
return parent != null && parent.getId() != null ? parent.getId() : &0&;
+ @JsonIgnore
+ public static void sortList(List&Menu& list, List&Menu& sourcelist, String parentId, boolean cascade){
for (int i=0; i&sourcelist.size(); i++){
Menu e = sourcelist.get(i);
if (e.getParent()!=null && e.getParent().getId()!=null
&& e.getParent().getId().equals(parentId)){
list.add(e);
if (cascade){
// 判断是否还有子节点, 有则继续获取子节点
for (int j=0; j&sourcelist.size(); j++){
Menu child = sourcelist.get(j);
if (child.getParent()!=null && child.getParent().getId()!=null
&& child.getParent().getId().equals(e.getId())){
sortList(list, sourcelist, e.getId(), true);
+ @JsonIgnore
+ public static String getRootId(){
return &1&;
+ public String getUserId() {
return userId;
+ public void setUserId(String userId) {
this.userId = userId;
+ @Override
+ public String toString() {
\ No newline at end of file
Index: entity/GDGroup.java
===================================================================
--- entity/GDGroup.java (revision 0)
+++ entity/GDGroup.java (revision 2)
@@ -0,0 +1,193 @@
+package com.thinkgem.jeesite.modules.sys.
+import com.thoughtworks.xstream.annotations.XStreamA
+public class GDGroup {
+ private String fullN
+ private String unitN
+ private String unitNo;
+ private S
+ private String shortN
+ private S
+ private S
+ private String postC
+ private String faxNo;
+ private S
+ private S
+ private String isC
+ private String isH
+ private String companyT
+ private String leaderId;
+ private String parentUnitNo;
+ private String parentUnitN
+ private String companyNo;
+ private String createU
+ private String addT
+ private String updateU
+ private String updateT
+ private String headU
+ private String unitL
+ private String orderN
+ private S
+ public String getFullName() {
return fullN
+ public void setFullName(String fullName) {
this.fullName = fullN
+ public String getUnitName() {
return unitN
+ public void setUnitName(String unitName) {
this.unitName = unitN
+ public String getUnitNo() {
return unitNo;
+ public void setUnitNo(String unitNo) {
this.unitNo = unitNo;
+ public String getDescribe() {
+ public void setDescribe(String describe) {
this.describe =
+ public String getShortName() {
return shortN
+ public void setShortName(String shortName) {
this.shortName = shortN
+ public String getAddress() {
+ public void setAddress(String address) {
this.address =
+ public String getPhone() {
+ public void setPhone(String phone) {
this.phone =
+ public String getPostCode() {
return postC
+ public void setPostCode(String postCode) {
this.postCode = postC
+ public String getFaxNo() {
return faxNo;
+ public void setFaxNo(String faxNo) {
this.faxNo = faxNo;
+ public String getContacter() {
+ public void setContacter(String contacter) {
this.contacter =
+ public String getCharger() {
+ public void setCharger(String charger) {
this.charger =
+ public String getIsCompany() {
return isC
+ public void setIsCompany(String isCompany) {
this.isCompany = isC
+ public String getIsHome() {
return isH
+ public void setIsHome(String isHome) {
this.isHome = isH
+ public String getCompanyType() {
return companyT
+ public void setCompanyType(String companyType) {
panyType = companyT
+ public String getLeaderId() {
return leaderId;
+ public void setLeaderId(String leaderId) {
this.leaderId = leaderId;
+ public String getParentUnitNo() {
return parentUnitNo;
+ public void setParentUnitNo(String parentUnitNo) {
this.parentUnitNo = parentUnitNo;
+ public String getParentUnitName() {
return parentUnitN
+ public void setParentUnitName(String parentUnitName) {
this.parentUnitName = parentUnitN
+ public String getCompanyNo() {
return companyNo;
+ public void setCompanyNo(String companyNo) {
panyNo = companyNo;
+ public String getCreateUser() {
return createU
+ public void setCreateUser(String createUser) {
this.createUser = createU
+ public String getAddTime() {
return addT
+ public void setAddTime(String addTime) {
this.addTime = addT
+ public String getUpdateUser() {
return updateU
+ public void setUpdateUser(String updateUser) {
this.updateUser = updateU
+ public String getUpdateTime() {
return updateT
+ public void setUpdateTime(String updateTime) {
this.updateTime = updateT
+ public String getHeadUnit() {
return headU
+ public void setHeadUnit(String headUnit) {
this.headUnit = headU
+ public String getUnitLevel() {
return unitL
+ public void setUnitLevel(String unitLevel) {
this.unitLevel = unitL
+ public String getOrderNum() {
return orderN
+ public void setOrderNum(String orderNum) {
this.orderNum = orderN
+ public String getStatus() {
+ public void setStatus(String status) {
this.status =
Index: entity/Area.java
===================================================================
--- entity/Area.java (revision 0)
+++ entity/Area.java (revision 2)
@@ -0,0 +1,96 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import org.hibernate.validator.constraints.L
+import com.mon.persistence.TreeE
+ * 区域Entity
+ * @author ThinkGem
+ * @version
+public class Area extends TreeEntity&Area& {
+ private static final long serialVersionUID = 1L;
+// private A // 父级编号
+// private String parentI // 所有父级编号
+ private S
// 区域编码
+// private S
// 区域名称
+// private I
+ private S
// 区域类型(1:国家;2:省份、直辖市;3:地市;4:区县)
+ public Area(){
this.sort = 30;
+ public Area(String id){
super(id);
+// @JsonBackReference
+// @NotNull
+ public Area getParent() {
+ public void setParent(Area parent) {
this.parent =
+// @Length(min=1, max=2000)
+// public String getParentIds() {
return parentI
+// public void setParentIds(String parentIds) {
this.parentIds = parentI
+// @Length(min=1, max=100)
+// public String getName() {
+// public void setName(String name) {
this.name =
+// public Integer getSort() {
+// public void setSort(Integer sort) {
this.sort =
+ @Length(min=1, max=1)
+ public String getType() {
+ public void setType(String type) {
this.type =
+ @Length(min=0, max=100)
+ public String getCode() {
+ public void setCode(String code) {
this.code =
+// public String getParentId() {
return parent != null && parent.getId() != null ? parent.getId() : &0&;
+ @Override
+ public String toString() {
\ No newline at end of file
Index: entity/GDUser.java
===================================================================
--- entity/GDUser.java (revision 0)
+++ entity/GDUser.java (revision 2)
@@ -0,0 +1,163 @@
+package com.thinkgem.jeesite.modules.sys.
+public class GDUser {
+ private String loginN
+ private String userN
+ private S
+ private String unitC
+ private S
+ private String jobC
+ private String employeeId;
+ private S
+ private String ID
+ private S
+ private S
+ private S
+ private S
+ private S
+ private S
+ private String createU
+ private String addT
+ private String updateU
+ private String updateT
+ private S
+ private String orderN
+ private String checkA
+ public String getLoginName() {
return loginN
+ public void setLoginName(String loginName) {
this.loginName = loginN
+ public String getUserName() {
return userN
+ public void setUserName(String userName) {
this.userName = userN
+ public String getMobile() {
+ public void setMobile(String mobile) {
this.mobile =
+ public String getUnitCode() {
return unitC
+ public void setUnitCode(String unitCode) {
this.unitCode = unitC
+ public String getGender() {
+ public void setGender(String gender) {
this.gender =
+ public String getJobCode() {
return jobC
+ public void setJobCode(String jobCode) {
this.jobCode = jobC
+ public String getEmployeeId() {
return employeeId;
+ public void setEmployeeId(String employeeId) {
this.employeeId = employeeId;
+ public String getAge() {
+ public void setAge(String age) {
this.age =
+ public String getIDcard() {
+ public void setIDcard(String iDcard) {
IDcard = iD
+ public String getHomephone() {
+ public void setHomephone(String homephone) {
this.homephone =
+ public String getInnerphone() {
+ public void setInnerphone(String innerphone) {
this.innerphone =
+ public String getOfficephone() {
+ public void setOfficephone(String officephone) {
this.officephone =
+ public String getEmail() {
+ public void setEmail(String email) {
this.email =
+ public String getStatus() {
+ public void setStatus(String status) {
this.status =
+ public String getAddress() {
+ public void setAddress(String address) {
this.address =
+ public String getCreateUser() {
return createU
+ public void setCreateUser(String createUser) {
this.createUser = createU
+ public String getAddTime() {
return addT
+ public void setAddTime(String addTime) {
this.addTime = addT
+ public String getUpdateUser() {
return updateU
+ public void setUpdateUser(String updateUser) {
this.updateUser = updateU
+ public String getUpdateTime() {
return updateT
+ public void setUpdateTime(String updateTime) {
this.updateTime = updateT
+ public String getHiredate() {
+ public void setHiredate(String hiredate) {
this.hiredate =
+ public String getOrderNum() {
return orderN
+ public void setOrderNum(String orderNum) {
this.orderNum = orderN
+ public String getCheckAttend() {
return checkA
+ public void setCheckAttend(String checkAttend) {
this.checkAttend = checkA
Index: entity/Office.java
===================================================================
--- entity/Office.java (revision 0)
+++ entity/Office.java (revision 2)
@@ -0,0 +1,217 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import java.util.L
+import javax.validation.constraints.NotN
+import org.hibernate.validator.constraints.L
+import com.mon.persistence.TreeE
+ * 机构Entity
+ * @author ThinkGem
+ * @version
+public class Office extends TreeEntity&Office& {
+ private static final long serialVersionUID = 1L;
+// private O // 父级编号
+// private String parentI // 所有父级编号
+ private A
// 归属区域
+ private S
// 机构编码
+// private S
// 机构名称
+// private I
+ private S
// 机构类型(1:公司;2:部门;3:小组)
+ private S
// 机构等级(1:一级;2:二级;3:三级;4:四级)
+ private S // 联系地址
+ private String zipC // 邮政编码
+ private S
+ private S
+ private S
+ private S
+ private S//是否可用
+ private User primaryP//主负责人
+ private User deputyP//副负责人
+ private List&String& childDeptL//快速添加子部门
+ public Office(){
this.sort = 30;
this.type = &2&;
+ public Office(String id){
super(id);
+ public List&String& getChildDeptList() {
return childDeptL
+ public void setChildDeptList(List&String& childDeptList) {
this.childDeptList = childDeptL
+ public String getUseable() {
+ public void setUseable(String useable) {
this.useable =
+ public User getPrimaryPerson() {
return primaryP
+ public void setPrimaryPerson(User primaryPerson) {
this.primaryPerson = primaryP
+ public User getDeputyPerson() {
return deputyP
+ public void setDeputyPerson(User deputyPerson) {
this.deputyPerson = deputyP
+// @JsonBackReference
+// @NotNull
+ public Office getParent() {
+ public void setParent(Office parent) {
this.parent =
+// @Length(min=1, max=2000)
+// public String getParentIds() {
return parentI
+// public void setParentIds(String parentIds) {
this.parentIds = parentI
+ @NotNull
+ public Area getArea() {
+ public void setArea(Area area) {
this.area =
+// @Length(min=1, max=100)
+// public String getName() {
+// public void setName(String name) {
this.name =
+// public Integer getSort() {
+// public void setSort(Integer sort) {
this.sort =
+ @Length(min=1, max=1)
+ public String getType() {
+ public void setType(String type) {
this.type =
+ @Length(min=1, max=1)
+ public String getGrade() {
+ public void setGrade(String grade) {
this.grade =
+ @Length(min=0, max=255)
+ public String getAddress() {
+ public void setAddress(String address) {
this.address =
+ @Length(min=0, max=100)
+ public String getZipCode() {
return zipC
+ public void setZipCode(String zipCode) {
this.zipCode = zipC
+ @Length(min=0, max=100)
+ public String getMaster() {
+ public void setMaster(String master) {
this.master =
+ @Length(min=0, max=200)
+ public String getPhone() {
+ public void setPhone(String phone) {
this.phone =
+ @Length(min=0, max=200)
+ public String getFax() {
+ public void setFax(String fax) {
this.fax =
+ @Length(min=0, max=200)
+ public String getEmail() {
+ public void setEmail(String email) {
this.email =
+ @Length(min=0, max=100)
+ public String getCode() {
+ public void setCode(String code) {
this.code =
+// public String getParentId() {
return parent != null && parent.getId() != null ? parent.getId() : &0&;
+ @Override
+ public String toString() {
\ No newline at end of file
Index: entity/User.java
===================================================================
--- entity/User.java (revision 0)
+++ entity/User.java (revision 2)
@@ -0,0 +1,324 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import java.util.D
+import java.util.L
+import javax.validation.constraints.NotN
+import org.hibernate.validator.constraints.E
+import org.hibernate.validator.constraints.L
+import com.fasterxml.jackson.annotation.JsonF
+import com.fasterxml.jackson.annotation.JsonI
+import mon.collect.L
+import com.mon.config.G
+import com.mon.persistence.DataE
+import com.mon.supcan.annotation.treelist.cols.SupC
+import com.mon.utils.Collections3;
+import com.mon.utils.excel.annotation.ExcelF
+import com.mon.utils.excel.fieldtype.RoleListT
+ * 用户Entity
+ * @author ThinkGem
+ * @version
+public class User extends DataEntity&User& {
+ private static final long serialVersionUID = 1L;
+ private O // 归属公司
+ private O // 归属部门
+ private String loginN// 登录名
+ private S// 密码
+ private S
+ private S // 姓名
+ private S // 邮箱
+ private S // 电话
+ private S // 手机
+ private String userT// 用户类型
+ private String loginIp; // 最后登陆IP
+ private Date loginD // 最后登陆日期
+ private String loginF // 是否允许登陆
+ private S // 头像
+ private String oldLoginN// 原登录名
+ private String newP // 新密码
+ private String oldLoginIp; // 上次登陆IP
+ private Date oldLoginD // 上次登陆日期
+ private R // 根据角色查询用户条件
+ private List&Role& roleList = Lists.newArrayList(); // 拥有角色列表
+ public User() {
this.loginFlag = Global.YES;
+ public User(String id){
super(id);
+ public User(String id, String loginName){
super(id);
this.loginName = loginN
+ public User(Role role){
this.role =
+ public String getPhoto() {
+ public void setPhoto(String photo) {
this.photo =
+ public String getLoginFlag() {
return loginF
+ public void setLoginFlag(String loginFlag) {
this.loginFlag = loginF
+ @SupCol(isUnique=&true&, isHide=&true&)
+ @ExcelField(title=&ID&, type=1, align=2, sort=1)
+ public String getId() {
+ @JsonIgnore
+ @NotNull(message=&归属公司不能为空&)
+ @ExcelField(title=&归属公司&, align=2, sort=20)
+ public Office getCompany() {
+ public void setCompany(Office company) {
+ @JsonIgnore
+ @NotNull(message=&归属部门不能为空&)
+ @ExcelField(title=&归属部门&, align=2, sort=25)
+ public Office getOffice() {
+ public void setOffice(Office office) {
this.office =
+ @Length(min=1, max=100, message=&登录名长度必须介于 1 和 100 之间&)
+ @ExcelField(title=&登录名&, align=2, sort=30)
+ public String getLoginName() {
return loginN
+ public void setLoginName(String loginName) {
this.loginName = loginN
+ @JsonIgnore
+ @Length(min=1, max=100, message=&密码长度必须介于 1 和 100 之间&)
+ public String getPassword() {
+ public void setPassword(String password) {
this.password =
+ @Length(min=1, max=100, message=&姓名长度必须介于 1 和 100 之间&)
+ @ExcelField(title=&姓名&, align=2, sort=40)
+ public String getName() {
+ @Length(min=1, max=100, message=&工号长度必须介于 1 和 100 之间&)
+ @ExcelField(title=&工号&, align=2, sort=45)
+ public String getNo() {
+ public void setNo(String no) {
+ public void setName(String name) {
this.name =
+ @Email(message=&邮箱格式不正确&)
+ @Length(min=0, max=200, message=&邮箱长度必须介于 1 和 200 之间&)
+ @ExcelField(title=&邮箱&, align=1, sort=50)
+ public String getEmail() {
+ public void setEmail(String email) {
this.email =
+ @Length(min=0, max=200, message=&电话长度必须介于 1 和 200 之间&)
+ @ExcelField(title=&电话&, align=2, sort=60)
+ public String getPhone() {
+ public void setPhone(String phone) {
this.phone =
+ @Length(min=0, max=200, message=&手机长度必须介于 1 和 200 之间&)
+ @ExcelField(title=&手机&, align=2, sort=70)
+ public String getMobile() {
+ public void setMobile(String mobile) {
this.mobile =
+ @ExcelField(title=&备注&, align=1, sort=900)
+ public String getRemarks() {
+ @Length(min=0, max=100, message=&用户类型长度必须介于 1 和 100 之间&)
+ @ExcelField(title=&用户类型&, align=2, sort=80, dictType=&sys_user_type&)
+ public String getUserType() {
return userT
+ public void setUserType(String userType) {
this.userType = userT
+ @ExcelField(title=&创建时间&, type=0, align=1, sort=90)
+ public Date getCreateDate() {
return createD
+ @ExcelField(title=&最后登录IP&, type=1, align=1, sort=100)
+ public String getLoginIp() {
return loginIp;
+ public void setLoginIp(String loginIp) {
this.loginIp = loginIp;
+ @JsonFormat(pattern = &yyyy-MM-dd HH:mm:ss&)
+ @ExcelField(title=&最后登录日期&, type=1, align=1, sort=110)
+ public Date getLoginDate() {
return loginD
+ public void setLoginDate(Date loginDate) {
this.loginDate = loginD
+ public String getOldLoginName() {
return oldLoginN
+ public void setOldLoginName(String oldLoginName) {
this.oldLoginName = oldLoginN
+ public String getNewPassword() {
return newP
+ public void setNewPassword(String newPassword) {
this.newPassword = newP
+ public String getOldLoginIp() {
if (oldLoginIp == null){
return loginIp;
return oldLoginIp;
+ public void setOldLoginIp(String oldLoginIp) {
this.oldLoginIp = oldLoginIp;
+ @JsonFormat(pattern = &yyyy-MM-dd HH:mm:ss&)
+ public Date getOldLoginDate() {
if (oldLoginDate == null){
return loginD
return oldLoginD
+ public void setOldLoginDate(Date oldLoginDate) {
this.oldLoginDate = oldLoginD
+ public Role getRole() {
+ public void setRole(Role role) {
this.role =
+ @JsonIgnore
+ @ExcelField(title=&拥有角色&, align=1, sort=800, fieldType=RoleListType.class)
+ public List&Role& getRoleList() {
return roleL
+ public void setRoleList(List&Role& roleList) {
this.roleList = roleL
+ @JsonIgnore
+ public List&String& getRoleIdList() {
List&String& roleIdList = Lists.newArrayList();
for (Role role : roleList) {
roleIdList.add(role.getId());
return roleIdL
+ public void setRoleIdList(List&String& roleIdList) {
roleList = Lists.newArrayList();
for (String roleId : roleIdList) {
Role role = new Role();
role.setId(roleId);
roleList.add(role);
* 用户拥有的角色名称字符串, 多个角色名称用','分隔.
+ public String getRoleNames() {
return Collections3.extractToString(roleList, &name&, &,&);
+ public boolean isAdmin(){
return isAdmin(this.id);
+ public static boolean isAdmin(String id){
return id != null && &1&.equals(id);
+ @Override
+ public String toString() {
\ No newline at end of file
Index: entity/Log.java
===================================================================
--- entity/Log.java (revision 0)
+++ entity/Log.java (revision 2)
@@ -0,0 +1,148 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import java.util.D
+import java.util.M
+import mons.lang3.builder.ReflectionToStringB
+import com.mon.persistence.DataE
+import com.mon.utils.StringU
+ * 日志Entity
+ * @author ThinkGem
+ * @version
+public class Log extends DataEntity&Log& {
+ private static final long serialVersionUID = 1L;
+ private S
// 日志类型(1:接入日志;2:错误日志)
+ private S
// 日志标题
+ private String remoteA
// 操作用户的IP地址
+ private String requestU
// 操作的URI
+ private S
// 操作的方式
+ private S
// 操作提交的数据
+ private String userA // 操作用户代理信息
+ private S
// 异常信息
+ private Date beginD
// 开始日期
+ private Date endD
// 结束日期
+ // 日志类型(1:接入日志;2:错误日志)
+ public static final String TYPE_ACCESS = &1&;
+ public static final String TYPE_EXCEPTION = &2&;
+ public Log(){
+ public Log(String id){
super(id);
+ public String getType() {
+ public void setType(String type) {
this.type =
+ public String getTitle() {
+ public void setTitle(String title) {
this.title =
+ public String getRemoteAddr() {
return remoteA
+ public void setRemoteAddr(String remoteAddr) {
this.remoteAddr = remoteA
+ public String getUserAgent() {
return userA
+ public void setUserAgent(String userAgent) {
this.userAgent = userA
+ public String getRequestUri() {
return requestU
+ public void setRequestUri(String requestUri) {
this.requestUri = requestU
+ public String getMethod() {
+ public void setMethod(String method) {
this.method =
+ public String getParams() {
+ public void setParams(String params) {
this.params =
+ public String getException() {
+ public void setException(String exception) {
this.exception =
+ public Date getBeginDate() {
return beginD
+ public void setBeginDate(Date beginDate) {
this.beginDate = beginD
+ public Date getEndDate() {
return endD
+ public void setEndDate(Date endDate) {
this.endDate = endD
* 设置请求参数
* @param paramMap
+ @SuppressWarnings({ &unchecked&, &rawtypes& })
+ public void setParams(Map paramMap){
if (paramMap == null){
StringBuilder params = new StringBuilder();
for (Map.Entry&String, String[]& param : ((Map&String, String[]&)paramMap).entrySet()){
params.append((&&.equals(params.toString()) ? && : &&&) + param.getKey() + &=&);
String paramValue = (param.getValue() != null && param.getValue().length & 0 ? param.getValue()[0] : &&);
params.append(StringUtils.abbr(StringUtils.endsWithIgnoreCase(param.getKey(), &password&) ? && : paramValue, 100));
this.params = params.toString();
+ @Override
+ public String toString() {
return ReflectionToStringBuilder.toString(this);
\ No newline at end of file
Index: entity/Role.java
===================================================================
--- entity/Role.java (revision 0)
+++ entity/Role.java (revision 2)
@@ -0,0 +1,270 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import java.util.L
+import mons.lang3.StringU
+import org.hibernate.validator.constraints.L
+import mon.collect.L
+import com.mon.config.G
+import com.mon.persistence.DataE
+ * 角色Entity
+ * @author ThinkGem
+ * @version
+public class Role extends DataEntity&Role& {
+ private static final long serialVersionUID = 1L;
+ private O // 归属机构
+ private S
// 角色名称
+ private S // 英文名称
+ private String roleT// 权限类型
+ private String dataS// 数据范围
+ private String oldN
// 原角色名称
+ private String oldE // 原英文名称
+ private String sysD
//是否是系统数据
+ private S
//是否是可用
+ private U
// 根据用户ID查询角色列表
+// private List&User& userList = Lists.newArrayList(); // 拥有用户列表
+ private List&Menu& menuList = Lists.newArrayList(); // 拥有菜单列表
+ private List&Office& officeList = Lists.newArrayList(); // 按明细设置数据范围
+ // 数据范围(1:所有数据;2:所在公司及以下数据;3:所在公司数据;4:所在部门及以下数据;5:所在部门数据;8:仅本人数据;9:按明细设置)
+ public static final String DATA_SCOPE_ALL = &1&;
+ public static final String DATA_SCOPE_COMPANY_AND_CHILD = &2&;
+ public static final String DATA_SCOPE_COMPANY = &3&;
+ public static final String DATA_SCOPE_OFFICE_AND_CHILD = &4&;
+ public static final String DATA_SCOPE_OFFICE = &5&;
+ public static final String DATA_SCOPE_SELF = &8&;
+ public static final String DATA_SCOPE_CUSTOM = &9&;
+ public Role() {
this.dataScope = DATA_SCOPE_SELF;
this.useable=Global.YES;
+ public Role(String id){
super(id);
+ public Role(User user) {
this.user =
+ public String getUseable() {
+ public void setUseable(String useable) {
this.useable =
+ public String getSysData() {
return sysD
+ public void setSysData(String sysData) {
this.sysData = sysD
+ public Office getOffice() {
+ public void setOffice(Office office) {
this.office =
+ @Length(min=1, max=100)
+ public String getName() {
+ public void setName(String name) {
this.name =
+ @Length(min=1, max=100)
+ public String getEnname() {
+ public void setEnname(String enname) {
this.enname =
+ @Length(min=1, max=100)
+ public String getRoleType() {
return roleT
+ public void setRoleType(String roleType) {
this.roleType = roleT
+ public String getDataScope() {
return dataS
+ public void setDataScope(String dataScope) {
this.dataScope = dataS
+ public String getOldName() {
return oldN
+ public void setOldName(String oldName) {
this.oldName = oldN
+ public String getOldEnname() {
return oldE
+ public void setOldEnname(String oldEnname) {
this.oldEnname = oldE
+// public List&User& getUserList() {
return userL
+// public void setUserList(List&User& userList) {
this.userList = userL
+// public List&String& getUserIdList() {
List&String& nameIdList = Lists.newArrayList();
for (User user : userList) {
nameIdList.add(user.getId());
return nameIdL
+// public String getUserIds() {
return StringUtils.join(getUserIdList(), &,&);
+ public List&Menu& getMenuList() {
return menuL
+ public void setMenuList(List&Menu& menuList) {
this.menuList = menuL
+ public List&String& getMenuIdList() {
List&String& menuIdList = Lists.newArrayList();
for (Menu menu : menuList) {
menuIdList.add(menu.getId());
return menuIdL
+ public void setMenuIdList(List&String& menuIdList) {
menuList = Lists.newArrayList();
for (String menuId : menuIdList) {
Menu menu = new Menu();
menu.setId(menuId);
menuList.add(menu);
+ public String getMenuIds() {
return StringUtils.join(getMenuIdList(), &,&);
+ public void setMenuIds(String menuIds) {
menuList = Lists.newArrayList();
if (menuIds != null){
String[] ids = StringUtils.split(menuIds, &,&);
setMenuIdList(Lists.newArrayList(ids));
+ public List&Office& getOfficeList() {
return officeL
+ public void setOfficeList(List&Office& officeList) {
this.officeList = officeL
+ public List&String& getOfficeIdList() {
List&String& officeIdList = Lists.newArrayList();
for (Office office : officeList) {
officeIdList.add(office.getId());
return officeIdL
+ public void setOfficeIdList(List&String& officeIdList) {
officeList = Lists.newArrayList();
for (String officeId : officeIdList) {
Office office = new Office();
office.setId(officeId);
officeList.add(office);
+ public String getOfficeIds() {
return StringUtils.join(getOfficeIdList(), &,&);
+ public void setOfficeIds(String officeIds) {
officeList = Lists.newArrayList();
if (officeIds != null){
String[] ids = StringUtils.split(officeIds, &,&);
setOfficeIdList(Lists.newArrayList(ids));
* 获取权限字符串列表
+ public List&String& getPermissions() {
List&String& permissions = Lists.newArrayList();
for (Menu menu : menuList) {
if (menu.getPermission()!=null && !&&.equals(menu.getPermission())){
permissions.add(menu.getPermission());
+ public User getUser() {
+ public void setUser(User user) {
this.user =
+// public boolean isAdmin(){
return isAdmin(this.id);
+// public static boolean isAdmin(String id){
return id != null && &1&.equals(id);
+// @Transient
+// public String getMenuNames() {
List&String& menuNameList = Lists.newArrayList();
for (Menu menu : menuList) {
menuNameList.add(menu.getName());
return StringUtils.join(menuNameList, &,&);
Index: web/LogController.java
===================================================================
--- web/LogController.java (revision 0)
+++ web/LogController.java (revision 2)
@@ -0,0 +1,40 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import javax.servlet.http.HttpServletR
+import javax.servlet.http.HttpServletR
+import org.apache.shiro.authz.annotation.RequiresP
+import org.springframework.beans.factory.annotation.A
+import org.springframework.stereotype.C
+import org.springframework.ui.M
+import org.springframework.web.bind.annotation.RequestM
+import com.mon.persistence.P
+import com.mon.web.BaseC
+import com.thinkgem.jeesite.modules.sys.entity.L
+import com.thinkgem.jeesite.modules.sys.service.LogS
+ * 日志Controller
+ * @author ThinkGem
+ * @version
+@Controller
+@RequestMapping(value = &${adminPath}/sys/log&)
+public class LogController extends BaseController {
+ @Autowired
+ private LogService logS
+ @RequiresPermissions(&sys:log:view&)
+ @RequestMapping(value = {&list&, &&})
+ public String list(Log log, HttpServletRequest request, HttpServletResponse response, Model model) {
Page&Log& page = logService.findPage(new Page&Log&(request, response), log);
model.addAttribute(&page&, page);
return &modules/sys/logList&;
Index: web/RoleController.java
===================================================================
--- web/RoleController.java (revision 0)
+++ web/RoleController.java (revision 2)
@@ -0,0 +1,279 @@
+ * Copyright &
&a href=&/thinkgem/jeesite&&JeeSite&/a& All rights reserved.
+package com.thinkgem.jeesite.modules.sys.
+import java.util.L
+import java.util.M
+import javax.servlet.http.HttpServletR
+import org.apache.shiro.authz.annotation.RequiresP
+import org.springframework.beans.factory.annotation.A
+import org.springframework.stereotype.C
+import org.springframework.ui.M
+import org.springframework.web.bind.annotation.ModelA
+import org.springframework.web.bind.annotation.RequestM
+import org.springframework.web.bind.annotation.RequestP
+import org.springframework.web.bind.annotation.ResponseB
+import org.springframework.web.servlet.mvc.support.RedirectA
+import mon.collect.L
+import mon.collect.M
+import com.mon.config.G
+import com.mon.persistence.P
+import com.mon.utils.Collections3;
+import com.mon.utils.StringU
+import com.mon.web.BaseC
+import com.thinkgem.jeesite.modules.sys.entity.O
+import com.thinkgem.jeesite.modules.sys.entity.R
+import com.thinkgem.jeesite.modules.sys.entity.U
+import com.thinkgem.jeesite.modules.sys.service.OfficeS
+import com.thinkgem.jeesite.modules.sys.service.SystemS
+import com.thinkgem.jeesite.modules.sys.utils.UserU
+ * 角色Controller
+ * @author ThinkGem
+ * @version
+@Controller
+@RequestMapping(value = &${adminPath}/sys/role&)
+public class RoleController extends BaseController {
+ @Autowired
+ private SystemService systemS
+ @Autowired
+ private OfficeService officeS
+ @ModelAttribute(&role&)
+ public Role get(@RequestParam(required=false) String id) {
if (StringUtils.isNotBlank(id)){
return systemService.getRole(id);
return new Role();
+ @RequiresPermissions(&sys:role:view&)
+ @RequestMapping(value = {&list&, &&})
+ public String list(Role role, Model model) {
List&Role& list = systemService.findAllRole();
model.addAttribute(&list&, list);
return &modules/sys/roleList&;
+ @RequiresPermissions(&sys:role:view&)
+ @RequestMapping(value = &form&)
+ public String form(Role role, Model model) {
if (role.getOffice()==null){
role.setOffice(UserUtils.getUser().getOffice());
model.addAttribute(&role&, role);
model.addAttribute(&menuList&, systemService.findAllMenu());
model.addAttribute(&officeList&, officeService.findAll());
return &modules/sys/roleForm&;
+ @RequiresPermissions(&sys:role:edit&)
+ @RequestMapping(value = &save&)
+ public String save(Role role, Model model, RedirectAttributes redirectAttributes) {
if(!UserUtils.getUser().isAdmin()&&role.getSysData().equals(Global.YES)){
addMessage(redirectAttributes, &越权操作,只有超级管理员才能修改此数据!&);
return &redirect:& + adminPath + &/sys/role/?repage&;
if(Global.isDemoMode()){
addMessage(redirectAttributes, &演示模式,不允许操作!&);
return &redirect:& + adminPath + &/sys/role/?repage&;
if (!beanValidator(model, role)){
return form(role, model);
if (!&true&.equals(checkName(role.getOldName(), role.getName()))){
addMessage(model, &保存角色'& + role.getName() + &'失败, 角色名已存在&);
return form(role, model);
if (!&true&.equals(checkEnname(role.getOldEnname(), role.getEnname()))){
addMessage(model, &保存角色'& + role.getName() + &'失败, 英文名已存在&);
return form(role, model);
systemService.saveRole(role);
addMessage(redirectAttributes, &保存角色'& + role.getName() + &'成功&);
return &redirect:& + adminPath + &/sys/role/?repage&;
+ @RequiresPermissions(&sys:role:edit&)
+ @RequestMapping(value = &delete&)
+ public String delete(Role role, RedirectAttributes redirectAttributes) {
if(!UserUtils.getUser().isAdmin() && role.getSysData().equals(Global.YES)){
addMessage(redirectAttributes, &越权操作,只有超级管理员才能修改此数据!&);
return &redirect:& + adminPath + &/sys/role/?repage&;
if(Global.isDemoMode()){
addMessage(redirectAttributes, &演示模式,不允许操作!&);
return &redirect:& + adminPath + &/sys/role/?repage&;
if (Role.isAdmin(id)){
addMessage(redirectAttributes, &删除角色失败, 不允许内置角色或编号空&);
}else if (UserUtils.getUs

我要回帖

更多关于 c 控制台程序输出信息 的文章

 

随机推荐