Spring Boot
  
Spring Boot + JPA + thymeleaf
MySQL
UISemantic UI
IDEA
Maven 3
JDK 8
Axure RP 8
Spring Boot
Semantic UI
1
1.1 
As a (role of user), I want (some feature) so that (some business value).
() () () 
3
  
  
6
10
2
2.1 
2.2 
Semantic UI
Semantic UI
WebStorm
2.3 
 Markdown
  
  
  
  
  
  
 typo.css
 animate.css
 prism
 Tocbot
 waypoints
 jquery.scrollTo
 qrcode.js
3
IDEA https://www.jetbrains.com/idea/
3.1 
1Spring Boot
web
Thymeleaf
JPA
MySQL
Aspects
DevTools
2application.yml
 thymeleaf 3
pom.xml:
 
3.0.2.RELEASE
2.1.1
application.yml:
 
spring:
  thymeleaf:
    mode: HTML
 
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/blog?
useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
application.yml:
 
logging:
  level:
    root: info
    com.imcoding: debug
  file: log/imcoding.log
 logback-spring.xml
 
    
    
    
    
    
    
        
            ${FILE_LOG_PATTERN}
        
        ${LOG_FILE}
        
            ${LOG_FILE}.%d{yyyy-MM-
dd}.%i
            
            30
            
            
                10MB
            
        
    
    
        
        
    
application-dev.yml
application-pro.yml
3.2 
1
404
500
error
2
  
  
@ControllerAdvice
public class ControllerExceptionHandler {
    private final Logger logger = 
LoggerFactory.getLogger(ControllerExceptionHandler.class);
    /**
     * 
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler({Exception.class})
    public ModelAndView handleException(HttpServletRequest request, 
Exception e) throws Exception {
        logger.error("Request URL : {} , Exception : {}", 
request.getRequestURL(), e);
        if (AnnotationUtils.findAnnotation(e.getClass(), 
ResponseStatus.class) != null) {
            throw e;
        }
        ModelAndView mav = new ModelAndView();
        mav.addObject("url", request.getRequestURL());
        mav.addObject("exception", e);
        mav.setViewName("error/error");
        return mav;
    }
}