From 95ab62159057ed825a25870977ef2641fd704fab Mon Sep 17 00:00:00 2001 From: soul2 <1052986332@qq.com> Date: Mon, 11 Mar 2024 17:47:30 +0800 Subject: [PATCH] =?UTF-8?q?2024=E5=B9=B43=E6=9C=8811=E6=97=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 92 ++++++++++++++++--- pom.xml | 8 +- .../soul2/demo/controller/QrController.java | 62 +++++++++++++ src/main/java/cn/soul2/demo/dto/QrDTO.java | 62 +++++++++++++ src/main/java/cn/soul2/demo/entity/QrDO.java | 92 +++++++++++++++++++ .../java/cn/soul2/demo/mapper/QrMapper.java | 18 ++++ .../soul2/demo/repository/IQrRepository.java | 29 ++++++ .../repository/impl/QrRepositoryImpl.java | 71 ++++++++++++++ .../cn/soul2/demo/service/IQrService.java | 10 ++ .../cn/soul2/demo/service/QrServiceImpl.java | 12 +++ .../demo/utils/MybatisFastGenerator.java | 10 +- src/main/java/cn/soul2/demo/vo/QrVO.java | 53 +++++++++++ src/main/resources/application-cors.yml | 2 +- src/main/resources/application-datasource.yml | 6 +- src/main/resources/application.yml | 4 +- 15 files changed, 503 insertions(+), 28 deletions(-) create mode 100644 src/main/java/cn/soul2/demo/controller/QrController.java create mode 100644 src/main/java/cn/soul2/demo/dto/QrDTO.java create mode 100644 src/main/java/cn/soul2/demo/entity/QrDO.java create mode 100644 src/main/java/cn/soul2/demo/mapper/QrMapper.java create mode 100644 src/main/java/cn/soul2/demo/repository/IQrRepository.java create mode 100644 src/main/java/cn/soul2/demo/repository/impl/QrRepositoryImpl.java create mode 100644 src/main/java/cn/soul2/demo/service/IQrService.java create mode 100644 src/main/java/cn/soul2/demo/service/QrServiceImpl.java create mode 100644 src/main/java/cn/soul2/demo/vo/QrVO.java diff --git a/README.md b/README.md index 2b56b50..22440e2 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,87 @@ -# soul2-java-demo-version_1 +# **需求整理** -处于试验性质的Java模板 +## 一、 **二维码** -## 开始 +### 1. **二维码位置** -```bash -git clone http://gitea.soul2.cn/soul2/soul2-java-demo-version_1.git -``` +​ ● 以二维码的形式存在于教材各处,作用形式大约为课后习题或课中做调查问卷式的信息收集,每个二维码可在后台单独配置指向的URL页面 -## 分支 +​ ● 二维码的数量可变,但属于敏感操作 -- `master`: 上线 -- `develop`: 最新的开发版 +### 2. **页面来源** -## 运行 +页面来自第三方(如问卷星)或自建页面 -使用dev环境 -` -Dspring.profiles.active=dev` +### 3. **跳转** -2022年9月6日 第一版 By soul2 \ No newline at end of file +​ 扫描二维码后进入固定的URL,获取微信身份并进行转发到最终指向,以避免页面来源失效后需要替换页面的问题 + +## 二、 **后台功能** + +### 1、 **二维码指向管理** + +​ ● 可管理每个二维码指向的URL页面,但后台本身不负责URL页面的可访问性 + +​ ● 可增加二维码 + +### 2、 **信息解析** + +​ 解析二维码收集到的信息结果,呈现方式待定 + +## 三、 **第三方** + +### 1、 **问卷设置** + +通过第三方(如问卷星)设置问题和回答 + +### 2、 **结果返回** + +​ 通过第三方的数据推送将得到的结果存储到数据库中以待后台使用 + +​ 问卷星:https://www.wjx.cn/api.aspx + +## 四、 **数据库** + +### 1、 **二维码表** + +ToURL:指向的url + +Tip:注释 + +### 2、 **问卷表** + +QRId:指向的二维码id,多个问卷同时指向同一个二维码时取更新日期最新的一个 + +### 3、 **题目表** + +Title:题目标题 + +Content:题目描述 + +Type:题目类型【单选/多选/文字】 + +### 4、 **选项表** + +Content:选项内容 + +Weights:权重 + +Points:分值 + +### 5、 **问卷-题目表** + +连接问卷和题目 + +### 6、 **题目-选项表** + +连接问卷和选项 + +### 7、 **答卷表** + +存储问卷id,答卷时间日期等 + +答卷分完成和未完成 + +### 8、 **答卷选项表** + +存储答卷id,题目,选择的选项或回答内容以及得分情况 diff --git a/pom.xml b/pom.xml index b2db21c..e56dd4e 100644 --- a/pom.xml +++ b/pom.xml @@ -9,12 +9,12 @@ cn.soul2 - java-demo + jyjc-admin 0.0.1-SNAPSHOT - java-demo - java-demo + jyjc-admin + jyjc-admin - 11 + 8 diff --git a/src/main/java/cn/soul2/demo/controller/QrController.java b/src/main/java/cn/soul2/demo/controller/QrController.java new file mode 100644 index 0000000..b8c6370 --- /dev/null +++ b/src/main/java/cn/soul2/demo/controller/QrController.java @@ -0,0 +1,62 @@ +package cn.soul2.demo.controller; + +import cn.soul2.demo.dto.QrDTO; +import cn.soul2.demo.entity.QrDO; +import cn.soul2.demo.repository.IQrRepository; +import cn.soul2.demo.utils.base.BackUtils; +import cn.soul2.demo.utils.base.PageUtils; +import cn.soul2.demo.vo.QrVO; +import cn.soul2.demo.vo.base.Back; +import cn.soul2.demo.vo.base.VPage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Soul2 + * @date 2024-03-11 15:16 + */ + +@Slf4j +@RestController +@RequestMapping("/qr") +public class QrController { + + @Autowired + IQrRepository qrRepository; + + @PostMapping("/page") + Back> page(@RequestBody QrDTO dto) { + VPage page = qrRepository.page(dto); + VPage toPage = PageUtils.to(page, page.getRows().stream().map(e -> { + QrVO vo = new QrVO(); + BeanUtils.copyProperties(e, vo); + return vo; + }).collect(Collectors.toList())); + return BackUtils.success(toPage); + } + + @PostMapping("/saveOrUpdate") + Back saveOrUpdate(@RequestBody List dtos) { + return BackUtils.success(qrRepository.saveOrUpdate(dtos)); + } + + @PostMapping("/remove") + Back remove(@RequestBody List ids) { + return BackUtils.success(qrRepository.remove(ids)); + } + + @PostMapping("status") + public Back status(@RequestBody QrDTO dto) { + return BackUtils.success(qrRepository.status(dto)); + } + + +} diff --git a/src/main/java/cn/soul2/demo/dto/QrDTO.java b/src/main/java/cn/soul2/demo/dto/QrDTO.java new file mode 100644 index 0000000..80b1c2b --- /dev/null +++ b/src/main/java/cn/soul2/demo/dto/QrDTO.java @@ -0,0 +1,62 @@ +package cn.soul2.demo.dto; + +import cn.soul2.demo.dto.base.PageParams; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * @author Soul2 + * @date 2024-03-11 14:35 + */ + +@Data +@Accessors(chain = true) +public class QrDTO extends PageParams { + + /** + * 二维码id + */ + private String id; + + /** + * 指向的URL + */ + private String toUrl; + + /** + * 问卷id + */ + private String qnId; + + /** + * 状态:0:禁用;1:启用; + */ + private Integer status; + + + /** + * 开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + /** + * 结束时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + /** + * 注释 + */ + private String tip; + + /** + * 二维码url + */ + private String qrUrl; + +} diff --git a/src/main/java/cn/soul2/demo/entity/QrDO.java b/src/main/java/cn/soul2/demo/entity/QrDO.java new file mode 100644 index 0000000..622dd3f --- /dev/null +++ b/src/main/java/cn/soul2/demo/entity/QrDO.java @@ -0,0 +1,92 @@ +package cn.soul2.demo.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 二维码表 + *

+ * + * @author Soul2 + * @since 2024-03-11 17:01:53 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("tb_qr") +public class QrDO extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 二维码id + */ + @TableField("id") + private String id; + + /** + * 指向的URL + */ + @TableField("to_url") + private String toUrl; + + /** + * 问卷id + */ + @TableField("qn_id") + private String qnId; + + /** + * 注释 + */ + @TableField("tip") + private String tip; + + /** + * 二维码url + */ + @TableField("qr_url") + private String qrUrl; + + /** + * 状态:0:禁用;1:启用; + */ + @TableField("status") + private Integer status; + + /** + * 更新时间 + */ + @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updatedTime; + + /** + * 创建时间 + */ + @TableField(value = "created_time", fill = FieldFill.INSERT) + private LocalDateTime createdTime; + + /** + * 删除标识: 0-存在; 1-删除 + */ + @TableField("removed") + @TableLogic + private Integer removed; + + + @Override + public Serializable pkVal() { + return null; + } + +} diff --git a/src/main/java/cn/soul2/demo/mapper/QrMapper.java b/src/main/java/cn/soul2/demo/mapper/QrMapper.java new file mode 100644 index 0000000..e890bbd --- /dev/null +++ b/src/main/java/cn/soul2/demo/mapper/QrMapper.java @@ -0,0 +1,18 @@ +package cn.soul2.demo.mapper; + +import cn.soul2.demo.entity.QrDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 二维码表 Mapper 接口 + *

+ * + * @author Soul2 + * @since 2024-03-11 14:28:45 + */ +@Mapper +public interface QrMapper extends BaseMapper { + +} diff --git a/src/main/java/cn/soul2/demo/repository/IQrRepository.java b/src/main/java/cn/soul2/demo/repository/IQrRepository.java new file mode 100644 index 0000000..1a62699 --- /dev/null +++ b/src/main/java/cn/soul2/demo/repository/IQrRepository.java @@ -0,0 +1,29 @@ +package cn.soul2.demo.repository; + +import cn.soul2.demo.dto.QrDTO; +import cn.soul2.demo.entity.QrDO; +import cn.soul2.demo.vo.QrVO; +import cn.soul2.demo.vo.base.VPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.Collection; + +/** + *

+ * 二维码表 服务类 + *

+ * + * @author Soul2 + * @since 2024-03-11 14:28:45 + */ +public interface IQrRepository extends IService { + + VPage page(QrDTO dto); + + Boolean saveOrUpdate(Collection dtos); + + Boolean remove(Collection ids); + + + boolean status(QrDTO status); +} diff --git a/src/main/java/cn/soul2/demo/repository/impl/QrRepositoryImpl.java b/src/main/java/cn/soul2/demo/repository/impl/QrRepositoryImpl.java new file mode 100644 index 0000000..7357e34 --- /dev/null +++ b/src/main/java/cn/soul2/demo/repository/impl/QrRepositoryImpl.java @@ -0,0 +1,71 @@ +package cn.soul2.demo.repository.impl; + +import cn.soul2.demo.dto.QrDTO; +import cn.soul2.demo.entity.QrDO; +import cn.soul2.demo.mapper.QrMapper; +import cn.soul2.demo.repository.IQrRepository; +import cn.soul2.demo.utils.base.PageUtils; +import cn.soul2.demo.vo.QrVO; +import cn.soul2.demo.vo.base.VPage; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 二维码表 服务实现类 + *

+ * + * @author Soul2 + * @since 2024-03-11 14:28:45 + */ +@Service +public class QrRepositoryImpl extends ServiceImpl implements IQrRepository { + + + @Override + public VPage page(QrDTO dto) { + LambdaQueryWrapper query = Wrappers.lambdaQuery(); + query.likeRight(StringUtils.isNotBlank(dto.getTip()), QrDO::getTip, dto.getTip()) + .eq(StringUtils.isNotBlank(dto.getId()), QrDO::getId, dto.getId()); + if (dto.getStartTime() != null && dto.getEndTime() != null) { + query.between(QrDO::getUpdatedTime, dto.getStartTime(), dto.getEndTime()); + } else { + query.ge(dto.getStartTime() != null, QrDO::getUpdatedTime, dto.getStartTime()) + .le(dto.getEndTime() != null, QrDO::getUpdatedTime, dto.getEndTime()); + } + query.orderByDesc(QrDO::getUpdatedTime).orderByDesc(QrDO::getCreatedTime); + return PageUtils.to(super.page(PageUtils.build(dto))); + } + + @Override + public Boolean saveOrUpdate(Collection dtos) { + List list = dtos.stream().map(dto -> { + QrDO r = new QrDO(); + BeanUtils.copyProperties(dto, r); + return r; + }).collect(Collectors.toList()); + return super.saveOrUpdateBatch(list); + } + + @Override + public Boolean remove(Collection ids) { + return super.removeBatchByIds(ids); + } + + @Override + public boolean status(QrDTO status) { + LambdaUpdateWrapper update = Wrappers.lambdaUpdate(); + QrDO qr = new QrDO(); + BeanUtils.copyProperties(status, qr); + return updateById(qr); + } +} diff --git a/src/main/java/cn/soul2/demo/service/IQrService.java b/src/main/java/cn/soul2/demo/service/IQrService.java new file mode 100644 index 0000000..1468055 --- /dev/null +++ b/src/main/java/cn/soul2/demo/service/IQrService.java @@ -0,0 +1,10 @@ +package cn.soul2.demo.service; + +/** + * @author Soul2 + * @date 2024-03-11 15:20 + */ + +public interface IQrService { + +} diff --git a/src/main/java/cn/soul2/demo/service/QrServiceImpl.java b/src/main/java/cn/soul2/demo/service/QrServiceImpl.java new file mode 100644 index 0000000..7bdc49f --- /dev/null +++ b/src/main/java/cn/soul2/demo/service/QrServiceImpl.java @@ -0,0 +1,12 @@ +package cn.soul2.demo.service; + +import org.springframework.stereotype.Service; + +/** + * @author Soul2 + * @date 2024-03-11 15:20 + */ + +@Service +public class QrServiceImpl implements IQrService { +} diff --git a/src/main/java/cn/soul2/demo/utils/MybatisFastGenerator.java b/src/main/java/cn/soul2/demo/utils/MybatisFastGenerator.java index ecc8e5d..5c7a83d 100644 --- a/src/main/java/cn/soul2/demo/utils/MybatisFastGenerator.java +++ b/src/main/java/cn/soul2/demo/utils/MybatisFastGenerator.java @@ -19,15 +19,15 @@ public class MybatisFastGenerator { private static final DatasourceConfig DATASOURCE_CONFIG = new DatasourceConfig( "Soul2", - "jdbc:mysql://next.soul2.cn:3306/cn_soul2?characterEncoding=utf8&serverTimezone=GMT%2B8", - "buildemo", - "86ba@qybgz" + "jdbc:mysql://localhost:3306/pioneer?characterEncoding=utf8&serverTimezone=GMT%2B8", + "root", + "123456" ); /** * 设置需要生成的表名 */ private static final String[] TABLE_NAMES = { - "data_table_demo" + "tb_qr" }; /** * 模块名称 @@ -42,7 +42,7 @@ public class MybatisFastGenerator { * 设置过滤表前缀 */ private static final String[] TABLE_PREFIX = { - "b_", "r_" + "b_", "r_", "tb_" }; private static FastAutoGenerator generator(Boolean update) { diff --git a/src/main/java/cn/soul2/demo/vo/QrVO.java b/src/main/java/cn/soul2/demo/vo/QrVO.java new file mode 100644 index 0000000..c88d207 --- /dev/null +++ b/src/main/java/cn/soul2/demo/vo/QrVO.java @@ -0,0 +1,53 @@ +package cn.soul2.demo.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * @author Soul2 + * @date 2024-03-11 15:16 + */ + +@Data +@Accessors(chain = true) +public class QrVO { + + /** + * 二维码id + */ + private String id; + + /** + * 指向的URL + */ + private String toUrl; + + /** + * 问卷id + */ + private String qnId; + + /** + * 状态:0:禁用;1:启用; + */ + private Integer status; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updatedTime; + + /** + * 注释 + */ + private String tip; + + /** + * 二维码url + */ + private String qrUrl; +} diff --git a/src/main/resources/application-cors.yml b/src/main/resources/application-cors.yml index c450caa..5b1dfce 100644 --- a/src/main/resources/application-cors.yml +++ b/src/main/resources/application-cors.yml @@ -10,7 +10,7 @@ spring: on-profile: dev cors: - allow-origin: http://localhost:6901 + allow-origin: http://localhost:6100 --- spring: diff --git a/src/main/resources/application-datasource.yml b/src/main/resources/application-datasource.yml index d80bfb9..4e6b0c2 100644 --- a/src/main/resources/application-datasource.yml +++ b/src/main/resources/application-datasource.yml @@ -1,8 +1,8 @@ spring.datasource.druid: # MySQL - url: jdbc:mysql://next.soul2.cn:3306/cn_soul2?characterEncoding=utf8&serverTimezone=GMT%2B8 - username: buildemo - password: 86ba@qybgz + url: jdbc:mysql://localhost:3306/pioneer?characterEncoding=utf8&serverTimezone=GMT%2B8 + username: root + password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # 连接池配置 initial-size: 1 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ae9b057..80997c9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,12 +1,12 @@ server: #端口 - port: 7301 + port: 7600 #上下文 servlet.context-path: / spring: - application.name: java-demo + application.name: jyjc-admin profiles.include: datasource,mybatis-plus,cors