Forráskód Böngészése

add 帮助中心;手机号登录

add 帮助中心接口

fix applet展示分类错误

fix

fix 手机号登录验证

fix 保持正常登录

fix 增加问题详情接口

fix 问题分类置顶

fix 手机号登录

fix 排序不能相同

fix

fix 去掉账号

fix

fix

fix 新增用户权限校验

fix

fix

fix 下线

fix 手机号重复

fix 去掉置顶

fix 全局是否登录校验

fix
zoujiajian 3 éve
szülő
commit
2ab71fe92e

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/help/HelpQuestionClassificationMapper.java

@@ -0,0 +1,17 @@
+package com.cyksj.mapper.manage.help;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.model.entity.HelpQuestionClassification;
+import com.cyksj.model.views.HelpQuestionClassificationView;
+import org.apache.ibatis.annotations.Param;
+
+/*
+ *项目名: netflix
+ *文件名: HelpQuestionClassification
+ *创建者: JavaZou
+ *创建时间:2022/12/7 10:20
+ */
+public interface HelpQuestionClassificationMapper extends BaseMapper<HelpQuestionClassification> {
+	Page<HelpQuestionClassificationView> getQuestionClassificationView(@Param("goodsId") Long goodsId, @Param("page") Page<HelpQuestionClassificationView> page);
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/help/HelpQuestionMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.help;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.HelpQuestion;
+
+/*
+ *项目名: netflix
+ *文件名: HelpQuestion
+ *创建者: JavaZou
+ *创建时间:2022/12/7 10:21
+ */
+public interface HelpQuestionMapper extends BaseMapper<HelpQuestion> {
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/HelpQuestion.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: HelpQuestion
+ *创建者: JavaZou
+ *创建时间:2022/12/7 10:12
+ */
+@Getter
+@Setter
+public class HelpQuestion extends BaseEntity{
+	private Long classificationId;
+
+	private String name;
+
+	private String content;
+
+	private Integer sort;
+
+	private Boolean status;
+
+	private Boolean deleted;
+}

+ 28 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/HelpQuestionClassification.java

@@ -0,0 +1,28 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: HelpQuestionClassification
+ *创建者: JavaZou
+ *创建时间:2022/12/7 10:11
+ */
+@Getter
+@Setter
+public class HelpQuestionClassification extends BaseEntity{
+	private Long goodsId;
+
+	private String name;
+
+	private String logo;
+
+	private Integer sort;
+
+	private String content;
+
+	private Boolean status;
+
+	private Boolean deleted;
+}

+ 1 - 6
netflix-dao/src/main/java/com/cyksj/model/manage/entity/Admin.java

@@ -17,12 +17,6 @@ import java.io.Serializable;
 @Accessors(chain = true)
 public class Admin extends BaseEntity implements Serializable {
 
-    /**
-     * 管理员帐户
-     */
-    @NotBlank(message = "请填写账号")
-    private String userName;
-
     /**
      * 管理员昵称
      */
@@ -37,6 +31,7 @@ public class Admin extends BaseEntity implements Serializable {
     /**
      * 手机号码
      */
+    @NotBlank(message = "手机号不能为空")
     private String phone;
 
     /**

+ 32 - 0
netflix-dao/src/main/java/com/cyksj/model/views/HelpQuestionClassificationView.java

@@ -0,0 +1,32 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.HelpQuestion;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: HelpQuestionClassificationView
+ *创建者: JavaZou
+ *创建时间:2022/12/7 11:06
+ */
+@Getter
+@Setter
+public class HelpQuestionClassificationView {
+
+	private Long id;
+
+	private String name;
+
+	private Long goodsId;
+
+	private String logo;
+
+	private String content;
+
+	private Integer sort;
+
+	private List<HelpQuestion> questions;
+}

+ 22 - 0
netflix-dao/src/main/resources/mapper/HelpQuestionClassificationMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.cyksj.mapper.manage.help.HelpQuestionClassificationMapper">
+
+    <select id="getQuestionClassificationView"
+            resultType="com.cyksj.model.views.HelpQuestionClassificationView">
+        select hc.id,
+               hc.name,
+               hc.goods_id,
+               hc.sort,
+               hc.content,
+        if(gd.id is null, hc.logo,gd.logo) as logo
+        from `help_question_classification` hc left join `goods_don` gd
+        on gd.id = hc.goods_id
+        where hc.deleted is true
+          and hc.status is true
+        <if test="goodsId != null">
+          and hc.goods_id = #{goodsId}
+        </if>
+        order by sort desc
+    </select>
+</mapper>

+ 20 - 0
netflix-service/src/main/java/com/cyksj/service/sys/SysHelpService.java

@@ -0,0 +1,20 @@
+package com.cyksj.service.sys;
+
+import com.cyksj.model.entity.HelpQuestion;
+import com.cyksj.model.entity.HelpQuestionClassification;
+
+/*
+ *项目名: netflix
+ *文件名: SysHelpService
+ *创建者: JavaZou
+ *创建时间:2022/12/7 10:20
+ */
+public interface SysHelpService {
+	void postQuestionClassification(HelpQuestionClassification helpQuestionClassification);
+
+	void editQuestionClassification(HelpQuestionClassification helpQuestionClassification);
+
+	void saveHelpQuestion(HelpQuestion helpQuestion);
+
+	void editHelpQuestion(HelpQuestion helpQuestion);
+}

+ 137 - 0
netflix-service/src/main/java/com/cyksj/service/sys/impl/SysHelpServiceImpl.java

@@ -0,0 +1,137 @@
+package com.cyksj.service.sys.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.manage.help.HelpQuestionClassificationMapper;
+import com.cyksj.mapper.manage.help.HelpQuestionMapper;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.HelpQuestion;
+import com.cyksj.model.entity.HelpQuestionClassification;
+import com.cyksj.service.sys.SysHelpService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/*
+ *项目名: netflix
+ *文件名: SysHelpServiceImpl
+ *创建者: JavaZou
+ *创建时间:2022/12/7 10:20
+ */
+@Service
+@RequiredArgsConstructor
+public class SysHelpServiceImpl implements SysHelpService {
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final HelpQuestionClassificationMapper classificationMapper;
+
+	private final HelpQuestionMapper helpQuestionMapper;
+
+	@Override
+	public void postQuestionClassification(HelpQuestionClassification helpQuestionClassification) {
+		if (StrUtil.isEmpty(helpQuestionClassification.getName())) {
+			throw BusinessRuntimeException.getInstance("分类名称不能为空");
+		}
+		if (helpQuestionClassification.getSort() == null) {
+			throw BusinessRuntimeException.getInstance("排序不能为空");
+		}
+		if (helpQuestionClassification.getGoodsId() != null) {
+			GoodsDon goodsDon = goodsDonMapper.selectById(helpQuestionClassification.getGoodsId());
+			if (goodsDon == null || !goodsDon.getDeleted()) {
+				throw BusinessRuntimeException.getInstance("所选平台不存在");
+			}
+			if (!goodsDon.getStatus()) {
+				throw BusinessRuntimeException.getInstance("所选平台未上架");
+			}
+			HelpQuestionClassification exits = classificationMapper.selectOne(Wrappers.lambdaQuery(HelpQuestionClassification.class)
+					.eq(HelpQuestionClassification::getGoodsId, helpQuestionClassification.getGoodsId())
+					.eq(HelpQuestionClassification::getDeleted, true)
+					.select(HelpQuestionClassification::getId)
+					.last("limit 1"));
+			if (exits != null) {
+				throw BusinessRuntimeException.getInstance("已关联的该平台问题分类");
+			}
+		}
+		if (helpQuestionClassification.getGoodsId() == null && StrUtil.isEmpty(helpQuestionClassification.getLogo())) {
+			throw BusinessRuntimeException.getInstance("未关联平台,请上传对应问题分类logo");
+		}
+		HelpQuestionClassification classification = classificationMapper.selectOne(Wrappers.lambdaQuery(HelpQuestionClassification.class)
+				.eq(HelpQuestionClassification::getDeleted, true)
+				.eq(HelpQuestionClassification::getSort, helpQuestionClassification.getSort())
+				.last("limit 1"));
+		if (classification != null) {
+			throw BusinessRuntimeException.getInstance("排序相同");
+		}
+		classificationMapper.insert(helpQuestionClassification);
+	}
+
+	@Override
+	public void editQuestionClassification(HelpQuestionClassification helpQuestionClassification) {
+		if (helpQuestionClassification.getId() == null) {
+			throw BusinessRuntimeException.getInstance("id error");
+		}
+		HelpQuestionClassification exits = classificationMapper.selectById(helpQuestionClassification.getId());
+		if (exits == null || !exits.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("分类已被删除");
+		}
+		if (helpQuestionClassification.getSort() != null) {
+			HelpQuestionClassification classification = classificationMapper.selectOne(Wrappers.lambdaQuery(HelpQuestionClassification.class)
+					.eq(HelpQuestionClassification::getDeleted, true)
+					.eq(HelpQuestionClassification::getSort, helpQuestionClassification.getSort())
+					.ne(HelpQuestionClassification::getId, helpQuestionClassification.getId())
+					.last("limit 1"));
+			if (classification != null) {
+				throw BusinessRuntimeException.getInstance("排序相同");
+			}
+		}
+		classificationMapper.updateById(helpQuestionClassification);
+	}
+
+	@Override
+	public void saveHelpQuestion(HelpQuestion helpQuestion) {
+		if (ObjectUtil.hasEmpty(helpQuestion.getClassificationId(), helpQuestion.getName(), helpQuestion.getContent(), helpQuestion.getSort())) {
+			throw BusinessRuntimeException.getInstance("请补充必填项");
+		}
+		HelpQuestionClassification classification = classificationMapper.selectById(helpQuestion.getClassificationId());
+		if (classification == null || !classification.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("分类不存在");
+		}
+		HelpQuestion helpQuestion1 = helpQuestionMapper.selectOne(Wrappers.lambdaQuery(HelpQuestion.class)
+				.eq(HelpQuestion::getDeleted, true)
+				.eq(HelpQuestion::getClassificationId, helpQuestion.getClassificationId())
+				.eq(HelpQuestion::getSort, helpQuestion.getSort())
+				.last("limit 1"));
+		if (helpQuestion1 != null) {
+			throw BusinessRuntimeException.getInstance("排序相同");
+		}
+		helpQuestionMapper.insert(helpQuestion);
+	}
+
+	@Override
+	public void editHelpQuestion(HelpQuestion helpQuestion) {
+		if (helpQuestion.getId() == null) {
+			throw BusinessRuntimeException.getInstance("id error");
+		}
+		HelpQuestion exits = helpQuestionMapper.selectById(helpQuestion.getId());
+		if (exits == null || !exits.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("问题已被删除");
+		}
+		if (helpQuestion.getClassificationId() != null && !exits.getClassificationId().equals(helpQuestion.getClassificationId())) {
+			throw BusinessRuntimeException.getInstance("问题所属分类无法修改");
+		}
+		if (helpQuestion.getSort() != null) {
+			HelpQuestion helpQuestion1 = helpQuestionMapper.selectOne(Wrappers.lambdaQuery(HelpQuestion.class)
+					.eq(HelpQuestion::getDeleted, true)
+					.eq(HelpQuestion::getClassificationId, helpQuestion.getClassificationId())
+					.eq(HelpQuestion::getSort, helpQuestion.getSort())
+					.ne(HelpQuestion::getId, helpQuestion.getId())
+					.last("limit 1"));
+			if (helpQuestion1 != null) {
+				throw BusinessRuntimeException.getInstance("排序相同");
+			}
+		}
+		helpQuestionMapper.updateById(helpQuestion);
+	}
+}

+ 33 - 0
netflix-web/src/main/java/com/cyksj/config/WebConfig.java

@@ -0,0 +1,33 @@
+package com.cyksj.config;
+
+import cn.dev33.satoken.interceptor.SaRouteInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.List;
+
+/*
+ *项目名: yicang-admin
+ *文件名: WebConfig
+ *创建者: JavaZou
+ *创建时间:2022/12/19 10:01
+ */
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+	@Configuration
+	public class SaTokenConfigure implements WebMvcConfigurer {
+		// 注册拦截器
+		@Override
+		public void addInterceptors(InterceptorRegistry registry) {
+			registry.addInterceptor(new SaRouteInterceptor())
+					.addPathPatterns(List.of("/manage/**","/manager/**","/sys/update","/sys/delete/**"))
+					.excludePathPatterns(List.of("/manage/admin/login",
+							"/manage/admin/get/loginInfo",
+							"/manage/corp/**",
+							"/manage/coupon/corp/send"));
+		}
+	}
+
+}

+ 140 - 28
netflix-web/src/main/java/com/cyksj/web/controller/manage/AdminController.java

@@ -1,10 +1,14 @@
 package com.cyksj.web.controller.manage;
 
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.constant.WeChatTemplateConst;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Codec;
@@ -12,9 +16,10 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.CustomerServiceMapper;
+import com.cyksj.mapper.PhoneCodeMapper;
 import com.cyksj.model.dto.WxMpTemplateData;
 import com.cyksj.model.dto.WxMpTemplateMessage;
-import com.cyksj.model.entity.CustomerService;
+import com.cyksj.model.entity.PhoneCode;
 import com.cyksj.model.manage.dto.AdminInfo;
 import com.cyksj.model.manage.entity.Admin;
 import com.cyksj.service.mange.AdminService;
@@ -22,6 +27,7 @@ import com.cyksj.service.wechat.WeChatService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -52,12 +58,14 @@ public class AdminController {
 
     private final CustomerServiceMapper customerServiceMapper;
 
+    private final PhoneCodeMapper phoneCodeMapper;
+
     private static final List<String> SEND_LIST = List.of("o_i5g6V5z5uDpx_SBhJ4ePek8g8k","o_i5g6X99wu2OmC4DcQKXKNmJexA");
 
     @PostMapping(value = "/login")
-    public Result<AdminInfo> login(@RequestBody Admin adminRequest) throws Exception {
+    public Result<String> login(@RequestBody Admin adminRequest) throws Exception {
         Admin admin = adminService.getOne(
-                new QueryWrapper<Admin>().lambda().eq(Admin::getUserName,adminRequest.getUserName()));
+                new QueryWrapper<Admin>().lambda().eq(Admin::getPhone,adminRequest.getPhone()));
 
         if (null == admin) {
             throw BusinessRuntimeException.getInstance("该用户不存在.");
@@ -72,46 +80,150 @@ public class AdminController {
         if (!StringUtils.equals(admin.getPassWord(), encodePasscode)) {
             throw BusinessRuntimeException.getInstance("密码有误.");
         }
-
-        // 生成token
-
-        StpUtil.login(admin.getId());
-
-        String token = StpUtil.getTokenValue();
-
-        admin.setPassWord("");
-
-        AdminInfo info = new AdminInfo();
-        info.setInfo(admin);
-        info.setToken(token);
-        return GatewayResponse.SUCCESS.newBuilder().toResult(info);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
     @PostMapping("/post")
     public Result<String> saveAdmin(@RequestBody @Validated Admin admin) throws Exception {
-        if(StringUtils.isNotBlank(admin.getPassWord())){
+        Long adminId = StpUtil.getLoginIdAsLong();
+        Admin exist = adminService.getById(adminId);
+        if (exist == null) {
+            throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
+        }
+        if (exist.getCategory() != Admin.Category.superoot) {
+            throw BusinessRuntimeException.getInstance("无超级管理员权限");
+        }
+        if (StringUtils.isNotBlank(admin.getPassWord())) {
             admin.setPassWord(Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(admin.getPassWord()).toBase64String());
         }
-        if(admin.getId() == null){
-            Admin ad = adminService.getOne(new LambdaQueryWrapper<Admin>().eq(Admin::getUserName, admin.getUserName()));
+        if (admin.getId() == null) {
+            Admin ad = adminService.getOne(new LambdaQueryWrapper<Admin>().eq(Admin::getPhone, admin.getPhone()));
             if (ad != null) {
                 throw BusinessRuntimeException.getInstance("该账号已存在.");
             }
         }
+        boolean mobile = Validator.isMobile(admin.getPhone());
+        if (!mobile) {
+            throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+        }
 
-        adminService.saveOrUpdate(admin);
+        try {
+            adminService.saveOrUpdate(admin);
+        } catch (DuplicateKeyException e) {
+            throw BusinessRuntimeException.getInstance("手机号重复");
+        }
 
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
+    /**
+     * 删除管理员
+     */
+    @DeleteMapping("/delete/{id}")
+    public Result<String> deleteAdminById(@PathVariable Long id) {
+        Long adminId = StpUtil.getLoginIdAsLong();
+        Admin exist = adminService.getById(adminId);
+        if (exist == null) {
+            throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
+        }
+        if (exist.getCategory() != Admin.Category.superoot) {
+            throw BusinessRuntimeException.getInstance("无超级管理员权限");
+        }
+        if (id.equals(adminId)) {
+            throw BusinessRuntimeException.getInstance("无法删除自己");
+        }
+        adminService.removeById(id);
+        return GatewayResponse.SUCCESS.newBuilder().toResult("删除成功");
+    }
+
+    /**
+     * 编辑管理员
+     */
+    @PutMapping("/put")
+    public Result<String> editAdmin(@RequestBody Admin admin) throws Exception {
+        Long adminId = StpUtil.getLoginIdAsLong();
+        Admin exist = adminService.getById(adminId);
+        if (exist == null) {
+            throw BusinessRuntimeException.getInstance("账号不存在,请重新登录");
+        }
+        if (exist.getCategory() != Admin.Category.superoot) {
+            throw BusinessRuntimeException.getInstance("无超级管理员权限");
+        }
+        Admin user = adminService.getById(admin.getId());
+        if (admin.getId() == null || user == null) {
+            throw BusinessRuntimeException.getInstance("账号不存在");
+        }
+        Boolean flag = false;
+        if (StrUtil.isNotEmpty(admin.getPhone())) {
+            boolean mobile = Validator.isMobile(admin.getPhone());
+            if (!mobile) {
+                throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+            }
+            if (!admin.getPhone().equals(user.getPhone())) {
+                flag = true;
+            }
+        }
+        if (StrUtil.isNotEmpty(admin.getPassWord())) {
+            String encodePwd = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.SHA256).setStringData(admin.getPassWord()).toBase64String();
+            admin.setPassWord(encodePwd);
+            if (!encodePwd.equals(user.getPassWord())) {
+                flag = true;
+            }
+        }
+        adminService.saveOrUpdate(admin);
+        if (flag) {
+            StpUtil.logoutByLoginId(admin.getId());
+        }
+
+        return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功");
+    }
+
+
+    /**
+     * 校验手机号获取登录信息
+     */
+    @GetMapping("/get/loginInfo")
+    public Result<AdminInfo> getLoginInfo(String phone, String code) {
+        Admin admin = adminService.getOne(
+                new QueryWrapper<Admin>().lambda().eq(Admin::getPhone, phone));
+        if (null == admin) {
+            throw BusinessRuntimeException.getInstance("该用户不存在.");
+        }
+        if (StrUtil.hasEmpty(phone, code)) {
+            throw BusinessRuntimeException.getInstance("请输入对应信息");
+        }
+        DateTime now = DateTime.now();
+        PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
+        if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
+            throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+        }
+        //3分钟失效
+        Date updateTime = phoneCode.getUpdateTime();
+        DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
+        if (now.isAfter(afterFiveMinutes)) {
+            throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+        }
+        if (!StrUtil.equals(code, phoneCode.getCode())) {
+            throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+        }
+        // 生成token
+
+        StpUtil.login(admin.getId());
+
+        String token = StpUtil.getTokenValue();
+
+        admin.setPassWord("");
+
+        AdminInfo info = new AdminInfo();
+        info.setInfo(admin);
+        info.setToken(token);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(info);
+    }
+
     @GetMapping("/get/list")
-    public Result<List<Admin>> list(){
-        List<Admin> list = adminService.list(new LambdaQueryWrapper<Admin>().eq(Admin::getStatus,true));
-        list.forEach((admin)->{
-            admin.setPassWord("");
-            admin.setUserName("");
-        });
-        return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+    public Result<Page<Admin>> list(@RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "5") Integer limit) {
+        Page<Admin> page = adminService.page(new Page<>(start, limit), new LambdaQueryWrapper<Admin>().eq(Admin::getStatus, true));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(page);
     }
 
     @GetMapping("/send/template")
@@ -175,4 +287,4 @@ public class AdminController {
         return result;
     }
 
-}
+}

+ 167 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/sys/HelpController.java

@@ -0,0 +1,167 @@
+package com.cyksj.web.controller.manage.sys;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.manage.help.HelpQuestionClassificationMapper;
+import com.cyksj.mapper.manage.help.HelpQuestionMapper;
+import com.cyksj.model.entity.HelpQuestion;
+import com.cyksj.model.entity.HelpQuestionClassification;
+import com.cyksj.service.sys.SysHelpService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+
+/*
+ *项目名: netflix
+ *文件名: HelpController
+ *创建者: JavaZou
+ *创建时间:2022/12/7 14:16
+ */
+@RestController
+@RequestMapping("/manage/help")
+@RequiredArgsConstructor
+public class HelpController {
+	private final SysHelpService sysHelpService;
+
+	private final HelpQuestionClassificationMapper classificationMapper;
+
+	private final HelpQuestionMapper helpQuestionMapper;
+
+	/**
+	 * 新增问题分类
+	 */
+	@PostMapping("/question/classification")
+	public Result<String> saveHelpQuestionClassification(@RequestBody HelpQuestionClassification helpQuestionClassification) {
+		sysHelpService.postQuestionClassification(helpQuestionClassification);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("新增问题分类成功");
+	}
+
+	/**
+	 * 删除问题分类
+	 */
+	@DeleteMapping("/question/classification/{id}")
+	public Result<String> deleteHelpQuestionClassificationById(@PathVariable Long id) {
+		HelpQuestionClassification helpQuestionClassification = classificationMapper.selectById(id);
+		if (helpQuestionClassification != null) {
+			helpQuestionClassification.setDeleted(false);
+			classificationMapper.updateById(helpQuestionClassification);
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult("删除问题分类成功");
+	}
+
+	/**
+	 * 编辑问题分类
+	 */
+	@PutMapping("/question/classification")
+	public Result<String> editHelpQuestionClassification(@RequestBody HelpQuestionClassification helpQuestionClassification) {
+		sysHelpService.editQuestionClassification(helpQuestionClassification);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑问题分类成功");
+	}
+
+	/**
+	 * 问题分类列表
+	 */
+	@GetMapping("/question/classification")
+	public Result<Page<HelpQuestionClassification>> saveHelpQuestionClassification(@RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "5") Integer limit) {
+		Page<HelpQuestionClassification> page = classificationMapper.selectPage(new Page<>(start, limit), Wrappers.lambdaQuery(HelpQuestionClassification.class)
+				.eq(HelpQuestionClassification::getDeleted, true)
+				.orderByDesc(HelpQuestionClassification::getSort));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(page);
+	}
+
+	/**
+	 * 上下架分类
+	 */
+	@PutMapping("/question/classification/status/{id}")
+	public Result<String> updateHelpQuestionClassificationStatus(@PathVariable Long id) {
+		HelpQuestionClassification classification = classificationMapper.selectById(id);
+		if (classification == null || !classification.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("分类不存在");
+		}
+		classification.setStatus(!classification.getStatus());
+		classificationMapper.updateById(classification);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("操作成功");
+	}
+
+	/**
+	 * 新增问题
+	 */
+	@PostMapping("/question")
+	public Result<String> saveHelpQuestion(@RequestBody HelpQuestion helpQuestion) {
+		sysHelpService.saveHelpQuestion(helpQuestion);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("新增问题成功");
+	}
+
+	/**
+	 * 删除问题
+	 */
+	@DeleteMapping("/question/{id}")
+	public Result<String> deleteHelpQuestionById(@PathVariable Long id) {
+		HelpQuestion helpQuestion = helpQuestionMapper.selectById(id);
+		if (helpQuestion == null || !helpQuestion.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("问题不存在");
+		}
+		helpQuestion.setDeleted(false);
+		helpQuestionMapper.updateById(helpQuestion);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("删除问题成功");
+	}
+
+	/**
+	 * 修改问题
+	 */
+	@PutMapping("/question")
+	public Result<String> editHelpQuestion(@RequestBody HelpQuestion helpQuestion) {
+		sysHelpService.editHelpQuestion(helpQuestion);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑问题成功");
+	}
+
+	/**
+	 * 问题列表
+	 */
+	@GetMapping("/question")
+	public Result<Page<HelpQuestion>> saveHelpQuestion(Long classificationId, @RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "5") Integer limit) {
+		if (classificationId == null) {
+			throw BusinessRuntimeException.getInstance("问题分类id为空");
+		}
+		HelpQuestionClassification helpQuestionClassification = classificationMapper.selectById(classificationId);
+		if (helpQuestionClassification == null || !helpQuestionClassification.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("该分类已被删除");
+		}
+		Page<HelpQuestion> page = helpQuestionMapper.selectPage(new Page<>(start, limit),
+				Wrappers.lambdaQuery(HelpQuestion.class)
+						.eq(HelpQuestion::getClassificationId, classificationId)
+						.eq(HelpQuestion::getDeleted, true)
+						.orderByDesc(HelpQuestion::getSort));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(page);
+	}
+
+	/**
+	 * 问题详情
+	 */
+	@GetMapping("/get/question/detail")
+	private Result<HelpQuestion> getQuestionById(@NotNull Long id) {
+		if (id == null || id < 1) {
+			throw BusinessRuntimeException.getInstance("id error");
+		}
+		HelpQuestion helpQuestion = helpQuestionMapper.selectById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(helpQuestion);
+	}
+
+	/**
+	 * 上下架问题
+	 */
+	@PutMapping("/question/status/{id}")
+	public Result<String> saveHelpQuestion(@PathVariable Long id) {
+		HelpQuestion helpQuestion = helpQuestionMapper.selectById(id);
+		if (helpQuestion == null || !helpQuestion.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("问题不存在");
+		}
+		helpQuestion.setStatus(!helpQuestion.getStatus());
+		helpQuestionMapper.updateById(helpQuestion);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("操作成功");
+	}
+}

+ 78 - 24
netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java

@@ -1,10 +1,16 @@
 package com.cyksj.web.controller.sys;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.manage.help.HelpQuestionClassificationMapper;
+import com.cyksj.mapper.manage.help.HelpQuestionMapper;
+import com.cyksj.model.entity.HelpQuestion;
+import com.cyksj.model.entity.HelpQuestionClassification;
 import com.cyksj.model.entity.SysConfig;
+import com.cyksj.model.views.HelpQuestionClassificationView;
 import com.cyksj.service.sys.SysConfigService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -20,38 +26,86 @@ import org.springframework.web.bind.annotation.*;
 @RequiredArgsConstructor
 public class SysConfigController {
 
-    private final SysConfigService sysConfigService;
+	private final SysConfigService sysConfigService;
 
-    @GetMapping("/get")
-    public Result<SysConfig> get(String key){
-        SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, key).last(" limit 1"));
+	private final HelpQuestionMapper helpQuestionMapper;
 
-        if (sysConfig == null) {
-            throw new BusinessRuntimeException("配置不存在");
-        }
+	private final HelpQuestionClassificationMapper helpQuestionClassificationMapper;
 
-        return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig);
-    }
+	@GetMapping("/get")
+	public Result<SysConfig> get(String key) {
+		SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, key).last(" limit 1"));
 
-    @PostMapping("/post")
-    public Result<SysConfig> post(@RequestBody SysConfig sysConfig){
-        sysConfigService.save(sysConfig);
+		if (sysConfig == null) {
+			throw new BusinessRuntimeException("配置不存在");
+		}
 
-        return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig);
-    }
+		return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig);
+	}
 
-    @PutMapping("/update")
-    public Result<SysConfig> update(@RequestBody SysConfig sysConfig){
-        sysConfigService.updateById(sysConfig);
+	@PostMapping("/post")
+	public Result<SysConfig> post(@RequestBody SysConfig sysConfig) {
+		sysConfigService.save(sysConfig);
 
-        return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig);
-    }
+		return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig);
+	}
 
-    @DeleteMapping("/delete/{id}")
-    public Result<String> update(@PathVariable Long id){
-        sysConfigService.removeById(id);
+	@PutMapping("/update")
+	public Result<SysConfig> update(@RequestBody SysConfig sysConfig) {
+		sysConfigService.updateById(sysConfig);
 
-        return GatewayResponse.SUCCESS.newBuilder().toResult();
-    }
+		return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig);
+	}
+
+	@DeleteMapping("/delete/{id}")
+	public Result<String> update(@PathVariable Long id) {
+		sysConfigService.removeById(id);
+
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 问题分类列表
+	 */
+	@GetMapping("/help/question/classification/get")
+	public Result<Page<HelpQuestionClassificationView>> get(Long goodsId, @RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "5") Integer limit) {
+		Page<HelpQuestionClassificationView> page = helpQuestionClassificationMapper.getQuestionClassificationView(goodsId, new Page<>(start, limit));
+		page.getRecords().forEach(data -> {
+			data.setQuestions(helpQuestionMapper.selectList(Wrappers.lambdaQuery(HelpQuestion.class)
+					.eq(HelpQuestion::getClassificationId, data.getId())
+					.eq(HelpQuestion::getDeleted, true)
+					.eq(HelpQuestion::getStatus, true)
+					.orderByDesc(HelpQuestion::getSort)));
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(page);
+	}
+
+	/**
+	 * 问题详情
+	 */
+	@GetMapping("/get/question/detail")
+	private Result<HelpQuestion> getQuestionById(Long id) {
+		if (id == null || id < 1) {
+			throw BusinessRuntimeException.getInstance("id error");
+		}
+		HelpQuestion helpQuestion = helpQuestionMapper.selectById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(helpQuestion);
+	}
+
+	/**
+	 * 平台是否有关联上架的问题分类
+	 */
+	@GetMapping("/check/goods/question/classification")
+	public Result<Boolean> checkGoodsQuestionClassification(Long goodsId) {
+		if (goodsId == null || goodsId < 0) {
+			throw BusinessRuntimeException.getInstance("id error");
+		}
+		HelpQuestionClassification helpQuestionClassification = helpQuestionClassificationMapper.selectOne(Wrappers.lambdaQuery(HelpQuestionClassification.class)
+				.eq(HelpQuestionClassification::getGoodsId, goodsId)
+				.eq(HelpQuestionClassification::getDeleted, true)
+				.eq(HelpQuestionClassification::getStatus, true)
+				.last("limit 1"));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(helpQuestionClassification != null ? true : false);
+	}
 
 }