Mr.qian пре 4 недеља
родитељ
комит
56c55306d5

+ 76 - 0
cif-api/src/main/java/com/txz/cif/dto/AdminUserDTO.java

@@ -0,0 +1,76 @@
+package dto;
+
+import lombok.Data;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/9/19
+ */
+@Data
+public class AdminUserDTO {
+    
+    /**
+     * 用户ID
+     */
+    private Long id;
+    
+    /**
+     * 用户名
+     */
+    private String name;
+    
+    /**
+     * 登录账号
+     */
+    private String loginAccount;
+    
+    /**
+     * 密码
+     */
+    private String password;
+    
+    /**
+     * 盐值
+     */
+    private String salt;
+    
+    /**
+     * 手机号码
+     */
+    private String phoneNo;
+    
+    /**
+     * 邮箱
+     */
+    private String email;
+    
+    /**
+     * 状态 0:正常 1:禁用
+     */
+    private String status;
+    
+    /**
+     * 创建时间
+     */
+    private Long createTime;
+    
+    /**
+     * 更新时间
+     */
+    private Long updateTime;
+    
+    /**
+     * 创建人ID
+     */
+    private String createUserId;
+    
+    /**
+     * 更新人ID
+     */
+    private String updateUserId;
+    
+    /**
+     * token
+     */
+    private String token;
+}

+ 14 - 0
cif-service/src/main/java/com/txz/cif/dao/QaGroupMapper.java

@@ -0,0 +1,14 @@
+package com.txz.cif.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.txz.cif.model.QaGroup;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Mapper
+public interface QaGroupMapper extends BaseMapper<QaGroup> {
+}

+ 24 - 0
cif-service/src/main/java/com/txz/cif/dao/QaMapper.java

@@ -0,0 +1,24 @@
+package com.txz.cif.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.txz.cif.dao.impl.QaMapperImpl;
+import com.txz.cif.model.Qa;
+import com.txz.cif.web.para.QaParam;
+import com.txz.cif.web.vo.QaListVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.SelectProvider;
+
+import java.util.List;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Mapper
+public interface QaMapper extends BaseMapper<Qa> {
+    
+    @SelectProvider(type = QaMapperImpl.class, method = "adminList")
+    List<QaListVO> adminList(QaParam qaParam);
+    
+}

+ 26 - 0
cif-service/src/main/java/com/txz/cif/dao/impl/QaMapperImpl.java

@@ -0,0 +1,26 @@
+package com.txz.cif.dao.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.txz.cif.web.para.QaParam;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+
+public class QaMapperImpl {
+    
+    public String adminList(QaParam qaParam) {
+        String sql = " SELECT qa.id, qa.bn_title, qa.en_title, qa.create_user, qa.update_user, qa.create_time, qa.update_time, qa.del_flag, " +
+                " qag.id AS group_id, qag.del_flag AS group_del_flag, qag.bn_name AS group_bn_name, qag.en_name AS group_en_name, qa.sort " +
+                " FROM c_qa qa " +
+                " LEFT JOIN c_qa_group qag ON qa.group_id = qag.id " +
+                " WHERE 1 = 1 ";
+        if (ObjectUtil.isNotNull(qaParam.getGroupId())) {
+            sql += " qag.id = #{groupId} ";
+        }
+        sql += " ORDER BY qa.sort ASC ";
+        return sql;
+    }
+}

+ 94 - 0
cif-service/src/main/java/com/txz/cif/model/Qa.java

@@ -0,0 +1,94 @@
+package com.txz.cif.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.FieldNameConstants;
+
+import java.util.Date;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("c_qa")
+@FieldNameConstants
+@EqualsAndHashCode(callSuper = true)
+public class Qa extends Model<Qa> {
+    
+    /**
+     * null
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    
+    /**
+     * 孟加拉标题
+     */
+    private String bnTitle;
+    
+    /**
+     * 英文标题
+     */
+    private String enTitle;
+    
+    /**
+     * 孟加拉内容
+     */
+    private String bnContent;
+    
+    /**
+     * 英文内容
+     */
+    private String enContent;
+    
+    /**
+     * 创建人
+     */
+    private String createUser;
+    
+    /**
+     * 更新人
+     */
+    private String updateUser;
+    
+    /**
+     * 更新时间
+     */
+    // @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+    
+    /**
+     * 创建时间
+     */
+    // @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+    
+    /**
+     * 删除标识
+     */
+    // @TableLogic
+    // @TableField(fill = FieldFill.INSERT)
+    private Boolean delFlag;
+    
+    /**
+     * 分类id
+     */
+    private Long groupId;
+    
+    /**
+     * 排序
+     */
+    private Integer sort;
+    
+}

+ 77 - 0
cif-service/src/main/java/com/txz/cif/model/QaGroup.java

@@ -0,0 +1,77 @@
+package com.txz.cif.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.FieldNameConstants;
+
+import java.util.Date;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("c_qa_group")
+@FieldNameConstants
+@EqualsAndHashCode(callSuper = true)
+public class QaGroup extends Model<QaGroup> {
+    
+    /**
+     * null
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    
+    /**
+     * 创建人
+     */
+    private String createUser;
+    
+    /**
+     * 更新人
+     */
+    private String updateUser;
+    
+    /**
+     * 更新时间
+     */
+    // @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+    
+    /**
+     * 创建时间
+     */
+    // @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+    
+    /**
+     * 删除标识
+     */
+    // @TableLogic
+    // @TableField(fill = FieldFill.INSERT)
+    private Boolean delFlag;
+    
+    /**
+     * 孟加拉分类名称
+     */
+    private String bnName;
+    
+    /**
+     * 英文分类名称
+     */
+    private String enName;
+    
+    /**
+     * 排序
+     */
+    private Integer sort;
+}

+ 13 - 0
cif-service/src/main/java/com/txz/cif/service/QaGroupService.java

@@ -0,0 +1,13 @@
+package com.txz.cif.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.txz.cif.model.QaGroup;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+
+public interface QaGroupService extends IService<QaGroup> {
+}

+ 20 - 0
cif-service/src/main/java/com/txz/cif/service/QaService.java

@@ -0,0 +1,20 @@
+package com.txz.cif.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.txz.cif.model.Qa;
+import com.txz.cif.web.para.QaParam;
+import com.txz.cif.web.vo.QaListVO;
+
+import java.util.List;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+
+public interface QaService extends IService<Qa> {
+    
+    List<QaListVO> adminList(QaParam qaParam);
+    
+}

+ 20 - 0
cif-service/src/main/java/com/txz/cif/service/impl/QaGroupServiceImpl.java

@@ -0,0 +1,20 @@
+package com.txz.cif.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.txz.cif.dao.QaGroupMapper;
+import com.txz.cif.model.QaGroup;
+import com.txz.cif.service.QaGroupService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class QaGroupServiceImpl extends ServiceImpl<QaGroupMapper, QaGroup> implements QaGroupService {
+}

+ 31 - 0
cif-service/src/main/java/com/txz/cif/service/impl/QaServiceImpl.java

@@ -0,0 +1,31 @@
+package com.txz.cif.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.txz.cif.dao.QaMapper;
+import com.txz.cif.model.Qa;
+import com.txz.cif.service.QaService;
+import com.txz.cif.web.para.QaParam;
+import com.txz.cif.web.vo.QaListVO;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class QaServiceImpl extends ServiceImpl<QaMapper, Qa> implements QaService {
+    
+    private final QaMapper qaMapper;
+    
+    @Override
+    public List<QaListVO> adminList(QaParam qaParam) {
+        return qaMapper.adminList(qaParam);
+    }
+}

+ 100 - 0
cif-service/src/main/java/com/txz/cif/util/UserUtil.java

@@ -0,0 +1,100 @@
+package com.txz.cif.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.txz.cif.core.RedisUtil;
+import com.txz.cif.core.ServiceException;
+import dto.AdminUserDTO;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Date: 2019/10/10 10:12
+ * @Version 1.0
+ */
+@Component
+public class UserUtil {
+    
+    private static UserUtil instance;
+    
+    //    @Resource
+    //    private UserService userService;
+    @Resource
+    private RedisUtil redisUtil;
+    
+    // 3. 私有化构造器,防止被实例化
+    private UserUtil() {
+    }
+    
+    /**
+     * {"id":1,"name":"admin",
+     * "loginAccount":"admin",
+     * "password":"51D0DBF9A1A4A103AC3270B5C67E5E0A",
+     * "salt":"q3VNUI1341h",
+     * "phoneNo":"17682302017",
+     * "email":"1",
+     * "status":"0",
+     * "createTime":1504681409000,
+     * "updateTime":1583286557000,
+     * "createUserId":"1",
+     * "updateUserId":"admin",
+     * "token":"f3813140-f2a4-457b-8382-e3e049bfe705"}
+     *
+     * @param request
+     *
+     * @return
+     */
+    public static JSONObject getTokenUser(HttpServletRequest request) {
+        if (request == null) {
+            ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (null != sra) {
+                request = sra.getRequest();
+            } else {
+                return null;
+            }
+        }
+        //        instance.redisUtil.set("888","777");
+        //
+        //
+        //
+        //        Object o = instance.redisUtil.get("888");
+        
+        String token = request.getHeader("accessToken");
+        
+        String key = "backstage_UserConfig_" + token;
+        //  CacheKey key = CacheKey.generateKey(CacheType.UserConfig, token);
+        String user = (String) instance.redisUtil.get(key);
+        if (ObjectUtils.isEmpty(user)) {
+            throw new ServiceException("用户未登陆");
+        }
+        
+        JSONObject jsonObject = (JSONObject) JSONObject.parseObject(user);
+        
+        
+        return jsonObject;
+    }
+    
+    public static AdminUserDTO getAdminUser(HttpServletRequest request) {
+        JSONObject jsonObject = getTokenUser(request);
+        AdminUserDTO loginUser = JSON.toJavaObject(jsonObject, AdminUserDTO.class);
+        return loginUser;
+    }
+    
+    public static Long getAdminUserId(HttpServletRequest request) {
+        JSONObject jsonObject = getTokenUser(request);
+        AdminUserDTO loginUser = JSON.toJavaObject(jsonObject, AdminUserDTO.class);
+        return loginUser.getId();
+    }
+    
+    // 4. 初始化时将实例赋值给静态变量,使静态方法能访问注入的资源
+    @PostConstruct
+    public void init() {
+        instance = this;
+    }
+}

+ 180 - 0
cif-service/src/main/java/com/txz/cif/web/mng/QaController.java

@@ -0,0 +1,180 @@
+package com.txz.cif.web.mng;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.pagehelper.PageHelper;
+import com.txz.cif.core.Result;
+import com.txz.cif.model.Qa;
+import com.txz.cif.model.QaGroup;
+import com.txz.cif.service.QaGroupService;
+import com.txz.cif.service.QaService;
+import com.txz.cif.util.UserUtil;
+import com.txz.cif.web.para.QaGroupParam;
+import com.txz.cif.web.para.QaParam;
+import com.txz.cif.web.ro.qa.QaGroupRO;
+import com.txz.cif.web.ro.qa.QaRO;
+import com.txz.cif.web.vo.QaListVO;
+import dto.AdminUserDTO;
+import lombok.AllArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * [后台]qa管理
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Log4j2
+@RestController
+@AllArgsConstructor
+@RequestMapping("qa")
+public class QaController {
+    
+    private final QaService qaService;
+    
+    private final QaGroupService qaGroupService;
+    
+    /**
+     * 分类列表
+     */
+    @GetMapping("groupList")
+    public Result<Page<QaGroup>> groupList(QaGroupParam qaParam) {
+        PageHelper.startPage(qaParam.getPage(), qaParam.getSize());
+        
+        List<QaGroup> list = qaGroupService.list(Wrappers.<QaGroup>lambdaQuery()
+                .orderByDesc(QaGroup::getSort)
+                .orderByDesc(QaGroup::getUpdateTime)
+        );
+        return Result.success(list);
+    }
+    
+    
+    /**
+     * 新增
+     */
+    @PostMapping("add")
+    public Result add(@Validated @RequestBody QaGroupRO ro, HttpServletRequest request) {
+        AdminUserDTO adminUser = UserUtil.getAdminUser(request);
+        QaGroup qaGroup = BeanUtil.copyProperties(ro, QaGroup.class);
+        qaGroup.setCreateUser(adminUser.getName());
+        qaGroup.setCreateTime(new Date());
+        qaGroup.setUpdateTime(new Date());
+        qaGroup.setDelFlag(Boolean.FALSE);
+        qaGroupService.save(qaGroup);
+        return Result.success();
+    }
+    
+    /**
+     * 修改
+     */
+    @PostMapping("update/{id:^\\d+$}")
+    public Result update(@PathVariable Long id, @Validated @RequestBody QaGroupRO ro, HttpServletRequest request) {
+        AdminUserDTO adminUser = UserUtil.getAdminUser(request);
+        QaGroup qaGroup = BeanUtil.copyProperties(ro, QaGroup.class);
+        qaGroup.setId(id);
+        qaGroup.setUpdateUser(adminUser.getName());
+        qaGroup.setUpdateTime(new Date());
+        qaGroupService.updateById(qaGroup);
+        return Result.success();
+    }
+    
+    /**
+     * 修改状态
+     */
+    @PostMapping("changeStatus/{id:^\\d+$}")
+    public Result changeStatus(@PathVariable Long id, HttpServletRequest request) {
+        AdminUserDTO adminUser = UserUtil.getAdminUser(request);
+        QaGroup qaGroup = qaGroupService.getById(id);
+        qaGroup.setDelFlag(!qaGroup.getDelFlag());
+        qaGroup.setUpdateUser(adminUser.getName());
+        qaGroup.setUpdateTime(new Date());
+        qaGroupService.updateById(qaGroup);
+        return Result.success();
+    }
+    
+    /**
+     * 分组详情
+     */
+    @GetMapping("groupInfo/{id:^\\d+$}")
+    public Result<QaGroup> groupInfo(@PathVariable Long id) {
+        QaGroup qaGroup = qaGroupService.getById(id);
+        return Result.success(qaGroup);
+    }
+    
+    /**
+     * 可用分组列表
+     */
+    @GetMapping("availableGroupList")
+    public Result<List<QaGroup>> availableGroupList() {
+        List<QaGroup> list = qaGroupService.list(Wrappers.<QaGroup>lambdaQuery()
+                .eq(QaGroup::getDelFlag, Boolean.FALSE)
+        );
+        return Result.success(list);
+    }
+    
+    /**
+     * qa列表
+     */
+    @GetMapping("qaList")
+    public Result<Page<QaListVO>> qaList(QaParam qaParam) {
+        PageHelper.startPage(qaParam.getPage(), qaParam.getSize());
+        return Result.success(qaService.adminList(qaParam));
+    }
+    
+    /**
+     * 新增qa
+     */
+    @PostMapping("addQa")
+    public Result addQa(@Validated @RequestBody QaRO ro, HttpServletRequest request) {
+        AdminUserDTO adminUser = UserUtil.getAdminUser(request);
+        Qa qa = BeanUtil.copyProperties(ro, Qa.class);
+        qa.setCreateUser(adminUser.getName());
+        qa.setCreateTime(new Date());
+        qa.setUpdateTime(new Date());
+        qaService.save(qa);
+        return Result.success();
+    }
+    
+    
+    /**
+     * 修改qa
+     */
+    @PostMapping("updateQa/{id:^\\d+$}")
+    public Result updateQa(@PathVariable Long id, @Validated @RequestBody QaRO ro, HttpServletRequest request) {
+        AdminUserDTO adminUser = UserUtil.getAdminUser(request);
+        Qa qa = BeanUtil.copyProperties(ro, Qa.class);
+        qa.setId(id);
+        qa.setUpdateUser(adminUser.getName());
+        qa.setUpdateTime(new Date());
+        qaService.updateById(qa);
+        return Result.success();
+    }
+    
+    /**
+     * 修改qa状态
+     */
+    @PostMapping("changeQaStatus/{id:^\\d+$}")
+    public Result changeQaStatus(@PathVariable Long id, HttpServletRequest request) {
+        AdminUserDTO adminUser = UserUtil.getAdminUser(request);
+        Qa qa = qaService.getById(id);
+        qa.setDelFlag(!qa.getDelFlag());
+        qa.setUpdateUser(adminUser.getName());
+        qa.setUpdateTime(new Date());
+        qaService.updateById(qa);
+        return Result.success();
+    }
+    
+    @GetMapping("qaInfo/{id:^\\d+$}")
+    public Result<Qa> qaInfo(@PathVariable Long id) {
+        Qa qa = qaService.getById(id);
+        return Result.success(qa);
+    }
+    
+}

+ 86 - 0
cif-service/src/main/java/com/txz/cif/web/mng/appcontroller/QaAppController.java

@@ -0,0 +1,86 @@
+package com.txz.cif.web.mng.appcontroller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.pagehelper.PageHelper;
+import com.txz.cif.core.Result;
+import com.txz.cif.model.Qa;
+import com.txz.cif.model.QaGroup;
+import com.txz.cif.service.QaGroupService;
+import com.txz.cif.service.QaService;
+import com.txz.cif.web.para.QaParam;
+import lombok.AllArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * [API]qa
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Log4j2
+@RestController
+@AllArgsConstructor
+@RequestMapping("api/qa")
+public class QaAppController {
+    
+    private final QaService qaService;
+    
+    private final QaGroupService qaGroupService;
+    
+    /**
+     * 分类列表
+     */
+    @GetMapping("groupList")
+    public Result<List<QaGroup>> groupList() {
+        List<QaGroup> list = qaGroupService.list(Wrappers.<QaGroup>lambdaQuery()
+                .eq(QaGroup::getDelFlag, Boolean.FALSE)
+                .orderByDesc(QaGroup::getSort)
+                .orderByDesc(QaGroup::getUpdateTime)
+        );
+        return Result.success(list);
+    }
+    
+    /**
+     * qa列表
+     */
+    @GetMapping("qaList}")
+    public Result<Page<Qa>> qaList(@Validated({QaParam.App.class}) QaParam qaParam) {
+        QaGroup qaGroup = qaGroupService.getById(qaParam.getGroupId());
+        if (ObjectUtil.isEmpty(qaGroup) && qaGroup.getDelFlag()) {
+            return Result.fail();
+        }
+        PageHelper.startPage(qaParam.getPage(), qaParam.getSize());
+        List<Qa> list = qaService.list(Wrappers.<Qa>lambdaQuery()
+                .select(Qa::getId, Qa::getBnTitle, Qa::getEnTitle, Qa::getSort)
+                .eq(Qa::getDelFlag, Boolean.FALSE)
+                .eq(Qa::getGroupId, qaParam.getGroupId())
+                .orderByDesc(Qa::getSort)
+                .orderByDesc(Qa::getUpdateTime)
+        );
+        return Result.success(list);
+    }
+    
+    /**
+     * qa详情
+     */
+    @GetMapping("qaInfo/{id:^\\d+$}")
+    public Result<Qa> qaInfo(@PathVariable Long id) {
+        Qa qa = qaService.getOne(Wrappers.<Qa>lambdaQuery()
+                .select(Qa::getId, Qa::getBnTitle, Qa::getEnTitle, Qa::getBnContent, Qa::getEnContent, Qa::getSort)
+                .eq(Qa::getDelFlag, Boolean.FALSE)
+                .eq(Qa::getId, id)
+        );
+        return Result.success(qa);
+    }
+    
+    
+}

+ 22 - 0
cif-service/src/main/java/com/txz/cif/web/para/QaGroupParam.java

@@ -0,0 +1,22 @@
+package com.txz.cif.web.para;
+
+import lombok.Data;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Data
+public class QaGroupParam {
+    
+    /**
+     * 第几页
+     */
+    private Integer page;
+    
+    /**
+     * 每页显示条数
+     */
+    private Integer size;
+}

+ 33 - 0
cif-service/src/main/java/com/txz/cif/web/para/QaParam.java

@@ -0,0 +1,33 @@
+package com.txz.cif.web.para;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Data
+public class QaParam {
+    
+    /**
+     * 第几页
+     */
+    private Integer page;
+    
+    /**
+     * 每页显示条数
+     */
+    private Integer size;
+    
+    /**
+     * 分类ID
+     */
+    @NotNull(message = "分类ID不能为空", groups = QaParam.App.class)
+    private Long groupId;
+    
+    public interface App {
+    }
+}

+ 37 - 0
cif-service/src/main/java/com/txz/cif/web/ro/qa/QaGroupRO.java

@@ -0,0 +1,37 @@
+package com.txz.cif.web.ro.qa;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class QaGroupRO {
+    
+    /**
+     * 孟加拉分类名称
+     */
+    @NotBlank(message = "孟加拉分类名称不能为空")
+    private String bnName;
+    
+    /**
+     * 英文分类名称
+     */
+    @NotBlank(message = "英文分类名称不能为空")
+    private String enName;
+    
+    /**
+     * 排序
+     */
+    @NotNull(message = "排序不能为空")
+    private Integer sort;
+}

+ 62 - 0
cif-service/src/main/java/com/txz/cif/web/ro/qa/QaRO.java

@@ -0,0 +1,62 @@
+package com.txz.cif.web.ro.qa;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class QaRO {
+    
+    /**
+     * 孟加拉标题
+     */
+    @NotBlank(message = "孟加拉标题不能为空")
+    private String bnTitle;
+    
+    /**
+     * 英文标题
+     */
+    @NotBlank(message = "英文标题不能为空")
+    private String enTitle;
+    
+    /**
+     * 孟加拉内容
+     */
+    @NotBlank(message = "孟加拉内容不能为空")
+    private String bnContent;
+    
+    /**
+     * 英文内容
+     */
+    @NotBlank(message = "英文内容不能为空")
+    private String enContent;
+    
+    /**
+     * 分类ID
+     */
+    @NotNull(message = "分类ID不能为空")
+    private Long groupId;
+    
+    /**
+     * 删除标识
+     */
+    @NotNull(message = "删除标识不能为空")
+    private Boolean delFlag;
+    
+    /**
+     * 排序
+     */
+    @NotNull(message = "排序不能为空")
+    private Integer sort;
+    
+}

+ 77 - 0
cif-service/src/main/java/com/txz/cif/web/vo/QaListVO.java

@@ -0,0 +1,77 @@
+package com.txz.cif.web.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2026/1/19
+ */
+@Data
+public class QaListVO {
+    
+    private Long id;
+    
+    /**
+     * 孟加拉标题
+     */
+    private String bnTitle;
+    
+    /**
+     * 英文标题
+     */
+    private String enTitle;
+    
+    /**
+     * 创建人
+     */
+    private String createUser;
+    
+    /**
+     * 更新人
+     */
+    private String updateUser;
+    
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+    
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    
+    /**
+     * 删除标识
+     */
+    private Boolean delFlag;
+    
+    /**
+     * 分类删除标识
+     */
+    private Boolean groupDelFlag;
+    
+    /**
+     * 分类id
+     */
+    private Long groupId;
+    
+    /**
+     * 分类名称
+     */
+    private String groupBnName;
+    
+    /**
+     * 分类名称
+     */
+    private String groupEnName;
+    
+    /**
+     * 排序
+     */
+    private Integer sort;
+    
+}

+ 0 - 0
sql/20260107/20260107_recycle.sql → sql/20260107_recycle.sql


+ 30 - 0
sql/20260119_qa.sql

@@ -0,0 +1,30 @@
+CREATE TABLE `c_qa`
+(
+	`id` bigint NOT NULL AUTO_INCREMENT,
+	`bn_title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '孟加拉标题',
+	`en_title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '英文标题',
+	`bn_content` longtext COLLATE utf8mb4_unicode_ci COMMENT '孟加拉内容',
+	`en_content` longtext COLLATE utf8mb4_unicode_ci COMMENT '英文内容',
+	`create_user` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '创建人',
+	`update_user` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '更新人',
+	`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+	`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+	`del_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除标识',
+	`group_id` bigint NOT NULL COMMENT '分类id',
+	`sort` int DEFAULT '0' COMMENT '排序',
+	PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='qa问答';
+
+CREATE TABLE `c_qa_group`
+(
+	`id` bigint NOT NULL AUTO_INCREMENT,
+	`create_user` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '创建人',
+	`update_user` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '更新人',
+	`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+	`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+	`del_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除标识',
+	`bn_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '孟加拉分类名称',
+	`en_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '英文分类名称',
+	`sort` int DEFAULT '0' COMMENT '排序',
+	PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='qa分类';