diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/SaTokenConfigure.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/SaTokenConfigure.java index 42db809..a595969 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/SaTokenConfigure.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/SaTokenConfigure.java @@ -24,24 +24,12 @@ public class SaTokenConfigure implements WebMvcConfigurer { .back(); SaRouter.match("/**") - .notMatch("/class/list") - .notMatch("/exam/words/get") - .notMatch("/exam/words/detail") - .notMatch("/exam/words/student/history") - .notMatch("grade/list") - .notMatch("/student/list") - .notMatch("/student/detail") - .notMatch("/studentLessonPlans/list") - .notMatch("/studentLessonPlans/history") - .notMatch("/student/analyze") - .notMatch("/student/mastery/detail") - .notMatch("/unit/list") - .notMatch("/vocabulary/list") - .notMatch("/vocabulary/student/detail") - .notMatch("/plan/download") .notMatch("/login/**") .check(r -> StpUtil.checkLogin()); + SaRouter.match("/admin/**") + .check(r -> StpUtil.checkRole("root")); + })) .addPathPatterns("/**") .excludePathPatterns("/error"); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/StpInterfaceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/StpInterfaceImpl.java index 2c37014..ab3c150 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/StpInterfaceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/config/StpInterfaceImpl.java @@ -28,7 +28,11 @@ public class StpInterfaceImpl implements StpInterface { @Override public List getRoleList(Object loginId, String loginType) { - return userToRole((Long) loginId) ; + long l = 0L; + if (loginId instanceof String loginIdStr) { + l = Long.parseLong(loginIdStr); + } + return userToRole(l); } private List userToRole(Long userId) { diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/UserRedisConstants.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/UserRedisConstants.java index 330f89e..a6e7c46 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/UserRedisConstants.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/UserRedisConstants.java @@ -4,7 +4,13 @@ public class UserRedisConstants { public static final String USER_LOGIN_CODE = "user:login:code:"; + public static final String USER_INVITATION_CODE = "user:invitation:code:"; + public static String buildUserLoginCode(String phone) { return USER_LOGIN_CODE + phone; } + + public static String buildUserInvitationCode(String code) { + return USER_INVITATION_CODE + code; + } } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/AdminController.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/AdminController.java index a3cfa6e..64963d3 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/AdminController.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/AdminController.java @@ -1,7 +1,10 @@ package com.yinlihupo.enlish.service.controller; +import com.yinlihupo.enlish.service.constant.UserRedisConstants; import com.yinlihupo.enlish.service.domain.dataobject.RoleDO; import com.yinlihupo.enlish.service.domain.dataobject.UserDO; +import com.yinlihupo.enlish.service.model.vo.admin.CreateInvitationCodeReqVO; +import com.yinlihupo.enlish.service.model.vo.admin.CreateInvitationCodeRspVO; import com.yinlihupo.enlish.service.model.vo.user.CreateUserReqVO; import com.yinlihupo.enlish.service.model.vo.user.FindUserListRepVO; import com.yinlihupo.enlish.service.model.vo.user.FindUserListRspVO; @@ -11,6 +14,7 @@ import com.yinlihupo.framework.biz.operationlog.aspect.ApiOperationLog; import com.yinlihupo.framework.common.response.PageResponse; import com.yinlihupo.framework.common.response.Response; import jakarta.annotation.Resource; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -19,6 +23,8 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; +import java.util.Random; +import java.util.concurrent.TimeUnit; @RequestMapping("/admin/") @RestController @@ -30,6 +36,8 @@ public class AdminController { private PasswordEncoder passwordEncoder; @Resource private RoleService roleService; + @Resource + private RedisTemplate redisTemplate; @PostMapping("user/list") @ApiOperationLog(description = "查询用户列表") @@ -66,4 +74,18 @@ public class AdminController { return Response.success(); } + + @PostMapping("user/create/invitation/code") + @ApiOperationLog(description = "创建邀请码") + public Response createInvitationCode(@RequestBody CreateInvitationCodeReqVO createInvitationCodeReqVO) { + + String code = String.valueOf(new Random().nextInt(1000000)); + Integer limit = createInvitationCodeReqVO.getLimit(); + Integer expire = createInvitationCodeReqVO.getExpire(); + + redisTemplate.opsForValue().set(UserRedisConstants.buildUserInvitationCode(code), limit); + redisTemplate.expire(UserRedisConstants.buildUserInvitationCode(code), expire, TimeUnit.DAYS); + + return Response.success(CreateInvitationCodeRspVO.builder().invitationCode(code).build()); + } } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/LoginController.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/LoginController.java index 82af399..42f2a74 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/LoginController.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/LoginController.java @@ -25,7 +25,7 @@ public class LoginController { @ApiOperationLog(description = "登录") public Response login(@RequestBody LoginReqVO loginReqVO) { try { - loginService.login(loginReqVO.getPhone(), loginReqVO.getName(), loginReqVO.getPassword(), loginReqVO.getCode()); + loginService.login(loginReqVO.getPhone(), loginReqVO.getName(), loginReqVO.getPassword(), loginReqVO.getCode(), loginReqVO.getInvitationCode()); return Response.success(StpUtil.getTokenInfo().getTokenValue()); } catch (Exception e) { log.error("注册或登录失败 {}", e.getMessage()); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/admin/CreateInvitationCodeReqVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/admin/CreateInvitationCodeReqVO.java new file mode 100644 index 0000000..6753724 --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/admin/CreateInvitationCodeReqVO.java @@ -0,0 +1,18 @@ +package com.yinlihupo.enlish.service.model.vo.admin; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class CreateInvitationCodeReqVO { + + // 限制人数 + private Integer limit; + // 有效期 + private Integer expire; +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/admin/CreateInvitationCodeRspVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/admin/CreateInvitationCodeRspVO.java new file mode 100644 index 0000000..60af99c --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/admin/CreateInvitationCodeRspVO.java @@ -0,0 +1,16 @@ +package com.yinlihupo.enlish.service.model.vo.admin; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class CreateInvitationCodeRspVO { + + private String invitationCode; + +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/login/LoginReqVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/login/LoginReqVO.java index 6508564..020b8e6 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/login/LoginReqVO.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/login/LoginReqVO.java @@ -15,4 +15,5 @@ public class LoginReqVO { private String name; private String password; private String code; + private String invitationCode; } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/LoginService.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/LoginService.java index 3507dac..d0a79e4 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/LoginService.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/LoginService.java @@ -2,7 +2,7 @@ package com.yinlihupo.enlish.service.service; public interface LoginService { - void login(String phone, String name, String reqPassword, String reqCode); + void login(String phone, String name, String reqPassword, String reqCode, String invitationCode); void sendVerificationCode(String phone); } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/login/LoginServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/login/LoginServiceImpl.java index 5228f57..ab960cb 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/login/LoginServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/login/LoginServiceImpl.java @@ -13,11 +13,14 @@ import com.yinlihupo.enlish.service.service.LoginService; import com.yinlihupo.framework.common.util.JsonUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.Duration; +import java.util.Objects; @Service @Slf4j @@ -28,20 +31,32 @@ public class LoginServiceImpl implements LoginService { @Resource private PasswordEncoder passwordEncoder; @Resource - private StringRedisTemplate stringRedisTemplate; + private RedisTemplate redisTemplate; @Resource private Client client; @Override - public void login(String phone, String name, String reqPassword, String reqCode) { + @Transactional(rollbackFor = Exception.class) + public void login(String phone, String name, String reqPassword, String reqCode, String invitationCode) { UserDO userDO = userDOMapper.selectByPhone(phone); log.info("userDO:{}", userDO); - String code = stringRedisTemplate.opsForValue().get(UserRedisConstants.buildUserLoginCode(phone)); + String code = JsonUtils.toJsonString(redisTemplate.opsForValue().get(UserRedisConstants.buildUserLoginCode(phone))); if (userDO == null) { if (code == null || !code.equals(reqCode)) { throw new RuntimeException("验证码错误"); } + + Object invitationObj = redisTemplate.opsForValue().get(UserRedisConstants.buildUserInvitationCode(invitationCode)); + if (invitationObj == null) { + throw new RuntimeException("邀请码错误"); + } + int invitationLimit = Integer.parseInt(JsonUtils.toJsonString(invitationObj)); + if (invitationLimit <= 0) { + throw new RuntimeException("邀请码已使用完毕"); + } + redisTemplate.opsForValue().set(UserRedisConstants.buildUserInvitationCode(invitationCode), invitationLimit - 1); + userDO = UserDO.builder() .phone(phone) .name(name) @@ -68,7 +83,7 @@ public class LoginServiceImpl implements LoginService { @Override public void sendVerificationCode(String phone) { String code = RandomUtil.randomNumbers(6); - stringRedisTemplate.opsForValue().set(UserRedisConstants.buildUserLoginCode(phone), code, Duration.ofSeconds(60)); + redisTemplate.opsForValue().set(UserRedisConstants.buildUserLoginCode(phone), code, Duration.ofSeconds(60)); String signName = "短信测试"; String templateCode = "SMS_154950909"; String templateParam = String.format("{\"code\":\"%s\"}", code); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/role/RoleServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/role/RoleServiceImpl.java index 1fed7d4..fe060a9 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/role/RoleServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/role/RoleServiceImpl.java @@ -48,7 +48,7 @@ public class RoleServiceImpl implements RoleService { List roleDOs = roleIds.stream().map(roleId2RoleDO::get).toList(); List user2RoleKeys = roleDOs.stream().map(RoleDO::getRoleKey).toList(); log.info("将用户 {} 的角色同步到 redis 中, {}", userId, roleKeys); - redisTemplate.opsForValue().set(RoleConstants.buildUserRoleKey(userId), JsonUtils.toJsonString(user2RoleKeys)); + redisTemplate.opsForValue().set(RoleConstants.buildUserRoleKey(userId), user2RoleKeys); }); } diff --git a/enlish-vue/src/api/admin.js b/enlish-vue/src/api/admin.js index f78299e..0d52484 100644 --- a/enlish-vue/src/api/admin.js +++ b/enlish-vue/src/api/admin.js @@ -8,3 +8,6 @@ export function createUser(data) { return axios.post('/admin/user/create', data) } +export function createInvitationCode(data) { + return axios.post('/admin/user/create/invitation/code', data) +} diff --git a/enlish-vue/src/pages/Login.vue b/enlish-vue/src/pages/Login.vue index dc1848c..39ac83e 100644 --- a/enlish-vue/src/pages/Login.vue +++ b/enlish-vue/src/pages/Login.vue @@ -41,6 +41,9 @@ + + +
@@ -86,6 +89,7 @@ const form = reactive({ password: '', password_repeat: '', code: '', + invitationCode: '', }) const rules = { @@ -143,6 +147,7 @@ async function userLogin() { name: form.name.trim(), password: form.password.trim(), code: form.code.trim(), + invitationCode: form.invitationCode.trim() } const res = await login(payload) const data = res.data diff --git a/enlish-vue/src/pages/admid/admid.vue b/enlish-vue/src/pages/admid/admid.vue index b5e14bd..79930c7 100644 --- a/enlish-vue/src/pages/admid/admid.vue +++ b/enlish-vue/src/pages/admid/admid.vue @@ -31,6 +31,29 @@
+ + + + + + + + + + + 生成邀请码 + 重置 + + +
+ +
+
+ @@ -57,7 +80,7 @@