Compare commits

...

28 Commits

Author SHA1 Message Date
thinkgem
290e8ec31e 5.9.2 2024-11-23 09:55:58 +08:00
thinkgem
30039a35bb update 2024-11-21 09:49:06 +08:00
thinkgem
14f57be279 更新注册提示信息 2024-11-13 17:16:45 +08:00
thinkgem
207897e7be update 2024-11-13 13:47:51 +08:00
thinkgem
df728bc3d6 切换系统时,清除当前岗位和角色状态 2024-11-12 10:55:08 +08:00
thinkgem
3333ad2e10 设备信息字段 device_info 长度调整为 4000 2024-11-11 17:11:33 +08:00
thinkgem
83752a77cb spring boot 3.3.5 2024-11-08 09:52:44 +08:00
thinkgem
14437dfb7a 登录后重定向地址验证,如果是非法地址,则指定默认的登录成功地址 2024-11-07 17:53:43 +08:00
thinkgem
ce1c06eef2 update README.md 2024-11-07 16:13:30 +08:00
thinkgem
a98f8a816a update description 2024-11-07 16:13:26 +08:00
thinkgem
5d16bb8103 update version 2024-11-07 15:28:16 +08:00
thinkgem
48dbec081d Vue登录界面useCorpModel更改为loginCodeCorpUnique 2024-11-07 15:15:48 +08:00
thinkgem
f9648bcaf8 新增 窗口右上角的头像下拉菜单,切换当前用户所属岗位,并联动切换当前菜单权限 2024-11-07 10:26:27 +08:00
thinkgem
68a7c395e0 提升登录性能;支持普通用户升级为超管用户。 2024-11-07 10:22:32 +08:00
thinkgem
0b4bb63dbe 优化 MenuDao.xml 接口 findByUserCode 替换为 findByRoleCodes 升级时注意 2024-11-07 10:19:25 +08:00
thinkgem
03c5d4a051 新增 当前用户 user.getRoleList() 支持返回 岗位关联角色数据 2024-11-07 10:19:13 +08:00
thinkgem
380ee54ae5 新增 岗位关联角色(用户->岗位->角色)权限控制,可通过 user.postRolePermi=true 参数开启 2024-11-07 10:17:24 +08:00
thinkgem
6e3b93f645 增加岗位切换接口;优化登录菜单权限查询,直接通过当前用户角色查询,减少联表,提升查询效率。 2024-11-07 10:15:59 +08:00
thinkgem
3eaa799455 优化 增加岗位保存时清理关联的用户缓存 2024-11-07 10:14:32 +08:00
thinkgem
283d27d0df 优化 超级管理员作为普通员工时的角色数据查询,允许修改超级管理员员工信息,不允许停用禁用删除超管 2024-11-07 10:12:54 +08:00
thinkgem
8c86d1534c 增加手机端单表代码生成模板 2024-11-05 11:26:05 +08:00
thinkgem
40054e4c6e quartz 2.4.0.rc3 2024-11-04 18:14:14 +08:00
thinkgem
2981699bd1 update 2024-11-04 17:52:11 +08:00
thinkgem
3484d93a42 jackson 2.18.1 2024-11-04 17:36:31 +08:00
thinkgem
9a70ddb758 优化 mvc 接受字段类型不一致信息显示,方便调试 2024-11-01 19:59:51 +08:00
thinkgem
805759db01 调整代码生成模板目录 2024-11-01 10:44:03 +08:00
thinkgem
481246f52e 优化表单内表格的行高和边距 2024-11-01 10:43:32 +08:00
thinkgem
ba077ecd41 update 2024-10-25 19:07:18 +08:00
97 changed files with 847 additions and 172 deletions

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

View File

@@ -28,6 +28,8 @@ public class ExceptionUtils {
ex = (Throwable) request.getAttribute("exception");
} else if (request.getAttribute(RequestDispatcher.ERROR_EXCEPTION) != null) {
ex = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
} else if (request.getAttribute("org.springframework.web.servlet.DispatcherServlet.EXCEPTION") != null) {
ex = (Throwable) request.getAttribute("org.springframework.web.servlet.DispatcherServlet.EXCEPTION");
}
return ex;
}

View File

@@ -23,12 +23,6 @@ import java.lang.reflect.InvocationTargetException;
public class ObjectUtils extends org.apache.commons.lang3.ObjectUtils {
private static final Logger logger = LoggerFactory.getLogger(ObjectUtils.class);
private static final boolean isJavaSerialize;
static {
String[] ver = StringUtils.split(System.getProperty("java.version"), StringUtils.DOT);
isJavaSerialize = ver.length > 0 && Integer.parseInt(ver[0]) > 1;
}
/**
* 转换为 Double 类型

View File

@@ -17,6 +17,7 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.Validate;
import org.springframework.http.MediaType;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -57,6 +58,11 @@ public class ServletUtils {
// 是否打印错误信息参数到视图页面(生产环境关闭)
private static final Boolean PRINT_ERROR_INFO = PROPS.getPropertyToBoolean("error.page.printErrorInfo", "true");
// 允许重定向的地址不设置为全部允许设置this只允许本项目内部跳转多个用逗号隔开例如this,http://*.jeesite.com
private static final String[] ALLOW_REDIRECTS = PROPS.getPropertyToArray("shiro.allowRedirects", "");
private static final Boolean SCHEME_HTTPS = PROPS.getPropertyToBoolean("server.schemeHttps", "false");
private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
/**
* 获取当前请求对象
* web.xml: <listener><listener-class>
@@ -384,10 +390,15 @@ public class ServletUtils {
}
/**
* 获取请求的域名(含端口)
* 获取当前请求的域名(含端口)
* @author ThinkGem
*/
public static String getRequestDomain(String url) {
public static String getThisDomain(HttpServletRequest request) {
String url = request.getRequestURL().toString();
String scheme = StringUtils.substringBefore(url, "://");
if (SCHEME_HTTPS && StringUtils.equals(scheme, "http")) {
scheme = "https";
}
String domain = StringUtils.substringAfter(url, "://");
if (StringUtils.contains(domain, "/")) {
domain = StringUtils.substringBefore(domain, "/");
@@ -395,6 +406,28 @@ public class ServletUtils {
return scheme + "://" + domain;
}
/**
* 验证地址是否允许重定向
* @author ThinkGem
*/
public static boolean isAllowRedirects(HttpServletRequest request, String url) {
if (ALLOW_REDIRECTS == null || ALLOW_REDIRECTS.length == 0) {
return true;
}
boolean allow = false;
for (String pattern : ALLOW_REDIRECTS) {
String p = StringUtils.trim(pattern);
if ("this".equals(p)) {
p = getThisDomain(request);
}
if (PATH_MATCHER.match(p + "/**", url)){
allow = true;
break;
}
}
return allow;
}
/**
* 获得请求参数值
*/

View File

@@ -235,3 +235,6 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
.ui-jqgrid .ui-jqgrid-frozen .ui-jqgrid-htable th div {height:46px!important;}
.ui-jqgrid .ui-jqgrid-htable th div {padding:15px 0 15px 2px;}
.ui-jqgrid tr.jqgrow td {height: 49px;}
.table-form .ui-jqgrid .ui-jqgrid-frozen .ui-jqgrid-htable th div {height:36px!important;}
.table-form .ui-jqgrid .ui-jqgrid-htable th div {padding:9px 0 8px 2px;}
.table-form .ui-jqgrid tr.jqgrow td {height: 39px;}

View File

@@ -235,3 +235,6 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
.ui-jqgrid .ui-jqgrid-frozen .ui-jqgrid-htable th div {height:46px!important;}
.ui-jqgrid .ui-jqgrid-htable th div {padding:15px 0 15px 2px;}
.ui-jqgrid tr.jqgrow td {height: 49px;}
.table-form .ui-jqgrid .ui-jqgrid-frozen .ui-jqgrid-htable th div {height:36px!important;}
.table-form .ui-jqgrid .ui-jqgrid-htable th div {padding:9px 0 8px 2px;}
.table-form .ui-jqgrid tr.jqgrow td {height: 39px;}

View File

@@ -296,6 +296,9 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
.ui-jqgrid .ui-jqgrid-frozen .ui-jqgrid-htable th div {height:46px!important;}
.ui-jqgrid .ui-jqgrid-htable th div {padding:15px 0 15px 2px;}
.ui-jqgrid tr.jqgrow td {height: 49px;}
.table-form .ui-jqgrid .ui-jqgrid-frozen .ui-jqgrid-htable th div {height:36px!important;}
.table-form .ui-jqgrid .ui-jqgrid-htable th div {padding:9px 0 8px 2px;}
.table-form .ui-jqgrid tr.jqgrow td {height: 39px;}
.ui-jqgrid tr.jqgroup td, .ui-jqgrid tr.footrow td, .ui-jqgrid tr.jqfoot td {background:#323232;}
.ui-jqgrid .actions .moreItems {background:#1a1a1a;border-color:#3c3c3c;box-shadow:none;}

View File

@@ -329,7 +329,7 @@
</word>
<word>
<id>a63e3fda50530388ba263296184d8a6919a75791</id>
<length>1000</length>
<length>4000</length>
<decimal>null</decimal>
<array>false</array>
<array_dimension>null</array_dimension>

View File

@@ -16,7 +16,7 @@ CREATE TABLE js_app_comment
update_date timestamp NOT NULL,
remarks vargraphic(500),
create_by_name varchar(200),
device_info varchar(1000),
device_info varchar(4000),
reply_date date,
reply_content vargraphic(500),
reply_user_code varchar(64),

View File

@@ -16,7 +16,7 @@ CREATE TABLE js_app_comment
update_date datetime NOT NULL,
remarks varchar(500),
create_by_name varchar(200),
device_info varchar(1000),
device_info varchar(4000),
reply_date date,
reply_content varchar(500),
reply_user_code varchar(64),

View File

@@ -16,7 +16,7 @@ CREATE TABLE [js_app_comment]
[update_date] datetime NOT NULL,
[remarks] nvarchar(500),
[create_by_name] varchar(200),
[device_info] varchar(1000),
[device_info] varchar(4000),
[reply_date] date,
[reply_content] nvarchar(500),
[reply_user_code] varchar(64),

View File

@@ -17,7 +17,7 @@ CREATE TABLE js_app_comment
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
create_by_name varchar(200) COMMENT '提问人员姓名',
device_info varchar(1000) COMMENT '设备信息',
device_info varchar(4000) COMMENT '设备信息',
reply_date date COMMENT '回复时间',
reply_content varchar(500) COMMENT '回复意见',
reply_user_code varchar(64) COMMENT '回复人员',

View File

@@ -16,7 +16,7 @@ CREATE TABLE js_app_comment
update_date timestamp NOT NULL,
remarks nvarchar2(500),
create_by_name varchar2(200),
device_info varchar2(1000),
device_info varchar2(4000),
reply_date date,
reply_content nvarchar2(500),
reply_user_code varchar2(64),

View File

@@ -16,7 +16,7 @@ CREATE TABLE js_app_comment
update_date timestamp NOT NULL,
remarks varchar(500),
create_by_name varchar(200),
device_info varchar(1000),
device_info varchar(4000),
reply_date date,
reply_content varchar(500),
reply_user_code varchar(64),

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -4,17 +4,15 @@
*/
package com.jeesite.modules.app.entity;
import java.util.Date;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jeesite.common.entity.DataEntity;
import com.jeesite.common.mybatis.annotation.Column;
import com.jeesite.common.mybatis.annotation.Table;
import com.jeesite.common.mybatis.mapper.query.QueryType;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import java.util.Date;
/**
* APP意见反馈Entity
@@ -84,7 +82,7 @@ public class AppComment extends DataEntity<AppComment> {
this.contact = contact;
}
@Size(min=0, max=1000, message="设备信息长度不能超过 1000 个字符")
@Size(min=0, max=4000, message="设备信息长度不能超过 4000 个字符")
public String getDeviceInfo() {
return deviceInfo;
}

View File

@@ -16,7 +16,7 @@ CREATE TABLE ${_prefix}app_comment
update_date timestamp NOT NULL,
remarks vargraphic(500),
create_by_name varchar(200),
device_info varchar(1000),
device_info varchar(4000),
reply_date date,
reply_content vargraphic(500),
reply_user_code varchar(64),

View File

@@ -16,7 +16,7 @@ CREATE TABLE ${_prefix}app_comment
update_date datetime NOT NULL,
remarks varchar(500),
create_by_name varchar(200),
device_info varchar(1000),
device_info varchar(4000),
reply_date date,
reply_content varchar(500),
reply_user_code varchar(64),

View File

@@ -16,7 +16,7 @@ CREATE TABLE [${_prefix}app_comment]
[update_date] datetime NOT NULL,
[remarks] nvarchar(500),
[create_by_name] varchar(200),
[device_info] varchar(1000),
[device_info] varchar(4000),
[reply_date] date,
[reply_content] nvarchar(500),
[reply_user_code] varchar(64),

View File

@@ -17,7 +17,7 @@ CREATE TABLE ${_prefix}app_comment
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
create_by_name varchar(200) COMMENT '提问人员姓名',
device_info varchar(1000) COMMENT '设备信息',
device_info varchar(4000) COMMENT '设备信息',
reply_date date COMMENT '回复时间',
reply_content varchar(500) COMMENT '回复意见',
reply_user_code varchar(64) COMMENT '回复人员',

View File

@@ -16,7 +16,7 @@ CREATE TABLE ${_prefix}app_comment
update_date timestamp NOT NULL,
remarks nvarchar2(500),
create_by_name varchar2(200),
device_info varchar2(1000),
device_info varchar2(4000),
reply_date date,
reply_content nvarchar2(500),
reply_user_code varchar2(64),

View File

@@ -16,7 +16,7 @@ CREATE TABLE ${_prefix}app_comment
update_date timestamp NOT NULL,
remarks varchar(500),
create_by_name varchar(200),
device_info varchar(1000),
device_info varchar(4000),
reply_date date,
reply_content varchar(500),
reply_user_code varchar(64),

View File

@@ -21,4 +21,5 @@
5.8.0
5.8.1
5.9.0
5.9.1
5.9.1
5.9.2

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -29,4 +29,5 @@
5.8.0
5.8.1
5.9.0
5.9.1
5.9.1
5.9.2

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -17,13 +17,12 @@ import com.jeesite.common.shiro.realm.BaseAuthorizingRealm;
import com.jeesite.common.utils.SpringUtils;
import com.jeesite.common.web.CookieUtils;
import com.jeesite.common.web.http.ServletUtils;
import com.jeesite.modules.sys.entity.Log;
import com.jeesite.modules.sys.entity.Role;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.utils.CorpUtils;
import com.jeesite.modules.sys.utils.LogUtils;
import com.jeesite.modules.sys.utils.UserUtils;
import com.jeesite.modules.sys.utils.ValidCodeUtils;
import com.jeesite.modules.sys.entity.*;
import com.jeesite.modules.sys.utils.*;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
@@ -37,10 +36,6 @@ import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -424,8 +419,8 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
Global.setLang((String)paramMap.get("lang"), request, response);
}
data.put("demoMode", Global.isDemoMode());
data.put("useCorpModel", Global.isUseCorpModel()
&& Global.getConfigToBoolean("user.loginCodeCorpUnique", "false"));
data.put("useCorpModel", Global.isUseCorpModel());
data.put("loginCodeCorpUnique", Global.getConfigToBoolean("user.loginCodeCorpUnique", "false"));
data.put("title", Global.getProperty("productName"));
data.put("company", Global.getProperty("companyName"));
data.put("version", Global.getProperty("productVersion"));
@@ -452,6 +447,7 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
data.put("msgEnabled", Global.getPropertyToBoolean("msg.enabled", "false"));
data.put("sysCode", session.getAttribute("sysCode"));
data.put("roleCode", session.getAttribute("roleCode"));
data.put("postCode", session.getAttribute("postCode"));
data.put("title", Global.getProperty("productName"));
data.put("company", Global.getProperty("companyName"));
data.put("version", Global.getProperty("productVersion"));
@@ -471,6 +467,21 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
}
}
data.put("roleList", roleList);
List<Map<String, Object>> postList = ListUtils.newArrayList();
if (Global.getConfigToBoolean("user.postRolePermi", "false")
&& User.USER_TYPE_EMPLOYEE.equals(user.getUserType())) {
Employee employee = user.getRefObj();
for (EmployeePost ep : EmpUtils.getEmployeePostList(employee.getEmpCode())){
Post post = ep.getPost();
if (post != null) {
Map<String, Object> postMap = MapUtils.newHashMap();
postMap.put("postCode", post.getPostCode());
postMap.put("postName", post.getPostName());
postList.add(postMap);
}
}
}
data.put("postList", postList);
data.put("desktopUrl", desktopUrl != null ? desktopUrl : Global.getConfig("sys.index.desktopUrl"));
return data;
}

View File

@@ -24,6 +24,7 @@ import com.jeesite.common.mybatis.annotation.Table;
columns={
@Column(name="role_code", attrName="roleCode", label="角色编码", isPK=true),
@Column(name="role_name", attrName="roleName", label="角色名称"),
@Column(name="status", attrName="status", label="角色状态"),
})
}, orderBy=""
)

View File

@@ -6,6 +6,7 @@ package com.jeesite.modules.sys.service.support;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.entity.Page;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.service.CrudService;
import com.jeesite.modules.sys.dao.EmployeeDao;
import com.jeesite.modules.sys.dao.EmployeeOfficeDao;
@@ -107,6 +108,12 @@ public class EmployeeServiceSupport extends CrudService<EmployeeDao, Employee>
public List<EmployeePost> findEmployeePostList(Employee employee){
EmployeePost employeePost = new EmployeePost();
employeePost.setEmpCode(employee.getEmpCode());
if (employee.getDataMap() != null) {
String a = (String)employee.getDataMap().get("loadJoinTableAlias");
if (StringUtils.isNotBlank(a)) {
employeePost.sqlMap().loadJoinTableAlias(a);
}
}
return employeePostDao.findList(employeePost);
}

View File

@@ -9,13 +9,14 @@ import com.jeesite.common.config.Global;
import com.jeesite.common.entity.Page;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.service.CrudService;
import com.jeesite.common.utils.PageUtils;
import com.jeesite.modules.sys.dao.PostDao;
import com.jeesite.modules.sys.dao.PostRoleDao;
import com.jeesite.modules.sys.entity.Post;
import com.jeesite.modules.sys.entity.PostRole;
import com.jeesite.modules.sys.entity.Role;
import com.jeesite.modules.sys.entity.*;
import com.jeesite.modules.sys.service.EmpUserService;
import com.jeesite.modules.sys.service.PostService;
import com.jeesite.modules.sys.utils.CorpUtils;
import com.jeesite.modules.sys.utils.UserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
@@ -31,6 +32,8 @@ public class PostServiceSupport extends CrudService<PostDao, Post>
@Autowired
private PostRoleDao postRoleDao;
@Autowired
private EmpUserService empUserService;
/**
* 查询岗位
@@ -101,12 +104,13 @@ public class PostServiceSupport extends CrudService<PostDao, Post>
postRoleDao.insertBatch(list, null);
}
}
clearCache(post);
}
/**
* 岗位编码生成规则
*/
public void genId(Role entity, String viewCode){
public void genId(Post entity, String viewCode){
if (StringUtils.isNotBlank(viewCode)){
// 如果是租户模式,并且当前租户不是默认租户的时候,增加租户前缀防止编码重复
if (Global.isUseCorpModel() && !CorpUtils.DEFAULT_CORP_CODE.equals(CorpUtils.getCurrentCorpCode())){
@@ -134,6 +138,21 @@ public class PostServiceSupport extends CrudService<PostDao, Post>
public void delete(Post post) {
post.sqlMap().markIdDelete();
super.delete(post);
clearCache(post);
}
/**
* 根据岗位清理缓存
*/
protected void clearCache(Post post){
// 清除该岗位下所有的用户缓存
EmpUser where = new EmpUser();
where.setCodes(new String[]{ post.getPostCode() });
PageUtils.findList(where, null, e -> {
List<EmpUser> userList = empUserService.findUserListByPostCodes((EmpUser)e);
userList.forEach(UserUtils::clearCache);
return !userList.isEmpty();
});
}
}

View File

@@ -5,6 +5,7 @@
package com.jeesite.modules.sys.utils;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.collect.MapUtils;
import com.jeesite.common.collect.SetUtils;
import com.jeesite.common.lang.ObjectUtils;
import com.jeesite.common.lang.StringUtils;
@@ -325,6 +326,19 @@ public class EmpUtils {
});
return list.toArray(new String[list.size()]);
}
/**
* 根据员工编号,获取员工岗位(返回岗位编码和名称)
* @param empCode
* @return
*/
public static List<EmployeePost> getEmployeePostList(String empCode){
Employee employee = new Employee();
employee.setEmpCode(empCode);
employee.setDataMap(MapUtils.newHashMap());
employee.getDataMap().put("loadJoinTableAlias", "p");
return Static.employeeService.findEmployeePostList(employee);
}
/**
* 清除指定用户缓存不包括改用的SESSION缓存

View File

@@ -493,7 +493,7 @@ public class AccountController extends BaseController{
// 一同验证保存的用户名和验证码是否正确(如果只校验验证码,不验证用户名,则会有获取验证码后修改用户名的漏洞)
if (!(loginCode != null && loginCode.equals(user.getLoginCode()))){
return renderResult(Global.FALSE, text("非法操作"));
return renderResult(Global.FALSE, text("请先获取验证码"));
}
// 验证码是否超时

View File

@@ -6,6 +6,7 @@ package com.jeesite.modules.sys.web;
import com.fasterxml.jackson.annotation.JsonView;
import com.jeesite.common.codec.EncodeUtils;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.config.Global;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.shiro.filter.FormFilter;
@@ -15,8 +16,10 @@ import com.jeesite.common.web.BaseController;
import com.jeesite.common.web.CookieUtils;
import com.jeesite.common.web.http.ServletUtils;
import com.jeesite.modules.sys.entity.Menu;
import com.jeesite.modules.sys.entity.PostRole;
import com.jeesite.modules.sys.entity.Role;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.service.PostService;
import com.jeesite.modules.sys.utils.PwdUtils;
import com.jeesite.modules.sys.utils.UserUtils;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -26,6 +29,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.util.WebUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
@@ -48,7 +52,10 @@ import java.util.Map;
@RequestMapping(value = "${adminPath}")
@ConditionalOnProperty(name="user.enabled", havingValue="true", matchIfMissing=true)
public class LoginController extends BaseController{
@Autowired
private PostService postService;
/**
* 登录页面
*/
@@ -187,11 +194,8 @@ public class LoginController extends BaseController{
return null;
}
// 获取当前会话对象,并返回一些数据
// 如果是登录操作,则初始化一些登录参数
Session session = UserUtils.getSession();
model.addAllAttributes(FormFilter.getLoginSuccessData(request, response, user, session));
// 是否是登录操作
boolean isLogin = Global.TRUE.equals(session.getAttribute(BaseAuthorizingRealm.IS_LOGIN_OPER));
if (isLogin){
// 获取后接着清除,防止下次获取仍然认为是登录状态
@@ -224,20 +228,18 @@ public class LoginController extends BaseController{
}
}
// 获取当前会话对象,并返回一些数据
if (!StringUtils.equals(request.getParameter("__be"), Global.YES)) {
model.addAllAttributes(FormFilter.getLoginSuccessData(request, response, user, session));
}
// 获取登录成功后跳转的页面
String successUrl = request.getParameter("__url");
if (StringUtils.isBlank(successUrl)){
successUrl = (String)request.getAttribute("__url");
}
if (StringUtils.contains(successUrl, "://")){
String ctxPath = Global.getCtxPath();
String domain = ServletUtils.getRequestDomain(successUrl);
successUrl = StringUtils.substring(successUrl, domain.length());
if (StringUtils.startsWith(successUrl, ctxPath)) {
successUrl = StringUtils.substringAfter(successUrl, ctxPath);
}
}
if (StringUtils.isBlank(successUrl)){
// 登录后重定向地址验证,如果是非法地址,则指定默认的登录成功地址
if (!ServletUtils.isAllowRedirects(request, successUrl) || StringUtils.isBlank(successUrl)){
successUrl = Global.getProperty("shiro.successUrl");
}
@@ -361,7 +363,7 @@ public class LoginController extends BaseController{
}
/**
* 切换系统菜单(仅超级管理员有权限
* 切换系统菜单(菜单归属子系统
*/
@RequiresPermissions("user")
@RequestMapping(value = "switch/{sysCode}")
@@ -372,6 +374,9 @@ public class LoginController extends BaseController{
}else{
session.removeAttribute("sysCode");
}
// 切换系统时,清除当前岗位和角色状态
session.removeAttribute("postCode");
session.removeAttribute("roleCode");
UserUtils.removeCache(UserUtils.CACHE_AUTH_INFO+"_"+session.getId());
if (ServletUtils.isAjaxRequest(request)) {
return renderResult(Global.TRUE, text("子系统切换成功"));
@@ -380,7 +385,7 @@ public class LoginController extends BaseController{
}
/**
* 切换角色菜单(仅超级管理员有权限
* 切换角色菜单(用户->角色
*/
@RequiresPermissions("user")
@RequestMapping(value = {"switchRole","switchRole/{roleCode}"})
@@ -397,6 +402,39 @@ public class LoginController extends BaseController{
}
return REDIRECT + adminPath + "/index";
}
/**
* 切换岗位菜单(用户->岗位->角色v4.9.2
*/
@RequiresPermissions("user")
@RequestMapping(value = {"switchPost","switchPost/{postCode}"})
public String switchPost(@PathVariable(required=false) String postCode, HttpServletRequest request) {
Session session = UserUtils.getSession();
if (StringUtils.isNotBlank(postCode)){
PostRole where = new PostRole();
where.setPostCode(postCode);
where.sqlMap().loadJoinTableAlias("r");
List<String> roleCodes = ListUtils.newArrayList();
postService.findPostRoleList(where).forEach(e -> {
if (e.getRole() != null && PostRole.STATUS_NORMAL.equals(e.getRole().getStatus())) {
roleCodes.add(e.getRoleCode());
}
});
if (roleCodes.isEmpty()){
roleCodes.add("__none__");
}
session.setAttribute("postCode", postCode);
session.setAttribute("roleCode", StringUtils.joinComma(roleCodes)); // 5.4.0+ 支持多个,逗号隔开
}else{
session.removeAttribute("postCode");
session.removeAttribute("roleCode");
}
UserUtils.removeCache(UserUtils.CACHE_AUTH_INFO+"_"+session.getId());
if (ServletUtils.isAjaxRequest(request)) {
return renderResult(Global.TRUE, text("岗位切换成功"));
}
return REDIRECT + adminPath + "/index";
}
/**
* 切换主题风格

View File

@@ -79,7 +79,7 @@ public class PostController extends BaseController {
List<String> roleCodes = ListUtils.newArrayList();
List<String> roleNames = ListUtils.newArrayList();
postService.findPostRoleList(where).forEach(e -> {
if (e.getRole() != null) {
if (e.getRole() != null && PostRole.STATUS_NORMAL.equals(e.getRole().getStatus())) {
roleCodes.add(e.getRoleCode());
roleNames.add(e.getRole().getRoleName());
}

View File

@@ -110,9 +110,6 @@ public class CorpAdminController extends BaseController {
if (!user.currentUser().isSuperAdmin()){
return renderResult(Global.FALSE, text("越权操作,只有超级管理员才能修改此数据!"));
}
if (User.isSuperAdmin(user.getUserCode())) {
return renderResult(Global.FALSE, text("非法操作,不能够操作此用户!"));
}
if (!EmpUser.USER_TYPE_EMPLOYEE.equals(user.getUserType())){
return renderResult(Global.FALSE, text("非法操作,不能够操作此用户!"));
}

View File

@@ -161,9 +161,6 @@ public class EmpUserController extends BaseController {
@PostMapping(value = "save")
@ResponseBody
public String save(@Validated EmpUser empUser, @Parameter(description = "操作类型") String op, HttpServletRequest request) {
if (User.isSuperAdmin(empUser.getUserCode())) {
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
if (!EmpUser.USER_TYPE_EMPLOYEE.equals(empUser.getUserType())){
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
@@ -375,9 +372,6 @@ public class EmpUserController extends BaseController {
@RequestMapping(value = "saveAuthDataScope")
@ResponseBody
public String saveAuthDataScope(EmpUser empUser, HttpServletRequest request) {
if (User.isSuperAdmin(empUser.getUserCode())) {
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}
if (!EmpUser.USER_TYPE_EMPLOYEE.equals(empUser.getUserType())){
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");
}

View File

@@ -91,9 +91,6 @@ public class SecAdminController extends BaseController {
@PostMapping(value = "save")
@ResponseBody
public String save(@Validated User user) {
if (User.isSuperAdmin(user.getUserCode())) {
return renderResult(Global.FALSE, text("非法操作,不能够操作此用户!"));
}
if (!User.USER_TYPE_EMPLOYEE.equals(user.getUserType())){
return renderResult(Global.FALSE, text("非法操作,不能够操作此用户!"));
}

View File

@@ -149,6 +149,9 @@ user:
# 二级管理员的控制权限类型1拥有的权限 2管理的权限管理功能包括用户管理、组织机构、公司管理等v4.1.5+
adminCtrlPermi: 2
# 是否启用岗位角色,开启后将 用户->岗位->关联角色,纳入菜单和权限管理
postRolePermi: false
# 多租户模式SAAS模式专业版
useCorpModel: false

View File

@@ -10,8 +10,8 @@
JOIN ${_prefix}sys_employee_post b ON b.post_code = a.post_code
</if>
<if test="userCode != null and userCode != ''">
JOIN ${_prefix}sys_employee_post b2 on b2.post_code = a.post_code
JOIN ${_prefix}sys_user u on u.ref_code = b2.emp_code AND u.user_type = 'employee'
JOIN ${_prefix}sys_employee_post b2 ON b2.post_code = a.post_code
JOIN ${_prefix}sys_user u ON u.ref_code = b2.emp_code AND u.user_type = 'employee'
</if>
<where>
${sqlMap.where.toSql()}

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2013-Now http://jeesite.com All rights reserved.
No deletion without permission, or be held responsible to law. -->
<template>
<name>http.api.js</name>
<filePath>${frontDir}/common</filePath>
<fileName>http.api.${className}.js</fileName>
<content><![CDATA[
const install = (Vue, vm) => {
vm.$u.api = {
// 请将以下 ${functionName} 代码,复制到 http.api.js 文件中
// ${functionName} 开始
${className}: {
form: (params = {}) => vm.$u.post(config.adminPath+'/${urlPrefix}/form', params),
list: (params = {}) => vm.$u.post(config.adminPath+'/${urlPrefix}/listData', params),
save: (params = {}) => vm.$u.postJson(config.adminPath+'/${urlPrefix}/save', params),
<% if(toBoolean(table.optionMap['isHaveDisableEnable'])){ %>
disable: (params = {}) => vm.$u.post(config.adminPath+'/${urlPrefix}/disable', params),
enable: (params = {}) => vm.$u.post(config.adminPath+'/${urlPrefix}/enable', params),
<% } %>
delete: (params = {}) => vm.$u.post(config.adminPath+'/${urlPrefix}/delete', params),
},
// ${functionName} 结束
};
}
export default {
install
}
]]>
</content>
</template>

View File

@@ -0,0 +1,282 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2013-Now http://jeesite.com All rights reserved.
No deletion without permission, or be held responsible to law. -->
<template>
<name>form.vue</name>
<filePath>${frontDir}/pages/${urlPrefix}</filePath>
<fileName>form.vue</fileName>
<content><![CDATA[
<template>
<view class="wrap">
<u-form class="form" :model="model" :rules="rules" ref="uForm" label-position="left">
<%
var userselectExists = false;
var officeselectExists = false;
var companyselectExists = false;
var areaselectExists = false;
for(c in table.columnList){
if(c.isQuery == "1" && !c.isTreeEntityColumn){
if(c.showType == 'userselect'){
userselectExists = true;
}else if(c.showType == 'officeselect'){
officeselectExists = true;
}else if(c.showType == 'companyselect'){
companyselectExists = true;
}else if(c.showType == 'areaselect'){
areaselectExists = true;
}
}
}
%>
<%
for (c in table.columnList){
if (c.isEdit == '1' && c.showType != 'hidden'){
// 如果是树结构的字段,则自动忽略
if(table.isTreeEntity && @StringUtils.inString(c.columnName, 'parent_code',
'parent_codes', 'tree_sorts', 'tree_leaf', 'tree_level', 'tree_names')
&& c.attrName != table.treeViewCodeAttrName
&& c.attrName != table.treeViewNameAttrName){
continue;
}
%>
<% if(c.showType == 'input'){ %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<u-input placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" type="text" maxlength="${c.dataLength}"></u-input>
</u-form-item>
<% }else if(c.showType == 'textarea'){ %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180" label-position="top">
<u-input type="textarea" placeholder="请输入${c.columnLabel}" v-model="model.testTextarea" height="100" maxlength="${c.dataLength}" />
</u-form-item>
<% }else if(c.showType == 'select' || c.showType == 'select_multiple'){
var isMultiple = (c.showType == 'select_multiple'); %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<js-select v-model="model.${c.attrName}" dict-type="${c.optionMap['dictType']}"<% if(isMultiple){ %> multiple="true"<% } %> placeholder="请选择${c.columnLabel}"></js-select>
</u-form-item>
<% }else if(c.showType == 'radio'){ %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<js-radio v-model="model.${c.attrName}" dict-type="${c.optionMap['dictType']}"></js-radio>
</u-form-item>
<% }else if(c.showType == 'checkbox'){ %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<js-checkbox v-model="model.${c.attrName}" dict-type="${c.optionMap['dictType']}"></js-checkbox>
</u-form-item>
<% }else if(c.showType == 'date' || c.showType == 'datetime'){
var isTime = (c.showType == 'datetime'); %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<u-input placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" format="yyyy-MM-dd${isTime?' HH:mm':''}" type="text" maxlength="${c.dataLength}"></u-input>
</u-form-item>
<% }else if(c.showType == 'userselect'){ %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<js-select v-model="model.${c.attrName}" :items="${c.attrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
:label-value="model.${c.attrName2}" @label-input="model.${c.attrName2} = $event"<% } %>></js-select>
</u-form-item>
<% }else if(c.showType == 'officeselect'){ %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<js-select v-model="model.${c.attrName}" :items="${c.attrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
:label-value="model.${c.attrName2}" @label-input="model.${c.attrName2} = $event"<% } %>></js-select>
</u-form-item>
<% }else if(c.showType == 'companyselect'){ %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<js-select v-model="model.${c.attrName}" :items="${c.attrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
:label-value="model.${c.attrName2}" @label-input="model.${c.attrName2} = $event"<% } %>></js-select>
</u-form-item>
<% }else if(c.showType == 'areaselect'){ %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<js-select v-model="model.${c.attrName}" :items="${c.attrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
:label-value="model.${c.attrName2}" @label-input="model.${c.attrName2} = $event"<% } %>></js-select>
</u-form-item>
<% }else{ %>
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
<u-input placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" type="text" maxlength="${c.dataLength}"></u-input>
</u-form-item>
<% } %>
<%
}
}
%>
<% if(toBoolean(table.optionMap['isImageUpload'])){ %>
<u-form-item label="上传图片" prop="images" label-position="top">
<js-uploadfile v-model="model.dataMap" :biz-key="model.id" biz-type="${className}_image"></js-uploadfile>
</u-form-item>
</u-form>
<% } %>
<view class="form-footer">
<u-button class="btn" type="primary" @click="submit">提交</u-button>
<!-- <u-button class="btn" type="default" @click="cancel">关闭</u-button> -->
</view>
</view>
</template>
<script>
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
export default {
data() {
return {
model: {
id: '',
<%
for (c in table.columnList){
if (c.isEdit == '1' && c.showType != 'hidden'){
// 如果是树结构的字段,则自动忽略
if(table.isTreeEntity && @StringUtils.inString(c.columnName, 'parent_code',
'parent_codes', 'tree_sorts', 'tree_leaf', 'tree_level', 'tree_names')
&& c.attrName != table.treeViewCodeAttrName
&& c.attrName != table.treeViewNameAttrName){
continue;
}
%>
<% if(c.showType == 'userselect'){ %>
${c.simpleAttrName}: {
userCode: '',
userName: ''
},
<% }else if(c.showType == 'officeselect'){ %>
${c.simpleAttrName}: {
officeCode: '',
officeName: ''
},
<% }else if(c.showType == 'companyselect'){ %>
${c.simpleAttrName}: {
companyCode: '',
companyName: ''
},
<% }else if(c.showType == 'areaselect'){ %>
${c.simpleAttrName}: {
areaCode: '',
areaName: ''
},
<% }else{ %>
${c.attrName}: '',
<% } %>
<%
}
}
%>
},
rules: {
<%
for (c in table.columnList){
if (c.isEdit == '1' && c.showType != 'hidden'){
// 如果是树结构的字段,则自动忽略
if(table.isTreeEntity && @StringUtils.inString(c.columnName, 'parent_code',
'parent_codes', 'tree_sorts', 'tree_leaf', 'tree_level', 'tree_names')
&& c.attrName != table.treeViewCodeAttrName
&& c.attrName != table.treeViewNameAttrName){
continue;
}
%>
<% if(c.isRequired == '1'){ %>
'${c.attrName}': [
{
required: true,
message: '请输入${c.columnLabel}',
trigger: ['change','blur'],
}
],
<% } %>
<%
}
}
%>
},
<%
for (c in table.columnList){
if (c.isEdit == '1' && c.showType != 'hidden'){
// 如果是树结构的字段,则自动忽略
if(table.isTreeEntity && @StringUtils.inString(c.columnName, 'parent_code',
'parent_codes', 'tree_sorts', 'tree_leaf', 'tree_level', 'tree_names')
&& c.attrName != table.treeViewCodeAttrName
&& c.attrName != table.treeViewNameAttrName){
continue;
}
%>
<% if(c.showType == 'userselect'){ %>
${c.simpleAttrName}List: [],
<% }else if(c.showType == 'officeselect'){ %>
${c.simpleAttrName}List: [],
<% }else if(c.showType == 'companyselect'){ %>
${c.simpleAttrName}List: [],
<% }else if(c.showType == 'areaselect'){ %>
${c.simpleAttrName}List: [],
<% } %>
<%
}
}
%>
};
},
onLoad(params){
this.$u.api.${className}.form(params).then(res => {
Object.assign(this.model, res.${className});
this.$refs.uForm.setRules(this.rules);
<%
for (c in table.columnList){
if (c.isEdit == '1' && c.showType != 'hidden'){
// 如果是树结构的字段,则自动忽略
if(table.isTreeEntity && @StringUtils.inString(c.columnName, 'parent_code',
'parent_codes', 'tree_sorts', 'tree_leaf', 'tree_level', 'tree_names')
&& c.attrName != table.treeViewCodeAttrName
&& c.attrName != table.treeViewNameAttrName){
continue;
}
%>
<% if(c.showType == 'userselect'){ %>
this.$u.api.office.treeData({isLoadUser: true}).then(res => {
this.${c.simpleAttrName}List = res;
});
<% }else if(c.showType == 'officeselect'){ %>
this.$u.api.office.treeData().then(res => {
this.${c.simpleAttrName}List = res;
});
<% }else if(c.showType == 'companyselect'){ %>
this.$u.api.company.treeData().then(res => {
this.${c.simpleAttrName}List = res;
});
<% }else if(c.showType == 'areaselect'){ %>
this.$u.api.area.treeData().then(res => {
this.${c.simpleAttrName}List = res;
});
<% } %>
<%
}
}
%>
});
},
methods: {
submit() {
this.$refs.uForm.validate(valid => {
if (valid) {
// console.log('${className}-save: ' + JSON.stringify(this.model));
this.$u.api.${className}.save(this.model).then(res => {
uni.showModal({
title: '提示',
content: res.message,
showCancel: false,
success: function () {
if (res.result == 'true') {
uni.setStorageSync('refreshList', true);
uni.navigateBack();
}
}
});
});
} else {
this.$u.toast('您填写的信息有误,请根据提示修正。');
}
});
},
cancel() {
uni.navigateBack();
}
}
};
</script>
<style lang="scss">
</style>
<% %>
]]>
</content>
</template>

View File

@@ -0,0 +1,162 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2013-Now http://jeesite.com All rights reserved.
No deletion without permission, or be held responsible to law. -->
<template>
<name>list.vue</name>
<filePath>${frontDir}/pages/${urlPrefix}</filePath>
<fileName>list.vue</fileName>
<content><![CDATA[
<template>
<view class="wrap">
<view class="search">
<u-search v-model="keywords" @custom="search" @search="search"></u-search>
</view>
<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
<u-cell-group class="list" :border="false">
<u-swipe-action :options="options" v-for="(item, index) in list" :key="item.id" :index="index" @click="optionsClick">
<%
var idParam = '', idParam2 = '';
for(pk in table.pkList){
idParam = idParam + (pk.attrName + '=\'+item.' + pk.attrName);
idParam2 = idParam2 + ('item.' + pk.attrName);
if (pkLP.index != table.pkList.~size) {
idParam = idParam + '&';
idParam2 = idParam2 + ' || ';
}
}
for(c in table.columnList){
if(c.isList == "1"){
// 如果是树结构的字段,则自动忽略
if(table.isTreeEntity && @StringUtils.inString(c.columnName, 'parent_code',
'parent_codes', 'tree_sorts', 'tree_leaf', 'tree_level', 'tree_names')
&& c.attrName != table.treeViewCodeAttrName
&& c.attrName != table.treeViewNameAttrName){
continue;
}
%>
<u-cell-item :arrow="true" @click="navTo('form?${idParam})">
<text slot="title">{{item.${c.attrName} || ${idParam2}}}</text>
<text slot="label">创建者:{{item.createBy}} &nbsp;|&nbsp; 时间:{{item.createDate}}</text>
</u-cell-item>
<%
break;
}
}
%>
</u-swipe-action>
</u-cell-group>
<view class="loadmore" @click="loadMore">
<u-loadmore :status="loadStatus"></u-loadmore>
</view>
</scroll-view>
<view class="btn-plus" @click="navTo('form')">
<u-icon name="plus-circle-fill" size="90" color="#3d87ff"></u-icon>
</view>
</view>
</template>
<script>
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
export default {
data() {
return {
keywords: '',
query: {
pageNo: 1,
pageSize: 20
},
list: [],
count: 0,
loadStatus: 'loadmore',
options: [
{text: '上传', style: { background: '#414ee0'}},
{text: '删除', style: { background: '#dd524d'}}
]
};
},
onLoad() {
this.loadList();
},
onShow() {
if (uni.getStorageSync('refreshList') === true){
uni.removeStorageSync('refreshList');
this.search('');
}
},
methods: {
loadMore() {
this.loadStatus = "loading";
setTimeout(() => {
this.query.pageNo += 1;
this.loadList();
}, 100);
},
loadList() {
this.$u.api.${className}.list(this.query).then(res => {
if (!res.list || res.list.length == 0){
this.loadStatus = "nomore";
return;
}
this.list = this.list.concat(res.list);
this.count = res.count;
this.query.pageNo = res.pageNo;
this.query.pageSize = res.pageSize;
this.loadStatus = "loadmore";
});
},
optionsClick(rowIndex, btnIndex) {
let self = this, row = self.list[rowIndex];
if(btnIndex == 0) {
this.navTo('formUpload?id='+row.id);
} else if(btnIndex == 1) {
uni.showModal({
title: '提示',
content: '确认要删除该数据吗?',
showCancel: true,
success: function (res2) {
if (res2.confirm) {
self.$u.api.${className}.delete({id: row.id}).then(res => {
self.$u.toast(res.message);
if (res.result == 'true'){
self.list.splice(rowIndex, 1);
}
});
}
}
});
}
},
search(value) {
this.list = [];
this.query.pageNo = 0;
this.query.testInput = value;
this.loadList();
},
navTo(url) {
uni.navigateTo({
url: url
});
}
}
};
</script>
<style lang="scss">
page {
background-color: #f8f8f8;
}
.btn-plus {
position: absolute;
bottom: 50rpx;
right: 50rpx;
z-index: 1;
opacity: 0.6;
}
.btn-plus:hover {
opacity: 1;
}
</style>
<% %>
]]>
</content>
</template>

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2013-Now http://jeesite.com All rights reserved.
No deletion without permission, or be held responsible to law. -->
<template>
<name>pages.json</name>
<filePath>${frontDir}</filePath>
<fileName>pages.${className}.json</fileName>
<content><![CDATA[
{
"pages": [
/* 请将以下 ${functionName} 代码,复制到 pages.json 文件中 */
/* ${functionName} 开始 */
{
"path": "pages/${className}/form",
"style": {
"navigationBarTitleText": "新增编辑"
}
},
{
"path": "pages/${className}/list",
"style": {
"navigationBarTitleText": "${functionName}"
}
},
/* ${functionName} 结束 */
],
}
]]>
</content>
</template>

View File

@@ -16,40 +16,40 @@
</category>
<category value="crud_vue" label="单表/主子表 (增删改查) vue">
<template>category-ref:crud_java</template>
<template>crud/vueApi.xml</template>
<template>crud/vueList.xml</template>
<template>crud/vueForm.xml</template>
<template>crud/vueIndex.xml</template>
<template>crud/vueImport.xml</template>
<template>vue/vueApi.xml</template>
<template>vue/vueList.xml</template>
<template>vue/vueForm.xml</template>
<template>vue/vueIndex.xml</template>
<template>vue/vueImport.xml</template>
<childTable>
<template>category-ref:dao</template>
<template>crud/vueFormChildList.xml</template>
<template>vue/vueFormChildList.xml</template>
</childTable>
</category>
<category value="crud_only_vue" label="单表/主子表 (增删改查) 仅vue">
<template>crud/vueApi.xml</template>
<template>crud/vueList.xml</template>
<template>crud/vueForm.xml</template>
<template>crud/vueIndex.xml</template>
<template>crud/vueImport.xml</template>
<template>vue/vueApi.xml</template>
<template>vue/vueList.xml</template>
<template>vue/vueForm.xml</template>
<template>vue/vueIndex.xml</template>
<template>vue/vueImport.xml</template>
<childTable>
<template>crud/vueFormChildList.xml</template>
<template>vue/vueFormChildList.xml</template>
</childTable>
</category>
<category value="crud_only_vue_modal" label="单表/主子表 (增删改查,弹窗表单) 仅vue ">
<template>category-ref:crud_only_vue</template>
<childTable>
<template>crud/vueFormChildList.xml</template>
<template>vue/vueFormChildList.xml</template>
</childTable>
</category>
<category value="crud_only_vue_modal_route" label="单表/主子表 (增删改查,路由表单) 仅vue ">
<template>crud/vueApi.xml</template>
<template>crud/vueList.xml</template>
<template>crud/vueFormRoute.xml</template>
<template>crud/vueIndex.xml</template>
<template>crud/vueImport.xml</template>
<template>vue/vueApi.xml</template>
<template>vue/vueList.xml</template>
<template>vue/vueFormRoute.xml</template>
<template>vue/vueIndex.xml</template>
<template>vue/vueImport.xml</template>
<childTable>
<template>crud/vueFormChildList.xml</template>
<template>vue/vueFormChildList.xml</template>
</childTable>
</category>
<category value="crud_select" label="单表/主子表 (增删改查,含 listselect 选择页面) beetl">
@@ -61,10 +61,10 @@
</category>
<category value="crud_select_vue" label="单表/主子表 (增删改查,含 listselect 选择页面) vue">
<template>category-ref:crud_vue</template>
<template>crud/vueSelect.xml</template>
<template>vue/vueSelect.xml</template>
<childTable>
<template>category-ref:dao</template>
<template>crud/vueFormChildList.xml</template>
<template>vue/vueFormChildList.xml</template>
</childTable>
</category>
<category value="crud_java" label="单表/主子表 (增删改查,只生成 java/mapper 仅后端 ">
@@ -86,14 +86,14 @@
</category>
<category value="crud_cloud_vue" label="单表/主子表 (增删改查 Cloud生成 api/client Vue">
<template>category-ref:crud_cloud_java</template>
<template>crud/vueApi.xml</template>
<template>crud/vueList.xml</template>
<template>crud/vueIndex.xml</template>
<template>crud/vueForm.xml</template>
<template>crud/vueImport.xml</template>
<template>vue/vueApi.xml</template>
<template>vue/vueList.xml</template>
<template>vue/vueIndex.xml</template>
<template>vue/vueForm.xml</template>
<template>vue/vueImport.xml</template>
<childTable>
<template>category-ref:dao_cloud</template>
<template>crud/vueFormChildList.xml</template>
<template>vue/vueFormChildList.xml</template>
</childTable>
</category>
<category value="crud_cloud_select" label="单表/主子表 (增删改查 Cloud含 listselect 选择页面) beetl">
@@ -105,10 +105,10 @@
</category>
<category value="crud_cloud_select_vue" label="单表/主子表 (增删改查 Cloud含 listselect 选择页面) vue">
<template>category-ref:crud_cloud_vue</template>
<template>crud/vueSelect.xml</template>
<template>vue/vueSelect.xml</template>
<childTable>
<template>category-ref:dao_cloud</template>
<template>crud/vueFormChildList.xml</template>
<template>vue/vueFormChildList.xml</template>
</childTable>
</category>
<category value="crud_cloud_java" label="单表/主子表 (增删改查 Cloud只生成 java/mapper 仅后端">
@@ -170,6 +170,12 @@
<template>query/dao.xml</template>
</childTable>
</category>
<category value="crud_only_app" label="手机端列表和表单单表App">
<template>app/appApi.xml</template>
<template>app/appList.xml</template>
<template>app/appForm.xml</template>
<template>app/appPages.xml</template>
</category>
</tplCategory>
<!-- 属性类型 -->
<attrType>

View File

@@ -6,6 +6,6 @@
<filePath>${baseDir}/src/main/resources/views/${lastPackageName}/${moduleName}/${subModuleName}</filePath>
<fileName>${className}Form.html</fileName>
<content><![CDATA[
<% include('/templates/modules/gen/include/viewForm.html'){} %>]]>
<% include('/templates/modules/gen/view/viewForm.html'){} %>]]>
</content>
</template>

View File

@@ -6,6 +6,6 @@
<filePath>${baseDir}/src/main/resources/views/${lastPackageName}/${moduleName}/${subModuleName}</filePath>
<fileName>${className}Index.html</fileName>
<content><![CDATA[
<% include('/templates/modules/gen/include/viewIndex.html'){} %>]]>
<% include('/templates/modules/gen/view/viewIndex.html'){} %>]]>
</content>
</template>

View File

@@ -6,6 +6,6 @@
<filePath>${baseDir}/src/main/resources/views/${lastPackageName}/${moduleName}/${subModuleName}</filePath>
<fileName>${className}List.html</fileName>
<content><![CDATA[
<% include('/templates/modules/gen/include/viewList.html'){} %>]]>
<% include('/templates/modules/gen/view/viewList.html'){} %>]]>
</content>
</template>

View File

@@ -6,6 +6,6 @@
<filePath>${baseDir}/src/main/resources/views/${lastPackageName}/${moduleName}/${subModuleName}</filePath>
<fileName>${className}Select.html</fileName>
<content><![CDATA[
<% include('/templates/modules/gen/include/viewSelect.html'){} %>]]>
<% include('/templates/modules/gen/view/viewSelect.html'){} %>]]>
</content>
</template>

View File

@@ -6,6 +6,6 @@
<filePath>${baseDir}/${moduleName}/src/main/resources/views/${lastPackageName}/${moduleName}/${subModuleName}</filePath>
<fileName>${className}Form.html</fileName>
<content><![CDATA[
<% include('/templates/modules/gen/include/viewForm.html'){} %>]]>
<% include('/templates/modules/gen/view/viewForm.html'){} %>]]>
</content>
</template>

View File

@@ -6,6 +6,6 @@
<filePath>${baseDir}/${moduleName}/src/main/resources/views/${lastPackageName}/${moduleName}/${subModuleName}</filePath>
<fileName>${className}Index.html</fileName>
<content><![CDATA[
<% include('/templates/modules/gen/include/viewIndex.html'){} %>]]>
<% include('/templates/modules/gen/view/viewIndex.html'){} %>]]>
</content>
</template>

View File

@@ -6,6 +6,6 @@
<filePath>${baseDir}/${moduleName}/src/main/resources/views/${lastPackageName}/${moduleName}/${subModuleName}</filePath>
<fileName>${className}List.html</fileName>
<content><![CDATA[
<% include('/templates/modules/gen/include/viewList.html'){} %>]]>
<% include('/templates/modules/gen/view/viewList.html'){} %>]]>
</content>
</template>

View File

@@ -6,6 +6,6 @@
<filePath>${baseDir}/${moduleName}/src/main/resources/views/${lastPackageName}/${moduleName}/${subModuleName}</filePath>
<fileName>${className}Select.html</fileName>
<content><![CDATA[
<% include('/templates/modules/gen/include/viewSelect.html'){} %>]]>
<% include('/templates/modules/gen/view/viewSelect.html'){} %>]]>
</content>
</template>

View File

@@ -44,8 +44,8 @@
</div>
</div>
<% } %>
<% include('/templates/modules/gen/include/formControl.html'){} %>
<% include('/templates/modules/gen/include/formChildTable.html'){} %>
<% include('/templates/modules/gen/view/formControl.html'){} %>
<% include('/templates/modules/gen/view/formChildTable.html'){} %>
</div>
<div class="box-footer">
<div class="row">
@@ -58,6 +58,6 @@
</div>
</div>
\<% } %>
<% include('/templates/modules/gen/include/formChildTableScript.html'){} %>]]>
<% include('/templates/modules/gen/view/formChildTableScript.html'){} %>]]>
</content>
</template>

View File

@@ -24,7 +24,7 @@
</div>
</div>
<div class="box-body">
<% include('/templates/modules/gen/include/searchForm.html'){} %>
<% include('/templates/modules/gen/view/searchForm.html'){} %>
<table id="dataGrid"></table>
<% if(!table.isTreeEntity){ %>
<div id="dataGridPage"></div>
@@ -33,6 +33,6 @@
</div>
</div>
\<% } %>
<% include('/templates/modules/gen/include/dataGridScript.html'){} %>]]>
<% include('/templates/modules/gen/view/dataGridScript.html'){} %>]]>
</content>
</template>

View File

@@ -38,8 +38,8 @@
</div>
</div>
<% } %>
<% include('/templates/modules/gen/include/formControl.html'){} %>
<% include('/templates/modules/gen/include/formChildTable.html'){} %>
<% include('/templates/modules/gen/view/formControl.html'){} %>
<% include('/templates/modules/gen/view/formChildTable.html'){} %>
<% if(toBoolean(table.optionMap['isBpmForm'])){ %>
<div class="row taskComment hide">
<div class="col-xs-12">
@@ -78,7 +78,7 @@
</div>
</div>
\<% } %>
<% include('/templates/modules/gen/include/formChildTableScript.html'){} %>
<% include('/templates/modules/gen/view/formChildTableScript.html'){} %>
<script>
<% if(toBoolean(table.optionMap['isBpmForm'])){ %>
// 业务实现草稿按钮

View File

@@ -27,7 +27,7 @@
</div>
</div>
<div class="box-body">
<% include('/templates/modules/gen/include/searchForm.html'){} %>
<% include('/templates/modules/gen/view/searchForm.html'){} %>
<table id="dataGrid"></table>
<% if(!table.isTreeEntity){ %>
<div id="dataGridPage"></div>
@@ -36,7 +36,7 @@
</div>
</div>
\<% } %>
<% include('/templates/modules/gen/include/dataGridScript.html'){} %>
<% include('/templates/modules/gen/view/dataGridScript.html'){} %>
<% if(toBoolean(table.optionMap['isImportExport'])){ %>
<script>
$('#btnExport').click(function(){

View File

@@ -2,7 +2,7 @@
<div class="main-content">
<div class="box box-main">
<div class="box-body">
<% include('/templates/modules/gen/include/searchForm.html'){} %>
<% include('/templates/modules/gen/view/searchForm.html'){} %>
<div class="row">
<div class="col-xs-10 pr10">
<table id="dataGrid"></table>
@@ -18,4 +18,4 @@
</div>
</div>
\<% } %>
<% include('/templates/modules/gen/include/dataGridSelectScript.html'){} %>
<% include('/templates/modules/gen/view/dataGridSelectScript.html'){} %>

View File

@@ -18,7 +18,7 @@
<i class="fa fa-sign-out"></i> ${text('退出登录')}</a>
</li>
<% var sysCodes = [];
for(var role in user.roleList) {
for(var role in roleList) {
var codes = @StringUtils.splitComma(role.sysCodes);
if (!isEmpty(codes)) {
for (var code in codes) {
@@ -47,12 +47,25 @@
<% }else{ %>
<li class="mt10"></li>
<% } %>
<% if(user.roleList.~size > 0){ %>
<% if(postList.~size > 0){ %>
<li class="divider"></li>
<% var postCode = @ObjectUtils.toStringIgnoreNull(session.postCode, ''); %>
<li class="dropdown-header mb5">${text('选择岗位')}<% if(isNotBlank(postCode)){ %>
<i class="fa fa-close pointer" title="${text('清除设置')}" onclick="location='${ctx}/switchPost'"></i><% } %></li>
<% for(var post in postList){ %>
<li>
<a href="${ctx}/switchPost/${post.postCode}">
<i class="fa fa-${postCode == post.postCode
? 'check-' : ''}circle-o"></i> ${post.postName}
</a>
</li>
<% } %>
<% } else if(roleList.~size > 0){ %>
<li class="divider"></li>
<% var roleCode = @ObjectUtils.toStringIgnoreNull(session.roleCode, ''); %>
<li class="dropdown-header mb5">${text('选择身份')}<% if(isNotBlank(roleCode)){ %>
<i class="fa fa-close pointer" title="${text('清除设置')}" onclick="location='${ctx}/switchRole'"></i><% } %></li>
<% for(var role in user.roleList){ if(role.isShow == '1'){ %>
<% for(var role in roleList){ if(role.isShow == '1'){ %>
<li>
<a href="${ctx}/switchRole/${role.roleCode}">
<i class="fa fa-${roleCode == role.roleCode

View File

@@ -66,14 +66,14 @@
</div>
<div class="form-group has-feedback">
<span class="fa fa-lock form-control-feedback"></span>
<input type="password" autocomplete="off" id="fp_password" name="password"
<input type="password" autocomplete="new-password" id="fp_password" name="password"
class="form-control required" data-msg-required="请填写新密码."
rangelength="3,50" data-msg-rangelength="新密码长度不能小于3并大于50个字符."
placeholder="新密码" />
</div>
<div class="form-group has-feedback">
<span class="fa fa-lock form-control-feedback"></span>
<input type="password" autocomplete="off" id="fp_confirmPassword" name="confirmPassword"
<input type="password" autocomplete="new-password" id="fp_confirmPassword" name="confirmPassword"
class="form-control required" data-msg-required="请填写确认新密码."
rangelength="3,50" data-msg-rangelength="新密码长度不能小于3并大于50个字符."
equalTo="#fp_password" data-msg-equalTo="新密码与确认新密码不同."

View File

@@ -57,14 +57,14 @@
</div>
<div class="form-group has-feedback">
<span class="fa fa-lock form-control-feedback"></span>
<input type="password" autocomplete="off" id="reg_password" name="password"
<input type="password" autocomplete="new-password" id="reg_password" name="password"
class="form-control required" data-msg-required="请填写登录密码."
rangelength="3,50" data-msg-rangelength="登录密码长度不能小于3并大于50个字符."
placeholder="登录密码" />
</div>
<div class="form-group has-feedback">
<span class="fa fa-lock form-control-feedback"></span>
<input type="password" autocomplete="off" id="reg_confirmPassword" name="confirmPassword"
<input type="password" autocomplete="new-password" id="reg_confirmPassword" name="confirmPassword"
class="form-control required" data-msg-required="请再填一次登录密码."
rangelength="3,50" data-msg-rangelength="登录密码长度不能小于3并大于50个字符."
equalTo="#reg_password" data-msg-equalTo="填写的密码与登录密码不同."

View File

@@ -256,7 +256,7 @@ $("#empOfficeGrid").dataGrid({
}
}
},
{header:'${text("操作")}', name:'actions', width:80, sortable:false, fixed:true, formatter: function(val, obj, row, act){
{header:'${text("操作")}', name:'actions', width:80, align:"center", sortable:false, fixed:true, formatter: function(val, obj, row, act){
var actions = [];
actions.push('<a href="#" onclick="js.confirm(\'${text("你确认要删除这条数据吗?")}\', function(){$(\'#empOfficeGrid\').dataGrid(\'delRowData\',\''+obj.rowId+'\')});return false;"><i class="fa fa-trash-o"></i></a>&nbsp;');
return actions.join('');

View File

@@ -132,7 +132,7 @@
<div class="form-group">
<label class="control-label col-sm-3">${text('旧密码')}</label>
<div class="col-sm-8">
<input id="oldPassword" name="oldPassword" type="password" autocomplete="off" value="" maxlength="50" minlength="3" class="form-control required"/>
<input id="oldPassword" name="oldPassword" type="password" autocomplete="new-password" value="" maxlength="50" minlength="3" class="form-control required"/>
</div>
</div>
</div>
@@ -141,7 +141,7 @@
<label class="control-label col-sm-3">${text('新密码')}</label>
<div class="col-sm-8">
<div class="strength strength-loose">
<input id="newPassword" name="newPassword" type="password" autocomplete="off" value="" maxlength="50" minlength="3" class="form-control required"/>
<input id="newPassword" name="newPassword" type="password" autocomplete="new-password" value="" maxlength="50" minlength="3" class="form-control required"/>
</div>
</div>
</div>
@@ -150,7 +150,7 @@
<div class="form-group">
<label class="control-label col-sm-3">${text('确认新密码')}</label>
<div class="col-sm-8">
<input id="confirmNewPassword" name="confirmNewPassword" type="password" autocomplete="off" value="" maxlength="50" minlength="3" class="form-control required" equalTo="#newPassword"/>
<input id="confirmNewPassword" name="confirmNewPassword" type="password" autocomplete="new-password" value="" maxlength="50" minlength="3" class="form-control required" equalTo="#newPassword"/>
</div>
</div>
</div>
@@ -179,7 +179,7 @@
<div class="form-group">
<label class="control-label col-sm-3">${text('登录密码')}</label>
<div class="col-sm-8">
<input id="validPassword" name="validPassword" type="password" autocomplete="off" value="" maxlength="50" minlength="3" class="form-control required"/>
<input id="validPassword" name="validPassword" type="password" autocomplete="new-password" value="" maxlength="50" minlength="3" class="form-control required"/>
</div>
</div>
</div>

View File

@@ -5,7 +5,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite-modules</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite Modules</name>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
/*!
* jQuery Validation Plugin v1.16.0
/*
* jQuery Validation Plugin v 1 - 16 - 0
*
* http://jqueryvalidation.org/
*

View File

@@ -110,6 +110,7 @@ $(function(){
}
}
}
data.push({ name: '__be', value: '1'}); // back-end 标识后端,可减少一些逻辑
js.ajaxSubmit(action, data, function(data, status, xhr){
if (data.isValidCodeLogin == true){
$('#isValidCodeLogin').show();

View File

@@ -280,4 +280,4 @@ null)z=c}else z=c;y=e.justify?m[0]+(H?-1:1)*(p+l):a.getX(F===0||F===b.length-1?c
r._pos)E=r._attr.visibility,y=r.connX,z=r.connY,j=k?["M",y+(v[6]==="left"?5:-5),z,"C",y,z,2*v[2]-v[4],2*v[3]-v[5],v[2],v[3],"L",v[4],v[5]]:["M",y+(v[6]==="left"?5:-5),z,"L",v[2],v[3],"L",v[4],v[5]],i?(i.animate({d:j}),i.attr("visibility",E)):b.connector=i=a.chart.renderer.path(j).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.group);else if(i)b.connector=i.destroy()})}},verifyDataLabelOverflow:function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||
80,f;d[0]!==null?e=s(b[2]-s(a[1],a[3]),c):(e=s(b[2]-a[1]-a[3],c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=s(I(e,b[2]-s(a[0],a[2])),c):(e=s(I(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);e<b[2]?(b[2]=e,this.translate(b),n(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels()):f=!0;return f},placeDataLabels:function(){n(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved=!0):a&&a.attr({y:-999})})},alignDataLabel:pa,
drawTracker:F.prototype.drawTracker,drawLegendSymbol:G.prototype.drawLegendSymbol,getSymbol:pa};X=ha(Q,X);W.pie=X;r(Highcharts,{Axis:db,Chart:yb,Color:ra,Legend:eb,Pointer:xb,Point:Pa,Tick:Ma,Tooltip:wb,Renderer:Va,Series:Q,SVGElement:wa,SVGRenderer:Ha,arrayMin:Ja,arrayMax:va,charts:Ga,dateFormat:Xa,format:Ca,pathAnim:Ab,getOptions:function(){return M},hasBidiBug:Ub,isTouchDevice:Ob,numberFormat:Aa,seriesTypes:W,setOptions:function(a){M=x(M,a);Lb();return M},addEvent:J,removeEvent:aa,createElement:U,
discardElement:Ta,css:K,each:n,extend:r,map:Na,merge:x,pick:o,splat:ja,extendClass:ha,pInt:C,wrap:mb,svg:Z,canvas:$,vml:!Z&&!$,product:"Highcharts",version:"3.0.6"})})();
discardElement:Ta,css:K,each:n,extend:r,map:Na,merge:x,pick:o,splat:ja,extendClass:ha,pInt:C,wrap:mb,svg:Z,canvas:$,vml:!Z&&!$,product:"Highcharts",version:""})})();

View File

@@ -1,8 +1,8 @@
// ==ClosureCompiler==
// @compilation_level SIMPLE_OPTIMIZATIONS
/**
* @license Highcharts JS v3.0.6 (2013-10-04)
/*
* @license Highcharts JS v 3 - 0 - 6 (2013-10-04)
*
* (c) 2009-2013 Torstein Hønsi
*
@@ -55,7 +55,8 @@ var UNDEFINED,
noop = function () {},
charts = [],
PRODUCT = 'Highcharts',
VERSION = '3.0.6',
// VERSION = '3.0.6',
VERSION = '',
// some constants for frequently used strings
DIV = 'div',

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -6,13 +6,13 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.10</version>
<version>3.3.5</version>
<relativePath />
</parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite Parent</name>
@@ -26,7 +26,7 @@
<commons-text.version>1.12.0</commons-text.version>
<commons-email.version>1.6.0</commons-email.version>
<jackson-bom2.version>2.17.1</jackson-bom2.version>
<jackson-bom2.version>2.18.1</jackson-bom2.version>
<fastjson.version>2.0.51</fastjson.version>
<snakeyaml.version>2.2</snakeyaml.version>
@@ -56,6 +56,7 @@
<atomikos.version>6.0.0</atomikos.version>
<druid.version>1.2.23</druid.version>
<shiro.version>2.0.1</shiro.version>
<quartz.version>2.4.0-rc3</quartz.version>
<j2cache.version>2.8.0-release</j2cache.version>
<swagger3.version>2.2.22</swagger3.version>
<liquibase.version>4.20.0</liquibase.version>

View File

@@ -5,7 +5,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite</name>

View File

@@ -5,7 +5,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite-root</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite Root</name>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

View File

@@ -349,6 +349,9 @@ user:
#
# # 二级管理员的控制权限类型1拥有的权限 2管理的权限管理功能包括用户管理、组织机构、公司管理等v4.1.5+
# adminCtrlPermi: 2
#
# # 是否启用岗位角色,开启后将 用户->岗位->关联角色,纳入菜单和权限管理
# postRolePermi: false
# 多租户模式SAAS模式专业版
useCorpModel: false
@@ -501,6 +504,7 @@ job:
# isClustered: true
# dataSourceName: job
# clusterCheckinInterval: 1000
# driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# className: org.springframework.scheduling.quartz.LocalDataSourceJobStore
# # 调度日志

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
@@ -97,7 +97,7 @@
<dependency>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-vue-dist</artifactId>
<version>5.9.1-SNAPSHOT</version>
<version>5.9.2-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -7,7 +7,7 @@ jdbc:
# Mysql 数据库配置
type: h2
driver: org.h2.Driver
url: jdbc:h2:/data/jeesite-db/jeesite580
url: jdbc:h2:/data/jeesite-db/jeesite592
username: jeesite
password: jeesite
testSql: SELECT 1

View File

@@ -53,7 +53,7 @@ jdbc:
# H2 数据库配置(请修改 /modules/core/pom.xml 文件,打开 H2 DB 依赖)
type: h2
driver: org.h2.Driver
url: jdbc:h2:~/jeesite-db/jeesite580
url: jdbc:h2:~/jeesite-db/jeesite592
username: jeesite
password: jeesite
testSql: SELECT 1

View File

@@ -6,14 +6,14 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>jeesite-web-mini</artifactId>
<packaging>war</packaging>
<description>Web 服务,最小化加载,可以甚至关闭数据源</description>
<description>Web 服务,最小化加载,是一个小的微服务</description>
<name>JeeSite Web</name>
<url>http://jeesite.com</url>

15
web/README.md Normal file
View File

@@ -0,0 +1,15 @@
## 介绍
jeesite-web 是 JeeSite 的 Web 启动入口项目工程,
可直接运行 Application.java 文件,启动一个 Web 服务。
启动 Web 服务后,可通过网页浏览器访问 JeeSite 系统。
## 文档
部署文档http://jeesite.com/docs/install-deploy/
常见问题http://jeesite.com/docs/faq/
更多文档http://jeesite.com/docs

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.9.1.springboot3-SNAPSHOT</version>
<version>5.9.2.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

View File

@@ -349,6 +349,9 @@ user:
#
# # 二级管理员的控制权限类型1拥有的权限 2管理的权限管理功能包括用户管理、组织机构、公司管理等v4.1.5+
# adminCtrlPermi: 2
#
# # 是否启用岗位角色,开启后将 用户->岗位->关联角色,纳入菜单和权限管理
# postRolePermi: false
# 多租户模式SAAS模式专业版
useCorpModel: false
@@ -501,6 +504,7 @@ job:
# isClustered: true
# dataSourceName: job
# clusterCheckinInterval: 1000
# driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# className: org.springframework.scheduling.quartz.LocalDataSourceJobStore
# # 调度日志