移动端记录了用户对 APP 的操作行为并会上报至服务端且会持久化,需要对这些信息作校验,
所以搭建这个服务用来查询数据库,在使用 UI 测试工具在 APP 端测试时,并检查服务端是否有对应的行为记录
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jolly</groupId>
<artifactId>mobile-test-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mobile-test-service</name>
<description>Mobile Test Service for Jolly</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator-docs</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jooq</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring.data.mongodb.database=countly
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
配置数据源并开启 mongo 日志,方便查看实际执行的查询语句
@Data
@Document(collection = "logs5729aa86ff5812096852d481")
public class EventMongo {
@Id
private String id;
private String ts;
private String reqts;
private String d;
private String l;
private String v;
private String t;
private String i;
private String s;
private String c;
public EventMongo() {
}
}
这里 collection 是 mongoDB 的表名
public interface EventMapperMongo extends MongoRepository<EventMongo, String> {
/**
* 通过DeviceId查找到对应的事件
* @param deviceId
* @param startTime
* @param endTime
* @return
*/
@Query("{'d.id':?#{[0]}, 't':'event', 'i.timestamp':{$gt:?#{[1]}, $lt:?#{[2]}}}")
public List<EventMongo> findAllByQuery(String deviceId, long startTime, long endTime);
}
和 mysql 不一样,不是使用 Select,而是 Query,然后取值,“?#{[0]}” 这个表示取第一个参数,这里是 deviceId
@RestController
@RequestMapping("/mongoEvent")
@Slf4j
public class EventControllerMongo {
@Autowired
private EventMapperMongo eventMapperMongo;
@RequestMapping(method = RequestMethod.GET, value = "/deviceId/{deviceId}/startTime/{startTime}/endTime/{endTime}")
public List<EventMongo> getEvents(@PathVariable("deviceId") String deviceId, @PathVariable("startTime") long startTime, @PathVariable("endTime") long endTime) {
return eventMapperMongo.findAllByQuery(deviceId, startTime, endTime);
}
}
2017-11-21 22:54:06.378 DEBUG 41848 --- [nio-9980-exec-1] o.s.data.mongodb.core.MongoTemplate : find using query: { "d.id" : "c7bed21e-f1fa-4241-9b80-85943f6dcd33" , "t" : "event" , "i.timestamp" : { "$gt" : 1511253238 , "$lt" : 1511253318}} fields: null for class: class com.jolly.mobiletestservice.beans.EventMongo in collection: logs5729aa86ff5812096852d481
db.getCollection('logs5729aa86ff5812096852d481').find({ "d.id" : "c7bed21e-f1fa-4241-9b80-85943f6dcd33" , "t" : "event" , "i.timestamp" : { "$gt" : 1511249952 , "$lt" : 1511259269}})
https://docs.spring.io/spring-data/mongodb/docs/current/reference/html
因为记录了用户的行为,所以它也是日后用户行为分析的基础,但具体怎么玩,还不清楚