From 9f6902f53d217ac621b53480fff3be427e8ed5dc Mon Sep 17 00:00:00 2001 From: qiankunpingtai Date: Fri, 26 Apr 2019 11:13:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E5=86=8C=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- erp_web/register.html | 10 +- sql/jsh_erp.sql | 77 ++++++++- .../jsh/erp/controller/UserController.java | 2 +- .../erp/datasource/mappers/UserMapperEx.java | 4 + .../com/jsh/erp/service/app/AppService.java | 7 +- .../com/jsh/erp/service/user/UserService.java | 160 +++++++++++++----- .../resources/mapper_xml/UserMapperEx.xml | 49 ++++-- 7 files changed, 252 insertions(+), 57 deletions(-) diff --git a/erp_web/register.html b/erp_web/register.html index 636853a9..1a34d55d 100644 --- a/erp_web/register.html +++ b/erp_web/register.html @@ -11,6 +11,7 @@ +
@@ -63,13 +64,20 @@ alert("确认密码不一致!"); } else { //执行注册 + /** + * create by: qiankunpingtai + * create time: 2019/4/24 15:01 + * website:https://qiankunpingtai.cn + * description: + * 密码加密后发送到后台 + */ $.ajax({ type: "post", url: "/user/registerUser", dataType: "json", data: ({ loginame: $("#user_name").val(), - password: $("#user_pwd").val() + password: hex_md5($.trim($("#user_pwd").val())) }), success: function (res) { if (res && res.code === 200) { diff --git a/sql/jsh_erp.sql b/sql/jsh_erp.sql index 386cc430..569b2c24 100644 --- a/sql/jsh_erp.sql +++ b/sql/jsh_erp.sql @@ -1618,4 +1618,79 @@ alter table jsh_app add tenant_id bigint(20) DEFAULT null COMMENT '租户id'; alter table jsh_functions add tenant_id bigint(20) DEFAULT null COMMENT '租户id'; alter table jsh_materialproperty add tenant_id bigint(20) DEFAULT null COMMENT '租户id'; alter table jsh_userbusiness add tenant_id bigint(20) DEFAULT null COMMENT '租户id'; - +-- ---------------------------- +-- 时间:2019年4月25日 +-- version:1.0.15 +-- 此次更新 +-- 添加一个函数,用于处理新用户注册的逻辑 +-- 传入参数用户的id、租户id、角色模板Id +-- 返回状态码 +-- 执行逻辑 +-- 创建超级管理员角色,然后根据角色模板Id对应的应用、功能创建新租户对应的应用、功能、角色 +-- 设置新用户的角色对应关系、应用对应关系、功能对应关系 +-- 复制一份产品扩展信息给新用户 +-- 1、分配应用 +-- 2、分配功能模块 +-- 3、分配产品扩展字段 +-- 4、分配角色(默认添加超级管理员角色,不可修改) +-- 5、写入用户角色模块关系 +-- 特别提醒:之后的sql都是在之前基础上迭代,可以对已存在的系统进行数据保留更新 +-- ---------------------------- +DROP FUNCTION IF EXISTS registerUserTemplate; +DELIMITER ;; +CREATE FUNCTION registerUserTemplate (userId bigint(20),tenantId bigint(20),roleId bigint(20)) RETURNS varchar(50) +begin +-- 返回1成功或者0失败 +declare _success_msg varchar(50) default '0'; +-- 创建超级管理员角色 +INSERT INTO jsh_role(Name, type, value, description, tenant_id, delete_Flag) VALUES ('超级管理员', NULL, NULL, '多租户超级管理员', tenantId, '0'); +set @roleId= (SELECT LAST_INSERT_ID()); +-- 根据角色模板id获取对应的应用列表,为新租户创建对应的应用列表 +set @appIdList = (select left(replace(replace(value,'[',''),']',','),length(replace(replace(value,'[',''),']',','))-1) from jsh_userbusiness where 1=1 and type='RoleAPP' and KeyId=roleId and ifnull(delete_Flag,'0') !='1'); + begin + set @i=length(@appIdList)-length(replace(@appIdList,',','')); + set @left_str=@appIdList; + while @i>0 + do + set @sub_str=substr(@left_str,1,instr(@left_str,',')-1); + set @left_str=substr(@left_str,length(@sub_str)+length(',')+1); + set @n=trim(@sub_str); + -- 创建应用 + insert into jsh_app (Number, Name, Type, Icon, URL, Width, Height, ReSize, OpenMax, Flash, ZL, Sort, Remark, Enabled,delete_Flag, tenant_id) select Number, Name, Type, Icon, URL, Width, Height, ReSize, OpenMax, Flash, ZL, Sort, Remark, Enabled,delete_Flag, tenantId from jsh_app where id=@n; + set @i=@i-1; + end while; + set @n=trim(@left_str); + insert into jsh_app (Number, Name, Type, Icon, URL, Width, Height, ReSize, OpenMax, Flash, ZL, Sort, Remark, Enabled,delete_Flag, tenant_id) select Number, Name, Type, Icon, URL, Width, Height, ReSize, OpenMax, Flash, ZL, Sort, Remark, Enabled,delete_Flag, tenantId from jsh_app where id=@n; + end; + -- 根据角色模板id获取对应的功能列表,为新租户创建对应的功能列表 +set @functionIdList = (select left(replace(replace(value,'[',''),']',','),length(replace(replace(value,'[',''),']',','))-1) from jsh_userbusiness where 1=1 and type='RoleFunctions' and KeyId=roleId and ifnull(delete_Flag,'0') !='1'); + begin + set @i=length(@functionIdList)-length(replace(@functionIdList,',','')); + set @left_str=@functionIdList; + while @i>0 + do + set @sub_str=substr(@left_str,1,instr(@left_str,',')-1); + set @left_str=substr(@left_str,length(@sub_str)+length(',')+1); + set @n=trim(@sub_str); + -- 创建应用 + insert into jsh_functions (Number, Name, PNumber, URL, State, Sort, Enabled, Type, PushBtn, delete_Flag, tenant_id) select Number, Name, PNumber, URL, State, Sort, Enabled, Type, PushBtn, delete_Flag, tenantId from jsh_functions where id=@n; + set @i=@i-1; + end while; + set @n=trim(@left_str); + insert into jsh_functions (Number, Name, PNumber, URL, State, Sort, Enabled, Type, PushBtn, delete_Flag, tenant_id) select Number, Name, PNumber, URL, State, Sort, Enabled, Type, PushBtn, delete_Flag, tenantId from jsh_functions where id=@n; + end; + -- 设置新用户的角色对应关系 + INSERT INTO jsh_userbusiness ( Type, KeyId, Value, BtnStr, delete_Flag, tenant_id) VALUES ( 'UserRole', userId, CONCAT('[',@roleId,']') , NULL, '0', tenantId); + set @appStr=(select GROUP_CONCAT(id separator '][') from jsh_app where tenant_id=tenantId and ifnull(delete_Flag,'0') !='1'); + -- 设置角色应用对应关系 + INSERT INTO jsh_userbusiness ( Type, KeyId, Value, BtnStr, delete_Flag, tenant_id) VALUES ( 'RoleAPP', @roleId, CONCAT('[',@appStr,']') , NULL, '0', tenantId); + set @functionStr=(select GROUP_CONCAT(id separator '][') from jsh_functions where tenant_id=tenantId and ifnull(delete_Flag,'0') !='1'); + set @functionBtnStr=(select GROUP_CONCAT((CONCAT('"funId":"',id,'","btnStr":"',PushBtn,'"')) separator '},{') from jsh_functions where 1=1 and number in ('01020101','01020102','01020103','050202','060301') and tenant_id=tenantId and ifnull(delete_Flag,'0') !='1'); + -- 设置角色功能对应关系 + INSERT INTO jsh_userbusiness ( Type, KeyId, Value, BtnStr, delete_Flag, tenant_id) VALUES ( 'RoleFunctions', @roleId, CONCAT('[',@functionStr,']') , CONCAT('[{',@functionBtnStr,'}]'), '0', tenantId); + -- 设置租户的产品扩展信息 + INSERT INTO jsh_materialproperty( nativeName, enabled, sort, anotherName, delete_Flag, tenant_id) select nativeName, enabled, sort, anotherName, delete_Flag, tenantId from jsh_materialproperty where id in(1,2,3,4,5,6); +return _success_msg; +end +;; +DELIMITER ; \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/controller/UserController.java b/src/main/java/com/jsh/erp/controller/UserController.java index 0699139f..338cf3f9 100644 --- a/src/main/java/com/jsh/erp/controller/UserController.java +++ b/src/main/java/com/jsh/erp/controller/UserController.java @@ -47,7 +47,7 @@ public class UserController { private Integer managePort; @Value("${manage.roleId}") - private Integer manageRoleId; + private Long manageRoleId; @Resource private UserService userService; diff --git a/src/main/java/com/jsh/erp/datasource/mappers/UserMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/UserMapperEx.java index a589d240..c889b751 100644 --- a/src/main/java/com/jsh/erp/datasource/mappers/UserMapperEx.java +++ b/src/main/java/com/jsh/erp/datasource/mappers/UserMapperEx.java @@ -36,4 +36,8 @@ public interface UserMapperEx { List getNodeTree(); List getNextNodeTree(Map parameterMap); + + List getUserListByUserNameAndTenantId(@Param("userName")String userName, @Param("tenantId")Long tenantId); + + String addRegisterUserNotInclueUser(@Param("userId") Long userId,@Param("tenantId") Long tenantId,@Param("roleId") Long roleId); } \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/service/app/AppService.java b/src/main/java/com/jsh/erp/service/app/AppService.java index 907d5c5c..9419f39e 100644 --- a/src/main/java/com/jsh/erp/service/app/AppService.java +++ b/src/main/java/com/jsh/erp/service/app/AppService.java @@ -3,10 +3,7 @@ package com.jsh.erp.service.app; import com.alibaba.fastjson.JSONObject; import com.jsh.erp.constants.BusinessConstants; import com.jsh.erp.constants.ExceptionConstants; -import com.jsh.erp.datasource.entities.App; -import com.jsh.erp.datasource.entities.AppExample; -import com.jsh.erp.datasource.entities.User; -import com.jsh.erp.datasource.entities.UserBusiness; +import com.jsh.erp.datasource.entities.*; import com.jsh.erp.datasource.mappers.AppMapper; import com.jsh.erp.datasource.mappers.AppMapperEx; import com.jsh.erp.exception.BusinessRunTimeException; @@ -292,4 +289,6 @@ public class AppService { } return list; } + + } diff --git a/src/main/java/com/jsh/erp/service/user/UserService.java b/src/main/java/com/jsh/erp/service/user/UserService.java index 57aa07a9..d50e8a12 100644 --- a/src/main/java/com/jsh/erp/service/user/UserService.java +++ b/src/main/java/com/jsh/erp/service/user/UserService.java @@ -20,6 +20,7 @@ import com.jsh.erp.utils.ExceptionCodeConstants; import com.jsh.erp.utils.JshException; import com.jsh.erp.utils.StringUtil; import com.jsh.erp.utils.Tools; +import org.apache.ibatis.annotations.DeleteProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -354,7 +355,8 @@ public class UserService { BusinessConstants.LOG_OPERATION_TYPE_ADD, ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); //检查用户名和登录名 - checkUserNameAndLoginName(ue); + checkLoginName(ue); + checkUserName(ue); //新增用户信息 ue= this.addUser(ue); if(ue==null){ @@ -394,7 +396,11 @@ public class UserService { * 3是否管理者默认为员工 * 4默认用户状态为正常 * */ - ue.setPassword(Tools.md5Encryp(BusinessConstants.USER_DEFAULT_PASSWORD)); + + //用户没有设置密码时,使用默认密码 + if(StringUtil.isEmpty(ue.getPassword())){ + ue.setPassword(Tools.md5Encryp(BusinessConstants.USER_DEFAULT_PASSWORD)); + } ue.setIsystem(BusinessConstants.USER_NOT_SYSTEM); if(ue.getIsmanager()==null){ ue.setIsmanager(BusinessConstants.USER_NOT_MANAGER); @@ -416,7 +422,7 @@ public class UserService { } @Transactional(value = "transactionManager", rollbackFor = Exception.class) - public UserEx registerUser(UserEx ue, Integer manageRoleId) throws Exception{ + public UserEx registerUser(UserEx ue, Long manageRoleId) throws Exception{ /** * create by: qiankunpingtai * create time: 2019/4/9 18:00 @@ -428,38 +434,46 @@ public class UserService { throw new BusinessRunTimeException(ExceptionConstants.USER_NAME_LIMIT_USE_CODE, ExceptionConstants.USER_NAME_LIMIT_USE_MSG); } else { - ue.setPassword(Tools.md5Encryp(ue.getPassword())); - ue.setIsystem(BusinessConstants.USER_NOT_SYSTEM); - if (ue.getIsmanager() == null) { - ue.setIsmanager(BusinessConstants.USER_NOT_MANAGER); - } - ue.setStatus(BusinessConstants.USER_STATUS_NORMAL); - int result=0; - try{ - result= userMapperEx.addUser(ue); - }catch(Exception e){ - logger.error("异常码[{}],异常提示[{}],异常[{}]", - ExceptionConstants.DATA_WRITE_FAIL_CODE,ExceptionConstants.DATA_WRITE_FAIL_MSG,e); - throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE, - ExceptionConstants.DATA_WRITE_FAIL_MSG); - } + /** + * create by: qiankunpingtai + * create time: 2019/4/24 10:57 + * website:https://qiankunpingtai.cn + * description: + * 检查登录名是否已存在 + * + */ + checkLoginName(ue); + /** + * create by: qiankunpingtai + * create time: 2019/4/24 14:47 + * website:https://qiankunpingtai.cn + * description: + * 注册一个新用户需要做如下操作 + * 1、分配应用 + * 2、分配功能模块 + * 3、分配产品扩展字段 + * 4、分配角色(默认添加超级管理员角色,不可修改) + * 5、写入用户信息 + * 6、写入用户角色应用功能关系 + */ + + ue=this.addUser(ue); + //更新租户id User user = new User(); user.setId(ue.getId()); user.setTenantId(ue.getId()); userService.updateUserTenant(user); - //新增用户与角色的关系 - JSONObject ubObj = new JSONObject(); - ubObj.put("type", "UserRole"); - ubObj.put("keyid", ue.getId()); - JSONArray ubArr = new JSONArray(); - ubArr.add(manageRoleId); - ubObj.put("value", ubArr.toString()); - userBusinessService.insertUserBusiness(ubObj.toString(), ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); - if (result > 0) { - return ue; - } - return null; + addRegisterUserNotInclueUser(user.getId(),user.getTenantId(),manageRoleId); +// //新增用户与角色的关系 +// JSONObject ubObj = new JSONObject(); +// ubObj.put("type", "UserRole"); +// ubObj.put("keyid", ue.getId()); +// JSONArray ubArr = new JSONArray(); +// ubArr.add(manageRoleId); +// ubObj.put("value", ubArr.toString()); +// userBusinessService.insertUserBusiness(ubObj.toString(), ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); + return ue; } } @@ -487,7 +501,8 @@ public class UserService { new StringBuffer(BusinessConstants.LOG_OPERATION_TYPE_EDIT).append(ue.getId()).toString(), ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); //检查用户名和登录名 - checkUserNameAndLoginName(ue); + checkLoginName(ue); + checkUserName(ue); //更新用户信息 ue = this.updateUser(ue); if (ue == null) { @@ -542,14 +557,13 @@ public class UserService { return null; } /** - * create by: cjl + * create by: qiankunpingtai + * create time: 2019/4/24 11:02 + * website:https://qiankunpingtai.cn * description: - * 检查用户名称和登录名不能重复 - * create time: 2019/3/12 11:36 - * @Param: userEx - * @return void + * 检查登录名全局唯一 */ - public void checkUserNameAndLoginName(UserEx userEx)throws Exception{ + public void checkLoginName(UserEx userEx)throws Exception{ List list=null; if(userEx==null){ return; @@ -579,10 +593,25 @@ public class UserService { } } + } + /** + * create by: qiankunpingtai + * create time: 2019/4/24 11:02 + * website:https://qiankunpingtai.cn + * description: + * 检查用户名同一个租户范围内内唯一 + * + */ + public void checkUserName(UserEx userEx)throws Exception{ + List list=null; + if(userEx==null){ + return; + } + Long userId=userEx.getId(); //检查用户名 if(!StringUtils.isEmpty(userEx.getUsername())){ String userName=userEx.getUsername(); - list=this.getUserListByUserName(userName); + list=this.getUserListByUserNameAndTenantId(userName,userEx.getTenantId()); if(list!=null&&list.size()>0){ if(list.size()>1){ //超过一条数据存在,该用户名已存在 @@ -603,8 +632,31 @@ public class UserService { } } - } + /** + * create by: qiankunpingtai + * website:https://qiankunpingtai.cn + * description: + * 通过用户名和租户id获取用户信息 + * create time: 2019/4/24 11:18 + * @Param: userName +  * @Param: tenantId + * @return java.util.List + */ + private List getUserListByUserNameAndTenantId(String userName, Long tenantId) { + + List list =null; + try{ + list=userMapperEx.getUserListByUserNameAndTenantId(userName,tenantId); + }catch(Exception e){ + logger.error("异常码[{}],异常提示[{}],异常[{}]", + ExceptionConstants.DATA_READ_FAIL_CODE,ExceptionConstants.DATA_READ_FAIL_MSG,e); + throw new BusinessRunTimeException(ExceptionConstants.DATA_READ_FAIL_CODE, + ExceptionConstants.DATA_READ_FAIL_MSG); + } + return list; + } + /** * 通过用户名获取用户列表 * */ @@ -673,4 +725,34 @@ public class UserService { } return list; } + /** + * create by: qiankunpingtai + * website:https://qiankunpingtai.cn + * description: + * 1、分配应用 + * 2、分配功能模块 + * 3、分配产品扩展字段 + * 4、分配角色(默认添加超级管理员角色,不可修改) + * 5、写入用户角色应用功能关系 + * create time: 2019/4/26 9:37 + * @Param: userId 用户id +  * @Param: tenantId 租户id +  * @Param: roleId 模板角色id + * @return java.lang.String + */ + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public String addRegisterUserNotInclueUser(Long userId,Long tenantId,Long roleId)throws Exception { + + String result =null; + try{ + result=userMapperEx.addRegisterUserNotInclueUser(userId,tenantId,roleId); + }catch(Exception e){ + logger.error("异常码[{}],异常提示[{}],异常[{}]", + ExceptionConstants.DATA_WRITE_FAIL_CODE,ExceptionConstants.DATA_WRITE_FAIL_MSG,e); + throw new BusinessRunTimeException(ExceptionConstants.DATA_WRITE_FAIL_CODE, + ExceptionConstants.DATA_WRITE_FAIL_MSG); + } + return result; + } + } diff --git a/src/main/resources/mapper_xml/UserMapperEx.xml b/src/main/resources/mapper_xml/UserMapperEx.xml index 778ed9d5..af16341a 100644 --- a/src/main/resources/mapper_xml/UserMapperEx.xml +++ b/src/main/resources/mapper_xml/UserMapperEx.xml @@ -1,13 +1,15 @@ - - - - - + + + + + - select * FROM jsh_user where 1=1 @@ -37,25 +39,26 @@ + useGeneratedKeys="true" keyProperty="id" keyColumn="id"> insert into jsh_user (username, loginame, password, position, email, phonenum, ismanager, @@ -184,4 +187,28 @@ and ifnull(org_stcd,'0') !='5' order by sort asc + + + + \ No newline at end of file