- | _id | String | mongodb 对应的主键uuid | | --- | --- | --- | | name | String | 题干 | | optionA | String | 选项A | | optionB | String | 选项B | | sequence_number | int | 题目序号 | | valA | String | 选项A所对应的意义 | | valB | String | 选项B所对应的意义 |
- 结果对照表
- | _id | String | mongodb 对应的主键uuid | | --- | --- | --- | | ansCode | String | 性格测试结果字符串 | | ansDisc | String | 性格测试结果描述 | | ansName | String | 性格测试结果名称 | | sequence_number | int | 序号 |
Spring-Boot项目初始化
- 对于后端的搭建,是一个简单的Spring-Boot的项目,首先呢就是初始化一个Spring-Boot项目,经过一步一步的选择,我们便能得到一个什么都没有的Spring-Boot项目
- 不过值得注意的是,如果你的idea在初始化Spring-Boot项目的时候,只能选择java版本为17和21,但是你想使用java8时,请按照如下步骤进行操作
我们只知道IDEA页面创建Spring项目,其实是访问spring initializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。将start.spring.io/或者http://st… start.aliyun.com/
- 创建完成项目之后,需要在pom.xml中进行相关依赖的 引入(按需导入)
后台项目代码编写
任务点分解
那作为一个数据的提供后台,需要完成以下几个功能:
- 对于题目的管理功能(前面想着做一个相关题目的管理界面,就写了这部分接口,但是界面真的不是很想搭建,留给爱学习的小伙伴们或者后面有时间再说)目前没啥用
- 查询题目功能
- 计算性格属性功能
既然目标比较明确了,辣么问题也就好办了起来!
Spring-Boot+mongodb CRUD
以第一点对于题目的管理功能为例子,简单讲述一下Spring-Boot集成mongodb 进行数据的CRUD
- 首先,进行spring-mongo的依赖导入,详情见上文pom.xml的依赖,按需引入即可
- 进行简单的项目目录创建,简单的对于项目目录进行如下梳理
- /conf:存放一些配置文件
- /controller: 存放接口
- /dao:存放对应的实体类
- /service:存放一些service类
- /service/serviceImpl:存放具体的service的逻辑实现类
- /utils:存放通常的工具类
- 进行application.yml的配置
spring: data: mongodb:
主机地址
host: 127.0.0.1
数据库
database: MBTI
mongodb端口
port: 27017 main: allow-circular-references: true server: port: 8899
- 题目实体类(Topic)
/*** *性格测试题目类 */ @Document("mbtiTopic") //表名称 @Data @NoArgsConstructor @AllArgsConstructor public class Topic implements Serializable {
@Id //主键 private String id;
@Field
private String name;
@Field private String optionA;
@Field private String optionB;
@Indexed(unique = true) //唯一索引 @Field("sequence_number")//对应mongo中的字段,如果不对应,需要进行标注 private Integer sequenceNumber;
@Field private String valA;
@Field private String valB; }
- 接口实现
- TopicService
public interface TopicService { //查找全部 List findAll();
//按照id查询 Topic findById(int sequenceNumber);
//按照id 修改 Topic updateById(Topic topic);
//按照id删除 boolean delById(int sequenceNumber);
//插入 boolean insertOne(Topic topic);
}
- TopicServiceImpl
@Service public class TopicServiceImpl implements TopicService {
@Autowired private MongoTemplate mongoTemplate;
//查全部 @Override public List findAll() { return mongoTemplate.findAll(Topic.class); }
//查根据id查询 @Override public Topic findById(int sequenceNumber) { Query query = new Query(); query.addCriteria(Criteria.where("sequence_number").is(sequenceNumber)); Topic one = mongoTemplate.findOne(query, Topic.class); return one; }
//根据id更新 @Override public Topic updateById(Topic topic) { Topic save = mongoTemplate.save(topic); return save; } //根据id删除 @Override public boolean delById(int sequenceNumber) { Query query = new Query(); query.addCriteria(Criteria.where("sequence_number").is(sequenceNumber)); DeleteResult remove = mongoTemplate.remove(query, Topic.class); if (remove.getDeletedCount() > 0) { return true; } return false; }
//插入 @Override public boolean insertOne(Topic topic) { Topic save = mongoTemplate.save(topic); if (save != null) { return true; } return false; } }
- controller
@RestController @CrossOrigin @RequestMapping("/manage") public class manageController {
@Autowired private TopicService topicService; JSONObject jsonObject = new JSONObject();
//查询全部 @GetMapping("/getAll") public JSONObject getAll() { jsonObject.clear(); jsonObject.put("status", 200); jsonObject.put("data", topicService.findAll()); return jsonObject; }
//按照id查询 @GetMapping("/getById/{id}") public JSONObject findById(@PathVariable("id") int id) { jsonObject.clear(); Topic one = topicService.findById(id); if (one != null) { jsonObject.put("status", 200); jsonObject.put("data", one); } else { jsonObject.put("status", 200); jsonObject.put("data", null); } return jsonObject; }
//更新 @PutMapping("/update") public JSONObject updateById(@RequestBody Topic topic) { jsonObject.clear(); Topic one = topicService.updateById(topic); if (one != null) { jsonObject.put("status", 200); jsonObject.put("msg", "更新成功~"); } else { jsonObject.put("status", 201); jsonObject.put("msg", "更新失败~"); } return jsonObject; }
//删除 @GetMapping("/del/{id}") public JSONObject delById(@PathVariable("id") int id) { jsonObject.clear(); boolean isDel = topicService.delById(id); if (isDel) { jsonObject.put("status", 200); jsonObject.put("msg", "删除成功~"); } else { jsonObject.put("status", 201); jsonObject.put("msg", "删除失败~"); } return jsonObject; }
}
mongodb分页查询功能实现
- serviceImpl
public static final int DEFAULT_CURR_PAGE = 1;//默认第一页 public static final int DEFAULT_PAGE_SIZE = 1;//默认每页1条
public List getListWithCriteria(int page, int pageSize) { Query query = new Query();
// 分页查询 int Page = page < 0 ? PageParameter.DEFAULT_CURR_PAGE : page; int PageSize = pageSize < 0 ? PageParameter.DEFAULT_PAGE_SIZE : pageSize;
//此处为第几页,从第几条开始查,公式和sql一样,根据业务自行设置 query.skip((Page - 1) * PageSize); //每页条数 query.limit(PageSize); //调用find(),查出符合条件的数据 List topics = mongoTemplate.find(query, Topic.class); return topics;
}
- controller
//分页查询 @GetMapping("/getByPage/{page},{size}") public Object getByPage(@PathVariable("page") int page, @PathVariable("size") int size) { jsonObject.clear(); List listWithCriteria = topicService.getListWithCriteria(page, size); int size1 = listWithCriteria.size(); if (size1 > 0) { jsonObject.put("status", 200); jsonObject.put("data", listWithCriteria); jsonObject.put("endTag", false); } else { jsonObject.put("status", "201"); jsonObject.put("data", null); jsonObject.put("endTag", true); } return jsonObject; }
计算性格属性功能实现
思路:用户在移动端答题完成后将所有已选择题目的性格指标拼接成一个指标字符串提交给后端,后端通过遍历这个字符串,找出各个指标的数量,对应四个性格组别**“E-I”、“S-N”、“T-F”和“J-P”** ,按照前面所写的评分标准进行性格测试的结果计算。计算完成之后,返回给移动端进行渲染展示
- serviceImpl
public AnsReturn calculateAns(String string) { StringBuffer stringBuffer = new StringBuffer(string); HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < stringBuffer.length(); i++) { char a = stringBuffer.charAt(i); if (map.get(a) == null) { map.put(a, 1); } else { map.put(a, map.get(a) + 1); } } System.out.println(map.keySet()); System.out.println(map.values());
Integer e = (map.get('E') == null ? 0 : map.get('E')); Integer i = (map.get('I') == null ? 0 : map.get('I'));
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新