2024年3月11日

soul2/mobile_api
soul2 1 year ago
parent dd590b6cf6
commit 95ab621590
  1. 92
      README.md
  2. 8
      pom.xml
  3. 62
      src/main/java/cn/soul2/demo/controller/QrController.java
  4. 62
      src/main/java/cn/soul2/demo/dto/QrDTO.java
  5. 92
      src/main/java/cn/soul2/demo/entity/QrDO.java
  6. 18
      src/main/java/cn/soul2/demo/mapper/QrMapper.java
  7. 29
      src/main/java/cn/soul2/demo/repository/IQrRepository.java
  8. 71
      src/main/java/cn/soul2/demo/repository/impl/QrRepositoryImpl.java
  9. 10
      src/main/java/cn/soul2/demo/service/IQrService.java
  10. 12
      src/main/java/cn/soul2/demo/service/QrServiceImpl.java
  11. 10
      src/main/java/cn/soul2/demo/utils/MybatisFastGenerator.java
  12. 53
      src/main/java/cn/soul2/demo/vo/QrVO.java
  13. 2
      src/main/resources/application-cors.yml
  14. 6
      src/main/resources/application-datasource.yml
  15. 4
      src/main/resources/application.yml

@ -1,21 +1,87 @@
# soul2-java-demo-version_1 # **需求整理**
处于试验性质的Java模板 ## 一、 **二维码**
## 开始 ### 1. **二维码位置**
```bash ● 以二维码的形式存在于教材各处,作用形式大约为课后习题或课中做调查问卷式的信息收集,每个二维码可在后台单独配置指向的URL页面
git clone http://gitea.soul2.cn/soul2/soul2-java-demo-version_1.git
```
## 分支 ● 二维码的数量可变,但属于敏感操作
- `master`: 上线 ### 2. **页面来源**
- `develop`: 最新的开发版
## 运行 页面来自第三方(如问卷星)或自建页面
使用dev环境 ### 3. **跳转**
` -Dspring.profiles.active=dev`
2022年9月6日 第一版 By soul2 扫描二维码后进入固定的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,题目,选择的选项或回答内容以及得分情况

@ -9,12 +9,12 @@
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>cn.soul2</groupId> <groupId>cn.soul2</groupId>
<artifactId>java-demo</artifactId> <artifactId>jyjc-admin</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<name>java-demo</name> <name>jyjc-admin</name>
<description>java-demo</description> <description>jyjc-admin</description>
<properties> <properties>
<java.version>11</java.version> <java.version>8</java.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>

@ -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<VPage<QrVO>> page(@RequestBody QrDTO dto) {
VPage<QrDO> page = qrRepository.page(dto);
VPage<QrVO> 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<Boolean> saveOrUpdate(@RequestBody List<QrVO> dtos) {
return BackUtils.success(qrRepository.saveOrUpdate(dtos));
}
@PostMapping("/remove")
Back<Boolean> remove(@RequestBody List<String> ids) {
return BackUtils.success(qrRepository.remove(ids));
}
@PostMapping("status")
public Back<Boolean> status(@RequestBody QrDTO dto) {
return BackUtils.success(qrRepository.status(dto));
}
}

@ -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;
}

@ -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;
/**
* <p>
* 二维码表
* </p>
*
* @author Soul2
* @since 2024-03-11 17:01:53
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("tb_qr")
public class QrDO extends Model<QrDO> {
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;
}
}

@ -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;
/**
* <p>
* 二维码表 Mapper 接口
* </p>
*
* @author Soul2
* @since 2024-03-11 14:28:45
*/
@Mapper
public interface QrMapper extends BaseMapper<QrDO> {
}

@ -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;
/**
* <p>
* 二维码表 服务类
* </p>
*
* @author Soul2
* @since 2024-03-11 14:28:45
*/
public interface IQrRepository extends IService<QrDO> {
VPage<QrDO> page(QrDTO dto);
Boolean saveOrUpdate(Collection<QrVO> dtos);
Boolean remove(Collection<String> ids);
boolean status(QrDTO status);
}

@ -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;
/**
* <p>
* 二维码表 服务实现类
* </p>
*
* @author Soul2
* @since 2024-03-11 14:28:45
*/
@Service
public class QrRepositoryImpl extends ServiceImpl<QrMapper, QrDO> implements IQrRepository {
@Override
public VPage<QrDO> page(QrDTO dto) {
LambdaQueryWrapper<QrDO> 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<QrVO> dtos) {
List<QrDO> 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<String> ids) {
return super.removeBatchByIds(ids);
}
@Override
public boolean status(QrDTO status) {
LambdaUpdateWrapper<QrDO> update = Wrappers.lambdaUpdate();
QrDO qr = new QrDO();
BeanUtils.copyProperties(status, qr);
return updateById(qr);
}
}

@ -0,0 +1,10 @@
package cn.soul2.demo.service;
/**
* @author Soul2
* @date 2024-03-11 15:20
*/
public interface IQrService {
}

@ -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 {
}

@ -19,15 +19,15 @@ public class MybatisFastGenerator {
private static final DatasourceConfig DATASOURCE_CONFIG = new DatasourceConfig( private static final DatasourceConfig DATASOURCE_CONFIG = new DatasourceConfig(
"Soul2", "Soul2",
"jdbc:mysql://next.soul2.cn:3306/cn_soul2?characterEncoding=utf8&serverTimezone=GMT%2B8", "jdbc:mysql://localhost:3306/pioneer?characterEncoding=utf8&serverTimezone=GMT%2B8",
"buildemo", "root",
"86ba@qybgz" "123456"
); );
/** /**
* 设置需要生成的表名 * 设置需要生成的表名
*/ */
private static final String[] TABLE_NAMES = { private static final String[] TABLE_NAMES = {
"data_table_demo" "tb_qr"
}; };
/** /**
* 模块名称 * 模块名称
@ -42,7 +42,7 @@ public class MybatisFastGenerator {
* 设置过滤表前缀 * 设置过滤表前缀
*/ */
private static final String[] TABLE_PREFIX = { private static final String[] TABLE_PREFIX = {
"b_", "r_" "b_", "r_", "tb_"
}; };
private static FastAutoGenerator generator(Boolean update) { private static FastAutoGenerator generator(Boolean update) {

@ -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;
}

@ -10,7 +10,7 @@ spring:
on-profile: dev on-profile: dev
cors: cors:
allow-origin: http://localhost:6901 allow-origin: http://localhost:6100
--- ---
spring: spring:

@ -1,8 +1,8 @@
spring.datasource.druid: spring.datasource.druid:
# MySQL # MySQL
url: jdbc:mysql://next.soul2.cn:3306/cn_soul2?characterEncoding=utf8&serverTimezone=GMT%2B8 url: jdbc:mysql://localhost:3306/pioneer?characterEncoding=utf8&serverTimezone=GMT%2B8
username: buildemo username: root
password: 86ba@qybgz password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
# 连接池配置 # 连接池配置
initial-size: 1 initial-size: 1

@ -1,12 +1,12 @@
server: server:
#端口 #端口
port: 7301 port: 7600
#上下文 #上下文
servlet.context-path: / servlet.context-path: /
spring: spring:
application.name: java-demo application.name: jyjc-admin
profiles.include: datasource,mybatis-plus,cors profiles.include: datasource,mybatis-plus,cors

Loading…
Cancel
Save