今天就直接来设定一下MongoDB以及Spring专案的架构,昨天有提到MongoDB是使用Docker运行的container,
运行指令为
docker run -p 27017:27017 --name native-camp -d mongo
因为是本机端使用就没设定密码,这是不好的示范。
然後可以使用Mongo Compass来管理资料库,我自己使用MongoDB管理工具主要有Compass和Robo 3T,我自己会看要做什麽操作而切换使用的管理工具。
根据Day2分析的架构所设定collections
先把专案会用到的资料夹给新增好,以及新增mode、repository和aspect
application.yml 目前只有连接mongoDB设定
spring:
data:
mongodb:
uri: mongodb://localhost:27017/native_camp
然後mode 我自己是习惯使用lombok,真的好用便利,很推荐喔!
这边先展示Users,但还有些栏位需要新增
package com.mock.nativecamp.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "Users")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Users {
private String id;
private String name;
private String email;
private String status;
private String coin;
private String timezone;
private String payMethod;
private String nextPayCheck;
}
然後repository的话也是对应mode事先新增完毕,我这边做的是log request和response。
这边展示UsersRepository
package com.mock.nativecamp.repository;
import com.mock.nativecamp.model.Users;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UsersRepository extends MongoRepository<Users, String> {
}
再来是AOP的设定,我觉得AOP在做request和response时很便利
LogAspect
package com.mock.nativecamp.aspect;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Component
@Aspect
@Slf4j
public class LogAspect {
// this is log API receive request and return response log
@Pointcut("execution(* com.mock.nativecamp.controller.*.*(..))")
public void log() {
}
@Before("log()")
public void deBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
RequestLog requestLog = new RequestLog(
request.getRequestURL().toString(),
request.getRemoteAddr(),
classMethod,
joinPoint.getArgs()
);
log.info("request: {}", requestLog.toString());
}
@AfterReturning(returning = "result", pointcut = "log()")
public void doAfterReturning(Object result) {
log.info("response: {}", result);
}
@Data
private class RequestLog {
private String url;
private String ip;
private String classMethod;
private Object[] args;
public RequestLog(String url, String ip, String classMethod, Object[] args) {
this.url = url;
this.ip = ip;
this.classMethod = classMethod;
this.args = args;
}
}
}
下一篇会把各model的设计给完善。
<<: MLOps在金融产业:看懂金融审计如何导入ML专案(附所需文件清单)
>>: Unity与Photon的新手相遇旅途 | Day4-树木与地形制作
遍历字典 Items() 可以取得key跟value Key() 只取得key Values() ...
一转眼已经到第18天了,照这个速度可能没办法完成一个网站,今天要来赶进度! 首先要勘误 在nonce...
六指渊参考范例:https://www.sixvfx.com/ae_combustion 今天练习烛...
科技始终来自於人性 -- 「平板点餐APP」 第一次用平板点餐,是在日本京都的「啾啾烧肉」(じゅうじ...
延续上一篇文章的例子,我们除了想要训练出 baseball player 之外,也希望他能够同时拥有...