|  |  | 
 |  |  |  | 
 |  |  | import com.vincent.rsf.common.enums.SystemModeType; | 
 |  |  | import com.vincent.rsf.common.utils.Utils; | 
 |  |  | import com.vincent.rsf.framework.common.BaseRes; | 
 |  |  | import com.vincent.rsf.framework.common.Cools; | 
 |  |  | import com.vincent.rsf.framework.common.R; | 
 |  |  | import com.vincent.rsf.framework.exception.CoolException; | 
 |  |  | import com.vincent.rsf.server.common.annotation.OperationLog; | 
 |  |  | import com.vincent.rsf.server.common.config.ConfigProperties; | 
 |  |  | import com.vincent.rsf.server.common.domain.BusinessRes; | 
 |  |  | import com.vincent.rsf.server.common.security.JwtSubject; | 
 |  |  | import com.vincent.rsf.server.common.service.EmailService; | 
 |  |  | import com.vincent.rsf.server.common.service.RedisService; | 
 |  |  | import com.vincent.rsf.server.common.utils.JwtUtil; | 
 |  |  | import com.vincent.rsf.server.system.controller.param.LoginParam; | 
 |  |  | import com.vincent.rsf.server.system.controller.param.RegisterParam; | 
 |  |  | import com.vincent.rsf.server.system.controller.param.TenantInitParam; | 
 |  |  | import com.vincent.rsf.server.system.controller.param.UpdatePasswordParam; | 
 |  |  | import com.vincent.rsf.server.system.controller.result.LoginResult; | 
 |  |  | import com.vincent.rsf.server.system.controller.result.MenuVo; | 
 |  |  | 
 |  |  | import com.vincent.rsf.server.system.entity.Tenant; | 
 |  |  | import com.vincent.rsf.server.system.entity.User; | 
 |  |  | import com.vincent.rsf.server.system.entity.UserLogin; | 
 |  |  | import com.vincent.rsf.server.system.enums.EmailType; | 
 |  |  | import com.vincent.rsf.server.system.enums.StatusType; | 
 |  |  | import com.vincent.rsf.server.system.service.RoleMenuService; | 
 |  |  | import com.vincent.rsf.server.system.service.TenantService; | 
 |  |  | import com.vincent.rsf.server.system.service.UserLoginService; | 
 |  |  | import com.vincent.rsf.server.system.service.UserService; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.GetMapping; | 
 |  |  | import org.springframework.web.bind.annotation.PostMapping; | 
 |  |  | import org.springframework.web.bind.annotation.RequestBody; | 
 |  |  | import org.springframework.web.bind.annotation.RestController; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import javax.annotation.Resource; | 
 |  |  | import javax.servlet.http.HttpServletRequest; | 
 |  |  | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * 认证控制器 | 
 |  |  |  * | 
 |  |  |  * Authority Controller | 
 |  |  |  * Created by vincent on 1/30/2024 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | 
 |  |  |     private TenantService tenantService; | 
 |  |  |     @Autowired | 
 |  |  |     private EmailService emailService; | 
 |  |  |     @Autowired | 
 |  |  |     private RedisService redisService; | 
 |  |  |  | 
 |  |  |     @PostMapping("/login") | 
 |  |  |     public R login(@RequestBody LoginParam param, HttpServletRequest request) { | 
 |  |  | //        System.out.println(userService.encodePassword("123456")); | 
 |  |  |         emailService.sendEmail("t1341870251@gmail.com", "Email Verification Code", Cools.add("code", "666")); | 
 |  |  |  | 
 |  |  |         String username = param.getUsername(); | 
 |  |  |         Long tenantId = param.getTenantId(); | 
 |  |  |         User user = userService.getByUsername(username, tenantId); | 
 |  |  |         User user = userService.getByUsername(username | 
 |  |  |                 , configProperties.getSystemMode().equals(SystemModeType.OFFLINE) ? param.getTenantId() : null | 
 |  |  |         ); | 
 |  |  |         if (user == null) { | 
 |  |  |             return R.error("Username Does Not Exist"); | 
 |  |  |             return R.parse(BusinessRes.USERNAME_NOT_EXIST); | 
 |  |  |         } | 
 |  |  |         if (!user.getStatus().equals(StatusType.ENABLE.val)) { | 
 |  |  |             return R.error("Account Frozen"); | 
 |  |  |             return R.parse(BusinessRes.USERNAME_FROZEN); | 
 |  |  |         } | 
 |  |  |         if (!userService.comparePassword(user.getPassword(), param.getPassword())) { | 
 |  |  |             return R.error("Invalid Password"); | 
 |  |  |             return R.parse(BusinessRes.INVALID_PASSWORD); | 
 |  |  |         } | 
 |  |  |         String accessToken = JwtUtil.buildToken(new JwtSubject(username, user.getTenantId()), | 
 |  |  |                 configProperties.getTokenExpireTime(), configProperties.getTokenKey()); | 
 |  |  |         userLoginService.saveAsync(user.getId(), accessToken, UserLogin.TYPE_LOGIN, tenantId, null, request); | 
 |  |  |         userLoginService.saveAsync(user.getId(), accessToken, UserLogin.TYPE_LOGIN, user.getTenantId(), null, request); | 
 |  |  |         Tenant tenant = tenantService.getById(user.getTenantId()); | 
 |  |  |         return R.ok("Sign In Success").add(new LoginResult(accessToken, user, tenant.getName())); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @GetMapping("/email/code") | 
 |  |  |     public R emailCode(@RequestParam(value = "email", required = false) String email) { | 
 |  |  |         if (Cools.isEmpty(email)) { | 
 |  |  |             return R.parse(BaseRes.PARAM); | 
 |  |  |         } | 
 |  |  |         if (!emailService.isValid(email)) { | 
 |  |  |             return R.parse(BusinessRes.INVALID_EMAIL); | 
 |  |  |         } | 
 |  |  |         if (null != userService.getByEmail(email, null)) { | 
 |  |  |             return R.parse(BusinessRes.EMAIL_EXIT); | 
 |  |  |         } | 
 |  |  |         Long expire = redisService.getExpire(EmailType.REGISTER_VERIFY.toString(), email); | 
 |  |  |         if (expire > (configProperties.getCodeTime() - 60)) { | 
 |  |  |             return R.error("Please don't request code too frequently."); | 
 |  |  |         } | 
 |  |  |         String code = Utils.randomNumbers(configProperties.getCodeLength()); | 
 |  |  |         if (emailService.sendEmail(email, EmailType.REGISTER_VERIFY, Cools.add("code", code))) { | 
 |  |  |             redisService.setValue(EmailType.REGISTER_VERIFY.toString(), email, code, configProperties.getCodeTime()); | 
 |  |  |         } | 
 |  |  |         return R.ok(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @OperationLog("Register") | 
 |  |  |     @PostMapping("/register") | 
 |  |  |     public R register(@RequestBody RegisterParam param, HttpServletRequest request) { | 
 |  |  |         if (Cools.isEmpty(param.getUsername(), param.getPassword(), param.getEmail(), param.getCode())) { | 
 |  |  |             return R.parse(BaseRes.PARAM); | 
 |  |  |         } | 
 |  |  |         // verify code | 
 |  |  |         if (!param.getCode().equals(configProperties.getSecurityCode())) { | 
 |  |  |             String cacheCode = redisService.getValue(EmailType.REGISTER_VERIFY.toString(), param.getEmail()); | 
 |  |  |             if (Cools.isEmpty(cacheCode)) { | 
 |  |  |                 return R.error("The verification code has expired."); | 
 |  |  |             } | 
 |  |  |             if (!cacheCode.equals(param.getCode())) { | 
 |  |  |                 return R.error("The verification code is incorrect."); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         // register | 
 |  |  |         TenantInitParam initParam = new TenantInitParam(); | 
 |  |  |         initParam.setEmail(param.getEmail()); | 
 |  |  |         initParam.setUsername(param.getUsername()); | 
 |  |  |         initParam.setPassword(param.getPassword()); | 
 |  |  |         initParam.setName(param.getUsername()); | 
 |  |  |         initParam.setFlag(param.getUsername()); | 
 |  |  |         Long tenantId = tenantService.initTenant(initParam); | 
 |  |  |         if (null == tenantId) { | 
 |  |  |             throw new CoolException("Failed to register"); | 
 |  |  |         } | 
 |  |  |         redisService.delete(EmailType.REGISTER_VERIFY.toString(), param.getEmail()); | 
 |  |  |         // token | 
 |  |  |         User user = userService.getByUsername(param.getUsername(), tenantId); | 
 |  |  |         String accessToken = JwtUtil.buildToken(new JwtSubject(user.getUsername(), user.getTenantId()), | 
 |  |  |                 configProperties.getTokenExpireTime(), configProperties.getTokenKey()); | 
 |  |  |         userLoginService.saveAsync(user.getId(), accessToken, UserLogin.TYPE_LOGIN, tenantId, null, request); | 
 |  |  |         Tenant tenant = tenantService.getById(user.getTenantId()); | 
 |  |  |         return R.ok("Sign Up Success").add(new LoginResult(accessToken, user, tenant.getName())); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @GetMapping("/system/info") | 
 |  |  |     public R systemInfo() { | 
 |  |  |         SystemModeType systemMode = configProperties.getSystemMode(); | 
 |  |  |         SystemInfoVo infoVo = new SystemInfoVo(); | 
 |  |  |         infoVo.setName(configProperties.getSystemName()); | 
 |  |  |         infoVo.setVersion(configProperties.getSystemVersion()); | 
 |  |  |         infoVo.setMode(systemMode.toString()); | 
 |  |  |         infoVo.setMode(configProperties.getSystemMode().toString()); | 
 |  |  |         return R.ok(infoVo); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |     @PostMapping("/auth/user") | 
 |  |  |     public R updateInfo(@RequestBody User user) { | 
 |  |  |         user.setId(getLoginUserId()); | 
 |  |  |         // 不能修改的字段 | 
 |  |  |         user.setUsername(null); | 
 |  |  |         user.setPassword(null); | 
 |  |  |         user.setEmailVerified(null); | 
 |  |  |         user.setTenantId(null); | 
 |  |  |         user.setStatus(null); | 
 |  |  |         if (!Cools.isEmpty(user.getEmail())) { | 
 |  |  |             if (!emailService.isValid(user.getEmail())) { | 
 |  |  |                 return R.parse(BusinessRes.INVALID_EMAIL); | 
 |  |  |             } | 
 |  |  |             User one = userService.getByEmail(user.getEmail(), null); | 
 |  |  |             if (null != one  && !one.getId().equals(user.getId())) { | 
 |  |  |                 return R.parse(BusinessRes.EMAIL_EXIT); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (userService.updateById(user)) { | 
 |  |  |             return R.ok("Save Success").add(userService.getById(user.getId())); | 
 |  |  |         } | 
 |  |  | 
 |  |  |     @PostMapping("/auth/reset/password") | 
 |  |  |     public R resetPassword(@RequestBody UpdatePasswordParam param) { | 
 |  |  |         if (Cools.isEmpty(param.getOldPassword(), param.getNewPassword())) { | 
 |  |  |             return R.error("Parameters Cannot Be Empty"); | 
 |  |  |             return R.parse(BaseRes.PARAM); | 
 |  |  |         } | 
 |  |  |         Long userId = getLoginUserId(); | 
 |  |  |         if (userId == null) { | 
 |  |  |             return R.error("Please Login First"); | 
 |  |  |         } | 
 |  |  |         if (!userService.comparePassword(userService.getById(userId).getPassword(), param.getOldPassword())) { | 
 |  |  |             return R.parse("408-The Current Password Was Incorrect"); | 
 |  |  |             return R.parse(BusinessRes.INVALID_PASSWORD); | 
 |  |  |         } | 
 |  |  |         User user = new User(); | 
 |  |  |         user.setId(userId); |