From 26f965ff03bcbba07de8a12c4a98502feb5abae8 Mon Sep 17 00:00:00 2001 From: damonyuan <404054358@qq.com> Date: Sat, 19 Oct 2024 22:44:50 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E5=A2=9E=E5=8A=A0=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=20feat=20=E5=A2=9E=E5=8A=A0=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=A0=81=20feat=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=B6=E8=97=8F=E6=96=87=E7=AB=A0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mdd/common/enums/LoginEnum.java | 43 +++++++++++++++ .../mdd/common/plugin/notice/NoticeCheck.java | 49 +++++++++++------ .../front/controller/ArticleController.java | 8 +-- .../mdd/front/controller/LoginController.java | 29 +++++----- .../mdd/front/controller/UserController.java | 8 ++- .../com/mdd/front/service/ILoginService.java | 5 +- .../service/impl/ArticleServiceImpl.java | 22 ++++---- .../front/service/impl/LoginServiceImpl.java | 51 ++++++++++++------ .../front/service/impl/UserServiceImpl.java | 6 +-- .../article/ArticleCollectValidate.java | 2 +- .../validate/login/LoginPwdValidate.java | 13 +++-- .../validate/users/UserChangePwdValidate.java | 5 ++ .../front/vo/article/ArticleCollectVo.java | 25 +++++++-- .../a36269a7-2380-4e61-95e5-fc24573f36e9.png | Bin 0 -> 8320 bytes 14 files changed, 190 insertions(+), 76 deletions(-) create mode 100644 server/like-common/src/main/java/com/mdd/common/enums/LoginEnum.java create mode 100644 uploads/image/20241018/a36269a7-2380-4e61-95e5-fc24573f36e9.png diff --git a/server/like-common/src/main/java/com/mdd/common/enums/LoginEnum.java b/server/like-common/src/main/java/com/mdd/common/enums/LoginEnum.java new file mode 100644 index 00000000..cb3d09fb --- /dev/null +++ b/server/like-common/src/main/java/com/mdd/common/enums/LoginEnum.java @@ -0,0 +1,43 @@ +package com.mdd.common.enums; + +/** + * 相册枚举 + */ +public enum LoginEnum { + + ACCOUNT_PASSWORD(1, "账号/手机号密码登录"), + MOBILE_CAPTCHA(2, "手机验证码登录"), + + THIRD_LOGIN(3, "第三方登录"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + LoginEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + +} diff --git a/server/like-common/src/main/java/com/mdd/common/plugin/notice/NoticeCheck.java b/server/like-common/src/main/java/com/mdd/common/plugin/notice/NoticeCheck.java index b9a68eb8..89fe6c66 100644 --- a/server/like-common/src/main/java/com/mdd/common/plugin/notice/NoticeCheck.java +++ b/server/like-common/src/main/java/com/mdd/common/plugin/notice/NoticeCheck.java @@ -3,7 +3,12 @@ package com.mdd.common.plugin.notice; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mdd.common.entity.notice.NoticeRecord; import com.mdd.common.entity.server.Sys; +import com.mdd.common.entity.smsLog.SmsLog; +import com.mdd.common.enums.NoticeEnum; +import com.mdd.common.enums.SmsEnum; +import com.mdd.common.enums.YesNoEnum; import com.mdd.common.mapper.notice.NoticeRecordMapper; +import com.mdd.common.mapper.smsLog.SmsLogMapper; import com.mdd.common.util.SpringUtils; import com.mdd.common.util.StringUtils; @@ -14,28 +19,40 @@ import javax.annotation.Resource; */ public class NoticeCheck { - public static Boolean verify(Integer scene, Object code) { - NoticeRecordMapper noticeRecordMapper = SpringUtils.getBean(NoticeRecordMapper.class); + public static Boolean verify(Integer sceneId, String code, String mobile) { - NoticeRecord noticeRecord = noticeRecordMapper.selectOne(new QueryWrapper() - .eq("scene", scene) - .eq("status", 1) - .eq("is_read", 0) - .eq("is_captcha", 1) - .eq("is_delete", 0) - .eq("code", code.toString().toLowerCase()) - .last("limit 1")); + SmsLogMapper smsLogMapper = SpringUtils.getBean(SmsLogMapper.class); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("mobile", mobile); + queryWrapper.eq("send_status", SmsEnum.SEND_SUCCESS.getCode()); + queryWrapper.in("scene_id", NoticeEnum.getSmsScene()); + queryWrapper.eq("is_verify", YesNoEnum.NO.getCode()); + if (sceneId.equals(0) == false) { + queryWrapper.eq("scene_id", sceneId); + } + queryWrapper.orderByDesc("send_time"); + queryWrapper.last("limit 1"); + SmsLog smsLog = smsLogMapper.selectOne(queryWrapper); - if (StringUtils.isNull(noticeRecord)) { + if (StringUtils.isNull(smsLog)) { return false; } - boolean result = noticeRecord.getCreateTime() > ((System.currentTimeMillis() / 1000) - (5 * 60)); //5分钟有效 + // 没有验证码 或 最新验证码已校验 或 已过期(有效期:5分钟) + if (smsLog.getIsVerify().equals(1) || smsLog.getSendTime() < System.currentTimeMillis() / 1000 - (5*60)) { + return false; + } - noticeRecord.setRead(1); - noticeRecord.setUpdateTime(System.currentTimeMillis() / 1000); - noticeRecordMapper.updateById(noticeRecord); - return result; + // 更新校验状态 + smsLog.setCheckNum(smsLog.getCheckNum() + 1); + if (smsLog.getCode().equals(code)) { + smsLog.setIsVerify(YesNoEnum.YES.getCode()); + smsLogMapper.updateById(smsLog); + return true; + } else { + smsLogMapper.updateById(smsLog); + return false; + } } } diff --git a/server/like-front/src/main/java/com/mdd/front/controller/ArticleController.java b/server/like-front/src/main/java/com/mdd/front/controller/ArticleController.java index 15ce75d4..bbe3c0c4 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/ArticleController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/ArticleController.java @@ -58,7 +58,7 @@ public class ArticleController { return AjaxResult.success(vo); } - @GetMapping("/collectList") + @GetMapping("/collect") @ApiOperation(value="收藏列表") public AjaxResult> collect(@Validated PageValidate pageValidate) { Integer userId = LikeFrontThreadLocal.getUserId(); @@ -70,17 +70,17 @@ public class ArticleController { @PostMapping("/addCollect") @ApiOperation(value="收藏加入") public AjaxResult addCollect(@Validated @RequestBody ArticleCollectValidate collectValidate) { - Integer articleId = collectValidate.getArticleId(); + Integer articleId = collectValidate.getId(); Integer userId = LikeFrontThreadLocal.getUserId(); iArticleService.addCollect(articleId, userId); return AjaxResult.success(); } - @PostMapping("/collectCancel") + @PostMapping("/cancelCollect") @ApiOperation(value="收藏取消") public AjaxResult cancelCollect(@Validated @RequestBody ArticleCollectValidate collectValidate) { - Integer articleId = collectValidate.getArticleId(); + Integer articleId = collectValidate.getId(); Integer userId = LikeFrontThreadLocal.getUserId(); iArticleService.cancelCollect(articleId, userId); diff --git a/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java b/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java index 06c6d92d..1be98d48 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java @@ -44,25 +44,22 @@ public class LoginController { @PostMapping("/account") @ApiOperation(value="账号登录") public AjaxResult account(@Validated @RequestBody LoginPwdValidate loginPwdValidate) { - Integer terminal = LikeFrontThreadLocal.getTerminal(); - String account = loginPwdValidate.getAccount(); - String password = loginPwdValidate.getPassword(); - - LoginTokenVo vo = iLoginService.accountLogin(account, password, terminal); + loginPwdValidate.setTerminal(LikeFrontThreadLocal.getTerminal()); + LoginTokenVo vo = iLoginService.accountLogin(loginPwdValidate); return AjaxResult.success(vo); } - @NotLogin - @PostMapping("/mobileLogin") - @ApiOperation(value="手机登录") - public AjaxResult mobileLogin(@Validated @RequestBody LoginPhoneValidate loginPhoneValidate) { - Integer terminal = LikeFrontThreadLocal.getTerminal(); - String mobile = loginPhoneValidate.getMobile(); - String code = loginPhoneValidate.getCode(); - - LoginTokenVo vo = iLoginService.mobileLogin(mobile, code, terminal); - return AjaxResult.success(vo); - } +// @NotLogin +// @PostMapping("/mobileLogin") +// @ApiOperation(value="手机登录") +// public AjaxResult mobileLogin(@Validated @RequestBody LoginPhoneValidate loginPhoneValidate) { +// Integer terminal = LikeFrontThreadLocal.getTerminal(); +// String mobile = loginPhoneValidate.getMobile(); +// String code = loginPhoneValidate.getCode(); +// +// LoginTokenVo vo = iLoginService.mobileLogin(mobile, code, terminal); +// return AjaxResult.success(vo); +// } @NotLogin @PostMapping("/mnpLogin") diff --git a/server/like-front/src/main/java/com/mdd/front/controller/UserController.java b/server/like-front/src/main/java/com/mdd/front/controller/UserController.java index 0ba85917..8836ab0e 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/UserController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/UserController.java @@ -2,6 +2,7 @@ package com.mdd.front.controller; import com.mdd.common.aop.NotLogin; import com.mdd.common.core.AjaxResult; +import com.mdd.common.exception.OperateException; import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.service.IUserService; import com.mdd.front.validate.users.*; @@ -50,11 +51,14 @@ public class UserController { return AjaxResult.success(); } - @PostMapping("/changePwd") + @PostMapping("/changePassword") @ApiOperation(value="修改密码") - public AjaxResult changePwd(@Validated @RequestBody UserChangePwdValidate passwordValidate) { + public AjaxResult changePassword(@Validated @RequestBody UserChangePwdValidate passwordValidate) { Integer userId = LikeFrontThreadLocal.getUserId(); + if (passwordValidate.getPassword().equals(passwordValidate.getPasswordConfirm()) == false) { + throw new OperateException("两次输入的密码不一致"); + } iUserService.changePwd(passwordValidate.getPassword(), passwordValidate.getOldPassword(), userId); return AjaxResult.success(); } diff --git a/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java b/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java index 793d4e82..a4aafd9f 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java +++ b/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java @@ -1,5 +1,6 @@ package com.mdd.front.service; +import com.mdd.front.validate.login.LoginPwdValidate; import com.mdd.front.vo.login.LoginTokenVo; import javax.servlet.http.HttpSession; @@ -28,7 +29,7 @@ public interface ILoginService { * @param terminal 终端 * @return LoginTokenVo */ - LoginTokenVo accountLogin(String account, String password, Integer terminal); + LoginTokenVo accountLogin(LoginPwdValidate loginPwdValidate); /** * 手机登录 @@ -39,7 +40,7 @@ public interface ILoginService { * @param terminal 终端 * @return LoginTokenVo */ - LoginTokenVo mobileLogin(String mobile, String code, Integer terminal); + LoginTokenVo mobileLogin(String mobile, String code, Integer terminal, Integer sceneId); /** * 微信登录 diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/ArticleServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/ArticleServiceImpl.java index f7cc3f17..23589409 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/ArticleServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/ArticleServiceImpl.java @@ -201,24 +201,26 @@ public class ArticleServiceImpl implements IArticleService { Integer pageNo = pageValidate.getPage_no(); Integer pageSize = pageValidate.getPage_size(); - MPJQueryWrapper mpjQueryWrapper = new MPJQueryWrapper<>(); - mpjQueryWrapper.select("t.id,t.article_id,a.title,a.image,a.intro,a.visit,a.create_time") - .eq("t.user_id", userId) - .isNull("t.delete_time") + MPJQueryWrapper
mpjQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.setAlias("a").select("c.id,c.article_id,a.title,a.image,a.desc,a.is_show,a.click_virtual, a.click_actual,a.create_time, c.create_time as collect_time") + .eq("c.user_id", userId) + .isNull("c.delete_time") .isNull("a.delete_time") - .orderByDesc("t.id") - .innerJoin("?_article a ON a.id=t.article_id".replace("?_", GlobalConfig.tablePrefix)); + .eq("c.status", YesNoEnum.YES.getCode()) + .eq("a.is_show", YesNoEnum.YES.getCode()) + .orderByDesc("c.id") + .innerJoin("?_article_collect c ON c.article_id=a.id".replace("?_", GlobalConfig.tablePrefix)); - IPage iPage = articleCollectMapper.selectJoinPage( + IPage iPage = articleMapper.selectJoinPage( new Page<>(pageNo, pageSize), ArticleCollectVo.class, mpjQueryWrapper); for (ArticleCollectVo vo : iPage.getRecords()) { vo.setImage(UrlUtils.toAbsoluteUrl(vo.getImage())); - vo.setCreateTime(TimeUtils.timestampToDate(vo.getCreateTime())); + vo.setCreateTime(TimeUtils.timestampToDate(Long.valueOf(vo.getCreateTime().toString()))); + vo.setCollectTime(TimeUtils.timestampToDate(Long.valueOf(vo.getCollectTime().toString()))); } - return PageResult.iPageHandle(iPage); } @@ -240,7 +242,7 @@ public class ArticleServiceImpl implements IArticleService { if (StringUtils.isNotNull(articleCollect)) { articleCollect.setUpdateTime(System.currentTimeMillis() / 1000); - articleCollect.setStatus(YesNoEnum.NO.getCode()); + articleCollect.setStatus(YesNoEnum.YES.getCode()); articleCollectMapper.updateById(articleCollect); } else { ArticleCollect model = new ArticleCollect(); diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java index f08b7dcf..35fa9819 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java @@ -3,10 +3,12 @@ package com.mdd.front.service.impl; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.dev33.satoken.stp.StpUtil; +import com.alibaba.fastjson2.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Assert; import com.mdd.common.entity.user.User; import com.mdd.common.entity.user.UserAuth; +import com.mdd.common.enums.LoginEnum; import com.mdd.common.enums.NoticeEnum; import com.mdd.common.exception.OperateException; import com.mdd.common.mapper.user.UserAuthMapper; @@ -17,6 +19,7 @@ import com.mdd.common.util.*; import com.mdd.front.cache.ScanLoginCache; import com.mdd.front.cache.TokenLoginCache; import com.mdd.front.service.ILoginService; +import com.mdd.front.validate.login.LoginPwdValidate; import com.mdd.front.vo.login.LoginTokenVo; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; @@ -91,18 +94,36 @@ public class LoginServiceImpl implements ILoginService { * @return LoginTokenVo */ @Override - public LoginTokenVo accountLogin(String account, String password, Integer terminal) { - User user = userMapper.selectOne(new QueryWrapper() - .eq("account", account) - .isNull("delete_time") - .last("limit 1")); + public LoginTokenVo accountLogin(LoginPwdValidate loginPwdValidate) { + JSONArray config = JSONArray.parseArray(ConfigUtils.get("login", "login_way", "[]")); + if (config.contains(loginPwdValidate.getScene().toString()) == false) { + throw new OperateException("不支持的登录方式"); + } - Assert.notNull(user, "账号不存在!"); - String pwd = ToolUtils.makePassword(password); - Assert.isFalse(!pwd.equals(user.getPassword()), "账号或密码错误!"); - Assert.isFalse(!user.getIsDisable().equals(0), "账号已被禁用!"); + String account = loginPwdValidate.getAccount(); + String password = loginPwdValidate.getPassword(); + Integer terminal = loginPwdValidate.getTerminal(); + String code = loginPwdValidate.getCode(); + Integer sceneId = loginPwdValidate.getScene(); + // 账号密码登录 + if (loginPwdValidate.getScene().equals(LoginEnum.ACCOUNT_PASSWORD.getCode())) { + User user = userMapper.selectOne(new QueryWrapper() + .nested(wq->wq + .like("account", account).or() + .like("mobile", account).or() + ) + .isNull("delete_time") + .last("limit 1")); - return this.__loginToken(user.getId(), user.getMobile(), user.getIsNewUser(), terminal); + Assert.notNull(user, "账号不存在!"); + String pwd = ToolUtils.makePassword(password); + Assert.isFalse(!pwd.equals(user.getPassword()), "账号或密码错误!"); + Assert.isFalse(!user.getIsDisable().equals(0), "账号已被禁用!"); + + return this.__loginToken(user.getId(), user.getMobile(), user.getIsNewUser(), terminal); + } else { + return mobileLogin(account, code, terminal, sceneId); + } } /** @@ -114,18 +135,18 @@ public class LoginServiceImpl implements ILoginService { * @return LoginTokenVo */ @Override - public LoginTokenVo mobileLogin(String mobile, String code, Integer terminal) { + public LoginTokenVo mobileLogin(String mobile, String code, Integer terminal, Integer sceneId) { // 校验验证码 int sceneCode = NoticeEnum.LOGIN_CAPTCHA.getCode(); - if (!NoticeCheck.verify(sceneCode, code)) { + if (!NoticeCheck.verify(sceneCode, code, mobile)) { throw new OperateException("验证码错误!"); } // 查询手机号 User user = userMapper.selectOne(new QueryWrapper() - .select("id,username,mobile,is_disable,is_new") + .select("id,account,mobile,is_disable,is_new_user") .eq("mobile", mobile) - .eq("is_delete", 0) + .isNull("delete_time") .last("limit 1")); Assert.notNull(user, "账号不存在!"); @@ -328,7 +349,7 @@ public class LoginServiceImpl implements ILoginService { User user = null; if (StringUtils.isNotNull(userAuth)) { user = userMapper.selectOne(new QueryWrapper() - .eq("is_delete", 0) + .isNull("delete_time") .eq("id", userAuth.getUserId()) .last("limit 1")); } diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java index 830f7cb6..8ab9fc61 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java @@ -192,7 +192,7 @@ public class UserServiceImpl implements IUserService { @Override public void changePwd(String password, String oldPassword, Integer userId) { User user = userMapper.selectOne(new QueryWrapper() - .select("id,password,salt") + .select("id,password") .eq("id", userId) .isNull("delete_time") .last("limit 1")); @@ -228,7 +228,7 @@ public class UserServiceImpl implements IUserService { public void forgotPwd(String password, String mobile, String code) { // 校验验证码 int sceneCode = NoticeEnum.FIND_LOGIN_PASSWORD_CAPTCHA.getCode(); - if (!NoticeCheck.verify(sceneCode, code)) { + if (!NoticeCheck.verify(sceneCode, code, mobile)) { throw new OperateException("验证码错误!"); } @@ -266,7 +266,7 @@ public class UserServiceImpl implements IUserService { // 校验验证码 int sceneCode = type.equals("bind") ? NoticeEnum.BIND_MOBILE_CAPTCHA.getCode() : NoticeEnum.CHANGE_MOBILE_CAPTCHA.getCode() ; - if (!NoticeCheck.verify(sceneCode, code)) { + if (!NoticeCheck.verify(sceneCode, code, mobile)) { throw new OperateException("验证码错误!"); } diff --git a/server/like-front/src/main/java/com/mdd/front/validate/article/ArticleCollectValidate.java b/server/like-front/src/main/java/com/mdd/front/validate/article/ArticleCollectValidate.java index d2201308..ddaca7e8 100644 --- a/server/like-front/src/main/java/com/mdd/front/validate/article/ArticleCollectValidate.java +++ b/server/like-front/src/main/java/com/mdd/front/validate/article/ArticleCollectValidate.java @@ -17,6 +17,6 @@ public class ArticleCollectValidate implements Serializable { @NotNull(message = "articleId参数缺失") @IDMust(message = "articleId参数必须大于0") @ApiModelProperty(value = "文章ID", required = true) - private Integer articleId; + private Integer id; } diff --git a/server/like-front/src/main/java/com/mdd/front/validate/login/LoginPwdValidate.java b/server/like-front/src/main/java/com/mdd/front/validate/login/LoginPwdValidate.java index 61e95fca..b3c43933 100644 --- a/server/like-front/src/main/java/com/mdd/front/validate/login/LoginPwdValidate.java +++ b/server/like-front/src/main/java/com/mdd/front/validate/login/LoginPwdValidate.java @@ -16,9 +16,16 @@ public class LoginPwdValidate { @ApiModelProperty(value = "登录账号", required = true) private String account; - @NotNull(message = "password参数缺失") - @NotEmpty(message = "密码不能为空") - @ApiModelProperty(value = "登录密码", required = true) + @ApiModelProperty(value = "登录密码") private String password; + @ApiModelProperty(value = "验证码登录") + private String code; + + @ApiModelProperty(value = "终端") + private Integer scene; + + + @ApiModelProperty(value = "终端") + private Integer terminal; } diff --git a/server/like-front/src/main/java/com/mdd/front/validate/users/UserChangePwdValidate.java b/server/like-front/src/main/java/com/mdd/front/validate/users/UserChangePwdValidate.java index 0fc8720a..e23513cc 100644 --- a/server/like-front/src/main/java/com/mdd/front/validate/users/UserChangePwdValidate.java +++ b/server/like-front/src/main/java/com/mdd/front/validate/users/UserChangePwdValidate.java @@ -19,6 +19,11 @@ public class UserChangePwdValidate implements Serializable { @ApiModelProperty(value = "新密码", required = true) private String password; + @NotNull(message = "请确认密码") + @Pattern(message = "确认密码密码必须是6-20字母+数字组合!", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$") + @ApiModelProperty(value = "确认密码", required = true) + private String passwordConfirm; + @NotNull(message = "oldPassword参数缺失") @NotNull(message = "旧密码不能为空") @ApiModelProperty(value = "旧密码", required = true) diff --git a/server/like-front/src/main/java/com/mdd/front/vo/article/ArticleCollectVo.java b/server/like-front/src/main/java/com/mdd/front/vo/article/ArticleCollectVo.java index b47443b8..44ed77bf 100644 --- a/server/like-front/src/main/java/com/mdd/front/vo/article/ArticleCollectVo.java +++ b/server/like-front/src/main/java/com/mdd/front/vo/article/ArticleCollectVo.java @@ -1,5 +1,6 @@ package com.mdd.front.vo.article; +import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -25,12 +26,28 @@ public class ArticleCollectVo implements Serializable { private String image; @ApiModelProperty(value = "文章简介") - private String intro; + private String desc; - @ApiModelProperty(value = "浏览数量") - private Integer visit; + @ApiModelProperty(value = "是否显示:1-是.0-否") + private Integer isShow; + + @ApiModelProperty(value = "虚拟浏览量") + private Integer clickVirtual; + + @ApiModelProperty(value = "实际浏览量") + private Integer clickActual; @ApiModelProperty(value = "创建时间") - private String createTime; + private Object createTime; + @ApiModelProperty(value = "收集时间") + private Object collectTime; + +// @ApiModelProperty(value = "创建时间") +// @JsonProperty("create_time") +// private String createTimeStr; +// +// @ApiModelProperty(value = "收集时间") +// @JsonProperty("collect_time") +// private String collectTimeStr; } diff --git a/uploads/image/20241018/a36269a7-2380-4e61-95e5-fc24573f36e9.png b/uploads/image/20241018/a36269a7-2380-4e61-95e5-fc24573f36e9.png new file mode 100644 index 0000000000000000000000000000000000000000..d8fc350a6939dfd3fb97f63c20eb2845766c8fec GIT binary patch literal 8320 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