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<TitleVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询题目列表 + */ + @Override + public List<TitleVo> queryList(TitleBo bo) { + LambdaQueryWrapper<Title> lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper<Title> buildQueryWrapper(TitleBo bo) { + Map<String, Object> params = bo.getParams(); + LambdaQueryWrapper<Title> 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<Long> ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +}