Jelajahi Sumber

Merge branch 'question'

zoujiajian 3 tahun lalu
induk
melakukan
d5cd433884

+ 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);
+	}
 
 }