Browse Source

Merge remote-tracking branch 'origin/store-plantform' into store-plantform

wxd 1 month ago
parent
commit
80555e9765

+ 139 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/StorePlatformLoginController.java

@@ -0,0 +1,139 @@
+package shop.alien.storeplatform.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.config.redis.BaseRedisService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.store.vo.StoreUserVo;
+import shop.alien.mapper.StoreUserMapper;
+import shop.alien.storeplatform.service.StorePlatformLoginervice;
+
+import java.util.Objects;
+import java.util.Optional;
+
+@Slf4j
+@Api(tags = {"商户平台-用户管理"})
+@ApiSort(1)
+@CrossOrigin
+@RestController
+@RequestMapping("/storePlatformLogin")
+@RequiredArgsConstructor
+public class StorePlatformLoginController {
+
+    private final BaseRedisService baseRedisService;
+    private final StoreUserMapper storeUserMapper;
+    private final StorePlatformLoginervice storePlatformLoginService;
+
+    @ApiOperation("注册")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "password", value = "密码", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "code", value = "验证码", dataType = "String", paramType = "query", required = true)
+    })
+    @GetMapping("/register")
+    public R<Boolean> register(@RequestParam("phone") String phone, @RequestParam("password") String password, @RequestParam("code") String code) {
+        log.info("StorePlatformLoginController.register?phone={}&password={}&code={}", phone, password, code);
+        String cacheCode = baseRedisService.getString("verification_store_platform_register_" + phone);
+        if (null == cacheCode) {
+            return R.fail("当前验证码已过期或未发送");
+        }
+        if (!cacheCode.trim().equals(code.trim())) {
+            return R.fail("验证码错误");
+        }
+        log.info("StorePlatformLoginController.register?phone={}&password={}", phone, password);
+        return storePlatformLoginService.register(phone, password);
+    }
+
+    @ApiOperation("注册校验")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/checkRegister")
+    public R<Boolean> checkRegister(String phone) {
+        log.info("StorePlatformLoginController.checkRegister?phone={}", phone);
+        Boolean res = storePlatformLoginService.checkRegister(phone);
+        return R.data(res);
+    }
+
+    @ApiOperation("登录")
+    @ApiOperationSupport(order = 3)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "password", value = "密码", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "isPassword", value = "是否密码登录", dataType = "Boolean", paramType = "query", required = true),
+            @ApiImplicitParam(name = "code", value = "验证码", dataType = "String", paramType = "query", required = true)
+    })
+    @GetMapping("/login")
+    public R<StoreUserVo> login(@RequestParam("phone") String phone, @RequestParam("password") String password, @RequestParam("isPassword") Boolean isPassword, @RequestParam("code") String code) {
+        log.info("StorePlatformLoginController.login?phone={}&password={}&isPassword={}&code={}", phone, password, isPassword, code);
+        if (!isPassword) {
+            // 2025-11-04 验证码-商户端登录
+            String cacheCode = baseRedisService.getString("verification_store_platform_login_" + phone);
+            if (null == cacheCode) {
+                return R.fail("验证码过期或未发送");
+            }
+            if (!cacheCode.trim().equals(code.trim())) {
+                return R.fail("验证码错误");
+            }
+        }
+        StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>()
+                .eq(StoreUser::getPhone, phone));
+        if (null == storeUser) {
+            return R.fail("当前账号不存在,请先去注册账号!");
+        }
+        if (storeUser.getStatus() == 1) {
+            return R.fail("账号被禁用");
+        }
+        return Optional.ofNullable(storeUser).
+                map(user -> isPassword ? checkPassword(user, password) : storePlatformLoginService.createToKen(user)).
+                orElseGet(() -> R.fail("手机号不存在"));
+    }
+
+    @ApiOperation("忘记密码/修改密码/更换绑定手机号")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "newPhone", value = "新手机号", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "oldPassword", value = "旧密码", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "newPassword", value = "新密码", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "confirmNewPassword", value = "新密码确认", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "verificationCode", value = "验证码", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "type", value = "类型:0:忘记密码,1:修改密码,2:更换绑定手机号", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/updatePassword")
+    public R<String> updatePassword(String phone, String newPhone, String oldPassword, String newPassword, String confirmNewPassword, String verificationCode, Integer type) {
+        log.info("StorePlatformLoginController.updatePassword?phone={}&newPhone={}&oldPassword={}&newPassword={}&confirmNewPassword={}&verificationCode={}&type={}", phone, newPhone, oldPassword, newPassword, confirmNewPassword, verificationCode, type);
+        // 2025-11-04 验证码-商家端修改密码/忘记密码/更换绑定手机号
+        String businessType = "";
+        switch (type) {
+            case 0:
+                businessType = "forget_password";
+                break;
+            case 1:
+                businessType = "modify_password";
+                break;
+            case 2:
+                businessType = "modify_phone";
+                break;
+        }
+        String cacheCode = baseRedisService.getString("verification_store_platform_" + businessType + "_" + phone);
+        if (null == cacheCode) {
+            return R.fail("当验证码过期或未发送");
+        }
+        if (!cacheCode.trim().equals(verificationCode.trim())) {
+            return R.fail("验证码错误");
+        }
+        return storePlatformLoginService.forgetOrModifyPassword(phone, newPhone, oldPassword, newPassword, confirmNewPassword, verificationCode, type);
+    }
+
+    private R<StoreUserVo> checkPassword(StoreUser user, String password) {
+        return Objects.equals(password, user.getPassword())
+                ? storePlatformLoginService.createToKen(user)
+                : R.fail("密码错误");
+    }
+
+}

+ 0 - 28
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/TestController.java

@@ -1,28 +0,0 @@
-package shop.alien.storeplatform.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import io.swagger.annotations.Api;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import shop.alien.entity.result.R;
-import shop.alien.storeplatform.feign.AlienStoreFeign;
-
-@Api(tags = {"测试"})
-@Slf4j
-@CrossOrigin
-@RestController
-@RequestMapping("/testController")
-@RequiredArgsConstructor
-public class TestController {
-
-    private final AlienStoreFeign alienStoreFeign;
-
-    @GetMapping("test")
-    public R<JSONObject> test() {
-        return R.data(alienStoreFeign.getMessageList("user_13942852153", 1, "0"));
-    }
-}

+ 27 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/service/StorePlatformLoginervice.java

@@ -0,0 +1,27 @@
+package shop.alien.storeplatform.service;
+
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.store.vo.StoreUserVo;
+
+public interface StorePlatformLoginervice {
+
+    R<Boolean> register(String phone, String password);
+
+    R<StoreUserVo> createToKen(StoreUser storeUser);
+
+    public boolean checkRegister(String phone);
+
+    /**
+     * 修改密码或忘记密码
+     *
+     * @param phone   手机号
+     * @param oldPassword 原密码
+     * @param newPassword       新密码
+     * @param confirmNewPassword 确认密码
+     * @param type 类型
+     * @return boolean
+     */
+    R<String> forgetOrModifyPassword(String phone, String newPhone, String oldPassword, String newPassword,String confirmNewPassword,String verificationCode,  Integer type);
+
+}

+ 0 - 4
alien-store-platform/src/main/java/shop/alien/storeplatform/service/TestService.java

@@ -1,4 +0,0 @@
-package shop.alien.storeplatform.service;
-
-public interface TestService {
-}

+ 235 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StorePlatformLoginServiceImpl.java

@@ -0,0 +1,235 @@
+package shop.alien.storeplatform.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import shop.alien.config.redis.BaseRedisService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreInfo;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.store.vo.StoreUserVo;
+import shop.alien.mapper.StoreInfoMapper;
+import shop.alien.mapper.StoreUserMapper;
+import shop.alien.storeplatform.service.StorePlatformLoginervice;
+import shop.alien.util.common.DateUtils;
+import shop.alien.util.common.JwtUtil;
+
+import java.util.*;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class StorePlatformLoginServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser> implements StorePlatformLoginervice {
+
+    @Value("${jwt.expiration-time}")
+    private String effectiveTime;
+
+    private final StoreUserMapper storeUserMapper;
+    private final StoreInfoMapper storeInfoMapper;
+    private final BaseRedisService baseRedisService;
+
+    @Override
+    public R<Boolean> register(String phone, String password) {
+
+        LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StoreUser::getPhone, phone)
+                .orderByDesc(StoreUser::getCreatedTime).last("LIMIT 1");
+        StoreUser storeUser = storeUserMapper.selectOne(queryWrapper);
+
+        List<Integer> noRegister = Arrays.asList(0, 1);
+
+        if (Objects.isNull((storeUser))) {
+            // 没有数据
+            saveNewUser(phone, password);
+            return R.success("操作成功");
+
+        } else if (noRegister.contains(storeUser.getStatus())) {
+            return R.fail("手机号已经注册过");
+        }
+
+        int daysSinceDeletion = DateUtils.subtraction(storeUser.getCreatedTime(), new Date());
+        if (daysSinceDeletion < 30) return R.fail(String.format("请于%d天后重新申请注册", 30 - daysSinceDeletion));
+        saveNewUser(phone, password);
+        return R.success("操作成功");
+    }
+
+    public boolean checkRegister(String phone) {
+        LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StoreUser::getPhone, phone);
+        queryWrapper.in(StoreUser::getStatus, 0, 1);
+        List<StoreUser> storeUsers = storeUserMapper.selectList(queryWrapper);
+        return CollectionUtils.isEmpty(storeUsers) ? Boolean.TRUE : Boolean.FALSE;
+    }
+
+    @Override
+    public R<StoreUserVo> createToKen(StoreUser storeUser) {
+        int effectiveTimeInt = Integer.parseInt(effectiveTime.substring(0, effectiveTime.length() - 1));
+        String effectiveTimeUnit = effectiveTime.substring(effectiveTime.length() - 1);
+        long effectiveTimeIntLong = 0L;
+        switch (effectiveTimeUnit) {
+            case "s": {
+                effectiveTimeIntLong = effectiveTimeInt * 1000L;
+                break;
+            }
+            case "m": {
+                effectiveTimeIntLong = effectiveTimeInt * 60L * 1000L;
+                break;
+            }
+            case "h": {
+                effectiveTimeIntLong = effectiveTimeInt * 60L * 60L * 1000L;
+                break;
+            }
+            case "d": {
+                effectiveTimeIntLong = effectiveTimeInt * 24L * 60L * 60L * 1000L;
+                break;
+            }
+        }
+
+        StoreUserVo storeUserVo = new StoreUserVo();
+        BeanUtils.copyProperties(storeUser, storeUserVo);
+        Map<String, String> tokenMap = new HashMap<>();
+        tokenMap.put("phone", storeUser.getPhone());
+        tokenMap.put("userName", storeUser.getName());
+        tokenMap.put("userId", storeUser.getId().toString());
+        tokenMap.put("userType", "store");
+        storeUserVo.setToken(JwtUtil.createJWT("store_platform_" + storeUser.getPhone(), storeUser.getName(), JSONObject.toJSONString(tokenMap), effectiveTimeIntLong));
+        baseRedisService.setString("store_platform_" + storeUser.getPhone(), storeUserVo.getToken());
+        StoreInfo storeInfo = storeInfoMapper.selectById(storeUser.getStoreId());
+        if (storeInfo != null) {
+            storeUserVo.setBusinessSection(storeInfo.getBusinessSection());
+            storeUserVo.setBusinessTypesName(storeInfo.getBusinessTypesName());
+        }
+        return R.data(storeUserVo);
+    }
+
+    @Override
+    public R<String> forgetOrModifyPassword(String phone, String newPhone, String oldPassword, String newPassword, String confirmNewPassword, String verificationCode, Integer type) {
+        boolean flag = false;
+        try {
+            //类型为0 忘记密码
+            if (type == 0) {
+                return forgetPassword(phone, newPassword);
+            }
+            //修改密码
+            else if (type == 1) {
+                //效验新密码规则
+                passwordVerification(phone, oldPassword, newPassword, confirmNewPassword);
+                LambdaUpdateWrapper<StoreUser> updateWrapper = new LambdaUpdateWrapper<>();
+                updateWrapper.eq(StoreUser::getPhone, phone);
+                updateWrapper.set(StoreUser::getPassword, newPassword);
+                flag = this.update(updateWrapper);
+
+                //修改成功后同步删除redis缓存token
+                if (flag) {
+                    String token = "store_platform_" + phone;
+                    String toKenStr = baseRedisService.getString(token);
+                    if (toKenStr != null) {
+                        baseRedisService.delete(token);
+                    }
+                    return R.success("密码修改成功");
+                } else {
+                    log.error("密码修改失败");
+                    return R.fail("密码修改失败");
+                }
+            }
+            //更换绑定手机号
+            else if (type == 2) {
+                return ChangeBoundPhone(phone, newPhone);
+            }
+            return R.success("密码修改成功");
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
+
+    private void saveNewUser(String phone, String password) {
+        StoreUser registerStoreUser = new StoreUser();
+        registerStoreUser.setPhone(phone);
+        registerStoreUser.setPassword(password);
+        registerStoreUser.setMoney(0);
+        registerStoreUser.setDeleteFlag(0);
+        registerStoreUser.setStatus(0);
+        registerStoreUser.setPassType(2);
+        registerStoreUser.setCreatedTime(new Date());
+        registerStoreUser.setLogoutFlag(0);
+        registerStoreUser.setNickName(phone);
+        storeUserMapper.insert(registerStoreUser);
+    }
+
+    private void passwordVerification(String phone, String password, String newPassword, String confirmNewPassword) {
+        LambdaUpdateWrapper<StoreUser> wrapperFans = new LambdaUpdateWrapper<>();
+        wrapperFans.eq(StoreUser::getPhone, phone);
+        StoreUser storeUser = this.getOne(wrapperFans);
+        if (!newPassword.equals(confirmNewPassword)) {
+            log.info("两次新密码输入不一致 请重新输入");
+            throw new RuntimeException("两次新密码输入不一致 请重新输入");
+        }
+        if (storeUser == null || storeUser.equals("")) {
+            log.info("该手机号没有注册过账户");
+            throw new RuntimeException("该手机号没有注册过账户");
+        } else {
+            wrapperFans.eq(StoreUser::getPassword, password);
+            StoreUser storeUserPw = this.getOne(wrapperFans);
+            if (storeUserPw == null || storeUserPw.getPassword().equals("")) {
+                log.info("原密码错误");
+                throw new RuntimeException("原密码错误");
+            }
+        }
+    }
+
+    private R<String> forgetPassword(String phone, String newPassword) {
+        boolean flag = false;
+        LambdaUpdateWrapper<StoreUser> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(StoreUser::getPhone, phone);
+        updateWrapper.set(StoreUser::getPassword, newPassword);
+        flag = this.update(updateWrapper);
+        if (flag) {
+            log.info("密码修改成功");
+            String token = "store_platform_" + phone;
+            String tokenStr = baseRedisService.getString(token);
+            if (tokenStr != null) {
+                baseRedisService.delete(token);
+            }
+        }
+        if (!flag) {
+            log.error("密码修改失败");
+            throw new RuntimeException("密码修改失败");
+        }
+        return R.success("密码修改成功");
+    }
+
+    private R<String> ChangeBoundPhone(String phone, String newPhone) {
+        boolean flag = false;
+        //获取新手机号验证码
+        LambdaUpdateWrapper<StoreUser> newUpdateWrapper = new LambdaUpdateWrapper<>();
+        newUpdateWrapper.eq(StoreUser::getPhone, newPhone);
+        StoreUser newStoreUser = this.getOne(newUpdateWrapper);
+        if (newStoreUser != null) {
+            if (newStoreUser.getPhone().equals(newPhone)) {
+                throw new RuntimeException("该手机号已注册过商户");
+            }
+        } else {
+            LambdaUpdateWrapper<StoreUser> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(StoreUser::getPhone, phone);
+            StoreUser storeUser = this.getOne(updateWrapper);
+            storeUser.setPhone(newPhone);
+            flag = this.updateById(storeUser);
+            if (flag) {
+                String token = "store_platform_" + phone;
+                String tokenStr = baseRedisService.getString(token);
+                if (tokenStr != null) {
+                    baseRedisService.delete(token);
+                }
+            }
+        }
+        return R.success("新手机号绑定成功");
+    }
+
+}

+ 0 - 4
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/TestServiceImpl.java

@@ -1,4 +0,0 @@
-package shop.alien.storeplatform.service.impl;
-
-public class TestServiceImpl {
-}