文章目录
一、前期环境准备
由于并不打算从零开始,只是为了验证一下我设计的接口。所以最便捷的方法是使用一个用了mybatis-plus的项目,github上随便找,从里面开始着手,而且数据库我已经建立好了。
二、接口设计:用于上报用例数据
类型: POST
URL: http://127.0.0.1:9998/api/create-task
请求示例:
请求头
Content-Type: application/json
请求体:
{
"user_id": "wangjinsong02@m.com",
"upload_time": "1672531200",
"case_name": "test_case_1",
"test_package": "com.example.app",
"test_process": "com.example.app.process",
"test_package_ver": "1.0.0",
"platform": "Android",
"device_id": "device123",
"device_mode": "Model X",
"cpu": " arm X",
"screen": "1080x1920",
"system_version": "10",
"data_overview": {
"app_cpu_avg": "10%",
"total_cpu_avg": "20%",
"app_memory_avg": "100MB",
"total_memory_avg": "200MB",
"app_memory_peak": "150MB",
"fps_avg": "60",
"send_traffic_avg": "50KB",
"recieve_traffic_avg": "100KB",
"small_jank": "2",
"big_jank": "1",
"jank": "3",
"b_temp_avg": "30C",
"b_temp_range": "25C-35C"
},
"data_list": [
{
"app_cpu_rate": "15%",
"system_cpu_rate": "25%",
"memory_usage": "120MB",
"pid_rx": "60KB",
"pid_tx": "70KB",
"fps": "55",
"small_jank": "1",
"big_jank": "0",
"focus_window": "Main Activity",
"temperature": "32C",
"date_time": "2024/6/20 15:38:27"
},
{
"app_cpu_rate": "18%",
"system_cpu_rate": "28%",
"memory_usage": "130MB",
"pid_rx": "70KB",
"pid_tx": "80KB",
"fps": "58",
"small_jank": "2",
"big_jank": "1",
"focus_window": "Settings Activity",
"temperature": "33C",
"date_time": "2024/6/20 15:39:27"
}
]
}
返回示例:
{
"status": 200,
"message": "Data uploaded successfully",
"data": {
"case_id": "upload001"
}
}
三、详细步骤
1.接口分析
这是一个提交接口,提交的内容涉及到四个表单。所以目前需要一个新的VO来承载这些数据,并且我希望四个实体类能利用这VO初始化自己的属性。要关注的有两个点:用户id如果数据库中已经存在就不插入用户表,否则插入用户表,密码为默认;时间如果传过来为空那么自己设定为当前时间。
2.controller 层
@PostMapping("/create-task")
public ResponseEntity<Map<String, Object>> createTask(@RequestBody TaskRequestVO taskRequestVO) {
taskRequestVO.setCaseId(generateCaseId(taskRequestVO.getCaseName()));
System.out.println("caseId: " + taskRequestVO.getCaseId());
Task createdTask = taskService.createTask(taskRequestVO.getTask());
Device createdDevice = taskService.createDevice (taskRequestVO.getDevice ());
List<CaseDetail> createdCaceDetails = taskService.createCaceDetail(taskRequestVO.getCaseDetails());
User createdUser = taskService.createUser(taskRequestVO.getUser());
Map<String, Object> response = new HashMap<>();
response.put("status", 200);
response.put("message", "Data uploaded successfully");
response.put("task", createdTask);
response.put("Device", createdDevice);
response.put("CaceDetail", createdCaceDetails);
response.put("User", createdUser);
return ResponseEntity.ok(response);
}
3.service 层
service
public interface TaskService {
List<TaskVO> getAllTasks();
Task createTask(Task task);
Device createDevice(Device device);
List<CaseDetail> createCaceDetail( List<CaseDetail> createdCaceDetails);
User createUser(User user);
}
serviceimpl
@Override
public Task createTask(Task task) {
taskMapper.insert(task);
return task;
}
@Override
public Device createDevice(Device device) {
// 实现创建设备的逻辑
if (deviceMapper.selectById(device.getDeviceId())!=null)
return null;
deviceMapper.insert(device);
return device;
}
@Override
public List<CaseDetail> createCaceDetail( List<CaseDetail> createdCaceDetails){
caceDetailMapper.insertCaseDetails(createdCaceDetails);
return createdCaceDetails;
}
@Override
public User createUser(User user) {
// 实现创建用户的逻辑
if (userMapper.selectById(user.getUserId())!=null)
return null;
else {userMapper.insert(user);
return user;}
}
4.mapper 层
CaceDetailMapper
package cn.ityao.cat.mapper;
import cn.ityao.cat.entity.CaseDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CaceDetailMapper extends BaseMapper<CaseDetail> {
void insertCaseDetails(@Param("caseDetails") List<CaseDetail> caseDetails);
}
CaceDetailMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.ityao.cat.mapper.CaceDetailMapper">
<insert id="insertCaseDetails">
INSERT INTO case_detail_table ( case_id, case_name, appCpuRate, systemCpuRate, memory_usage, pid_rx, pid_tx, fps, smalljank, jank, bigjank, temperature, datetime)
VALUES
<foreach collection="caseDetails" item="caseDetail" separator=",">
( #{caseDetail.caseId}, #{caseDetail.caseName}, #{caseDetail.appCpuRate}, #{caseDetail.systemCpuRate}, #{caseDetail.memoryUsage}, #{caseDetail.pidRx}, #{caseDetail.pidTx}, #{caseDetail.fps}, #{caseDetail.smalljank}, #{caseDetail.jank}, #{caseDetail.bigjank}, #{caseDetail.temperature}, #{caseDetail.datetime})
</foreach>
</insert>
</mapper>
5.结果
四、疑惑和思考
1️⃣为什么项目pom.xml文件添加新的依赖时候Dependency ‘***’ not found?
第一步 去官网https://central.sonatype.com/?smo=true搜索该依赖版本是否存在
第二步 重新maven clean 、compile一下
2️⃣依赖报错为啥在maven compile 不会发现,而在启动app时候出现?
因为 Maven 编译主要关注的是代码的语法和结构是否正确,而不会检查运行时的依赖关系。
Maven 编译时主要关注的是代码的编译依赖,即那些在编译过程中直接使用的依赖。而运行时依赖是指在应用程序运行时需要的依赖,这些依赖可能在编译时不直接使用,因此不会在编译时检查。
3️⃣JSON和JavaScript的渊源
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,JSON格式的数据,主要是为了跨平台交流数据用的。
JSON数据格式是从JavaScript对象中演变出来的,它是JavaScript的一个子集。JSON本身的意思就是JavaScript对象表示法(JavaScript Object Notation),它用严格的JavaScript对象表示法来表示结构化的数据。
它是一种严格的js对象的格式,JSON的属性名必须有双引号,如果值是字符串,也必须是双引号;JSON只是一种数据格式(或者叫数据形式),数据格式其实就是一种规范,格式、形式、规范是不能用来存诸数据的。我们不能把以下的对象叫JSON,比如:
4️⃣提交时候的数据库的一致性怎么保证:比如用户不能重复插入
可以在seviceimpl中控制下,如:
@Override
public User createUser(User user) {
// 实现创建用户的逻辑
if (userMapper.selectById(user.getUserId())!=null)
return null;
else {userMapper.insert(user);
return user;}
}
5️⃣提交时候的数据库的一致性怎么保证:比如自增id哪一层管
自增这种数据库插入自增,直接插入语句别写哪个自增语句了。千万别人为逻辑控制,费劲。
6️⃣提交数据的时间格式不一致怎么办?
1.在数据提交之前,确保所有时间数据都遵循一个统一的格式。例如,使用ISO 8601标准格式(如YYYY-MM-DDTHH:MM:SSZ),或者自定义一个固定的格式(如YYYY-MM-DD HH:MM:SS)。
前端解释:
2.在前端接口时间格式的验证,确保用户输入的时间符合标准的格式。可以使用 JavaScript 等前端技术进行验证。
3.服务器端对提交的时间数据进行验证,确保接收到的数据格式正确。如果格式不正确,可以向用户返回错误信息,并提示其重新提交。
时间格式转换:
4.在数据处理层,对不同格式的时间数据进行统一的转换。可以使用日期时间处理库(如Java的SimpleDateFormat、Python的datetime模块等)来解析和格式化时间数据
7️⃣mybatis plus的好用之处
以下两种感受最深,直接插表插入实体类就行。
MyBatis Plus 提供了代码生成器,它会根据数据库表结构自动生成实体类、Mapper 接口、Service 接口及其实现类、Controller 类等,从而大大提高浏览器的可执行性。
MyBatis Plus 提供了通用的 CRUD 方法,如,,,insert等,无需手动编写 SQL 语句,简化了基本的增删改查操作。deleteupdateselect