From ce01210aab228dcbadbb1362f340a7cbac3b1c54 Mon Sep 17 00:00:00 2001 From: DB <2502523450@qq.com> Date: Wed, 24 Apr 2024 15:58:04 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4Oam=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=80=80=E5=87=BA=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cpop/core/base/entity/LoginSuccess.java | 11 ++ .../com/cpop/core/base/enums/UserType.java | 9 +- .../java/com/cpop/core/base/table/User.java | 10 +- .../com/cpop/core/constant/Constants.java | 7 +- .../src/main/resources/application-dev.yml | 2 +- .../src/main/resources/static/favicon.ico | Bin 0 -> 77742 bytes .../com/cpop/oam/business/bo/LoginForm.java | 42 +++++ .../backstage/BackstageLoginController.java | 41 ++++- .../oam}/business/service/LoginService.java | 15 +- .../service/impl/LoginServiceImpl.java | 159 ++++++++++++++++++ .../service/impl/OamWxCpServiceImpl.java | 4 +- .../service/impl/StaffServiceImpl.java | 22 +-- .../service/impl/TaskServiceImpl.java | 2 +- .../vo/loginInfo/SysStaffLoginInfo.java | 49 ++++++ .../service/impl/LoginServiceImpl.java | 97 ----------- .../service/impl/MenuServiceImpl.java | 8 +- .../system/framework/enums/InitRoleEnum.java | 4 - 17 files changed, 341 insertions(+), 141 deletions(-) create mode 100644 Cpop-Oam/Cpop-Oam-Web/src/main/resources/static/favicon.ico create mode 100644 Cpop-Oam/src/main/java/com/cpop/oam/business/bo/LoginForm.java rename {Cpop-System/src/main/java/com/cpop/system => Cpop-Oam/src/main/java/com/cpop/oam}/business/controller/backstage/BackstageLoginController.java (56%) rename {Cpop-System/src/main/java/com/cpop/system => Cpop-Oam/src/main/java/com/cpop/oam}/business/service/LoginService.java (63%) create mode 100644 Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/LoginServiceImpl.java create mode 100644 Cpop-Oam/src/main/java/com/cpop/oam/business/vo/loginInfo/SysStaffLoginInfo.java delete mode 100644 Cpop-System/src/main/java/com/cpop/system/business/service/impl/LoginServiceImpl.java diff --git a/Cpop-Core/src/main/java/com/cpop/core/base/entity/LoginSuccess.java b/Cpop-Core/src/main/java/com/cpop/core/base/entity/LoginSuccess.java index a286bc8..4cd3e42 100644 --- a/Cpop-Core/src/main/java/com/cpop/core/base/entity/LoginSuccess.java +++ b/Cpop-Core/src/main/java/com/cpop/core/base/entity/LoginSuccess.java @@ -19,6 +19,11 @@ public class LoginSuccess implements Serializable { @Serial private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private String id; + /** * 用户id */ @@ -33,4 +38,10 @@ public class LoginSuccess implements Serializable { * 权限 */ private Set role; + + public LoginSuccess(String id, String userId, String token) { + this.id = id; + this.userId = userId; + this.token = token; + } } diff --git a/Cpop-Core/src/main/java/com/cpop/core/base/enums/UserType.java b/Cpop-Core/src/main/java/com/cpop/core/base/enums/UserType.java index 75bd961..bdb96a1 100644 --- a/Cpop-Core/src/main/java/com/cpop/core/base/enums/UserType.java +++ b/Cpop-Core/src/main/java/com/cpop/core/base/enums/UserType.java @@ -13,14 +13,7 @@ public enum UserType { * oam系统员工 */ OAM_USER(0, "oam:loginUser:"), - /** - * 小程序用户 - */ - MINI_USER(1, "mini:loginUser:"), - /** - * 商城系统员工 - */ - MALL_USER(2, "mall:loginUser:"); + ; /** * code diff --git a/Cpop-Core/src/main/java/com/cpop/core/base/table/User.java b/Cpop-Core/src/main/java/com/cpop/core/base/table/User.java index 0c1038e..5c667bc 100644 --- a/Cpop-Core/src/main/java/com/cpop/core/base/table/User.java +++ b/Cpop-Core/src/main/java/com/cpop/core/base/table/User.java @@ -3,10 +3,10 @@ package com.cpop.core.base.table; import com.cpop.core.base.entity.BaseEntity; import com.cpop.core.base.entity.BaseInsertListener; import com.cpop.core.base.entity.BaseUpdateListener; +import com.cpop.core.base.enums.UserType; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.Table; -import com.cpop.core.base.enums.UserType; import lombok.*; import lombok.experimental.Accessors; @@ -36,7 +36,7 @@ public class User extends BaseEntity implements Serializable { /** * 用户名 */ - private String userName; + private String username; /** * 密码 @@ -51,7 +51,7 @@ public class User extends BaseEntity implements Serializable { /** * 昵称 */ - private String nickName; + private String nickname; /** * 邮箱 @@ -61,7 +61,7 @@ public class User extends BaseEntity implements Serializable { /** * 手机号 */ - private String phoneNumber; + private String phone; /** * 性别(0:男;1:女) @@ -91,7 +91,7 @@ public class User extends BaseEntity implements Serializable { /** * 用户类型 */ - private String userType; + private UserType userType; /** * 逻辑删除(0否1是) diff --git a/Cpop-Core/src/main/java/com/cpop/core/constant/Constants.java b/Cpop-Core/src/main/java/com/cpop/core/constant/Constants.java index dcb9d7a..48116a9 100644 --- a/Cpop-Core/src/main/java/com/cpop/core/constant/Constants.java +++ b/Cpop-Core/src/main/java/com/cpop/core/constant/Constants.java @@ -166,13 +166,12 @@ public interface Constants { /** * 定时任务违规的字符 */ - String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", - "org.springframework.jndi"}; + String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", "org.springframework.jndi"}; /** * 超级管理员 */ - String SUPER_ADMIN = "Jambox"; + String SUPER_ADMIN = "Cpop"; /** * 超级管理员ID @@ -182,7 +181,7 @@ public interface Constants { /** * 超级身份id */ - String SUPER_IDENTITY_AUTH_ID = "100"; + String SUPER_ROLE_ID = "100"; /** * 超级管理员 diff --git a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml index bbf9c75..73fd285 100644 --- a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml +++ b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/application-dev.yml @@ -4,7 +4,7 @@ cpop: profile: E:/Cpop/uploadPath jwt: #白名单 - white-list: /websocket/*,/login,/doc.html,/webjars/**,/favicon.ico,/v2/api-docs/**,/swagger-resources,/sysCommon/miniSyncBrandAndStore,/easyLearn/callback/*/*,/easyLearn/*,/mini/cardTemplate/*,/website/**,/backstage/wxCp/*,/callback/wxCp/*/registerCode,/callback/easyLearn/**,/cloudCallback/*,/mini/summit/* + white-list: /profile/**,/backstage/login,/doc.html,/webjars/**,/favicon.ico,/v3/api-docs/**,/swagger-ui.html,/swagger-ui/**,/sysCommon/miniSyncBrandAndStore,/easyLearn/callback/*/*,/easyLearn/*,/mini/cardTemplate/*,/website/**,/backstage/wxCp/*,/callback/wxCp/*/registerCode,/callback/easyLearn/**,/cloudCallback/*,/mini/summit/* gateway: rsa-keypair: # 公钥文件 diff --git a/Cpop-Oam/Cpop-Oam-Web/src/main/resources/static/favicon.ico b/Cpop-Oam/Cpop-Oam-Web/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d7c94d89c357b02c87863fe6813824e5bdb032e GIT binary patch literal 77742 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
4x`pR9TbNC8A0jz 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

%uRb2%-7vs!JDKxewUn*ug_r<;jB|2+I;_LjB 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 literal 0 HcmV?d00001 diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/LoginForm.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/LoginForm.java new file mode 100644 index 0000000..5b6ba2a --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/LoginForm.java @@ -0,0 +1,42 @@ +package com.cpop.oam.business.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author DB + * @since 2023-04-05 17:53 + */ +@Data +public class LoginForm implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 验证码 + */ + private String code; + + /** + * 单次标识 + */ + private String userKey; + + /** + * 用户类型 + */ + private String userType; +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/controller/backstage/BackstageLoginController.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/BackstageLoginController.java similarity index 56% rename from Cpop-System/src/main/java/com/cpop/system/business/controller/backstage/BackstageLoginController.java rename to Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/BackstageLoginController.java index 2229f64..bd0ccdf 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/controller/backstage/BackstageLoginController.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/BackstageLoginController.java @@ -1,13 +1,20 @@ -package com.cpop.system.business.controller.backstage; +package com.cpop.oam.business.controller.backstage; +import cn.dev33.satoken.session.SaSession; +import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.StpUtil; +import com.cpop.core.base.entity.LoginSuccess; import com.cpop.core.base.entity.R; import com.cpop.core.base.enums.OperationLogEnum; import com.cpop.core.constant.Constants; import com.cpop.core.service.OperationLogService; import com.cpop.core.utils.MessageUtils; +import com.cpop.core.utils.ServletUtils; import com.cpop.core.utils.SpringUtils; -import com.cpop.system.business.service.LoginService; +import com.cpop.core.utils.ip.IpUtils; +import com.cpop.oam.business.bo.LoginForm; +import com.cpop.oam.business.service.LoginService; +import com.cpop.oam.business.vo.loginInfo.SysStaffLoginInfo; import com.cpop.system.business.vo.LoginUserInfoVo; import com.cpop.system.business.vo.MenuRouteVo; import io.swagger.v3.oas.annotations.Operation; @@ -31,6 +38,36 @@ public class BackstageLoginController { @Autowired private LoginService loginService; + /** + * 系统登录 + * @author DB + * @since 2023/12/2 + * @return R + */ + @Operation(summary="系统登录") + @PostMapping("/login") + public R login(@RequestBody LoginForm loginForm) { + SysStaffLoginInfo login = loginService.login(loginForm); + // 第1步,先登录上 + StpUtil.login(login.getId(),"PC"); + SaSession session = StpUtil.getSession(); + session.set("id", login.getId()) + .set("loginIp", IpUtils.getIpAddr(ServletUtils.getRequest())) + .set("username", login.getUsername()) + .set("userId", login.getUserId()) + .set("name", login.getName()) + .set("avatar", login.getAvatar() == null ? "" : login.getAvatar()) + .set("userType", login.getUserType()) + .set("phone", login.getPhone()) + .set("roleId", login.getRoleId()) + .set("isSuper", login.getIsSuper()); + //添加操作日志 + SpringUtils.getBean(OperationLogService.class).insertOperationLog(200, OperationLogEnum.SYSTEM_LOGIN, session, null); + // 第2步,获取 Token 相关参数 + SaTokenInfo tokenInfo = StpUtil.getTokenInfo(); + return R.ok(new LoginSuccess(tokenInfo.getLoginId().toString(), login.getUserId(), tokenInfo.getTokenValue())); + } + /** * 系统注销 * @author DB diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/LoginService.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/LoginService.java similarity index 63% rename from Cpop-System/src/main/java/com/cpop/system/business/service/LoginService.java rename to Cpop-Oam/src/main/java/com/cpop/oam/business/service/LoginService.java index 7dac208..3cb76c7 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/service/LoginService.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/LoginService.java @@ -1,5 +1,7 @@ -package com.cpop.system.business.service; +package com.cpop.oam.business.service; +import com.cpop.oam.business.bo.LoginForm; +import com.cpop.oam.business.vo.loginInfo.SysStaffLoginInfo; import com.cpop.system.business.vo.LoginUserInfoVo; import com.cpop.system.business.vo.MenuRouteVo; @@ -12,6 +14,15 @@ import java.util.Set; */ public interface LoginService { + /** + * 系统登录 + * @author DB + * @since 2024/4/24 + * @param loginForm 登录表单 + * @return SysStaffLoginInfo + */ + SysStaffLoginInfo login(LoginForm loginForm); + /** * 获取登录用户详情 * @@ -31,4 +42,6 @@ public interface LoginService { * @Date: 2023/5/11 9:16 **/ List getSysMenuList(); + + } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/LoginServiceImpl.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/LoginServiceImpl.java new file mode 100644 index 0000000..0a9463d --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/LoginServiceImpl.java @@ -0,0 +1,159 @@ +package com.cpop.oam.business.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.session.SaSession; +import cn.dev33.satoken.stp.StpUtil; +import com.cpop.core.base.exception.ServiceException; +import com.cpop.core.base.table.User; +import com.cpop.core.constant.Constants; +import com.cpop.core.service.UserService; +import com.cpop.core.utils.RsaUtils; +import com.cpop.core.utils.SpringUtils; +import com.cpop.core.utils.bean.BeanUtils; +import com.cpop.oam.business.bo.LoginForm; +import com.cpop.oam.business.entity.Staff; +import com.cpop.oam.business.service.LoginService; +import com.cpop.oam.business.service.StaffService; +import com.cpop.oam.business.vo.loginInfo.SysStaffLoginInfo; +import com.cpop.system.business.entity.Menu; +import com.cpop.system.business.service.MenuService; +import com.cpop.system.business.vo.LoginUserInfoVo; +import com.cpop.system.business.vo.MenuRouteVo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.cpop.core.base.table.table.UserTableDef.USER; +import static com.cpop.oam.business.entity.table.StaffTableDef.STAFF; +import static com.cpop.system.business.entity.table.MenuTableDef.MENU; +import static com.cpop.system.business.entity.table.RoleMenuTableDef.ROLE_MENU; +import static com.cpop.system.business.entity.table.RoleTableDef.ROLE; + +/** + * @author DB + * @createTime 2023/09/10 11:19 + * @description + */ +@Service("loginService") +public class LoginServiceImpl implements LoginService { + + @Autowired + private RsaUtils rsaUtils; + + /** + * 系统登录 + * @author DB + * @since 2024/4/24 + * @param loginForm 登录表单 + * @return SysStaffLoginInfo + */ + @Override + public SysStaffLoginInfo login(LoginForm loginForm) { + //获取用户信息 + User user = SpringUtils.getBean(UserService.class).queryChain() + .select(USER.ID, USER.USERNAME, USER.PASSWORD, USER.PHONE, USER.AVATAR) + .where(USER.USERNAME.eq(loginForm.getUsername())) + .one(); + if (user == null){ + throw new ServiceException("用户名或密码错误!"); + } + //rsa解密 + String password = rsaUtils.decrypt(loginForm.getPassword()); + // 使用checkpw方法检查被加密的字符串是否与原始字符串匹配: + if (!BCrypt.checkpw(password, user.getPassword())) { + throw new ServiceException("用户名或密码错误!"); + } + return getStaffLoginInfo(user); + } + + /** + * 获取系统用户信息 + * @author DB + * @since 2024/3/21 + * @param user 用户 + * @return SysStaffLoginInfo + */ + private SysStaffLoginInfo getStaffLoginInfo(User user){ + //获取员工信息 + SysStaffLoginInfo staffLoginInfo = BeanUtils.mapToClass(user, SysStaffLoginInfo.class); + if (!staffLoginInfo.getUsername().equals(Constants.SUPER_ADMIN)) { + Staff staff = SpringUtils.getBean(StaffService.class).queryChain() + .where(STAFF.USER_ID.eq(user.getId())) + .one(); + staffLoginInfo.setRoleId(staff.getRoleId()); + staffLoginInfo.setIsSuper(false); + staffLoginInfo.setName(staff.getRoleId()); + staffLoginInfo.setId(staff.getId()); + } else { + staffLoginInfo.setRoleId(Constants.SUPER_ROLE_ID); + staffLoginInfo.setIsSuper(true); + staffLoginInfo.setName(Constants.SUPER_ADMIN); + staffLoginInfo.setId(Constants.SUPER_ADMIN_ID); + } + staffLoginInfo.setUserId(user.getId()) + .setAvatar(user.getAvatar()) + .setPhone(user.getPhone()); + return staffLoginInfo; + } + + /** + * 获取用户信息 + * @author LOST.yuan + * @since 23:01 2022/9/26 + * @return {@link String} + **/ + @Override + public LoginUserInfoVo getUserInfo() { + SaSession session = StpUtil.getSession(); + return new LoginUserInfoVo() + .setId(session.getString("id")) + .setUserId(session.getString("userId")) + .setUsername(session.getString("username")) + .setRealName(session.getString("name")) + .setAvatar(session.getString("avatar")) + .setPermissions(StpUtil.getPermissionList()); + } + + /** + * 获取权限码 + * @author DB + * @since 2023-11-30 14:32:57 + * @version 1.0.0 + */ + @Override + public Set getPermCode() { + SaSession session = StpUtil.getSession(); + if (StringUtils.equals(Constants.SUPER_ADMIN, session.getString("username"))) { + Set permCodes = new HashSet<>(); + permCodes.add("*.*.*"); + return permCodes; + } else { + List

menuPermissions = SpringUtils.getBean(MenuService.class) + .queryChain() + .select(MENU.PERMISSION) + .leftJoin(ROLE_MENU) + .on(ROLE_MENU.MENU_ID.eq(MENU.ID)) + .leftJoin(ROLE) + .on(ROLE.ID.eq(ROLE_MENU.ROLE_ID)) + .where(ROLE.ID.eq(session.getString("roleId"))) + .and(MENU.TYPE.in(1, 2)) + .and(MENU.PERMISSION.isNotNull()) + .list(); + return menuPermissions.stream().map(Menu::getPermission).collect(Collectors.toSet()); + } + + } + + /** + * 获取菜单列表 + */ + @Override + public List getSysMenuList() { + return SpringUtils.getBean(MenuService.class).getSysMenuList(); + } +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/OamWxCpServiceImpl.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/OamWxCpServiceImpl.java index b04bff4..b3a9d28 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/OamWxCpServiceImpl.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/OamWxCpServiceImpl.java @@ -136,7 +136,7 @@ public class OamWxCpServiceImpl implements OamWxCpService { User sysUser = new User(); sysUser.setId(IdUtils.fastSimpleUUID()) .setStatus(item.getStatus() == 1) - .setUserType(UserType.OAM_USER.toString()) + .setUserType(UserType.OAM_USER) .setCreateUserId("1"); sysUser.setUpdateUserId("1"); userWxCpUserMap.put(sysUser, item); @@ -199,7 +199,7 @@ public class OamWxCpServiceImpl implements OamWxCpService { throw new ServiceException("请先在企微上的Oam应用中进行注册"); } User sysUser = RowUtil.toEntity(row, User.class); - return new WxCpLoginVo(sysUser.getUserName(), sysUser.getRsaPassword()); + return new WxCpLoginVo(sysUser.getUsername(), sysUser.getRsaPassword()); } catch (WxErrorException e) { throw new ServiceException(e.getMessage()); } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/StaffServiceImpl.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/StaffServiceImpl.java index 78f2237..997ccdc 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/StaffServiceImpl.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/StaffServiceImpl.java @@ -73,7 +73,7 @@ public class StaffServiceImpl extends ServiceImpl implements , QueryWrapper.create() //去重 .select(distinct(STAFF.ALL_COLUMNS)) - .select(USER.USER_NAME,USER.NICK_NAME, USER.EMAIL, USER.PHONE_NUMBER, USER.SEX, USER.AVATAR, USER.STATUS, USER.PASSWORD) + .select(USER.USERNAME,USER.NICKNAME, USER.EMAIL, USER.PHONE, USER.SEX, USER.AVATAR, USER.STATUS, USER.PASSWORD) .select(ROLE.ROLE_NAME) //将部门id分组 .select(groupConcat(STAFF_MID_DEPT.DEPT_ID).as(StaffPageVo::getDeptId)) @@ -88,7 +88,7 @@ public class StaffServiceImpl extends ServiceImpl implements .and(STAFF.STAFF_TYPE.eq(bo.getStaffType())) //部门id .and(STAFF_MID_DEPT.DEPT_ID.eq(bo.getDeptId())) - .and(USER.USER_NAME.ne(Constants.SUPER_ADMIN).or(USER.USER_NAME.isNull())) + .and(USER.USERNAME.ne(Constants.SUPER_ADMIN).or(USER.USERNAME.isNull())) .groupBy(STAFF.ID) , StaffPageVo.class); } @@ -113,7 +113,7 @@ public class StaffServiceImpl extends ServiceImpl implements user.setRsaPassword(bo.getPassword()); decryptAndResetPasswords(user); user.setId(IdUtils.fastSimpleUUID()); - user.setUserType(UserType.OAM_USER.toString()); + user.setUserType(UserType.OAM_USER); SpringUtils.getBean(UserService.class).save(user); } //再添加员工信息 @@ -142,7 +142,7 @@ public class StaffServiceImpl extends ServiceImpl implements private Boolean validatedUserInfo(StaffBo bo) { long count = this.count(QueryWrapper.create() //用户名 - .where(USER.USER_NAME.eq(bo.getUserName()).or(USER.PHONE_NUMBER.eq(bo.getPhoneNumber()))) + .where(USER.USERNAME.eq(bo.getUserName()).or(USER.PHONE.eq(bo.getPhoneNumber()))) //手机号 .and(USER.USER_TYPE.eq(UserType.OAM_USER.toString())) .from(USER)); @@ -243,7 +243,7 @@ public class StaffServiceImpl extends ServiceImpl implements return; } if (this.count(QueryWrapper.create() - .where(USER.USER_NAME.eq(username)) + .where(USER.USERNAME.eq(username)) .and(USER.ID.ne(id))) > 0) { throw new ServiceException(MessageUtils.message("i18n_alert_userIsExist")); } @@ -260,7 +260,7 @@ public class StaffServiceImpl extends ServiceImpl implements public StaffInfoVo getStaffInfo(String id) { return this.getOneAs(QueryWrapper.create() .select(STAFF.ALL_COLUMNS) - .select(USER.USER_NAME, USER.NICK_NAME, USER.SEX, USER.PHONE_NUMBER, USER.ID.as("userId")) + .select(USER.USERNAME, USER.NICKNAME, USER.SEX, USER.PHONE, USER.ID.as("userId")) .select(ROLE.ROLE_NAME) .from(STAFF) .leftJoin(USER).on(USER.ID.eq(STAFF.USER_ID)) @@ -310,7 +310,7 @@ public class StaffServiceImpl extends ServiceImpl implements User user = DbChain.table(USER) .where(USER.ID.eq(bo.getUserId())) .oneAs(User.class); - if (!StringUtils.equals(userName, Constants.SUPER_ADMIN) || !StringUtils.equals(userName, user.getUserName())) { + if (!StringUtils.equals(userName, Constants.SUPER_ADMIN) || !StringUtils.equals(userName, user.getUsername())) { throw new ServiceException("非超级管理员不允许修改他人密码"); } //先用rsa解密 @@ -362,7 +362,7 @@ public class StaffServiceImpl extends ServiceImpl implements .where(STAFF.STAFF_TYPE.eq(0)) //不查询停用的员工 .and(USER.STATUS.eq(true)) - .and(USER.PHONE_NUMBER.notIn(Arrays.asList(testStaffPhone.split(",")))), + .and(USER.PHONE.notIn(Arrays.asList(testStaffPhone.split(",")))), StaffVo.class); } @@ -376,15 +376,15 @@ public class StaffServiceImpl extends ServiceImpl implements public void changeOperationStatus(OperationStatusBo bo) { //获取用户信息 Staff staff = this.getById(bo.getId()); - User User = DbChain.table(USER).select(USER.PHONE_NUMBER).where(USER.ID.eq(staff.getUserId())).oneAs(User.class); + User User = DbChain.table(USER).select(USER.PHONE).where(USER.ID.eq(staff.getUserId())).oneAs(User.class); JSONObject jsonBody = new JSONObject(); if (bo.getIsOperation()) { jsonBody.put("_type", "oamAdd"); jsonBody.put("name", staff.getName()); - jsonBody.put("phone", User.getPhoneNumber()); + jsonBody.put("phone", User.getPhone()); } else { jsonBody.put("_type", "oamDel"); - jsonBody.put("phone", User.getPhoneNumber()); + jsonBody.put("phone", User.getPhone()); } // JSONObject jsonObject = SpringUtils.getBean(RestTemplate.class).postForObject(JamboxCloudUrl.COMMON_CARD_URL, jsonBody, JSONObject.class); // assert jsonObject != null; diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskServiceImpl.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskServiceImpl.java index 676da38..0286a9d 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskServiceImpl.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskServiceImpl.java @@ -337,7 +337,7 @@ public class TaskServiceImpl extends ServiceImpl implements Ta } QueryWrapper queryWrapper = QueryWrapper.create(); if (StringUtils.isNotBlank(staffId)){ - Row staff = Db.selectOneByQuery(USER.getTableName(), QueryWrapper.create().select(USER.PHONE_NUMBER) + Row staff = Db.selectOneByQuery(USER.getTableName(), QueryWrapper.create().select(USER.PHONE) .leftJoin(STAFF).on(STAFF.USER_ID.eq(USER.ID)) .where(STAFF.ID.eq(staffId))); //对比当前员工是否是测试管理员 diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/loginInfo/SysStaffLoginInfo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/loginInfo/SysStaffLoginInfo.java new file mode 100644 index 0000000..2c3d37a --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/loginInfo/SysStaffLoginInfo.java @@ -0,0 +1,49 @@ +package com.cpop.oam.business.vo.loginInfo; + +import com.cpop.core.base.table.User; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @version: 1.0.0 + * @Author: DB + * @description: 系统登录用户 + * @date: 2023-11-09 21:30 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class SysStaffLoginInfo extends User { + + /** + * 员工id(staffId) + */ + private String id; + + /** + * 姓名 + */ + private String name; + + /** + * 用户id + */ + private String userId; + + /** + * 身份id + */ + private String roleId; + + /** + * 是否是超级管理 + */ + private Boolean isSuper; + + /** + * 手机号 + */ + private String phone; + +} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/LoginServiceImpl.java b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/LoginServiceImpl.java deleted file mode 100644 index 9cfc155..0000000 --- a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/LoginServiceImpl.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.cpop.system.business.service.impl; - -import cn.dev33.satoken.session.SaSession; -import cn.dev33.satoken.stp.StpUtil; -import com.alibaba.fastjson.JSONObject; -import com.cpop.core.constant.Constants; -import com.cpop.system.business.entity.Menu; -import com.cpop.system.business.entity.StoreSign; -import com.cpop.system.business.service.LoginService; -import com.cpop.system.business.service.MenuService; -import com.cpop.system.business.service.StoreSignService; -import com.cpop.system.business.vo.LoginUserInfoVo; -import com.cpop.system.business.vo.MenuRouteVo; -import com.mybatisflex.core.query.QueryWrapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.time.LocalDate; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import com.cpop.core.utils.SpringUtils; - -import static com.cpop.system.business.entity.table.MenuTableDef.MENU; -import static com.cpop.system.business.entity.table.RoleMenuTableDef.ROLE_MENU; -import static com.cpop.system.business.entity.table.RoleTableDef.ROLE; -import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; -import java.util.HashSet; - -/** - * @author DB - * @createTime 2023/09/10 11:19 - * @description - */ -@Service("loginService") -public class LoginServiceImpl implements LoginService { - - @Autowired - private MenuService menuService; - - /** - * @author LOST.yuan - * @Description 获取用户信息 - * @date 23:01 2022/9/26 - * @return {@link String} - **/ - @Override - public LoginUserInfoVo getUserInfo() { - SaSession session = StpUtil.getSession(); - return new LoginUserInfoVo() - .setId((String) session.get("id")) - .setUserId((String) session.get("userId")) - .setUsername((String) session.get("username")) - .setRealName((String) session.get("name")) - .setAvatar((String) session.get("avatar")) - .setPermissions(StpUtil.getPermissionList()); - } - - /** - * 获取权限码 - * @author DB - * @since 2023-11-30 14:32:57 - * @version 1.0.0 - */ - @Override - public Set getPermCode() { - SaSession session = StpUtil.getSession(); - if (StringUtils.equals(Constants.SUPER_ADMIN, session.getString("username"))) { - Set permCodes = new HashSet<>(); - permCodes.add("*.*.*"); - return permCodes; - } else { - List menuPermissions = SpringUtils.getBean(MenuService.class) - .queryChain() - .select(MENU.PERMISSION) - .leftJoin(ROLE_MENU) - .on(ROLE_MENU.MENU_ID.eq(MENU.ID)) - .leftJoin(ROLE) - .on(ROLE.ID.eq(ROLE_MENU.ROLE_ID)) - .where(ROLE.ID.eq(session.getString("roleId"))) - .and(MENU.TYPE.in(1, 2)) - .and(MENU.PERMISSION.isNotNull()) - .list(); - return menuPermissions.stream().map(Menu::getPermission).collect(Collectors.toSet()); - } - - } - - /** - * 获取菜单列表 - */ - @Override - public List getSysMenuList() { - return menuService.getSysMenuList(); - } -} diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/MenuServiceImpl.java b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/MenuServiceImpl.java index 7b2be21..72c2424 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/MenuServiceImpl.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/MenuServiceImpl.java @@ -2,13 +2,11 @@ package com.cpop.system.business.service.impl; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.StpUtil; -import com.alibaba.fastjson.JSONObject; import com.cpop.core.base.enums.UserType; +import com.cpop.core.base.exception.ServiceException; import com.cpop.core.constant.Constants; import com.cpop.core.utils.StringUtils; import com.cpop.core.utils.bean.BeanUtils; -import com.cpop.system.framework.enums.InitRoleEnum; -import com.cpop.core.base.exception.ServiceException; import com.cpop.system.business.bo.MenuBo; import com.cpop.system.business.bo.MenuListBo; import com.cpop.system.business.entity.Menu; @@ -16,13 +14,13 @@ import com.cpop.system.business.mapper.MenuMapper; import com.cpop.system.business.service.MenuService; import com.cpop.system.business.vo.MenuRouteVo; import com.cpop.system.business.vo.MenuVo; +import com.cpop.system.framework.enums.InitRoleEnum; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import static com.cpop.system.business.entity.table.MenuTableDef.MENU; import static com.cpop.system.business.entity.table.RoleMenuTableDef.ROLE_MENU; @@ -57,7 +55,7 @@ public class MenuServiceImpl extends ServiceImpl implements Me return buildMenuRouteTree(list); } else { //一般管理员 - if (StringUtils.equals(session.getString("roleId"), InitRoleEnum.SUPER_MALL_ROLE.getId())) { + if (StringUtils.equals(session.getString("roleId"), InitRoleEnum.SUPER_OAM_ROLE.getId())) { return buildMenuRouteTree(this.listAs(QueryWrapper.create() .where(MENU.TYPE.in(0, 1)) //构建公共菜单与特有菜单 diff --git a/Cpop-System/src/main/java/com/cpop/system/framework/enums/InitRoleEnum.java b/Cpop-System/src/main/java/com/cpop/system/framework/enums/InitRoleEnum.java index 3e41023..d98deb6 100644 --- a/Cpop-System/src/main/java/com/cpop/system/framework/enums/InitRoleEnum.java +++ b/Cpop-System/src/main/java/com/cpop/system/framework/enums/InitRoleEnum.java @@ -13,10 +13,6 @@ public enum InitRoleEnum { * OAM超级管理员角色 */ SUPER_OAM_ROLE("1", "SuperOamAdmin", "SuperOamAdmin", -1, UserType.OAM_USER), - /** - * MALL超级管理员角色 - */ - SUPER_MALL_ROLE("2", "SuperMallAdmin", "SuperMallAdmin", -1, UserType.MALL_USER), /** * 企微注册初始化技术员工角色 */