diff --git a/pom.xml b/pom.xml
index 6ee5f5b5a..089de37ce 100644
--- a/pom.xml
+++ b/pom.xml
@@ -341,6 +341,12 @@
${revision}
+
+ org.dromara
+ ruoyi-question
+ ${revision}
+
+
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 81933591e..9e9067843 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -54,6 +54,11 @@
ruoyi-system
+
+ org.dromara
+ ruoyi-question
+
+
org.dromara
ruoyi-job
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index b168542db..7a738a6f8 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -43,9 +43,9 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
- url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
- username: root
- password: root
+ url: jdbc:mysql://82.156.195.142:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+ username: ry-vue
+ password: cMrKGAJXR3NcfXM7
# 从库数据源
slave:
lazy: true
@@ -96,13 +96,13 @@ spring:
spring.data:
redis:
# 地址
- host: localhost
+ host: 82.156.195.142
# 端口,默认为6379
port: 6379
# 数据库索引
database: 0
# 密码(如没有密码请注释掉)
- # password:
+ password: 123456ZHYD
# 连接超时时间
timeout: 10s
# 是否开启ssl
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 148b50e98..03288b448 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -47,8 +47,8 @@ spring:
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
- username: root
- password: root
+ username: ry-vue
+ password: cMrKGAJXR3NcfXM7
# 从库数据源
slave:
lazy: true
diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml
index 4044916fb..d7390c5a4 100644
--- a/ruoyi-modules/pom.xml
+++ b/ruoyi-modules/pom.xml
@@ -14,6 +14,7 @@
ruoyi-generator
ruoyi-job
ruoyi-system
+ ruoyi-question
ruoyi-modules
diff --git a/ruoyi-modules/ruoyi-question/pom.xml b/ruoyi-modules/ruoyi-question/pom.xml
new file mode 100644
index 000000000..69b50c094
--- /dev/null
+++ b/ruoyi-modules/ruoyi-question/pom.xml
@@ -0,0 +1,95 @@
+
+
+
+ ruoyi-modules
+ org.dromara
+ ${revision}
+
+ 4.0.0
+
+ ruoyi-question
+
+
+ question系统模块
+
+
+
+
+
+ org.dromara
+ ruoyi-common-core
+
+
+
+ org.dromara
+ ruoyi-common-doc
+
+
+
+ org.dromara
+ ruoyi-common-mybatis
+
+
+
+ org.dromara
+ ruoyi-common-translation
+
+
+
+
+ org.dromara
+ ruoyi-common-oss
+
+
+
+ org.dromara
+ ruoyi-common-log
+
+
+
+
+ org.dromara
+ ruoyi-common-excel
+
+
+
+
+ org.dromara
+ ruoyi-common-sms
+
+
+
+ org.dromara
+ ruoyi-common-tenant
+
+
+
+ org.dromara
+ ruoyi-common-security
+
+
+
+ org.dromara
+ ruoyi-common-web
+
+
+
+ org.dromara
+ ruoyi-common-idempotent
+
+
+
+ org.dromara
+ ruoyi-common-sensitive
+
+
+
+ org.dromara
+ ruoyi-common-encrypt
+
+
+
+
+
diff --git a/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/controller/TitleController.java b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/controller/TitleController.java
new file mode 100644
index 000000000..5e7f061c2
--- /dev/null
+++ b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/controller/TitleController.java
@@ -0,0 +1,105 @@
+package org.dromara.question.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.question.domain.vo.TitleVo;
+import org.dromara.question.domain.bo.TitleBo;
+import org.dromara.question.service.ITitleService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 题目
+ *
+ * @author Lion Li
+ * @date 2023-11-08
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/question/title")
+public class TitleController extends BaseController {
+
+ private final ITitleService titleService;
+
+ /**
+ * 查询题目列表
+ */
+ @SaCheckPermission("question:title:list")
+ @GetMapping("/list")
+ public TableDataInfo list(TitleBo bo, PageQuery pageQuery) {
+ return titleService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出题目列表
+ */
+ @SaCheckPermission("question:title:export")
+ @Log(title = "题目", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(TitleBo bo, HttpServletResponse response) {
+ List list = titleService.queryList(bo);
+ ExcelUtil.exportExcel(list, "题目", TitleVo.class, response);
+ }
+
+ /**
+ * 获取题目详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("question:title:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(titleService.queryById(id));
+ }
+
+ /**
+ * 新增题目
+ */
+ @SaCheckPermission("question:title:add")
+ @Log(title = "题目", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody TitleBo bo) {
+ return toAjax(titleService.insertByBo(bo));
+ }
+
+ /**
+ * 修改题目
+ */
+ @SaCheckPermission("question:title:edit")
+ @Log(title = "题目", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody TitleBo bo) {
+ return toAjax(titleService.updateByBo(bo));
+ }
+
+ /**
+ * 删除题目
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("question:title:remove")
+ @Log(title = "题目", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(titleService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/domain/Title.java b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/domain/Title.java
new file mode 100644
index 000000000..ef987b8f8
--- /dev/null
+++ b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/domain/Title.java
@@ -0,0 +1,41 @@
+package org.dromara.question.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 题目对象 f_questions
+ *
+ * @author Lion Li
+ * @date 2023-11-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("f_questions")
+public class Title extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 题目
+ */
+ private String question;
+
+ /**
+ * 题目标签类型
+ */
+ private Long labelId;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/domain/bo/TitleBo.java b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/domain/bo/TitleBo.java
new file mode 100644
index 000000000..5f1bd1d92
--- /dev/null
+++ b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/domain/bo/TitleBo.java
@@ -0,0 +1,42 @@
+package org.dromara.question.domain.bo;
+
+import org.dromara.question.domain.Title;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 题目业务对象 f_questions
+ *
+ * @author Lion Li
+ * @date 2023-11-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Title.class, reverseConvertGenerate = false)
+public class TitleBo extends BaseEntity {
+
+ /**
+ *
+ */
+ @NotNull(message = "不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 题目
+ */
+ @NotBlank(message = "题目不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String question;
+
+ /**
+ * 题目标签类型
+ */
+ @NotNull(message = "题目标签类型不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long labelId;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/domain/vo/TitleVo.java b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/domain/vo/TitleVo.java
new file mode 100644
index 000000000..ad05754ee
--- /dev/null
+++ b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/domain/vo/TitleVo.java
@@ -0,0 +1,50 @@
+package org.dromara.question.domain.vo;
+
+import org.dromara.question.domain.Title;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 题目视图对象 f_questions
+ *
+ * @author Lion Li
+ * @date 2023-11-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = Title.class)
+public class TitleVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 题目
+ */
+ @ExcelProperty(value = "题目")
+ private String question;
+
+ /**
+ * 题目标签类型
+ */
+ @ExcelProperty(value = "题目标签类型")
+ private Long labelId;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/mapper/TitleMapper.java b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/mapper/TitleMapper.java
new file mode 100644
index 000000000..59e2c4706
--- /dev/null
+++ b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/mapper/TitleMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.question.mapper;
+
+import org.dromara.question.domain.Title;
+import org.dromara.question.domain.vo.TitleVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 题目Mapper接口
+ *
+ * @author Lion Li
+ * @date 2023-11-08
+ */
+public interface TitleMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/service/ITitleService.java b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/service/ITitleService.java
new file mode 100644
index 000000000..1f5f68c42
--- /dev/null
+++ b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/service/ITitleService.java
@@ -0,0 +1,49 @@
+package org.dromara.question.service;
+
+import org.dromara.question.domain.Title;
+import org.dromara.question.domain.vo.TitleVo;
+import org.dromara.question.domain.bo.TitleBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 题目Service接口
+ *
+ * @author Lion Li
+ * @date 2023-11-08
+ */
+public interface ITitleService {
+
+ /**
+ * 查询题目
+ */
+ TitleVo queryById(Long id);
+
+ /**
+ * 查询题目列表
+ */
+ TableDataInfo queryPageList(TitleBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询题目列表
+ */
+ List queryList(TitleBo bo);
+
+ /**
+ * 新增题目
+ */
+ Boolean insertByBo(TitleBo bo);
+
+ /**
+ * 修改题目
+ */
+ Boolean updateByBo(TitleBo bo);
+
+ /**
+ * 校验并批量删除题目信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/service/impl/TitleServiceImpl.java b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/service/impl/TitleServiceImpl.java
new file mode 100644
index 000000000..4138cf2e1
--- /dev/null
+++ b/ruoyi-modules/ruoyi-question/src/main/java/org/dromara/question/service/impl/TitleServiceImpl.java
@@ -0,0 +1,110 @@
+package org.dromara.question.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.question.domain.bo.TitleBo;
+import org.dromara.question.domain.vo.TitleVo;
+import org.dromara.question.domain.Title;
+import org.dromara.question.mapper.TitleMapper;
+import org.dromara.question.service.ITitleService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 题目Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2023-11-08
+ */
+@RequiredArgsConstructor
+@Service
+public class TitleServiceImpl implements ITitleService {
+
+ private final TitleMapper baseMapper;
+
+ /**
+ * 查询题目
+ */
+ @Override
+ public TitleVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询题目列表
+ */
+ @Override
+ public TableDataInfo queryPageList(TitleBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询题目列表
+ */
+ @Override
+ public List queryList(TitleBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(TitleBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getQuestion()), Title::getQuestion, bo.getQuestion());
+ lqw.eq(bo.getLabelId() != null, Title::getLabelId, bo.getLabelId());
+ return lqw;
+ }
+
+ /**
+ * 新增题目
+ */
+ @Override
+ public Boolean insertByBo(TitleBo bo) {
+ Title add = MapstructUtils.convert(bo, Title.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改题目
+ */
+ @Override
+ public Boolean updateByBo(TitleBo bo) {
+ Title update = MapstructUtils.convert(bo, Title.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(Title entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除题目
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}