diff --git a/server/like-common/src/main/java/com/mdd/common/enums/ErrorEnum.java b/server/like-common/src/main/java/com/mdd/common/enums/ErrorEnum.java index 97e0ca13..2ed61720 100644 --- a/server/like-common/src/main/java/com/mdd/common/enums/ErrorEnum.java +++ b/server/like-common/src/main/java/com/mdd/common/enums/ErrorEnum.java @@ -15,7 +15,7 @@ public enum ErrorEnum { LOGIN_ACCOUNT_ERROR(0, "登录账号或密码错误"), LOGIN_DISABLE_ERROR(0, "登录账号已被禁用了"), TOKEN_EMPTY(0, "登录超时,请重新登录"), - TOKEN_INVALID(0, "token参数无效"), + TOKEN_INVALID(-1, "token参数无效"), CAPTCHA_ERROR(0, "验证码错误"), PAYMENT_ERROR(0, "发起支付失败"), 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 8836ab0e..1f8bba24 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 @@ -63,6 +63,16 @@ public class UserController { return AjaxResult.success(); } + @NotLogin + @PostMapping("/resetPassword") + @ApiOperation(value="重置密码") + public AjaxResult resetPassword(@Validated @RequestBody ResetPasswordValidate passwordValidate) { + iUserService.resetPassword(passwordValidate); + return AjaxResult.success(); + } + + + @NotLogin @PostMapping("/forgotPwd") @ApiOperation(value="忘记密码") diff --git a/server/like-front/src/main/java/com/mdd/front/service/IDecorateTabbarService.java b/server/like-front/src/main/java/com/mdd/front/service/IDecorateTabbarService.java new file mode 100644 index 00000000..60933e02 --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/service/IDecorateTabbarService.java @@ -0,0 +1,20 @@ +package com.mdd.front.service; + +import com.mdd.common.entity.decorate.DecorateTabbar; +import com.mdd.front.vo.decorateTabbar.DecorateTabbarVo; + +import java.util.List; + +/** + * 底部导航服务接口类 + */ +public interface IDecorateTabbarService { + + /** + * @notes 获取底部导航列表 + * @return array + * @author damonyuan + */ + List getTabbarLists(); + +} diff --git a/server/like-front/src/main/java/com/mdd/front/service/IUserService.java b/server/like-front/src/main/java/com/mdd/front/service/IUserService.java index 6ddbaf0e..7c641717 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/IUserService.java +++ b/server/like-front/src/main/java/com/mdd/front/service/IUserService.java @@ -97,4 +97,12 @@ public interface IUserService { * @param userId 用户ID */ void bindOa(UserBindWechatValidate bindOaValidate, Integer userId); + + /** + * @notes 重置登录密码 + * @param $params + * @return bool + * @author damonyuan + */ + void resetPassword(ResetPasswordValidate passwordValidate); } 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 23589409..4820d8d8 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 @@ -161,7 +161,6 @@ public class ArticleServiceImpl implements IArticleService { @Override public ArticleDetailVo detail(Integer id, Integer userId) { Article article = articleMapper.selectOne(new QueryWrapper
() - .select("id,title,image,intro,summary,visit,author,content,create_time") .eq("id", id) .eq("is_show", 1) .isNull("delete_time" ) @@ -181,6 +180,8 @@ public class ArticleServiceImpl implements IArticleService { vo.setCollect(articleCollect != null); vo.setImage(UrlUtils.toAbsoluteUrl(article.getImage())); vo.setCreateTime(TimeUtils.timestampToDate(article.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(article.getUpdateTime())); + vo.setClick(article.getClickActual() + article.getClickVirtual()); article.setClickActual(article.getClickActual() + 1); articleMapper.updateById(article); diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/DecorateTabbarServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/DecorateTabbarServiceImpl.java new file mode 100644 index 00000000..f3a2361e --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/DecorateTabbarServiceImpl.java @@ -0,0 +1,58 @@ +package com.mdd.front.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mdd.common.entity.decorate.DecorateTabbar; +import com.mdd.common.enums.YesNoEnum; +import com.mdd.common.mapper.decorate.DecorateTabbarMapper; +import com.mdd.common.util.*; +import com.mdd.front.service.IDecorateTabbarService; +import com.mdd.front.vo.decorateTabbar.DecorateTabbarVo; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 底部导航服务实现类 + */ +@Service +public class DecorateTabbarServiceImpl implements IDecorateTabbarService { + + @Resource + DecorateTabbarMapper decorateTabbarMapper; + + + @Override + public List getTabbarLists() { + List list = decorateTabbarMapper.selectList(new QueryWrapper().eq("is_show", YesNoEnum.YES.getCode())); + List ret = new ArrayList(); + if (list.size() == 0) { + return ret; + } + + for (DecorateTabbar item : list) { + DecorateTabbarVo vo = new DecorateTabbarVo(); + BeanUtils.copyProperties(item, vo); + if (StringUtils.isNotEmpty(item.getSelected())) { + vo.setSelected(UrlUtils.toAbsoluteUrl(item.getSelected())); + } + + if (StringUtils.isNotEmpty(item.getUnselected())) { + vo.setUnselected(UrlUtils.toAbsoluteUrl(item.getUnselected())); + } + + vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime())); + vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime())); + vo.setLink(StringUtils.isEmpty(item.getLink()) ? new JSONObject() : JSONObject.parse(item.getLink())); + ret.add(vo); + } + return ret; + } +} diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/IndexServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/IndexServiceImpl.java index 33f818c9..ae6cfee0 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/IndexServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/IndexServiceImpl.java @@ -1,5 +1,7 @@ package com.mdd.front.service.impl; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Assert; import com.mdd.common.config.GlobalConfig; @@ -12,7 +14,9 @@ import com.mdd.common.mapper.decorate.DecoratePageMapper; import com.mdd.common.mapper.decorate.DecorateTabbarMapper; import com.mdd.common.mapper.setting.HotSearchMapper; import com.mdd.common.util.*; +import com.mdd.front.service.IDecorateTabbarService; import com.mdd.front.service.IIndexService; +import com.mdd.front.vo.decorateTabbar.DecorateTabbarVo; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -24,6 +28,8 @@ import java.util.*; @Service public class IndexServiceImpl implements IIndexService { + @Resource + IDecorateTabbarService iDecorateTabbarService; @Resource DecoratePageMapper decoratePageMapper; @@ -61,17 +67,17 @@ public class IndexServiceImpl implements IIndexService { Map map = new LinkedHashMap<>(); map.put("id", article.getId()); map.put("title", article.getTitle()); - map.put("intro", article.getContent()); - map.put("summary", article.getAbstractField()); + map.put("desc", article.getDesc()); + map.put("abstract", article.getAbstractField()); map.put("image", UrlUtils.toAbsoluteUrl(article.getImage())); map.put("author", article.getAuthor()); map.put("click", article.getClickActual() + article.getClickVirtual()); - map.put("createTime", TimeUtils.timestampToDate(article.getCreateTime())); + map.put("create_time", TimeUtils.timestampToDate(article.getCreateTime())); articleList.add(map); } response.put("domain", UrlUtils.domain()); - response.put("pages", decoratePage.getData()); + response.put("page", decoratePage); response.put("article", articleList); return response; } @@ -95,7 +101,8 @@ public class IndexServiceImpl implements IIndexService { Map response = new LinkedHashMap<>(); response.put("type", decoratePage.getType()); response.put("name", decoratePage.getName()); - response.put("pages", decoratePage.getData()); + response.put("data", decoratePage.getData()); + response.put("meta", decoratePage.getMeta()); return response; } @@ -109,11 +116,17 @@ public class IndexServiceImpl implements IIndexService { public Map config() { Map response = new LinkedHashMap<>(); + // 底部导航 + List tabbar = iDecorateTabbarService.getTabbarLists(); + + // 导航颜色 + JSONObject style = JSONObject.parse(ConfigUtils.get("tabbar", "style")); + // 登录配置 - Map loginMap = new LinkedHashMap<>(); + JSONObject loginMap = new JSONObject(); Map loginConfig = ConfigUtils.get("login"); // 登录方式 - loginMap.put("login_way", ListUtils.stringToListAsInt(loginConfig.getOrDefault("login_way", ""), ",")); + loginMap.put("login_way", JSONArray.parseArray(loginConfig.getOrDefault("login_way", "[]"))); // 注册强制绑定手机 loginMap.put("coerce_mobile", Integer.parseInt(loginConfig.getOrDefault("coerce_mobile", "0"))); // 政策协议 @@ -125,17 +138,32 @@ public class IndexServiceImpl implements IIndexService { // qq授权登录 loginMap.put("qq_auth", Integer.parseInt(loginConfig.getOrDefault("qq_auth", "0"))); - + // 网站信息 + JSONObject website = new JSONObject(); + website.put("h5_favicon", UrlUtils.toAbsoluteUrl(ConfigUtils.get("website", "h5_favicon", ""))); + website.put("shop_name", ConfigUtils.get("website", "shop_name", "")); + website.put("shop_logo", UrlUtils.toAbsoluteUrl(ConfigUtils.get("website", "shop_logo", ""))); + + // 备案信息 Map websiteConfig = ConfigUtils.get("copyright"); String copyright = websiteConfig.getOrDefault("config", "[]"); List> copyrightMap = ListUtils.stringToListAsMapStr(copyright); - // 网址信息 + // H5配置 + JSONObject webPage = new JSONObject(); + webPage.put("status", Integer.valueOf(ConfigUtils.get("web_page", "status", "1"))); + webPage.put("page_status", Integer.valueOf(ConfigUtils.get("web_page", "page_status", "0"))); + webPage.put("page_url", ConfigUtils.get("web_page", "page_url", "")); + webPage.put("url", UrlUtils.domain() + "/mobile"); - response.put("admin_url", ""); - response.put("copyright", copyrightMap); response.put("domain", UrlUtils.domain()); + response.put("style", style); + response.put("tabbar", tabbar); response.put("login", loginMap); + response.put("website", website); + response.put("webPage", webPage); + response.put("version", GlobalConfig.version); + response.put("copyright", copyrightMap); return response; } diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/PcServiceImpI.java b/server/like-front/src/main/java/com/mdd/front/service/impl/PcServiceImpI.java index f32f418b..2f67b66e 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/PcServiceImpI.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/PcServiceImpI.java @@ -339,6 +339,9 @@ public class PcServiceImpI implements IPcService { vo.setNext(nextMap); } + article.setClickActual(article.getClickActual() + 1); + articleMapper.updateById(article); + return vo; } } 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 8ab9fc61..f7265221 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 @@ -28,6 +28,7 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import javax.annotation.Resource; @@ -383,6 +384,36 @@ public class UserServiceImpl implements IUserService { } } + @Override + @Transactional + public void resetPassword(ResetPasswordValidate passwordValidate) { + String code = passwordValidate.getCode(); + String mobile = passwordValidate.getMobile(); + String password = passwordValidate.getPassword(); + // 校验验证码 + int sceneCode = NoticeEnum.FIND_LOGIN_PASSWORD_CAPTCHA.getCode(); + if (!NoticeCheck.verify(sceneCode, code, mobile)) { + throw new OperateException("验证码错误!"); + } + + // 查询手机号 + User user = userMapper.selectOne(new QueryWrapper() + .select("id,account,mobile,is_disable") + .isNull("delete_time") + .eq("mobile", mobile) + .last("limit 1")); + + // 验证账号 + com.baomidou.mybatisplus.core.toolkit.Assert.notNull(user, "账号不存在!"); + + String pwd = ToolUtils.makePassword(password.trim()); + + // 更新密码 + user.setPassword(pwd); + user.setUpdateTime(System.currentTimeMillis() / 1000); + userMapper.updateById(user); + } + /** * 绑定微信授权 * diff --git a/server/like-front/src/main/java/com/mdd/front/validate/users/ResetPasswordValidate.java b/server/like-front/src/main/java/com/mdd/front/validate/users/ResetPasswordValidate.java new file mode 100644 index 00000000..3baf80ff --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/validate/users/ResetPasswordValidate.java @@ -0,0 +1,34 @@ +package com.mdd.front.validate.users; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +@Data +@ApiModel("修改密码参数") +public class ResetPasswordValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "password参数缺失") + @Pattern(message = "密码必须是6-20字母+数字组合!", regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$") + @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 = "验证码不能为空") + @ApiModelProperty(value = "code", required = true) + private String code; + + @NotNull(message = "手机号不能为空") + @ApiModelProperty(value = "mobile", required = true) + private String mobile; +} diff --git a/server/like-front/src/main/java/com/mdd/front/vo/article/ArticleDetailVo.java b/server/like-front/src/main/java/com/mdd/front/vo/article/ArticleDetailVo.java index c669f1ba..0ce2952b 100644 --- a/server/like-front/src/main/java/com/mdd/front/vo/article/ArticleDetailVo.java +++ b/server/like-front/src/main/java/com/mdd/front/vo/article/ArticleDetailVo.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; @@ -15,31 +16,32 @@ public class ArticleDetailVo implements Serializable { @ApiModelProperty(value = "文章ID") private Integer id; + @ApiModelProperty("摘要") + @JsonProperty(value = "abstract") + private String abstractField; + @ApiModelProperty(value = "文章作者") + private String author; + @ApiModelProperty(value = "分类ID") + private Integer cid; + @ApiModelProperty(value = "浏览数量") + private Integer click; @ApiModelProperty(value = "文章标题") private String title; - - @ApiModelProperty(value = "文章封面") - private String image; - - @ApiModelProperty(value = "文章简介") - private String intro; - - @ApiModelProperty(value = "文章描述") - private String summary; - - @ApiModelProperty(value = "浏览数量") - private Integer visit; - - @ApiModelProperty(value = "作者名称") - private String author; - @ApiModelProperty(value = "是否收藏") private Boolean collect; - @ApiModelProperty(value = "文章内容") private String content; - @ApiModelProperty(value = "创建时间") private String createTime; + @ApiModelProperty(value = "更新时间") + private String updateTime; + @ApiModelProperty("简介") + private String desc; + @ApiModelProperty(value = "文章封面") + private String image; + @ApiModelProperty("是否显示: [0=否, 1=是]") + private Integer isShow; + @ApiModelProperty(value = "排序编号") + private Integer sort; } diff --git a/server/like-front/src/main/java/com/mdd/front/vo/decorateTabbar/DecorateTabbarVo.java b/server/like-front/src/main/java/com/mdd/front/vo/decorateTabbar/DecorateTabbarVo.java new file mode 100644 index 00000000..6a4bdfa5 --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/vo/decorateTabbar/DecorateTabbarVo.java @@ -0,0 +1,45 @@ +package com.mdd.front.vo.decorateTabbar; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "底部导航服务Vo") +public class DecorateTabbarVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("导航名称") + private String name; + + @ApiModelProperty("未选图标") + private String selected; + + @ApiModelProperty("已选图标") + private String unselected; + + @ApiModelProperty("链接地址") + private JSONObject link; + + @ApiModelProperty("是否显示") + private Integer isShow; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("更新时间") + private String updateTime; + + +}