package com.ruoyi.user.controller; import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ruoyi.admin.api.entity.*; import com.ruoyi.admin.api.feignClient.AdminClient; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.RedisConstants; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.GlobalException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.vo.AddressDto; import com.ruoyi.common.core.vo.UserDto; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.system.api.model.LoginUserInfo; import com.ruoyi.user.entity.*; import com.ruoyi.user.request.LoginPhoneRequest; import com.ruoyi.user.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; /** *

* 用户列表 前端控制器 *

* * @author hjl * @since 2024-06-03 */ @RestController @RequestMapping("/user") @Api(tags = {"用户端-登录"}) public class UserController { @Resource private UserService userService; @Resource private RedisService redisService; @Resource private TokenService tokenService; @Resource private AdminClient adminClient; @Resource private RecoveryClassifyService recoveryClassifyService; @Resource private RecoveryServeService recoveryServeService; @Resource private UserRecipientService userRecipientService; /** * 用户端默认头像 */ @Value("${default.profilePicture}") private String profilePicture; /** * 解密用户敏感数据 * * @param encryptedData 明文,加密数据 * @param iv 加密算法的初始向量 * @param code 用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key * @return 登录信息 */ @ApiOperation("微信授权一键登录") @GetMapping("/wxAuthorize") @ApiImplicitParams({ @ApiImplicitParam(value = "用户允许登录后回调内容code", name = "code", dataType = "String", required = true), @ApiImplicitParam(value = "明文,加密数据", name = "encryptedData", dataType = "String", required = true), @ApiImplicitParam(value = "加密算法的初始向量", name = "iv", dataType = "String", required = true) }) public R> decodeUserInfo(@RequestParam("code") String code, @RequestParam("encryptedData") String encryptedData, @RequestParam("iv") String iv) { return R.ok(userService.decodeUserInfo(code, encryptedData, iv)); } /** * 用户端-获取微信openId * * @param code 随机code */ @ApiOperation(value = "获取微信openId", tags = {"用户端-登录"}) @PostMapping(value = "/decodeOpenid") public R decodeOpenid(HttpServletResponse response, String code) { return userService.decodeOpenid(response, code); } /** * 用户端-手机验证码登录 * * @param loginPhoneRequest 手机号及密码信息 */ @ApiOperation(value = "手机验证码登录", tags = {"用户端-登录"}) @PostMapping(value = "/phoneCodeLogin") public R phoneCodeLogin(@RequestBody @Validated LoginPhoneRequest loginPhoneRequest) { String phone = loginPhoneRequest.getPhone(); String phoneCode = loginPhoneRequest.getPhoneCode(); // 默认验证码 123456 if (!"123456".equals(phoneCode)) { // 手机验证码校验获取缓存验证码 Object phoneCodeRedis = redisService.getCacheObject(RedisConstants.USER_LOGIN_PHONE_CODE + phone); if (null == phoneCodeRedis) { return R.errorCode("验证码错误!"); } else { // redis 验证码的value 为 code:时间戳 String rCodeAndTime = String.valueOf(phoneCodeRedis); String rCode = rCodeAndTime.split(":")[0]; if (!rCode.equalsIgnoreCase(phoneCode)) { return R.errorCode("验证码错误!"); } } } // 用户账号校验 User user = userService.lambdaQuery().eq(User::getPhone, phone) .eq(User::getIsDelete, 0).one(); if (null != user) { if (!Constants.ONE.equals(user.getState())) { return R.notEnabled("账号已被禁用,请联系平台管理员。"); } } else { user = new User(); // 随机编号 user.setUserNo(String.format(Constants.USER_NO_PRE, RandomUtil.randomNumbers(Constants.EIGHT))); user.setState(Constants.ONE); user.setProfilePicture(profilePicture); user.setNickname(String.format(Constants.USER_NO_PRE, StringUtils.getCharAndNum(Constants.SIX))); user.setPhone(phone); user.setCity(loginPhoneRequest.getCity()); user.setOpenId(loginPhoneRequest.getOpenId()); // 生成用户信息 userService.save(user); } // 校验通过,生成token及过期时间 LoginUserInfo loginUserInfo = new LoginUserInfo(); loginUserInfo.setName(user.getPhone()); loginUserInfo.setUserid(user.getId()); loginUserInfo.setPhone(user.getPhone()); loginUserInfo.setLoginTime(System.currentTimeMillis()); HashMap map = new HashMap<>(8); map.put("token", tokenService.createTokenByUser(loginUserInfo)); return R.ok(map); } /** * 用户端-首页回收分类推荐 */ @ApiOperation(value = "用户注册协议/用户隐私协议", tags = {"用户端-登录"}) @GetMapping(value = "/registerOrAgreement") @ApiImplicitParams({ @ApiImplicitParam(value = "0:用户注册协议、1:用户隐私协议", name = "type", dataType = "Integer", required = true) }) public R registerOrAgreement(@RequestParam Integer type) { if (!Constants.ZERO.equals(type) && !Constants.ONE.equals(type)) { throw new GlobalException("获取类型异常!"); } R r = adminClient.agreementPolicy(type); if (500 == r.getCode()) { return R.fail(r.getMsg()); } return R.ok(r.getData()); } /** * 用户端-轮播图列表 */ @ApiOperation(value = "轮播图列表", tags = {"用户端-首页"}) @GetMapping(value = "/banner") public R> banner() { R> r = adminClient.bannerList(); List data = r.getData(); if (null == data) { return R.fail(r.getMsg()); } for (Rotate datum : data) { RecoveryServe recoveryServe = recoveryServeService.lambdaQuery() .eq(RecoveryServe::getId, datum.getRotateServeId()).one(); if (null != recoveryServe) { Integer classifyId = recoveryServe.getClassifyId(); RecoveryClassify classify = recoveryClassifyService.lambdaQuery() .eq(RecoveryClassify::getId, classifyId).one(); if (null != classify) { String supClassify = classify.getSupClassify(); if (Constants.RECOVERY.equals(supClassify)) { datum.setType(Constants.ONE); } else { datum.setType(Constants.ZERO); } } } } return R.ok(data); } /** * 用户端-通知公告轮换条 */ @ApiOperation(value = "通知公告", tags = {"用户端-首页"}) @GetMapping(value = "/notice") public R> notice() { return R.ok(adminClient.noticesList().getData()); } /** * 用户端-通知公告详情 */ @ApiOperation(value = "通知公告详情", tags = {"用户端-首页"}) @GetMapping(value = "/noticeDetail") public R notice(@RequestParam Integer id) { return R.ok(adminClient.noticesDetail(id).getData()); } /** * 用户端-服务优势 */ @ApiOperation(value = "服务优势", tags = {"用户端-首页"}) @GetMapping(value = "/advantage") public R> advantage() { return R.ok(adminClient.advantageList().getData()); } /** * 用户端-常见问题 */ @ApiOperation(value = "常见问题", tags = {"用户端-首页"}) @GetMapping(value = "/problem") public R> problem() { return R.ok(adminClient.problemList().getData()); } /** * 用户端首页回收分类推荐 */ @GetMapping(value = "/recommend") @ApiOperation(value = "首页回收分类推荐", tags = {"用户端-首页"}) public R> recommend() { return R.ok(recoveryClassifyService.lambdaQuery().eq(RecoveryClassify::getIsRecommend, Constants.ONE) .eq(RecoveryClassify::getIsDelete, 0).orderByDesc(RecoveryClassify::getSort) .orderByDesc(RecoveryClassify::getCreateTime).list()); } /** * 用户端-首页回收分类推荐 */ @ApiOperation(value = "回收服务搜索", tags = {"用户端-首页"}) @GetMapping(value = "/recoverySearch") @ApiImplicitParams({ @ApiImplicitParam(value = "搜索关键字", name = "keyword", dataType = "String", required = true) }) public R> recoverySearch(@RequestParam String keyword) { LambdaQueryChainWrapper wrapper = recoveryServeService.lambdaQuery() .eq(RecoveryServe::getIsDelete, 0) .orderByDesc(RecoveryServe::getSort); wrapper = null != keyword && !"".equals(keyword.trim()) ? wrapper.like(RecoveryServe::getServeName, keyword) : wrapper; List serveList = wrapper.orderByDesc(RecoveryServe::getCreateTime).list(); for (RecoveryServe recoveryServe : serveList) { RecoveryClassify classify = recoveryClassifyService.lambdaQuery() .eq(RecoveryClassify::getId, recoveryServe.getClassifyId()).one(); if (null != classify) { if (Constants.RECOVERY.equals(classify.getSupClassify())) { recoveryServe.setType(Constants.ONE); } else { recoveryServe.setType(Constants.ZERO); } } } return R.ok(serveList); } @PostMapping(value = "/getUser") public R updateWithdrawalState(@RequestParam("userId") Integer userId) { User byId = userService.getById(userId); UserDto userDto = new UserDto(); BeanUtils.copyProperties(byId,userDto); return R.ok(userDto); } // @ApiOperation(value = "订单列表-更改订单提现状态", tags = {"后台-订单管理"}) @PostMapping(value = "/getCityCode") public R getCityCode(@RequestParam("addressId") Integer addressId) { UserRecipient byId = userRecipientService.getById(addressId); AddressDto userDto = new AddressDto(); userDto.setCityCode(byId.getCityCode()); userDto.setCity(byId.getCity()); userDto.setName(byId.getName()); userDto.setDetail(byId.getAddressDetail()); return R.ok(userDto); } @Resource private RecoveryServePriceService recoveryServePriceService; @PostMapping(value = "/getServePrice") public R getServePrice(@RequestParam("serveId") Integer serveId, @RequestParam("cityCode") String cityCode) { RecoveryServePrice one = recoveryServePriceService.lambdaQuery().eq(RecoveryServePrice::getRecoveryServeId, serveId).eq(RecoveryServePrice::getCity, cityCode).eq(RecoveryServePrice::getIsDelete, 0).one(); if (one==null){ return R.ok(null); } return R.ok(one.getRecoveryPrice()); } /** * 用户端-个人中心用户信息 */ @ApiOperation(value = "个人中心用户信息", tags = {"用户端-个人中心"}) @GetMapping(value = "/userInfo") public R userInfo() { LoginUserInfo loginUser = tokenService.getLoginUserByUser(); if (null == loginUser) { return R.loginExpire("登录失效!"); } return R.ok(userService.lambdaQuery().eq(User::getId, loginUser.getUserid()) .eq(User::getIsDelete, 0).one()); } /** * 用户端-修改头像&昵称 */ @ApiOperation(value = "修改头像&昵称", tags = {"用户端-个人中心"}) @GetMapping(value = "/updateInfo") public R updateInfo(@RequestParam String picture, @RequestParam String nickname) { LoginUserInfo loginUser = tokenService.getLoginUserByUser(); if (null == loginUser) { return R.loginExpire("登录失效!"); } return R.ok(userService.lambdaUpdate().eq(User::getId, loginUser.getUserid()) .set(User::getProfilePicture, picture) .set(User::getNickname, nickname).update()); } /** * 用户端-修改用户定位城市 */ @ApiOperation(value = "修改用户定位城市", tags = {"用户端-个人中心"}) @GetMapping(value = "/updateCity") public R updateCity(@RequestParam String city, @RequestParam String cityCode) { LoginUserInfo loginUser = tokenService.getLoginUserByUser(); if (null == loginUser) { return R.loginExpire("登录失效!"); } return R.ok(userService.lambdaUpdate().eq(User::getId, loginUser.getUserid()) .set(User::getCity, city) .set(User::getCityCode, cityCode).update()); } }