Compare commits

..

45 Commits

Author SHA1 Message Date
thinkgem
e6f6a45d67 v4.0.4 2018-06-20 20:40:07 +08:00
thinkgem
f067c9eabd 错误页面优化,ajax情况下返回json数据。 2018-06-20 20:36:09 +08:00
thinkgem
f2c8f7eef9 优化500页面 2018-06-15 22:59:57 +08:00
thinkgem
33246189e4 UPDATE README.md 2018-06-15 22:59:43 +08:00
thinkgem
3e97365364 add root pom.xml 2018-06-15 22:59:24 +08:00
thinkgem
0fa8578d7e UPDATE terms.md 2018-06-14 20:50:26 +08:00
thinkgem
8b07f0b136 支持命令行指定属性文件: -Dspring.config.location=x:/app.yml 2018-06-12 20:31:12 +08:00
thinkgem
94c38ee018 update pom.xml 2018-06-11 20:21:04 +08:00
thinkgem
56941e07b5 新增用户数据导入导出功能,支持导入数据更新 2018-06-06 21:39:35 +08:00
thinkgem
1fdbfe99b6 update pom version 2018-06-06 21:13:50 +08:00
thinkgem
0ddda6a824 修正jdk目录带空格的情况下错误的问题 2018-06-06 21:13:10 +08:00
thinkgem
489b85df81 新增模块示例项目 jeesite-module-template 2018-06-06 21:11:54 +08:00
thinkgem
226d20d759 Excel导入工具@ExcelField(attrName="")属性的支持 2018-06-04 23:10:25 +08:00
thinkgem
98ab05793b add msgPcPoolCache cache 2018-06-02 22:52:57 +08:00
thinkgem
d98a0dbe30 员工编号与登录名前端验证一致 2018-06-02 17:32:58 +08:00
thinkgem
c17b24b556 租户代码优化 2018-06-02 13:53:36 +08:00
thinkgem
6e45b2e0c2 MsgPushUtils.push(type...)的receiveUserCode参数支持多个,依[CODE]前缀,支持直接指定手机号码或邮箱地址等等 2018-06-02 12:28:40 +08:00
thinkgem
2f4a4b18f8 增加jdbc.jta.enabled分布式事务开关(默认false) 2018-06-02 12:27:03 +08:00
thinkgem
e1608eda1f mvm test param add -U 2018-05-31 21:33:23 +08:00
thinkgem
131e0332e0 修正初始化脚本用户密码初始化加密2次的问题。 2018-05-30 22:57:21 +08:00
thinkgem
4b76a942cd remove futility 2018-05-29 21:56:05 +08:00
thinkgem
78e27724af 日志查询添加本月默认查询条件 2018-05-28 21:44:25 +08:00
thinkgem
d28151b6b2 修正:直接在WHERE后添加扩展Where语句时,移除开头AND 2018-05-28 21:38:05 +08:00
thinkgem
1e19211f93 update script bin 2018-05-27 22:23:55 +08:00
thinkgem
65bd1c16e9 v4.0.3 2018-05-27 12:02:36 +08:00
thinkgem
dc3d70e96f 优化用户管理下的授权角色、授权数据、重置密码权限不严谨问题。 2018-05-22 22:15:35 +08:00
thinkgem
18ba4b9075 dict_type remove unique 2018-05-17 20:27:57 +08:00
thinkgem
2264dc8f4f update readme 2018-05-17 20:27:07 +08:00
thinkgem
9de908da9f Beetl 视图 include 支持相对路径,sysLogin、sysIndex 移到 themes 目录下 2018-05-17 20:26:34 +08:00
thinkgem
a2230fc74b 消息推送提醒暂时提交(未完成) 2018-05-13 22:30:13 +08:00
thinkgem
d74b527635 表单演示优化。 2018-05-13 18:47:18 +08:00
thinkgem
a4c0ee8f3c /a/menuTree 优化,支持 parentCode 参数 2018-05-11 22:05:17 +08:00
thinkgem
7758fe59bf XSS非法字符过滤优化 2018-05-11 22:04:37 +08:00
thinkgem
6cab0864b5 字典数据管理,上级字典切换无效问题修正。#IJO4W 2018-05-10 20:34:30 +08:00
thinkgem
fcc58f1b0d 采用Mybatis-PageHelper的CountPage方法,优化count性能,感谢abel533;代码生成BaseEntity未导入修正;IE下ajax缓存优化 2018-05-09 21:46:00 +08:00
thinkgem
70821f8ac0 #IJKZ4 支持 js.layer.config({shadeClose: false}); 2018-05-08 22:23:22 +08:00
thinkgem
aab1af86ab core里单元测试支持类添加 2018-05-08 22:22:01 +08:00
thinkgem
0fc3693b03 日志路径生成优化;在磁盘根目录下BeetlUtil.getWebRoot()报错修正 2018-05-06 00:13:46 +08:00
thinkgem
b2f308148e 集团模式修改为通俗名称:多租户、租户代码、租户名称;代码生成config.xml支持自定义,放同目录下config-custom.xml文件即可覆盖。 2018-05-04 21:37:58 +08:00
thinkgem
4d44442e53 代码生成模块合并到框架包 2018-05-03 22:40:20 +08:00
thinkgem
d0ee5873de update 2018-05-03 22:29:17 +08:00
thinkgem
2523895212 增加 shiro.allowRequestMethods 参数,可指定允许的请求方法,默认GET,POST; TabPanel 增加
onTablePageClose 事件;SpringMVC 优化 MaxFileSize 参数,同
MaxRequestSize;新增PatternValue验证注解,支持从属性文件中读取正则表达式,可修改主键和loginCode的验证正则表达式;优化userService.save方法,支持直接保存password。
2018-05-02 22:09:06 +08:00
thinkgem
a7428360c4 update pom.xml 2018-04-23 20:06:23 +08:00
thinkgem
3ca1bd53e7 合并pulls:https://gitee.com/thinkgem/jeesite4/pulls/3
ZP 修改内容:
1.导入时如果遇到空行可能会出现空指针异常 2.导入时对于带有小数部分得数据可能出现精度丢失得情况,修改后精确到小数点后两位,此处应该可以根据实际情况来配置,或者其他更加好的方法,比如保留所有进度
2018-04-23 19:36:51 +08:00
thinkgem
fb0e94fe6d update 2018-04-23 16:35:52 +08:00
126 changed files with 7901 additions and 5136 deletions

View File

@@ -870,11 +870,11 @@ For more information on this, and how to apply and follow the GNU AGPL, see
简要声明解释:
1. 当前开源代码授权协议采用 AGPL v3 + Apache Licence v2 进行发行。
1. 开源代码授权协议采用 AGPL v3 + Apache Licence v2 进行发行。
2. 您可以免费使用、修改和衍生代码,但不允许修改后和衍生的代码做为闭源软件发布。
3. 修改后和衍生的代码必须也按照AGPL协议进行流通对修改后和衍生的代码必须向社会公开。
4. 如果您修改了代码,需要在被修改的文件中进行说明,并遵守代码格式规范,帮助他人更好的
理解您的用意。
5. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议、版权声明和其他
原作者规定需要包含的说明(请尊重原作者的著作权,不要删除或修改文件中的`@author`信息)。
6. 开源版您可以应用于商业软件,但必须遵循以上条款原则(请协助改进本作品)。
6. 您可以应用于商业软件,但必须遵循以上条款原则(请协助改进本作品)。

View File

@@ -55,25 +55,42 @@ JeeSite 自开源以来已被广大爱好者用到了企业、政府、医疗、
### 开发环境
* **JeeSite 4.0 开发环境部署运行调试Eclipse**
* **开发环境部署运行调试**
<https://my.oschina.net/thinkgem/blog/1625562>
<http://jeesite4.mydoc.io/?t=267354>
# 常见问题
* **常见问题汇总**
* 管理员账号system与admin的区别system为开发者使用的最高级别管理员主要用于开发和调试有些修改会直接影响系统的正常运行admin为客户方使用的系统管理员用于一些基础数据配置如机构、用户、权限、用户字典等。
<http://jeesite4.mydoc.io/?t=284210>
* 下载不到`jeesite-xxx.jar`依赖包:相关包已经发布到`Sonatype Repository`快照仓库,在`web`项目的`pom.xml`里已配置,有可能是你的 Maven `setting.xml`里添加了`mirror``repository`导致的问题,请清理或追加添加`Sonatype Repository`仓库地址,再尝试执行 /web`/bin/package.bat` 脚本预先下载依赖jar包即可。
# 今后如何升级?
* IntelliJ IDEA中提示`NoClassDefFoundError: javax/servlet/ServletOutputStream `错误你只需要修改web项目下的pom.xml,注释掉`spring-boot-starter-tomcat``<scope>provided</scope>`部分改为`<scope>compile</scope>`即可
尽量不修改web项目以外的源码项目如 jeesite-common、jeesite-modele-core如果修改了请 Pull Requests 上来,否则代码编码将与官方不同步,将对你的日后升级带来困难
* 出现NoSuchMethodError错误一般是依赖包版本需要更新请尝试如下操作在web项目上右键选择菜单 -> Maven -> Update Project...或按Alt+F5 -> 点击 Select All 按钮 -> 选择 Force Update of Snapshots/Releases 复选框 -> 点击OK按钮即可。
JeeSite的小版本4.0.x升级是非常便捷的你只需要将 pom.xml 文件中的 parent.version 版本修改到最新版本即可同版本下你可进行Maven快照强制更新即可将最新版的依赖jar更新到本地下面介绍一下在Eclipse里如何操作
* MySql执行`init-data.bat`初始化数据失败,你可尝试设置下 my.ini 给 [mysqld] 增加如下配置:`sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION`
在web项目上右键选择菜单 -> Maven -> Update Project...或按Alt+F5 -> 点击 Select All 按钮 -> 选择 Force Update of Snapshots/Releases 复选框 -> 点击OK按钮即可。
如果进行相对大的版本4.x.x升级这里我们会附加一个声明帮助你进行迁移操作。
# 授权协议声明
1. 已开源的代码,授权协议采用 AGPL v3 + Apache Licence v2 进行发行。
2. 您可以免费使用、修改和衍生代码,但不允许修改后和衍生的代码做为闭源软件发布。
3. 修改后和衍生的代码必须也按照AGPL协议进行流通对修改后和衍生的代码必须向社会公开。
4. 如果您修改了代码,需要在被修改的文件中进行说明,并遵守代码格式规范,帮助他人更好的理解您的用意。
5. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议、版权声明和其他原作者规定需要包含的说明(请尊重原作者的著作权,不要删除或修改文件中的`@author`信息)。
6. 您可以应用于商业软件,但必须遵循以上条款原则(请协助改进本作品)。
7. 关系平台的发展战略考虑,底层部分代码暂未开源,但这不影响您的二次开发。
8. 请知悉社区版用户数不可超过100个最大允许10个用户同时在线不含匿名
### 获得技术服务支持:<http://jeesite4.mydoc.io/?t=267685>
* 随着JeeSite发展我们也需要有相应的资金支持才能持续的开发和维护。支持我们您可以得到一些回报我们有了这些也会把开源事业做的更好请给我们一些动力吧谢谢您的支持
# 技术交流方式
* QQ 群号: <a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=1a1af37857283f4b9da4c9f3ae317a8df8e24611179c09942555af3c17a9f940">`127515876`</a><a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=853cd1af011e3324cd56d110f88b7815933a3b2d40b67775da21bd1b0b1d4b03">`209330483`</a><a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=bc1cdb06c093b18aebd05ad6ef2aea1bba2184a84f66b4d374772209eb3516d7">`223507718`</a>
* QQ 群号: `127515876(已满)` `209330483(已满)` `223507718(已满)` `709534275` `730390092`
* 入群须知目前为付费群刚入群会有5分钟禁言腾讯预设置的无法解除稍等片刻即可正常发言由于群容量有限为了维持运营千人QQ群的所需支付的QQ年费会员费用故开启付费入群模式申请者只需支付少量金额即可加入这样也可以保证只有真实交流需求的人进入避免闲杂做广告人员的乱入新手提问前请先阅读此[【文章】](http://www.dianbo.org/9238/stone/tiwendezhihui.htm)。
* Gitee<https://gitee.com/thinkgem/jeesite4>
* GitHub<https://github.com/thinkgem/jeesite4>
@@ -85,30 +102,6 @@ JeeSite 自开源以来已被广大爱好者用到了企业、政府、医疗、
![https://static.oschina.net/uploads/space/2018/0302/145133_OGZf_941661.jpg](https://static.oschina.net/uploads/space/2018/0302/145133_OGZf_941661.jpg "JeeSite4微信公众号")
# 今后如何升级?
尽量不修改web项目以外的源码项目如jeesite-common、jeesite-modele-core如果修改了请尽量 Pull Requests 上来,否则代码编码将与官方不同步,将对你的日后升级带来困难。
JeeSite的小版本4.0.x升级是非常便捷的你只需要进行Maven快照强制更新即可将最新版的依赖jar更新到本地下面介绍一下在Eclipse里如何操作
在web项目上右键选择菜单 -> Maven -> Update Project...或按Alt+F5 -> 点击 Select All 按钮 -> 选择 Force Update of Snapshots/Releases 复选框 -> 点击OK按钮即可。
如果进行相对大的版本4.x.x升级这里我们会附加一个声明帮助你进行迁移操作。
# 开源协议声明
1. 当前开源代码的授权协议采用 AGPL v3 + Apache Licence v2 进行发行。
2. 您可以免费使用、修改和衍生代码,但不允许修改后和衍生的代码做为闭源软件发布。
3. 修改后和衍生的代码必须也按照AGPL协议进行流通对修改后和衍生的代码必须向社会公开。
4. 如果您修改了代码,需要在被修改的文件中进行说明,并遵守代码格式规范,帮助他人更好的理解您的用意。
5. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议、版权声明和其他原作者规定需要包含的说明(请尊重原作者的著作权,不要删除或修改文件中的`@author`信息)。
6. 开源版您可以应用于商业软件,但必须遵循以上条款原则(请协助改进本作品)。
7. 请知悉开源版用户数不可超过100个最大允许10个用户同时在线不含匿名
### 付费服务:<http://jeesite4.mydoc.io/?t=267685>
* 本服务的推出是我们对您服务的一个保障也是我们的唯一经济来源有了这些我们会把开源事业做的更好让JeeSite能够快速的成长起来请给我们一些动力吧谢谢您的支持
# Git 全局设置技巧
```

View File

@@ -12,6 +12,6 @@ echo.
cd %~dp0
cd ..
call mvn clean javadoc:jar
call mvn clean package -Pjavadoc
pause

View File

@@ -4,11 +4,11 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>4.0-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>4.0.4-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>jeesite-common</artifactId>
<packaging>jar</packaging>
@@ -161,8 +161,8 @@
<!-- Apache HTTP -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- Jsoup HTTP -->

View File

@@ -183,7 +183,7 @@ public class EncodeUtils {
}
// 预编译XSS过滤正则表达式
private static Pattern p1 = Pattern.compile("<\\s*(script|link|style|iframe)(.|\\n)*<\\s*\\/\\s*\\1\\s*>\\s*", Pattern.CASE_INSENSITIVE);
private static Pattern p1 = Pattern.compile("<\\s*(script|link|style|iframe)\\s([\\s\\S]+?)<\\/\\s*\\1\\s*>", Pattern.CASE_INSENSITIVE);
private static Pattern p2 = Pattern.compile("\\s*on[a-z]+\\s*=\\s*(\"[^\"]+\"|'[^']+'|[^\\s]+)\\s*(?=>)", Pattern.CASE_INSENSITIVE);
private static Pattern p3 = Pattern.compile("\\s*(href|src)\\s*=\\s*(\"\\s*(javascript|vbscript):[^\"]+\"|'\\s*(javascript|vbscript):[^']+'|(javascript|vbscript):[^\\s]+)\\s*(?=>)", Pattern.CASE_INSENSITIVE);
private static Pattern p4 = Pattern.compile("epression\\((.|\\n)*\\);?", Pattern.CASE_INSENSITIVE);
@@ -191,7 +191,7 @@ public class EncodeUtils {
/**
* XSS 非法字符过滤
* 内容以<!--HTML-->开头的用以下规则保留标签去掉js脚本
* 1、<(script|link|style|iframe)(.|\n)*<\/\1>\s*
* 1、<\s*(script|link|style|iframe)\s([\s\S]+?)<\/\s*\1\s*>
* 2、\s*on[a-z]+\s*=\s*("[^"]+"|'[^']+'|[^\s]+)\s*(?=>)
* 3、\s*(href|src)\s*=\s*("\s*(javascript|vbscript):[^"]+"|'\s*(javascript|vbscript):[^']+'|(javascript|vbscript):[^\s]+)\s*(?=>)
* 4、epression\((.|\n)*\);?

View File

@@ -3,11 +3,12 @@
*/
package com.jeesite.common.image;
import com.drew.metadata.*;
import com.drew.metadata.exif.*;
import com.drew.imaging.jpeg.*;
import com.drew.lang.*;
import java.io.*;
import java.io.File;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.lang.Rational;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.GpsDirectory;
/**
* 图片地理信息获取

View File

@@ -3,6 +3,7 @@
*/
package com.jeesite.common.io;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
@@ -15,10 +16,12 @@ import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import com.jeesite.common.collect.SetUtils;
import com.jeesite.common.lang.ObjectUtils;
import com.jeesite.common.lang.StringUtils;
/**
* Properties工具类 可载入多个properties、yml文件
@@ -35,7 +38,7 @@ public class PropertiesUtils {
"classpath:config/application.yml",
"classpath:application.yml"};
private static Logger logger = LoggerFactory.getLogger(PropertiesUtils.class);
private static Logger logger = PropertiesUtils.initLogger();
private final Properties properties = new Properties();
@@ -56,6 +59,16 @@ public class PropertiesUtils {
for (String configFile : DEFAULT_CONFIG_FILE){
configFiles.add(configFile);
}
String customConfig = System.getProperty("spring.config.location");
if (StringUtils.isNotBlank(customConfig)){
if (!customConfig.contains("$")){
customConfig = org.springframework.util.StringUtils.cleanPath(customConfig);
if (!ResourceUtils.isUrl(customConfig)){
customConfig = ResourceUtils.FILE_URL_PREFIX + customConfig;
}
}
configFiles.add(customConfig);
}
logger.debug("Loading jeesite config: {}", configFiles);
INSTANCE = new PropertiesUtils(configFiles.toArray(new String[configFiles.size()]));
}
@@ -151,4 +164,25 @@ public class PropertiesUtils {
return value != null ? value : defaultValue;
}
/**
* 初始化日志路径
*/
private static Logger initLogger(){
String logPath = null;
try {
// 获取当前classes目录
logPath = new DefaultResourceLoader().getResource("/").getFile().getPath();
} catch (Exception e) {
// 取不到,取当前工作路径
logPath = System.getProperty("user.dir");
}
// 取当前日志路径下有classes目录则使用classes目录
String classesLogPath = FileUtils.path(logPath + "/WEB-INF/classes");
if (new File(classesLogPath).exists()){
logPath = classesLogPath;
}
System.setProperty("logPath", FileUtils.path(logPath));
return LoggerFactory.getLogger(PropertiesUtils.class);
}
}

View File

@@ -69,7 +69,7 @@ public class ReflectUtils {
}
}
}
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
*/
@@ -141,6 +141,9 @@ public class ReflectUtils {
if (args[i] != null && !args[i].getClass().equals(cs[i])){
if (cs[i] == String.class){
args[i] = ObjectUtils.toString(args[i]);
if(StringUtils.endsWith((String)args[i], ".0")){
args[i] = StringUtils.substringBefore((String)args[i], ".0");
}
}else if (cs[i] == Integer.class){
args[i] = ObjectUtils.toInteger(args[i]);
}else if (cs[i] == Long.class){

View File

@@ -240,7 +240,7 @@ public class ExcelExport {
// 创建工作表
this.createSheet(sheetName, title, headerList, headerWidthList);
}
/**
* 添加到 annotationList
*/
@@ -266,7 +266,7 @@ public class ExcelExport {
}
}
}
/**
* 创建工作表
* @param sheetName 指定Sheet名称

View File

@@ -194,6 +194,9 @@ public class ExcelImport {
*/
public Row getRow(int rownum){
Row row = this.sheet.getRow(rownum);
if (row == null){
return null;
}
// 验证是否是空行如果空行返回null
short cellNum = 0;
short emptyNum = 0;
@@ -254,11 +257,15 @@ public class ExcelImport {
if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
val = cell.getNumericCellValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
val = DateUtil.getJavaDate((Double)val); // POI Excel 日期格式转换
}else{
val = new DecimalFormat("0").format(val);
}
}else if (cell.getCellType() == Cell.CELL_TYPE_STRING){
val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换
}else{
if ((Double) val % 1 > 0){
val = new DecimalFormat("0.00").format(val);
}else{
val = new DecimalFormat("0").format(val);
}
}
}else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
val = cell.getStringCellValue();
}else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA){
try {
@@ -409,34 +416,40 @@ public class ExcelImport {
}
//log.debug("Import value type: ["+i+","+column+"] " + valType);
try {
if (val != null){
if (valType == String.class){
String s = String.valueOf(val.toString());
if(StringUtils.endsWith(s, ".0")){
val = StringUtils.substringBefore(s, ".0");
if (StringUtils.isNotBlank(ef.attrName())){
if (ef.fieldType() != Class.class){
val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val);
}
}else{
if (val != null){
if (valType == String.class){
String s = String.valueOf(val.toString());
if(StringUtils.endsWith(s, ".0")){
val = StringUtils.substringBefore(s, ".0");
}else{
val = String.valueOf(val.toString());
}
}else if (valType == Integer.class){
val = Double.valueOf(val.toString()).intValue();
}else if (valType == Long.class){
val = Double.valueOf(val.toString()).longValue();
}else if (valType == Double.class){
val = Double.valueOf(val.toString());
}else if (valType == Float.class){
val = Float.valueOf(val.toString());
}else if (valType == Date.class){
if (val instanceof String){
val = DateUtils.parseDate(val);
}else if (val instanceof Double){
val = DateUtil.getJavaDate((Double)val); // POI Excel 日期格式转换
}
}else{
val = String.valueOf(val.toString());
}
}else if (valType == Integer.class){
val = Double.valueOf(val.toString()).intValue();
}else if (valType == Long.class){
val = Double.valueOf(val.toString()).longValue();
}else if (valType == Double.class){
val = Double.valueOf(val.toString());
}else if (valType == Float.class){
val = Float.valueOf(val.toString());
}else if (valType == Date.class){
if (val instanceof String){
val = DateUtils.parseDate(val);
}else if (val instanceof Double){
val = DateUtil.getJavaDate((Double)val); // POI Excel 日期格式转换
}
}else{
if (ef.fieldType() != Class.class){
val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString());
}else{
val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),
"fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString());
if (ef.fieldType() != Class.class){
val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString());
}else{
val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),
"fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString());
}
}
}
}
@@ -447,14 +460,18 @@ public class ExcelImport {
exceptionCallback.execute(ex, i, column);
}
// set entity value
if (os[1] instanceof Field){
ReflectUtils.invokeSetter(e, ((Field)os[1]).getName(), val);
}else if (os[1] instanceof Method){
String mthodName = ((Method)os[1]).getName();
if ("get".equals(mthodName.substring(0, 3))){
mthodName = "set"+StringUtils.substringAfter(mthodName, "get");
if (StringUtils.isNotBlank(ef.attrName())){
ReflectUtils.invokeSetter(e, ef.attrName(), val);
}else{
if (os[1] instanceof Field){
ReflectUtils.invokeSetter(e, ((Field)os[1]).getName(), val);
}else if (os[1] instanceof Method){
String mthodName = ((Method)os[1]).getName();
if ("get".equals(mthodName.substring(0, 3))){
mthodName = "set"+StringUtils.substringAfter(mthodName, "get");
}
ReflectUtils.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val});
}
ReflectUtils.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val});
}
}
sb.append(val+", ");
@@ -481,7 +498,7 @@ public class ExcelImport {
// Object val = ei.getCellValue(row, j);
// System.out.print(val+", ");
// }
// System.out.print("\n");
// System.out.println();
// }
//
// }

View File

@@ -677,7 +677,7 @@ Class.pt.callback = function(){
layero.find('.'+ doms[7]).on('click', cancel);
//点遮罩关闭
if(config.shadeClose){
if(config.shadeClose || config.shadeClose == undefined){
$('#layui-layer-shade'+ that.index).on('click', function(){
layer.close(that.index);
});

View File

@@ -183,7 +183,7 @@ html #layuicss-skinlayercss{display: none; position: absolute; width: 1989px;}
/* ThinkGem */
.layui-layer-title {font-weight:bold;font-size:15px;background:#fff;height:45px;line-height:45px;}
.layui-layer-page .layui-layer-content {overflow-x:hidden;}
.layui-layer-page .layui-layer-content .licFile{padding-top:6px;}
.layui-layer-page .layui-layer-content .form-file{padding-top:4px;}
.layui-layer-page .layui-layer-btn, .layui-layer-iframe .layui-layer-btn {
padding-top:3px;padding-bottom:10px;}
.layui-layer-btn .layui-layer-btn0{border-color:#367fa9;background-color: #367fa9;}

View File

@@ -12,6 +12,6 @@ echo.
cd %~dp0
cd ..
call mvn clean javadoc:jar
call mvn clean package -Pjavadoc
pause

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,8 @@
/* Drop Tables */
IF OBJECT_ID('[js_gen_table_column]') IS NOT NULL DROP TABLE [js_gen_table_column];
IF OBJECT_ID('[js_gen_table]') IS NOT NULL DROP TABLE [js_gen_table];
IF OBJECT_ID('[js_sys_company_office]') IS NOT NULL DROP TABLE [js_sys_company_office];
IF OBJECT_ID('[js_sys_employee_post]') IS NOT NULL DROP TABLE [js_sys_employee_post];
IF OBJECT_ID('[js_sys_user_data_scope]') IS NOT NULL DROP TABLE [js_sys_user_data_scope];
@@ -36,6 +38,58 @@ IF OBJECT_ID('[js_sys_role]') IS NOT NULL DROP TABLE [js_sys_role];
/* Create Tables */
-- 代码生成表
CREATE TABLE [js_gen_table]
(
[table_name] varchar(64) NOT NULL,
[class_name] varchar(100) NOT NULL,
[comments] nvarchar(500) NOT NULL,
[parent_table_name] varchar(64),
[parent_table_fk_name] varchar(64),
[tpl_category] varchar(200),
[package_name] varchar(500),
[module_name] varchar(30),
[sub_module_name] varchar(30),
[function_name] nvarchar(200),
[function_name_simple] nvarchar(50),
[function_author] nvarchar(50),
[gen_base_dir] nvarchar(1000),
[options] nvarchar(1000),
[create_by] varchar(64) NOT NULL,
[create_date] datetime NOT NULL,
[update_by] varchar(64) NOT NULL,
[update_date] datetime NOT NULL,
[remarks] nvarchar(500),
PRIMARY KEY ([table_name])
);
-- 代码生成表列
CREATE TABLE [js_gen_table_column]
(
[id] varchar(64) NOT NULL,
[table_name] varchar(64) NOT NULL,
[column_name] varchar(64) NOT NULL,
[column_sort] decimal(10),
[column_type] varchar(100) NOT NULL,
[column_label] nvarchar(50),
[comments] nvarchar(500) NOT NULL,
[attr_name] varchar(200) NOT NULL,
[attr_type] varchar(200) NOT NULL,
[is_pk] char(1),
[is_null] char(1),
[is_insert] char(1),
[is_update] char(1),
[is_list] char(1),
[is_query] char(1),
[query_type] varchar(200),
[is_edit] char(1),
[show_type] varchar(200),
[options] nvarchar(1000),
PRIMARY KEY ([id])
);
-- 行政区划
CREATE TABLE [js_sys_area]
(
@@ -187,7 +241,7 @@ CREATE TABLE [js_sys_dict_type]
(
[id] varchar(64) NOT NULL,
[dict_name] nvarchar(100) NOT NULL,
[dict_type] varchar(100) NOT NULL UNIQUE,
[dict_type] varchar(100) NOT NULL,
[is_sys] char(1) NOT NULL,
[status] char(1) DEFAULT '0' NOT NULL,
[create_by] varchar(64) NOT NULL,
@@ -477,9 +531,9 @@ CREATE TABLE [js_sys_msg_push]
[push_return_msg_id] varchar(200),
[push_return_content] text,
[push_status] char(1),
[push_date] date,
[push_date] datetime,
[read_status] char(1),
[read_date] date,
[read_date] datetime,
PRIMARY KEY ([id])
);
@@ -506,9 +560,9 @@ CREATE TABLE [js_sys_msg_pushed]
[push_return_code] varchar(200),
[push_return_msg_id] varchar(200),
[push_status] char(1),
[push_date] date,
[push_date] datetime,
[read_status] char(1),
[read_date] date,
[read_date] datetime,
PRIMARY KEY ([id])
);
@@ -734,6 +788,8 @@ CREATE TABLE [js_sys_user_role]
/* Create Indexes */
CREATE INDEX [idx_gen_table_ptn] ON [js_gen_table] ();
CREATE INDEX [idx_gen_table_column_tn] ON [js_gen_table_column] ();
CREATE INDEX [idx_sys_area_pc] ON [js_sys_area] ([parent_code]);
CREATE INDEX [idx_sys_area_ts] ON [js_sys_area] ([tree_sort]);
CREATE INDEX [idx_sys_area_status] ON [js_sys_area] ([status]);
@@ -795,6 +851,7 @@ CREATE INDEX [idx_sys_menu_tss] ON [js_sys_menu] ([tree_sorts]);
CREATE INDEX [idx_sys_menu_sc] ON [js_sys_menu] ([sys_code]);
CREATE INDEX [idx_sys_menu_is] ON [js_sys_menu] ([is_show]);
CREATE INDEX [idx_sys_menu_mcs] ON [js_sys_menu] ([module_codes]);
CREATE INDEX [idx_sys_menu_wt] ON [js_sys_menu] ([weight]);
CREATE INDEX [idx_sys_module_status] ON [js_sys_module] ([status]);
CREATE INDEX [idx_sys_msg_inner_cb] ON [js_sys_msg_inner] ([create_by]);
CREATE INDEX [idx_sys_msg_inner_status] ON [js_sys_msg_inner] ([status]);

View File

@@ -2,6 +2,8 @@ SET SESSION FOREIGN_KEY_CHECKS=0;
/* Drop Tables */
DROP TABLE IF EXISTS js_gen_table_column;
DROP TABLE IF EXISTS js_gen_table;
DROP TABLE IF EXISTS js_sys_company_office;
DROP TABLE IF EXISTS js_sys_employee_post;
DROP TABLE IF EXISTS js_sys_user_data_scope;
@@ -37,6 +39,58 @@ DROP TABLE IF EXISTS js_sys_role;
/* Create Tables */
-- 代码生成表
CREATE TABLE js_gen_table
(
table_name varchar(64) NOT NULL COMMENT '表名',
class_name varchar(100) NOT NULL COMMENT '实体类名称',
comments varchar(500) NOT NULL COMMENT '表说明',
parent_table_name varchar(64) COMMENT '关联父表的表名',
parent_table_fk_name varchar(64) COMMENT '本表关联父表的外键名',
tpl_category varchar(200) COMMENT '使用的模板',
package_name varchar(500) COMMENT '生成包路径',
module_name varchar(30) COMMENT '生成模块名',
sub_module_name varchar(30) COMMENT '生成子模块名',
function_name varchar(200) COMMENT '生成功能名',
function_name_simple varchar(50) COMMENT '生成功能名(简写)',
function_author varchar(50) COMMENT '生成功能作者',
gen_base_dir varchar(1000) COMMENT '生成基础路径',
options varchar(1000) COMMENT '其它生成选项',
create_by varchar(64) NOT NULL COMMENT '创建者',
create_date datetime NOT NULL COMMENT '创建时间',
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
PRIMARY KEY (table_name)
) COMMENT = '代码生成表';
-- 代码生成表列
CREATE TABLE js_gen_table_column
(
id varchar(64) NOT NULL COMMENT '编号',
table_name varchar(64) NOT NULL COMMENT '表名',
column_name varchar(64) NOT NULL COMMENT '列名',
column_sort decimal(10) COMMENT '列排序(升序)',
column_type varchar(100) NOT NULL COMMENT '类型',
column_label varchar(50) COMMENT '列标签名',
comments varchar(500) NOT NULL COMMENT '列备注说明',
attr_name varchar(200) NOT NULL COMMENT '类的属性名',
attr_type varchar(200) NOT NULL COMMENT '类的属性类型',
is_pk char(1) COMMENT '是否主键',
is_null char(1) COMMENT '是否可为空',
is_insert char(1) COMMENT '是否插入字段',
is_update char(1) COMMENT '是否更新字段',
is_list char(1) COMMENT '是否列表字段',
is_query char(1) COMMENT '是否查询字段',
query_type varchar(200) COMMENT '查询方式',
is_edit char(1) COMMENT '是否编辑字段',
show_type varchar(200) COMMENT '表单类型',
options varchar(1000) COMMENT '其它生成选项',
PRIMARY KEY (id)
) COMMENT = '代码生成表列';
-- 行政区划
CREATE TABLE js_sys_area
(
@@ -81,8 +135,8 @@ CREATE TABLE js_sys_company
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '归属集团Code',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '归属集团Name',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '租户代码',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '租户名称',
extend_s1 varchar(500) COMMENT '扩展 String 1',
extend_s2 varchar(500) COMMENT '扩展 String 2',
extend_s3 varchar(500) COMMENT '扩展 String 3',
@@ -157,8 +211,8 @@ CREATE TABLE js_sys_dict_data
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '归属集团Code',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '归属集团Name',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '租户代码',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '租户名称',
extend_s1 varchar(500) COMMENT '扩展 String 1',
extend_s2 varchar(500) COMMENT '扩展 String 2',
extend_s3 varchar(500) COMMENT '扩展 String 3',
@@ -196,8 +250,7 @@ CREATE TABLE js_sys_dict_type
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
PRIMARY KEY (id),
UNIQUE (dict_type)
PRIMARY KEY (id)
) COMMENT = '字典类型表';
@@ -217,8 +270,8 @@ CREATE TABLE js_sys_employee
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '归属集团Code',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '归属集团Name',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '租户代码',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '租户名称',
PRIMARY KEY (emp_code)
) COMMENT = '员工表';
@@ -341,8 +394,8 @@ CREATE TABLE js_sys_log
device_name varchar(100) COMMENT '设备名称/操作系统',
browser_name varchar(100) COMMENT '浏览器名称',
execute_time decimal(19) COMMENT '执行时间',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '归属集团Code',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '归属集团Name',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '租户代码',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '租户名称',
PRIMARY KEY (id)
) COMMENT = '操作日志表';
@@ -480,9 +533,9 @@ CREATE TABLE js_sys_msg_push
push_return_msg_id varchar(200) COMMENT '推送返回消息编号',
push_return_content text COMMENT '推送返回的内容信息',
push_status char(1) COMMENT '推送状态0未推送 1成功 2失败',
push_date date COMMENT '推送时间',
push_date datetime COMMENT '推送时间',
read_status char(1) COMMENT '读取状态0未送达 1未读 2已读',
read_date date COMMENT '读取时间',
read_date datetime COMMENT '读取时间',
PRIMARY KEY (id)
) COMMENT = '消息推送表';
@@ -509,9 +562,9 @@ CREATE TABLE js_sys_msg_pushed
push_return_code varchar(200) COMMENT '推送返回结果码',
push_return_msg_id varchar(200) COMMENT '推送返回消息编号',
push_status char(1) COMMENT '推送状态0未推送 1成功 2失败',
push_date date COMMENT '推送时间',
push_date datetime COMMENT '推送时间',
read_status char(1) COMMENT '读取状态0未送达 1未读 2已读',
read_date date COMMENT '读取时间',
read_date datetime COMMENT '读取时间',
PRIMARY KEY (id)
) COMMENT = '消息已推送表';
@@ -561,8 +614,8 @@ CREATE TABLE js_sys_office
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '归属集团Code',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '归属集团Name',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '租户代码',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '租户名称',
extend_s1 varchar(500) COMMENT '扩展 String 1',
extend_s2 varchar(500) COMMENT '扩展 String 2',
extend_s3 varchar(500) COMMENT '扩展 String 3',
@@ -600,8 +653,8 @@ CREATE TABLE js_sys_post
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '归属集团Code',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '归属集团Name',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '租户代码',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '租户名称',
PRIMARY KEY (post_code)
) COMMENT = '员工岗位表';
@@ -622,8 +675,8 @@ CREATE TABLE js_sys_role
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '归属集团Code',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '归属集团Name',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '租户代码',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '租户名称',
PRIMARY KEY (role_code)
) COMMENT = '角色表';
@@ -688,8 +741,8 @@ CREATE TABLE js_sys_user
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '归属集团Code',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '归属集团Name',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '租户代码',
corp_name varchar(100) DEFAULT 'JeeSite' NOT NULL COMMENT '租户名称',
extend_s1 varchar(500) COMMENT '扩展 String 1',
extend_s2 varchar(500) COMMENT '扩展 String 2',
extend_s3 varchar(500) COMMENT '扩展 String 3',
@@ -737,6 +790,8 @@ CREATE TABLE js_sys_user_role
/* Create Indexes */
CREATE INDEX idx_gen_table_ptn ON js_gen_table ();
CREATE INDEX idx_gen_table_column_tn ON js_gen_table_column ();
CREATE INDEX idx_sys_area_pc ON js_sys_area (parent_code ASC);
CREATE INDEX idx_sys_area_ts ON js_sys_area (tree_sort ASC);
CREATE INDEX idx_sys_area_status ON js_sys_area (status ASC);
@@ -798,6 +853,7 @@ CREATE INDEX idx_sys_menu_tss ON js_sys_menu (tree_sorts ASC);
CREATE INDEX idx_sys_menu_sc ON js_sys_menu (sys_code ASC);
CREATE INDEX idx_sys_menu_is ON js_sys_menu (is_show ASC);
CREATE INDEX idx_sys_menu_mcs ON js_sys_menu (module_codes ASC);
CREATE INDEX idx_sys_menu_wt ON js_sys_menu (weight ASC);
CREATE INDEX idx_sys_module_status ON js_sys_module (status ASC);
CREATE INDEX idx_sys_msg_inner_cb ON js_sys_msg_inner (create_by ASC);
CREATE INDEX idx_sys_msg_inner_status ON js_sys_msg_inner (status ASC);

View File

@@ -1,6 +1,8 @@
/* Drop Tables */
DROP TABLE js_gen_table_column CASCADE CONSTRAINTS;
DROP TABLE js_gen_table CASCADE CONSTRAINTS;
DROP TABLE js_sys_company_office CASCADE CONSTRAINTS;
DROP TABLE js_sys_employee_post CASCADE CONSTRAINTS;
DROP TABLE js_sys_user_data_scope CASCADE CONSTRAINTS;
@@ -36,6 +38,58 @@ DROP TABLE js_sys_role CASCADE CONSTRAINTS;
/* Create Tables */
-- 代码生成表
CREATE TABLE js_gen_table
(
table_name varchar2(64) NOT NULL,
class_name varchar2(100) NOT NULL,
comments nvarchar2(500) NOT NULL,
parent_table_name varchar2(64),
parent_table_fk_name varchar2(64),
tpl_category varchar2(200),
package_name varchar2(500),
module_name varchar2(30),
sub_module_name varchar2(30),
function_name nvarchar2(200),
function_name_simple nvarchar2(50),
function_author nvarchar2(50),
gen_base_dir nvarchar2(1000),
options nvarchar2(1000),
create_by varchar2(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar2(64) NOT NULL,
update_date timestamp NOT NULL,
remarks nvarchar2(500),
PRIMARY KEY (table_name)
);
-- 代码生成表列
CREATE TABLE js_gen_table_column
(
id varchar2(64) NOT NULL,
table_name varchar2(64) NOT NULL,
column_name varchar2(64) NOT NULL,
column_sort number(10),
column_type varchar2(100) NOT NULL,
column_label nvarchar2(50),
comments nvarchar2(500) NOT NULL,
attr_name varchar2(200) NOT NULL,
attr_type varchar2(200) NOT NULL,
is_pk char(1),
is_null char(1),
is_insert char(1),
is_update char(1),
is_list char(1),
is_query char(1),
query_type varchar2(200),
is_edit char(1),
show_type varchar2(200),
options nvarchar2(1000),
PRIMARY KEY (id)
);
-- 行政区划
CREATE TABLE js_sys_area
(
@@ -187,7 +241,7 @@ CREATE TABLE js_sys_dict_type
(
id varchar2(64) NOT NULL,
dict_name nvarchar2(100) NOT NULL,
dict_type varchar2(100) NOT NULL UNIQUE,
dict_type varchar2(100) NOT NULL,
is_sys char(1) NOT NULL,
status char(1) DEFAULT '0' NOT NULL,
create_by varchar2(64) NOT NULL,
@@ -477,9 +531,9 @@ CREATE TABLE js_sys_msg_push
push_return_msg_id varchar2(200),
push_return_content clob,
push_status char(1),
push_date date,
push_date timestamp,
read_status char(1),
read_date date,
read_date timestamp,
PRIMARY KEY (id)
);
@@ -506,9 +560,9 @@ CREATE TABLE js_sys_msg_pushed
push_return_code varchar2(200),
push_return_msg_id varchar2(200),
push_status char(1),
push_date date,
push_date timestamp,
read_status char(1),
read_date date,
read_date timestamp,
PRIMARY KEY (id)
);
@@ -734,6 +788,8 @@ CREATE TABLE js_sys_user_role
/* Create Indexes */
CREATE INDEX idx_gen_table_ptn ON js_gen_table ();
CREATE INDEX idx_gen_table_column_tn ON js_gen_table_column ();
CREATE INDEX idx_sys_area_pc ON js_sys_area (parent_code);
CREATE INDEX idx_sys_area_ts ON js_sys_area (tree_sort);
CREATE INDEX idx_sys_area_status ON js_sys_area (status);
@@ -795,6 +851,7 @@ CREATE INDEX idx_sys_menu_tss ON js_sys_menu (tree_sorts);
CREATE INDEX idx_sys_menu_sc ON js_sys_menu (sys_code);
CREATE INDEX idx_sys_menu_is ON js_sys_menu (is_show);
CREATE INDEX idx_sys_menu_mcs ON js_sys_menu (module_codes);
CREATE INDEX idx_sys_menu_wt ON js_sys_menu (weight);
CREATE INDEX idx_sys_module_status ON js_sys_module (status);
CREATE INDEX idx_sys_msg_inner_cb ON js_sys_msg_inner (create_by);
CREATE INDEX idx_sys_msg_inner_status ON js_sys_msg_inner (status);
@@ -861,6 +918,46 @@ CREATE INDEX idx_sys_user_cc ON js_sys_user (corp_code);
/* Comments */
COMMENT ON TABLE js_gen_table IS '代码生成表';
COMMENT ON COLUMN js_gen_table.table_name IS '表名';
COMMENT ON COLUMN js_gen_table.class_name IS '实体类名称';
COMMENT ON COLUMN js_gen_table.comments IS '表说明';
COMMENT ON COLUMN js_gen_table.parent_table_name IS '关联父表的表名';
COMMENT ON COLUMN js_gen_table.parent_table_fk_name IS '本表关联父表的外键名';
COMMENT ON COLUMN js_gen_table.tpl_category IS '使用的模板';
COMMENT ON COLUMN js_gen_table.package_name IS '生成包路径';
COMMENT ON COLUMN js_gen_table.module_name IS '生成模块名';
COMMENT ON COLUMN js_gen_table.sub_module_name IS '生成子模块名';
COMMENT ON COLUMN js_gen_table.function_name IS '生成功能名';
COMMENT ON COLUMN js_gen_table.function_name_simple IS '生成功能名(简写)';
COMMENT ON COLUMN js_gen_table.function_author IS '生成功能作者';
COMMENT ON COLUMN js_gen_table.gen_base_dir IS '生成基础路径';
COMMENT ON COLUMN js_gen_table.options IS '其它生成选项';
COMMENT ON COLUMN js_gen_table.create_by IS '创建者';
COMMENT ON COLUMN js_gen_table.create_date IS '创建时间';
COMMENT ON COLUMN js_gen_table.update_by IS '更新者';
COMMENT ON COLUMN js_gen_table.update_date IS '更新时间';
COMMENT ON COLUMN js_gen_table.remarks IS '备注信息';
COMMENT ON TABLE js_gen_table_column IS '代码生成表列';
COMMENT ON COLUMN js_gen_table_column.id IS '编号';
COMMENT ON COLUMN js_gen_table_column.table_name IS '表名';
COMMENT ON COLUMN js_gen_table_column.column_name IS '列名';
COMMENT ON COLUMN js_gen_table_column.column_sort IS '列排序(升序)';
COMMENT ON COLUMN js_gen_table_column.column_type IS '类型';
COMMENT ON COLUMN js_gen_table_column.column_label IS '列标签名';
COMMENT ON COLUMN js_gen_table_column.comments IS '列备注说明';
COMMENT ON COLUMN js_gen_table_column.attr_name IS '类的属性名';
COMMENT ON COLUMN js_gen_table_column.attr_type IS '类的属性类型';
COMMENT ON COLUMN js_gen_table_column.is_pk IS '是否主键';
COMMENT ON COLUMN js_gen_table_column.is_null IS '是否可为空';
COMMENT ON COLUMN js_gen_table_column.is_insert IS '是否插入字段';
COMMENT ON COLUMN js_gen_table_column.is_update IS '是否更新字段';
COMMENT ON COLUMN js_gen_table_column.is_list IS '是否列表字段';
COMMENT ON COLUMN js_gen_table_column.is_query IS '是否查询字段';
COMMENT ON COLUMN js_gen_table_column.query_type IS '查询方式';
COMMENT ON COLUMN js_gen_table_column.is_edit IS '是否编辑字段';
COMMENT ON COLUMN js_gen_table_column.show_type IS '表单类型';
COMMENT ON COLUMN js_gen_table_column.options IS '其它生成选项';
COMMENT ON TABLE js_sys_area IS '行政区划';
COMMENT ON COLUMN js_sys_area.area_code IS '区域编码';
COMMENT ON COLUMN js_sys_area.parent_code IS '父级编号';
@@ -897,8 +994,8 @@ COMMENT ON COLUMN js_sys_company.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_company.update_by IS '更新者';
COMMENT ON COLUMN js_sys_company.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_company.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_company.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_company.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_company.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_company.corp_name IS '租户名称';
COMMENT ON COLUMN js_sys_company.extend_s1 IS '扩展 String 1';
COMMENT ON COLUMN js_sys_company.extend_s2 IS '扩展 String 2';
COMMENT ON COLUMN js_sys_company.extend_s3 IS '扩展 String 3';
@@ -955,8 +1052,8 @@ COMMENT ON COLUMN js_sys_dict_data.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_dict_data.update_by IS '更新者';
COMMENT ON COLUMN js_sys_dict_data.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_dict_data.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_dict_data.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_dict_data.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_dict_data.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_dict_data.corp_name IS '租户名称';
COMMENT ON COLUMN js_sys_dict_data.extend_s1 IS '扩展 String 1';
COMMENT ON COLUMN js_sys_dict_data.extend_s2 IS '扩展 String 2';
COMMENT ON COLUMN js_sys_dict_data.extend_s3 IS '扩展 String 3';
@@ -1002,8 +1099,8 @@ COMMENT ON COLUMN js_sys_employee.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_employee.update_by IS '更新者';
COMMENT ON COLUMN js_sys_employee.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_employee.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_employee.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_employee.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_employee.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_employee.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_employee_post IS '员工与岗位关联表';
COMMENT ON COLUMN js_sys_employee_post.emp_code IS '员工编码';
COMMENT ON COLUMN js_sys_employee_post.post_code IS '岗位编码';
@@ -1083,8 +1180,8 @@ COMMENT ON COLUMN js_sys_log.user_agent IS '用户代理';
COMMENT ON COLUMN js_sys_log.device_name IS '设备名称/操作系统';
COMMENT ON COLUMN js_sys_log.browser_name IS '浏览器名称';
COMMENT ON COLUMN js_sys_log.execute_time IS '执行时间';
COMMENT ON COLUMN js_sys_log.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_log.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_log.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_log.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_menu IS '菜单表';
COMMENT ON COLUMN js_sys_menu.menu_code IS '菜单编码';
COMMENT ON COLUMN js_sys_menu.parent_code IS '父级编号';
@@ -1255,8 +1352,8 @@ COMMENT ON COLUMN js_sys_office.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_office.update_by IS '更新者';
COMMENT ON COLUMN js_sys_office.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_office.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_office.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_office.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_office.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_office.corp_name IS '租户名称';
COMMENT ON COLUMN js_sys_office.extend_s1 IS '扩展 String 1';
COMMENT ON COLUMN js_sys_office.extend_s2 IS '扩展 String 2';
COMMENT ON COLUMN js_sys_office.extend_s3 IS '扩展 String 3';
@@ -1288,8 +1385,8 @@ COMMENT ON COLUMN js_sys_post.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_post.update_by IS '更新者';
COMMENT ON COLUMN js_sys_post.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_post.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_post.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_post.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_post.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_post.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_role IS '角色表';
COMMENT ON COLUMN js_sys_role.role_code IS '角色编码';
COMMENT ON COLUMN js_sys_role.role_name IS '角色名称';
@@ -1304,8 +1401,8 @@ COMMENT ON COLUMN js_sys_role.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_role.update_by IS '更新者';
COMMENT ON COLUMN js_sys_role.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_role.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_role.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_role.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_role.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_role.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_role_data_scope IS '角色数据权限表';
COMMENT ON COLUMN js_sys_role_data_scope.role_code IS '控制角色编码';
COMMENT ON COLUMN js_sys_role_data_scope.ctrl_type IS '控制类型';
@@ -1352,8 +1449,8 @@ COMMENT ON COLUMN js_sys_user.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_user.update_by IS '更新者';
COMMENT ON COLUMN js_sys_user.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_user.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_user.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_user.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_user.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_user.corp_name IS '租户名称';
COMMENT ON COLUMN js_sys_user.extend_s1 IS '扩展 String 1';
COMMENT ON COLUMN js_sys_user.extend_s2 IS '扩展 String 2';
COMMENT ON COLUMN js_sys_user.extend_s3 IS '扩展 String 3';

View File

@@ -1,6 +1,8 @@
/* Drop Tables */
DROP TABLE IF EXISTS js_gen_table_column;
DROP TABLE IF EXISTS js_gen_table;
DROP TABLE IF EXISTS js_sys_company_office;
DROP TABLE IF EXISTS js_sys_employee_post;
DROP TABLE IF EXISTS js_sys_user_data_scope;
@@ -36,6 +38,58 @@ DROP TABLE IF EXISTS js_sys_role;
/* Create Tables */
-- 代码生成表
CREATE TABLE js_gen_table
(
table_name varchar(64) NOT NULL,
class_name varchar(100) NOT NULL,
comments varchar(500) NOT NULL,
parent_table_name varchar(64),
parent_table_fk_name varchar(64),
tpl_category varchar(200),
package_name varchar(500),
module_name varchar(30),
sub_module_name varchar(30),
function_name varchar(200),
function_name_simple varchar(50),
function_author varchar(50),
gen_base_dir varchar(1000),
options varchar(1000),
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks varchar(500),
PRIMARY KEY (table_name)
) WITHOUT OIDS;
-- 代码生成表列
CREATE TABLE js_gen_table_column
(
id varchar(64) NOT NULL,
table_name varchar(64) NOT NULL,
column_name varchar(64) NOT NULL,
column_sort decimal(10),
column_type varchar(100) NOT NULL,
column_label varchar(50),
comments varchar(500) NOT NULL,
attr_name varchar(200) NOT NULL,
attr_type varchar(200) NOT NULL,
is_pk char(1),
is_null char(1),
is_insert char(1),
is_update char(1),
is_list char(1),
is_query char(1),
query_type varchar(200),
is_edit char(1),
show_type varchar(200),
options varchar(1000),
PRIMARY KEY (id)
) WITHOUT OIDS;
-- 行政区划
CREATE TABLE js_sys_area
(
@@ -187,7 +241,7 @@ CREATE TABLE js_sys_dict_type
(
id varchar(64) NOT NULL,
dict_name varchar(100) NOT NULL,
dict_type varchar(100) NOT NULL UNIQUE,
dict_type varchar(100) NOT NULL,
is_sys char(1) NOT NULL,
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
@@ -477,9 +531,9 @@ CREATE TABLE js_sys_msg_push
push_return_msg_id varchar(200),
push_return_content text,
push_status char(1),
push_date date,
push_date timestamp,
read_status char(1),
read_date date,
read_date timestamp,
PRIMARY KEY (id)
) WITHOUT OIDS;
@@ -506,9 +560,9 @@ CREATE TABLE js_sys_msg_pushed
push_return_code varchar(200),
push_return_msg_id varchar(200),
push_status char(1),
push_date date,
push_date timestamp,
read_status char(1),
read_date date,
read_date timestamp,
PRIMARY KEY (id)
) WITHOUT OIDS;
@@ -734,6 +788,8 @@ CREATE TABLE js_sys_user_role
/* Create Indexes */
CREATE INDEX idx_gen_table_ptn ON js_gen_table ();
CREATE INDEX idx_gen_table_column_tn ON js_gen_table_column ();
CREATE INDEX idx_sys_area_pc ON js_sys_area (parent_code);
CREATE INDEX idx_sys_area_ts ON js_sys_area (tree_sort);
CREATE INDEX idx_sys_area_status ON js_sys_area (status);
@@ -795,6 +851,7 @@ CREATE INDEX idx_sys_menu_tss ON js_sys_menu (tree_sorts);
CREATE INDEX idx_sys_menu_sc ON js_sys_menu (sys_code);
CREATE INDEX idx_sys_menu_is ON js_sys_menu (is_show);
CREATE INDEX idx_sys_menu_mcs ON js_sys_menu (module_codes);
CREATE INDEX idx_sys_menu_wt ON js_sys_menu (weight);
CREATE INDEX idx_sys_module_status ON js_sys_module (status);
CREATE INDEX idx_sys_msg_inner_cb ON js_sys_msg_inner (create_by);
CREATE INDEX idx_sys_msg_inner_status ON js_sys_msg_inner (status);
@@ -861,6 +918,46 @@ CREATE INDEX idx_sys_user_cc ON js_sys_user (corp_code);
/* Comments */
COMMENT ON TABLE js_gen_table IS '代码生成表';
COMMENT ON COLUMN js_gen_table.table_name IS '表名';
COMMENT ON COLUMN js_gen_table.class_name IS '实体类名称';
COMMENT ON COLUMN js_gen_table.comments IS '表说明';
COMMENT ON COLUMN js_gen_table.parent_table_name IS '关联父表的表名';
COMMENT ON COLUMN js_gen_table.parent_table_fk_name IS '本表关联父表的外键名';
COMMENT ON COLUMN js_gen_table.tpl_category IS '使用的模板';
COMMENT ON COLUMN js_gen_table.package_name IS '生成包路径';
COMMENT ON COLUMN js_gen_table.module_name IS '生成模块名';
COMMENT ON COLUMN js_gen_table.sub_module_name IS '生成子模块名';
COMMENT ON COLUMN js_gen_table.function_name IS '生成功能名';
COMMENT ON COLUMN js_gen_table.function_name_simple IS '生成功能名(简写)';
COMMENT ON COLUMN js_gen_table.function_author IS '生成功能作者';
COMMENT ON COLUMN js_gen_table.gen_base_dir IS '生成基础路径';
COMMENT ON COLUMN js_gen_table.options IS '其它生成选项';
COMMENT ON COLUMN js_gen_table.create_by IS '创建者';
COMMENT ON COLUMN js_gen_table.create_date IS '创建时间';
COMMENT ON COLUMN js_gen_table.update_by IS '更新者';
COMMENT ON COLUMN js_gen_table.update_date IS '更新时间';
COMMENT ON COLUMN js_gen_table.remarks IS '备注信息';
COMMENT ON TABLE js_gen_table_column IS '代码生成表列';
COMMENT ON COLUMN js_gen_table_column.id IS '编号';
COMMENT ON COLUMN js_gen_table_column.table_name IS '表名';
COMMENT ON COLUMN js_gen_table_column.column_name IS '列名';
COMMENT ON COLUMN js_gen_table_column.column_sort IS '列排序(升序)';
COMMENT ON COLUMN js_gen_table_column.column_type IS '类型';
COMMENT ON COLUMN js_gen_table_column.column_label IS '列标签名';
COMMENT ON COLUMN js_gen_table_column.comments IS '列备注说明';
COMMENT ON COLUMN js_gen_table_column.attr_name IS '类的属性名';
COMMENT ON COLUMN js_gen_table_column.attr_type IS '类的属性类型';
COMMENT ON COLUMN js_gen_table_column.is_pk IS '是否主键';
COMMENT ON COLUMN js_gen_table_column.is_null IS '是否可为空';
COMMENT ON COLUMN js_gen_table_column.is_insert IS '是否插入字段';
COMMENT ON COLUMN js_gen_table_column.is_update IS '是否更新字段';
COMMENT ON COLUMN js_gen_table_column.is_list IS '是否列表字段';
COMMENT ON COLUMN js_gen_table_column.is_query IS '是否查询字段';
COMMENT ON COLUMN js_gen_table_column.query_type IS '查询方式';
COMMENT ON COLUMN js_gen_table_column.is_edit IS '是否编辑字段';
COMMENT ON COLUMN js_gen_table_column.show_type IS '表单类型';
COMMENT ON COLUMN js_gen_table_column.options IS '其它生成选项';
COMMENT ON TABLE js_sys_area IS '行政区划';
COMMENT ON COLUMN js_sys_area.area_code IS '区域编码';
COMMENT ON COLUMN js_sys_area.parent_code IS '父级编号';
@@ -897,8 +994,8 @@ COMMENT ON COLUMN js_sys_company.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_company.update_by IS '更新者';
COMMENT ON COLUMN js_sys_company.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_company.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_company.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_company.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_company.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_company.corp_name IS '租户名称';
COMMENT ON COLUMN js_sys_company.extend_s1 IS '扩展 String 1';
COMMENT ON COLUMN js_sys_company.extend_s2 IS '扩展 String 2';
COMMENT ON COLUMN js_sys_company.extend_s3 IS '扩展 String 3';
@@ -955,8 +1052,8 @@ COMMENT ON COLUMN js_sys_dict_data.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_dict_data.update_by IS '更新者';
COMMENT ON COLUMN js_sys_dict_data.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_dict_data.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_dict_data.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_dict_data.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_dict_data.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_dict_data.corp_name IS '租户名称';
COMMENT ON COLUMN js_sys_dict_data.extend_s1 IS '扩展 String 1';
COMMENT ON COLUMN js_sys_dict_data.extend_s2 IS '扩展 String 2';
COMMENT ON COLUMN js_sys_dict_data.extend_s3 IS '扩展 String 3';
@@ -1002,8 +1099,8 @@ COMMENT ON COLUMN js_sys_employee.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_employee.update_by IS '更新者';
COMMENT ON COLUMN js_sys_employee.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_employee.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_employee.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_employee.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_employee.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_employee.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_employee_post IS '员工与岗位关联表';
COMMENT ON COLUMN js_sys_employee_post.emp_code IS '员工编码';
COMMENT ON COLUMN js_sys_employee_post.post_code IS '岗位编码';
@@ -1083,8 +1180,8 @@ COMMENT ON COLUMN js_sys_log.user_agent IS '用户代理';
COMMENT ON COLUMN js_sys_log.device_name IS '设备名称/操作系统';
COMMENT ON COLUMN js_sys_log.browser_name IS '浏览器名称';
COMMENT ON COLUMN js_sys_log.execute_time IS '执行时间';
COMMENT ON COLUMN js_sys_log.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_log.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_log.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_log.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_menu IS '菜单表';
COMMENT ON COLUMN js_sys_menu.menu_code IS '菜单编码';
COMMENT ON COLUMN js_sys_menu.parent_code IS '父级编号';
@@ -1255,8 +1352,8 @@ COMMENT ON COLUMN js_sys_office.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_office.update_by IS '更新者';
COMMENT ON COLUMN js_sys_office.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_office.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_office.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_office.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_office.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_office.corp_name IS '租户名称';
COMMENT ON COLUMN js_sys_office.extend_s1 IS '扩展 String 1';
COMMENT ON COLUMN js_sys_office.extend_s2 IS '扩展 String 2';
COMMENT ON COLUMN js_sys_office.extend_s3 IS '扩展 String 3';
@@ -1288,8 +1385,8 @@ COMMENT ON COLUMN js_sys_post.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_post.update_by IS '更新者';
COMMENT ON COLUMN js_sys_post.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_post.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_post.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_post.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_post.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_post.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_role IS '角色表';
COMMENT ON COLUMN js_sys_role.role_code IS '角色编码';
COMMENT ON COLUMN js_sys_role.role_name IS '角色名称';
@@ -1304,8 +1401,8 @@ COMMENT ON COLUMN js_sys_role.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_role.update_by IS '更新者';
COMMENT ON COLUMN js_sys_role.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_role.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_role.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_role.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_role.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_role.corp_name IS '租户名称';
COMMENT ON TABLE js_sys_role_data_scope IS '角色数据权限表';
COMMENT ON COLUMN js_sys_role_data_scope.role_code IS '控制角色编码';
COMMENT ON COLUMN js_sys_role_data_scope.ctrl_type IS '控制类型';
@@ -1352,8 +1449,8 @@ COMMENT ON COLUMN js_sys_user.create_date IS '创建时间';
COMMENT ON COLUMN js_sys_user.update_by IS '更新者';
COMMENT ON COLUMN js_sys_user.update_date IS '更新时间';
COMMENT ON COLUMN js_sys_user.remarks IS '备注信息';
COMMENT ON COLUMN js_sys_user.corp_code IS '归属集团Code';
COMMENT ON COLUMN js_sys_user.corp_name IS '归属集团Name';
COMMENT ON COLUMN js_sys_user.corp_code IS '租户代码';
COMMENT ON COLUMN js_sys_user.corp_name IS '租户名称';
COMMENT ON COLUMN js_sys_user.extend_s1 IS '扩展 String 1';
COMMENT ON COLUMN js_sys_user.extend_s2 IS '扩展 String 2';
COMMENT ON COLUMN js_sys_user.extend_s3 IS '扩展 String 3';

View File

@@ -4,11 +4,11 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>4.0-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>4.0.4-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>
<artifactId>jeesite-module-core</artifactId>
<packaging>jar</packaging>
@@ -35,13 +35,6 @@
<version>${project.parent.version}</version>
</dependency>
<!-- 代码生成模块 -->
<dependency>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-module-devtools</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
<build>
@@ -82,7 +75,7 @@
<snapshots><enabled>false</enabled></snapshots>
</repository>
<repository>
<id>sonatype-repos-s</id>
<id>sonatype-repos-s</id>
<name>Sonatype Repository</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases><enabled>false</enabled></releases>
@@ -100,7 +93,7 @@
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</project>

View File

@@ -16,6 +16,7 @@ import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.util.WebUtils;
import com.jeesite.common.config.Global;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.web.http.ServletUtils;
import com.jeesite.common.web.http.wrapper.GetHttpServletRequestWrapper;
@@ -66,7 +67,11 @@ public class PermissionsAuthorizationFilter extends org.apache.shiro.web.filter.
public static void redirectToDefaultPath(ServletRequest request, ServletResponse response) throws IOException {
// AJAX不支持Redirect改用Forward
String loginUrl = Global.getProperty("shiro.defaultPath");
if (ServletUtils.isAjaxRequest((HttpServletRequest) request)) {
HttpServletRequest req = ((HttpServletRequest) request);
if (StringUtils.equals(req.getContextPath()+loginUrl, req.getRequestURI())){
loginUrl = Global.getProperty("shiro.loginUrl");
}
if (ServletUtils.isAjaxRequest(req)) {
try {
request.getRequestDispatcher(loginUrl).forward(
new GetHttpServletRequestWrapper(request), response);

View File

@@ -3,6 +3,8 @@
*/
package com.jeesite.common.utils.excel.fieldtype;
import java.util.List;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.modules.sys.entity.Area;
import com.jeesite.modules.sys.utils.AreaUtils;
@@ -15,11 +17,18 @@ import com.jeesite.modules.sys.utils.AreaUtils;
*/
public class AreaType {
private static ThreadLocal<List<Area>> cache = new ThreadLocal<>();
/**
* 获取对象值(导入)
*/
public static Object getValue(String val) {
for (Area e : AreaUtils.getAreaAllList()){
List<Area> cacheList = cache.get();
if (cacheList == null){
cacheList = AreaUtils.getAreaAllList();
cache.set(cacheList);
}
for (Area e : cacheList){
if (StringUtils.trimToEmpty(val).equals(e.getAreaName())){
return e;
}

View File

@@ -3,6 +3,8 @@
*/
package com.jeesite.common.utils.excel.fieldtype;
import java.util.List;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.modules.sys.entity.Company;
import com.jeesite.modules.sys.utils.EmpUtils;
@@ -15,11 +17,18 @@ import com.jeesite.modules.sys.utils.EmpUtils;
*/
public class CompanyType {
private static ThreadLocal<List<Company>> cache = new ThreadLocal<>();
/**
* 获取对象值(导入)
*/
public static Object getValue(String val) {
for (Company e : EmpUtils.getCompanyAllList()){
List<Company> cacheList = cache.get();
if (cacheList == null){
cacheList = EmpUtils.getCompanyAllList();
cache.set(cacheList);
}
for (Company e : cacheList){
if (StringUtils.trimToEmpty(val).equals(e.getCompanyName())){
return e;
}

View File

@@ -3,6 +3,8 @@
*/
package com.jeesite.common.utils.excel.fieldtype;
import java.util.List;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.modules.sys.entity.Office;
import com.jeesite.modules.sys.utils.EmpUtils;
@@ -15,11 +17,18 @@ import com.jeesite.modules.sys.utils.EmpUtils;
*/
public class OfficeType {
private static ThreadLocal<List<Office>> cache = new ThreadLocal<>();
/**
* 获取对象值(导入)
*/
public static Object getValue(String val) {
for (Office e : EmpUtils.getOfficeAllList()){
List<Office> cacheList = cache.get();
if (cacheList == null){
cacheList = EmpUtils.getOfficeAllList();
cache.set(cacheList);
}
for (Office e : cacheList){
if (StringUtils.trimToEmpty(val).equals(e.getOfficeName())){
return e;
}

View File

@@ -27,13 +27,13 @@ public class PostListType {
*/
public static Object getValue(String val) {
List<Post> postList = ListUtils.newArrayList();
List<Post> allPostList = cache.get();
if (allPostList == null){
allPostList = postService.findList(new Post());
cache.set(allPostList); // 不知道会不会引起内存泄露,先这样用着
List<Post> cacheList = cache.get();
if (cacheList == null){
cacheList = postService.findList(new Post());
cache.set(cacheList);
}
for (String s : StringUtils.split(val, ",")) {
for (Post e : allPostList) {
for (Post e : cacheList) {
if (StringUtils.trimToEmpty(s).equals(e.getPostName())) {
postList.add(e);
}

View File

@@ -13,7 +13,7 @@ import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
/**
* Servlet 配置
* Druid 配置
* @author ThinkGem
* @version 2017年11月30日
*/

View File

@@ -1,27 +0,0 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.state.web;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* EhCache管理
* @author ThinkGem
* @version 2017年12月31日
*/
@Controller
@RequestMapping(value="${adminPath}/state/ehcache")
public class EhCacheController {
@RequiresPermissions("sys:stste:ehcache")
@RequestMapping(value="")
public String index(Model model){
model.addAttribute("message", "正在研发中,敬请期待!");
return "modules/state/ehcacheIndex";
}
}

View File

@@ -1,27 +0,0 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.state.web;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 服务器状态
* @author ThinkGem
* @version 2017年12月31日
*/
@Controller
@RequestMapping(value="${adminPath}/state/server")
public class ServerStateController {
@RequiresPermissions("sys:state:server")
@RequestMapping(value="")
public String index(Model model){
model.addAttribute("message", "正在研发中,敬请期待!");
return "modules/state/serverIndex";
}
}

View File

@@ -11,7 +11,7 @@ import com.jeesite.modules.sys.entity.EmpUser;
/**
* 员工管理DAO接口
* @author ThinkGem
* @version 2015-4-24
* @version 2017-03-25
*/
@MyBatisDao(dataSourceName=DataSourceHolder.DEFAULT)
public interface EmpUserDao extends CrudDao<EmpUser> {

View File

@@ -3,11 +3,21 @@
*/
package com.jeesite.modules.sys.db;
import org.quartz.CronTrigger;
import org.springframework.beans.factory.annotation.Autowired;
import com.jeesite.common.callback.MethodCallback;
import com.jeesite.common.config.Global;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.tests.BaseInitDataTests;
import com.jeesite.modules.gen.entity.GenTable;
import com.jeesite.modules.gen.entity.GenTableColumn;
import com.jeesite.modules.gen.service.GenTableService;
import com.jeesite.modules.job.entity.JobEntity;
import com.jeesite.modules.job.service.JobService;
import com.jeesite.modules.msg.task.impl.MsgLocalMergePushTask;
import com.jeesite.modules.msg.task.impl.MsgLocalPushTask;
import com.jeesite.modules.sys.dao.RoleMenuDao;
import com.jeesite.modules.sys.entity.Area;
import com.jeesite.modules.sys.entity.Company;
@@ -61,6 +71,7 @@ public class InitCoreData extends BaseInitDataTests {
public void createTable() throws Exception{
runScript("core.sql");
runScript("job.sql");
runScript("test.sql");
}
/**
@@ -246,7 +257,6 @@ public class InitCoreData extends BaseInitDataTests {
if("save".equals(action)){
User entity = (User)params[1];
entity.setIsNewRecord(true);
entity.setPassword(UserService.encryptPassword(entity.getPassword()));
userService.save(entity);
return null;
}
@@ -349,7 +359,6 @@ public class InitCoreData extends BaseInitDataTests {
else if("save".equals(action)){
EmpUser entity = (EmpUser)params[1];
entity.setIsNewRecord(true);
entity.setPassword(UserService.encryptPassword(entity.getPassword()));
empUserService.save(entity);
// 设置当前为管理员,否则无法保存用户角色关系
entity.setCurrentUser(new User(User.SUPER_ADMIN_CODE));
@@ -360,4 +369,159 @@ public class InitCoreData extends BaseInitDataTests {
}
});
}
@Autowired
private JobService jobService;
/**
* 初始化消息推送服务
*/
public void initMsgPushJob(){
JobEntity job = new JobEntity(MsgLocalPushTask.class.getSimpleName(), "SYSTEM");
job.setDescription("消息推送服务 (实时推送)");
job.setInvokeTarget("msgLocalPushTask.execute()");
job.setCronExpression("0/3 * * * * ?");
job.setConcurrent(Global.NO);
job.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
job.setStatus(JobEntity.STATUS_PAUSED);
jobService.insert(job);
job = new JobEntity(MsgLocalMergePushTask.class.getSimpleName(), "SYSTEM");
job.setDescription("消息推送服务 (延迟推送)");
job.setInvokeTarget("msgLocalMergePushTask.execute()");
job.setCronExpression("0 0/30 * * * ?");
job.setConcurrent(Global.NO);
job.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
job.setStatus(JobEntity.STATUS_PAUSED);
jobService.insert(job);
}
@Autowired
private GenTableService genTableService;
/**
* 代码生成测试数据
*/
public void initGenTestData() throws Exception{
GenTable genTable = new GenTable();
genTable.setIsNewRecord(true);
genTable.setTableName("test_data");
genTable = genTableService.getFromDb(genTable);
genTable.setIsNewRecord(true);
genTable.setClassName("TestData");
genTable.setFunctionAuthor("ThinkGem");
genTable.setTplCategory("crud");
genTable.setPackageName("com.jeesite.modules");
genTable.setModuleName("test");
genTable.setSubModuleName("");
genTable.setFunctionName("测试数据");
genTable.setFunctionNameSimple("数据");
genTable.getOptionMap().put("isHaveDisableEnable", Global.YES);
genTable.getOptionMap().put("isHaveDelete", Global.YES);
genTable.getOptionMap().put("isFileUpload", Global.YES);
genTable.getOptionMap().put("isImageUpload", Global.YES);
initGenTableColumn(genTable);
genTableService.save(genTable);
// 子表
GenTable genTableChild = new GenTable();
genTableChild.setIsNewRecord(true);
genTableChild.setTableName("test_data_child");
genTableChild = genTableService.getFromDb(genTableChild);
genTableChild.setIsNewRecord(true);
genTableChild.setClassName("TestDataChild");
genTableChild.setFunctionAuthor("ThinkGem");
genTableChild.setTplCategory("crud");
genTableChild.setPackageName("com.jeesite.modules");
genTableChild.setModuleName("test");
genTableChild.setSubModuleName("");
genTableChild.setFunctionName("测试子表");
genTableChild.setFunctionNameSimple("数据");
genTableChild.setParentTableName("test_data");
genTableChild.setParentTableFkName("test_data_id");
initGenTableColumn(genTableChild);
genTableService.save(genTableChild);
}
/**
* 代码生成测试数据(列初始化)
*/
private void initGenTableColumn(GenTable genTable){
for(GenTableColumn column : genTable.getColumnList()){
if ("test_input".equals(column.getColumnName())
|| "test_textarea".equals(column.getColumnName())
|| "test_select".equals(column.getColumnName())
|| "test_select_multiple".equals(column.getColumnName())
|| "test_checkbox".equals(column.getColumnName())
|| "test_radio".equals(column.getColumnName())
|| "test_date".equals(column.getColumnName())
|| "test_datetime".equals(column.getColumnName())
){
column.setShowType(StringUtils.substringAfter(
column.getColumnName(), "test_"));
if ("test_input".equals(column.getColumnName())
){
column.setQueryType("LIKE");
}
else if ("test_textarea".equals(column.getColumnName())
){
column.setQueryType("LIKE");
column.getOptionMap().put("isNewLine", Global.YES);
column.getOptionMap().put("gridRowCol", "12/2/10");
}
else if ("test_select".equals(column.getColumnName())
|| "test_select_multiple".equals(column.getColumnName())
|| "test_radio".equals(column.getColumnName())
|| "test_checkbox".equals(column.getColumnName())
){
column.getOptionMap().put("dictType", "sys_menu_type");
column.getOptionMap().put("dictName", "sys_menu_type");
}
else if ("test_date".equals(column.getColumnName())
|| "test_datetime".equals(column.getColumnName())
){
column.setQueryType("BETWEEN");
}
}else if ("test_user_code".equals(column.getColumnName())){
column.setAttrType("com.jeesite.modules.sys.entity.User");
column.setFullAttrName("testUser");
column.setShowType("userselect");
}else if ("test_office_code".equals(column.getColumnName())){
column.setAttrType("com.jeesite.modules.sys.entity.Office");
column.setFullAttrName("testOffice");
column.setShowType("officeselect");
}else if ("test_area_code".equals(column.getColumnName())){
column.setFullAttrName("testAreaCode|testAreaName");
column.setShowType("areaselect");
}else if ("test_area_name".equals(column.getColumnName())){
column.setIsEdit(Global.NO);
column.setIsQuery(Global.NO);
}else if ("test_data_id".equals(column.getColumnName())){
column.setFullAttrName("testData");
}
}
}
/**
* 代码生成树表测试数据
*/
public void initGenTreeData() throws Exception{
GenTable genTable = new GenTable();
genTable.setIsNewRecord(true);
genTable.setTableName("test_tree");
genTable = genTableService.getFromDb(genTable);
genTable.setIsNewRecord(true);
genTable.setClassName("TestTree");
genTable.setFunctionAuthor("ThinkGem");
genTable.setTplCategory("treeGrid");
genTable.setPackageName("com.jeesite.modules");
genTable.setModuleName("test");
genTable.setSubModuleName("");
genTable.setFunctionName("测试树表");
genTable.setFunctionNameSimple("数据");
genTable.getOptionMap().put("isHaveDisableEnable", Global.YES);
genTable.getOptionMap().put("isHaveDelete", Global.YES);
genTable.getOptionMap().put("isFileUpload", Global.YES);
genTable.getOptionMap().put("isImageUpload", Global.YES);
genTable.getOptionMap().put("treeViewCode", "tree_code");
genTable.getOptionMap().put("treeViewName", "tree_name");
initGenTableColumn(genTable);
genTableService.save(genTable);
}
}

View File

@@ -13,7 +13,8 @@ import com.jeesite.common.mybatis.mapper.query.QueryType;
import com.jeesite.common.utils.excel.annotation.ExcelField;
import com.jeesite.common.utils.excel.annotation.ExcelField.Align;
import com.jeesite.common.utils.excel.annotation.ExcelFields;
import com.jeesite.common.utils.excel.fieldtype.RoleListType;
import com.jeesite.common.utils.excel.fieldtype.CompanyType;
import com.jeesite.common.utils.excel.fieldtype.OfficeType;
/**
* 员工用户管理Entity
@@ -25,7 +26,9 @@ import com.jeesite.common.utils.excel.fieldtype.RoleListType;
}, joinTable={
@JoinTable(type=Type.JOIN, entity=Employee.class, alias="e",
on="e.emp_code=a.ref_code AND a.user_type=#{USER_TYPE_EMPLOYEE}",
attrName="employee", columns={@Column(includeEntity=Employee.class)}),
attrName="employee", columns={
@Column(includeEntity=Employee.class)
}),
@JoinTable(type=Type.LEFT_JOIN, entity=Office.class, alias="o",
on="o.office_code=e.office_code", attrName="employee.office",
columns={
@@ -74,17 +77,17 @@ public class EmpUser extends User {
@Valid
@ExcelFields({
@ExcelField(title="归属机构", attrName="office.officeName", align=Align.CENTER, sort=10),
@ExcelField(title="归属公司", attrName="company.officeName", align = Align.CENTER, sort=20),
@ExcelField(title="归属机构", attrName="employee.office", align=Align.CENTER, sort=10, fieldType=OfficeType.class),
@ExcelField(title="归属公司", attrName="employee.company", align = Align.CENTER, sort=20, fieldType=CompanyType.class),
@ExcelField(title="登录账号", attrName="loginCode", align=Align.CENTER, sort=30),
@ExcelField(title="用户昵称", attrName="userName", align=Align.LEFT, sort=40),
@ExcelField(title="用户昵称", attrName="userName", align=Align.CENTER, sort=40),
@ExcelField(title="电子邮箱", attrName="email", align=Align.LEFT, sort=50),
@ExcelField(title="手机号码", attrName="mobile", align=Align.CENTER, sort=60),
@ExcelField(title="办公电话", attrName="phone", align=Align.CENTER, sort=70),
@ExcelField(title="员工编码", attrName="employee.empCode", align=Align.CENTER, sort=80),
@ExcelField(title="员工姓名", attrName="employee.empName", align=Align.CENTER, sort=95),
@ExcelField(title="拥有角色", attrName="userRoleString", align=Align.LEFT, sort=800, fieldType=RoleListType.class),
@ExcelField(title="最后登录日期", attrName="lastLoginDate", type=ExcelField.Type.EXPORT, dataFormat="yyyy-MM-dd HH:mm", align=Align.CENTER, sort=900),
@ExcelField(title="拥有角色编号", attrName="userRoleString", align=Align.LEFT, sort=800, type=ExcelField.Type.IMPORT),
@ExcelField(title="最后登录日期", attrName="lastLoginDate", align=Align.CENTER, sort=900, type=ExcelField.Type.EXPORT, dataFormat="yyyy-MM-dd HH:mm"),
})
public Employee getEmployee(){
Employee employee = (Employee)super.getRefObj();

View File

@@ -41,19 +41,10 @@ import com.jeesite.modules.sys.utils.EmpUtils;
}, extWhereKeys="dsf", orderBy="a.tree_sort, a.office_code"
)
public class Office extends TreeEntity<Office> {
/** 机构类型0集团 */
public static final String TYPE_GROUP = "0";
/** 机构类型1公司 */
public static final String TYPE_COMPANY = "1";
/** 机构类型2部门 */
public static final String TYPE_DEPT = "2";
/** 机构类型3小组 */
public static final String TYPE_TEAM = "3";
private static final long serialVersionUID = 1L;
private String officeCode; // 机构编码
private String viewCode; // 机构代码(作为显示用,集团内唯一)
private String viewCode; // 机构代码(作为显示用,多租户内唯一)
private String officeName; // 机构名称
private String fullName; // 机构全称
private String officeType; // 机构类型1公司2部门3小组
@@ -195,7 +186,10 @@ public class Office extends TreeEntity<Office> {
/**
* 根据类型查找上级部门
* @param type 机构类型 0集团TYPE_GROUP 1公司TYPE_COMPANY 2部门TYPE_DEPT 3小组TYPE_TEAM
* 1、例如当前机构类型为部门你想获取部门所在的省公司名称
* 2、例如当前机构类型为部门的子部门你想获取部门所在省公司名称
* 3、例如当前机构类型为小组你想获取所在公司名称
* @param type 机构类型
* @return
*/
@JsonIgnore

View File

@@ -3,18 +3,28 @@
*/
package com.jeesite.modules.sys.service;
import java.util.List;
import javax.validation.ConstraintViolationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import com.jeesite.common.entity.Page;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.service.CrudService;
import com.jeesite.common.service.ServiceException;
import com.jeesite.common.utils.excel.ExcelImport;
import com.jeesite.common.validator.ValidatorUtils;
import com.jeesite.modules.sys.dao.EmpUserDao;
import com.jeesite.modules.sys.entity.EmpUser;
import com.jeesite.modules.sys.entity.Employee;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.utils.EmpUtils;
import com.jeesite.modules.sys.utils.UserUtils;
/**
* 员工管理Service
@@ -93,6 +103,69 @@ public class EmpUserService extends CrudService<EmpUserDao, EmpUser> {
employeeService.save(employee);
}
/**
* 导入用户数据
* @param file 导入的用户数据文件
* @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
*/
@Transactional(readOnly=false)
public String importData(MultipartFile file, Boolean isUpdateSupport) {
if (file == null){
throw new ServiceException("请选择导入的数据文件!");
}
int successNum = 0; int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
try {
ExcelImport ei = new ExcelImport(file, 2, 0);
List<EmpUser> list = ei.getDataList(EmpUser.class);
for (EmpUser user : list) {
try{
// 验证数据文件
ValidatorUtils.validateWithException(user);
// 验证是否存在这个用户
User u = UserUtils.getByLoginCode(user.getLoginCode());
if (u == null){
this.save(user);
successNum++;
successMsg.append("<br/>" + successNum + "、账号 " + user.getLoginCode() + " 导入成功");
} else if (isUpdateSupport){
user.setUserCode(u.getUserCode());
this.save(user);
successNum++;
successMsg.append("<br/>" + successNum + "、账号 " + user.getLoginCode() + " 更新成功");
} else {
failureNum++;
failureMsg.append("<br/>" + failureNum + "、账号 " + user.getLoginCode() + " 已存在");
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、账号 " + user.getLoginCode() + " 导入失败:";
if (e instanceof ConstraintViolationException){
List<String> messageList = ValidatorUtils.extractPropertyAndMessageAsList((ConstraintViolationException)e, ": ");
for (String message : messageList) {
msg += message + "; ";
}
}else{
msg += e.getMessage();
}
failureMsg.append(msg);
logger.error(msg, e);
}
}
} catch (Exception e) {
failureMsg.append(e.getMessage());
logger.error(e.getMessage(), e);
}
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
}else{
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
/**
* 更新状态
*/

View File

@@ -25,7 +25,7 @@ public class EmpUtils {
// public static final String CACHE_OFFICE_LIST = "officeList";
// public static final String CACHE_COMPANY_LIST = "companyList";
// 集团缓存常量
// 部门和公司缓存常量
public static final String CACHE_OFFICE_ALL_LIST = "officeAllList";
public static final String CACHE_COMPANY_ALL_LIST = "companyAllList";

View File

@@ -3,6 +3,8 @@
*/
package com.jeesite.modules.sys.web;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jeesite.common.entity.Page;
import com.jeesite.common.lang.DateUtils;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.sys.entity.Log;
import com.jeesite.modules.sys.service.LogService;
@@ -44,8 +47,15 @@ public class LogController extends BaseController {
*/
@RequiresPermissions("sys:log:view")
@RequestMapping(value = "list")
public String list(Log sysLog, Model model) {
model.addAttribute("sysLog", sysLog);
public String list(Log log, Model model) {
// 设置默认时间范围,默认当前月
if (log.getCreateDate_gte() == null){
log.setCreateDate_gte(DateUtils.setDays(new Date(), 1));
}
if (log.getCreateDate_lte() == null){
log.setCreateDate_lte(DateUtils.addDays(DateUtils.addMonths(log.getCreateDate_gte(), 1), -1));
}
model.addAttribute("log", log);
return "modules/sys/logList";
}

View File

@@ -169,15 +169,7 @@ public class LoginController extends BaseController{
// 非授权异常登录失败验证码加1。
if (!UnauthorizedException.class.getName().equals(exception)){
// // 如果使用了集团用户模式则获取集团Code
// String corpCode = null;
// if (Global.isUseCorpModel()){
// corpCode = (String)paramMap.get("corpCode");
// if (StringUtils.isBlank(corpCode)){
// throw new AuthenticationException("msg:请选择您要登录的集团公司.");
// }
// }
model.addAttribute("isValidCodeLogin", BaseAuthorizingRealm.isValidCodeLogin(username, /*corpCode, */(String)paramMap.get("deviceType"), "failed"));
model.addAttribute("isValidCodeLogin", BaseAuthorizingRealm.isValidCodeLogin(username, (String)paramMap.get("deviceType"), "failed"));
}
//获取当前会话对象
@@ -302,7 +294,7 @@ public class LoginController extends BaseController{
}
/**
* 获取当前用户权限字符串数据
* 获取当前用户权限字符串数据(移动端用)
*/
@RequiresPermissions("user")
@RequestMapping(value = "authInfo")
@@ -312,12 +304,15 @@ public class LoginController extends BaseController{
}
/**
* 获取当前用户菜单数据
* 获取当前用户菜单数据(移动端用)
*/
@RequiresPermissions("user")
@RequestMapping(value = "menuTree")
@ResponseBody
public List<Menu> menuTree(String parentCode) {
if (StringUtils.isNotBlank(parentCode)){
return UserUtils.getMenuListByParentCode(parentCode);
}
return UserUtils.getMenuTree();
}

View File

@@ -3,7 +3,6 @@
*/
package com.jeesite.modules.sys.web.user;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.Map;
@@ -21,6 +20,8 @@ import com.jeesite.common.config.Global;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.service.ServiceException;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.msg.entity.MsgPush;
import com.jeesite.modules.msg.utils.MsgPushUtils;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.service.UserService;
import com.jeesite.modules.sys.utils.UserUtils;
@@ -312,16 +313,12 @@ public class AccountController extends BaseController{
}
u.setLoginCode(loginCode);
u.setUserName(user.getUserName());
u.setPassword(user.getPassword());
u.setEmail(email);
u.setMobile(mobile);
u.setUserType(userType);
u.setMgrType(User.MGR_TYPE_NOT_ADMIN);
userService.save(u);
try{
userService.updatePassword(u.getUserCode(), user.getPassword());
}catch(ServiceException se){
return renderResult(Global.FALSE, se.getMessage());
}
// 验证成功后清理验证码,验证码只允许使用一次。
UserUtils.removeCache("regUserType");
@@ -337,17 +334,11 @@ public class AccountController extends BaseController{
*/
private String sendEmailValidCode(User user, String code, String title){
try {
Class<?> message = Class.forName("com.jeesite.modules.msg.entity.MsgPushEntity");
Class<?> messageUtils = Class.forName("com.jeesite.modules.msg.utils.MessageUtils");
Method method = messageUtils.getMethod("sendEmail", String.class, String.class, String.class, String.class, String.class);
String contentTitle = user.getUserName() + "" + user.getLoginCode() + ""+title+"验证码";
String contentText = "尊敬的用户,您好!\n\n您的验证码是" + code +"(请勿透露给其他人)\n\n"
title = user.getUserName() + "" + user.getLoginCode() + ""+title+"验证码";
String content = "尊敬的用户,您好!\n\n您的验证码是" + code +"(请勿透露给其他人)\n\n"
+ "请复制后,填写在你的验证码窗口完成验证。\n\n本邮件由系统自动发出请勿回复。\n\n感谢您的使用。";
String receiverType = (String)message.getField("RECEIVER_TYPE_NONE").get(null);
String receiverCodes = user.getEmail(), receiverNames = user.getUserName();
method.invoke(null, contentTitle, contentText, receiverType, receiverCodes, receiverNames);
} catch (ClassNotFoundException e) {
return renderResult(Global.FALSE, "消息模块未安装,请联系管理员!");
String receiveUserCode = "[CODE]"+user.getEmail();
MsgPushUtils.push(MsgPush.TYPE_EMAIL, title, content, null, null, receiveUserCode);
} catch (Exception e) {
logger.error(title+"发送邮件错误。", e);
return renderResult(Global.FALSE, "系统出现了点问题,错误信息:" + e.getMessage());
@@ -360,16 +351,10 @@ public class AccountController extends BaseController{
*/
private String sendSmsValidCode(User user, String code, String title){
try {
Class<?> message = Class.forName("com.jeesite.modules.msg.entity.MsgPushEntity");
Class<?> messageUtils = Class.forName("com.jeesite.modules.msg.utils.MessageUtils");
Method method = messageUtils.getMethod("sendSms", String.class, String.class, String.class, String.class, String.class);
String contentTitle = user.getUserName() + "" + user.getLoginCode() + ""+title+"验证码";
String contentText = "您好,您的验证码是:" + code +"(请勿透露给其他人)感谢您的使用。";
String receiverType = (String)message.getField("RECEIVER_TYPE_NONE").get(null);
String receiverCodes = user.getMobile(), receiverNames = user.getUserName();
method.invoke(null, contentTitle, contentText, receiverType, receiverCodes, receiverNames);
} catch (ClassNotFoundException e) {
return renderResult(Global.FALSE, "消息模块未安装,请联系管理员!");
title = user.getUserName() + "" + user.getLoginCode() + ""+title+"验证码";
String content = "您好,您的验证码是:" + code +"(请勿透露给其他人)感谢您的使用。";
String receiveUserCode = "[CODE]"+user.getMobile();
MsgPushUtils.push(MsgPush.TYPE_SMS, title, content, null, null, receiveUserCode);
} catch (Exception e) {
logger.error(title+"发送短信错误。", e);
return renderResult(Global.FALSE, "系统出现了点问题,错误信息:" + e.getMessage());

View File

@@ -29,7 +29,7 @@ import com.jeesite.modules.sys.service.UserService;
import com.jeesite.modules.sys.utils.UserUtils;
/**
* 集团公司管理员Controller
* 系统管理员Controller
* @author ThinkGem
* @version 2017-03-26
*/
@@ -57,9 +57,8 @@ public class CorpAdminController extends BaseController {
@RequestMapping(value = "listData")
@ResponseBody
public Page<User> listData(User user, HttpServletRequest request, HttpServletResponse response) {
user.setUserType(User.USER_TYPE_NONE); // 仅登录用户
user.setMgrType(User.MGR_TYPE_CORP_ADMIN); // 集团管理员
// 禁用自动添加集团代码条件,添加自定义集团查询条件
user.setMgrType(User.MGR_TYPE_CORP_ADMIN); // 租户管理员
// 禁用自动添加租户代码条件,添加自定义租户查询条件
user.getSqlMap().getWhere().disableAutoAddCorpCodeWhere()
.and("corp_code", QueryType.EQ, user.getCorpCode_())
.and("corp_name", QueryType.LIKE, user.getCorpName_());
@@ -71,13 +70,13 @@ public class CorpAdminController extends BaseController {
@RequestMapping(value = "form")
public String form(User user, String op, Model model) {
if (user.getIsNewRecord()){
// 新增集团,如果已存在集团,则不能保存
// 新增租户管理员,如果已存在,则不能保存
if ("addCorp".equals(op)){
user.setCorpCode_(StringUtils.EMPTY); // 归属集团Code
user.setCorpName_(StringUtils.EMPTY); // 归属集团Name
user.setCorpCode_(StringUtils.EMPTY); // 租户代码
user.setCorpName_(StringUtils.EMPTY); // 租户名称
}
}
// 操作类型addCorp: 添加集团 addAdmin: 添加管理员; edit: 编辑
// 操作类型addCorp: 添加租户 addAdmin: 添加管理员; edit: 编辑
model.addAttribute("op", op);
model.addAttribute("user", user);
return "modules/sys/user/corpAdminForm";
@@ -97,24 +96,26 @@ public class CorpAdminController extends BaseController {
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
if (StringUtils.isBlank(user.getCorpCode_())){
return renderResult(Global.FALSE, "集团编码不能为空!");
return renderResult(Global.FALSE, "租户代码不能为空!");
}
if (!Global.TRUE.equals(userService.checkLoginCode(oldLoginCode, user.getLoginCode()/*, user.getCorpCode_()*/))) {
return renderResult(Global.FALSE, "保存用户'" + user.getLoginCode() + "'失败,登录账号已存在");
}
user.setUserType(User.USER_TYPE_NONE); // 仅登录用户
user.setMgrType(User.MGR_TYPE_CORP_ADMIN); // 集团管理员
// 如果新增,则验证集团代码合法性
if (user.getIsNewRecord()){
user.setUserType(User.USER_TYPE_NONE); // 仅登录用户
}
user.setMgrType(User.MGR_TYPE_CORP_ADMIN); // 租户管理员
// 如果新增,则验证租户代码合法性
if (user.getIsNewRecord()){
User where = new User();
where.setCorpCode_(user.getCorpCode_());
List<User> list = userService.findCorpList(user);
List<User> list = userService.findCorpList(where);
if (list.size() > 0){
// 新增集团,如果已存在集团,则不能保存
// 新增租户,如果已存在,则不能保存
if ("addCorp".equals(op)){
return renderResult(Global.FALSE, "保存用户失败,集团编码已存在");
return renderResult(Global.FALSE, "保存用户失败,租户代码已存在");
}
// 新增管理员,则使用已有的集团代码和名称
// 新增管理员,则使用已有的租户代码和名称
else if ("addAdmin".equals(op)){
user.setCorpCode_(list.get(0).getCorpCode_());
user.setCorpName_(list.get(0).getCorpName_());
@@ -145,9 +146,6 @@ public class CorpAdminController extends BaseController {
if (User.isSuperAdmin(user.getUserCode())) {
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
if (!User.USER_TYPE_NONE.equals(user.getUserType())){
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
if (user.getCurrentUser().getUserCode().equals(user.getUserCode())) {
return renderResult(Global.FALSE, "停用用户失败, 不允许停用当前用户");
}
@@ -168,9 +166,6 @@ public class CorpAdminController extends BaseController {
if (User.isSuperAdmin(user.getUserCode())) {
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
if (!User.USER_TYPE_NONE.equals(user.getUserType())){
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
user.setStatus(User.STATUS_NORMAL);
userService.updateStatus(user);
return renderResult(Global.TRUE, "启用用户成功");
@@ -188,9 +183,6 @@ public class CorpAdminController extends BaseController {
if (User.isSuperAdmin(user.getUserCode())) {
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
if (!User.USER_TYPE_NONE.equals(user.getUserType())){
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
userService.updatePassword(user.getUserCode(), null);
return renderResult(Global.TRUE, "重置用户密码成功");
}
@@ -207,14 +199,19 @@ public class CorpAdminController extends BaseController {
if (User.isSuperAdmin(user.getUserCode())) {
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
if (!User.USER_TYPE_NONE.equals(user.getUserType())){
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
if (user.getCurrentUser().getUserCode().equals(user.getUserCode())) {
return renderResult(Global.FALSE, "删除用户失败, 不允许删除当前用户");
return renderResult(Global.FALSE, "删除用户失败不允许删除当前用户");
}
if (User.USER_TYPE_NONE.equals(user.getUserType())){
// 删除系统管理员
userService.delete(user);
return renderResult(Global.TRUE, "删除用户'" + user.getUserName() + "'成功!");
}else{
// 取消系统管理员身份
user.setMgrType(User.MGR_TYPE_NOT_ADMIN);
userService.updateMgrType(user);
return renderResult(Global.TRUE, "取消用户'" + user.getUserName() + "'管理员身份成功!");
}
userService.delete(user);
return renderResult(Global.TRUE, "删除用户'" + user.getUserName() + "'成功!");
}
}

View File

@@ -9,7 +9,9 @@ import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
@@ -18,12 +20,16 @@ import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.collect.MapUtils;
import com.jeesite.common.config.Global;
import com.jeesite.common.entity.Page;
import com.jeesite.common.lang.DateUtils;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.utils.excel.ExcelExport;
import com.jeesite.common.utils.excel.annotation.ExcelField.Type;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.sys.entity.EmpUser;
import com.jeesite.modules.sys.entity.Employee;
@@ -37,6 +43,7 @@ import com.jeesite.modules.sys.service.PostService;
import com.jeesite.modules.sys.service.RoleService;
import com.jeesite.modules.sys.service.UserService;
import com.jeesite.modules.sys.utils.EmpUtils;
import com.jeesite.modules.sys.utils.UserUtils;
/**
* 员工用户Controller
@@ -131,7 +138,7 @@ public class EmpUserController extends BaseController {
return "modules/sys/user/empUserForm";
}
@RequiresPermissions("sys:empUser:edit")
@RequiresPermissions(value={"sys:empUser:edit","sys:empUser:authRole"}, logical=Logical.OR)
@PostMapping(value = "save")
@ResponseBody
public String save(@Validated EmpUser empUser, String oldLoginCode, String op, HttpServletRequest request) {
@@ -144,96 +151,75 @@ public class EmpUserController extends BaseController {
if (!Global.TRUE.equals(userService.checkLoginCode(oldLoginCode, empUser.getLoginCode()/*, null*/))) {
return renderResult(Global.FALSE, text("保存用户失败,登录账号''{0}''已存在", empUser.getLoginCode()));
}
if (StringUtils.inString(op, Global.OP_ADD, Global.OP_EDIT)){
empUser.setUserType(User.USER_TYPE_EMPLOYEE);
empUser.setMgrType(User.MGR_TYPE_NOT_ADMIN);
if (StringUtils.inString(op, Global.OP_ADD, Global.OP_EDIT)
&& UserUtils.getSubject().isPermitted("sys:empUser:edit")){
empUserService.save(empUser);
}
if (StringUtils.inString(op, Global.OP_ADD, Global.OP_AUTH)){
if (StringUtils.inString(op, Global.OP_ADD, Global.OP_AUTH)
&& UserUtils.getSubject().isPermitted("sys:empUser:authRole")){
userService.saveAuth(empUser);
}
return renderResult(Global.TRUE, text("保存用户''{0}''成功", empUser.getUserName()));
}
// /**
// * 导出用户数据
// */
// @RequiresPermissions("sys:empUser:view")
// @RequestMapping(value = "export", method = RequestMethod.POST)
// public void exportFile(EmpUser empUser, HttpServletResponse response) {
// List<EmpUser> list = empUserService.findList(empUser);
// String fileName = "用户数据" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
// new ExcelExport("用户数据", EmpUser.class).setDataList(list).write(response, fileName).dispose();
// }
//
// /**
// * 导入用户数据
// */
// @ResponseBody
// @RequiresPermissions("sys:empUser:edit")
// @RequestMapping(value = "import", method = RequestMethod.POST)
// public String importFile(MultipartFile file) {
// try {
// int successNum = 0;
// int failureNum = 0;
// StringBuilder failureMsg = new StringBuilder();
// ExcelImport ei = new ExcelImport(file, 1, 0);
// List<EmpUser> list = ei.getDataList(EmpUser.class);
// for (EmpUser user : list) {
// try {
// if (ObjectUtils.toBoolean(userService.checkLoginCode("", user.getUserCode(), null))){
// ValidatorUtils.validateWithException(user);
// empUserService.save(user);
// successNum++;
// } else {
// failureMsg.append("<br/>登录账号 " + user.getUserCode() + " 已存在; ");
// failureNum++;
// }
// } catch (ConstraintViolationException ex) {
// failureMsg.append("<br/>登录账号 " + user.getUserCode() + " 导入失败:");
// List<String> messageList = ValidatorUtils.extractPropertyAndMessageAsList(ex, ": ");
// for (String message : messageList) {
// failureMsg.append(message + "; ");
// failureNum++;
// }
// } catch (Exception ex) {
// failureMsg.append("<br/>登录名 " + user.getUserCode() + " 导入失败:" + ex.getMessage());
// }
// }
// if (failureNum > 0) {
// failureMsg.insert(0, ",失败 " + failureNum + " 条用户,导入信息如下:");
// }
// return renderResult(Global.TRUE, "已成功导入 " + successNum + " 条用户" + failureMsg);
// } catch (Exception ex) {
// return renderResult(Global.FALSE, "导入用户失败!失败信息:" + ex.getMessage());
// }
// }
//
// /**
// * 下载导入用户数据模板
// */
// @RequiresPermissions("sys:empUser:view")
// @RequestMapping(value = "import/template")
// public String importFileTemplate(HttpServletRequest request, HttpServletResponse response) {
// try {
// String fileName = "用户数据导入模板.xlsx";
// List<User> list = ListUtils.newArrayList();
// list.add(UserUtils.getUser());
// new ExcelExport("用户数据", User.class, Type.IMPORT).setDataList(list)
// .write(response, fileName).dispose();
// } catch (Exception e) {
// request.setAttribute("message", "导入模板下载失败!失败信息:" + e.getMessage());
// request.getRequestDispatcher("/error/404").forward(request, response);
// }
// return null;
// }
/**
* 导出用户数据
*/
@RequiresPermissions("sys:empUser:view")
@RequestMapping(value = "exportData")
public void exportData(EmpUser empUser, Boolean isAll, HttpServletResponse response) {
empUser.getEmployee().getOffice().setIsQueryChildren(true);
empUser.getEmployee().getCompany().setIsQueryChildren(true);
if (!(isAll != null && isAll)){
empUserService.addDataScopeFilter(empUser, UserDataScope.CTRL_PERMI_MANAGE);
}
List<EmpUser> list = empUserService.findList(empUser);
String fileName = "用户数据" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
new ExcelExport("用户数据", EmpUser.class).setDataList(list)
.write(response, fileName).dispose();
}
/**
* 下载导入用户数据模板
*/
@RequiresPermissions("sys:empUser:view")
@RequestMapping(value = "importTemplate")
public void importTemplate(HttpServletResponse response) {
EmpUser empUser = new EmpUser();
User user = UserUtils.getUser();
if (User.USER_TYPE_EMPLOYEE.equals(user.getUserType())){
empUser = empUserService.get(user.getUserCode());
}else{
BeanUtils.copyProperties(user, empUser);
}
List<EmpUser> list = ListUtils.newArrayList(empUser);
String fileName = "用户数据模板.xlsx";
new ExcelExport("用户数据", EmpUser.class, Type.IMPORT).setDataList(list)
.write(response, fileName).dispose();
}
/**
* 导入用户数据
*/
@ResponseBody
@RequiresPermissions("sys:empUser:edit")
@PostMapping(value = "importData")
public String importData(MultipartFile file, String updateSupport) {
try {
boolean isUpdateSupport = Global.YES.equals(updateSupport);
String message = empUserService.importData(file, isUpdateSupport);
return renderResult(Global.TRUE, "posfull:"+message);
} catch (Exception ex) {
return renderResult(Global.FALSE, "posfull:"+ex.getMessage());
}
}
/**
* 停用用户
* @param empUser
* @return
*/
@RequiresPermissions("sys:empUser:edit")
@RequiresPermissions("sys:empUser:updateStatus")
@ResponseBody
@RequestMapping(value = "disable")
public String disable(EmpUser empUser) {
@@ -256,7 +242,7 @@ public class EmpUserController extends BaseController {
* @param empUser
* @return
*/
@RequiresPermissions("sys:empUser:edit")
@RequiresPermissions("sys:empUser:updateStatus")
@ResponseBody
@RequestMapping(value = "enable")
public String enable(EmpUser empUser) {
@@ -276,7 +262,7 @@ public class EmpUserController extends BaseController {
* @param empUser
* @return
*/
@RequiresPermissions("sys:empUser:edit")
@RequiresPermissions("sys:empUser:resetpwd")
@RequestMapping(value = "resetpwd")
@ResponseBody
public String resetpwd(EmpUser empUser) {
@@ -315,7 +301,7 @@ public class EmpUserController extends BaseController {
/**
* 用户授权数据权限
*/
@RequiresPermissions("sys:empUser:edit")
@RequiresPermissions("sys:empUser:authDataScope")
@RequestMapping(value = "formAuthDataScope")
public String formAuthDataScope(EmpUser empUser, Model model, HttpServletRequest request) {
UserDataScope userDataScope = new UserDataScope();
@@ -330,7 +316,7 @@ public class EmpUserController extends BaseController {
/**
* 保存用户授权数据权限
*/
@RequiresPermissions("sys:empUser:edit")
@RequiresPermissions("sys:empUser:authDataScope")
@RequestMapping(value = "saveAuthDataScope")
@ResponseBody
public String saveAuthDataScope(EmpUser empUser, HttpServletRequest request) {

View File

@@ -113,7 +113,7 @@ public class SecAdminController extends BaseController {
// 取消二级管理员身份
user.setMgrType(User.MGR_TYPE_NOT_ADMIN);
userService.updateMgrType(user);
return renderResult(Global.TRUE, "取消用户'" + user.getUserName() + "'二级管理员身份成功!");
return renderResult(Global.TRUE, "取消用户'" + user.getUserName() + "'管理员身份成功!");
}
}

View File

@@ -1,20 +1,5 @@
# 温馨提示不建议直接修改此文件为了平台升级方便建议将需要修改的参数值复制到jeesite.yml里进行覆盖该参数值。
#============================#
#===== Project settings =====#
#============================#
# 产品或项目名称、版本、版权年份
productName: JeeSite Demo
productVersion: V4.0
copyrightYear: 2018
# 软件提供商公司或个人名称
companyName: ThinkGem
#是否演示模式
demoMode: false
#============================#
#===== Database sttings =====#
#============================#
@@ -22,38 +7,6 @@ demoMode: false
# 数据库连接
jdbc:
# # Mysql 数据库配置
# type: mysql
# driver: com.mysql.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/jeesite?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
# username: root
# password: 123456
# testSql: SELECT 1
#
# # Oracle 数据库配置
# type: oracle
# driver: oracle.jdbc.driver.OracleDriver
# url: jdbc:oracle:thin:@127.0.0.1:1521/orcl
# username: jeesite
# password: jeesite
# testSql: SELECT 1 FROM DUAL
#
# # Sql Server 数据库配置
# type: mssql
# driver: net.sourceforge.jtds.jdbc.Driver
# url: jdbc:jtds:sqlserver://127.0.0.1:1433/jeesite
# username: jeesite
# password: jeesite
# testSql: SELECT 1
#
# # PostgreSql 数据库配置注意一定要创建的schema与username相同否则将找不到数据表字典信息
# type: postgresql
# driver: org.postgresql.Driver
# url: jdbc:postgresql://127.0.0.1:5432/jeesite
# username: jeesite
# password: jeesite
# testSql: SELECT 1
# 连接信息加密
encrypt:
@@ -90,6 +43,10 @@ jdbc:
# init: 1
# minIdle: 3
# maxActive: 20
# JTA 分布式事务v4.0.4+
jta:
enabled: false
# 表名前缀
tablePrefix: js_
@@ -116,7 +73,7 @@ redis:
maxIdle: 3
maxTotal: 20
# 是否启用Redis系统缓存及会话
# 是否启用Redis系统缓存及会话(专业版)
cacheAndSession: false
# 定义Key的前缀标识
@@ -195,10 +152,10 @@ user:
remarks: ""
}]
# 集团模式(多公司、多租户、SAAS模式
# 多租户模式(SAAS模式(专业版)
useCorpModel: false
# 任务调度
# 任务调度(个人版+
job:
# 是否自动启动任务调度(可关闭)
@@ -222,7 +179,7 @@ cms:
# 内容管理主站点编码
mainSiteCode: main
#============================#
#==== Framework settings ====#
#============================#
@@ -260,6 +217,9 @@ shiro:
# 登录提交信息安全Key加密用户名、密码、验证码后再提交key设置为3个用逗号分隔
secretKey: thinkgem,jeesite,com
# 允许的请求方法设定,解决安全审计问题
allowRequestMethods: GET,POST
# 是否允许账号多地登录如果设置为false同一个设备类型的其它地点登录的相同账号被踢下线
isAllowMultiAddrLogin: true
@@ -380,7 +340,8 @@ web:
${adminPath}/sys/online/count,
${adminPath}/**/treeData,
${adminPath}/file/**,
${adminPath}/tags/*
${adminPath}/tags/*,
${adminPath}/msg/**
# 前台自动切换到手机视图拦截器
mobile:
@@ -395,6 +356,11 @@ web:
# 静态文件后缀排除的url路径指定哪些uri路径不进行静态文件过滤。
staticFileExcludeUri: /druid/
# 自定义正则表达式验证(主键、登录名)
validator:
id: '[a-zA-Z0-9_\-/\u4e00-\u9fa5]{0,64}'
user.loginCode: '[a-zA-Z0-9_\u4e00-\u9fa5]{4,20}'
# 错误页面500.html是否输出错误信息正式环境为提供安全性可设置为false
error:
page:
@@ -406,7 +372,7 @@ error:
file:
# 文件上传路径设置路径中不允许包含“userfiles”在指定目录中系统会自动创建userfiles目录如果不设置默认为contextPath路径
# 文件上传路径设置路径中不允许包含“userfiles”在指定目录中系统会自动创建userfiles目录如果不设置默认为contextPath路径
# baseDir: D:/jeesite
# 上传文件的相对路径支持yyyy, MM, dd, HH, mm, ss, E
@@ -430,17 +396,22 @@ file:
#===== Message settings =====#
#============================#
# 消息提醒中心(专业版)
msg:
# 是否开启实时发送消息(保存消息后立即检查未读消息并发送),分布式部署下请单独配置消息发送服务,不建议开启此选项。
realtime:
# 是否开启
enabled: true
# 消息送任务Bean名称
sendTaskBeanName: msgLocalSendTask
# 消息实时推送任务Bean名称
beanName: msgLocalPushTask
# 推送失败次数,如果推送次数超过了设定次数,仍不成功,则放弃并保存到历史
pushFailNumber: 3
# 邮件发送参数
email:
beanName: emailSendService
fromAddress: jeesite_demo@163.com
fromPassword: jeesitedemo1234
fromHostName: smtp.163.com
@@ -449,12 +420,15 @@ msg:
# 短信网关
sms:
url: http://host:port/msg/sendSms
beanName: smsSendService
url: http://localhost:80/msg/sendSms
data: account=demo&pswd=demo&product=
prefix: ~
suffix: 【JeeSite】
# 微信相关
weixin:
beanName: weixinSendService
#微信应用ID
appid: ~
#微信应用密钥

View File

@@ -6,6 +6,7 @@
<logger name="org.mybatis.spring.transaction" level="DEBUG" />
<logger name="org.apache.catalina.webresources.Cache" level="ERROR" />
<logger name="org.springframework.boot.context.embedded" level="INFO" />
<logger name="org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer" level="INFO" />
<logger name="com.atomikos.icatch.config.UserTransactionServiceImp" level="ERROR" />
<logger name="com.atomikos.jdbc.AbstractDataSourceBean" level="ERROR" />

View File

@@ -1,6 +1,6 @@
-- 日志表新增执行时间字段
ALTER TABLE [dbo].[${_prefix}sys_log] ADD [execute_time] decimal(19) NULL;
ALTER TABLE ${_prefix}sys_log ADD execute_time decimal(19) NULL;
-- 重命名待推送为已完成消息表
execute sp_rename N'${_prefix}sys_msg_push_wait', N'${_prefix}sys_msg_pushed';

View File

@@ -0,0 +1,19 @@
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516261885186048', '0', '0,', '9030', '0000009030,', '0', '0', '消息推送', '消息推送', '1', '', '', 'icon-envelope-letter', '', '', '60', '0', 'default', 'core', '0', 'system', getdate(), 'system', getdate(), '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516673799393280', '989516261885186048', '0,989516261885186048,', '30', '0000009030,0000000030,', '1', '1', '消息推送/未完成消息', '未完成消息', '1', '/msg/msgPush/list', '', '', '', 'msg:msgPush', '60', '1', 'default', 'core', '0', 'system', getdate(), 'system', getdate(), '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516723044716544', '989516261885186048', '0,989516261885186048,', '60', '0000009030,0000000060,', '1', '1', '消息推送/已完成消息', '已完成消息', '1', '/msg/msgPush/list?pushed=true', '', '', '', 'msg:msgPush', '60', '1', 'default', 'core', '0', 'system', getdate(), 'system', getdate(), '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516785057501184', '989516261885186048', '0,989516261885186048,', '90', '0000009030,0000000090,', '1', '1', '消息推送/消息模板管理', '消息模板管理', '1', '/msg/msgTemplate/list', '', '', '', 'msg:msgTemplate', '60', '1', 'default', 'core', '0', 'system', getdate(), 'system', getdate(), '');
ALTER TABLE ${_prefix}sys_msg_push ALTER COLUMN push_date datetime;
ALTER TABLE ${_prefix}sys_msg_push ALTER COLUMN read_date datetime;
ALTER TABLE ${_prefix}sys_msg_pushed ALTER COLUMN push_date datetime;
ALTER TABLE ${_prefix}sys_msg_pushed ALTER COLUMN read_date datetime;
INSERT INTO ${_prefix}sys_job (job_name, job_group, description, invoke_target, cron_expression, misfire_instruction, concurrent, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('MsgLocalMergePushTask', 'SYSTEM', '消息推送服务 (延迟)', 'msgLocalMergePushTask.execute()', '0 0/30 * * * ?', '2', '0', '2', 'system', getdate(), 'system', getdate(), NULL);
INSERT INTO ${_prefix}sys_job (job_name, job_group, description, invoke_target, cron_expression, misfire_instruction, concurrent, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('MsgLocalPushTask', 'SYSTEM', '消息推送服务 (即时)', 'msgLocalPushTask.execute()', '0/3 * * * * ?', '2', '0', '2', 'system', getdate(), 'system', getdate(), NULL);

View File

@@ -0,0 +1,21 @@
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516261885186048', '0', '0,', '9030', '0000009030,', '0', '0', '消息推送', '消息推送', '1', '', '', 'icon-envelope-letter', '', '', '60', '0', 'default', 'core', '0', 'system', now(), 'system', now(), '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516673799393280', '989516261885186048', '0,989516261885186048,', '30', '0000009030,0000000030,', '1', '1', '消息推送/未完成消息', '未完成消息', '1', '/msg/msgPush/list', '', '', '', 'msg:msgPush', '60', '1', 'default', 'core', '0', 'system', now(), 'system', now(), '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516723044716544', '989516261885186048', '0,989516261885186048,', '60', '0000009030,0000000060,', '1', '1', '消息推送/已完成消息', '已完成消息', '1', '/msg/msgPush/list?pushed=true', '', '', '', 'msg:msgPush', '60', '1', 'default', 'core', '0', 'system', now(), 'system', now(), '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516785057501184', '989516261885186048', '0,989516261885186048,', '90', '0000009030,0000000090,', '1', '1', '消息推送/消息模板管理', '消息模板管理', '1', '/msg/msgTemplate/list', '', '', '', 'msg:msgTemplate', '60', '1', 'default', 'core', '0', 'system', now(), 'system', now(), '');
ALTER TABLE ${_prefix}sys_msg_push CHANGE push_date push_date DATETIME NULL COMMENT '推送时间';
ALTER TABLE ${_prefix}sys_msg_push CHANGE read_date read_date DATETIME NULL COMMENT '读取时间';
ALTER TABLE ${_prefix}sys_msg_pushed CHANGE push_date push_date DATETIME NULL COMMENT '推送时间';
ALTER TABLE ${_prefix}sys_msg_pushed CHANGE read_date read_date DATETIME NULL COMMENT '读取时间';
INSERT INTO ${_prefix}sys_job (job_name, job_group, description, invoke_target, cron_expression, misfire_instruction, concurrent, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('MsgLocalMergePushTask', 'SYSTEM', '消息推送服务 (延迟)', 'msgLocalMergePushTask.execute()', '0 0/30 * * * ?', '2', '0', '2', 'system', now(), 'system', now(), NULL);
INSERT INTO ${_prefix}sys_job (job_name, job_group, description, invoke_target, cron_expression, misfire_instruction, concurrent, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('MsgLocalPushTask', 'SYSTEM', '消息推送服务 (即时)', 'msgLocalPushTask.execute()', '0/3 * * * * ?', '2', '0', '2', 'system', now(), 'system', now(), NULL);
commit;

View File

@@ -0,0 +1,21 @@
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516261885186048', '0', '0,', '9030', '0000009030,', '0', '0', '消息推送', '消息推送', '1', '', '', 'icon-envelope-letter', '', '', '60', '0', 'default', 'core', '0', 'system', sysdate, 'system', sysdate, '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516673799393280', '989516261885186048', '0,989516261885186048,', '30', '0000009030,0000000030,', '1', '1', '消息推送/未完成消息', '未完成消息', '1', '/msg/msgPush/list', '', '', '', 'msg:msgPush', '60', '1', 'default', 'core', '0', 'system', sysdate, 'system', sysdate, '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516723044716544', '989516261885186048', '0,989516261885186048,', '60', '0000009030,0000000060,', '1', '1', '消息推送/已完成消息', '已完成消息', '1', '/msg/msgPush/list?pushed=true', '', '', '', 'msg:msgPush', '60', '1', 'default', 'core', '0', 'system', sysdate, 'system', sysdate, '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516785057501184', '989516261885186048', '0,989516261885186048,', '90', '0000009030,0000000090,', '1', '1', '消息推送/消息模板管理', '消息模板管理', '1', '/msg/msgTemplate/list', '', '', '', 'msg:msgTemplate', '60', '1', 'default', 'core', '0', 'system', sysdate, 'system', sysdate, '');
ALTER TABLE ${_prefix}sys_msg_push MODIFY ( push_date TIMESTAMP );
ALTER TABLE ${_prefix}sys_msg_push MODIFY ( read_date TIMESTAMP );
ALTER TABLE ${_prefix}sys_msg_pushed MODIFY ( push_date TIMESTAMP );
ALTER TABLE ${_prefix}sys_msg_pushed MODIFY ( read_date TIMESTAMP );
INSERT INTO ${_prefix}sys_job (job_name, job_group, description, invoke_target, cron_expression, misfire_instruction, concurrent, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('MsgLocalMergePushTask', 'SYSTEM', '消息推送服务 (延迟)', 'msgLocalMergePushTask.execute()', '0 0/30 * * * ?', '2', '0', '2', 'system', sysdate, 'system', sysdate, NULL);
INSERT INTO ${_prefix}sys_job (job_name, job_group, description, invoke_target, cron_expression, misfire_instruction, concurrent, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('MsgLocalPushTask', 'SYSTEM', '消息推送服务 (即时)', 'msgLocalPushTask.execute()', '0/3 * * * * ?', '2', '0', '2', 'system', sysdate, 'system', sysdate, NULL);
commit;

View File

@@ -0,0 +1,21 @@
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516261885186048', '0', '0,', '9030', '0000009030,', '0', '0', '消息推送', '消息推送', '1', '', '', 'icon-envelope-letter', '', '', '60', '0', 'default', 'core', '0', 'system', now(), 'system', now(), '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516673799393280', '989516261885186048', '0,989516261885186048,', '30', '0000009030,0000000030,', '1', '1', '消息推送/未完成消息', '未完成消息', '1', '/msg/msgPush/list', '', '', '', 'msg:msgPush', '60', '1', 'default', 'core', '0', 'system', now(), 'system', now(), '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516723044716544', '989516261885186048', '0,989516261885186048,', '60', '0000009030,0000000060,', '1', '1', '消息推送/已完成消息', '已完成消息', '1', '/msg/msgPush/list?pushed=true', '', '', '', 'msg:msgPush', '60', '1', 'default', 'core', '0', 'system', now(), 'system', now(), '');
INSERT INTO ${_prefix}sys_menu (menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('989516785057501184', '989516261885186048', '0,989516261885186048,', '90', '0000009030,0000000090,', '1', '1', '消息推送/消息模板管理', '消息模板管理', '1', '/msg/msgTemplate/list', '', '', '', 'msg:msgTemplate', '60', '1', 'default', 'core', '0', 'system', now(), 'system', now(), '');
ALTER TABLE ${_prefix}sys_msg_push ALTER COLUMN push_date TYPE timestamp;
ALTER TABLE ${_prefix}sys_msg_push ALTER COLUMN read_date TYPE timestamp;
ALTER TABLE ${_prefix}sys_msg_pushed ALTER COLUMN push_date TYPE timestamp;
ALTER TABLE ${_prefix}sys_msg_pushed ALTER COLUMN read_date TYPE timestamp;
INSERT INTO ${_prefix}sys_job (job_name, job_group, description, invoke_target, cron_expression, misfire_instruction, concurrent, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('MsgLocalMergePushTask', 'SYSTEM', '消息推送服务 (延迟)', 'msgLocalMergePushTask.execute()', '0 0/30 * * * ?', '2', '0', '2', 'system', now(), 'system', now(), NULL);
INSERT INTO ${_prefix}sys_job (job_name, job_group, description, invoke_target, cron_expression, misfire_instruction, concurrent, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('MsgLocalPushTask', 'SYSTEM', '消息推送服务 (即时)', 'msgLocalPushTask.execute()', '0/3 * * * * ?', '2', '0', '2', 'system', now(), 'system', now(), NULL);
commit;

View File

@@ -1,3 +1,5 @@
4.0.0
4.0.1
4.0.2
4.0.2
4.0.3
4.0.4

View File

@@ -33,7 +33,7 @@ sys.user.oldPasswordError=Old password error, please retype.
sys.user.confirmPasswrodError=The new password is different from the confirm password. please retype.
sys.user.passwordModifySuccess=Change password success
sys.user.passwordModifyNotRepeat=The new password cannot be the same as the previous {0}.
sys.user.passwordModifySecurityLevel=Password change failed because you set the password to weak password!
sys.user.passwordModifySecurityLevel=Password update failed because you set the password to weak password!
sys.user.initPasswordModifyTip=Your password is the init password, please change the password!
sys.user.passwordModifyTip=Your password {0} day has not been modified , please change the password!
sys.user.passwordError=Password error, please retype.

View File

@@ -33,7 +33,7 @@ sys.user.oldPasswordError=旧密码错误,请重新输入
sys.user.confirmPasswrodError=新密码与确认新密码不同,请重新输入
sys.user.passwordModifySuccess=修改密码成功
sys.user.passwordModifyNotRepeat=新密码不能与前 {0} 次,设置的密码相同
sys.user.passwordModifySecurityLevel=密码修改失败,因为你设置的密码为弱密码!
sys.user.passwordModifySecurityLevel=密码更新失败,因为你设置的密码为弱密码!
sys.user.initPasswordModifyTip=您的密码还是初始密码,请修改密码!
sys.user.passwordModifyTip=您的密码已经 {0} 天未修改了,请修改密码!
sys.user.passwordError=登录密码错误,请重新输入

View File

@@ -13,6 +13,7 @@
新增=New
增行=New line
刷新=Refresh
查看=View
展开=Expand
展开一级=Expand level 1
折叠=Collapse
@@ -58,8 +59,8 @@
文档=Document
图片=Image
音频或视频=Audio or video
请上传=Please upload
开始上传=Start upload
请上传=Please upload
开始上传=Start upload
或将照片拖到这里,最多可选\ {0}\ 张=Drag the photo here, at most \ {0} \ sheet
或将照片拖到这里,最多可选\ {0}\ 个=Drag the photo here, at most \ {0}

View File

@@ -75,6 +75,16 @@
在线=Online
注销=Logout
# =========== 消息提醒 ===========
消息=Message
你有=You have
条消息=messages
查看全部消息=See All Messages
查看消息=See message
系统消息=System message
您有\ {0}\ 条新消息,由于消息太多,这里为您合并,请点击查看按钮看详情。=You have {0} new message, because there are too many messages, for you merge, click View see details.
# =========== 个人中心 ===========
修改密保=Security question

View File

@@ -32,7 +32,7 @@ if (isBlank(message)){
// 如果是异步请求或是手机端,则直接返回信息
if (@ServletUtils.isAjaxRequest(request)) {
print(message);
print(@ServletUtils.renderResult(@Global.FALSE, message));
}
// 输出异常信息页面

View File

@@ -18,7 +18,7 @@ if (isBlank(message)){
// 如果是异步请求或是手机端,则直接返回信息
if (@ServletUtils.isAjaxRequest(request)) {
print(message);
print(@ServletUtils.renderResult(@Global.FALSE, message));
}
// 输出异常信息页面

View File

@@ -9,7 +9,7 @@ if (isBlank(message)){
// 如果是异步请求或是手机端,则直接返回信息
if (@ServletUtils.isAjaxRequest(request)) {
print(message);
print(@ServletUtils.renderResult(@Global.FALSE, message));
}
// 输出异常信息页面

View File

@@ -7,10 +7,14 @@ var ex;
if (isBlank(message)){
ex = @ExceptionUtils.getThrowable(request);
if (ex != null){
if (@StringUtils.startsWith(@ex.getMessage(), "msg:")){
message = @StringUtils.replace(@ex.getMessage(), "msg:", "");
if (@StringUtils.startsWith(ex.message, "msg:")){
message = @StringUtils.replace(ex.message, "msg:", "");
}else if (@StringUtils.startsWith(ex.cause.message, "msg:")){
message = @StringUtils.replace(ex.cause.message, "msg:", "");
}else if (ex.class.name == 'com.jeesite.common.service.ServiceException'){
message = @ex.getMessage();
message = ex.message;
}else if (ex.cause.class.name == 'com.jeesite.common.service.ServiceException'){
message = ex.cause.message;
}
@org.slf4j.LoggerFactory.getLogger("error/500").error(ex.message, ex);
}
@@ -22,7 +26,7 @@ if (isBlank(message)){
// 如果是异步请求或是手机端,则直接返回信息
if (@ServletUtils.isAjaxRequest(request)) {
print(message);
print(@ServletUtils.renderResult(@Global.FALSE, message));
}
// 输出异常信息页面
@@ -46,7 +50,7 @@ else {
<% if (@ObjectUtils.toBoolean(@Global.getConfig('error.page.printErrorInfo', 'true'))){ %>
<div class="box mt20">
${@StringUtils.toHtml(@ExceptionUtils.getStackTraceAsString(ex))}<br/>
此异常信息若不想输出可打开jeesite.properties文件设置error.page.printErrorInfo=false即可
此异常信息若不想输出可打开jeesite.yml文件设置error.page.printErrorInfo=false即可
</div>
<% } %>
<% } %>

View File

@@ -9,8 +9,9 @@ var globalFields = @Global.getConst('Global.Fields');
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
<meta http-equiv="Pragma" content="no-cache"/><meta http-equiv="Expires" content="0"/>
<meta content="width=device-width, initial-scale=1, user-scalable=1" name="viewport"/>
<meta content="${productName} - Powered By JeeSite" name="description"/>
<meta content="${productName} - Powered By JeeSite V4.0" name="description"/>
<meta content="ThinkGem, http://jeesite.com" name="author"/>
<meta content="Powered By JeeSite V4.0" name="keywords"/>
<title>${pageTitle}</title>
<script src="${ctxPath}/global.min.js?ctx=${ctx}"></script>
<script src="${ctxStatic}/jquery/jquery-1.12.4.min.js"></script>

View File

@@ -20,7 +20,7 @@
<#form:treeselect id="parent" title="上级字典"
path="parent.id" labelPath="parent.dictLabelOrig"
url="${ctx}/sys/dictData/treeData?excludeCode=${dictData.id}&dictType=${dictData.dictType}&isShowNameOrig=true"
class="" allowClear="true" canSelectRoot="true" canSelectParent="true"/>
class="" allowClear="true" canSelectRoot="true" canSelectParent="true" isReturnValue="false"/>
</div>
</div>
</div>

View File

@@ -53,7 +53,7 @@
<label class="control-label col-sm-2" title="">
<span class="required hide">*</span> 提交的数据:<i class="fa icon-question hide"></i></label>
<div class="col-sm-10">
<#form:input path="requestParams" class="form-control "/>
<#form:textarea path="requestParams" rows="1" class="form-control "/>
</div>
</div>
</div>

View File

@@ -1,76 +0,0 @@
<li class="dropdown messages-menu">
<a href="javascript:" class="dropdown-toggle" data-hover="dropdown">
<i class="fa fa-envelope-o"></i>
<span class="label label-success">4</span>
</a>
<ul class="dropdown-menu">
<li class="header">You have 4 messages</li>
<li>
<!-- inner menu: contains the actual data -->
<ul class="menu">
<li><!-- start message -->
<a href="#">
<div class="pull-left">
<img src="${ctxStatic}/images/user1.jpg" class="img-circle" alt="User Image">
</div>
<h4>
Support Team
<small><i class="fa fa-clock-o"></i> 5 mins</small>
</h4>
<p>Why not buy a new awesome theme?</p>
</a>
</li>
<!-- end message -->
<li>
<a href="#">
<div class="pull-left">
<img src="${ctxStatic}/images/user1.jpg" class="img-circle" alt="User Image">
</div>
<h4>
JeeSite Team
<small><i class="fa fa-clock-o"></i> 2 hours</small>
</h4>
<p>Why not buy a new awesome theme?</p>
</a>
</li>
<li>
<a href="#">
<div class="pull-left">
<img src="${ctxStatic}/images/user1.jpg" class="img-circle" alt="User Image">
</div>
<h4>
Developers
<small><i class="fa fa-clock-o"></i> Today</small>
</h4>
<p>Why not buy a new awesome theme?</p>
</a>
</li>
<li>
<a href="#">
<div class="pull-left">
<img src="${ctxStatic}/images/user1.jpg" class="img-circle" alt="User Image">
</div>
<h4>
Sales Department
<small><i class="fa fa-clock-o"></i> Yesterday</small>
</h4>
<p>Why not buy a new awesome theme?</p>
</a>
</li>
<li>
<a href="#">
<div class="pull-left">
<img src="${ctxStatic}/images/user1.jpg" class="img-circle" alt="User Image">
</div>
<h4>
Reviewers
<small><i class="fa fa-clock-o"></i> 2 days</small>
</h4>
<p>Why not buy a new awesome theme?</p>
</a>
</li>
</ul>
</li>
<li class="footer"><a href="#">See All Messages</a></li>
</ul>
</li>

View File

@@ -3,7 +3,7 @@
<div class="box box-main">
<div class="box-header with-border">
<div class="box-title">
<i class="fa fa-list-alt"></i> ${user.isNewRecord ? op == 'addCorp' ? '新增集团' : '新增管理员' : '编辑管理员'}
<i class="fa fa-list-alt"></i> ${user.isNewRecord ? op == 'addCorp' ? '新增租户' : '新增' : '编辑'}管理员
</div>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
@@ -19,9 +19,9 @@
<div class="col-xs-6">
<div class="form-group">
<label class="col-sm-4 control-label" title="">
<span class="required">*</span> 集团代码:<i class="fa icon-question hide"></i></label>
<span class="required">*</span> 租户代码:<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:input path="corpCode_" placeholder="请输入集团代码" maxlength="20"
<#form:input path="corpCode_" placeholder="请输入租户代码" maxlength="20"
readonly="${!user.isNewRecord || op=='addAdmin'}" class="form-control abc required"/>
</div>
</div>
@@ -29,9 +29,9 @@
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required">*</span> 集团名称:<i class="fa icon-question hide"></i></label>
<span class="required">*</span> 租户名称:<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:input path="corpName_" placeholder="请输入集团名称" maxlength="32"
<#form:input path="corpName_" placeholder="请输入租户名称" maxlength="32"
readonly="${!user.isNewRecord || op=='addAdmin'}" class="form-control required"/>
</div>
</div>

View File

@@ -9,7 +9,7 @@
<a href="#" class="btn btn-default" id="btnSearch" title="查询"><i class="fa fa-filter"></i> 查询</a>
<% if(hasPermi('sys:corpAdmin:edit')){ %>
<% if(@ObjectUtils.toBoolean(@Global.getConfig('user.useCorpModel'))){ %>
<a href="${ctx}/sys/corpAdmin/form?op=addCorp" class="btn btn-default btnTool" title="新增集团"><i class="fa fa-plus"></i> 新增集团</a>
<a href="${ctx}/sys/corpAdmin/form?op=addCorp" class="btn btn-default btnTool" title="新增租户管理员"><i class="fa fa-plus"></i> 新增租户管理员</a>
<% }else{ %>
<a href="${ctx}/sys/corpAdmin/form?corpCode_=${user.currentUser.corpCode_}&corpName_=${user.currentUser.corpName_}&op=addAdmin" class="btn btn-default btnTool" title="新增管理员"><i class="fa fa-plus"></i> 新增管理员</a>
<% } %>
@@ -32,13 +32,13 @@
</div>
</div>
<div class="form-group ${@ObjectUtils.toBoolean(@Global.getConfig('user.useCorpModel'))?'':'hide'}">
<label class="control-label">集团代码:</label>
<label class="control-label">租户代码:</label>
<div class="control-inline">
<#form:input path="corpCode_" maxlength="100" class="form-control width-90"/>
</div>
</div>
<div class="form-group ${@ObjectUtils.toBoolean(@Global.getConfig('user.useCorpModel'))?'':'hide'}">
<label class="control-label">集团名称:</label>
<label class="control-label">租户名称:</label>
<div class="control-inline">
<#form:input path="corpName_" maxlength="100" class="form-control width-90"/>
</div>
@@ -70,10 +70,10 @@ $('#dataGrid').dataGrid({
}},
{header:'用户昵称', name:'userName', index:'a.user_name', width:200, align:"center"},
<% if(@ObjectUtils.toBoolean(@Global.getConfig('user.useCorpModel'))){ %>
{header:'集团代码', name:'corpCode_', index:'a.corp_code', width:200, align:"center", formatter: function(val, obj, row, act){
{header:'租户代码', name:'corpCode_', index:'a.corp_code', width:200, align:"center", formatter: function(val, obj, row, act){
return '<a href="javascript:" onclick="$(\'#corpCode_\').val(\''+val+'\');$(\'#searchForm\').submit()">'+val+'</a>';
}},
{header:'集团名称', name:'corpName_', index:'a.corp_name', width:200, align:"center"},
{header:'租户名称', name:'corpName_', index:'a.corp_name', width:200, align:"center"},
<% } %>
{header:'电子邮箱', name:'email', index:'a.email', width:200, align:"center"},
{header:'手机号码', name:'mobile', index:'a.mobile', width:200, align:"center"},

View File

@@ -123,7 +123,7 @@
<label class="control-label col-sm-4" title="">
<span class="required hide">*</span> ${text('员工编号')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:input path="employee.empCode" maxlength="32" readonly="${!empUser.isNewRecord}" class="form-control abc"/>
<#form:input path="employee.empCode" maxlength="32" readonly="${!empUser.isNewRecord}" class="form-control userName"/>
</div>
</div>
</div>

View File

@@ -136,9 +136,10 @@ for (var i=0; i<dataScopes.length; i++){
}
$('#dataScopeTrees').append(js.template('dataScopeTpl', {
key: dataScope.ctrlType, label: dataScope.ctrlName_${lang()} || dataScope.ctrlName}));
var ctrlDataUrl = dataScope.ctrlDataUrl || '';
$.ajax({
type: 'POST',
url: "${ctx}" + dataScope.ctrlDataUrl,
url: "${ctx}" + ctrlDataUrl + (ctrlDataUrl.indexOf("?")!=-1?'&':'?') + "___t=" + new Date().getTime(),
data: {ctrlPermi: '2'},
dataType: 'json',
async: false,

View File

@@ -43,7 +43,7 @@ var setting = {view:{selectedMulti:false},data:{key:{title:"title"},simpleData:{
win.page();
}}
}, tree, loadTree = function(){
js.ajaxSubmit("${ctx}/sys/office/treeData", {ctrlPermi:'2'/*1拥有的权限 2管理的权限*/}, function(data){
js.ajaxSubmit("${ctx}/sys/office/treeData?___t=" + new Date().getTime(), {ctrlPermi:'2'/*1拥有的权限 2管理的权限*/}, function(data){
tree = $.fn.zTree.init($("#tree"), setting, data);//.expandAll(true);
// 展开第一级节点
var nodes = tree.getNodesByParam("level", 0);

View File

@@ -10,6 +10,15 @@
<% if(hasPermi('sys:empUser:edit')){ %>
<a href="${ctx}/sys/empUser/form?op=add" class="btn btn-default btnTool" title="${text('新增用户')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
<% } %>
<div class="btn-group">
<a href="javascript:" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-navicon"></i> <span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="javascript:" id="btnExport"><i class="glyphicon glyphicon-export"></i> 导出</a></li>
<li><a href="javascript:" id="btnImport"><i class="glyphicon glyphicon-import"></i> 导入</a></li>
</ul>
</div>
</div>
</div>
<div class="box-body">
@@ -17,7 +26,7 @@
data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
<div class="form-group">
<label class="control-label">${text('账号')}</label>
<div class="control-inline">
<div class="control-inline">
<#form:input path="loginCode" maxlength="100" class="form-control width-90"/>
</div>
</div>
@@ -85,7 +94,7 @@
<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
<button type="reset" class="btn btn-default btn-sm">${text('重置')}</button>
</div>
</#form:form>
</#form:form>
<table id="dataGrid"></table>
<div id="dataGridPage"></div>
</div>
@@ -115,18 +124,30 @@ $('#dataGrid').dataGrid({
var actions = [];
<% if(hasPermi('sys:empUser:edit')){ %>
actions.push('<a href="${ctx}/sys/empUser/form?userCode='+row.userCode+'&op=edit" class="btnList" title="${text('编辑用户')}"><i class="fa fa-pencil"></i></a>&nbsp;');
<% } %>
<% if(hasPermi('sys:empUser:updateStatus')){ %>
if (row.status == Global.STATUS_NORMAL){
actions.push('<a href="${ctx}/sys/empUser/disable?userCode='+row.userCode+'" class="btnList" title="${text('停用用户')}" data-confirm="${text('确认要停用该用户吗')}"><i class="glyphicon glyphicon-ban-circle"></i></a>&nbsp;');
}
if (row.status == Global.STATUS_DISABLE){
actions.push('<a href="${ctx}/sys/empUser/enable?userCode='+row.userCode+'" class="btnList" title="${text('启用用户')}" data-confirm="${text('确认要启用该用户吗')}"><i class="glyphicon glyphicon-ok-circle"></i></a>&nbsp;');
}
<% } %>
<% if(hasPermi('sys:empUser:edit')){ %>
actions.push('<a href="${ctx}/sys/empUser/delete?userCode='+row.userCode+'" class="btnList" title="${text('删除用户')}" data-confirm="${text('确认要删除该用户吗')}"><i class="fa fa-trash-o"></i></a>&nbsp;');
<% } %>
<% if(hasPermi('sys:empUser:authRole,sys:empUser:authDataScope,sys:empUser:resetpwd', 'or')){ %>
actions.push('<a href="javascript:" class="btnMore" title="${text('更多操作')}"><i class="fa fa-chevron-circle-right"></i></a>&nbsp;');
actions.push('<div class="moreItems">');
actions.push('<a href="${ctx}/sys/empUser/form?userCode='+row.userCode+'&op=auth" class="btn btn-default btn-xs btnList" title="${text('用户分配角色')}"><i class="fa fa-check-square-o"></i> ${text('分配角色')}</a>&nbsp;');
actions.push('<a href="${ctx}/sys/empUser/formAuthDataScope?userCode='+row.userCode+'" class="btn btn-default btn-xs btnList" title="${text('用户分配数据权限')}"><i class="fa fa-check-circle-o"></i> ${text('数据权限')}</a>&nbsp;');
actions.push('<a href="${ctx}/sys/empUser/resetpwd?userCode='+row.userCode+'" class="btn btn-default btn-xs btnList" title="${text('用户密码重置')}" data-confirm="${text('确认要将该用户密码重置到初始状态吗')}"><i class="fa fa-reply-all"></i> ${text('重置密码')}</a>&nbsp;');
<% if(hasPermi('sys:empUser:authRole')){ %>
actions.push('<a href="${ctx}/sys/empUser/form?userCode='+row.userCode+'&op=auth" class="btn btn-default btn-xs btnList" title="${text('用户分配角色')}"><i class="fa fa-check-square-o"></i> ${text('分配角色')}</a>&nbsp;');
<% } %>
<% if(hasPermi('sys:empUser:authDataScope')){ %>
actions.push('<a href="${ctx}/sys/empUser/formAuthDataScope?userCode='+row.userCode+'" class="btn btn-default btn-xs btnList" title="${text('用户分配数据权限')}"><i class="fa fa-check-circle-o"></i> ${text('数据权限')}</a>&nbsp;');
<% } %>
<% if(hasPermi('sys:empUser:resetpwd')){ %>
actions.push('<a href="${ctx}/sys/empUser/resetpwd?userCode='+row.userCode+'" class="btn btn-default btn-xs btnList" title="${text('用户密码重置')}" data-confirm="${text('确认要将该用户密码重置到初始状态吗')}"><i class="fa fa-reply-all"></i> ${text('重置密码')}</a>&nbsp;');
<% } %>
actions.push('</div>');
<% } %>
return actions.join('');
@@ -137,4 +158,61 @@ $('#dataGrid').dataGrid({
}
});
</script>
$('#btnExport').click(function(){
js.ajaxSubmitForm($('#searchForm'), {
url:'${ctx}/sys/empUser/exportData',
downloadFile:true
});
});
$('#btnImport').click(function(){
js.layer.open({
type: 1,
area: ['400px'],
title: '导入用户数据',
resize: false,
scrollbar: true,
content: js.template('importTpl'),
success: function(layero, index){
layero.find('input[type="checkbox"]').iCheck();
},
btn: ['<i class="fa fa-check"></i> 导入',
'<i class="fa fa-remove"></i> 取消'],
btn1: function(index, layero){
var form = {
inputForm: layero.find('#inputForm'),
file: layero.find('#file').val()
};
if (form.file == '' || (!js.endWith(form.file, '.xls') && !js.endWith(form.file, '.xlsx'))){
js.showMessage("${text('文件不正确,请选择后缀为 “xls”或“xlsx”的文件。')}", null, 'warning');
return false;
}
js.ajaxSubmitForm(form.inputForm, function(data){
js.showMessage(data.message);
if(data.result == Global.TRUE){
js.layer.closeAll();
}
page();
}, "json");
return true;
}
});
});
</script>
<script id="importTpl" type="text/template">//<!--
<form id="inputForm" action="${ctx}/sys/empUser/importData" method="post" enctype="multipart/form-data"
class="form-horizontal mt20 mb10" style="overflow:auto;max-height:200px;">
<div class="row">
<div class="col-xs-12 col-xs-offset-1">
<input type="file" id="file" name="file" class="form-file"/>
<div class="mt10 pt5">
<#form:checkbox name="updateSupport" label="${text('否更新已经存在的用户数据')}" class="form-control"
title="${text('如果用户编码已经存在,更新这条数据。')}"/> &nbsp;
<a href="${ctx}/sys/empUser/importTemplate" class="btn btn-default btn-xs"><i class="fa fa-file-excel-o"></i> ${text('')}</a>
</div>
<font color="red" class="pull-left mt10">
${text('提示仅允许导入“xls”或“xlsx”格式文件')}
</font>
</div>
</div>
</form>
//--></script>

View File

@@ -136,9 +136,10 @@ for (var i=0; i<dataScopes.length; i++){
}
$('#dataScopeTrees').append(js.template('dataScopeTpl', {
key: dataScope.ctrlType, label: dataScope.ctrlName_${lang()} || dataScope.ctrlName}));
var ctrlDataUrl = dataScope.ctrlDataUrl || '';
$.ajax({
type: 'POST',
url: "${ctx}" + dataScope.ctrlDataUrl,
url: "${ctx}" + ctrlDataUrl + (ctrlDataUrl.indexOf("?")!=-1?'&':'?') + "___t=" + new Date().getTime(),
data: {ctrlPermi: '2'},
dataType: 'json',
async: false,

View File

@@ -13,18 +13,19 @@ var bodyClass = 'fixed noscroll2 sidebar-mini ' + sidebarCollapse;
<link rel="stylesheet" href="${ctxStatic}/jquery-toastr/2.0/toastr.min.css?${_version}">
<link rel="stylesheet" href="${ctxStatic}/adminlte/css/skins/${skinName}.css?${_version}">
<link rel="stylesheet" href="${ctxStatic}/modules/sys/sysIndex.css?${_version}">
<header class="main-header">
<% include('/modules/sys/sysIndex/topMenu.html'){} %>
<header class="main-header">
<% include('sysIndex/topMenu.html'){} %>
</header>
<aside class="main-sidebar">
<% include('/modules/sys/sysIndex/leftMenu.html'){} %>
<% include('sysIndex/leftMenu.html'){} %>
</aside>
<div class="content-wrapper">
<div id="tabpanel"></div>
</div>
<% } %>
<div id="modifyPasswordTip" class="hide" data-message="${modifyPasswordTip!}"></div>
<div id="desktopTabPage" class="hide" data-title="${text('仪表盘')}" data-url="${ctx}${@Global.getConfig('sys.index.desktopUrl', '/desktop')}"></div>
<div class="hide" id="desktopTabPage" data-title="${text('仪表盘')}"
data-url="${ctx}${@Global.getConfig('sys.index.desktopUrl', '/desktop')}"></div>
<div class="hide" id="modifyPasswordTip" data-message="${modifyPasswordTip!}"></div>
<script src="${ctxStatic}/jquery-toastr/2.0/toastr.min.js?${_version}"></script>
<script src="${ctxStatic}/jquery-plugins/jquery.slimscroll.js"></script>
<script src="${ctxStatic}/modules/sys/sysIndex.js?${_version}"></script>

View File

@@ -15,12 +15,12 @@
<% } %>
<li><a href="javascript:" id="fullScreen" title="${text('全屏')}"><i class="fa fa-arrows-alt"></i></a></li>
<li><a href="javascript:" id="switchSkin" title="${text('切换主题')}" style="margin-top:-1px;"><i class="fa fa-dashboard"></i></a></li>
<% include('/modules/sys/sysIndex/topMenuLang.html'){} %>
<% include('/modules/sys/sysIndex/topMenuOnline.html'){} %>
<% //include('/modules/sys/sysIndex/topMenuMsg.html'){} %>
<% //include('/modules/sys/sysIndex/topMenuNotify.html'){} %>
<% //include('/modules/sys/sysIndex/topMenuTask.html'){} %>
<% include('/modules/sys/sysIndex/topMenuUser.html'){} %>
<% include('topMenuLang.html'){} %>
<% include('topMenuOnline.html'){} %>
<% include('topMenuMsg.html'){} %>
<% //include('topMenuNotify.html'){} %>
<% //include('topMenuTask.html'){} %>
<% include('topMenuUser.html'){} %>
</ul>
</div>
</nav>

View File

@@ -0,0 +1,44 @@
<li class="dropdown messages-menu">
<a href="javascript:" class="dropdown-toggle" data-hover="dropdown">
<i class="fa fa-envelope-o"></i>
<span class="label label-success" id="msgNum">0</span>
</a>
<ul class="dropdown-menu">
<li class="header">${text('你有')} <span id="msgNum2">0</span> ${text('条消息')}</li>
<li>
<ul class="menu" id="msgList"
data-mergeMsgLimit="${@Global.getConfig('sys.msg.mergeMsgLimit', '5')}"
data-mergeMsgTitle="${text('系统消息')}"
data-mergeMsgContent="${text('您有 {0\} 条新消息,由于消息太多,这里为您合并,请点击查看按钮看详情。')}"></ul>
</li>
<li class="footer"><a href="javascript:" data-href="${ctx}/msg/list"
data-title="${text('查看全部消息')}" class="addTabPage">${text('查看全部消息')}</a></li>
</ul>
<script src="${ctxStatic}/jquery-timeago/jquery.timeago.js"></script>
<script src="${ctxStatic}/jquery-timeago/i18n/jquery.timeago.${lang()}.js"></script>
<script src="${ctxStatic}/modules/msg/topMenuMsg.js"></script>
<script type="text/template" id="msgListTpl">
<li id="msg{{d.id}}"><a href="javascript:"
data-href="${ctx}/msg/readMsg?id={{d.id}}"
onclick="readMsg(this, '${text('查看消息')}', '{{d.id}}')" >
<div class="pull-left"><i class="img-circle bg-aqua icon-bubble"></i></div>
<h4>{{d.msgContentEntity.title}} <small><i class="fa fa-clock-o"></i>
<abbr class="timeago" title="{{d.sendDate}}">{{d.sendDate}}</abbr></small></h4>
<p>{{=d.msgContentEntity.content}}</p>
</a></li>
</script>
<script type="text/template" id="msgTipTpl">
<abbr class="timeago" title="{{d.sendDate}}">{{d.sendDate}}</abbr>
{{d.sendUserName}} <br/> {{=d.msgContentEntity.content}}
<div style="margin:8px 0 0;float:right;">
{{# $.each(d.msgContentEntity.buttons, function(idx, item){ }}
<button class="btn btn-default btn-sm" type="button"
data-href="${ctxPath}{{d.item.href}}"
onclick="readMsg(this, '${text('查看消息')}', '{{d.item.id}}');">{{d.item.name}}</button>&nbsp;
{{# }); }}
<button type="button" class="btn btn-default btn-sm"
data-href="${ctx}/msg/readMsg?id={{d.id}}"
onclick="readMsg(this, '${text('消息详情')}', '{{d.id}}')">${text('查看')}</button>&nbsp;
</div>
</script>
</li>

View File

@@ -5,7 +5,7 @@
</a>
<script>
function refreshOnlineCount(){
$.get('${ctx}/sys/online/count?__notUpdateSession=true', function(data){
$.get('${ctx}/sys/online/count?__notUpdateSession=true&__t='+new Date().getTime(), function(data){
try{$('#onlineCount').html(Number(data))}catch(e){}
})
}

View File

@@ -0,0 +1,27 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.test.context.ActiveProfiles;
import com.jeesite.common.io.PropertiesUtils;
/**
* JeeSite Web
* @author ThinkGem
* @version 2018-1-8
*/
@ActiveProfiles("test")
@SpringBootApplication(scanBasePackages={"com.jeesite.modules"})
public class ApplicationTest {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(ApplicationTest.class);
app.setDefaultProperties(PropertiesUtils.getInstance().getProperties());
app.run(args);
}
}

View File

@@ -0,0 +1,186 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.test;
import java.util.Date;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.entity.DataScope;
import com.jeesite.common.entity.Page;
import com.jeesite.common.mybatis.mapper.query.QueryType;
import com.jeesite.common.tests.BaseSpringContextTests;
import com.jeesite.modules.sys.dao.AreaDao;
import com.jeesite.modules.sys.dao.CompanyDao;
import com.jeesite.modules.sys.dao.ConfigDao;
import com.jeesite.modules.sys.dao.DictDataDao;
import com.jeesite.modules.sys.dao.UserDao;
import com.jeesite.modules.sys.entity.Area;
import com.jeesite.modules.sys.entity.Company;
import com.jeesite.modules.sys.entity.Config;
import com.jeesite.modules.sys.entity.DictData;
import com.jeesite.modules.sys.entity.User;
/**
* Mapper测试
* @author ThinkGem
* @version 2017年2月25日
*/
@ActiveProfiles("test")
@SpringBootTest(classes=ApplicationTest.class)
public class DaoMapperTest extends BaseSpringContextTests {
@Autowired
private ConfigDao configDao;
@Autowired
private UserDao userDao;
@Autowired
private AreaDao areaDao;
@Autowired
private CompanyDao companyDao;
@Autowired
private DictDataDao dictDataDao;
@Test
public void testTableAnnotation() throws Exception{
try{
System.out.println("============ 插入、批量插入测试 ============");
Config config = new Config();
config.setId("1");
config.setConfigKey("test");
config.setConfigName("test");
config.setConfigValue("1");
config.setIsSys("1");
Config config2 = (Config)config.clone();
config2.setId("2");
Config config3 = (Config)config.clone();
config3.setId("3");
System.out.println(configDao.insert(config));
System.out.println(configDao.insertBatch(ListUtils.newArrayList(config2, config3)));
System.out.println("============ 更新、删除测试 ============");
Area area = new Area();
area.setAreaCode("1");
area.setAreaName("你好");
area.setStatus("0");
Area where = new Area();
where.setAreaCode("2");
where.setId_in(new String[]{"1","2"});
where.setAreaName("你好2");
where.setStatus("0");
System.out.println(areaDao.update(area));
System.out.println(areaDao.updateByEntity(area, where));
System.out.println(areaDao.updateStatus(area));
System.out.println(areaDao.updateStatusByEntity(area, where));
System.out.println(areaDao.delete(area));
System.out.println(areaDao.delete(where));
System.out.println(areaDao.deleteByEntity(where));
System.out.println(areaDao.findList(area));
System.out.println("============ 基本信息查询测试 ============");
User user = new User();
user.setUserType(User.USER_TYPE_NONE);
System.out.println(userDao.findList(user));
System.out.println("============ 条件嵌套日期范围自定义sqlMap测试 ============");
Company company = new Company("1");
company.setCompanyName("a");
company.setCreateDate_gte(new Date());
company.setCreateDate_lte(new Date());
company.setArea(new Area("2"));
company.getArea().setAreaName("a");
company.getArea().setCreateDate_gte(new Date());
company.getArea().setCreateDate_lte(new Date());
company.setFullName("a");
company.setViewCode("1");
company.setParentCode("0");
company.setParentCodes("0,");
company.setTreeSort(1);
company.setTreeSorts("1,");
company.setTreeLevel(0);
company.setTreeLeaf("1");
company.setTreeNames("a");
System.out.println(companyDao.insert(company));
System.out.println(companyDao.get(company));
System.out.println(companyDao.findCount(company));
System.out.println("============ 分页测试,查询子节点 ============");
company.setPage(new Page<Company>(1, 20));
company.setIsQueryChildren(true);
System.out.println(companyDao.findList(company));
System.out.println("============ 扩展条件语句前带AND容错测试 ============");
Company company2 = new Company();
company2.getSqlMap().getWhere().disableAutoAddStatusWhere();
company2.getSqlMap().getDataScope().addFilter("dsf",
"Company", "a.company_code", DataScope.CTRL_PERMI_HAVE);
System.out.println(companyDao.findList(company2));
System.out.println("============ 树结构基本查询测试 ============");
DictData dictData = new DictData();
dictData.setParentCodes("0,");
System.out.println(dictDataDao.findByParentCodesLike(dictData));
System.out.println(dictDataDao.findList(dictData));
}catch(Exception e){
e.printStackTrace();
throw new Exception(e);
}
}
public static void main(String[] args) {
System.out.println("============ 基本测试 ============");
System.out.println(new Config("1").getSqlMap().getWhere()
.and("name", QueryType.EQ, "abc").toSql());
System.out.println(new Config("1").getSqlMap().getWhere()
.and("name", QueryType.IN, new String[]{"1", "2", "3"}).toSql());
System.out.println("============ 重复赋值测试 ============");
System.out.println(new Config("1").getSqlMap().getWhere()
.and("name", QueryType.LIKE, "abc").and("name", QueryType.LIKE, "def").toSql());
System.out.println("============ 带括号测试 ============");
System.out.println(new Config("1").getSqlMap().getWhere()
.andBracket("name", QueryType.EQ, "abc", 1).or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "ghi", 3).endBracket().toSql());
System.out.println(new Config().getSqlMap().getWhere()
.andBracket("name", QueryType.EQ, "val", 1)
.and("name", QueryType.NE, "val", 2).endBracket()
.orBracket("name", QueryType.NE, "val", 3)
.and("name", QueryType.NE, "val", 4).endBracket()
.orBracket("name", QueryType.NE, "val", 5)
.and("name", QueryType.EQ, "val", 6).endBracket().toSql());
System.out.println("============ 带括号空值测试 ============");
System.out.println(new Config("1").getSqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1).or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql());
System.out.println(new Config("1").getSqlMap().getWhere()
.andBracket("name", QueryType.EQ, "abc", 1).or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql());
System.out.println(new Config("1").getSqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1).or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "ghi", 3).endBracket().toSql());
System.out.println(new Config("1").getSqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1).or("name", QueryType.EQ, "", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql());
System.out.println("============ 实体嵌套测试 ============");
Company company = new Company("1");
company.setCreateDate_gte(new Date());
company.setCreateDate_lte(new Date());
company.setArea(new Area("2"));
company.getArea().setAreaName("a");
company.getArea().setCreateDate_gte(new Date());
company.getArea().setCreateDate_lte(new Date());
System.out.println(company.getSqlMap().getWhere().toSql());
}
}

View File

@@ -1,124 +0,0 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.test;
import java.util.Date;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.entity.Page;
import com.jeesite.common.tests.BaseSpringContextTests;
import com.jeesite.modules.sys.dao.AreaDao;
import com.jeesite.modules.sys.dao.CompanyDao;
import com.jeesite.modules.sys.dao.ConfigDao;
import com.jeesite.modules.sys.dao.DictDataDao;
import com.jeesite.modules.sys.dao.UserDao;
import com.jeesite.modules.sys.entity.Area;
import com.jeesite.modules.sys.entity.Company;
import com.jeesite.modules.sys.entity.Config;
import com.jeesite.modules.sys.entity.DictData;
import com.jeesite.modules.sys.entity.User;
/**
* Mapper测试
* @author ThinkGem
* @version 2017年2月25日
*/
public class DaoTest extends BaseSpringContextTests {
@Autowired
private ConfigDao configDao;
@Autowired
private UserDao userDao;
@Autowired
private AreaDao areaDao;
@Autowired
private CompanyDao companyDao;
@Autowired
private DictDataDao dictDataDao;
@Test
public void testTableAnnotation() throws Exception{
try{
Config config = new Config();
config.setId("1");
config.setConfigKey("test");
config.setConfigName("test");
config.setConfigValue("1");
config.setIsSys("1");
Config config2 = (Config)BeanUtils.cloneBean(config);
config2.setId("2");
Config config3 = (Config)BeanUtils.cloneBean(config);
config3.setId("3");
System.out.println(configDao.insert(config));
System.out.println(configDao.insertBatch(ListUtils.newArrayList(config2, config3)));
User user = new User();
user.setUserType(User.USER_TYPE_NONE);
System.out.println(userDao.findList(user));
Area area = new Area();
area.setAreaCode("1");
area.setAreaName("你好");
area.setStatus("0");
Area where = new Area();
where.setAreaCode("2");
where.setId_in(new String[]{"1","2"});
where.setAreaName("你好2");
where.setStatus("0");
System.out.println(areaDao.update(area));
System.out.println(areaDao.updateByEntity(area, where));
System.out.println(areaDao.updateStatus(area));
System.out.println(areaDao.updateStatusByEntity(area, where));
System.out.println(areaDao.delete(area));
System.out.println(areaDao.delete(where));
System.out.println(areaDao.deleteByEntity(where));
System.out.println(areaDao.findList(area));
Company company = new Company("1");
company.setCompanyName("a");
company.setCreateDate_gte(new Date());
company.setCreateDate_lte(new Date());
company.setArea(new Area("2"));
company.getArea().setAreaName("a");
company.getArea().setCreateDate_gte(new Date());
company.getArea().setCreateDate_lte(new Date());
company.setFullName("a");
company.setViewCode("1");
company.setParentCode("0");
company.setParentCodes("0,");
company.setTreeSort(1);
company.setTreeSorts("1,");
company.setTreeLevel(0);
company.setTreeLeaf("1");
company.setTreeNames("a");
System.out.println(companyDao.insert(company));
System.out.println(companyDao.get(company));
System.out.println(companyDao.findCount(company));
company.setPage(new Page<Company>(1, 20));
company.setIsQueryChildren(true);
System.out.println(companyDao.findList(company));
DictData dictData = new DictData();
dictData.setParentCodes("0,");
System.out.println(dictDataDao.findByParentCodesLike(dictData));
System.out.println(dictDataDao.findList(dictData));
}catch(Exception e){
e.printStackTrace();
throw new Exception(e);
}
}
}

View File

@@ -0,0 +1,104 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.test;
import java.util.Date;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ActiveProfiles;
import com.jeesite.common.config.Global;
import com.jeesite.common.lang.DateUtils;
import com.jeesite.common.tests.BaseSpringContextTests;
import com.jeesite.modules.msg.entity.content.AppMsgContent;
import com.jeesite.modules.msg.entity.content.EmailMsgContent;
import com.jeesite.modules.msg.entity.content.PcMsgContent;
import com.jeesite.modules.msg.entity.content.SmsMsgContent;
import com.jeesite.modules.msg.service.MsgPushService;
import com.jeesite.modules.msg.task.impl.MsgLocalPushTask;
import com.jeesite.modules.msg.utils.MsgPushUtils;
/**
* 消息推送测试类
* @author ThinkGem
* @version 2018-5-11
*/
@ActiveProfiles("test")
@SpringBootTest(classes=ApplicationTest.class)
@Rollback(false)
public class MsgPushTest extends BaseSpringContextTests {
@Test
public void testSend(){
for (int i=0; i<3; i++){
testPC();
testApp();
testSMS();
testMail();
}
// testTask();
}
@Autowired
private MsgPushService msgPushService;
public void testTask(){
MsgLocalPushTask task = new MsgLocalPushTask();
task.setMsgPushService(msgPushService);
task.execute();
}
public void testPC(){
PcMsgContent msgContent = new PcMsgContent();
msgContent.setTitle("提示信息");
msgContent.setContent("您有1条新的任务");
msgContent.addButton("办理", "/a/task/execute?id=123");
// 即时推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system");
// 定时推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system", DateUtils.parseDate("2018-05-05 08:30"), Global.YES);
// 延迟推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system", new Date(), Global.YES);
}
public void testApp(){
AppMsgContent msgContent = new AppMsgContent();
msgContent.setTitle("提示信息");
msgContent.setContent("您有1条新的任务");
// 即时推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system");
// 定时推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system", DateUtils.parseDate("2018-05-05 08:30"), Global.YES);
// 延迟推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system", new Date(), Global.YES);
}
public void testSMS(){
SmsMsgContent msgContent = new SmsMsgContent();
msgContent.setTitle("提示信息");
msgContent.setContent("您好您的验证码是123456请勿透露给其他人感谢您的使用。");
// 即时推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system");
// 定时推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system", DateUtils.parseDate("2018-05-05 08:30"), Global.YES);
// 延迟推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system", new Date(), Global.YES);
}
public void testMail(){
EmailMsgContent msgContent = new EmailMsgContent();
msgContent.setTitle("提示信息");
msgContent.setContent("这是一条测试邮件内容");
// 即时推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system");
// 定时推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system", DateUtils.parseDate("2018-05-05 08:30"), Global.YES);
// 延迟推送消息
MsgPushUtils.push(msgContent, "BizKey", "BizType", "system", new Date(), Global.YES);
}
}

View File

@@ -0,0 +1,20 @@
# 产品或项目名称、版本、版权年份
productName: JeeSite Demo
productVersion: V4.0
copyrightYear: 2018
# 软件提供商公司或个人名称
companyName: ThinkGem
# 数据库连接
jdbc:
# Mysql 数据库配置
type: mysql
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jeesite?useSSL=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
testSql: SELECT 1

View File

@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<!-- Spring boot default -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>

View File

@@ -0,0 +1,4 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding/<project>=UTF-8

View File

@@ -0,0 +1,5 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.7

View File

@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View File

@@ -0,0 +1,17 @@
@echo off
rem /**
rem * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
rem *
rem * Author: ThinkGem@163.com
rem */
echo.
echo [<5B><>Ϣ] <20><><EFBFBD><EFBFBD><EBB9A4>Javadoc<6F><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>jar<61><72><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
echo.
%~d0
cd %~dp0
cd ..
call mvn clean package -Pjavadoc
pause

View File

@@ -0,0 +1,17 @@
@echo off
rem /**
rem * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
rem *
rem * Author: ThinkGem@163.com
rem */
echo.
echo [<5B><>Ϣ] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD>jar<61><72><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
echo.
%~d0
cd %~dp0
cd ..
call mvn clean install -Dmaven.test.skip=true -Ppackage
pause

63
modules/template/pom.xml Normal file
View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>4.0.4-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
<!-- ====== 这是一个新增模块示例项目,你可以拷贝此项目,修改 artifactId 为您的模块即可 ====== -->
<!-- <relativePath>../parent/pom.xml</relativePath> /jeesite -->
<!-- <relativePath>../../parent/pom.xml</relativePath> /jeesite/modules -->
<!-- <relativePath>../../jeesite/parent/pom.xml</relativePath> /jeesite-xxx -->
<!-- <relativePath>../../../jeesite/parent/pom.xml</relativePath> /jeesite-xxx/modules -->
</parent>
<artifactId>jeesite-module-template</artifactId>
<packaging>jar</packaging>
<name>JeeSite Module Template</name>
<url>http://jeesite.com</url>
<inceptionYear>2013-Now</inceptionYear>
<properties>
</properties>
<dependencies>
<dependency>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-module-core</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
</plugins>
</build>
<developers>
<developer>
<id>thinkgem</id>
<name>WangZhen</name>
<email>thinkgem at 163.com</email>
<roles><role>Project lead</role></roles>
<timezone>+8</timezone>
</developer>
</developers>
<organization>
<name>JeeSite</name>
<url>http://jeesite.com</url>
</organization>
</project>

View File

@@ -11,7 +11,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>4.0-SNAPSHOT</version>
<version>4.0.4-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite Parent</name>
@@ -32,6 +32,7 @@
<!-- framework version setting -->
<mybatis.version>3.4.5</mybatis.version>
<mybatis-spring.version>1.3.1</mybatis-spring.version>
<jsqlparser.version>1.1</jsqlparser.version>
<druid.version>1.1.3</druid.version>
<shiro.version>1.4.0</shiro.version>
<beetl.version>2.7-SNAPSHOT</beetl.version>
@@ -40,6 +41,7 @@
<!-- environment setting -->
<java.version>1.7</java.version>
<maven.test.skip>true</maven.test.skip>
<eclipse-plugin-download-sources>false</eclipse-plugin-download-sources>
<eclipse-plugin-download-javadocs>false</eclipse-plugin-download-javadocs>
@@ -95,8 +97,8 @@
<finalName>jeesite</finalName>
<outputDirectory>${project.build.directory}/${project.artifactId}/WEB-INF/lib</outputDirectory>
<includes>
<include>com/thinkgem/jeesite/**</include>
</includes> -->
<include>com/thinkgem/jeesite/**</include>
</includes> -->
<archive>
<manifest>
<!-- Add directory entries -->
@@ -109,7 +111,7 @@
</execution>
</executions>
</plugin>
<!-- resource插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
@@ -141,7 +143,7 @@
</plugin>
</plugins>
<pluginManagement>
<plugins>
@@ -197,6 +199,9 @@
<goals>
<goal>jar</goal>
</goals>
<configuration>
<additionalparam>-Xdoclint:none</additionalparam>
</configuration>
</execution>
</executions>
</plugin>
@@ -296,7 +301,7 @@
<snapshots><enabled>false</enabled></snapshots>
</repository>
<repository>
<id>sonatype-repos-s</id>
<id>sonatype-repos-s</id>
<name>Sonatype Repository</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases><enabled>false</enabled></releases>
@@ -314,47 +319,51 @@
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
<profiles>
<!-- 打包项目 -->
<profile>
<id>package</id>
<build>
<plugins>
<!-- Java Document Generate
<id>javadoc</id>
<build>
<plugins>
<!-- Java Document Generate -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin> -->
</plugin>
</plugins>
</build>
</profile>
<!-- 打包项目 -->
<profile>
<id>package</id>
<build>
<plugins>
<!-- YUI Compressor (CSS/JS压缩) -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</build>
</profile>
<!-- 部署项目 -->
<profile>
<id>deploy</id>
<build>
<plugins>
<!-- Java Document Generate
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin> -->
<id>deploy</id>
<build>
<plugins>
<!-- YUI Compressor (CSS/JS压缩) -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</build>
<distributionManagement>
<repository>
<id>sonatype-repos</id>

View File

@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

19
root/bin/clean.bat Normal file
View File

@@ -0,0 +1,19 @@
@echo off
rem /**
rem * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
rem *
rem * Author: ThinkGem@163.com
rem */
echo.
echo [<5B><>Ϣ] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>
echo.
pause
echo.
%~d0
cd %~dp0
cd ..
call mvn clean
pause

17
root/bin/javadoc.bat Normal file
View File

@@ -0,0 +1,17 @@
@echo off
rem /**
rem * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
rem *
rem * Author: ThinkGem@163.com
rem */
echo.
echo [<5B><>Ϣ] <20><><EFBFBD><EFBFBD><EBB9A4>Javadoc<6F><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>jar<61><72><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
echo.
%~d0
cd %~dp0
cd ..
call mvn clean package -Pjavadoc
pause

17
root/bin/package.bat Normal file
View File

@@ -0,0 +1,17 @@
@echo off
rem /**
rem * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
rem *
rem * Author: ThinkGem@163.com
rem */
echo.
echo [<5B><>Ϣ] <20><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>زֿ⡣
echo.
%~d0
cd %~dp0
cd ..
call mvn clean install -Dmaven.test.skip=true -Ppackage
pause

30
root/bin/versions.bat Normal file
View File

@@ -0,0 +1,30 @@
@echo off
rem /**
rem * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
rem *
rem * Author: ThinkGem@163.com
rem */
echo.
echo [<5B><>Ϣ] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>š<EFBFBD>
echo.
%~d0
cd %~dp0
set /p new=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>°汾<EFBFBD>ţ<EFBFBD>
echo.
set /p choice=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>"y" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if /i "%choice%" neq "y" set new=%new%-SNAPSHOT
echo.
cd ../jeesite
rem <20><><EFBFBD><EFBFBD>pom<6F><EFBFBD><E6B1BE>
cd ../parent
call mvn versions:set -DnewVersion=%new%
cd ../web
call mvn versions:set -DnewVersion=%new%
pause

42
root/pom.xml Normal file
View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>4.0.4-SNAPSHOT</version>
<relativePath>parent/pom.xml</relativePath>
</parent>
<artifactId>jeesite-root</artifactId>
<packaging>pom</packaging>
<name>JeeSite</name>
<url>http://jeesite.com</url>
<inceptionYear>2013-Now</inceptionYear>
<modules>
<module>../parent</module>
<module>../common</module>
<module>../modules/core</module>
<module>../web</module>
</modules>
<developers>
<developer>
<id>thinkgem</id>
<name>WangZhen</name>
<email>thinkgem at 163.com</email>
<roles><role>Project lead</role></roles>
<timezone>+8</timezone>
</developer>
</developers>
<organization>
<name>JeeSite</name>
<url>http://jeesite.com</url>
</organization>
</project>

View File

@@ -1,7 +1,7 @@
# 服务条款
1. 不得应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。
2. 付费之前请确认已通过开源版了解和试用“产品”,并确认产品功能符合您的需求;付费之后源代码与开源版本相同,不另外提供源代码,您只需上传许可文件即可;许可文件一经发出概不提供退货服务。
2. 付费之前请确认已通过社区版了解和试用“产品”,并确认产品功能符合您的需求;付费之后源代码与社区版本相同,不另外提供源代码,您只需上传许可文件即可;许可文件一经发出概不提供退货服务。
3. 您必须了解使用本软件的风险本软件无法保证100%没有漏洞,所以由软件漏洞造成的损失不予赔偿,也不承担任何因使用本软件而产生相关法律责任。请软件上线使用前进行足够的安全测试,以避免此问题发生。
4. 若您已经购买本产品许可文件或以其它方式获得的许可文件,将被视为您对本服务条款全部的完全接受,如果您未能遵守本服务条款,您的许可授权将被终止,许可的权利将被收回,同时您应承担相应法律责任。
5. JeeSite官方对以上条款有最终的解释权。
@@ -10,7 +10,7 @@
QQ78112665
**请认准唯一收款码账号**thinkgem震)
**请认准唯一捐赠收款码账号**ThinkGem*震)
![ThinkGem的支付宝收款二维码](https://static.oschina.net/uploads/img/201803/16112020_sFWX.jpg "ThinkGem的支付宝收款二维码")

View File

@@ -1,23 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="jeesite-web">
<dependent-module archiveName="jeesite-module-core-4.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/jeesite-module-core/jeesite-module-core">
<dependent-module archiveName="jeesite-module-core-4.0.4-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/jeesite-module-core/jeesite-module-core">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="jeesite-common-4.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/jeesite-common/jeesite-common">
<dependent-module archiveName="jeesite-common-4.0.4-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/jeesite-common/jeesite-common">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="jeesite-framework-4.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/jeesite-framework/jeesite-framework">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="jeesite-module-devtools-4.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/jeesite-module-devtools/jeesite-module-devtools">
<dependent-module archiveName="jeesite-framework-4.0.4-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/jeesite-framework/jeesite-framework">
<dependency-type>uses</dependency-type>
</dependent-module>
<property name="component.exclusion.patterns"/>
<property name="java-output-path" value="/src/main/webapp/WEB-INF/classes"/>
<property name="context-root" value="js"/>
<property name="context-root" value="jeesite-web"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/resources"/>
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/java"/>
</wb-module>
</project-modules>

View File

@@ -36,6 +36,6 @@ echo.
cd %~dp0
cd ..
call mvn test -Dtest=com.jeesite.test.InitCoreData,com.jeesite.test.InitGenData
call mvn test -Dtest=com.jeesite.test.InitCoreData -U
pause

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