pom.xml
@@ -288,6 +288,24 @@ <version>${ruoyi.version}</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>dysmsapi20170525</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.0</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>2.1.0</version> </dependency> </dependencies> </dependencyManagement> ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/RemoteCompanyUserService.java
@@ -3,15 +3,17 @@ import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.company.api.domain.User; import com.ruoyi.company.api.factory.RemoteCompanyUserServiceFallbackFactory; import com.ruoyi.company.api.model.RegisterUser; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.*; @FeignClient(contextId = "remoteCompanyUserService", value = ServiceNameConstants.COMPANY_SERVICE, fallbackFactory = RemoteCompanyUserServiceFallbackFactory.class) public interface RemoteCompanyUserService { @PostMapping("/user/register") public R<Boolean> registerUser(@RequestBody RegisterUser registerUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); @GetMapping("/user/getUserByAccountName") public R<User> getUserByAccountName(@RequestParam("accountName") String accountName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/factory/RemoteCompanyUserServiceFallbackFactory.java
@@ -2,6 +2,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.company.api.RemoteCompanyUserService; import com.ruoyi.company.api.domain.User; import com.ruoyi.company.api.model.RegisterUser; import lombok.extern.log4j.Log4j2; import org.springframework.cloud.openfeign.FallbackFactory; @@ -21,6 +22,11 @@ public R<Boolean> registerUser(RegisterUser registerUser, String source) { return R.fail("用户注册失败:"+cause.getMessage()); } @Override public R<User> getUserByAccountName(String accountName, String source) { return R.fail("获取用户信息失败:"+cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/AppUser.java
New file @@ -0,0 +1,72 @@ package com.ruoyi.system.api.model; import java.time.LocalDateTime; public class AppUser { private Long userId; /** * 用户唯一标识 */ private String token; /** 账号 */ private String accountName; /** 手机号 */ private String phone; /** 状态:1-激活 2-禁用 */ private Integer status; /** 创建时间 */ private LocalDateTime loginTime; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getAccountName() { return accountName; } public void setAccountName(String accountName) { this.accountName = accountName; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public LocalDateTime getLoginTime() { return loginTime; } public void setLoginTime(LocalDateTime loginTime) { this.loginTime = loginTime; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUser.java
@@ -1,8 +1,9 @@ package com.ruoyi.system.api.model; import com.ruoyi.system.api.domain.SysUser; import java.io.Serializable; import java.util.Set; import com.ruoyi.system.api.domain.SysUser; /** * 用户信息 ruoyi-auth/pom.xml
@@ -63,6 +63,21 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-swagger</artifactId> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>dysmsapi20170525</artifactId> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> </dependency> </dependencies> ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -2,10 +2,15 @@ import javax.servlet.http.HttpServletRequest; import com.ruoyi.auth.utils.SmsUtils; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.utils.uuid.IdUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.company.api.domain.User; import com.ruoyi.company.api.model.RegisterUser; import com.ruoyi.system.api.model.AppUser; import io.swagger.v3.oas.annotations.Operation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; @@ -23,7 +28,12 @@ import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.model.LoginUser; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import static com.alibaba.nacos.api.common.Constants.ACCESS_TOKEN; /** * token 控制 @@ -91,6 +101,7 @@ return R.ok(); } /** * 发送短信验证码 */ @@ -103,16 +114,51 @@ String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + registerUser.getPhone(); redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); // 发送验证码 TODO String result = SmsUtils.sendSms(registerUser.getPhone(), code); if (!"OK".equals(result)) { return R.fail("验证码发送失败"); } return R.ok(code); } @PostMapping("companyLogin") public R<?> companyLogin(@RequestBody RegisterUser registerUser) public R<Map<String, Object>> companyLogin(@RequestBody RegisterUser registerUser) { // 用户登录 LoginUser userInfo = sysLoginService.login(registerUser.getPhone(), registerUser.getSmsCode()); // 获取登录token return R.ok(tokenService.createToken(userInfo)); User user = sysLoginService.companyLogin(registerUser); String token = IdUtils.fastUUID(); AppUser appUser = new AppUser(); appUser.setUserId(user.getUserId()); appUser.setAccountName(appUser.getAccountName()); appUser.setPhone(appUser.getPhone()); appUser.setLoginTime(LocalDateTime.now()); appUser.setToken(token); // 根据uuid将loginUser缓存 String userKey = getTokenKey(appUser.getToken()); redisService.setCacheObject(userKey, appUser, CacheConstants.EXPIRATION, TimeUnit.MINUTES); // Jwt存储信息 Map<String, Object> claimsMap = new HashMap<String, Object>(); claimsMap.put(SecurityConstants.USER_KEY, token); claimsMap.put(SecurityConstants.DETAILS_USER_ID, appUser.getUserId()); claimsMap.put(SecurityConstants.DETAILS_USERNAME, appUser.getAccountName()); // 接口返回信息 Map<String, Object> rspMap = new HashMap<String, Object>(); rspMap.put("access_token", JwtUtils.createToken(claimsMap)); rspMap.put("expires_in", CacheConstants.EXPIRATION); return R.ok(rspMap); } private String getTokenKey(String token) { return "login_tokens:" + token; } } ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
@@ -6,6 +6,7 @@ import com.ruoyi.company.api.domain.User; import com.ruoyi.company.api.model.RegisterUser; import lombok.RequiredArgsConstructor; import org.jacoco.agent.rt.internal_43f5073.core.internal.flow.IFrame; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ruoyi.common.core.constant.CacheConstants; @@ -186,7 +187,21 @@ } public void companyLogin(RegisterUser registerUser) public User companyLogin(RegisterUser registerUser) { String accountName = registerUser.getAccountName(); String password = registerUser.getPassword(); R<User> r = remoteCompanyUserService.getUserByAccountName(accountName, SecurityConstants.INNER); if (R.isError(r)){ throw new ServiceException(r.getMsg()); } if (r.getData() == null){ throw new ServiceException("账号不存在"); } if (!SecurityUtils.matchesPassword(r.getData().getPassword(), password)){ throw new ServiceException("密码错误"); } return r.getData(); } } ruoyi-auth/src/main/java/com/ruoyi/auth/utils/SmsUtils.java
New file @@ -0,0 +1,36 @@ package com.ruoyi.auth.utils; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; public class SmsUtils { public static String sendSms(String phoneNumber, String code) { // 设置AccessKeyId、AccessKeySecret等信息 String accessKeyId = "LTAI5tFSeci96NRF6p6UN69G"; String accessKeySecret = "25t5zmWkueoQd81Zka70uPKRPgaMiV"; // 创建DefaultAcsClient实例并初始化 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); IAcsClient client = new DefaultAcsClient(profile); // 创建并设置请求 SendSmsRequest request = new SendSmsRequest(); request.setPhoneNumbers(phoneNumber); // 必填: 要发送到的手机号码 request.setSignName("供销云"); // 必填: 已经在阿里云上注册的短信签名 request.setTemplateCode("SMS_311235421"); // 必填: 已经在阿里云上注册的短信模板CODE request.setTemplateParam("{\"code\":\""+code+"\"}"); // 必填: 短信模板的变量参数 try { // 发送短信并打印结果 SendSmsResponse response = client.getAcsResponse(request); return response.getCode(); } catch (ClientException e) { e.printStackTrace(); } return null; } } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java
@@ -16,6 +16,7 @@ * 用户名字段 */ public static final String DETAILS_USERNAME = "username"; public static final String DETAILS_USERNAME2 = "username"; /** * 授权信息字段 @@ -36,6 +37,7 @@ * 用户标识 */ public static final String USER_KEY = "user_key"; public static final String APP_USER_KEY = "app_user_key"; /** * 登录用户 ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/UserController.java
@@ -1,6 +1,8 @@ package com.ruoyi.company.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.company.api.domain.User; import com.ruoyi.company.api.model.RegisterUser; @@ -31,4 +33,11 @@ public R<UserDetail> getUserDetail(Long userId) { return R.ok(new UserDetail()); } @GetMapping("/getUserByAccountName") @InnerAuth public R<User> getUserByAccountName(String accountName) { return R.ok(userService.getOne(new LambdaQueryWrapper<User>() .eq(User::getAccountName,accountName))); } } ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml
@@ -14,10 +14,10 @@ nacos: discovery: # 服务注册地址 server-addr: 127.0.0.1:8848 server-addr: 192.168.110.111:8848 config: # 配置中心地址 server-addr: 127.0.0.1:8848 server-addr: 192.168.110.111:8848 # 配置文件格式 file-extension: yml # 共享配置 ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml
@@ -14,10 +14,10 @@ nacos: discovery: # 服务注册地址 server-addr: 127.0.0.1:8848 server-addr: 192.168.110.111:8848 config: # 配置中心地址 server-addr: 127.0.0.1:8848 server-addr: 192.168.110.111:8848 # 配置文件格式 file-extension: yml # 共享配置 ruoyi-ui/vue.config.js
@@ -36,7 +36,7 @@ proxy: { // detail: https://cli.vuejs.org/config/#devserver-proxy [process.env.VUE_APP_BASE_API]: { target: `http://localhost:9000`, target: `http://192.168.110.80:9000`, changeOrigin: true, pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: '' ruoyi-visual/ruoyi-monitor/src/main/resources/bootstrap.yml
@@ -14,10 +14,10 @@ nacos: discovery: # 服务注册地址 server-addr: 127.0.0.1:8848 server-addr: 192.168.110.111:8848 config: # 配置中心地址 server-addr: 127.0.0.1:8848 server-addr: 192.168.110.111:8848 # 配置文件格式 file-extension: yml # 共享配置