网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
后台项目代码编写
任务点分解
那作为一个数据的提供后台,需要完成以下几个功能:
- 对于题目的管理功能(前面想着做一个相关题目的管理界面,就写了这部分接口,但是界面真的不是很想搭建,留给爱学习的小伙伴们或者后面有时间再说)目前没啥用
- 查询题目功能
- 计算性格属性功能
既然目标比较明确了,辣么问题也就好办了起来!
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’));
Integer s = (map.get(‘S’) == null ? 0 : map.get(‘S’));
Integer n = (map.get(‘N’) == null ? 0 : map.get(‘N’));
Integer t = (map.get(‘T’) == null ? 0 : map.get(‘T’));
Integer f = (map.get(‘F’) == null ? 0 : map.get(‘F’));
Integer j = (map.get(‘J’) == null ? 0 : map.get(‘J’));
Integer p = (map.get(‘P’) == null ? 0 : map.get(‘P’));
//计算比率
DecimalFormat decimalFormat = new DecimalFormat(“0.00”);
String eRate = decimalFormat.format(((double) e / stringBuffer.length()) * 100);
String iRate = decimalFormat.format(((double) i / stringBuffer.length()) * 100);
String sRate = decimalFormat.format(((double) s / stringBuffer.length()) * 100);
String nRate = decimalFormat.format(((double) n / stringBuffer.length()) * 100);
String tRate = decimalFormat.format(((double) t / stringBuffer.length()) * 100);
String fRate = decimalFormat.format(((double) f / stringBuffer.length()) * 100);
String jRate = decimalFormat.format(((double) j / stringBuffer.length()) * 100);
String pRate = decimalFormat.format(((double) p / stringBuffer.length()) * 100);
//拼接结果
StringBuffer res = new StringBuffer();
res = e > i ? res.append(“E”) : res.append(‘I’);
res = s > n ? res.append(‘S’) : res.append(‘N’);
res = t > f ? res.append(‘T’) : res.append(‘F’);
res = j > p ? res.append(‘J’) : res.append(‘P’);
Query query = new Query();
query.addCriteria(Criteria.where(“ansCode”).is(res.toString()));//从字典表中获取性格结果信息
AnsBasic one = mongoTemplate.findOne(query, AnsBasic.class);
AnsReturn ans = new AnsReturn(res.toString(), eRate, iRate, sRate, nRate, tRate, fRate, jRate, pRate, one.getName(), one.getDisc());
return ans;
}
- controller
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
ps://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
[外链图片转存中…(img-4LW37RBp-1715243673907)]
[外链图片转存中…(img-Dec0RcgV-1715243673907)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新