diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..db947f0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 码匠笔记
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
index df49956..7d1bc84 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,98 @@
-## 码匠社区
+## 码问
 
-## 资料
+## 在线演示地址
+[https://www.mawen.co](https://www.mawen.co)，任何配置、使用和答疑问题，可以 👉[点击](#联系我) 联系我，也可以拉你进群沟通。
+
+## 功能列表  
+开源论坛、问答系统，现有功能多社交平台登录(Github，Gitee)提问、回复、通知、最新问答、最热热大、消除零回复等功能。
+
+## 当前项目配套的手把手视频教程
+|  标题   |  链接   |
+| --- | --- |
+|  【Spring Boot 实战】论坛项目【第一季】   |  [BV1r4411r7au](https://www.bilibili.com/video/BV1r4411r7au)  |
+|  【Spring Boot 实战】热门话题，经典面试问题实战，TopN 问题【第二季】|  [BV1Z4411f7RK](https://www.bilibili.com/video/BV1Z4411f7RK)  |
+|  【Spring Boot 实战】接入广告流量变现(让你的网站益起来)【第三季】  | [BV1L4411y7J9](https://www.bilibili.com/video/BV1L4411y7J9)  |
+|  【Spring Boot 实战】Vue 零基础入门(前后端分离的前置视频)【第四季】  |   [BV1gE411R7YA](https://www.bilibili.com/video/BV1gE411R7YA) |
+|  【Spring Boot 实战】Java 设计模式实战(加薪的必修课)【第五季】  |   [BV1UK4y1M7PC](https://www.bilibili.com/video/BV1UK4y1M7PC) |
+|  【Spring Boot 实战】快速搭建免费 HTTPS 服务  |   [BV1oJ411K7VT](https://www.bilibili.com/video/BV1oJ411K7VT)  |
+
+## 本地运行手册
+1. 安装必备工具  
+JDK，Maven
+2. 克隆代码到本地
+```sh
+git clone https://github.com/codedrinker/community.git
+````
+3. 运行数据库脚本，创建本地数据库
+```sh
+mvn flyway:migrate
+```
+如果需要使用 MySQL 数据库，运行脚本前修改两处配置
+```
+# src/main/resources/application.properties 
+spring.datasource.url=jdbc:h2:~/community
+spring.datasource.username=sa
+spring.datasource.password=123
+```
+```
+# pom.xml
+<properties>
+    <db.url>jdbc:h2:~/community</db.url>
+    <db.user>sa</db.user>
+    <db.password>123</db.password>
+</properties>
+```
+4. 运行打包命令，生成可执行 jar 文件
+```sh
+mvn package -DskipTests
+```
+4. 运行项目  
+```sh
+java -jar target/community-0.0.1-SNAPSHOT.jar
+```
+如果是线上部署，可以增加配置文件(production.properties)，同时运行命令修改如下
+```sh
+java -jar -Dspring.profiles.active=production target/community-0.0.1-SNAPSHOT.jar
+```
+5. 访问项目
+```
+http://localhost:8887
+```
+
+## 其他
+1. 视频初期未使用 Flyway 之前的数据库脚本
+```sql
+CREATE TABLE USER
+(
+    ID int AUTO_INCREMENT PRIMARY KEY NOT NULL,
+    ACCOUNT_ID VARCHAR(100),
+    NAME VARCHAR(50),
+    TOKEN VARCHAR(36),
+    GMT_CREATE BIGINT,
+    GMT_MODIFIED BIGINT
+);
+```
+2. 生成 Model 等 MyBatis 配置文件的命令
+```
+mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate
+```
+
+
+## 技术栈
+|  技术   |  链接   |
+| --- | --- |
+|  Spring Boot   |  http://projects.spring.io/spring-boot/#quick-start   |
+|   MyBatis  |  https://mybatis.org/mybatis-3/zh/index.html   |
+|   MyBatis Generator  |  http://mybatis.org/generator/   |
+|   H2  |   http://www.h2database.com/html/main.html  |
+|   Flyway  |   https://flywaydb.org/getstarted/firststeps/maven  |
+|Lombok| https://www.projectlombok.org |
+|Bootstrap|https://v3.bootcss.com/getting-started/|
+|Github OAuth|https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app/|
+|UFile|https://github.com/ucloud/ufile-sdk-java|
+|Bootstrap|https://v3.bootcss.com/getting-started/|
+
+## 扩展资料
 [Spring 文档](https://spring.io/guides)    
 [Spring Web](https://spring.io/guides/gs/serving-web-content/)   
 [es](https://elasticsearch.cn/explore)    
@@ -15,8 +107,6 @@
 [Markdown 插件](http://editor.md.ipandao.com/)   
 [UFfile SDK](https://github.com/ucloud/ufile-sdk-java)  
 [Count(*) VS Count(1)](https://mp.weixin.qq.com/s/Rwpke4BHu7Fz7KOpE2d3Lw)  
-
-## 工具
 [Git](https://git-scm.com/download)   
 [Visual Paradigm](https://www.visual-paradigm.com)    
 [Flyway](https://flywaydb.org/getstarted/firststeps/maven)  
@@ -27,20 +117,18 @@
 [Live Reload](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei/related)  
 [Postman](https://chrome.google.com/webstore/detail/coohjcphdfgbiolnekdpbcijmhambjff)
 
-## 脚本
-```sql
-CREATE TABLE USER
-(
-    ID int AUTO_INCREMENT PRIMARY KEY NOT NULL,
-    ACCOUNT_ID VARCHAR(100),
-    NAME VARCHAR(50),
-    TOKEN VARCHAR(36),
-    GMT_CREATE BIGINT,
-    GMT_MODIFIED BIGINT
-);
-```
-```bash
-mvn flyway:migrate
-mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate
-```
+## 更新日志
+- 2019-7-30 修复 session 过期时间很短问题   
+- 2019-8-2 修复因为*和+号产生的搜索异常问题  
+- 2019-8-18 添加首页按照最新、最热、零回复排序  
+- 2019-8-18 修复搜索输入 ? 号出现异常问题
+- 2019-8-22 修复图片大小限制和提问内容为空问题
+- 2019-9-1 添加动态导航栏  
+- 2021-7-5 修复因为网络原因不能拉去到自定义 spring starter 问题
 
+## 联系我
+有任何问题可以扫码下面两个二维码找到我，左边是微信订阅号，关注回复 ‘面试’即可获得我整理的(2W字)阿里面经，右边是个人微信号，有任何技术上面的问题可以给我留言。
+|  微信公众号   |  个人微信   |
+| --- | --- |
+|  码匠笔记  |  fit8295 |
+|  ![](https://mawen-cdn.cn-bj.ufileos.com/wxdyh-qr.jpeg?iopcmd=thumbnail&type=1&scale=50)   |   ![](http://mawen-cdn.cn-bj.ufileos.com/wechat.jpeg?iopcmd=thumbnail&type=1&scale=50)  |
diff --git a/pom.xml b/pom.xml
index 73d2428..87a77d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,6 +29,15 @@
                 <activeByDefault>true</activeByDefault>
             </activation>
         </profile>
+        <profile>
+            <id>mysql</id>
+            <properties>
+                <db.url>jdbc:mysql://127.0.0.1:3306/</db.url>
+                <db.user>root</db.user>
+                <db.password>root</db.password>
+                <db.driver>com.mysql.jdbc.Driver</db.driver>
+            </properties>
+        </profile>
     </profiles>
 
     <dependencies>
@@ -70,6 +79,11 @@
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.45</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>23.0</version>
+        </dependency>
 
         <dependency>
             <groupId>com.h2database</groupId>
@@ -92,6 +106,11 @@
             <artifactId>commons-lang3</artifactId>
             <version>3.9</version>
         </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.7</version>
+        </dependency>
         <dependency>
             <groupId>cn.ucloud.ufile</groupId>
             <artifactId>ufile-client-java</artifactId>
@@ -100,6 +119,12 @@
     </dependencies>
 
     <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
@@ -110,7 +135,7 @@
                 <artifactId>flyway-maven-plugin</artifactId>
                 <version>5.2.4</version>
                 <configuration>
-                    <url>${db.url}</url>
+                    <url>${db.url}community</url>
                     <user>${db.user}</user>
                     <password>${db.password}</password>
                 </configuration>
@@ -131,12 +156,21 @@
                 <groupId>org.mybatis.generator</groupId>
                 <artifactId>mybatis-generator-maven-plugin</artifactId>
                 <version>1.3.7</version>
+                <configuration>
+                    <overwrite>true</overwrite>
+                    <configurationFile>${basedir}/target/classes/generatorConfig.xml</configurationFile>
+                </configuration>
                 <dependencies>
                     <dependency>
                         <groupId>com.h2database</groupId>
                         <artifactId>h2</artifactId>
                         <version>1.4.199</version>
                     </dependency>
+                    <dependency>
+                        <groupId>mysql</groupId>
+                        <artifactId>mysql-connector-java</artifactId>
+                        <version>5.1.45</version>
+                    </dependency>
                 </dependencies>
             </plugin>
         </plugins>
diff --git a/src/main/java/life/majiang/community/CommunityApplication.java b/src/main/java/life/majiang/community/CommunityApplication.java
index 1079a31..bcddf82 100644
--- a/src/main/java/life/majiang/community/CommunityApplication.java
+++ b/src/main/java/life/majiang/community/CommunityApplication.java
@@ -3,9 +3,11 @@
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
 @MapperScan("life.majiang.community.mapper")
+@EnableScheduling
 public class CommunityApplication {
 
     public static void main(String[] args) {
diff --git a/src/main/java/life/majiang/community/cache/HotTagCache.java b/src/main/java/life/majiang/community/cache/HotTagCache.java
new file mode 100644
index 0000000..59ff2d5
--- /dev/null
+++ b/src/main/java/life/majiang/community/cache/HotTagCache.java
@@ -0,0 +1,50 @@
+package life.majiang.community.cache;
+
+import life.majiang.community.dto.HotTagDTO;
+import lombok.Data;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.PriorityQueue;
+
+/**
+ * Created by codedrinker on 2019/8/2.
+ */
+
+@Component
+@Data
+public class HotTagCache {
+    private List<String> hots = new ArrayList<>();
+
+    public void updateTags(Map<String, Integer> tags) {
+        int max = 10;
+        PriorityQueue<HotTagDTO> priorityQueue = new PriorityQueue<>(max);
+
+        tags.forEach((name, priority) -> {
+            HotTagDTO hotTagDTO = new HotTagDTO();
+            hotTagDTO.setName(name);
+            hotTagDTO.setPriority(priority);
+            if (priorityQueue.size() < max) {
+                priorityQueue.add(hotTagDTO);
+            } else {
+                HotTagDTO minHot = priorityQueue.peek();
+                if (hotTagDTO.compareTo(minHot) > 0) {
+                    priorityQueue.poll();
+                    priorityQueue.add(hotTagDTO);
+                }
+            }
+        });
+
+
+        List<String> sortedTags = new ArrayList<>();
+
+        HotTagDTO poll = priorityQueue.poll();
+        while (poll != null) {
+            sortedTags.add(0, poll.getName());
+            poll = priorityQueue.poll();
+        }
+        hots = sortedTags;
+    }
+}
diff --git a/src/main/java/life/majiang/community/cache/QuestionCache.java b/src/main/java/life/majiang/community/cache/QuestionCache.java
new file mode 100644
index 0000000..945e632
--- /dev/null
+++ b/src/main/java/life/majiang/community/cache/QuestionCache.java
@@ -0,0 +1,61 @@
+package life.majiang.community.cache;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.Lists;
+import life.majiang.community.dto.QuestionDTO;
+import life.majiang.community.mapper.QuestionExtMapper;
+import life.majiang.community.mapper.UserMapper;
+import life.majiang.community.model.Question;
+import life.majiang.community.model.User;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+@Service
+@Slf4j
+public class QuestionCache {
+    @Autowired
+    private QuestionExtMapper questionExtMapper;
+    @Autowired
+    private UserMapper userMapper;
+
+    private static Cache<String, List<QuestionDTO>> cacheQuestions = CacheBuilder.newBuilder()
+            .maximumSize(100)
+            .expireAfterWrite(10, TimeUnit.MINUTES)
+            .removalListener(entity -> log.info("QUESTIONS_CACHE_REMOVE:{}", entity.getKey()))
+            .build();
+
+    public List<QuestionDTO> getStickies() {
+        List<QuestionDTO> stickies;
+        try {
+            stickies = cacheQuestions.get("sticky", () -> {
+                List<Question> questions = questionExtMapper.selectSticky();
+                if (questions != null && questions.size() != 0) {
+                    List<QuestionDTO> questionDTOS = new ArrayList<>();
+                    for (Question question : questions) {
+                        User user = userMapper.selectByPrimaryKey(question.getCreator());
+                        QuestionDTO questionDTO = new QuestionDTO();
+                        BeanUtils.copyProperties(question, questionDTO);
+                        questionDTO.setUser(user);
+                        questionDTO.setDescription("");
+                        questionDTOS.add(questionDTO);
+                    }
+                    return questionDTOS;
+                } else {
+                    return Lists.newArrayList();
+                }
+            });
+        } catch (Exception e) {
+            log.error("getStickies error", e);
+            return Lists.newArrayList();
+        }
+        return stickies;
+    }
+}
diff --git a/src/main/java/life/majiang/community/cache/QuestionRateLimiter.java b/src/main/java/life/majiang/community/cache/QuestionRateLimiter.java
new file mode 100644
index 0000000..6dc36d5
--- /dev/null
+++ b/src/main/java/life/majiang/community/cache/QuestionRateLimiter.java
@@ -0,0 +1,50 @@
+package life.majiang.community.cache;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.Lists;
+import life.majiang.community.dto.QuestionDTO;
+import life.majiang.community.listener.event.QuestionRateLimiterEvent;
+import life.majiang.community.mapper.QuestionExtMapper;
+import life.majiang.community.mapper.UserMapper;
+import life.majiang.community.model.Question;
+import life.majiang.community.model.User;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+@Service
+@Slf4j
+public class QuestionRateLimiter {
+
+    @Autowired
+    private ApplicationContext applicationContext;
+
+    private static Cache<Long, Integer> userLimiter = CacheBuilder.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(1, TimeUnit.MINUTES)
+            .removalListener(entity -> log.info("QUESTIONS_RATE_LIMITER_REMOVE:{}", entity.getKey()))
+            .build();
+
+    public boolean reachLimit(Long userId) {
+        try {
+            Integer limit = userLimiter.get(userId, () -> 0);
+            userLimiter.put(userId, limit + 1);
+            log.info("user : {} post count : {}", userId, limit);
+            boolean isReachLimited = limit >= 2;
+            if (isReachLimited) {
+                applicationContext.publishEvent(new QuestionRateLimiterEvent(this, userId));
+            }
+            return isReachLimited;
+        } catch (ExecutionException e) {
+            return false;
+        }
+    }
+}
diff --git a/src/main/java/life/majiang/community/cache/TagCache.java b/src/main/java/life/majiang/community/cache/TagCache.java
index f925e0d..acfbe2e 100644
--- a/src/main/java/life/majiang/community/cache/TagCache.java
+++ b/src/main/java/life/majiang/community/cache/TagCache.java
@@ -47,7 +47,12 @@ public static String filterInvalid(String tags) {
         List<TagDTO> tagDTOS = get();
 
         List<String> tagList = tagDTOS.stream().flatMap(tag -> tag.getTags().stream()).collect(Collectors.toList());
-        String invalid = Arrays.stream(split).filter(t -> !tagList.contains(t)).collect(Collectors.joining(","));
+        String invalid = Arrays.stream(split).filter(t -> StringUtils.isBlank(t) || !tagList.contains(t)).collect(Collectors.joining(","));
         return invalid;
     }
+
+    public static void main(String[] args) {
+        int i = (5 - 1) >>> 1;
+        System.out.println(i);
+    }
 }
diff --git a/src/main/java/life/majiang/community/controller/AuthorizeController.java b/src/main/java/life/majiang/community/controller/AuthorizeController.java
index 21b357f..d128e7e 100644
--- a/src/main/java/life/majiang/community/controller/AuthorizeController.java
+++ b/src/main/java/life/majiang/community/controller/AuthorizeController.java
@@ -1,15 +1,17 @@
 package life.majiang.community.controller;
 
-import life.majiang.community.dto.AccessTokenDTO;
-import life.majiang.community.dto.GithubUser;
 import life.majiang.community.model.User;
 import life.majiang.community.provider.GithubProvider;
 import life.majiang.community.service.UserService;
+import life.majiang.community.strategy.LoginUserInfo;
+import life.majiang.community.strategy.UserStrategy;
+import life.majiang.community.strategy.UserStrategyFactory;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.servlet.http.Cookie;
@@ -24,6 +26,9 @@
 @Slf4j
 public class AuthorizeController {
 
+    @Autowired
+    private UserStrategyFactory userStrategyFactory;
+
     @Autowired
     private GithubProvider githubProvider;
 
@@ -39,32 +44,30 @@ public class AuthorizeController {
     @Autowired
     private UserService userService;
 
-    @GetMapping("/callback")
-    public String callback(@RequestParam(name = "code") String code,
-                           @RequestParam(name = "state") String state,
-                           HttpServletResponse response) {
-        AccessTokenDTO accessTokenDTO = new AccessTokenDTO();
-        accessTokenDTO.setClient_id(clientId);
-        accessTokenDTO.setClient_secret(clientSecret);
-        accessTokenDTO.setCode(code);
-        accessTokenDTO.setRedirect_uri(redirectUri);
-        accessTokenDTO.setState(state);
-        String accessToken = githubProvider.getAccessToken(accessTokenDTO);
-        GithubUser githubUser = githubProvider.getUser(accessToken);
-        if (githubUser != null && githubUser.getId() != null) {
+    @GetMapping("/callback/{type}")
+    public String newCallback(@PathVariable(name = "type") String type,
+                              @RequestParam(name = "code") String code,
+                              @RequestParam(name = "state", required = false) String state,
+                              HttpServletRequest request,
+                              HttpServletResponse response) {
+        UserStrategy userStrategy = userStrategyFactory.getStrategy(type);
+        LoginUserInfo loginUserInfo = userStrategy.getUser(code, state);
+        if (loginUserInfo != null && loginUserInfo.getId() != null) {
             User user = new User();
             String token = UUID.randomUUID().toString();
             user.setToken(token);
-            user.setName(githubUser.getName());
-            user.setAccountId(String.valueOf(githubUser.getId()));
-            user.setAvatarUrl(githubUser.getAvatarUrl());
+            user.setName(loginUserInfo.getName());
+            user.setAccountId(String.valueOf(loginUserInfo.getId()));
+            user.setType(type);
+            user.setAvatarUrl(loginUserInfo.getAvatarUrl());
             userService.createOrUpdate(user);
             Cookie cookie = new Cookie("token", token);
             cookie.setMaxAge(60 * 60 * 24 * 30 * 6);
+            cookie.setPath("/");
             response.addCookie(cookie);
             return "redirect:/";
         } else {
-            log.error("callback get github error,{}", githubUser);
+            log.error("callback get github error,{}", loginUserInfo);
             // 登录失败，重新登录
             return "redirect:/";
         }
@@ -73,9 +76,10 @@ public String callback(@RequestParam(name = "code") String code,
     @GetMapping("/logout")
     public String logout(HttpServletRequest request,
                          HttpServletResponse response) {
-        request.getSession().removeAttribute("user");
+        request.getSession().invalidate();
         Cookie cookie = new Cookie("token", null);
         cookie.setMaxAge(0);
+        cookie.setPath("/");
         response.addCookie(cookie);
         return "redirect:/";
     }
diff --git a/src/main/java/life/majiang/community/controller/CommentController.java b/src/main/java/life/majiang/community/controller/CommentController.java
index 01ae8e6..b62dd88 100644
--- a/src/main/java/life/majiang/community/controller/CommentController.java
+++ b/src/main/java/life/majiang/community/controller/CommentController.java
@@ -1,5 +1,6 @@
 package life.majiang.community.controller;
 
+import life.majiang.community.cache.QuestionRateLimiter;
 import life.majiang.community.dto.CommentCreateDTO;
 import life.majiang.community.dto.CommentDTO;
 import life.majiang.community.dto.ResultDTO;
@@ -25,6 +26,9 @@ public class CommentController {
     @Autowired
     private CommentService commentService;
 
+    @Autowired
+    private QuestionRateLimiter questionRateLimiter;
+
     @ResponseBody
     @RequestMapping(value = "/comment", method = RequestMethod.POST)
     public Object post(@RequestBody CommentCreateDTO commentCreateDTO,
@@ -34,10 +38,18 @@ public Object post(@RequestBody CommentCreateDTO commentCreateDTO,
             return ResultDTO.errorOf(CustomizeErrorCode.NO_LOGIN);
         }
 
+        if (user.getDisable() != null && user.getDisable() == 1) {
+            return ResultDTO.errorOf(CustomizeErrorCode.USER_DISABLE);
+        }
+
         if (commentCreateDTO == null || StringUtils.isBlank(commentCreateDTO.getContent())) {
             return ResultDTO.errorOf(CustomizeErrorCode.CONTENT_IS_EMPTY);
         }
 
+        if (questionRateLimiter.reachLimit(user.getId())) {
+            return ResultDTO.errorOf(CustomizeErrorCode.RATE_LIMIT);
+        }
+
         Comment comment = new Comment();
         comment.setParentId(commentCreateDTO.getParentId());
         comment.setContent(commentCreateDTO.getContent());
diff --git a/src/main/java/life/majiang/community/controller/FileController.java b/src/main/java/life/majiang/community/controller/FileController.java
index 11a78ec..b5f6c45 100644
--- a/src/main/java/life/majiang/community/controller/FileController.java
+++ b/src/main/java/life/majiang/community/controller/FileController.java
@@ -1,7 +1,8 @@
 package life.majiang.community.controller;
 
 import life.majiang.community.dto.FileDTO;
-import life.majiang.community.provider.UCloudProvider;
+import life.majiang.community.provider.UFileResult;
+import life.majiang.community.provider.UFileService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -19,7 +20,7 @@
 @Slf4j
 public class FileController {
     @Autowired
-    private UCloudProvider uCloudProvider;
+    private UFileService uFileService;
 
     @RequestMapping("/file/upload")
     @ResponseBody
@@ -27,10 +28,10 @@ public FileDTO upload(HttpServletRequest request) {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         MultipartFile file = multipartRequest.getFile("editormd-image-file");
         try {
-            String fileName = uCloudProvider.upload(file.getInputStream(), file.getContentType(), file.getOriginalFilename());
+            UFileResult uFileResult = uFileService.upload(file.getInputStream(), file.getContentType(), file.getOriginalFilename());
             FileDTO fileDTO = new FileDTO();
             fileDTO.setSuccess(1);
-            fileDTO.setUrl(fileName);
+            fileDTO.setUrl(uFileResult.getFileUrl());
             return fileDTO;
         } catch (Exception e) {
             log.error("upload error", e);
diff --git a/src/main/java/life/majiang/community/controller/IndexController.java b/src/main/java/life/majiang/community/controller/IndexController.java
index 0138daf..3f015cd 100644
--- a/src/main/java/life/majiang/community/controller/IndexController.java
+++ b/src/main/java/life/majiang/community/controller/IndexController.java
@@ -1,5 +1,6 @@
 package life.majiang.community.controller;
 
+import life.majiang.community.cache.HotTagCache;
 import life.majiang.community.dto.PaginationDTO;
 import life.majiang.community.service.QuestionService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -8,6 +9,8 @@
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 /**
  * Created by codedrinker on 2019/4/24.
  */
@@ -17,14 +20,23 @@ public class IndexController {
     @Autowired
     private QuestionService questionService;
 
+    @Autowired
+    private HotTagCache hotTagCache;
+
     @GetMapping("/")
     public String index(Model model,
                         @RequestParam(name = "page", defaultValue = "1") Integer page,
-                        @RequestParam(name = "size", defaultValue = "5") Integer size,
-                        @RequestParam(name = "search", required = false) String search) {
-        PaginationDTO pagination = questionService.list(search, page, size);
+                        @RequestParam(name = "size", defaultValue = "10") Integer size,
+                        @RequestParam(name = "search", required = false) String search,
+                        @RequestParam(name = "tag", required = false) String tag,
+                        @RequestParam(name = "sort", required = false) String sort) {
+        PaginationDTO pagination = questionService.list(search, tag, sort, page, size);
+        List<String> tags = hotTagCache.getHots();
         model.addAttribute("pagination", pagination);
         model.addAttribute("search", search);
+        model.addAttribute("tag", tag);
+        model.addAttribute("tags", tags);
+        model.addAttribute("sort", sort);
         return "index";
     }
 }
diff --git a/src/main/java/life/majiang/community/controller/PublishController.java b/src/main/java/life/majiang/community/controller/PublishController.java
index 90eadfc..12728ff 100644
--- a/src/main/java/life/majiang/community/controller/PublishController.java
+++ b/src/main/java/life/majiang/community/controller/PublishController.java
@@ -1,10 +1,12 @@
 package life.majiang.community.controller;
 
+import life.majiang.community.cache.QuestionRateLimiter;
 import life.majiang.community.cache.TagCache;
 import life.majiang.community.dto.QuestionDTO;
 import life.majiang.community.model.Question;
 import life.majiang.community.model.User;
 import life.majiang.community.service.QuestionService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -14,17 +16,22 @@
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import javax.annotation.security.DeclareRoles;
 import javax.servlet.http.HttpServletRequest;
 
 /**
  * Created by codedrinker on 2019/5/2.
  */
 @Controller
+@Slf4j
 public class PublishController {
 
     @Autowired
     private QuestionService questionService;
 
+    @Autowired
+    private QuestionRateLimiter questionRateLimiter;
+
     @GetMapping("/publish/{id}")
     public String edit(@PathVariable(name = "id") Long id,
                        Model model) {
@@ -57,15 +64,20 @@ public String doPublish(
         model.addAttribute("tag", tag);
         model.addAttribute("tags", TagCache.get());
 
-        if (title == null || title == "") {
+        if (StringUtils.isBlank(title)) {
             model.addAttribute("error", "标题不能为空");
             return "publish";
         }
-        if (description == null || description == "") {
+
+        if (StringUtils.length(title) > 50) {
+            model.addAttribute("error", "标题最多 50 个字符");
+            return "publish";
+        }
+        if (StringUtils.isBlank(description)) {
             model.addAttribute("error", "问题补充不能为空");
             return "publish";
         }
-        if (tag == null || tag == "") {
+        if (StringUtils.isBlank(tag)) {
             model.addAttribute("error", "标签不能为空");
             return "publish";
         }
@@ -82,6 +94,16 @@ public String doPublish(
             return "publish";
         }
 
+        if (user.getDisable() != null && user.getDisable() == 1) {
+            model.addAttribute("error", "操作被禁用，如有疑问请联系管理员");
+            return "publish";
+        }
+
+        if (questionRateLimiter.reachLimit(user.getId())) {
+            model.addAttribute("error", "操作太快，请求被限制");
+            return "publish";
+        }
+
         Question question = new Question();
         question.setTitle(title);
         question.setDescription(description);
diff --git a/src/main/java/life/majiang/community/dto/HotTagDTO.java b/src/main/java/life/majiang/community/dto/HotTagDTO.java
new file mode 100644
index 0000000..6271ee2
--- /dev/null
+++ b/src/main/java/life/majiang/community/dto/HotTagDTO.java
@@ -0,0 +1,17 @@
+package life.majiang.community.dto;
+
+import lombok.Data;
+
+/**
+ * Created by codedrinker on 2019/8/2.
+ */
+@Data
+public class HotTagDTO implements Comparable {
+    private String name;
+    private Integer priority;
+
+    @Override
+    public int compareTo(Object o) {
+        return this.getPriority() - ((HotTagDTO) o).getPriority();
+    }
+}
diff --git a/src/main/java/life/majiang/community/dto/QuestionDTO.java b/src/main/java/life/majiang/community/dto/QuestionDTO.java
index 8b714b3..5199e4f 100644
--- a/src/main/java/life/majiang/community/dto/QuestionDTO.java
+++ b/src/main/java/life/majiang/community/dto/QuestionDTO.java
@@ -19,4 +19,5 @@ public class QuestionDTO {
     private Integer commentCount;
     private Integer likeCount;
     private User user;
+    private Integer sticky;
 }
diff --git a/src/main/java/life/majiang/community/dto/QuestionQueryDTO.java b/src/main/java/life/majiang/community/dto/QuestionQueryDTO.java
index 8b8cd71..2932754 100644
--- a/src/main/java/life/majiang/community/dto/QuestionQueryDTO.java
+++ b/src/main/java/life/majiang/community/dto/QuestionQueryDTO.java
@@ -8,6 +8,9 @@
 @Data
 public class QuestionQueryDTO {
     private String search;
+    private String sort;
+    private Long time;
+    private String tag;
     private Integer page;
     private Integer size;
 }
diff --git a/src/main/java/life/majiang/community/enums/AdPosEnum.java b/src/main/java/life/majiang/community/enums/AdPosEnum.java
new file mode 100644
index 0000000..02ae8b7
--- /dev/null
+++ b/src/main/java/life/majiang/community/enums/AdPosEnum.java
@@ -0,0 +1,8 @@
+package life.majiang.community.enums;
+
+/**
+ * Created by codedrinker on 2019/9/6.
+ */
+public enum AdPosEnum {
+    NAV, SIDE, FOOTER, HEADER
+}
diff --git a/src/main/java/life/majiang/community/enums/SortEnum.java b/src/main/java/life/majiang/community/enums/SortEnum.java
new file mode 100644
index 0000000..7feec86
--- /dev/null
+++ b/src/main/java/life/majiang/community/enums/SortEnum.java
@@ -0,0 +1,12 @@
+package life.majiang.community.enums;
+
+/**
+ * Created by codedrinker on 2019/8/18.
+ */
+public enum SortEnum {
+    HOT,
+    HOT30,
+    HOT7,
+    NO,
+    NEW;
+}
diff --git a/src/main/java/life/majiang/community/exception/CustomizeErrorCode.java b/src/main/java/life/majiang/community/exception/CustomizeErrorCode.java
index d4d6279..d6bfaee 100644
--- a/src/main/java/life/majiang/community/exception/CustomizeErrorCode.java
+++ b/src/main/java/life/majiang/community/exception/CustomizeErrorCode.java
@@ -15,7 +15,11 @@ public enum CustomizeErrorCode implements ICustomizeErrorCode {
     READ_NOTIFICATION_FAIL(2008, "兄弟你这是读别人的信息呢？"),
     NOTIFICATION_NOT_FOUND(2009, "消息莫非是不翼而飞了？"),
     FILE_UPLOAD_FAIL(2010, "图片上传失败"),
-    INVALID_INPUT(2011, "非法输入"),;
+    INVALID_INPUT(2011, "非法输入"),
+    INVALID_OPERATION(2012, "兄弟，是不是走错房间了？"),
+    USER_DISABLE(2013, "操作被禁用，如有疑问请联系管理员"),
+    RATE_LIMIT(2014, "操作太快了，请稍后重试"),
+    ;
 
     @Override
     public String getMessage() {
diff --git a/src/main/java/life/majiang/community/interceptor/SessionInterceptor.java b/src/main/java/life/majiang/community/interceptor/SessionInterceptor.java
index c7a1414..21fa7e1 100644
--- a/src/main/java/life/majiang/community/interceptor/SessionInterceptor.java
+++ b/src/main/java/life/majiang/community/interceptor/SessionInterceptor.java
@@ -1,9 +1,12 @@
 package life.majiang.community.interceptor;
 
+import life.majiang.community.enums.AdPosEnum;
 import life.majiang.community.mapper.UserMapper;
 import life.majiang.community.model.User;
 import life.majiang.community.model.UserExample;
+import life.majiang.community.service.AdService;
 import life.majiang.community.service.NotificationService;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.lang.Nullable;
@@ -14,6 +17,7 @@
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
 import java.util.List;
 
 /**
@@ -26,27 +30,38 @@ public class SessionInterceptor implements HandlerInterceptor {
     private UserMapper userMapper;
     @Autowired
     private NotificationService notificationService;
+    @Autowired
+    private AdService adService;
 
     @Value("${github.redirect.uri}")
-    private String redirectUri;
+    private String githubRedirectUri;
+
+    @Value("${gitee.redirect.uri}")
+    private String giteeRedirectUri;
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         //设置 context 级别的属性
-        request.getServletContext().setAttribute("redirectUri", redirectUri);
+        request.getServletContext().setAttribute("giteeRedirectUri", giteeRedirectUri);
+        request.getServletContext().setAttribute("githubRedirectUri", githubRedirectUri);
+        // 没有登录的时候也可以查看导航
+        for (AdPosEnum adPos : AdPosEnum.values()) {
+            request.getServletContext().setAttribute(adPos.name(), adService.list(adPos.name()));
+        }
         Cookie[] cookies = request.getCookies();
         if (cookies != null && cookies.length != 0)
             for (Cookie cookie : cookies) {
-                if (cookie.getName().equals("token")) {
+                if (cookie.getName().equals("token") && StringUtils.isNotBlank(cookie.getValue())) {
                     String token = cookie.getValue();
                     UserExample userExample = new UserExample();
                     userExample.createCriteria()
                             .andTokenEqualTo(token);
                     List<User> users = userMapper.selectByExample(userExample);
                     if (users.size() != 0) {
-                        request.getSession().setAttribute("user", users.get(0));
+                        HttpSession session = request.getSession();
+                        session.setAttribute("user", users.get(0));
                         Long unreadCount = notificationService.unreadCount(users.get(0).getId());
-                        request.getSession().setAttribute("unreadCount", unreadCount);
+                        session.setAttribute("unreadCount", unreadCount);
                     }
                     break;
                 }
diff --git a/src/main/java/life/majiang/community/interceptor/WebConfig.java b/src/main/java/life/majiang/community/interceptor/WebConfig.java
index c47f3bc..fc71b8b 100644
--- a/src/main/java/life/majiang/community/interceptor/WebConfig.java
+++ b/src/main/java/life/majiang/community/interceptor/WebConfig.java
@@ -17,6 +17,8 @@ public class WebConfig implements WebMvcConfigurer {
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(sessionInterceptor).addPathPatterns("/**");
+        registry.addInterceptor(sessionInterceptor)
+                .addPathPatterns("/**")
+                .excludePathPatterns("/callback/**", "/logout");
     }
 }
diff --git a/src/main/java/life/majiang/community/listener/ListenerAsyncConfiguration.java b/src/main/java/life/majiang/community/listener/ListenerAsyncConfiguration.java
new file mode 100644
index 0000000..49b8129
--- /dev/null
+++ b/src/main/java/life/majiang/community/listener/ListenerAsyncConfiguration.java
@@ -0,0 +1,34 @@
+package life.majiang.community.listener;
+
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Created by codedrinker on 2018/12/17.
+ */
+@Configuration
+@EnableAsync
+public class ListenerAsyncConfiguration implements AsyncConfigurer {
+    @Override
+    public Executor getAsyncExecutor() {
+        //使用Spring内置线程池任务对象
+        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+        //设置线程池参数
+        taskExecutor.setCorePoolSize(5);
+        taskExecutor.setMaxPoolSize(10);
+        taskExecutor.setQueueCapacity(25);
+        taskExecutor.initialize();
+        return taskExecutor;
+    }
+
+    @Override
+    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+        return null;
+    }
+}
+
diff --git a/src/main/java/life/majiang/community/listener/QuestionRateLimiterListener.java b/src/main/java/life/majiang/community/listener/QuestionRateLimiterListener.java
new file mode 100644
index 0000000..0cb8780
--- /dev/null
+++ b/src/main/java/life/majiang/community/listener/QuestionRateLimiterListener.java
@@ -0,0 +1,59 @@
+package life.majiang.community.listener;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import life.majiang.community.listener.event.QuestionRateLimiterEvent;
+import life.majiang.community.mapper.QuestionMapper;
+import life.majiang.community.mapper.UserMapper;
+import life.majiang.community.model.Question;
+import life.majiang.community.model.QuestionExample;
+import life.majiang.community.model.User;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Component
+public class QuestionRateLimiterListener implements ApplicationListener<QuestionRateLimiterEvent> {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private QuestionMapper questionMapper;
+
+    private static Cache<Long, Integer> disableUsers = CacheBuilder.newBuilder()
+            .maximumSize(10)
+            .expireAfterWrite(1, TimeUnit.HOURS)
+            .build();
+
+    @SneakyThrows
+    @Override
+    public void onApplicationEvent(QuestionRateLimiterEvent event) {
+        Integer count = disableUsers.get(event.getUserId(), () -> 0);
+        disableUsers.put(event.getUserId(), count + 1);
+        log.info("receive rate limit event : {}, count : {}", event.getUserId(), count);
+        if (count >= 60) {
+            User user = userMapper.selectByPrimaryKey(event.getUserId());
+            if (user != null) {
+                user.setDisable(1);
+                log.info("disable user {}", event.getUserId());
+                userMapper.updateByPrimaryKey(user);
+            }
+            QuestionExample example = new QuestionExample();
+            example.createCriteria().andCreatorEqualTo(event.getUserId());
+            List<Question> questions = questionMapper.selectByExample(example);
+            if (questions != null && questions.size() != 0) {
+                for (Question question : questions) {
+                    log.info("disable user {} and delete posts {}", event.getUserId(), question.getId());
+                    questionMapper.deleteByPrimaryKey(question.getId());
+                }
+            }
+        }
+    }
+}
diff --git a/src/main/java/life/majiang/community/listener/event/QuestionRateLimiterEvent.java b/src/main/java/life/majiang/community/listener/event/QuestionRateLimiterEvent.java
new file mode 100644
index 0000000..94a222b
--- /dev/null
+++ b/src/main/java/life/majiang/community/listener/event/QuestionRateLimiterEvent.java
@@ -0,0 +1,14 @@
+package life.majiang.community.listener.event;
+
+import lombok.Data;
+import org.springframework.context.ApplicationEvent;
+
+@Data
+public class QuestionRateLimiterEvent extends ApplicationEvent {
+    private Long userId;
+
+    public QuestionRateLimiterEvent(Object source, Long userId) {
+        super(source);
+        this.userId = userId;
+    }
+}
diff --git a/src/main/java/life/majiang/community/mapper/AdMapper.java b/src/main/java/life/majiang/community/mapper/AdMapper.java
new file mode 100644
index 0000000..bf6fc75
--- /dev/null
+++ b/src/main/java/life/majiang/community/mapper/AdMapper.java
@@ -0,0 +1,105 @@
+package life.majiang.community.mapper;
+
+import java.util.List;
+import life.majiang.community.model.Ad;
+import life.majiang.community.model.AdExample;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface AdMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    long countByExample(AdExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int deleteByExample(AdExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int deleteByPrimaryKey(Integer id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int insert(Ad record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int insertSelective(Ad record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    List<Ad> selectByExampleWithRowbounds(AdExample example, RowBounds rowBounds);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    List<Ad> selectByExample(AdExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    Ad selectByPrimaryKey(Integer id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int updateByExampleSelective(@Param("record") Ad record, @Param("example") AdExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int updateByExample(@Param("record") Ad record, @Param("example") AdExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int updateByPrimaryKeySelective(Ad record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int updateByPrimaryKey(Ad record);
+}
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/mapper/CommentMapper.java b/src/main/java/life/majiang/community/mapper/CommentMapper.java
index bccc1c4..6910bca 100644
--- a/src/main/java/life/majiang/community/mapper/CommentMapper.java
+++ b/src/main/java/life/majiang/community/mapper/CommentMapper.java
@@ -9,97 +9,97 @@
 public interface CommentMapper {
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     long countByExample(CommentExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int deleteByExample(CommentExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int deleteByPrimaryKey(Long id);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int insert(Comment record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int insertSelective(Comment record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<Comment> selectByExampleWithRowbounds(CommentExample example, RowBounds rowBounds);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<Comment> selectByExample(CommentExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     Comment selectByPrimaryKey(Long id);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByExampleSelective(@Param("record") Comment record, @Param("example") CommentExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByExample(@Param("record") Comment record, @Param("example") CommentExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByPrimaryKeySelective(Comment record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByPrimaryKey(Comment record);
 }
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/mapper/NavMapper.java b/src/main/java/life/majiang/community/mapper/NavMapper.java
new file mode 100644
index 0000000..702b84a
--- /dev/null
+++ b/src/main/java/life/majiang/community/mapper/NavMapper.java
@@ -0,0 +1,105 @@
+package life.majiang.community.mapper;
+
+import java.util.List;
+import life.majiang.community.model.Nav;
+import life.majiang.community.model.NavExample;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface NavMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    long countByExample(NavExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int deleteByExample(NavExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int deleteByPrimaryKey(Integer id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int insert(Nav record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int insertSelective(Nav record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    List<Nav> selectByExampleWithRowbounds(NavExample example, RowBounds rowBounds);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    List<Nav> selectByExample(NavExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    Nav selectByPrimaryKey(Integer id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int updateByExampleSelective(@Param("record") Nav record, @Param("example") NavExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int updateByExample(@Param("record") Nav record, @Param("example") NavExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int updateByPrimaryKeySelective(Nav record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    int updateByPrimaryKey(Nav record);
+}
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/mapper/NotificationMapper.java b/src/main/java/life/majiang/community/mapper/NotificationMapper.java
index e0707f7..fc98fc2 100644
--- a/src/main/java/life/majiang/community/mapper/NotificationMapper.java
+++ b/src/main/java/life/majiang/community/mapper/NotificationMapper.java
@@ -9,97 +9,97 @@
 public interface NotificationMapper {
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     long countByExample(NotificationExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int deleteByExample(NotificationExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int deleteByPrimaryKey(Long id);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int insert(Notification record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int insertSelective(Notification record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<Notification> selectByExampleWithRowbounds(NotificationExample example, RowBounds rowBounds);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<Notification> selectByExample(NotificationExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     Notification selectByPrimaryKey(Long id);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByExampleSelective(@Param("record") Notification record, @Param("example") NotificationExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByExample(@Param("record") Notification record, @Param("example") NotificationExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByPrimaryKeySelective(Notification record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByPrimaryKey(Notification record);
 }
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/mapper/QuestionExtMapper.java b/src/main/java/life/majiang/community/mapper/QuestionExtMapper.java
index 7957d67..f97b7f9 100644
--- a/src/main/java/life/majiang/community/mapper/QuestionExtMapper.java
+++ b/src/main/java/life/majiang/community/mapper/QuestionExtMapper.java
@@ -15,4 +15,6 @@ public interface QuestionExtMapper {
     Integer countBySearch(QuestionQueryDTO questionQueryDTO);
 
     List<Question> selectBySearch(QuestionQueryDTO questionQueryDTO);
+
+    List<Question> selectSticky();
 }
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/mapper/QuestionMapper.java b/src/main/java/life/majiang/community/mapper/QuestionMapper.java
index c203557..30d6d52 100644
--- a/src/main/java/life/majiang/community/mapper/QuestionMapper.java
+++ b/src/main/java/life/majiang/community/mapper/QuestionMapper.java
@@ -9,129 +9,129 @@
 public interface QuestionMapper {
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     long countByExample(QuestionExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int deleteByExample(QuestionExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int deleteByPrimaryKey(Long id);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int insert(Question record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int insertSelective(Question record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<Question> selectByExampleWithBLOBsWithRowbounds(QuestionExample example, RowBounds rowBounds);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<Question> selectByExampleWithBLOBs(QuestionExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<Question> selectByExampleWithRowbounds(QuestionExample example, RowBounds rowBounds);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<Question> selectByExample(QuestionExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     Question selectByPrimaryKey(Long id);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByExampleSelective(@Param("record") Question record, @Param("example") QuestionExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByExampleWithBLOBs(@Param("record") Question record, @Param("example") QuestionExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByExample(@Param("record") Question record, @Param("example") QuestionExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByPrimaryKeySelective(Question record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByPrimaryKeyWithBLOBs(Question record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByPrimaryKey(Question record);
 }
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/mapper/UserMapper.java b/src/main/java/life/majiang/community/mapper/UserMapper.java
index e668b06..cd8db4c 100644
--- a/src/main/java/life/majiang/community/mapper/UserMapper.java
+++ b/src/main/java/life/majiang/community/mapper/UserMapper.java
@@ -9,97 +9,97 @@
 public interface UserMapper {
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     long countByExample(UserExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int deleteByExample(UserExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int deleteByPrimaryKey(Long id);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int insert(User record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int insertSelective(User record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<User> selectByExampleWithRowbounds(UserExample example, RowBounds rowBounds);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     List<User> selectByExample(UserExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     User selectByPrimaryKey(Long id);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByExample(@Param("record") User record, @Param("example") UserExample example);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByPrimaryKeySelective(User record);
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     int updateByPrimaryKey(User record);
 }
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/model/Ad.java b/src/main/java/life/majiang/community/model/Ad.java
new file mode 100644
index 0000000..a53f56d
--- /dev/null
+++ b/src/main/java/life/majiang/community/model/Ad.java
@@ -0,0 +1,333 @@
+package life.majiang.community.model;
+
+public class Ad {
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.id
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Integer id;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.title
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private String title;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.url
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private String url;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.image
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private String image;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.gmt_start
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Long gmtStart;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.gmt_end
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Long gmtEnd;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.gmt_create
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Long gmtCreate;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.gmt_modified
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Long gmtModified;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.status
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Integer status;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column ad.pos
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private String pos;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.id
+     *
+     * @return the value of ad.id
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.id
+     *
+     * @param id the value for ad.id
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.title
+     *
+     * @return the value of ad.title
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.title
+     *
+     * @param title the value for ad.title
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setTitle(String title) {
+        this.title = title == null ? null : title.trim();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.url
+     *
+     * @return the value of ad.url
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public String getUrl() {
+        return url;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.url
+     *
+     * @param url the value for ad.url
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setUrl(String url) {
+        this.url = url == null ? null : url.trim();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.image
+     *
+     * @return the value of ad.image
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public String getImage() {
+        return image;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.image
+     *
+     * @param image the value for ad.image
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setImage(String image) {
+        this.image = image == null ? null : image.trim();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.gmt_start
+     *
+     * @return the value of ad.gmt_start
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Long getGmtStart() {
+        return gmtStart;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.gmt_start
+     *
+     * @param gmtStart the value for ad.gmt_start
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setGmtStart(Long gmtStart) {
+        this.gmtStart = gmtStart;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.gmt_end
+     *
+     * @return the value of ad.gmt_end
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Long getGmtEnd() {
+        return gmtEnd;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.gmt_end
+     *
+     * @param gmtEnd the value for ad.gmt_end
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setGmtEnd(Long gmtEnd) {
+        this.gmtEnd = gmtEnd;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.gmt_create
+     *
+     * @return the value of ad.gmt_create
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Long getGmtCreate() {
+        return gmtCreate;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.gmt_create
+     *
+     * @param gmtCreate the value for ad.gmt_create
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setGmtCreate(Long gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.gmt_modified
+     *
+     * @return the value of ad.gmt_modified
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Long getGmtModified() {
+        return gmtModified;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.gmt_modified
+     *
+     * @param gmtModified the value for ad.gmt_modified
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setGmtModified(Long gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.status
+     *
+     * @return the value of ad.status
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.status
+     *
+     * @param status the value for ad.status
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column ad.pos
+     *
+     * @return the value of ad.pos
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public String getPos() {
+        return pos;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column ad.pos
+     *
+     * @param pos the value for ad.pos
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setPos(String pos) {
+        this.pos = pos == null ? null : pos.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/model/AdExample.java b/src/main/java/life/majiang/community/model/AdExample.java
new file mode 100644
index 0000000..6338d63
--- /dev/null
+++ b/src/main/java/life/majiang/community/model/AdExample.java
@@ -0,0 +1,942 @@
+package life.majiang.community.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AdExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public AdExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Integer value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Integer value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Integer value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Integer value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Integer value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Integer> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Integer> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Integer value1, Integer value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNull() {
+            addCriterion("title is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNotNull() {
+            addCriterion("title is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleEqualTo(String value) {
+            addCriterion("title =", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotEqualTo(String value) {
+            addCriterion("title <>", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThan(String value) {
+            addCriterion("title >", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThanOrEqualTo(String value) {
+            addCriterion("title >=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThan(String value) {
+            addCriterion("title <", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThanOrEqualTo(String value) {
+            addCriterion("title <=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLike(String value) {
+            addCriterion("title like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotLike(String value) {
+            addCriterion("title not like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIn(List<String> values) {
+            addCriterion("title in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotIn(List<String> values) {
+            addCriterion("title not in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleBetween(String value1, String value2) {
+            addCriterion("title between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotBetween(String value1, String value2) {
+            addCriterion("title not between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNull() {
+            addCriterion("url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNotNull() {
+            addCriterion("url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlEqualTo(String value) {
+            addCriterion("url =", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotEqualTo(String value) {
+            addCriterion("url <>", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThan(String value) {
+            addCriterion("url >", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("url >=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThan(String value) {
+            addCriterion("url <", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThanOrEqualTo(String value) {
+            addCriterion("url <=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLike(String value) {
+            addCriterion("url like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotLike(String value) {
+            addCriterion("url not like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIn(List<String> values) {
+            addCriterion("url in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotIn(List<String> values) {
+            addCriterion("url not in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlBetween(String value1, String value2) {
+            addCriterion("url between", value1, value2, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotBetween(String value1, String value2) {
+            addCriterion("url not between", value1, value2, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageIsNull() {
+            addCriterion("image is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageIsNotNull() {
+            addCriterion("image is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageEqualTo(String value) {
+            addCriterion("image =", value, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageNotEqualTo(String value) {
+            addCriterion("image <>", value, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageGreaterThan(String value) {
+            addCriterion("image >", value, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageGreaterThanOrEqualTo(String value) {
+            addCriterion("image >=", value, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageLessThan(String value) {
+            addCriterion("image <", value, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageLessThanOrEqualTo(String value) {
+            addCriterion("image <=", value, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageLike(String value) {
+            addCriterion("image like", value, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageNotLike(String value) {
+            addCriterion("image not like", value, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageIn(List<String> values) {
+            addCriterion("image in", values, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageNotIn(List<String> values) {
+            addCriterion("image not in", values, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageBetween(String value1, String value2) {
+            addCriterion("image between", value1, value2, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andImageNotBetween(String value1, String value2) {
+            addCriterion("image not between", value1, value2, "image");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartIsNull() {
+            addCriterion("gmt_start is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartIsNotNull() {
+            addCriterion("gmt_start is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartEqualTo(Long value) {
+            addCriterion("gmt_start =", value, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartNotEqualTo(Long value) {
+            addCriterion("gmt_start <>", value, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartGreaterThan(Long value) {
+            addCriterion("gmt_start >", value, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartGreaterThanOrEqualTo(Long value) {
+            addCriterion("gmt_start >=", value, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartLessThan(Long value) {
+            addCriterion("gmt_start <", value, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartLessThanOrEqualTo(Long value) {
+            addCriterion("gmt_start <=", value, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartIn(List<Long> values) {
+            addCriterion("gmt_start in", values, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartNotIn(List<Long> values) {
+            addCriterion("gmt_start not in", values, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartBetween(Long value1, Long value2) {
+            addCriterion("gmt_start between", value1, value2, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtStartNotBetween(Long value1, Long value2) {
+            addCriterion("gmt_start not between", value1, value2, "gmtStart");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndIsNull() {
+            addCriterion("gmt_end is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndIsNotNull() {
+            addCriterion("gmt_end is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndEqualTo(Long value) {
+            addCriterion("gmt_end =", value, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndNotEqualTo(Long value) {
+            addCriterion("gmt_end <>", value, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndGreaterThan(Long value) {
+            addCriterion("gmt_end >", value, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndGreaterThanOrEqualTo(Long value) {
+            addCriterion("gmt_end >=", value, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndLessThan(Long value) {
+            addCriterion("gmt_end <", value, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndLessThanOrEqualTo(Long value) {
+            addCriterion("gmt_end <=", value, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndIn(List<Long> values) {
+            addCriterion("gmt_end in", values, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndNotIn(List<Long> values) {
+            addCriterion("gmt_end not in", values, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndBetween(Long value1, Long value2) {
+            addCriterion("gmt_end between", value1, value2, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtEndNotBetween(Long value1, Long value2) {
+            addCriterion("gmt_end not between", value1, value2, "gmtEnd");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateIsNull() {
+            addCriterion("gmt_create is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateIsNotNull() {
+            addCriterion("gmt_create is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateEqualTo(Long value) {
+            addCriterion("gmt_create =", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateNotEqualTo(Long value) {
+            addCriterion("gmt_create <>", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateGreaterThan(Long value) {
+            addCriterion("gmt_create >", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateGreaterThanOrEqualTo(Long value) {
+            addCriterion("gmt_create >=", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateLessThan(Long value) {
+            addCriterion("gmt_create <", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateLessThanOrEqualTo(Long value) {
+            addCriterion("gmt_create <=", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateIn(List<Long> values) {
+            addCriterion("gmt_create in", values, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateNotIn(List<Long> values) {
+            addCriterion("gmt_create not in", values, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateBetween(Long value1, Long value2) {
+            addCriterion("gmt_create between", value1, value2, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateNotBetween(Long value1, Long value2) {
+            addCriterion("gmt_create not between", value1, value2, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedIsNull() {
+            addCriterion("gmt_modified is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedIsNotNull() {
+            addCriterion("gmt_modified is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedEqualTo(Long value) {
+            addCriterion("gmt_modified =", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedNotEqualTo(Long value) {
+            addCriterion("gmt_modified <>", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedGreaterThan(Long value) {
+            addCriterion("gmt_modified >", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedGreaterThanOrEqualTo(Long value) {
+            addCriterion("gmt_modified >=", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedLessThan(Long value) {
+            addCriterion("gmt_modified <", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedLessThanOrEqualTo(Long value) {
+            addCriterion("gmt_modified <=", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedIn(List<Long> values) {
+            addCriterion("gmt_modified in", values, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedNotIn(List<Long> values) {
+            addCriterion("gmt_modified not in", values, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedBetween(Long value1, Long value2) {
+            addCriterion("gmt_modified between", value1, value2, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedNotBetween(Long value1, Long value2) {
+            addCriterion("gmt_modified not between", value1, value2, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Integer value) {
+            addCriterion("status =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Integer value) {
+            addCriterion("status <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Integer value) {
+            addCriterion("status >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
+            addCriterion("status >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Integer value) {
+            addCriterion("status <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Integer value) {
+            addCriterion("status <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Integer> values) {
+            addCriterion("status in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Integer> values) {
+            addCriterion("status not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Integer value1, Integer value2) {
+            addCriterion("status between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Integer value1, Integer value2) {
+            addCriterion("status not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosIsNull() {
+            addCriterion("pos is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosIsNotNull() {
+            addCriterion("pos is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosEqualTo(String value) {
+            addCriterion("pos =", value, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosNotEqualTo(String value) {
+            addCriterion("pos <>", value, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosGreaterThan(String value) {
+            addCriterion("pos >", value, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosGreaterThanOrEqualTo(String value) {
+            addCriterion("pos >=", value, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosLessThan(String value) {
+            addCriterion("pos <", value, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosLessThanOrEqualTo(String value) {
+            addCriterion("pos <=", value, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosLike(String value) {
+            addCriterion("pos like", value, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosNotLike(String value) {
+            addCriterion("pos not like", value, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosIn(List<String> values) {
+            addCriterion("pos in", values, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosNotIn(List<String> values) {
+            addCriterion("pos not in", values, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosBetween(String value1, String value2) {
+            addCriterion("pos between", value1, value2, "pos");
+            return (Criteria) this;
+        }
+
+        public Criteria andPosNotBetween(String value1, String value2) {
+            addCriterion("pos not between", value1, value2, "pos");
+            return (Criteria) this;
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table ad
+     *
+     * @mbg.generated do_not_delete_during_merge Fri Apr 22 08:17:25 CST 2022
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table ad
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/model/Comment.java b/src/main/java/life/majiang/community/model/Comment.java
index 47784d0..7c54f69 100644
--- a/src/main/java/life/majiang/community/model/Comment.java
+++ b/src/main/java/life/majiang/community/model/Comment.java
@@ -4,91 +4,91 @@ public class Comment {
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column COMMENT.ID
+     * This field corresponds to the database column comment.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long id;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column COMMENT.PARENT_ID
+     * This field corresponds to the database column comment.parent_id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long parentId;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column COMMENT.TYPE
+     * This field corresponds to the database column comment.type
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Integer type;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column COMMENT.COMMENTATOR
+     * This field corresponds to the database column comment.commentator
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long commentator;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column COMMENT.GMT_CREATE
+     * This field corresponds to the database column comment.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long gmtCreate;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column COMMENT.GMT_MODIFIED
+     * This field corresponds to the database column comment.gmt_modified
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long gmtModified;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column COMMENT.LIKE_COUNT
+     * This field corresponds to the database column comment.like_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long likeCount;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column COMMENT.CONTENT
+     * This field corresponds to the database column comment.content
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String content;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column COMMENT.COMMENT_COUNT
+     * This field corresponds to the database column comment.comment_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Integer commentCount;
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column COMMENT.ID
+     * This method returns the value of the database column comment.id
      *
-     * @return the value of COMMENT.ID
+     * @return the value of comment.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getId() {
         return id;
@@ -96,11 +96,11 @@ public Long getId() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column COMMENT.ID
+     * This method sets the value of the database column comment.id
      *
-     * @param id the value for COMMENT.ID
+     * @param id the value for comment.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setId(Long id) {
         this.id = id;
@@ -108,11 +108,11 @@ public void setId(Long id) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column COMMENT.PARENT_ID
+     * This method returns the value of the database column comment.parent_id
      *
-     * @return the value of COMMENT.PARENT_ID
+     * @return the value of comment.parent_id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getParentId() {
         return parentId;
@@ -120,11 +120,11 @@ public Long getParentId() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column COMMENT.PARENT_ID
+     * This method sets the value of the database column comment.parent_id
      *
-     * @param parentId the value for COMMENT.PARENT_ID
+     * @param parentId the value for comment.parent_id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setParentId(Long parentId) {
         this.parentId = parentId;
@@ -132,11 +132,11 @@ public void setParentId(Long parentId) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column COMMENT.TYPE
+     * This method returns the value of the database column comment.type
      *
-     * @return the value of COMMENT.TYPE
+     * @return the value of comment.type
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Integer getType() {
         return type;
@@ -144,11 +144,11 @@ public Integer getType() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column COMMENT.TYPE
+     * This method sets the value of the database column comment.type
      *
-     * @param type the value for COMMENT.TYPE
+     * @param type the value for comment.type
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setType(Integer type) {
         this.type = type;
@@ -156,11 +156,11 @@ public void setType(Integer type) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column COMMENT.COMMENTATOR
+     * This method returns the value of the database column comment.commentator
      *
-     * @return the value of COMMENT.COMMENTATOR
+     * @return the value of comment.commentator
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getCommentator() {
         return commentator;
@@ -168,11 +168,11 @@ public Long getCommentator() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column COMMENT.COMMENTATOR
+     * This method sets the value of the database column comment.commentator
      *
-     * @param commentator the value for COMMENT.COMMENTATOR
+     * @param commentator the value for comment.commentator
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setCommentator(Long commentator) {
         this.commentator = commentator;
@@ -180,11 +180,11 @@ public void setCommentator(Long commentator) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column COMMENT.GMT_CREATE
+     * This method returns the value of the database column comment.gmt_create
      *
-     * @return the value of COMMENT.GMT_CREATE
+     * @return the value of comment.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getGmtCreate() {
         return gmtCreate;
@@ -192,11 +192,11 @@ public Long getGmtCreate() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column COMMENT.GMT_CREATE
+     * This method sets the value of the database column comment.gmt_create
      *
-     * @param gmtCreate the value for COMMENT.GMT_CREATE
+     * @param gmtCreate the value for comment.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setGmtCreate(Long gmtCreate) {
         this.gmtCreate = gmtCreate;
@@ -204,11 +204,11 @@ public void setGmtCreate(Long gmtCreate) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column COMMENT.GMT_MODIFIED
+     * This method returns the value of the database column comment.gmt_modified
      *
-     * @return the value of COMMENT.GMT_MODIFIED
+     * @return the value of comment.gmt_modified
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getGmtModified() {
         return gmtModified;
@@ -216,11 +216,11 @@ public Long getGmtModified() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column COMMENT.GMT_MODIFIED
+     * This method sets the value of the database column comment.gmt_modified
      *
-     * @param gmtModified the value for COMMENT.GMT_MODIFIED
+     * @param gmtModified the value for comment.gmt_modified
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setGmtModified(Long gmtModified) {
         this.gmtModified = gmtModified;
@@ -228,11 +228,11 @@ public void setGmtModified(Long gmtModified) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column COMMENT.LIKE_COUNT
+     * This method returns the value of the database column comment.like_count
      *
-     * @return the value of COMMENT.LIKE_COUNT
+     * @return the value of comment.like_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getLikeCount() {
         return likeCount;
@@ -240,11 +240,11 @@ public Long getLikeCount() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column COMMENT.LIKE_COUNT
+     * This method sets the value of the database column comment.like_count
      *
-     * @param likeCount the value for COMMENT.LIKE_COUNT
+     * @param likeCount the value for comment.like_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setLikeCount(Long likeCount) {
         this.likeCount = likeCount;
@@ -252,11 +252,11 @@ public void setLikeCount(Long likeCount) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column COMMENT.CONTENT
+     * This method returns the value of the database column comment.content
      *
-     * @return the value of COMMENT.CONTENT
+     * @return the value of comment.content
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getContent() {
         return content;
@@ -264,11 +264,11 @@ public String getContent() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column COMMENT.CONTENT
+     * This method sets the value of the database column comment.content
      *
-     * @param content the value for COMMENT.CONTENT
+     * @param content the value for comment.content
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setContent(String content) {
         this.content = content == null ? null : content.trim();
@@ -276,11 +276,11 @@ public void setContent(String content) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column COMMENT.COMMENT_COUNT
+     * This method returns the value of the database column comment.comment_count
      *
-     * @return the value of COMMENT.COMMENT_COUNT
+     * @return the value of comment.comment_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Integer getCommentCount() {
         return commentCount;
@@ -288,11 +288,11 @@ public Integer getCommentCount() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column COMMENT.COMMENT_COUNT
+     * This method sets the value of the database column comment.comment_count
      *
-     * @param commentCount the value for COMMENT.COMMENT_COUNT
+     * @param commentCount the value for comment.comment_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setCommentCount(Integer commentCount) {
         this.commentCount = commentCount;
diff --git a/src/main/java/life/majiang/community/model/CommentExample.java b/src/main/java/life/majiang/community/model/CommentExample.java
index 2dc75e1..a3b428a 100644
--- a/src/main/java/life/majiang/community/model/CommentExample.java
+++ b/src/main/java/life/majiang/community/model/CommentExample.java
@@ -6,33 +6,33 @@
 public class CommentExample {
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table COMMENT
+     * This field corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected String orderByClause;
 
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table COMMENT
+     * This field corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected boolean distinct;
 
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table COMMENT
+     * This field corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected List<Criteria> oredCriteria;
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public CommentExample() {
         oredCriteria = new ArrayList<Criteria>();
@@ -40,9 +40,9 @@ public CommentExample() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setOrderByClause(String orderByClause) {
         this.orderByClause = orderByClause;
@@ -50,9 +50,9 @@ public void setOrderByClause(String orderByClause) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getOrderByClause() {
         return orderByClause;
@@ -60,9 +60,9 @@ public String getOrderByClause() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setDistinct(boolean distinct) {
         this.distinct = distinct;
@@ -70,9 +70,9 @@ public void setDistinct(boolean distinct) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public boolean isDistinct() {
         return distinct;
@@ -80,9 +80,9 @@ public boolean isDistinct() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public List<Criteria> getOredCriteria() {
         return oredCriteria;
@@ -90,9 +90,9 @@ public List<Criteria> getOredCriteria() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void or(Criteria criteria) {
         oredCriteria.add(criteria);
@@ -100,9 +100,9 @@ public void or(Criteria criteria) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Criteria or() {
         Criteria criteria = createCriteriaInternal();
@@ -112,9 +112,9 @@ public Criteria or() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Criteria createCriteria() {
         Criteria criteria = createCriteriaInternal();
@@ -126,9 +126,9 @@ public Criteria createCriteria() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected Criteria createCriteriaInternal() {
         Criteria criteria = new Criteria();
@@ -137,9 +137,9 @@ protected Criteria createCriteriaInternal() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table COMMENT
+     * This method corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void clear() {
         oredCriteria.clear();
@@ -149,9 +149,9 @@ public void clear() {
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table COMMENT
+     * This class corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected abstract static class GeneratedCriteria {
         protected List<Criterion> criteria;
@@ -195,561 +195,561 @@ protected void addCriterion(String condition, Object value1, Object value2, Stri
         }
 
         public Criteria andIdIsNull() {
-            addCriterion("ID is null");
+            addCriterion("id is null");
             return (Criteria) this;
         }
 
         public Criteria andIdIsNotNull() {
-            addCriterion("ID is not null");
+            addCriterion("id is not null");
             return (Criteria) this;
         }
 
         public Criteria andIdEqualTo(Long value) {
-            addCriterion("ID =", value, "id");
+            addCriterion("id =", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotEqualTo(Long value) {
-            addCriterion("ID <>", value, "id");
+            addCriterion("id <>", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdGreaterThan(Long value) {
-            addCriterion("ID >", value, "id");
+            addCriterion("id >", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdGreaterThanOrEqualTo(Long value) {
-            addCriterion("ID >=", value, "id");
+            addCriterion("id >=", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdLessThan(Long value) {
-            addCriterion("ID <", value, "id");
+            addCriterion("id <", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdLessThanOrEqualTo(Long value) {
-            addCriterion("ID <=", value, "id");
+            addCriterion("id <=", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdIn(List<Long> values) {
-            addCriterion("ID in", values, "id");
+            addCriterion("id in", values, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotIn(List<Long> values) {
-            addCriterion("ID not in", values, "id");
+            addCriterion("id not in", values, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdBetween(Long value1, Long value2) {
-            addCriterion("ID between", value1, value2, "id");
+            addCriterion("id between", value1, value2, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotBetween(Long value1, Long value2) {
-            addCriterion("ID not between", value1, value2, "id");
+            addCriterion("id not between", value1, value2, "id");
             return (Criteria) this;
         }
 
         public Criteria andParentIdIsNull() {
-            addCriterion("PARENT_ID is null");
+            addCriterion("parent_id is null");
             return (Criteria) this;
         }
 
         public Criteria andParentIdIsNotNull() {
-            addCriterion("PARENT_ID is not null");
+            addCriterion("parent_id is not null");
             return (Criteria) this;
         }
 
         public Criteria andParentIdEqualTo(Long value) {
-            addCriterion("PARENT_ID =", value, "parentId");
+            addCriterion("parent_id =", value, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andParentIdNotEqualTo(Long value) {
-            addCriterion("PARENT_ID <>", value, "parentId");
+            addCriterion("parent_id <>", value, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andParentIdGreaterThan(Long value) {
-            addCriterion("PARENT_ID >", value, "parentId");
+            addCriterion("parent_id >", value, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andParentIdGreaterThanOrEqualTo(Long value) {
-            addCriterion("PARENT_ID >=", value, "parentId");
+            addCriterion("parent_id >=", value, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andParentIdLessThan(Long value) {
-            addCriterion("PARENT_ID <", value, "parentId");
+            addCriterion("parent_id <", value, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andParentIdLessThanOrEqualTo(Long value) {
-            addCriterion("PARENT_ID <=", value, "parentId");
+            addCriterion("parent_id <=", value, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andParentIdIn(List<Long> values) {
-            addCriterion("PARENT_ID in", values, "parentId");
+            addCriterion("parent_id in", values, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andParentIdNotIn(List<Long> values) {
-            addCriterion("PARENT_ID not in", values, "parentId");
+            addCriterion("parent_id not in", values, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andParentIdBetween(Long value1, Long value2) {
-            addCriterion("PARENT_ID between", value1, value2, "parentId");
+            addCriterion("parent_id between", value1, value2, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andParentIdNotBetween(Long value1, Long value2) {
-            addCriterion("PARENT_ID not between", value1, value2, "parentId");
+            addCriterion("parent_id not between", value1, value2, "parentId");
             return (Criteria) this;
         }
 
         public Criteria andTypeIsNull() {
-            addCriterion("TYPE is null");
+            addCriterion("type is null");
             return (Criteria) this;
         }
 
         public Criteria andTypeIsNotNull() {
-            addCriterion("TYPE is not null");
+            addCriterion("type is not null");
             return (Criteria) this;
         }
 
         public Criteria andTypeEqualTo(Integer value) {
-            addCriterion("TYPE =", value, "type");
+            addCriterion("type =", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeNotEqualTo(Integer value) {
-            addCriterion("TYPE <>", value, "type");
+            addCriterion("type <>", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeGreaterThan(Integer value) {
-            addCriterion("TYPE >", value, "type");
+            addCriterion("type >", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeGreaterThanOrEqualTo(Integer value) {
-            addCriterion("TYPE >=", value, "type");
+            addCriterion("type >=", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeLessThan(Integer value) {
-            addCriterion("TYPE <", value, "type");
+            addCriterion("type <", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeLessThanOrEqualTo(Integer value) {
-            addCriterion("TYPE <=", value, "type");
+            addCriterion("type <=", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeIn(List<Integer> values) {
-            addCriterion("TYPE in", values, "type");
+            addCriterion("type in", values, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeNotIn(List<Integer> values) {
-            addCriterion("TYPE not in", values, "type");
+            addCriterion("type not in", values, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeBetween(Integer value1, Integer value2) {
-            addCriterion("TYPE between", value1, value2, "type");
+            addCriterion("type between", value1, value2, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeNotBetween(Integer value1, Integer value2) {
-            addCriterion("TYPE not between", value1, value2, "type");
+            addCriterion("type not between", value1, value2, "type");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorIsNull() {
-            addCriterion("COMMENTATOR is null");
+            addCriterion("commentator is null");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorIsNotNull() {
-            addCriterion("COMMENTATOR is not null");
+            addCriterion("commentator is not null");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorEqualTo(Long value) {
-            addCriterion("COMMENTATOR =", value, "commentator");
+            addCriterion("commentator =", value, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorNotEqualTo(Long value) {
-            addCriterion("COMMENTATOR <>", value, "commentator");
+            addCriterion("commentator <>", value, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorGreaterThan(Long value) {
-            addCriterion("COMMENTATOR >", value, "commentator");
+            addCriterion("commentator >", value, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorGreaterThanOrEqualTo(Long value) {
-            addCriterion("COMMENTATOR >=", value, "commentator");
+            addCriterion("commentator >=", value, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorLessThan(Long value) {
-            addCriterion("COMMENTATOR <", value, "commentator");
+            addCriterion("commentator <", value, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorLessThanOrEqualTo(Long value) {
-            addCriterion("COMMENTATOR <=", value, "commentator");
+            addCriterion("commentator <=", value, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorIn(List<Long> values) {
-            addCriterion("COMMENTATOR in", values, "commentator");
+            addCriterion("commentator in", values, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorNotIn(List<Long> values) {
-            addCriterion("COMMENTATOR not in", values, "commentator");
+            addCriterion("commentator not in", values, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorBetween(Long value1, Long value2) {
-            addCriterion("COMMENTATOR between", value1, value2, "commentator");
+            addCriterion("commentator between", value1, value2, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andCommentatorNotBetween(Long value1, Long value2) {
-            addCriterion("COMMENTATOR not between", value1, value2, "commentator");
+            addCriterion("commentator not between", value1, value2, "commentator");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIsNull() {
-            addCriterion("GMT_CREATE is null");
+            addCriterion("gmt_create is null");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIsNotNull() {
-            addCriterion("GMT_CREATE is not null");
+            addCriterion("gmt_create is not null");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateEqualTo(Long value) {
-            addCriterion("GMT_CREATE =", value, "gmtCreate");
+            addCriterion("gmt_create =", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotEqualTo(Long value) {
-            addCriterion("GMT_CREATE <>", value, "gmtCreate");
+            addCriterion("gmt_create <>", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateGreaterThan(Long value) {
-            addCriterion("GMT_CREATE >", value, "gmtCreate");
+            addCriterion("gmt_create >", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateGreaterThanOrEqualTo(Long value) {
-            addCriterion("GMT_CREATE >=", value, "gmtCreate");
+            addCriterion("gmt_create >=", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateLessThan(Long value) {
-            addCriterion("GMT_CREATE <", value, "gmtCreate");
+            addCriterion("gmt_create <", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateLessThanOrEqualTo(Long value) {
-            addCriterion("GMT_CREATE <=", value, "gmtCreate");
+            addCriterion("gmt_create <=", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIn(List<Long> values) {
-            addCriterion("GMT_CREATE in", values, "gmtCreate");
+            addCriterion("gmt_create in", values, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotIn(List<Long> values) {
-            addCriterion("GMT_CREATE not in", values, "gmtCreate");
+            addCriterion("gmt_create not in", values, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateBetween(Long value1, Long value2) {
-            addCriterion("GMT_CREATE between", value1, value2, "gmtCreate");
+            addCriterion("gmt_create between", value1, value2, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotBetween(Long value1, Long value2) {
-            addCriterion("GMT_CREATE not between", value1, value2, "gmtCreate");
+            addCriterion("gmt_create not between", value1, value2, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedIsNull() {
-            addCriterion("GMT_MODIFIED is null");
+            addCriterion("gmt_modified is null");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedIsNotNull() {
-            addCriterion("GMT_MODIFIED is not null");
+            addCriterion("gmt_modified is not null");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED =", value, "gmtModified");
+            addCriterion("gmt_modified =", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedNotEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED <>", value, "gmtModified");
+            addCriterion("gmt_modified <>", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedGreaterThan(Long value) {
-            addCriterion("GMT_MODIFIED >", value, "gmtModified");
+            addCriterion("gmt_modified >", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedGreaterThanOrEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED >=", value, "gmtModified");
+            addCriterion("gmt_modified >=", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedLessThan(Long value) {
-            addCriterion("GMT_MODIFIED <", value, "gmtModified");
+            addCriterion("gmt_modified <", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedLessThanOrEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED <=", value, "gmtModified");
+            addCriterion("gmt_modified <=", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedIn(List<Long> values) {
-            addCriterion("GMT_MODIFIED in", values, "gmtModified");
+            addCriterion("gmt_modified in", values, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedNotIn(List<Long> values) {
-            addCriterion("GMT_MODIFIED not in", values, "gmtModified");
+            addCriterion("gmt_modified not in", values, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedBetween(Long value1, Long value2) {
-            addCriterion("GMT_MODIFIED between", value1, value2, "gmtModified");
+            addCriterion("gmt_modified between", value1, value2, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedNotBetween(Long value1, Long value2) {
-            addCriterion("GMT_MODIFIED not between", value1, value2, "gmtModified");
+            addCriterion("gmt_modified not between", value1, value2, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountIsNull() {
-            addCriterion("LIKE_COUNT is null");
+            addCriterion("like_count is null");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountIsNotNull() {
-            addCriterion("LIKE_COUNT is not null");
+            addCriterion("like_count is not null");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountEqualTo(Long value) {
-            addCriterion("LIKE_COUNT =", value, "likeCount");
+            addCriterion("like_count =", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountNotEqualTo(Long value) {
-            addCriterion("LIKE_COUNT <>", value, "likeCount");
+            addCriterion("like_count <>", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountGreaterThan(Long value) {
-            addCriterion("LIKE_COUNT >", value, "likeCount");
+            addCriterion("like_count >", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountGreaterThanOrEqualTo(Long value) {
-            addCriterion("LIKE_COUNT >=", value, "likeCount");
+            addCriterion("like_count >=", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountLessThan(Long value) {
-            addCriterion("LIKE_COUNT <", value, "likeCount");
+            addCriterion("like_count <", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountLessThanOrEqualTo(Long value) {
-            addCriterion("LIKE_COUNT <=", value, "likeCount");
+            addCriterion("like_count <=", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountIn(List<Long> values) {
-            addCriterion("LIKE_COUNT in", values, "likeCount");
+            addCriterion("like_count in", values, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountNotIn(List<Long> values) {
-            addCriterion("LIKE_COUNT not in", values, "likeCount");
+            addCriterion("like_count not in", values, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountBetween(Long value1, Long value2) {
-            addCriterion("LIKE_COUNT between", value1, value2, "likeCount");
+            addCriterion("like_count between", value1, value2, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountNotBetween(Long value1, Long value2) {
-            addCriterion("LIKE_COUNT not between", value1, value2, "likeCount");
+            addCriterion("like_count not between", value1, value2, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andContentIsNull() {
-            addCriterion("CONTENT is null");
+            addCriterion("content is null");
             return (Criteria) this;
         }
 
         public Criteria andContentIsNotNull() {
-            addCriterion("CONTENT is not null");
+            addCriterion("content is not null");
             return (Criteria) this;
         }
 
         public Criteria andContentEqualTo(String value) {
-            addCriterion("CONTENT =", value, "content");
+            addCriterion("content =", value, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentNotEqualTo(String value) {
-            addCriterion("CONTENT <>", value, "content");
+            addCriterion("content <>", value, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentGreaterThan(String value) {
-            addCriterion("CONTENT >", value, "content");
+            addCriterion("content >", value, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentGreaterThanOrEqualTo(String value) {
-            addCriterion("CONTENT >=", value, "content");
+            addCriterion("content >=", value, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentLessThan(String value) {
-            addCriterion("CONTENT <", value, "content");
+            addCriterion("content <", value, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentLessThanOrEqualTo(String value) {
-            addCriterion("CONTENT <=", value, "content");
+            addCriterion("content <=", value, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentLike(String value) {
-            addCriterion("CONTENT like", value, "content");
+            addCriterion("content like", value, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentNotLike(String value) {
-            addCriterion("CONTENT not like", value, "content");
+            addCriterion("content not like", value, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentIn(List<String> values) {
-            addCriterion("CONTENT in", values, "content");
+            addCriterion("content in", values, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentNotIn(List<String> values) {
-            addCriterion("CONTENT not in", values, "content");
+            addCriterion("content not in", values, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentBetween(String value1, String value2) {
-            addCriterion("CONTENT between", value1, value2, "content");
+            addCriterion("content between", value1, value2, "content");
             return (Criteria) this;
         }
 
         public Criteria andContentNotBetween(String value1, String value2) {
-            addCriterion("CONTENT not between", value1, value2, "content");
+            addCriterion("content not between", value1, value2, "content");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountIsNull() {
-            addCriterion("COMMENT_COUNT is null");
+            addCriterion("comment_count is null");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountIsNotNull() {
-            addCriterion("COMMENT_COUNT is not null");
+            addCriterion("comment_count is not null");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountEqualTo(Integer value) {
-            addCriterion("COMMENT_COUNT =", value, "commentCount");
+            addCriterion("comment_count =", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountNotEqualTo(Integer value) {
-            addCriterion("COMMENT_COUNT <>", value, "commentCount");
+            addCriterion("comment_count <>", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountGreaterThan(Integer value) {
-            addCriterion("COMMENT_COUNT >", value, "commentCount");
+            addCriterion("comment_count >", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountGreaterThanOrEqualTo(Integer value) {
-            addCriterion("COMMENT_COUNT >=", value, "commentCount");
+            addCriterion("comment_count >=", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountLessThan(Integer value) {
-            addCriterion("COMMENT_COUNT <", value, "commentCount");
+            addCriterion("comment_count <", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountLessThanOrEqualTo(Integer value) {
-            addCriterion("COMMENT_COUNT <=", value, "commentCount");
+            addCriterion("comment_count <=", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountIn(List<Integer> values) {
-            addCriterion("COMMENT_COUNT in", values, "commentCount");
+            addCriterion("comment_count in", values, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountNotIn(List<Integer> values) {
-            addCriterion("COMMENT_COUNT not in", values, "commentCount");
+            addCriterion("comment_count not in", values, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountBetween(Integer value1, Integer value2) {
-            addCriterion("COMMENT_COUNT between", value1, value2, "commentCount");
+            addCriterion("comment_count between", value1, value2, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountNotBetween(Integer value1, Integer value2) {
-            addCriterion("COMMENT_COUNT not between", value1, value2, "commentCount");
+            addCriterion("comment_count not between", value1, value2, "commentCount");
             return (Criteria) this;
         }
     }
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table COMMENT
+     * This class corresponds to the database table comment
      *
-     * @mbg.generated do_not_delete_during_merge Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated do_not_delete_during_merge Fri Apr 22 08:17:25 CST 2022
      */
     public static class Criteria extends GeneratedCriteria {
 
@@ -760,9 +760,9 @@ protected Criteria() {
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table COMMENT
+     * This class corresponds to the database table comment
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public static class Criterion {
         private String condition;
diff --git a/src/main/java/life/majiang/community/model/Nav.java b/src/main/java/life/majiang/community/model/Nav.java
new file mode 100644
index 0000000..c68132c
--- /dev/null
+++ b/src/main/java/life/majiang/community/model/Nav.java
@@ -0,0 +1,234 @@
+package life.majiang.community.model;
+
+public class Nav {
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column nav.id
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Integer id;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column nav.title
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private String title;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column nav.url
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private String url;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column nav.priority
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Integer priority;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column nav.gmt_create
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Long gmtCreate;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column nav.gmt_modified
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Long gmtModified;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column nav.status
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Integer status;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column nav.id
+     *
+     * @return the value of nav.id
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column nav.id
+     *
+     * @param id the value for nav.id
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column nav.title
+     *
+     * @return the value of nav.title
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column nav.title
+     *
+     * @param title the value for nav.title
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setTitle(String title) {
+        this.title = title == null ? null : title.trim();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column nav.url
+     *
+     * @return the value of nav.url
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public String getUrl() {
+        return url;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column nav.url
+     *
+     * @param url the value for nav.url
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setUrl(String url) {
+        this.url = url == null ? null : url.trim();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column nav.priority
+     *
+     * @return the value of nav.priority
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Integer getPriority() {
+        return priority;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column nav.priority
+     *
+     * @param priority the value for nav.priority
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setPriority(Integer priority) {
+        this.priority = priority;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column nav.gmt_create
+     *
+     * @return the value of nav.gmt_create
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Long getGmtCreate() {
+        return gmtCreate;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column nav.gmt_create
+     *
+     * @param gmtCreate the value for nav.gmt_create
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setGmtCreate(Long gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column nav.gmt_modified
+     *
+     * @return the value of nav.gmt_modified
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Long getGmtModified() {
+        return gmtModified;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column nav.gmt_modified
+     *
+     * @param gmtModified the value for nav.gmt_modified
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setGmtModified(Long gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column nav.status
+     *
+     * @return the value of nav.status
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column nav.status
+     *
+     * @param status the value for nav.status
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/model/NavExample.java b/src/main/java/life/majiang/community/model/NavExample.java
new file mode 100644
index 0000000..f7f9f9f
--- /dev/null
+++ b/src/main/java/life/majiang/community/model/NavExample.java
@@ -0,0 +1,742 @@
+package life.majiang.community.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NavExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public NavExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Integer value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Integer value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Integer value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Integer value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Integer value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Integer> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Integer> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Integer value1, Integer value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNull() {
+            addCriterion("title is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNotNull() {
+            addCriterion("title is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleEqualTo(String value) {
+            addCriterion("title =", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotEqualTo(String value) {
+            addCriterion("title <>", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThan(String value) {
+            addCriterion("title >", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThanOrEqualTo(String value) {
+            addCriterion("title >=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThan(String value) {
+            addCriterion("title <", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThanOrEqualTo(String value) {
+            addCriterion("title <=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLike(String value) {
+            addCriterion("title like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotLike(String value) {
+            addCriterion("title not like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIn(List<String> values) {
+            addCriterion("title in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotIn(List<String> values) {
+            addCriterion("title not in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleBetween(String value1, String value2) {
+            addCriterion("title between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotBetween(String value1, String value2) {
+            addCriterion("title not between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNull() {
+            addCriterion("url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNotNull() {
+            addCriterion("url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlEqualTo(String value) {
+            addCriterion("url =", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotEqualTo(String value) {
+            addCriterion("url <>", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThan(String value) {
+            addCriterion("url >", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("url >=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThan(String value) {
+            addCriterion("url <", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThanOrEqualTo(String value) {
+            addCriterion("url <=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLike(String value) {
+            addCriterion("url like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotLike(String value) {
+            addCriterion("url not like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIn(List<String> values) {
+            addCriterion("url in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotIn(List<String> values) {
+            addCriterion("url not in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlBetween(String value1, String value2) {
+            addCriterion("url between", value1, value2, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotBetween(String value1, String value2) {
+            addCriterion("url not between", value1, value2, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityIsNull() {
+            addCriterion("priority is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityIsNotNull() {
+            addCriterion("priority is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityEqualTo(Integer value) {
+            addCriterion("priority =", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityNotEqualTo(Integer value) {
+            addCriterion("priority <>", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityGreaterThan(Integer value) {
+            addCriterion("priority >", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityGreaterThanOrEqualTo(Integer value) {
+            addCriterion("priority >=", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityLessThan(Integer value) {
+            addCriterion("priority <", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityLessThanOrEqualTo(Integer value) {
+            addCriterion("priority <=", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityIn(List<Integer> values) {
+            addCriterion("priority in", values, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityNotIn(List<Integer> values) {
+            addCriterion("priority not in", values, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityBetween(Integer value1, Integer value2) {
+            addCriterion("priority between", value1, value2, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityNotBetween(Integer value1, Integer value2) {
+            addCriterion("priority not between", value1, value2, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateIsNull() {
+            addCriterion("gmt_create is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateIsNotNull() {
+            addCriterion("gmt_create is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateEqualTo(Long value) {
+            addCriterion("gmt_create =", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateNotEqualTo(Long value) {
+            addCriterion("gmt_create <>", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateGreaterThan(Long value) {
+            addCriterion("gmt_create >", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateGreaterThanOrEqualTo(Long value) {
+            addCriterion("gmt_create >=", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateLessThan(Long value) {
+            addCriterion("gmt_create <", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateLessThanOrEqualTo(Long value) {
+            addCriterion("gmt_create <=", value, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateIn(List<Long> values) {
+            addCriterion("gmt_create in", values, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateNotIn(List<Long> values) {
+            addCriterion("gmt_create not in", values, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateBetween(Long value1, Long value2) {
+            addCriterion("gmt_create between", value1, value2, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtCreateNotBetween(Long value1, Long value2) {
+            addCriterion("gmt_create not between", value1, value2, "gmtCreate");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedIsNull() {
+            addCriterion("gmt_modified is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedIsNotNull() {
+            addCriterion("gmt_modified is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedEqualTo(Long value) {
+            addCriterion("gmt_modified =", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedNotEqualTo(Long value) {
+            addCriterion("gmt_modified <>", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedGreaterThan(Long value) {
+            addCriterion("gmt_modified >", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedGreaterThanOrEqualTo(Long value) {
+            addCriterion("gmt_modified >=", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedLessThan(Long value) {
+            addCriterion("gmt_modified <", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedLessThanOrEqualTo(Long value) {
+            addCriterion("gmt_modified <=", value, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedIn(List<Long> values) {
+            addCriterion("gmt_modified in", values, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedNotIn(List<Long> values) {
+            addCriterion("gmt_modified not in", values, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedBetween(Long value1, Long value2) {
+            addCriterion("gmt_modified between", value1, value2, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andGmtModifiedNotBetween(Long value1, Long value2) {
+            addCriterion("gmt_modified not between", value1, value2, "gmtModified");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Integer value) {
+            addCriterion("status =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Integer value) {
+            addCriterion("status <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Integer value) {
+            addCriterion("status >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
+            addCriterion("status >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Integer value) {
+            addCriterion("status <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Integer value) {
+            addCriterion("status <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Integer> values) {
+            addCriterion("status in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Integer> values) {
+            addCriterion("status not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Integer value1, Integer value2) {
+            addCriterion("status between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Integer value1, Integer value2) {
+            addCriterion("status not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table nav
+     *
+     * @mbg.generated do_not_delete_during_merge Fri Apr 22 08:17:25 CST 2022
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table nav
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/model/Notification.java b/src/main/java/life/majiang/community/model/Notification.java
index b9b18d7..1acbcbe 100644
--- a/src/main/java/life/majiang/community/model/Notification.java
+++ b/src/main/java/life/majiang/community/model/Notification.java
@@ -4,91 +4,91 @@ public class Notification {
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column NOTIFICATION.ID
+     * This field corresponds to the database column notification.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long id;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column NOTIFICATION.NOTIFIER
+     * This field corresponds to the database column notification.notifier
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long notifier;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column NOTIFICATION.RECEIVER
+     * This field corresponds to the database column notification.receiver
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long receiver;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column NOTIFICATION.OUTERID
+     * This field corresponds to the database column notification.outerid
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long outerid;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column NOTIFICATION.TYPE
+     * This field corresponds to the database column notification.type
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Integer type;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column NOTIFICATION.GMT_CREATE
+     * This field corresponds to the database column notification.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long gmtCreate;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column NOTIFICATION.STATUS
+     * This field corresponds to the database column notification.status
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Integer status;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column NOTIFICATION.NOTIFIER_NAME
+     * This field corresponds to the database column notification.notifier_name
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String notifierName;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column NOTIFICATION.OUTER_TITLE
+     * This field corresponds to the database column notification.outer_title
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String outerTitle;
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column NOTIFICATION.ID
+     * This method returns the value of the database column notification.id
      *
-     * @return the value of NOTIFICATION.ID
+     * @return the value of notification.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getId() {
         return id;
@@ -96,11 +96,11 @@ public Long getId() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column NOTIFICATION.ID
+     * This method sets the value of the database column notification.id
      *
-     * @param id the value for NOTIFICATION.ID
+     * @param id the value for notification.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setId(Long id) {
         this.id = id;
@@ -108,11 +108,11 @@ public void setId(Long id) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column NOTIFICATION.NOTIFIER
+     * This method returns the value of the database column notification.notifier
      *
-     * @return the value of NOTIFICATION.NOTIFIER
+     * @return the value of notification.notifier
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getNotifier() {
         return notifier;
@@ -120,11 +120,11 @@ public Long getNotifier() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column NOTIFICATION.NOTIFIER
+     * This method sets the value of the database column notification.notifier
      *
-     * @param notifier the value for NOTIFICATION.NOTIFIER
+     * @param notifier the value for notification.notifier
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setNotifier(Long notifier) {
         this.notifier = notifier;
@@ -132,11 +132,11 @@ public void setNotifier(Long notifier) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column NOTIFICATION.RECEIVER
+     * This method returns the value of the database column notification.receiver
      *
-     * @return the value of NOTIFICATION.RECEIVER
+     * @return the value of notification.receiver
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getReceiver() {
         return receiver;
@@ -144,11 +144,11 @@ public Long getReceiver() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column NOTIFICATION.RECEIVER
+     * This method sets the value of the database column notification.receiver
      *
-     * @param receiver the value for NOTIFICATION.RECEIVER
+     * @param receiver the value for notification.receiver
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setReceiver(Long receiver) {
         this.receiver = receiver;
@@ -156,11 +156,11 @@ public void setReceiver(Long receiver) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column NOTIFICATION.OUTERID
+     * This method returns the value of the database column notification.outerid
      *
-     * @return the value of NOTIFICATION.OUTERID
+     * @return the value of notification.outerid
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getOuterid() {
         return outerid;
@@ -168,11 +168,11 @@ public Long getOuterid() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column NOTIFICATION.OUTERID
+     * This method sets the value of the database column notification.outerid
      *
-     * @param outerid the value for NOTIFICATION.OUTERID
+     * @param outerid the value for notification.outerid
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setOuterid(Long outerid) {
         this.outerid = outerid;
@@ -180,11 +180,11 @@ public void setOuterid(Long outerid) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column NOTIFICATION.TYPE
+     * This method returns the value of the database column notification.type
      *
-     * @return the value of NOTIFICATION.TYPE
+     * @return the value of notification.type
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Integer getType() {
         return type;
@@ -192,11 +192,11 @@ public Integer getType() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column NOTIFICATION.TYPE
+     * This method sets the value of the database column notification.type
      *
-     * @param type the value for NOTIFICATION.TYPE
+     * @param type the value for notification.type
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setType(Integer type) {
         this.type = type;
@@ -204,11 +204,11 @@ public void setType(Integer type) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column NOTIFICATION.GMT_CREATE
+     * This method returns the value of the database column notification.gmt_create
      *
-     * @return the value of NOTIFICATION.GMT_CREATE
+     * @return the value of notification.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getGmtCreate() {
         return gmtCreate;
@@ -216,11 +216,11 @@ public Long getGmtCreate() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column NOTIFICATION.GMT_CREATE
+     * This method sets the value of the database column notification.gmt_create
      *
-     * @param gmtCreate the value for NOTIFICATION.GMT_CREATE
+     * @param gmtCreate the value for notification.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setGmtCreate(Long gmtCreate) {
         this.gmtCreate = gmtCreate;
@@ -228,11 +228,11 @@ public void setGmtCreate(Long gmtCreate) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column NOTIFICATION.STATUS
+     * This method returns the value of the database column notification.status
      *
-     * @return the value of NOTIFICATION.STATUS
+     * @return the value of notification.status
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Integer getStatus() {
         return status;
@@ -240,11 +240,11 @@ public Integer getStatus() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column NOTIFICATION.STATUS
+     * This method sets the value of the database column notification.status
      *
-     * @param status the value for NOTIFICATION.STATUS
+     * @param status the value for notification.status
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setStatus(Integer status) {
         this.status = status;
@@ -252,11 +252,11 @@ public void setStatus(Integer status) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column NOTIFICATION.NOTIFIER_NAME
+     * This method returns the value of the database column notification.notifier_name
      *
-     * @return the value of NOTIFICATION.NOTIFIER_NAME
+     * @return the value of notification.notifier_name
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getNotifierName() {
         return notifierName;
@@ -264,11 +264,11 @@ public String getNotifierName() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column NOTIFICATION.NOTIFIER_NAME
+     * This method sets the value of the database column notification.notifier_name
      *
-     * @param notifierName the value for NOTIFICATION.NOTIFIER_NAME
+     * @param notifierName the value for notification.notifier_name
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setNotifierName(String notifierName) {
         this.notifierName = notifierName == null ? null : notifierName.trim();
@@ -276,11 +276,11 @@ public void setNotifierName(String notifierName) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column NOTIFICATION.OUTER_TITLE
+     * This method returns the value of the database column notification.outer_title
      *
-     * @return the value of NOTIFICATION.OUTER_TITLE
+     * @return the value of notification.outer_title
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getOuterTitle() {
         return outerTitle;
@@ -288,11 +288,11 @@ public String getOuterTitle() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column NOTIFICATION.OUTER_TITLE
+     * This method sets the value of the database column notification.outer_title
      *
-     * @param outerTitle the value for NOTIFICATION.OUTER_TITLE
+     * @param outerTitle the value for notification.outer_title
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setOuterTitle(String outerTitle) {
         this.outerTitle = outerTitle == null ? null : outerTitle.trim();
diff --git a/src/main/java/life/majiang/community/model/NotificationExample.java b/src/main/java/life/majiang/community/model/NotificationExample.java
index 9e07ad2..194ff3e 100644
--- a/src/main/java/life/majiang/community/model/NotificationExample.java
+++ b/src/main/java/life/majiang/community/model/NotificationExample.java
@@ -6,33 +6,33 @@
 public class NotificationExample {
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table NOTIFICATION
+     * This field corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected String orderByClause;
 
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table NOTIFICATION
+     * This field corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected boolean distinct;
 
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table NOTIFICATION
+     * This field corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected List<Criteria> oredCriteria;
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public NotificationExample() {
         oredCriteria = new ArrayList<Criteria>();
@@ -40,9 +40,9 @@ public NotificationExample() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setOrderByClause(String orderByClause) {
         this.orderByClause = orderByClause;
@@ -50,9 +50,9 @@ public void setOrderByClause(String orderByClause) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getOrderByClause() {
         return orderByClause;
@@ -60,9 +60,9 @@ public String getOrderByClause() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setDistinct(boolean distinct) {
         this.distinct = distinct;
@@ -70,9 +70,9 @@ public void setDistinct(boolean distinct) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public boolean isDistinct() {
         return distinct;
@@ -80,9 +80,9 @@ public boolean isDistinct() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public List<Criteria> getOredCriteria() {
         return oredCriteria;
@@ -90,9 +90,9 @@ public List<Criteria> getOredCriteria() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void or(Criteria criteria) {
         oredCriteria.add(criteria);
@@ -100,9 +100,9 @@ public void or(Criteria criteria) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Criteria or() {
         Criteria criteria = createCriteriaInternal();
@@ -112,9 +112,9 @@ public Criteria or() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Criteria createCriteria() {
         Criteria criteria = createCriteriaInternal();
@@ -126,9 +126,9 @@ public Criteria createCriteria() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected Criteria createCriteriaInternal() {
         Criteria criteria = new Criteria();
@@ -137,9 +137,9 @@ protected Criteria createCriteriaInternal() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table NOTIFICATION
+     * This method corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void clear() {
         oredCriteria.clear();
@@ -149,9 +149,9 @@ public void clear() {
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table NOTIFICATION
+     * This class corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected abstract static class GeneratedCriteria {
         protected List<Criterion> criteria;
@@ -195,571 +195,571 @@ protected void addCriterion(String condition, Object value1, Object value2, Stri
         }
 
         public Criteria andIdIsNull() {
-            addCriterion("ID is null");
+            addCriterion("id is null");
             return (Criteria) this;
         }
 
         public Criteria andIdIsNotNull() {
-            addCriterion("ID is not null");
+            addCriterion("id is not null");
             return (Criteria) this;
         }
 
         public Criteria andIdEqualTo(Long value) {
-            addCriterion("ID =", value, "id");
+            addCriterion("id =", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotEqualTo(Long value) {
-            addCriterion("ID <>", value, "id");
+            addCriterion("id <>", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdGreaterThan(Long value) {
-            addCriterion("ID >", value, "id");
+            addCriterion("id >", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdGreaterThanOrEqualTo(Long value) {
-            addCriterion("ID >=", value, "id");
+            addCriterion("id >=", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdLessThan(Long value) {
-            addCriterion("ID <", value, "id");
+            addCriterion("id <", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdLessThanOrEqualTo(Long value) {
-            addCriterion("ID <=", value, "id");
+            addCriterion("id <=", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdIn(List<Long> values) {
-            addCriterion("ID in", values, "id");
+            addCriterion("id in", values, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotIn(List<Long> values) {
-            addCriterion("ID not in", values, "id");
+            addCriterion("id not in", values, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdBetween(Long value1, Long value2) {
-            addCriterion("ID between", value1, value2, "id");
+            addCriterion("id between", value1, value2, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotBetween(Long value1, Long value2) {
-            addCriterion("ID not between", value1, value2, "id");
+            addCriterion("id not between", value1, value2, "id");
             return (Criteria) this;
         }
 
         public Criteria andNotifierIsNull() {
-            addCriterion("NOTIFIER is null");
+            addCriterion("notifier is null");
             return (Criteria) this;
         }
 
         public Criteria andNotifierIsNotNull() {
-            addCriterion("NOTIFIER is not null");
+            addCriterion("notifier is not null");
             return (Criteria) this;
         }
 
         public Criteria andNotifierEqualTo(Long value) {
-            addCriterion("NOTIFIER =", value, "notifier");
+            addCriterion("notifier =", value, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNotEqualTo(Long value) {
-            addCriterion("NOTIFIER <>", value, "notifier");
+            addCriterion("notifier <>", value, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andNotifierGreaterThan(Long value) {
-            addCriterion("NOTIFIER >", value, "notifier");
+            addCriterion("notifier >", value, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andNotifierGreaterThanOrEqualTo(Long value) {
-            addCriterion("NOTIFIER >=", value, "notifier");
+            addCriterion("notifier >=", value, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andNotifierLessThan(Long value) {
-            addCriterion("NOTIFIER <", value, "notifier");
+            addCriterion("notifier <", value, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andNotifierLessThanOrEqualTo(Long value) {
-            addCriterion("NOTIFIER <=", value, "notifier");
+            addCriterion("notifier <=", value, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andNotifierIn(List<Long> values) {
-            addCriterion("NOTIFIER in", values, "notifier");
+            addCriterion("notifier in", values, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNotIn(List<Long> values) {
-            addCriterion("NOTIFIER not in", values, "notifier");
+            addCriterion("notifier not in", values, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andNotifierBetween(Long value1, Long value2) {
-            addCriterion("NOTIFIER between", value1, value2, "notifier");
+            addCriterion("notifier between", value1, value2, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNotBetween(Long value1, Long value2) {
-            addCriterion("NOTIFIER not between", value1, value2, "notifier");
+            addCriterion("notifier not between", value1, value2, "notifier");
             return (Criteria) this;
         }
 
         public Criteria andReceiverIsNull() {
-            addCriterion("RECEIVER is null");
+            addCriterion("receiver is null");
             return (Criteria) this;
         }
 
         public Criteria andReceiverIsNotNull() {
-            addCriterion("RECEIVER is not null");
+            addCriterion("receiver is not null");
             return (Criteria) this;
         }
 
         public Criteria andReceiverEqualTo(Long value) {
-            addCriterion("RECEIVER =", value, "receiver");
+            addCriterion("receiver =", value, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andReceiverNotEqualTo(Long value) {
-            addCriterion("RECEIVER <>", value, "receiver");
+            addCriterion("receiver <>", value, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andReceiverGreaterThan(Long value) {
-            addCriterion("RECEIVER >", value, "receiver");
+            addCriterion("receiver >", value, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andReceiverGreaterThanOrEqualTo(Long value) {
-            addCriterion("RECEIVER >=", value, "receiver");
+            addCriterion("receiver >=", value, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andReceiverLessThan(Long value) {
-            addCriterion("RECEIVER <", value, "receiver");
+            addCriterion("receiver <", value, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andReceiverLessThanOrEqualTo(Long value) {
-            addCriterion("RECEIVER <=", value, "receiver");
+            addCriterion("receiver <=", value, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andReceiverIn(List<Long> values) {
-            addCriterion("RECEIVER in", values, "receiver");
+            addCriterion("receiver in", values, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andReceiverNotIn(List<Long> values) {
-            addCriterion("RECEIVER not in", values, "receiver");
+            addCriterion("receiver not in", values, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andReceiverBetween(Long value1, Long value2) {
-            addCriterion("RECEIVER between", value1, value2, "receiver");
+            addCriterion("receiver between", value1, value2, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andReceiverNotBetween(Long value1, Long value2) {
-            addCriterion("RECEIVER not between", value1, value2, "receiver");
+            addCriterion("receiver not between", value1, value2, "receiver");
             return (Criteria) this;
         }
 
         public Criteria andOuteridIsNull() {
-            addCriterion("OUTERID is null");
+            addCriterion("outerid is null");
             return (Criteria) this;
         }
 
         public Criteria andOuteridIsNotNull() {
-            addCriterion("OUTERID is not null");
+            addCriterion("outerid is not null");
             return (Criteria) this;
         }
 
         public Criteria andOuteridEqualTo(Long value) {
-            addCriterion("OUTERID =", value, "outerid");
+            addCriterion("outerid =", value, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andOuteridNotEqualTo(Long value) {
-            addCriterion("OUTERID <>", value, "outerid");
+            addCriterion("outerid <>", value, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andOuteridGreaterThan(Long value) {
-            addCriterion("OUTERID >", value, "outerid");
+            addCriterion("outerid >", value, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andOuteridGreaterThanOrEqualTo(Long value) {
-            addCriterion("OUTERID >=", value, "outerid");
+            addCriterion("outerid >=", value, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andOuteridLessThan(Long value) {
-            addCriterion("OUTERID <", value, "outerid");
+            addCriterion("outerid <", value, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andOuteridLessThanOrEqualTo(Long value) {
-            addCriterion("OUTERID <=", value, "outerid");
+            addCriterion("outerid <=", value, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andOuteridIn(List<Long> values) {
-            addCriterion("OUTERID in", values, "outerid");
+            addCriterion("outerid in", values, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andOuteridNotIn(List<Long> values) {
-            addCriterion("OUTERID not in", values, "outerid");
+            addCriterion("outerid not in", values, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andOuteridBetween(Long value1, Long value2) {
-            addCriterion("OUTERID between", value1, value2, "outerid");
+            addCriterion("outerid between", value1, value2, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andOuteridNotBetween(Long value1, Long value2) {
-            addCriterion("OUTERID not between", value1, value2, "outerid");
+            addCriterion("outerid not between", value1, value2, "outerid");
             return (Criteria) this;
         }
 
         public Criteria andTypeIsNull() {
-            addCriterion("TYPE is null");
+            addCriterion("type is null");
             return (Criteria) this;
         }
 
         public Criteria andTypeIsNotNull() {
-            addCriterion("TYPE is not null");
+            addCriterion("type is not null");
             return (Criteria) this;
         }
 
         public Criteria andTypeEqualTo(Integer value) {
-            addCriterion("TYPE =", value, "type");
+            addCriterion("type =", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeNotEqualTo(Integer value) {
-            addCriterion("TYPE <>", value, "type");
+            addCriterion("type <>", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeGreaterThan(Integer value) {
-            addCriterion("TYPE >", value, "type");
+            addCriterion("type >", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeGreaterThanOrEqualTo(Integer value) {
-            addCriterion("TYPE >=", value, "type");
+            addCriterion("type >=", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeLessThan(Integer value) {
-            addCriterion("TYPE <", value, "type");
+            addCriterion("type <", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeLessThanOrEqualTo(Integer value) {
-            addCriterion("TYPE <=", value, "type");
+            addCriterion("type <=", value, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeIn(List<Integer> values) {
-            addCriterion("TYPE in", values, "type");
+            addCriterion("type in", values, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeNotIn(List<Integer> values) {
-            addCriterion("TYPE not in", values, "type");
+            addCriterion("type not in", values, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeBetween(Integer value1, Integer value2) {
-            addCriterion("TYPE between", value1, value2, "type");
+            addCriterion("type between", value1, value2, "type");
             return (Criteria) this;
         }
 
         public Criteria andTypeNotBetween(Integer value1, Integer value2) {
-            addCriterion("TYPE not between", value1, value2, "type");
+            addCriterion("type not between", value1, value2, "type");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIsNull() {
-            addCriterion("GMT_CREATE is null");
+            addCriterion("gmt_create is null");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIsNotNull() {
-            addCriterion("GMT_CREATE is not null");
+            addCriterion("gmt_create is not null");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateEqualTo(Long value) {
-            addCriterion("GMT_CREATE =", value, "gmtCreate");
+            addCriterion("gmt_create =", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotEqualTo(Long value) {
-            addCriterion("GMT_CREATE <>", value, "gmtCreate");
+            addCriterion("gmt_create <>", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateGreaterThan(Long value) {
-            addCriterion("GMT_CREATE >", value, "gmtCreate");
+            addCriterion("gmt_create >", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateGreaterThanOrEqualTo(Long value) {
-            addCriterion("GMT_CREATE >=", value, "gmtCreate");
+            addCriterion("gmt_create >=", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateLessThan(Long value) {
-            addCriterion("GMT_CREATE <", value, "gmtCreate");
+            addCriterion("gmt_create <", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateLessThanOrEqualTo(Long value) {
-            addCriterion("GMT_CREATE <=", value, "gmtCreate");
+            addCriterion("gmt_create <=", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIn(List<Long> values) {
-            addCriterion("GMT_CREATE in", values, "gmtCreate");
+            addCriterion("gmt_create in", values, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotIn(List<Long> values) {
-            addCriterion("GMT_CREATE not in", values, "gmtCreate");
+            addCriterion("gmt_create not in", values, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateBetween(Long value1, Long value2) {
-            addCriterion("GMT_CREATE between", value1, value2, "gmtCreate");
+            addCriterion("gmt_create between", value1, value2, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotBetween(Long value1, Long value2) {
-            addCriterion("GMT_CREATE not between", value1, value2, "gmtCreate");
+            addCriterion("gmt_create not between", value1, value2, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andStatusIsNull() {
-            addCriterion("STATUS is null");
+            addCriterion("status is null");
             return (Criteria) this;
         }
 
         public Criteria andStatusIsNotNull() {
-            addCriterion("STATUS is not null");
+            addCriterion("status is not null");
             return (Criteria) this;
         }
 
         public Criteria andStatusEqualTo(Integer value) {
-            addCriterion("STATUS =", value, "status");
+            addCriterion("status =", value, "status");
             return (Criteria) this;
         }
 
         public Criteria andStatusNotEqualTo(Integer value) {
-            addCriterion("STATUS <>", value, "status");
+            addCriterion("status <>", value, "status");
             return (Criteria) this;
         }
 
         public Criteria andStatusGreaterThan(Integer value) {
-            addCriterion("STATUS >", value, "status");
+            addCriterion("status >", value, "status");
             return (Criteria) this;
         }
 
         public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
-            addCriterion("STATUS >=", value, "status");
+            addCriterion("status >=", value, "status");
             return (Criteria) this;
         }
 
         public Criteria andStatusLessThan(Integer value) {
-            addCriterion("STATUS <", value, "status");
+            addCriterion("status <", value, "status");
             return (Criteria) this;
         }
 
         public Criteria andStatusLessThanOrEqualTo(Integer value) {
-            addCriterion("STATUS <=", value, "status");
+            addCriterion("status <=", value, "status");
             return (Criteria) this;
         }
 
         public Criteria andStatusIn(List<Integer> values) {
-            addCriterion("STATUS in", values, "status");
+            addCriterion("status in", values, "status");
             return (Criteria) this;
         }
 
         public Criteria andStatusNotIn(List<Integer> values) {
-            addCriterion("STATUS not in", values, "status");
+            addCriterion("status not in", values, "status");
             return (Criteria) this;
         }
 
         public Criteria andStatusBetween(Integer value1, Integer value2) {
-            addCriterion("STATUS between", value1, value2, "status");
+            addCriterion("status between", value1, value2, "status");
             return (Criteria) this;
         }
 
         public Criteria andStatusNotBetween(Integer value1, Integer value2) {
-            addCriterion("STATUS not between", value1, value2, "status");
+            addCriterion("status not between", value1, value2, "status");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameIsNull() {
-            addCriterion("NOTIFIER_NAME is null");
+            addCriterion("notifier_name is null");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameIsNotNull() {
-            addCriterion("NOTIFIER_NAME is not null");
+            addCriterion("notifier_name is not null");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameEqualTo(String value) {
-            addCriterion("NOTIFIER_NAME =", value, "notifierName");
+            addCriterion("notifier_name =", value, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameNotEqualTo(String value) {
-            addCriterion("NOTIFIER_NAME <>", value, "notifierName");
+            addCriterion("notifier_name <>", value, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameGreaterThan(String value) {
-            addCriterion("NOTIFIER_NAME >", value, "notifierName");
+            addCriterion("notifier_name >", value, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameGreaterThanOrEqualTo(String value) {
-            addCriterion("NOTIFIER_NAME >=", value, "notifierName");
+            addCriterion("notifier_name >=", value, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameLessThan(String value) {
-            addCriterion("NOTIFIER_NAME <", value, "notifierName");
+            addCriterion("notifier_name <", value, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameLessThanOrEqualTo(String value) {
-            addCriterion("NOTIFIER_NAME <=", value, "notifierName");
+            addCriterion("notifier_name <=", value, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameLike(String value) {
-            addCriterion("NOTIFIER_NAME like", value, "notifierName");
+            addCriterion("notifier_name like", value, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameNotLike(String value) {
-            addCriterion("NOTIFIER_NAME not like", value, "notifierName");
+            addCriterion("notifier_name not like", value, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameIn(List<String> values) {
-            addCriterion("NOTIFIER_NAME in", values, "notifierName");
+            addCriterion("notifier_name in", values, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameNotIn(List<String> values) {
-            addCriterion("NOTIFIER_NAME not in", values, "notifierName");
+            addCriterion("notifier_name not in", values, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameBetween(String value1, String value2) {
-            addCriterion("NOTIFIER_NAME between", value1, value2, "notifierName");
+            addCriterion("notifier_name between", value1, value2, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andNotifierNameNotBetween(String value1, String value2) {
-            addCriterion("NOTIFIER_NAME not between", value1, value2, "notifierName");
+            addCriterion("notifier_name not between", value1, value2, "notifierName");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleIsNull() {
-            addCriterion("OUTER_TITLE is null");
+            addCriterion("outer_title is null");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleIsNotNull() {
-            addCriterion("OUTER_TITLE is not null");
+            addCriterion("outer_title is not null");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleEqualTo(String value) {
-            addCriterion("OUTER_TITLE =", value, "outerTitle");
+            addCriterion("outer_title =", value, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleNotEqualTo(String value) {
-            addCriterion("OUTER_TITLE <>", value, "outerTitle");
+            addCriterion("outer_title <>", value, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleGreaterThan(String value) {
-            addCriterion("OUTER_TITLE >", value, "outerTitle");
+            addCriterion("outer_title >", value, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleGreaterThanOrEqualTo(String value) {
-            addCriterion("OUTER_TITLE >=", value, "outerTitle");
+            addCriterion("outer_title >=", value, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleLessThan(String value) {
-            addCriterion("OUTER_TITLE <", value, "outerTitle");
+            addCriterion("outer_title <", value, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleLessThanOrEqualTo(String value) {
-            addCriterion("OUTER_TITLE <=", value, "outerTitle");
+            addCriterion("outer_title <=", value, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleLike(String value) {
-            addCriterion("OUTER_TITLE like", value, "outerTitle");
+            addCriterion("outer_title like", value, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleNotLike(String value) {
-            addCriterion("OUTER_TITLE not like", value, "outerTitle");
+            addCriterion("outer_title not like", value, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleIn(List<String> values) {
-            addCriterion("OUTER_TITLE in", values, "outerTitle");
+            addCriterion("outer_title in", values, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleNotIn(List<String> values) {
-            addCriterion("OUTER_TITLE not in", values, "outerTitle");
+            addCriterion("outer_title not in", values, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleBetween(String value1, String value2) {
-            addCriterion("OUTER_TITLE between", value1, value2, "outerTitle");
+            addCriterion("outer_title between", value1, value2, "outerTitle");
             return (Criteria) this;
         }
 
         public Criteria andOuterTitleNotBetween(String value1, String value2) {
-            addCriterion("OUTER_TITLE not between", value1, value2, "outerTitle");
+            addCriterion("outer_title not between", value1, value2, "outerTitle");
             return (Criteria) this;
         }
     }
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table NOTIFICATION
+     * This class corresponds to the database table notification
      *
-     * @mbg.generated do_not_delete_during_merge Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated do_not_delete_during_merge Fri Apr 22 08:17:25 CST 2022
      */
     public static class Criteria extends GeneratedCriteria {
 
@@ -770,9 +770,9 @@ protected Criteria() {
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table NOTIFICATION
+     * This class corresponds to the database table notification
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public static class Criterion {
         private String condition;
diff --git a/src/main/java/life/majiang/community/model/Question.java b/src/main/java/life/majiang/community/model/Question.java
index a0fe2c8..c282196 100644
--- a/src/main/java/life/majiang/community/model/Question.java
+++ b/src/main/java/life/majiang/community/model/Question.java
@@ -4,100 +4,109 @@ public class Question {
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.ID
+     * This field corresponds to the database column question.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long id;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.TITLE
+     * This field corresponds to the database column question.title
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String title;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.GMT_CREATE
+     * This field corresponds to the database column question.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long gmtCreate;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.GMT_MODIFIED
+     * This field corresponds to the database column question.gmt_modified
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long gmtModified;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.CREATOR
+     * This field corresponds to the database column question.creator
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long creator;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.COMMENT_COUNT
+     * This field corresponds to the database column question.comment_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Integer commentCount;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.VIEW_COUNT
+     * This field corresponds to the database column question.view_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Integer viewCount;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.LIKE_COUNT
+     * This field corresponds to the database column question.like_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Integer likeCount;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.TAG
+     * This field corresponds to the database column question.tag
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String tag;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column QUESTION.DESCRIPTION
+     * This field corresponds to the database column question.sticky
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Integer sticky;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column question.description
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String description;
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.ID
+     * This method returns the value of the database column question.id
      *
-     * @return the value of QUESTION.ID
+     * @return the value of question.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getId() {
         return id;
@@ -105,11 +114,11 @@ public Long getId() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.ID
+     * This method sets the value of the database column question.id
      *
-     * @param id the value for QUESTION.ID
+     * @param id the value for question.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setId(Long id) {
         this.id = id;
@@ -117,11 +126,11 @@ public void setId(Long id) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.TITLE
+     * This method returns the value of the database column question.title
      *
-     * @return the value of QUESTION.TITLE
+     * @return the value of question.title
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getTitle() {
         return title;
@@ -129,11 +138,11 @@ public String getTitle() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.TITLE
+     * This method sets the value of the database column question.title
      *
-     * @param title the value for QUESTION.TITLE
+     * @param title the value for question.title
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setTitle(String title) {
         this.title = title == null ? null : title.trim();
@@ -141,11 +150,11 @@ public void setTitle(String title) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.GMT_CREATE
+     * This method returns the value of the database column question.gmt_create
      *
-     * @return the value of QUESTION.GMT_CREATE
+     * @return the value of question.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getGmtCreate() {
         return gmtCreate;
@@ -153,11 +162,11 @@ public Long getGmtCreate() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.GMT_CREATE
+     * This method sets the value of the database column question.gmt_create
      *
-     * @param gmtCreate the value for QUESTION.GMT_CREATE
+     * @param gmtCreate the value for question.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setGmtCreate(Long gmtCreate) {
         this.gmtCreate = gmtCreate;
@@ -165,11 +174,11 @@ public void setGmtCreate(Long gmtCreate) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.GMT_MODIFIED
+     * This method returns the value of the database column question.gmt_modified
      *
-     * @return the value of QUESTION.GMT_MODIFIED
+     * @return the value of question.gmt_modified
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getGmtModified() {
         return gmtModified;
@@ -177,11 +186,11 @@ public Long getGmtModified() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.GMT_MODIFIED
+     * This method sets the value of the database column question.gmt_modified
      *
-     * @param gmtModified the value for QUESTION.GMT_MODIFIED
+     * @param gmtModified the value for question.gmt_modified
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setGmtModified(Long gmtModified) {
         this.gmtModified = gmtModified;
@@ -189,11 +198,11 @@ public void setGmtModified(Long gmtModified) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.CREATOR
+     * This method returns the value of the database column question.creator
      *
-     * @return the value of QUESTION.CREATOR
+     * @return the value of question.creator
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getCreator() {
         return creator;
@@ -201,11 +210,11 @@ public Long getCreator() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.CREATOR
+     * This method sets the value of the database column question.creator
      *
-     * @param creator the value for QUESTION.CREATOR
+     * @param creator the value for question.creator
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setCreator(Long creator) {
         this.creator = creator;
@@ -213,11 +222,11 @@ public void setCreator(Long creator) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.COMMENT_COUNT
+     * This method returns the value of the database column question.comment_count
      *
-     * @return the value of QUESTION.COMMENT_COUNT
+     * @return the value of question.comment_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Integer getCommentCount() {
         return commentCount;
@@ -225,11 +234,11 @@ public Integer getCommentCount() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.COMMENT_COUNT
+     * This method sets the value of the database column question.comment_count
      *
-     * @param commentCount the value for QUESTION.COMMENT_COUNT
+     * @param commentCount the value for question.comment_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setCommentCount(Integer commentCount) {
         this.commentCount = commentCount;
@@ -237,11 +246,11 @@ public void setCommentCount(Integer commentCount) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.VIEW_COUNT
+     * This method returns the value of the database column question.view_count
      *
-     * @return the value of QUESTION.VIEW_COUNT
+     * @return the value of question.view_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Integer getViewCount() {
         return viewCount;
@@ -249,11 +258,11 @@ public Integer getViewCount() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.VIEW_COUNT
+     * This method sets the value of the database column question.view_count
      *
-     * @param viewCount the value for QUESTION.VIEW_COUNT
+     * @param viewCount the value for question.view_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setViewCount(Integer viewCount) {
         this.viewCount = viewCount;
@@ -261,11 +270,11 @@ public void setViewCount(Integer viewCount) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.LIKE_COUNT
+     * This method returns the value of the database column question.like_count
      *
-     * @return the value of QUESTION.LIKE_COUNT
+     * @return the value of question.like_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Integer getLikeCount() {
         return likeCount;
@@ -273,11 +282,11 @@ public Integer getLikeCount() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.LIKE_COUNT
+     * This method sets the value of the database column question.like_count
      *
-     * @param likeCount the value for QUESTION.LIKE_COUNT
+     * @param likeCount the value for question.like_count
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setLikeCount(Integer likeCount) {
         this.likeCount = likeCount;
@@ -285,11 +294,11 @@ public void setLikeCount(Integer likeCount) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.TAG
+     * This method returns the value of the database column question.tag
      *
-     * @return the value of QUESTION.TAG
+     * @return the value of question.tag
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getTag() {
         return tag;
@@ -297,11 +306,11 @@ public String getTag() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.TAG
+     * This method sets the value of the database column question.tag
      *
-     * @param tag the value for QUESTION.TAG
+     * @param tag the value for question.tag
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setTag(String tag) {
         this.tag = tag == null ? null : tag.trim();
@@ -309,11 +318,35 @@ public void setTag(String tag) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column QUESTION.DESCRIPTION
+     * This method returns the value of the database column question.sticky
+     *
+     * @return the value of question.sticky
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Integer getSticky() {
+        return sticky;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column question.sticky
+     *
+     * @param sticky the value for question.sticky
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setSticky(Integer sticky) {
+        this.sticky = sticky;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column question.description
      *
-     * @return the value of QUESTION.DESCRIPTION
+     * @return the value of question.description
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getDescription() {
         return description;
@@ -321,11 +354,11 @@ public String getDescription() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column QUESTION.DESCRIPTION
+     * This method sets the value of the database column question.description
      *
-     * @param description the value for QUESTION.DESCRIPTION
+     * @param description the value for question.description
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setDescription(String description) {
         this.description = description == null ? null : description.trim();
diff --git a/src/main/java/life/majiang/community/model/QuestionExample.java b/src/main/java/life/majiang/community/model/QuestionExample.java
index 86ffc90..deace09 100644
--- a/src/main/java/life/majiang/community/model/QuestionExample.java
+++ b/src/main/java/life/majiang/community/model/QuestionExample.java
@@ -6,33 +6,33 @@
 public class QuestionExample {
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table QUESTION
+     * This field corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected String orderByClause;
 
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table QUESTION
+     * This field corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected boolean distinct;
 
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table QUESTION
+     * This field corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected List<Criteria> oredCriteria;
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public QuestionExample() {
         oredCriteria = new ArrayList<Criteria>();
@@ -40,9 +40,9 @@ public QuestionExample() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setOrderByClause(String orderByClause) {
         this.orderByClause = orderByClause;
@@ -50,9 +50,9 @@ public void setOrderByClause(String orderByClause) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getOrderByClause() {
         return orderByClause;
@@ -60,9 +60,9 @@ public String getOrderByClause() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setDistinct(boolean distinct) {
         this.distinct = distinct;
@@ -70,9 +70,9 @@ public void setDistinct(boolean distinct) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public boolean isDistinct() {
         return distinct;
@@ -80,9 +80,9 @@ public boolean isDistinct() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public List<Criteria> getOredCriteria() {
         return oredCriteria;
@@ -90,9 +90,9 @@ public List<Criteria> getOredCriteria() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void or(Criteria criteria) {
         oredCriteria.add(criteria);
@@ -100,9 +100,9 @@ public void or(Criteria criteria) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Criteria or() {
         Criteria criteria = createCriteriaInternal();
@@ -112,9 +112,9 @@ public Criteria or() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Criteria createCriteria() {
         Criteria criteria = createCriteriaInternal();
@@ -126,9 +126,9 @@ public Criteria createCriteria() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected Criteria createCriteriaInternal() {
         Criteria criteria = new Criteria();
@@ -137,9 +137,9 @@ protected Criteria createCriteriaInternal() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table QUESTION
+     * This method corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void clear() {
         oredCriteria.clear();
@@ -149,9 +149,9 @@ public void clear() {
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table QUESTION
+     * This class corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected abstract static class GeneratedCriteria {
         protected List<Criterion> criteria;
@@ -195,571 +195,631 @@ protected void addCriterion(String condition, Object value1, Object value2, Stri
         }
 
         public Criteria andIdIsNull() {
-            addCriterion("ID is null");
+            addCriterion("id is null");
             return (Criteria) this;
         }
 
         public Criteria andIdIsNotNull() {
-            addCriterion("ID is not null");
+            addCriterion("id is not null");
             return (Criteria) this;
         }
 
         public Criteria andIdEqualTo(Long value) {
-            addCriterion("ID =", value, "id");
+            addCriterion("id =", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotEqualTo(Long value) {
-            addCriterion("ID <>", value, "id");
+            addCriterion("id <>", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdGreaterThan(Long value) {
-            addCriterion("ID >", value, "id");
+            addCriterion("id >", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdGreaterThanOrEqualTo(Long value) {
-            addCriterion("ID >=", value, "id");
+            addCriterion("id >=", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdLessThan(Long value) {
-            addCriterion("ID <", value, "id");
+            addCriterion("id <", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdLessThanOrEqualTo(Long value) {
-            addCriterion("ID <=", value, "id");
+            addCriterion("id <=", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdIn(List<Long> values) {
-            addCriterion("ID in", values, "id");
+            addCriterion("id in", values, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotIn(List<Long> values) {
-            addCriterion("ID not in", values, "id");
+            addCriterion("id not in", values, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdBetween(Long value1, Long value2) {
-            addCriterion("ID between", value1, value2, "id");
+            addCriterion("id between", value1, value2, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotBetween(Long value1, Long value2) {
-            addCriterion("ID not between", value1, value2, "id");
+            addCriterion("id not between", value1, value2, "id");
             return (Criteria) this;
         }
 
         public Criteria andTitleIsNull() {
-            addCriterion("TITLE is null");
+            addCriterion("title is null");
             return (Criteria) this;
         }
 
         public Criteria andTitleIsNotNull() {
-            addCriterion("TITLE is not null");
+            addCriterion("title is not null");
             return (Criteria) this;
         }
 
         public Criteria andTitleEqualTo(String value) {
-            addCriterion("TITLE =", value, "title");
+            addCriterion("title =", value, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleNotEqualTo(String value) {
-            addCriterion("TITLE <>", value, "title");
+            addCriterion("title <>", value, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleGreaterThan(String value) {
-            addCriterion("TITLE >", value, "title");
+            addCriterion("title >", value, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleGreaterThanOrEqualTo(String value) {
-            addCriterion("TITLE >=", value, "title");
+            addCriterion("title >=", value, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleLessThan(String value) {
-            addCriterion("TITLE <", value, "title");
+            addCriterion("title <", value, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleLessThanOrEqualTo(String value) {
-            addCriterion("TITLE <=", value, "title");
+            addCriterion("title <=", value, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleLike(String value) {
-            addCriterion("TITLE like", value, "title");
+            addCriterion("title like", value, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleNotLike(String value) {
-            addCriterion("TITLE not like", value, "title");
+            addCriterion("title not like", value, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleIn(List<String> values) {
-            addCriterion("TITLE in", values, "title");
+            addCriterion("title in", values, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleNotIn(List<String> values) {
-            addCriterion("TITLE not in", values, "title");
+            addCriterion("title not in", values, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleBetween(String value1, String value2) {
-            addCriterion("TITLE between", value1, value2, "title");
+            addCriterion("title between", value1, value2, "title");
             return (Criteria) this;
         }
 
         public Criteria andTitleNotBetween(String value1, String value2) {
-            addCriterion("TITLE not between", value1, value2, "title");
+            addCriterion("title not between", value1, value2, "title");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIsNull() {
-            addCriterion("GMT_CREATE is null");
+            addCriterion("gmt_create is null");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIsNotNull() {
-            addCriterion("GMT_CREATE is not null");
+            addCriterion("gmt_create is not null");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateEqualTo(Long value) {
-            addCriterion("GMT_CREATE =", value, "gmtCreate");
+            addCriterion("gmt_create =", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotEqualTo(Long value) {
-            addCriterion("GMT_CREATE <>", value, "gmtCreate");
+            addCriterion("gmt_create <>", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateGreaterThan(Long value) {
-            addCriterion("GMT_CREATE >", value, "gmtCreate");
+            addCriterion("gmt_create >", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateGreaterThanOrEqualTo(Long value) {
-            addCriterion("GMT_CREATE >=", value, "gmtCreate");
+            addCriterion("gmt_create >=", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateLessThan(Long value) {
-            addCriterion("GMT_CREATE <", value, "gmtCreate");
+            addCriterion("gmt_create <", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateLessThanOrEqualTo(Long value) {
-            addCriterion("GMT_CREATE <=", value, "gmtCreate");
+            addCriterion("gmt_create <=", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIn(List<Long> values) {
-            addCriterion("GMT_CREATE in", values, "gmtCreate");
+            addCriterion("gmt_create in", values, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotIn(List<Long> values) {
-            addCriterion("GMT_CREATE not in", values, "gmtCreate");
+            addCriterion("gmt_create not in", values, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateBetween(Long value1, Long value2) {
-            addCriterion("GMT_CREATE between", value1, value2, "gmtCreate");
+            addCriterion("gmt_create between", value1, value2, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotBetween(Long value1, Long value2) {
-            addCriterion("GMT_CREATE not between", value1, value2, "gmtCreate");
+            addCriterion("gmt_create not between", value1, value2, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedIsNull() {
-            addCriterion("GMT_MODIFIED is null");
+            addCriterion("gmt_modified is null");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedIsNotNull() {
-            addCriterion("GMT_MODIFIED is not null");
+            addCriterion("gmt_modified is not null");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED =", value, "gmtModified");
+            addCriterion("gmt_modified =", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedNotEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED <>", value, "gmtModified");
+            addCriterion("gmt_modified <>", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedGreaterThan(Long value) {
-            addCriterion("GMT_MODIFIED >", value, "gmtModified");
+            addCriterion("gmt_modified >", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedGreaterThanOrEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED >=", value, "gmtModified");
+            addCriterion("gmt_modified >=", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedLessThan(Long value) {
-            addCriterion("GMT_MODIFIED <", value, "gmtModified");
+            addCriterion("gmt_modified <", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedLessThanOrEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED <=", value, "gmtModified");
+            addCriterion("gmt_modified <=", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedIn(List<Long> values) {
-            addCriterion("GMT_MODIFIED in", values, "gmtModified");
+            addCriterion("gmt_modified in", values, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedNotIn(List<Long> values) {
-            addCriterion("GMT_MODIFIED not in", values, "gmtModified");
+            addCriterion("gmt_modified not in", values, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedBetween(Long value1, Long value2) {
-            addCriterion("GMT_MODIFIED between", value1, value2, "gmtModified");
+            addCriterion("gmt_modified between", value1, value2, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedNotBetween(Long value1, Long value2) {
-            addCriterion("GMT_MODIFIED not between", value1, value2, "gmtModified");
+            addCriterion("gmt_modified not between", value1, value2, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andCreatorIsNull() {
-            addCriterion("CREATOR is null");
+            addCriterion("creator is null");
             return (Criteria) this;
         }
 
         public Criteria andCreatorIsNotNull() {
-            addCriterion("CREATOR is not null");
+            addCriterion("creator is not null");
             return (Criteria) this;
         }
 
         public Criteria andCreatorEqualTo(Long value) {
-            addCriterion("CREATOR =", value, "creator");
+            addCriterion("creator =", value, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCreatorNotEqualTo(Long value) {
-            addCriterion("CREATOR <>", value, "creator");
+            addCriterion("creator <>", value, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCreatorGreaterThan(Long value) {
-            addCriterion("CREATOR >", value, "creator");
+            addCriterion("creator >", value, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCreatorGreaterThanOrEqualTo(Long value) {
-            addCriterion("CREATOR >=", value, "creator");
+            addCriterion("creator >=", value, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCreatorLessThan(Long value) {
-            addCriterion("CREATOR <", value, "creator");
+            addCriterion("creator <", value, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCreatorLessThanOrEqualTo(Long value) {
-            addCriterion("CREATOR <=", value, "creator");
+            addCriterion("creator <=", value, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCreatorIn(List<Long> values) {
-            addCriterion("CREATOR in", values, "creator");
+            addCriterion("creator in", values, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCreatorNotIn(List<Long> values) {
-            addCriterion("CREATOR not in", values, "creator");
+            addCriterion("creator not in", values, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCreatorBetween(Long value1, Long value2) {
-            addCriterion("CREATOR between", value1, value2, "creator");
+            addCriterion("creator between", value1, value2, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCreatorNotBetween(Long value1, Long value2) {
-            addCriterion("CREATOR not between", value1, value2, "creator");
+            addCriterion("creator not between", value1, value2, "creator");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountIsNull() {
-            addCriterion("COMMENT_COUNT is null");
+            addCriterion("comment_count is null");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountIsNotNull() {
-            addCriterion("COMMENT_COUNT is not null");
+            addCriterion("comment_count is not null");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountEqualTo(Integer value) {
-            addCriterion("COMMENT_COUNT =", value, "commentCount");
+            addCriterion("comment_count =", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountNotEqualTo(Integer value) {
-            addCriterion("COMMENT_COUNT <>", value, "commentCount");
+            addCriterion("comment_count <>", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountGreaterThan(Integer value) {
-            addCriterion("COMMENT_COUNT >", value, "commentCount");
+            addCriterion("comment_count >", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountGreaterThanOrEqualTo(Integer value) {
-            addCriterion("COMMENT_COUNT >=", value, "commentCount");
+            addCriterion("comment_count >=", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountLessThan(Integer value) {
-            addCriterion("COMMENT_COUNT <", value, "commentCount");
+            addCriterion("comment_count <", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountLessThanOrEqualTo(Integer value) {
-            addCriterion("COMMENT_COUNT <=", value, "commentCount");
+            addCriterion("comment_count <=", value, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountIn(List<Integer> values) {
-            addCriterion("COMMENT_COUNT in", values, "commentCount");
+            addCriterion("comment_count in", values, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountNotIn(List<Integer> values) {
-            addCriterion("COMMENT_COUNT not in", values, "commentCount");
+            addCriterion("comment_count not in", values, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountBetween(Integer value1, Integer value2) {
-            addCriterion("COMMENT_COUNT between", value1, value2, "commentCount");
+            addCriterion("comment_count between", value1, value2, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andCommentCountNotBetween(Integer value1, Integer value2) {
-            addCriterion("COMMENT_COUNT not between", value1, value2, "commentCount");
+            addCriterion("comment_count not between", value1, value2, "commentCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountIsNull() {
-            addCriterion("VIEW_COUNT is null");
+            addCriterion("view_count is null");
             return (Criteria) this;
         }
 
         public Criteria andViewCountIsNotNull() {
-            addCriterion("VIEW_COUNT is not null");
+            addCriterion("view_count is not null");
             return (Criteria) this;
         }
 
         public Criteria andViewCountEqualTo(Integer value) {
-            addCriterion("VIEW_COUNT =", value, "viewCount");
+            addCriterion("view_count =", value, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountNotEqualTo(Integer value) {
-            addCriterion("VIEW_COUNT <>", value, "viewCount");
+            addCriterion("view_count <>", value, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountGreaterThan(Integer value) {
-            addCriterion("VIEW_COUNT >", value, "viewCount");
+            addCriterion("view_count >", value, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountGreaterThanOrEqualTo(Integer value) {
-            addCriterion("VIEW_COUNT >=", value, "viewCount");
+            addCriterion("view_count >=", value, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountLessThan(Integer value) {
-            addCriterion("VIEW_COUNT <", value, "viewCount");
+            addCriterion("view_count <", value, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountLessThanOrEqualTo(Integer value) {
-            addCriterion("VIEW_COUNT <=", value, "viewCount");
+            addCriterion("view_count <=", value, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountIn(List<Integer> values) {
-            addCriterion("VIEW_COUNT in", values, "viewCount");
+            addCriterion("view_count in", values, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountNotIn(List<Integer> values) {
-            addCriterion("VIEW_COUNT not in", values, "viewCount");
+            addCriterion("view_count not in", values, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountBetween(Integer value1, Integer value2) {
-            addCriterion("VIEW_COUNT between", value1, value2, "viewCount");
+            addCriterion("view_count between", value1, value2, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andViewCountNotBetween(Integer value1, Integer value2) {
-            addCriterion("VIEW_COUNT not between", value1, value2, "viewCount");
+            addCriterion("view_count not between", value1, value2, "viewCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountIsNull() {
-            addCriterion("LIKE_COUNT is null");
+            addCriterion("like_count is null");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountIsNotNull() {
-            addCriterion("LIKE_COUNT is not null");
+            addCriterion("like_count is not null");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountEqualTo(Integer value) {
-            addCriterion("LIKE_COUNT =", value, "likeCount");
+            addCriterion("like_count =", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountNotEqualTo(Integer value) {
-            addCriterion("LIKE_COUNT <>", value, "likeCount");
+            addCriterion("like_count <>", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountGreaterThan(Integer value) {
-            addCriterion("LIKE_COUNT >", value, "likeCount");
+            addCriterion("like_count >", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountGreaterThanOrEqualTo(Integer value) {
-            addCriterion("LIKE_COUNT >=", value, "likeCount");
+            addCriterion("like_count >=", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountLessThan(Integer value) {
-            addCriterion("LIKE_COUNT <", value, "likeCount");
+            addCriterion("like_count <", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountLessThanOrEqualTo(Integer value) {
-            addCriterion("LIKE_COUNT <=", value, "likeCount");
+            addCriterion("like_count <=", value, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountIn(List<Integer> values) {
-            addCriterion("LIKE_COUNT in", values, "likeCount");
+            addCriterion("like_count in", values, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountNotIn(List<Integer> values) {
-            addCriterion("LIKE_COUNT not in", values, "likeCount");
+            addCriterion("like_count not in", values, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountBetween(Integer value1, Integer value2) {
-            addCriterion("LIKE_COUNT between", value1, value2, "likeCount");
+            addCriterion("like_count between", value1, value2, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andLikeCountNotBetween(Integer value1, Integer value2) {
-            addCriterion("LIKE_COUNT not between", value1, value2, "likeCount");
+            addCriterion("like_count not between", value1, value2, "likeCount");
             return (Criteria) this;
         }
 
         public Criteria andTagIsNull() {
-            addCriterion("TAG is null");
+            addCriterion("tag is null");
             return (Criteria) this;
         }
 
         public Criteria andTagIsNotNull() {
-            addCriterion("TAG is not null");
+            addCriterion("tag is not null");
             return (Criteria) this;
         }
 
         public Criteria andTagEqualTo(String value) {
-            addCriterion("TAG =", value, "tag");
+            addCriterion("tag =", value, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagNotEqualTo(String value) {
-            addCriterion("TAG <>", value, "tag");
+            addCriterion("tag <>", value, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagGreaterThan(String value) {
-            addCriterion("TAG >", value, "tag");
+            addCriterion("tag >", value, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagGreaterThanOrEqualTo(String value) {
-            addCriterion("TAG >=", value, "tag");
+            addCriterion("tag >=", value, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagLessThan(String value) {
-            addCriterion("TAG <", value, "tag");
+            addCriterion("tag <", value, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagLessThanOrEqualTo(String value) {
-            addCriterion("TAG <=", value, "tag");
+            addCriterion("tag <=", value, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagLike(String value) {
-            addCriterion("TAG like", value, "tag");
+            addCriterion("tag like", value, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagNotLike(String value) {
-            addCriterion("TAG not like", value, "tag");
+            addCriterion("tag not like", value, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagIn(List<String> values) {
-            addCriterion("TAG in", values, "tag");
+            addCriterion("tag in", values, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagNotIn(List<String> values) {
-            addCriterion("TAG not in", values, "tag");
+            addCriterion("tag not in", values, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagBetween(String value1, String value2) {
-            addCriterion("TAG between", value1, value2, "tag");
+            addCriterion("tag between", value1, value2, "tag");
             return (Criteria) this;
         }
 
         public Criteria andTagNotBetween(String value1, String value2) {
-            addCriterion("TAG not between", value1, value2, "tag");
+            addCriterion("tag not between", value1, value2, "tag");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyIsNull() {
+            addCriterion("sticky is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyIsNotNull() {
+            addCriterion("sticky is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyEqualTo(Integer value) {
+            addCriterion("sticky =", value, "sticky");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyNotEqualTo(Integer value) {
+            addCriterion("sticky <>", value, "sticky");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyGreaterThan(Integer value) {
+            addCriterion("sticky >", value, "sticky");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyGreaterThanOrEqualTo(Integer value) {
+            addCriterion("sticky >=", value, "sticky");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyLessThan(Integer value) {
+            addCriterion("sticky <", value, "sticky");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyLessThanOrEqualTo(Integer value) {
+            addCriterion("sticky <=", value, "sticky");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyIn(List<Integer> values) {
+            addCriterion("sticky in", values, "sticky");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyNotIn(List<Integer> values) {
+            addCriterion("sticky not in", values, "sticky");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyBetween(Integer value1, Integer value2) {
+            addCriterion("sticky between", value1, value2, "sticky");
+            return (Criteria) this;
+        }
+
+        public Criteria andStickyNotBetween(Integer value1, Integer value2) {
+            addCriterion("sticky not between", value1, value2, "sticky");
             return (Criteria) this;
         }
     }
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table QUESTION
+     * This class corresponds to the database table question
      *
-     * @mbg.generated do_not_delete_during_merge Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated do_not_delete_during_merge Fri Apr 22 08:17:25 CST 2022
      */
     public static class Criteria extends GeneratedCriteria {
 
@@ -770,9 +830,9 @@ protected Criteria() {
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table QUESTION
+     * This class corresponds to the database table question
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public static class Criterion {
         private String condition;
diff --git a/src/main/java/life/majiang/community/model/User.java b/src/main/java/life/majiang/community/model/User.java
index b2deaea..1800412 100644
--- a/src/main/java/life/majiang/community/model/User.java
+++ b/src/main/java/life/majiang/community/model/User.java
@@ -4,82 +4,100 @@ public class User {
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column USER.ID
+     * This field corresponds to the database column user.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long id;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column USER.ACCOUNT_ID
+     * This field corresponds to the database column user.account_id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String accountId;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column USER.NAME
+     * This field corresponds to the database column user.name
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String name;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column USER.TOKEN
+     * This field corresponds to the database column user.token
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String token;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column USER.GMT_CREATE
+     * This field corresponds to the database column user.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long gmtCreate;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column USER.GMT_MODIFIED
+     * This field corresponds to the database column user.gmt_modified
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private Long gmtModified;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column USER.BIO
+     * This field corresponds to the database column user.bio
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String bio;
 
     /**
      *
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database column USER.AVATAR_URL
+     * This field corresponds to the database column user.avatar_url
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     private String avatarUrl;
 
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column user.type
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private String type;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column user.disable
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    private Integer disable;
+
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column USER.ID
+     * This method returns the value of the database column user.id
      *
-     * @return the value of USER.ID
+     * @return the value of user.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getId() {
         return id;
@@ -87,11 +105,11 @@ public Long getId() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column USER.ID
+     * This method sets the value of the database column user.id
      *
-     * @param id the value for USER.ID
+     * @param id the value for user.id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setId(Long id) {
         this.id = id;
@@ -99,11 +117,11 @@ public void setId(Long id) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column USER.ACCOUNT_ID
+     * This method returns the value of the database column user.account_id
      *
-     * @return the value of USER.ACCOUNT_ID
+     * @return the value of user.account_id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getAccountId() {
         return accountId;
@@ -111,11 +129,11 @@ public String getAccountId() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column USER.ACCOUNT_ID
+     * This method sets the value of the database column user.account_id
      *
-     * @param accountId the value for USER.ACCOUNT_ID
+     * @param accountId the value for user.account_id
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setAccountId(String accountId) {
         this.accountId = accountId == null ? null : accountId.trim();
@@ -123,11 +141,11 @@ public void setAccountId(String accountId) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column USER.NAME
+     * This method returns the value of the database column user.name
      *
-     * @return the value of USER.NAME
+     * @return the value of user.name
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getName() {
         return name;
@@ -135,11 +153,11 @@ public String getName() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column USER.NAME
+     * This method sets the value of the database column user.name
      *
-     * @param name the value for USER.NAME
+     * @param name the value for user.name
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setName(String name) {
         this.name = name == null ? null : name.trim();
@@ -147,11 +165,11 @@ public void setName(String name) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column USER.TOKEN
+     * This method returns the value of the database column user.token
      *
-     * @return the value of USER.TOKEN
+     * @return the value of user.token
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getToken() {
         return token;
@@ -159,11 +177,11 @@ public String getToken() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column USER.TOKEN
+     * This method sets the value of the database column user.token
      *
-     * @param token the value for USER.TOKEN
+     * @param token the value for user.token
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setToken(String token) {
         this.token = token == null ? null : token.trim();
@@ -171,11 +189,11 @@ public void setToken(String token) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column USER.GMT_CREATE
+     * This method returns the value of the database column user.gmt_create
      *
-     * @return the value of USER.GMT_CREATE
+     * @return the value of user.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getGmtCreate() {
         return gmtCreate;
@@ -183,11 +201,11 @@ public Long getGmtCreate() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column USER.GMT_CREATE
+     * This method sets the value of the database column user.gmt_create
      *
-     * @param gmtCreate the value for USER.GMT_CREATE
+     * @param gmtCreate the value for user.gmt_create
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setGmtCreate(Long gmtCreate) {
         this.gmtCreate = gmtCreate;
@@ -195,11 +213,11 @@ public void setGmtCreate(Long gmtCreate) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column USER.GMT_MODIFIED
+     * This method returns the value of the database column user.gmt_modified
      *
-     * @return the value of USER.GMT_MODIFIED
+     * @return the value of user.gmt_modified
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Long getGmtModified() {
         return gmtModified;
@@ -207,11 +225,11 @@ public Long getGmtModified() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column USER.GMT_MODIFIED
+     * This method sets the value of the database column user.gmt_modified
      *
-     * @param gmtModified the value for USER.GMT_MODIFIED
+     * @param gmtModified the value for user.gmt_modified
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setGmtModified(Long gmtModified) {
         this.gmtModified = gmtModified;
@@ -219,11 +237,11 @@ public void setGmtModified(Long gmtModified) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column USER.BIO
+     * This method returns the value of the database column user.bio
      *
-     * @return the value of USER.BIO
+     * @return the value of user.bio
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getBio() {
         return bio;
@@ -231,11 +249,11 @@ public String getBio() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column USER.BIO
+     * This method sets the value of the database column user.bio
      *
-     * @param bio the value for USER.BIO
+     * @param bio the value for user.bio
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setBio(String bio) {
         this.bio = bio == null ? null : bio.trim();
@@ -243,11 +261,11 @@ public void setBio(String bio) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method returns the value of the database column USER.AVATAR_URL
+     * This method returns the value of the database column user.avatar_url
      *
-     * @return the value of USER.AVATAR_URL
+     * @return the value of user.avatar_url
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getAvatarUrl() {
         return avatarUrl;
@@ -255,13 +273,61 @@ public String getAvatarUrl() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method sets the value of the database column USER.AVATAR_URL
+     * This method sets the value of the database column user.avatar_url
      *
-     * @param avatarUrl the value for USER.AVATAR_URL
+     * @param avatarUrl the value for user.avatar_url
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setAvatarUrl(String avatarUrl) {
         this.avatarUrl = avatarUrl == null ? null : avatarUrl.trim();
     }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column user.type
+     *
+     * @return the value of user.type
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column user.type
+     *
+     * @param type the value for user.type
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setType(String type) {
+        this.type = type == null ? null : type.trim();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column user.disable
+     *
+     * @return the value of user.disable
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public Integer getDisable() {
+        return disable;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column user.disable
+     *
+     * @param disable the value for user.disable
+     *
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
+     */
+    public void setDisable(Integer disable) {
+        this.disable = disable;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/model/UserExample.java b/src/main/java/life/majiang/community/model/UserExample.java
index 33c966f..24f9ea5 100644
--- a/src/main/java/life/majiang/community/model/UserExample.java
+++ b/src/main/java/life/majiang/community/model/UserExample.java
@@ -6,33 +6,33 @@
 public class UserExample {
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table USER
+     * This field corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected String orderByClause;
 
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table USER
+     * This field corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected boolean distinct;
 
     /**
      * This field was generated by MyBatis Generator.
-     * This field corresponds to the database table USER
+     * This field corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected List<Criteria> oredCriteria;
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public UserExample() {
         oredCriteria = new ArrayList<Criteria>();
@@ -40,9 +40,9 @@ public UserExample() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setOrderByClause(String orderByClause) {
         this.orderByClause = orderByClause;
@@ -50,9 +50,9 @@ public void setOrderByClause(String orderByClause) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public String getOrderByClause() {
         return orderByClause;
@@ -60,9 +60,9 @@ public String getOrderByClause() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void setDistinct(boolean distinct) {
         this.distinct = distinct;
@@ -70,9 +70,9 @@ public void setDistinct(boolean distinct) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public boolean isDistinct() {
         return distinct;
@@ -80,9 +80,9 @@ public boolean isDistinct() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public List<Criteria> getOredCriteria() {
         return oredCriteria;
@@ -90,9 +90,9 @@ public List<Criteria> getOredCriteria() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void or(Criteria criteria) {
         oredCriteria.add(criteria);
@@ -100,9 +100,9 @@ public void or(Criteria criteria) {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Criteria or() {
         Criteria criteria = createCriteriaInternal();
@@ -112,9 +112,9 @@ public Criteria or() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public Criteria createCriteria() {
         Criteria criteria = createCriteriaInternal();
@@ -126,9 +126,9 @@ public Criteria createCriteria() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected Criteria createCriteriaInternal() {
         Criteria criteria = new Criteria();
@@ -137,9 +137,9 @@ protected Criteria createCriteriaInternal() {
 
     /**
      * This method was generated by MyBatis Generator.
-     * This method corresponds to the database table USER
+     * This method corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public void clear() {
         oredCriteria.clear();
@@ -149,9 +149,9 @@ public void clear() {
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table USER
+     * This class corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     protected abstract static class GeneratedCriteria {
         protected List<Criterion> criteria;
@@ -195,541 +195,671 @@ protected void addCriterion(String condition, Object value1, Object value2, Stri
         }
 
         public Criteria andIdIsNull() {
-            addCriterion("ID is null");
+            addCriterion("id is null");
             return (Criteria) this;
         }
 
         public Criteria andIdIsNotNull() {
-            addCriterion("ID is not null");
+            addCriterion("id is not null");
             return (Criteria) this;
         }
 
         public Criteria andIdEqualTo(Long value) {
-            addCriterion("ID =", value, "id");
+            addCriterion("id =", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotEqualTo(Long value) {
-            addCriterion("ID <>", value, "id");
+            addCriterion("id <>", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdGreaterThan(Long value) {
-            addCriterion("ID >", value, "id");
+            addCriterion("id >", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdGreaterThanOrEqualTo(Long value) {
-            addCriterion("ID >=", value, "id");
+            addCriterion("id >=", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdLessThan(Long value) {
-            addCriterion("ID <", value, "id");
+            addCriterion("id <", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdLessThanOrEqualTo(Long value) {
-            addCriterion("ID <=", value, "id");
+            addCriterion("id <=", value, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdIn(List<Long> values) {
-            addCriterion("ID in", values, "id");
+            addCriterion("id in", values, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotIn(List<Long> values) {
-            addCriterion("ID not in", values, "id");
+            addCriterion("id not in", values, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdBetween(Long value1, Long value2) {
-            addCriterion("ID between", value1, value2, "id");
+            addCriterion("id between", value1, value2, "id");
             return (Criteria) this;
         }
 
         public Criteria andIdNotBetween(Long value1, Long value2) {
-            addCriterion("ID not between", value1, value2, "id");
+            addCriterion("id not between", value1, value2, "id");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdIsNull() {
-            addCriterion("ACCOUNT_ID is null");
+            addCriterion("account_id is null");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdIsNotNull() {
-            addCriterion("ACCOUNT_ID is not null");
+            addCriterion("account_id is not null");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdEqualTo(String value) {
-            addCriterion("ACCOUNT_ID =", value, "accountId");
+            addCriterion("account_id =", value, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdNotEqualTo(String value) {
-            addCriterion("ACCOUNT_ID <>", value, "accountId");
+            addCriterion("account_id <>", value, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdGreaterThan(String value) {
-            addCriterion("ACCOUNT_ID >", value, "accountId");
+            addCriterion("account_id >", value, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdGreaterThanOrEqualTo(String value) {
-            addCriterion("ACCOUNT_ID >=", value, "accountId");
+            addCriterion("account_id >=", value, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdLessThan(String value) {
-            addCriterion("ACCOUNT_ID <", value, "accountId");
+            addCriterion("account_id <", value, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdLessThanOrEqualTo(String value) {
-            addCriterion("ACCOUNT_ID <=", value, "accountId");
+            addCriterion("account_id <=", value, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdLike(String value) {
-            addCriterion("ACCOUNT_ID like", value, "accountId");
+            addCriterion("account_id like", value, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdNotLike(String value) {
-            addCriterion("ACCOUNT_ID not like", value, "accountId");
+            addCriterion("account_id not like", value, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdIn(List<String> values) {
-            addCriterion("ACCOUNT_ID in", values, "accountId");
+            addCriterion("account_id in", values, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdNotIn(List<String> values) {
-            addCriterion("ACCOUNT_ID not in", values, "accountId");
+            addCriterion("account_id not in", values, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdBetween(String value1, String value2) {
-            addCriterion("ACCOUNT_ID between", value1, value2, "accountId");
+            addCriterion("account_id between", value1, value2, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andAccountIdNotBetween(String value1, String value2) {
-            addCriterion("ACCOUNT_ID not between", value1, value2, "accountId");
+            addCriterion("account_id not between", value1, value2, "accountId");
             return (Criteria) this;
         }
 
         public Criteria andNameIsNull() {
-            addCriterion("NAME is null");
+            addCriterion("name is null");
             return (Criteria) this;
         }
 
         public Criteria andNameIsNotNull() {
-            addCriterion("NAME is not null");
+            addCriterion("name is not null");
             return (Criteria) this;
         }
 
         public Criteria andNameEqualTo(String value) {
-            addCriterion("NAME =", value, "name");
+            addCriterion("name =", value, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameNotEqualTo(String value) {
-            addCriterion("NAME <>", value, "name");
+            addCriterion("name <>", value, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameGreaterThan(String value) {
-            addCriterion("NAME >", value, "name");
+            addCriterion("name >", value, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameGreaterThanOrEqualTo(String value) {
-            addCriterion("NAME >=", value, "name");
+            addCriterion("name >=", value, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameLessThan(String value) {
-            addCriterion("NAME <", value, "name");
+            addCriterion("name <", value, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameLessThanOrEqualTo(String value) {
-            addCriterion("NAME <=", value, "name");
+            addCriterion("name <=", value, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameLike(String value) {
-            addCriterion("NAME like", value, "name");
+            addCriterion("name like", value, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameNotLike(String value) {
-            addCriterion("NAME not like", value, "name");
+            addCriterion("name not like", value, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameIn(List<String> values) {
-            addCriterion("NAME in", values, "name");
+            addCriterion("name in", values, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameNotIn(List<String> values) {
-            addCriterion("NAME not in", values, "name");
+            addCriterion("name not in", values, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameBetween(String value1, String value2) {
-            addCriterion("NAME between", value1, value2, "name");
+            addCriterion("name between", value1, value2, "name");
             return (Criteria) this;
         }
 
         public Criteria andNameNotBetween(String value1, String value2) {
-            addCriterion("NAME not between", value1, value2, "name");
+            addCriterion("name not between", value1, value2, "name");
             return (Criteria) this;
         }
 
         public Criteria andTokenIsNull() {
-            addCriterion("TOKEN is null");
+            addCriterion("token is null");
             return (Criteria) this;
         }
 
         public Criteria andTokenIsNotNull() {
-            addCriterion("TOKEN is not null");
+            addCriterion("token is not null");
             return (Criteria) this;
         }
 
         public Criteria andTokenEqualTo(String value) {
-            addCriterion("TOKEN =", value, "token");
+            addCriterion("token =", value, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenNotEqualTo(String value) {
-            addCriterion("TOKEN <>", value, "token");
+            addCriterion("token <>", value, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenGreaterThan(String value) {
-            addCriterion("TOKEN >", value, "token");
+            addCriterion("token >", value, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenGreaterThanOrEqualTo(String value) {
-            addCriterion("TOKEN >=", value, "token");
+            addCriterion("token >=", value, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenLessThan(String value) {
-            addCriterion("TOKEN <", value, "token");
+            addCriterion("token <", value, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenLessThanOrEqualTo(String value) {
-            addCriterion("TOKEN <=", value, "token");
+            addCriterion("token <=", value, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenLike(String value) {
-            addCriterion("TOKEN like", value, "token");
+            addCriterion("token like", value, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenNotLike(String value) {
-            addCriterion("TOKEN not like", value, "token");
+            addCriterion("token not like", value, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenIn(List<String> values) {
-            addCriterion("TOKEN in", values, "token");
+            addCriterion("token in", values, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenNotIn(List<String> values) {
-            addCriterion("TOKEN not in", values, "token");
+            addCriterion("token not in", values, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenBetween(String value1, String value2) {
-            addCriterion("TOKEN between", value1, value2, "token");
+            addCriterion("token between", value1, value2, "token");
             return (Criteria) this;
         }
 
         public Criteria andTokenNotBetween(String value1, String value2) {
-            addCriterion("TOKEN not between", value1, value2, "token");
+            addCriterion("token not between", value1, value2, "token");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIsNull() {
-            addCriterion("GMT_CREATE is null");
+            addCriterion("gmt_create is null");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIsNotNull() {
-            addCriterion("GMT_CREATE is not null");
+            addCriterion("gmt_create is not null");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateEqualTo(Long value) {
-            addCriterion("GMT_CREATE =", value, "gmtCreate");
+            addCriterion("gmt_create =", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotEqualTo(Long value) {
-            addCriterion("GMT_CREATE <>", value, "gmtCreate");
+            addCriterion("gmt_create <>", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateGreaterThan(Long value) {
-            addCriterion("GMT_CREATE >", value, "gmtCreate");
+            addCriterion("gmt_create >", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateGreaterThanOrEqualTo(Long value) {
-            addCriterion("GMT_CREATE >=", value, "gmtCreate");
+            addCriterion("gmt_create >=", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateLessThan(Long value) {
-            addCriterion("GMT_CREATE <", value, "gmtCreate");
+            addCriterion("gmt_create <", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateLessThanOrEqualTo(Long value) {
-            addCriterion("GMT_CREATE <=", value, "gmtCreate");
+            addCriterion("gmt_create <=", value, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateIn(List<Long> values) {
-            addCriterion("GMT_CREATE in", values, "gmtCreate");
+            addCriterion("gmt_create in", values, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotIn(List<Long> values) {
-            addCriterion("GMT_CREATE not in", values, "gmtCreate");
+            addCriterion("gmt_create not in", values, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateBetween(Long value1, Long value2) {
-            addCriterion("GMT_CREATE between", value1, value2, "gmtCreate");
+            addCriterion("gmt_create between", value1, value2, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtCreateNotBetween(Long value1, Long value2) {
-            addCriterion("GMT_CREATE not between", value1, value2, "gmtCreate");
+            addCriterion("gmt_create not between", value1, value2, "gmtCreate");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedIsNull() {
-            addCriterion("GMT_MODIFIED is null");
+            addCriterion("gmt_modified is null");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedIsNotNull() {
-            addCriterion("GMT_MODIFIED is not null");
+            addCriterion("gmt_modified is not null");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED =", value, "gmtModified");
+            addCriterion("gmt_modified =", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedNotEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED <>", value, "gmtModified");
+            addCriterion("gmt_modified <>", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedGreaterThan(Long value) {
-            addCriterion("GMT_MODIFIED >", value, "gmtModified");
+            addCriterion("gmt_modified >", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedGreaterThanOrEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED >=", value, "gmtModified");
+            addCriterion("gmt_modified >=", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedLessThan(Long value) {
-            addCriterion("GMT_MODIFIED <", value, "gmtModified");
+            addCriterion("gmt_modified <", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedLessThanOrEqualTo(Long value) {
-            addCriterion("GMT_MODIFIED <=", value, "gmtModified");
+            addCriterion("gmt_modified <=", value, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedIn(List<Long> values) {
-            addCriterion("GMT_MODIFIED in", values, "gmtModified");
+            addCriterion("gmt_modified in", values, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedNotIn(List<Long> values) {
-            addCriterion("GMT_MODIFIED not in", values, "gmtModified");
+            addCriterion("gmt_modified not in", values, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedBetween(Long value1, Long value2) {
-            addCriterion("GMT_MODIFIED between", value1, value2, "gmtModified");
+            addCriterion("gmt_modified between", value1, value2, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andGmtModifiedNotBetween(Long value1, Long value2) {
-            addCriterion("GMT_MODIFIED not between", value1, value2, "gmtModified");
+            addCriterion("gmt_modified not between", value1, value2, "gmtModified");
             return (Criteria) this;
         }
 
         public Criteria andBioIsNull() {
-            addCriterion("BIO is null");
+            addCriterion("bio is null");
             return (Criteria) this;
         }
 
         public Criteria andBioIsNotNull() {
-            addCriterion("BIO is not null");
+            addCriterion("bio is not null");
             return (Criteria) this;
         }
 
         public Criteria andBioEqualTo(String value) {
-            addCriterion("BIO =", value, "bio");
+            addCriterion("bio =", value, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioNotEqualTo(String value) {
-            addCriterion("BIO <>", value, "bio");
+            addCriterion("bio <>", value, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioGreaterThan(String value) {
-            addCriterion("BIO >", value, "bio");
+            addCriterion("bio >", value, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioGreaterThanOrEqualTo(String value) {
-            addCriterion("BIO >=", value, "bio");
+            addCriterion("bio >=", value, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioLessThan(String value) {
-            addCriterion("BIO <", value, "bio");
+            addCriterion("bio <", value, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioLessThanOrEqualTo(String value) {
-            addCriterion("BIO <=", value, "bio");
+            addCriterion("bio <=", value, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioLike(String value) {
-            addCriterion("BIO like", value, "bio");
+            addCriterion("bio like", value, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioNotLike(String value) {
-            addCriterion("BIO not like", value, "bio");
+            addCriterion("bio not like", value, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioIn(List<String> values) {
-            addCriterion("BIO in", values, "bio");
+            addCriterion("bio in", values, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioNotIn(List<String> values) {
-            addCriterion("BIO not in", values, "bio");
+            addCriterion("bio not in", values, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioBetween(String value1, String value2) {
-            addCriterion("BIO between", value1, value2, "bio");
+            addCriterion("bio between", value1, value2, "bio");
             return (Criteria) this;
         }
 
         public Criteria andBioNotBetween(String value1, String value2) {
-            addCriterion("BIO not between", value1, value2, "bio");
+            addCriterion("bio not between", value1, value2, "bio");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlIsNull() {
-            addCriterion("AVATAR_URL is null");
+            addCriterion("avatar_url is null");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlIsNotNull() {
-            addCriterion("AVATAR_URL is not null");
+            addCriterion("avatar_url is not null");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlEqualTo(String value) {
-            addCriterion("AVATAR_URL =", value, "avatarUrl");
+            addCriterion("avatar_url =", value, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlNotEqualTo(String value) {
-            addCriterion("AVATAR_URL <>", value, "avatarUrl");
+            addCriterion("avatar_url <>", value, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlGreaterThan(String value) {
-            addCriterion("AVATAR_URL >", value, "avatarUrl");
+            addCriterion("avatar_url >", value, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlGreaterThanOrEqualTo(String value) {
-            addCriterion("AVATAR_URL >=", value, "avatarUrl");
+            addCriterion("avatar_url >=", value, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlLessThan(String value) {
-            addCriterion("AVATAR_URL <", value, "avatarUrl");
+            addCriterion("avatar_url <", value, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlLessThanOrEqualTo(String value) {
-            addCriterion("AVATAR_URL <=", value, "avatarUrl");
+            addCriterion("avatar_url <=", value, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlLike(String value) {
-            addCriterion("AVATAR_URL like", value, "avatarUrl");
+            addCriterion("avatar_url like", value, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlNotLike(String value) {
-            addCriterion("AVATAR_URL not like", value, "avatarUrl");
+            addCriterion("avatar_url not like", value, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlIn(List<String> values) {
-            addCriterion("AVATAR_URL in", values, "avatarUrl");
+            addCriterion("avatar_url in", values, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlNotIn(List<String> values) {
-            addCriterion("AVATAR_URL not in", values, "avatarUrl");
+            addCriterion("avatar_url not in", values, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlBetween(String value1, String value2) {
-            addCriterion("AVATAR_URL between", value1, value2, "avatarUrl");
+            addCriterion("avatar_url between", value1, value2, "avatarUrl");
             return (Criteria) this;
         }
 
         public Criteria andAvatarUrlNotBetween(String value1, String value2) {
-            addCriterion("AVATAR_URL not between", value1, value2, "avatarUrl");
+            addCriterion("avatar_url not between", value1, value2, "avatarUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNull() {
+            addCriterion("type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(String value) {
+            addCriterion("type =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(String value) {
+            addCriterion("type <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(String value) {
+            addCriterion("type >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("type >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(String value) {
+            addCriterion("type <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(String value) {
+            addCriterion("type <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLike(String value) {
+            addCriterion("type like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotLike(String value) {
+            addCriterion("type not like", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<String> values) {
+            addCriterion("type in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<String> values) {
+            addCriterion("type not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(String value1, String value2) {
+            addCriterion("type between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(String value1, String value2) {
+            addCriterion("type not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableIsNull() {
+            addCriterion("disable is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableIsNotNull() {
+            addCriterion("disable is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableEqualTo(Integer value) {
+            addCriterion("disable =", value, "disable");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableNotEqualTo(Integer value) {
+            addCriterion("disable <>", value, "disable");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableGreaterThan(Integer value) {
+            addCriterion("disable >", value, "disable");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableGreaterThanOrEqualTo(Integer value) {
+            addCriterion("disable >=", value, "disable");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableLessThan(Integer value) {
+            addCriterion("disable <", value, "disable");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableLessThanOrEqualTo(Integer value) {
+            addCriterion("disable <=", value, "disable");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableIn(List<Integer> values) {
+            addCriterion("disable in", values, "disable");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableNotIn(List<Integer> values) {
+            addCriterion("disable not in", values, "disable");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableBetween(Integer value1, Integer value2) {
+            addCriterion("disable between", value1, value2, "disable");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisableNotBetween(Integer value1, Integer value2) {
+            addCriterion("disable not between", value1, value2, "disable");
             return (Criteria) this;
         }
     }
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table USER
+     * This class corresponds to the database table user
      *
-     * @mbg.generated do_not_delete_during_merge Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated do_not_delete_during_merge Fri Apr 22 08:17:25 CST 2022
      */
     public static class Criteria extends GeneratedCriteria {
 
@@ -740,9 +870,9 @@ protected Criteria() {
 
     /**
      * This class was generated by MyBatis Generator.
-     * This class corresponds to the database table USER
+     * This class corresponds to the database table user
      *
-     * @mbg.generated Fri Jun 14 08:00:35 CST 2019
+     * @mbg.generated Fri Apr 22 08:17:25 CST 2022
      */
     public static class Criterion {
         private String condition;
diff --git a/src/main/java/life/majiang/community/provider/GiteeProvider.java b/src/main/java/life/majiang/community/provider/GiteeProvider.java
new file mode 100644
index 0000000..ae40375
--- /dev/null
+++ b/src/main/java/life/majiang/community/provider/GiteeProvider.java
@@ -0,0 +1,64 @@
+package life.majiang.community.provider;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import life.majiang.community.dto.AccessTokenDTO;
+import life.majiang.community.provider.dto.GiteeUser;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by codedrinker on 2019/4/24.
+ */
+@Component
+@Slf4j
+public class GiteeProvider {
+    @Value("${gitee.client.id}")
+    private String clientId;
+
+    @Value("${gitee.client.secret}")
+    private String clientSecret;
+
+    @Value("${gitee.redirect.uri}")
+    private String redirectUri;
+
+    public String getAccessToken(AccessTokenDTO accessTokenDTO) {
+        MediaType mediaType = MediaType.get("application/json; charset=utf-8");
+        OkHttpClient client = new OkHttpClient();
+
+        RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(accessTokenDTO));
+        String url = "https://gitee.com/oauth/token?grant_type=authorization_code&code=%s&client_id=%s&redirect_uri=%s&client_secret=%s";
+        url = String.format(url, accessTokenDTO.getCode(), clientId, redirectUri, clientSecret);
+        Request request = new Request.Builder()
+                .url(url)
+                .post(body)
+                .build();
+        try (Response response = client.newCall(request).execute()) {
+            String string = response.body().string();
+            JSONObject jsonObject = JSON.parseObject(string);
+            return jsonObject.getString("access_token");
+        } catch (Exception e) {
+            log.error("getAccessToken error,{}", accessTokenDTO, e);
+        }
+        return null;
+    }
+
+
+    public GiteeUser getUser(String accessToken) {
+        OkHttpClient client = new OkHttpClient();
+        Request request = new Request.Builder()
+                .url("https://gitee.com/api/v5/user?access_token=" + accessToken)
+                .build();
+        try {
+            Response response = client.newCall(request).execute();
+            String string = response.body().string();
+            GiteeUser giteeUser = JSON.parseObject(string, GiteeUser.class);
+            return giteeUser;
+        } catch (Exception e) {
+            log.error("getUser error,{}", accessToken, e);
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/life/majiang/community/provider/GithubProvider.java b/src/main/java/life/majiang/community/provider/GithubProvider.java
index c306102..1c6be9d 100644
--- a/src/main/java/life/majiang/community/provider/GithubProvider.java
+++ b/src/main/java/life/majiang/community/provider/GithubProvider.java
@@ -2,9 +2,10 @@
 
 import com.alibaba.fastjson.JSON;
 import life.majiang.community.dto.AccessTokenDTO;
-import life.majiang.community.dto.GithubUser;
+import life.majiang.community.provider.dto.GithubUser;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.*;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 /**
@@ -13,7 +14,20 @@
 @Component
 @Slf4j
 public class GithubProvider {
+
+    @Value("${github.client.id}")
+    private String clientId;
+
+    @Value("${github.client.secret}")
+    private String clientSecret;
+
+    @Value("${github.redirect.uri}")
+    private String redirectUri;
+
     public String getAccessToken(AccessTokenDTO accessTokenDTO) {
+        accessTokenDTO.setClient_id(clientId);
+        accessTokenDTO.setClient_secret(clientSecret);
+        accessTokenDTO.setRedirect_uri(redirectUri);
         MediaType mediaType = MediaType.get("application/json; charset=utf-8");
         OkHttpClient client = new OkHttpClient();
 
@@ -36,7 +50,8 @@ public String getAccessToken(AccessTokenDTO accessTokenDTO) {
     public GithubUser getUser(String accessToken) {
         OkHttpClient client = new OkHttpClient();
         Request request = new Request.Builder()
-                .url("https://api.github.com/user?access_token=" + accessToken)
+                .url("https://api.github.com/user")
+                .header("Authorization", "token " + accessToken)
                 .build();
         try {
             Response response = client.newCall(request).execute();
diff --git a/src/main/java/life/majiang/community/provider/UCloudProvider.java b/src/main/java/life/majiang/community/provider/UCloudProvider.java
deleted file mode 100644
index 7ceaac2..0000000
--- a/src/main/java/life/majiang/community/provider/UCloudProvider.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package life.majiang.community.provider;
-
-import cn.ucloud.ufile.UfileClient;
-import cn.ucloud.ufile.api.object.ObjectConfig;
-import cn.ucloud.ufile.auth.ObjectAuthorization;
-import cn.ucloud.ufile.auth.UfileObjectLocalAuthorization;
-import cn.ucloud.ufile.bean.PutObjectResultBean;
-import cn.ucloud.ufile.exception.UfileClientException;
-import cn.ucloud.ufile.exception.UfileServerException;
-import life.majiang.community.exception.CustomizeErrorCode;
-import life.majiang.community.exception.CustomizeException;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.io.InputStream;
-import java.util.UUID;
-
-/**
- * Created by codedrinker on 2019/6/28.
- */
-@Service
-@Slf4j
-public class UCloudProvider {
-    @Value("${ucloud.ufile.public-key}")
-    private String publicKey;
-
-    @Value("${ucloud.ufile.private-key}")
-    private String privateKey;
-
-    @Value("${ucloud.ufile.bucket-name}")
-    private String bucketName;
-
-    @Value("${ucloud.ufile.region}")
-    private String region;
-
-    @Value("${ucloud.ufile.suffix}")
-    private String suffix;
-
-    @Value("${ucloud.ufile.expires}")
-    private Integer expires;
-
-    public String upload(InputStream fileStream, String mimeType, String fileName) {
-        String generatedFileName;
-        String[] filePaths = fileName.split("\\.");
-        if (filePaths.length > 1) {
-            generatedFileName = UUID.randomUUID().toString() + "." + filePaths[filePaths.length - 1];
-        } else {
-            throw new CustomizeException(CustomizeErrorCode.FILE_UPLOAD_FAIL);
-        }
-        try {
-            ObjectAuthorization objectAuthorization = new UfileObjectLocalAuthorization(publicKey, privateKey);
-            ObjectConfig config = new ObjectConfig(region, suffix);
-            PutObjectResultBean response = UfileClient.object(objectAuthorization, config)
-                    .putObject(fileStream, mimeType)
-                    .nameAs(generatedFileName)
-                    .toBucket(bucketName)
-                    .setOnProgressListener((bytesWritten, contentLength) -> {
-                    })
-                    .execute();
-            if (response != null && response.getRetCode() == 0) {
-                String url = UfileClient.object(objectAuthorization, config)
-                        .getDownloadUrlFromPrivateBucket(generatedFileName, bucketName, expires)
-                        .createUrl();
-                return url;
-            } else {
-                log.error("upload error,{}", response);
-                throw new CustomizeException(CustomizeErrorCode.FILE_UPLOAD_FAIL);
-            }
-        } catch (UfileClientException e) {
-            log.error("upload error,{}", fileName, e);
-            throw new CustomizeException(CustomizeErrorCode.FILE_UPLOAD_FAIL);
-        } catch (UfileServerException e) {
-            log.error("upload error,{}", fileName, e);
-            throw new CustomizeException(CustomizeErrorCode.FILE_UPLOAD_FAIL);
-        }
-    }
-}
diff --git a/src/main/java/life/majiang/community/provider/UFileProperties.java b/src/main/java/life/majiang/community/provider/UFileProperties.java
new file mode 100644
index 0000000..91030c3
--- /dev/null
+++ b/src/main/java/life/majiang/community/provider/UFileProperties.java
@@ -0,0 +1,27 @@
+package life.majiang.community.provider;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Service;
+
+@Data
+@ConfigurationProperties(prefix = "ucloud.ufile")
+@Service
+public class UFileProperties {
+    private String publicKey;
+    private String privateKey;
+    private String bucketName;
+    private String uploadDomain;
+    private String downloadDomain;
+
+    /**
+     * bucket 类型，默认可以不填，可选参数 public 和 private
+     */
+    private String bucketType;
+
+    /**
+     * bucketType 如果 bucketType  传递了，当前参数必填
+     * 有效时限 (当前时间开始计算的一个有效时间段, 单位：Unix time second。 eg: 24*60*60 = 1天有效)
+     */
+    private Integer expiresDuration;
+}
diff --git a/src/main/java/life/majiang/community/provider/UFileResult.java b/src/main/java/life/majiang/community/provider/UFileResult.java
new file mode 100644
index 0000000..8ea5625
--- /dev/null
+++ b/src/main/java/life/majiang/community/provider/UFileResult.java
@@ -0,0 +1,15 @@
+package life.majiang.community.provider;
+
+import lombok.Data;
+
+@Data
+public class UFileResult {
+    /**
+     * 文件名
+     */
+    private String fileName;
+    /**
+     * 文件地址
+     */
+    private String fileUrl;
+}
diff --git a/src/main/java/life/majiang/community/provider/UFileService.java b/src/main/java/life/majiang/community/provider/UFileService.java
new file mode 100644
index 0000000..43bd421
--- /dev/null
+++ b/src/main/java/life/majiang/community/provider/UFileService.java
@@ -0,0 +1,165 @@
+package life.majiang.community.provider;
+
+import cn.ucloud.ufile.UfileClient;
+import cn.ucloud.ufile.api.object.ObjectConfig;
+import cn.ucloud.ufile.auth.ObjectAuthorization;
+import cn.ucloud.ufile.auth.UfileObjectLocalAuthorization;
+import cn.ucloud.ufile.bean.PutObjectResultBean;
+import life.majiang.community.utils.FileUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+
+/**
+ * Created by codedrinker on 2019/6/28.
+ */
+@Slf4j
+@Service
+public class UFileService {
+
+    @Autowired
+    private UFileProperties uFileProperties;
+
+    /**
+     * 通过 HTTP 图片 URL 上传
+     *
+     * @param url HTTP 图片 URL
+     * @return
+     * @throws FileNotFoundException
+     */
+    public UFileResult upload(String url) {
+        File newFile = FileUtils.newFile(url);
+        assert newFile != null;
+        UFileResult fileResult;
+        try {
+            fileResult = upload(new FileInputStream(newFile), "image/png", newFile.getName());
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException("new file exception", e);
+        }
+        FileUtils.deleteFile(newFile);
+        return fileResult;
+    }
+
+    /**
+     * 上传
+     *
+     * @param fileStream 文件的 input 流
+     * @param mimeType   文件类型 eg. image/png
+     * @param fileName   文件名称
+     * @return
+     */
+    public UFileResult upload(InputStream fileStream, String mimeType, String fileName) {
+        try {
+
+            if (uFileProperties.getPublicKey() == null) {
+                throw new RuntimeException("ucloud.ufile.publicKey is missing.");
+            }
+
+            if (uFileProperties.getPrivateKey() == null) {
+                throw new RuntimeException("ucloud.ufile.privateKey is missing.");
+            }
+            if (uFileProperties.getUploadDomain() == null) {
+                throw new RuntimeException("ucloud.ufile.uploadDomain is missing, eg. bucketname.ufile.cn-north-04.ucloud.cn.");
+            }
+
+            if (uFileProperties.getBucketName() == null) {
+                throw new RuntimeException("ucloud.ufile.bucketName is missing.");
+            }
+            if (uFileProperties.getDownloadDomain() == null) {
+                throw new RuntimeException("ucloud.ufile.downloadDomain is missing, eg. bucketname.cn-bj.ufileos.com.");
+            }
+            ObjectAuthorization objectAuthorization = new UfileObjectLocalAuthorization(uFileProperties.getPublicKey(), uFileProperties.getPrivateKey());
+            ObjectConfig config = new ObjectConfig(uFileProperties.getUploadDomain());
+            String keyName = FileUtils.newUUIDFileName(fileName);
+            PutObjectResultBean response = UfileClient.object(objectAuthorization, config)
+                    .putObject(fileStream, mimeType)
+                    .nameAs(keyName)
+                    .toBucket(uFileProperties.getBucketName())
+                    .setOnProgressListener((bytesWritten, contentLength) -> {
+                    })
+                    .execute();
+            if (response != null && response.getRetCode() == 0) {
+                UFileResult fileResult = new UFileResult();
+                if (uFileProperties.getBucketType() != null && StringUtils.equals(uFileProperties.getBucketType(), "private")) {
+                    if (uFileProperties.getExpiresDuration() == null) {
+                        throw new RuntimeException("ucloud.ufile.expiresDuration is missing, eg. 1000.");
+                    }
+                    fileResult.setFileName(keyName);
+                    fileResult.setFileUrl(UfileClient.object(objectAuthorization, new ObjectConfig(uFileProperties.getDownloadDomain()))
+                            .getDownloadUrlFromPrivateBucket(keyName, uFileProperties.getBucketName(), uFileProperties.getExpiresDuration())
+                            .createUrl());
+                    return fileResult;
+                } else {
+                    fileResult.setFileName(keyName);
+                    fileResult.setFileUrl(UfileClient.object(objectAuthorization, new ObjectConfig(uFileProperties.getDownloadDomain()))
+                            .getDownloadUrlFromPublicBucket(keyName, uFileProperties.getBucketName())
+                            .createUrl());
+                    return fileResult;
+                }
+            } else {
+                log.error("upload error,{}", response);
+                return null;
+            }
+        } catch (Exception e) {
+            log.error("upload error,{}", fileName, e);
+            return null;
+        }
+    }
+
+    /**
+     * 通过文件名转换离职
+     *
+     * @param fileName 文件名称
+     * @return
+     */
+    public UFileResult exchangeFileUrl(String fileName) {
+        try {
+
+            if (uFileProperties.getPublicKey() == null) {
+                throw new RuntimeException("ucloud.ufile.publicKey is missing.");
+            }
+
+            if (uFileProperties.getPrivateKey() == null) {
+                throw new RuntimeException("ucloud.ufile.privateKey is missing.");
+            }
+            if (uFileProperties.getUploadDomain() == null) {
+                throw new RuntimeException("ucloud.ufile.uploadDomain is missing, eg. bucketname.ufile.cn-north-04.ucloud.cn.");
+            }
+
+            if (uFileProperties.getBucketName() == null) {
+                throw new RuntimeException("ucloud.ufile.bucketName is missing.");
+            }
+            if (uFileProperties.getDownloadDomain() == null) {
+                throw new RuntimeException("ucloud.ufile.downloadDomain is missing, eg. bucketname.cn-bj.ufileos.com.");
+            }
+            UFileResult fileResult = new UFileResult();
+            ObjectAuthorization objectAuthorization = new UfileObjectLocalAuthorization(uFileProperties.getPublicKey(), uFileProperties.getPrivateKey());
+            if (uFileProperties.getBucketType() != null && StringUtils.equals(uFileProperties.getBucketType(), "private")) {
+                if (uFileProperties.getExpiresDuration() == null) {
+                    throw new RuntimeException("ucloud.ufile.expiresDuration is missing, eg. 1000.");
+                }
+
+                fileResult.setFileName(fileName);
+                fileResult.setFileUrl(UfileClient.object(objectAuthorization, new ObjectConfig(uFileProperties.getDownloadDomain()))
+                        .getDownloadUrlFromPrivateBucket(fileName, uFileProperties.getBucketName(), uFileProperties.getExpiresDuration())
+                        .createUrl());
+                return fileResult;
+            } else {
+                fileResult.setFileName(fileName);
+                fileResult.setFileUrl(UfileClient.object(objectAuthorization, new ObjectConfig(uFileProperties.getDownloadDomain()))
+                        .getDownloadUrlFromPublicBucket(fileName, uFileProperties.getBucketName())
+                        .createUrl());
+                return fileResult;
+            }
+        } catch (Exception e) {
+            log.error("upload error,{}", fileName, e);
+            return null;
+        }
+    }
+}
diff --git a/src/main/java/life/majiang/community/provider/dto/GiteeUser.java b/src/main/java/life/majiang/community/provider/dto/GiteeUser.java
new file mode 100644
index 0000000..483ad16
--- /dev/null
+++ b/src/main/java/life/majiang/community/provider/dto/GiteeUser.java
@@ -0,0 +1,14 @@
+package life.majiang.community.provider.dto;
+
+import lombok.Data;
+
+/**
+ * Created by codedrinker on 2019/4/24.
+ */
+@Data
+public class GiteeUser {
+    private String name;
+    private Long id;
+    private String bio;
+    private String avatarUrl;
+}
diff --git a/src/main/java/life/majiang/community/dto/GithubUser.java b/src/main/java/life/majiang/community/provider/dto/GithubUser.java
similarity index 81%
rename from src/main/java/life/majiang/community/dto/GithubUser.java
rename to src/main/java/life/majiang/community/provider/dto/GithubUser.java
index b535466..018d70d 100644
--- a/src/main/java/life/majiang/community/dto/GithubUser.java
+++ b/src/main/java/life/majiang/community/provider/dto/GithubUser.java
@@ -1,4 +1,4 @@
-package life.majiang.community.dto;
+package life.majiang.community.provider.dto;
 
 import lombok.Data;
 
diff --git a/src/main/java/life/majiang/community/schedule/AvatarFixTasks.java b/src/main/java/life/majiang/community/schedule/AvatarFixTasks.java
new file mode 100644
index 0000000..174b967
--- /dev/null
+++ b/src/main/java/life/majiang/community/schedule/AvatarFixTasks.java
@@ -0,0 +1,60 @@
+package life.majiang.community.schedule;
+
+import life.majiang.community.mapper.UserMapper;
+import life.majiang.community.model.User;
+import life.majiang.community.model.UserExample;
+import life.majiang.community.provider.UFileResult;
+import life.majiang.community.provider.UFileService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.session.RowBounds;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by codedrinker on 2019/8/1.
+ */
+@Component
+@Slf4j
+public class AvatarFixTasks {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private UFileService uFileService;
+
+    @Scheduled(fixedRate = 1000 * 60 * 10)
+    public void fixUserAvatar() {
+        int offset = 0;
+        int limit = 20;
+        log.info("fixUserAvatar start {}", new Date());
+        List<User> list = new ArrayList<>();
+        while (offset == 0 || list.size() == limit) {
+            UserExample userExample = new UserExample();
+            userExample.setOrderByClause("id desc");
+            list = userMapper.selectByExampleWithRowbounds(userExample, new RowBounds(offset, limit));
+            for (User user : list) {
+                try {
+                    if (StringUtils.contains(user.getAvatarUrl(), "githubusercontent")) {
+                        UFileResult fileResult = uFileService.upload(user.getAvatarUrl());
+                        if (fileResult != null && fileResult.getFileUrl() != null) {
+                            user.setAvatarUrl(fileResult.getFileUrl());
+                            log.error("fixUserAvatar user : {}", user.getId());
+                            userMapper.updateByPrimaryKey(user);
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error("fixUserAvatar error", e);
+                }
+            }
+            offset += limit;
+        }
+        log.info("fixUserAvatar stop {}", new Date());
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/life/majiang/community/schedule/HotTagTasks.java b/src/main/java/life/majiang/community/schedule/HotTagTasks.java
new file mode 100644
index 0000000..daeea2e
--- /dev/null
+++ b/src/main/java/life/majiang/community/schedule/HotTagTasks.java
@@ -0,0 +1,55 @@
+package life.majiang.community.schedule;
+
+import life.majiang.community.cache.HotTagCache;
+import life.majiang.community.mapper.QuestionMapper;
+import life.majiang.community.model.Question;
+import life.majiang.community.model.QuestionExample;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.session.RowBounds;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * Created by codedrinker on 2019/8/1.
+ */
+@Component
+@Slf4j
+public class HotTagTasks {
+
+    @Autowired
+    private QuestionMapper questionMapper;
+
+    @Autowired
+    private HotTagCache hotTagCache;
+
+    @Scheduled(fixedRate = 1000 * 60 * 60 * 3)
+    public void hotTagSchedule() {
+        int offset = 0;
+        int limit = 20;
+        log.info("hotTagSchedule start {}", new Date());
+        List<Question> list = new ArrayList<>();
+
+        Map<String, Integer> priorities = new HashMap<>();
+        while (offset == 0 || list.size() == limit) {
+            list = questionMapper.selectByExampleWithRowbounds(new QuestionExample(), new RowBounds(offset, limit));
+            for (Question question : list) {
+                String[] tags = StringUtils.split(question.getTag(), ",");
+                for (String tag : tags) {
+                    Integer priority = priorities.get(tag);
+                    if (priority != null) {
+                        priorities.put(tag, priority + 5 + question.getCommentCount());
+                    } else {
+                        priorities.put(tag, 5 + question.getCommentCount());
+                    }
+                }
+            }
+            offset += limit;
+        }
+        hotTagCache.updateTags(priorities);
+        log.info("hotTagSchedule stop {}", new Date());
+    }
+}
diff --git a/src/main/java/life/majiang/community/service/AdService.java b/src/main/java/life/majiang/community/service/AdService.java
new file mode 100644
index 0000000..1200fbe
--- /dev/null
+++ b/src/main/java/life/majiang/community/service/AdService.java
@@ -0,0 +1,28 @@
+package life.majiang.community.service;
+
+import life.majiang.community.mapper.AdMapper;
+import life.majiang.community.model.Ad;
+import life.majiang.community.model.AdExample;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Created by codedrinker on 2019/9/6.
+ */
+@Service
+public class AdService {
+    @Autowired
+    private AdMapper adMapper;
+
+    public List<Ad> list(String pos) {
+        AdExample navExample = new AdExample();
+        navExample.createCriteria()
+                .andStatusEqualTo(1)
+                .andPosEqualTo(pos)
+                .andGmtStartLessThan(System.currentTimeMillis())
+                .andGmtEndGreaterThan(System.currentTimeMillis());
+        return adMapper.selectByExample(navExample);
+    }
+}
diff --git a/src/main/java/life/majiang/community/service/NavService.java b/src/main/java/life/majiang/community/service/NavService.java
new file mode 100644
index 0000000..09bde04
--- /dev/null
+++ b/src/main/java/life/majiang/community/service/NavService.java
@@ -0,0 +1,27 @@
+package life.majiang.community.service;
+
+import life.majiang.community.mapper.NavMapper;
+import life.majiang.community.model.Nav;
+import life.majiang.community.model.NavExample;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Created by codedrinker on 2019/9/2.
+ */
+@Service
+public class NavService {
+    @Autowired
+    private NavMapper navMapper;
+
+    public List<Nav> list() {
+        NavExample navExample = new NavExample();
+        navExample.createCriteria()
+                .andStatusEqualTo(1);
+        navExample.setOrderByClause("priority desc");
+        List<Nav> navs = navMapper.selectByExample(navExample);
+        return navs;
+    }
+}
diff --git a/src/main/java/life/majiang/community/service/QuestionService.java b/src/main/java/life/majiang/community/service/QuestionService.java
index fb59d75..8fe4164 100644
--- a/src/main/java/life/majiang/community/service/QuestionService.java
+++ b/src/main/java/life/majiang/community/service/QuestionService.java
@@ -1,8 +1,10 @@
 package life.majiang.community.service;
 
+import life.majiang.community.cache.QuestionCache;
 import life.majiang.community.dto.PaginationDTO;
 import life.majiang.community.dto.QuestionDTO;
 import life.majiang.community.dto.QuestionQueryDTO;
+import life.majiang.community.enums.SortEnum;
 import life.majiang.community.exception.CustomizeErrorCode;
 import life.majiang.community.exception.CustomizeException;
 import life.majiang.community.mapper.QuestionExtMapper;
@@ -37,11 +39,19 @@ public class QuestionService {
     @Autowired
     private UserMapper userMapper;
 
-    public PaginationDTO list(String search,Integer page, Integer size) {
+    @Autowired
+    private QuestionCache questionCache;
+
+    public PaginationDTO list(String search, String tag, String sort, Integer page, Integer size) {
 
         if (StringUtils.isNotBlank(search)) {
             String[] tags = StringUtils.split(search, " ");
-            search = Arrays.stream(tags).collect(Collectors.joining("|"));
+            search = Arrays
+                    .stream(tags)
+                    .filter(StringUtils::isNotBlank)
+                    .map(t -> t.replace("+", "").replace("*", "").replace("?", ""))
+                    .filter(StringUtils::isNotBlank)
+                    .collect(Collectors.joining("|"));
         }
 
         PaginationDTO paginationDTO = new PaginationDTO();
@@ -50,6 +60,24 @@ public PaginationDTO list(String search,Integer page, Integer size) {
 
         QuestionQueryDTO questionQueryDTO = new QuestionQueryDTO();
         questionQueryDTO.setSearch(search);
+        if (StringUtils.isNotBlank(tag)) {
+            tag = tag.replace("+", "").replace("*", "").replace("?", "");
+            questionQueryDTO.setTag(tag);
+        }
+
+        for (SortEnum sortEnum : SortEnum.values()) {
+            if (sortEnum.name().toLowerCase().equals(sort)) {
+                questionQueryDTO.setSort(sort);
+
+                if (sortEnum == SortEnum.HOT7) {
+                    questionQueryDTO.setTime(System.currentTimeMillis() - 1000L * 60 * 60 * 24 * 7);
+                }
+                if (sortEnum == SortEnum.HOT30) {
+                    questionQueryDTO.setTime(System.currentTimeMillis() - 1000L * 60 * 60 * 24 * 30);
+                }
+                break;
+            }
+        }
 
         Integer totalCount = questionExtMapper.countBySearch(questionQueryDTO);
 
@@ -77,10 +105,14 @@ public PaginationDTO list(String search,Integer page, Integer size) {
             User user = userMapper.selectByPrimaryKey(question.getCreator());
             QuestionDTO questionDTO = new QuestionDTO();
             BeanUtils.copyProperties(question, questionDTO);
+            questionDTO.setDescription("");
             questionDTO.setUser(user);
             questionDTOList.add(questionDTO);
         }
-
+        List<QuestionDTO> stickies = questionCache.getStickies();
+        if (stickies != null && stickies.size() != 0) {
+            questionDTOList.addAll(0, stickies);
+        }
         paginationDTO.setData(questionDTOList);
         return paginationDTO;
     }
@@ -150,9 +182,20 @@ public void createOrUpdate(Question question) {
             question.setViewCount(0);
             question.setLikeCount(0);
             question.setCommentCount(0);
+            question.setSticky(0);
             questionMapper.insert(question);
         } else {
             // 更新
+
+            Question dbQuestion = questionMapper.selectByPrimaryKey(question.getId());
+            if (dbQuestion == null) {
+                throw new CustomizeException(CustomizeErrorCode.QUESTION_NOT_FOUND);
+            }
+
+            if (dbQuestion.getCreator().longValue() != question.getCreator().longValue()) {
+                throw new CustomizeException(CustomizeErrorCode.INVALID_OPERATION);
+            }
+
             Question updateQuestion = new Question();
             updateQuestion.setGmtModified(System.currentTimeMillis());
             updateQuestion.setTitle(question.getTitle());
@@ -180,7 +223,12 @@ public List<QuestionDTO> selectRelated(QuestionDTO queryDTO) {
             return new ArrayList<>();
         }
         String[] tags = StringUtils.split(queryDTO.getTag(), ",");
-        String regexpTag = Arrays.stream(tags).collect(Collectors.joining("|"));
+        String regexpTag = Arrays
+                .stream(tags)
+                .filter(StringUtils::isNotBlank)
+                .map(t -> t.replace("+", "").replace("*", "").replace("?", ""))
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.joining("|"));
         Question question = new Question();
         question.setId(queryDTO.getId());
         question.setTag(regexpTag);
diff --git a/src/main/java/life/majiang/community/service/UserService.java b/src/main/java/life/majiang/community/service/UserService.java
index 7a0ecb2..eee323c 100644
--- a/src/main/java/life/majiang/community/service/UserService.java
+++ b/src/main/java/life/majiang/community/service/UserService.java
@@ -19,7 +19,8 @@ public class UserService {
     public void createOrUpdate(User user) {
         UserExample userExample = new UserExample();
         userExample.createCriteria()
-                .andAccountIdEqualTo(user.getAccountId());
+                .andAccountIdEqualTo(user.getAccountId())
+                .andTypeEqualTo(user.getType());
         List<User> users = userMapper.selectByExample(userExample);
         if (users.size() == 0) {
             // 插入
diff --git a/src/main/java/life/majiang/community/strategy/GiteeUserStrategy.java b/src/main/java/life/majiang/community/strategy/GiteeUserStrategy.java
new file mode 100644
index 0000000..bb52951
--- /dev/null
+++ b/src/main/java/life/majiang/community/strategy/GiteeUserStrategy.java
@@ -0,0 +1,33 @@
+package life.majiang.community.strategy;
+
+import life.majiang.community.dto.AccessTokenDTO;
+import life.majiang.community.provider.GiteeProvider;
+import life.majiang.community.provider.dto.GiteeUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class GiteeUserStrategy implements UserStrategy {
+    @Autowired
+    private GiteeProvider giteeProvider;
+
+    @Override
+    public LoginUserInfo getUser(String code, String state) {
+        AccessTokenDTO accessTokenDTO = new AccessTokenDTO();
+        accessTokenDTO.setCode(code);
+        accessTokenDTO.setState(state);
+        String accessToken = giteeProvider.getAccessToken(accessTokenDTO);
+        GiteeUser giteeUser = giteeProvider.getUser(accessToken);
+        LoginUserInfo loginUserInfo = new LoginUserInfo();
+        loginUserInfo.setAvatarUrl(giteeUser.getAvatarUrl());
+        loginUserInfo.setBio(giteeUser.getBio());
+        loginUserInfo.setId(giteeUser.getId());
+        loginUserInfo.setName(giteeUser.getName());
+        return loginUserInfo;
+    }
+
+    @Override
+    public String getSupportedType() {
+        return "gitee";
+    }
+}
diff --git a/src/main/java/life/majiang/community/strategy/GithubUserStrategy.java b/src/main/java/life/majiang/community/strategy/GithubUserStrategy.java
new file mode 100644
index 0000000..ae4f9e3
--- /dev/null
+++ b/src/main/java/life/majiang/community/strategy/GithubUserStrategy.java
@@ -0,0 +1,48 @@
+package life.majiang.community.strategy;
+
+import life.majiang.community.dto.AccessTokenDTO;
+import life.majiang.community.provider.GithubProvider;
+import life.majiang.community.provider.UFileResult;
+import life.majiang.community.provider.UFileService;
+import life.majiang.community.provider.dto.GithubUser;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+public class GithubUserStrategy implements UserStrategy {
+    @Autowired
+    private GithubProvider githubProvider;
+
+    @Autowired
+    private UFileService uFileService;
+
+    @Override
+    public LoginUserInfo getUser(String code, String state) {
+        AccessTokenDTO accessTokenDTO = new AccessTokenDTO();
+        accessTokenDTO.setCode(code);
+        accessTokenDTO.setState(state);
+        String accessToken = githubProvider.getAccessToken(accessTokenDTO);
+        GithubUser githubUser = githubProvider.getUser(accessToken);
+        LoginUserInfo loginUserInfo = new LoginUserInfo();
+        loginUserInfo.setAvatarUrl(githubUser.getAvatarUrl());
+        loginUserInfo.setBio(githubUser.getBio());
+        loginUserInfo.setId(githubUser.getId());
+        loginUserInfo.setName(githubUser.getName());
+        UFileResult fileResult = null;
+        try {
+            fileResult = uFileService.upload(loginUserInfo.getAvatarUrl());
+            loginUserInfo.setAvatarUrl(fileResult.getFileUrl());
+        } catch (Exception e) {
+            log.error("upload image error", e);
+            loginUserInfo.setAvatarUrl(loginUserInfo.getAvatarUrl());
+        }
+        return loginUserInfo;
+    }
+
+    @Override
+    public String getSupportedType() {
+        return "github";
+    }
+}
diff --git a/src/main/java/life/majiang/community/strategy/LoginUserInfo.java b/src/main/java/life/majiang/community/strategy/LoginUserInfo.java
new file mode 100644
index 0000000..33ee098
--- /dev/null
+++ b/src/main/java/life/majiang/community/strategy/LoginUserInfo.java
@@ -0,0 +1,11 @@
+package life.majiang.community.strategy;
+
+import lombok.Data;
+
+@Data
+public class LoginUserInfo {
+    private String name;
+    private Long id;
+    private String bio;
+    private String avatarUrl;
+}
diff --git a/src/main/java/life/majiang/community/strategy/UserStrategy.java b/src/main/java/life/majiang/community/strategy/UserStrategy.java
new file mode 100644
index 0000000..f557577
--- /dev/null
+++ b/src/main/java/life/majiang/community/strategy/UserStrategy.java
@@ -0,0 +1,6 @@
+package life.majiang.community.strategy;
+
+public interface UserStrategy {
+    LoginUserInfo getUser(String code, String state);
+    String getSupportedType();
+}
diff --git a/src/main/java/life/majiang/community/strategy/UserStrategyFactory.java b/src/main/java/life/majiang/community/strategy/UserStrategyFactory.java
new file mode 100644
index 0000000..f374c8e
--- /dev/null
+++ b/src/main/java/life/majiang/community/strategy/UserStrategyFactory.java
@@ -0,0 +1,23 @@
+package life.majiang.community.strategy;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class UserStrategyFactory {
+
+    @Autowired
+    private List<UserStrategy> strategies;
+
+    public UserStrategy getStrategy(String type) {
+        for (UserStrategy strategy : strategies) {
+            if (StringUtils.equals(strategy.getSupportedType(), type)) {
+                return strategy;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/life/majiang/community/utils/FileUtils.java b/src/main/java/life/majiang/community/utils/FileUtils.java
new file mode 100644
index 0000000..83bb295
--- /dev/null
+++ b/src/main/java/life/majiang/community/utils/FileUtils.java
@@ -0,0 +1,91 @@
+package life.majiang.community.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 专注于处理图片的工具
+ */
+@Slf4j
+public class FileUtils {
+    private static List<String> suffix = new ArrayList<>();
+
+    static {
+        suffix.add(".png");
+        suffix.add(".bmp");
+        suffix.add(".gif");
+        suffix.add(".jpeg");
+        suffix.add(".jpg");
+    }
+
+    public static boolean hasSuffix(String fileName) {
+        for (String s : suffix) {
+            if (StringUtils.endsWithIgnoreCase(fileName, s)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static String newUUIDFileName(String fileName) {
+        if (StringUtils.isBlank(fileName)) {
+            return fileName;
+        }
+        if (hasSuffix(fileName)) {
+            String[] filePaths = fileName.split("\\.");
+            if (filePaths.length > 1) {
+                return UUID.randomUUID().toString().replace("-", "") + "." + filePaths[filePaths.length - 1];
+            } else {
+                return newUUIDPNGFileName();
+            }
+        } else {
+            return newUUIDPNGFileName();
+        }
+    }
+
+    public static String newUUIDPNGFileName() {
+        return UUID.randomUUID().toString().replace("-", "") + ".png";
+    }
+
+    public static String newLocalFileName(String fileName) {
+        String path = System.getProperty("user.dir") + File.separator;
+        return newLocalFileName(path, fileName);
+    }
+
+    public static String newLocalFileName(String path, String fileName) {
+        return path + newUUIDFileName(fileName);
+    }
+
+    public static File newFile(String url) {
+        File file;
+        String localFile = newLocalFileName(url);
+        log.info("FILE_UTILS_NEW_INFO, url : {}, localFile : {}", url, localFile);
+        file = new File(localFile);
+        try {
+            org.apache.commons.io.FileUtils.copyURLToFile(new URL(url), file);
+        } catch (Exception e) {
+            log.error("FILE_UTILS_NEW_ERROR, url : {}", url, e);
+            return null;
+        }
+        return file;
+    }
+
+    public static void deleteFile(File file) {
+        try {
+            file.delete();
+        } catch (Exception e) {
+            log.debug("FILE_UTILS_ERROR", e);
+        }
+    }
+
+    public static void main(String[] args) {
+        String x = FileUtils.newLocalFileName("http://luckydraw.cn-bj.ufileos.com/ffb5134b-8070-4d65-be0f-c3b1a0050dbc.jpg");
+        System.out.println(x);
+    }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 857d794..fffceba 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,22 +1,28 @@
 server.port=8887
-github.client.id=2859958f9f059979ed3a
-github.client.secret=10a5ce491fd6b7cd137efdc1ac763261f7d3b6fc
-github.redirect.uri=http://localhost:8887/callback
-ucloud.ufile.public-key=TOKEN_f465454a-f3ab-4c9b-91a5-c7babf59cc38
-ucloud.ufile.private-key=18977163-f21e-4deb-a2e3-9bfa0b888ba5
-ucloud.ufile.bucket-name=mawen
-ucloud.ufile.region=cn-bj
-ucloud.ufile.suffix=ufileos.com
-ucloud.ufile.expires=315360000
-spring.datasource.url=jdbc:h2:~/community
-spring.datasource.username=sa
-spring.datasource.password=123
-spring.datasource.driver-class-name=org.h2.Driver
+github.client.id=7f316909bf70d1eaa2b2
+github.client.secret=3c6f5cd2fceb99e3c8a338f53bb5e29ed156b2ef
+github.redirect.uri=http://localhost:8887/callback/github
+gitee.client.id=e542c33bb680ea612ce21b8efb397274eae34833553bc80bc9ff881425d1b883
+gitee.client.secret=5181b24983dd562b8089f59d212f391e315d0649ecec3db13ef07830a61a7aa9
+gitee.redirect.uri=http://localhost:8887/callback/gitee
+ucloud.ufile.bucketName=mawen
+ucloud.ufile.bucketType=private
+ucloud.ufile.expiresDuration=315360000
+ucloud.ufile.publicKey=TOKEN_f465454a-f3ab-4c9b-91a5-c7babf59cc38
+ucloud.ufile.privateKey=18977163-f21e-4deb-a2e3-9bfa0b888ba5
+ucloud.ufile.uploadDomain=mawen.cn-bj.ufileos.com
+ucloud.ufile.downloadDomain=mawen.cn-bj.ufileos.com
+spring.datasource.url=@db.url@community?useUnicode=true&characterEncoding=UTF-8
+spring.datasource.username=@db.user@
+spring.datasource.password=@db.password@
+spring.datasource.driver-class-name=@db.driver@
 mybatis.configuration.map-underscore-to-camel-case=true
 mybatis.type-aliases-package=life.majiang.community.mapper
 mybatis.mapper-locations=classpath:mapper/*.xml
 logging.file=logs/community.log
 logging.level.root=info
-logging.level.life.majiang.community.mapper=debug
 logging.file.max-history=15
-logging.file.max-size=100MB
\ No newline at end of file
+logging.file.max-size=100MB
+server.servlet.session.timeout=15552000
+spring.servlet.multipart.max-file-size=20MB
+spring.servlet.multipart.max-request-size=20MB
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V13__Create_nav_table.sql b/src/main/resources/db/migration/V13__Create_nav_table.sql
new file mode 100644
index 0000000..b64efaf
--- /dev/null
+++ b/src/main/resources/db/migration/V13__Create_nav_table.sql
@@ -0,0 +1,10 @@
+create table nav
+(
+    id int auto_increment primary key not null,
+    title varchar(100),
+    url varchar(256),
+    priority int default 0,
+    gmt_create bigint,
+    gmt_modified bigint,
+    status int
+);
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V14__Create_ad_table.sql b/src/main/resources/db/migration/V14__Create_ad_table.sql
new file mode 100644
index 0000000..6c272d4
--- /dev/null
+++ b/src/main/resources/db/migration/V14__Create_ad_table.sql
@@ -0,0 +1,13 @@
+create table ad
+(
+    id int auto_increment primary key not null,
+    title varchar(256) DEFAULT NULL,
+    url varchar(512) DEFAULT NULL,
+    image varchar(256) DEFAULT NULL,
+    gmt_start bigint,
+    gmt_end bigint,
+    gmt_create bigint,
+    gmt_modified bigint,
+    status int,
+    pos varchar(10) NOT NULL
+);
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V15__Add_sticky_to_question_table.sql b/src/main/resources/db/migration/V15__Add_sticky_to_question_table.sql
new file mode 100644
index 0000000..39f6936
--- /dev/null
+++ b/src/main/resources/db/migration/V15__Add_sticky_to_question_table.sql
@@ -0,0 +1 @@
+alter table question add sticky int(1) default 0;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V16__Change_avatar_column_type.sql b/src/main/resources/db/migration/V16__Change_avatar_column_type.sql
new file mode 100644
index 0000000..43d6f1a
--- /dev/null
+++ b/src/main/resources/db/migration/V16__Change_avatar_column_type.sql
@@ -0,0 +1 @@
+alter table user modify avatar_url varchar(256) default null;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V17__Add_type_to_user_table.sql b/src/main/resources/db/migration/V17__Add_type_to_user_table.sql
new file mode 100644
index 0000000..05bf367
--- /dev/null
+++ b/src/main/resources/db/migration/V17__Add_type_to_user_table.sql
@@ -0,0 +1 @@
+alter table user add `type` varchar(10) null default 'github';
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V18__Add_disable_to_user_table.sql b/src/main/resources/db/migration/V18__Add_disable_to_user_table.sql
new file mode 100644
index 0000000..f5848d1
--- /dev/null
+++ b/src/main/resources/db/migration/V18__Add_disable_to_user_table.sql
@@ -0,0 +1 @@
+alter table user add `disable` int(10) null default '0';
\ No newline at end of file
diff --git a/src/main/resources/generatorConfig.xml b/src/main/resources/generatorConfig.xml
index 5ec15f7..78fb5b5 100644
--- a/src/main/resources/generatorConfig.xml
+++ b/src/main/resources/generatorConfig.xml
@@ -8,10 +8,11 @@
     <context id="DB2Tables" targetRuntime="MyBatis3">
         
         <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"></plugin>
-        <jdbcConnection driverClass="org.h2.Driver"
-                        connectionURL="jdbc:h2:~/community"
-                        userId="sa"
-                        password="123">
+        <jdbcConnection
+                driverClass="@db.driver@"
+                connectionURL="@db.url@community"
+                userId="@db.user@"
+                password="@db.password@">
         </jdbcConnection>
 
         <javaTypeResolver>
@@ -36,5 +37,7 @@
         <table tableName="question" domainObjectName="Question"></table>
         <table tableName="comment" domainObjectName="Comment"></table>
         <table tableName="notification" domainObjectName="Notification"></table>
+        <table tableName="nav" domainObjectName="Nav"></table>
+        <table tableName="ad" domainObjectName="Ad"></table>
     </context>
 </generatorConfiguration>
\ No newline at end of file
diff --git a/src/main/resources/mapper/AdMapper.xml b/src/main/resources/mapper/AdMapper.xml
new file mode 100644
index 0000000..d65c4ff
--- /dev/null
+++ b/src/main/resources/mapper/AdMapper.xml
@@ -0,0 +1,384 @@
+<?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="life.majiang.community.mapper.AdMapper">
+  <resultMap id="BaseResultMap" type="life.majiang.community.model.Ad">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="url" jdbcType="VARCHAR" property="url" />
+    <result column="image" jdbcType="VARCHAR" property="image" />
+    <result column="gmt_start" jdbcType="BIGINT" property="gmtStart" />
+    <result column="gmt_end" jdbcType="BIGINT" property="gmtEnd" />
+    <result column="gmt_create" jdbcType="BIGINT" property="gmtCreate" />
+    <result column="gmt_modified" jdbcType="BIGINT" property="gmtModified" />
+    <result column="status" jdbcType="INTEGER" property="status" />
+    <result column="pos" jdbcType="VARCHAR" property="pos" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    id, title, url, image, gmt_start, gmt_end, gmt_create, gmt_modified, status, pos
+  </sql>
+  <select id="selectByExample" parameterType="life.majiang.community.model.AdExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from ad
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from ad
+    where id = #{id,jdbcType=INTEGER}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    delete from ad
+    where id = #{id,jdbcType=INTEGER}
+  </delete>
+  <delete id="deleteByExample" parameterType="life.majiang.community.model.AdExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    delete from ad
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="life.majiang.community.model.Ad">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    insert into ad (id, title, url, 
+      image, gmt_start, gmt_end, 
+      gmt_create, gmt_modified, status, 
+      pos)
+    values (#{id,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR}, #{url,jdbcType=VARCHAR}, 
+      #{image,jdbcType=VARCHAR}, #{gmtStart,jdbcType=BIGINT}, #{gmtEnd,jdbcType=BIGINT}, 
+      #{gmtCreate,jdbcType=BIGINT}, #{gmtModified,jdbcType=BIGINT}, #{status,jdbcType=INTEGER}, 
+      #{pos,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="life.majiang.community.model.Ad">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    insert into ad
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="title != null">
+        title,
+      </if>
+      <if test="url != null">
+        url,
+      </if>
+      <if test="image != null">
+        image,
+      </if>
+      <if test="gmtStart != null">
+        gmt_start,
+      </if>
+      <if test="gmtEnd != null">
+        gmt_end,
+      </if>
+      <if test="gmtCreate != null">
+        gmt_create,
+      </if>
+      <if test="gmtModified != null">
+        gmt_modified,
+      </if>
+      <if test="status != null">
+        status,
+      </if>
+      <if test="pos != null">
+        pos,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=INTEGER},
+      </if>
+      <if test="title != null">
+        #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="image != null">
+        #{image,jdbcType=VARCHAR},
+      </if>
+      <if test="gmtStart != null">
+        #{gmtStart,jdbcType=BIGINT},
+      </if>
+      <if test="gmtEnd != null">
+        #{gmtEnd,jdbcType=BIGINT},
+      </if>
+      <if test="gmtCreate != null">
+        #{gmtCreate,jdbcType=BIGINT},
+      </if>
+      <if test="gmtModified != null">
+        #{gmtModified,jdbcType=BIGINT},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=INTEGER},
+      </if>
+      <if test="pos != null">
+        #{pos,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="life.majiang.community.model.AdExample" resultType="java.lang.Long">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    select count(*) from ad
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    update ad
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=INTEGER},
+      </if>
+      <if test="record.title != null">
+        title = #{record.title,jdbcType=VARCHAR},
+      </if>
+      <if test="record.url != null">
+        url = #{record.url,jdbcType=VARCHAR},
+      </if>
+      <if test="record.image != null">
+        image = #{record.image,jdbcType=VARCHAR},
+      </if>
+      <if test="record.gmtStart != null">
+        gmt_start = #{record.gmtStart,jdbcType=BIGINT},
+      </if>
+      <if test="record.gmtEnd != null">
+        gmt_end = #{record.gmtEnd,jdbcType=BIGINT},
+      </if>
+      <if test="record.gmtCreate != null">
+        gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
+      </if>
+      <if test="record.gmtModified != null">
+        gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
+      </if>
+      <if test="record.status != null">
+        status = #{record.status,jdbcType=INTEGER},
+      </if>
+      <if test="record.pos != null">
+        pos = #{record.pos,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    update ad
+    set id = #{record.id,jdbcType=INTEGER},
+      title = #{record.title,jdbcType=VARCHAR},
+      url = #{record.url,jdbcType=VARCHAR},
+      image = #{record.image,jdbcType=VARCHAR},
+      gmt_start = #{record.gmtStart,jdbcType=BIGINT},
+      gmt_end = #{record.gmtEnd,jdbcType=BIGINT},
+      gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
+      status = #{record.status,jdbcType=INTEGER},
+      pos = #{record.pos,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="life.majiang.community.model.Ad">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    update ad
+    <set>
+      <if test="title != null">
+        title = #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        url = #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="image != null">
+        image = #{image,jdbcType=VARCHAR},
+      </if>
+      <if test="gmtStart != null">
+        gmt_start = #{gmtStart,jdbcType=BIGINT},
+      </if>
+      <if test="gmtEnd != null">
+        gmt_end = #{gmtEnd,jdbcType=BIGINT},
+      </if>
+      <if test="gmtCreate != null">
+        gmt_create = #{gmtCreate,jdbcType=BIGINT},
+      </if>
+      <if test="gmtModified != null">
+        gmt_modified = #{gmtModified,jdbcType=BIGINT},
+      </if>
+      <if test="status != null">
+        status = #{status,jdbcType=INTEGER},
+      </if>
+      <if test="pos != null">
+        pos = #{pos,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="life.majiang.community.model.Ad">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    update ad
+    set title = #{title,jdbcType=VARCHAR},
+      url = #{url,jdbcType=VARCHAR},
+      image = #{image,jdbcType=VARCHAR},
+      gmt_start = #{gmtStart,jdbcType=BIGINT},
+      gmt_end = #{gmtEnd,jdbcType=BIGINT},
+      gmt_create = #{gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{gmtModified,jdbcType=BIGINT},
+      status = #{status,jdbcType=INTEGER},
+      pos = #{pos,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+  <select id="selectByExampleWithRowbounds" parameterType="life.majiang.community.model.AdExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from ad
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/CommentExtMapper.xml b/src/main/resources/mapper/CommentExtMapper.xml
index 4f7d3f2..0953ab5 100644
--- a/src/main/resources/mapper/CommentExtMapper.xml
+++ b/src/main/resources/mapper/CommentExtMapper.xml
@@ -7,20 +7,20 @@
           This element is automatically generated by MyBatis Generator, do not modify.
           This element was generated on Tue Jun 04 08:06:47 CST 2019.
         -->
-        <id column="ID" jdbcType="BIGINT" property="id"/>
-        <result column="PARENT_ID" jdbcType="BIGINT" property="parentId"/>
-        <result column="TYPE" jdbcType="INTEGER" property="type"/>
-        <result column="COMMENTATOR" jdbcType="BIGINT" property="commentator"/>
-        <result column="GMT_CREATE" jdbcType="BIGINT" property="gmtCreate"/>
-        <result column="GMT_MODIFIED" jdbcType="BIGINT" property="gmtModified"/>
-        <result column="LIKE_COUNT" jdbcType="BIGINT" property="likeCount"/>
-        <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
-        <result column="COMMENT_COUNT" jdbcType="INTEGER" property="commentCount"/>
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="parent_id" jdbcType="BIGINT" property="parentId"/>
+        <result column="type" jdbcType="INTEGER" property="type"/>
+        <result column="commentator" jdbcType="BIGINT" property="commentator"/>
+        <result column="gmt_create" jdbcType="BIGINT" property="gmtCreate"/>
+        <result column="gmt_modified" jdbcType="BIGINT" property="gmtModified"/>
+        <result column="like_count" jdbcType="BIGINT" property="likeCount"/>
+        <result column="content" jdbcType="VARCHAR" property="content"/>
+        <result column="comment_count" jdbcType="INTEGER" property="commentCount"/>
     </resultMap>
     <update id="incCommentCount" parameterType="life.majiang.community.model.Comment">
-    update COMMENT
+    update comment
     set
-    COMMENT_COUNT = COMMENT_COUNT + #{commentCount,jdbcType=INTEGER}
+    comment_count = comment_count + #{commentCount,jdbcType=INTEGER}
     where id = #{id}
     </update>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/CommentMapper.xml b/src/main/resources/mapper/CommentMapper.xml
index ad4ba3e..765a78e 100644
--- a/src/main/resources/mapper/CommentMapper.xml
+++ b/src/main/resources/mapper/CommentMapper.xml
@@ -5,23 +5,23 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    <id column="ID" jdbcType="BIGINT" property="id" />
-    <result column="PARENT_ID" jdbcType="BIGINT" property="parentId" />
-    <result column="TYPE" jdbcType="INTEGER" property="type" />
-    <result column="COMMENTATOR" jdbcType="BIGINT" property="commentator" />
-    <result column="GMT_CREATE" jdbcType="BIGINT" property="gmtCreate" />
-    <result column="GMT_MODIFIED" jdbcType="BIGINT" property="gmtModified" />
-    <result column="LIKE_COUNT" jdbcType="BIGINT" property="likeCount" />
-    <result column="CONTENT" jdbcType="VARCHAR" property="content" />
-    <result column="COMMENT_COUNT" jdbcType="INTEGER" property="commentCount" />
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="parent_id" jdbcType="BIGINT" property="parentId" />
+    <result column="type" jdbcType="INTEGER" property="type" />
+    <result column="commentator" jdbcType="BIGINT" property="commentator" />
+    <result column="gmt_create" jdbcType="BIGINT" property="gmtCreate" />
+    <result column="gmt_modified" jdbcType="BIGINT" property="gmtModified" />
+    <result column="like_count" jdbcType="BIGINT" property="likeCount" />
+    <result column="content" jdbcType="VARCHAR" property="content" />
+    <result column="comment_count" jdbcType="INTEGER" property="commentCount" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     <where>
       <foreach collection="oredCriteria" item="criteria" separator="or">
@@ -55,7 +55,7 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     <where>
       <foreach collection="example.oredCriteria" item="criteria" separator="or">
@@ -89,23 +89,23 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    ID, PARENT_ID, TYPE, COMMENTATOR, GMT_CREATE, GMT_MODIFIED, LIKE_COUNT, CONTENT, 
-    COMMENT_COUNT
+    id, parent_id, type, commentator, gmt_create, gmt_modified, like_count, content, 
+    comment_count
   </sql>
   <select id="selectByExample" parameterType="life.majiang.community.model.CommentExample" resultMap="BaseResultMap">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
       distinct
     </if>
     <include refid="Base_Column_List" />
-    from COMMENT
+    from comment
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -117,29 +117,29 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select 
     <include refid="Base_Column_List" />
-    from COMMENT
-    where ID = #{id,jdbcType=BIGINT}
+    from comment
+    where id = #{id,jdbcType=BIGINT}
   </select>
   <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    delete from COMMENT
-    where ID = #{id,jdbcType=BIGINT}
+    delete from comment
+    where id = #{id,jdbcType=BIGINT}
   </delete>
   <delete id="deleteByExample" parameterType="life.majiang.community.model.CommentExample">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    delete from COMMENT
+    delete from comment
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -148,11 +148,11 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    insert into COMMENT (ID, PARENT_ID, TYPE, 
-      COMMENTATOR, GMT_CREATE, GMT_MODIFIED, 
-      LIKE_COUNT, CONTENT, COMMENT_COUNT
+    insert into comment (id, parent_id, type, 
+      commentator, gmt_create, gmt_modified, 
+      like_count, content, comment_count
       )
     values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{type,jdbcType=INTEGER}, 
       #{commentator,jdbcType=BIGINT}, #{gmtCreate,jdbcType=BIGINT}, #{gmtModified,jdbcType=BIGINT}, 
@@ -163,36 +163,36 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    insert into COMMENT
+    insert into comment
     <trim prefix="(" suffix=")" suffixOverrides=",">
       <if test="id != null">
-        ID,
+        id,
       </if>
       <if test="parentId != null">
-        PARENT_ID,
+        parent_id,
       </if>
       <if test="type != null">
-        TYPE,
+        type,
       </if>
       <if test="commentator != null">
-        COMMENTATOR,
+        commentator,
       </if>
       <if test="gmtCreate != null">
-        GMT_CREATE,
+        gmt_create,
       </if>
       <if test="gmtModified != null">
-        GMT_MODIFIED,
+        gmt_modified,
       </if>
       <if test="likeCount != null">
-        LIKE_COUNT,
+        like_count,
       </if>
       <if test="content != null">
-        CONTENT,
+        content,
       </if>
       <if test="commentCount != null">
-        COMMENT_COUNT,
+        comment_count,
       </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -229,9 +229,9 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    select count(*) from COMMENT
+    select count(*) from comment
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -240,36 +240,36 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update COMMENT
+    update comment
     <set>
       <if test="record.id != null">
-        ID = #{record.id,jdbcType=BIGINT},
+        id = #{record.id,jdbcType=BIGINT},
       </if>
       <if test="record.parentId != null">
-        PARENT_ID = #{record.parentId,jdbcType=BIGINT},
+        parent_id = #{record.parentId,jdbcType=BIGINT},
       </if>
       <if test="record.type != null">
-        TYPE = #{record.type,jdbcType=INTEGER},
+        type = #{record.type,jdbcType=INTEGER},
       </if>
       <if test="record.commentator != null">
-        COMMENTATOR = #{record.commentator,jdbcType=BIGINT},
+        commentator = #{record.commentator,jdbcType=BIGINT},
       </if>
       <if test="record.gmtCreate != null">
-        GMT_CREATE = #{record.gmtCreate,jdbcType=BIGINT},
+        gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
       </if>
       <if test="record.gmtModified != null">
-        GMT_MODIFIED = #{record.gmtModified,jdbcType=BIGINT},
+        gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
       </if>
       <if test="record.likeCount != null">
-        LIKE_COUNT = #{record.likeCount,jdbcType=BIGINT},
+        like_count = #{record.likeCount,jdbcType=BIGINT},
       </if>
       <if test="record.content != null">
-        CONTENT = #{record.content,jdbcType=VARCHAR},
+        content = #{record.content,jdbcType=VARCHAR},
       </if>
       <if test="record.commentCount != null">
-        COMMENT_COUNT = #{record.commentCount,jdbcType=INTEGER},
+        comment_count = #{record.commentCount,jdbcType=INTEGER},
       </if>
     </set>
     <if test="_parameter != null">
@@ -280,18 +280,18 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update COMMENT
-    set ID = #{record.id,jdbcType=BIGINT},
-      PARENT_ID = #{record.parentId,jdbcType=BIGINT},
-      TYPE = #{record.type,jdbcType=INTEGER},
-      COMMENTATOR = #{record.commentator,jdbcType=BIGINT},
-      GMT_CREATE = #{record.gmtCreate,jdbcType=BIGINT},
-      GMT_MODIFIED = #{record.gmtModified,jdbcType=BIGINT},
-      LIKE_COUNT = #{record.likeCount,jdbcType=BIGINT},
-      CONTENT = #{record.content,jdbcType=VARCHAR},
-      COMMENT_COUNT = #{record.commentCount,jdbcType=INTEGER}
+    update comment
+    set id = #{record.id,jdbcType=BIGINT},
+      parent_id = #{record.parentId,jdbcType=BIGINT},
+      type = #{record.type,jdbcType=INTEGER},
+      commentator = #{record.commentator,jdbcType=BIGINT},
+      gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
+      like_count = #{record.likeCount,jdbcType=BIGINT},
+      content = #{record.content,jdbcType=VARCHAR},
+      comment_count = #{record.commentCount,jdbcType=INTEGER}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -300,66 +300,66 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update COMMENT
+    update comment
     <set>
       <if test="parentId != null">
-        PARENT_ID = #{parentId,jdbcType=BIGINT},
+        parent_id = #{parentId,jdbcType=BIGINT},
       </if>
       <if test="type != null">
-        TYPE = #{type,jdbcType=INTEGER},
+        type = #{type,jdbcType=INTEGER},
       </if>
       <if test="commentator != null">
-        COMMENTATOR = #{commentator,jdbcType=BIGINT},
+        commentator = #{commentator,jdbcType=BIGINT},
       </if>
       <if test="gmtCreate != null">
-        GMT_CREATE = #{gmtCreate,jdbcType=BIGINT},
+        gmt_create = #{gmtCreate,jdbcType=BIGINT},
       </if>
       <if test="gmtModified != null">
-        GMT_MODIFIED = #{gmtModified,jdbcType=BIGINT},
+        gmt_modified = #{gmtModified,jdbcType=BIGINT},
       </if>
       <if test="likeCount != null">
-        LIKE_COUNT = #{likeCount,jdbcType=BIGINT},
+        like_count = #{likeCount,jdbcType=BIGINT},
       </if>
       <if test="content != null">
-        CONTENT = #{content,jdbcType=VARCHAR},
+        content = #{content,jdbcType=VARCHAR},
       </if>
       <if test="commentCount != null">
-        COMMENT_COUNT = #{commentCount,jdbcType=INTEGER},
+        comment_count = #{commentCount,jdbcType=INTEGER},
       </if>
     </set>
-    where ID = #{id,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
   </update>
   <update id="updateByPrimaryKey" parameterType="life.majiang.community.model.Comment">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update COMMENT
-    set PARENT_ID = #{parentId,jdbcType=BIGINT},
-      TYPE = #{type,jdbcType=INTEGER},
-      COMMENTATOR = #{commentator,jdbcType=BIGINT},
-      GMT_CREATE = #{gmtCreate,jdbcType=BIGINT},
-      GMT_MODIFIED = #{gmtModified,jdbcType=BIGINT},
-      LIKE_COUNT = #{likeCount,jdbcType=BIGINT},
-      CONTENT = #{content,jdbcType=VARCHAR},
-      COMMENT_COUNT = #{commentCount,jdbcType=INTEGER}
-    where ID = #{id,jdbcType=BIGINT}
+    update comment
+    set parent_id = #{parentId,jdbcType=BIGINT},
+      type = #{type,jdbcType=INTEGER},
+      commentator = #{commentator,jdbcType=BIGINT},
+      gmt_create = #{gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{gmtModified,jdbcType=BIGINT},
+      like_count = #{likeCount,jdbcType=BIGINT},
+      content = #{content,jdbcType=VARCHAR},
+      comment_count = #{commentCount,jdbcType=INTEGER}
+    where id = #{id,jdbcType=BIGINT}
   </update>
   <select id="selectByExampleWithRowbounds" parameterType="life.majiang.community.model.CommentExample" resultMap="BaseResultMap">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
       distinct
     </if>
     <include refid="Base_Column_List" />
-    from COMMENT
+    from comment
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
diff --git a/src/main/resources/mapper/NavMapper.xml b/src/main/resources/mapper/NavMapper.xml
new file mode 100644
index 0000000..207a6eb
--- /dev/null
+++ b/src/main/resources/mapper/NavMapper.xml
@@ -0,0 +1,337 @@
+<?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="life.majiang.community.mapper.NavMapper">
+  <resultMap id="BaseResultMap" type="life.majiang.community.model.Nav">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="url" jdbcType="VARCHAR" property="url" />
+    <result column="priority" jdbcType="INTEGER" property="priority" />
+    <result column="gmt_create" jdbcType="BIGINT" property="gmtCreate" />
+    <result column="gmt_modified" jdbcType="BIGINT" property="gmtModified" />
+    <result column="status" jdbcType="INTEGER" property="status" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    id, title, url, priority, gmt_create, gmt_modified, status
+  </sql>
+  <select id="selectByExample" parameterType="life.majiang.community.model.NavExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from nav
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from nav
+    where id = #{id,jdbcType=INTEGER}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    delete from nav
+    where id = #{id,jdbcType=INTEGER}
+  </delete>
+  <delete id="deleteByExample" parameterType="life.majiang.community.model.NavExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    delete from nav
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="life.majiang.community.model.Nav">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    insert into nav (id, title, url, 
+      priority, gmt_create, gmt_modified, 
+      status)
+    values (#{id,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR}, #{url,jdbcType=VARCHAR}, 
+      #{priority,jdbcType=INTEGER}, #{gmtCreate,jdbcType=BIGINT}, #{gmtModified,jdbcType=BIGINT}, 
+      #{status,jdbcType=INTEGER})
+  </insert>
+  <insert id="insertSelective" parameterType="life.majiang.community.model.Nav">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    insert into nav
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="title != null">
+        title,
+      </if>
+      <if test="url != null">
+        url,
+      </if>
+      <if test="priority != null">
+        priority,
+      </if>
+      <if test="gmtCreate != null">
+        gmt_create,
+      </if>
+      <if test="gmtModified != null">
+        gmt_modified,
+      </if>
+      <if test="status != null">
+        status,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=INTEGER},
+      </if>
+      <if test="title != null">
+        #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="priority != null">
+        #{priority,jdbcType=INTEGER},
+      </if>
+      <if test="gmtCreate != null">
+        #{gmtCreate,jdbcType=BIGINT},
+      </if>
+      <if test="gmtModified != null">
+        #{gmtModified,jdbcType=BIGINT},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="life.majiang.community.model.NavExample" resultType="java.lang.Long">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    select count(*) from nav
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    update nav
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=INTEGER},
+      </if>
+      <if test="record.title != null">
+        title = #{record.title,jdbcType=VARCHAR},
+      </if>
+      <if test="record.url != null">
+        url = #{record.url,jdbcType=VARCHAR},
+      </if>
+      <if test="record.priority != null">
+        priority = #{record.priority,jdbcType=INTEGER},
+      </if>
+      <if test="record.gmtCreate != null">
+        gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
+      </if>
+      <if test="record.gmtModified != null">
+        gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
+      </if>
+      <if test="record.status != null">
+        status = #{record.status,jdbcType=INTEGER},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    update nav
+    set id = #{record.id,jdbcType=INTEGER},
+      title = #{record.title,jdbcType=VARCHAR},
+      url = #{record.url,jdbcType=VARCHAR},
+      priority = #{record.priority,jdbcType=INTEGER},
+      gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
+      status = #{record.status,jdbcType=INTEGER}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="life.majiang.community.model.Nav">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    update nav
+    <set>
+      <if test="title != null">
+        title = #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        url = #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="priority != null">
+        priority = #{priority,jdbcType=INTEGER},
+      </if>
+      <if test="gmtCreate != null">
+        gmt_create = #{gmtCreate,jdbcType=BIGINT},
+      </if>
+      <if test="gmtModified != null">
+        gmt_modified = #{gmtModified,jdbcType=BIGINT},
+      </if>
+      <if test="status != null">
+        status = #{status,jdbcType=INTEGER},
+      </if>
+    </set>
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="life.majiang.community.model.Nav">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    update nav
+    set title = #{title,jdbcType=VARCHAR},
+      url = #{url,jdbcType=VARCHAR},
+      priority = #{priority,jdbcType=INTEGER},
+      gmt_create = #{gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{gmtModified,jdbcType=BIGINT},
+      status = #{status,jdbcType=INTEGER}
+    where id = #{id,jdbcType=INTEGER}
+  </update>
+  <select id="selectByExampleWithRowbounds" parameterType="life.majiang.community.model.NavExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from nav
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/NotificationMapper.xml b/src/main/resources/mapper/NotificationMapper.xml
index a033b07..13685ac 100644
--- a/src/main/resources/mapper/NotificationMapper.xml
+++ b/src/main/resources/mapper/NotificationMapper.xml
@@ -5,23 +5,23 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    <id column="ID" jdbcType="BIGINT" property="id" />
-    <result column="NOTIFIER" jdbcType="BIGINT" property="notifier" />
-    <result column="RECEIVER" jdbcType="BIGINT" property="receiver" />
-    <result column="OUTERID" jdbcType="BIGINT" property="outerid" />
-    <result column="TYPE" jdbcType="INTEGER" property="type" />
-    <result column="GMT_CREATE" jdbcType="BIGINT" property="gmtCreate" />
-    <result column="STATUS" jdbcType="INTEGER" property="status" />
-    <result column="NOTIFIER_NAME" jdbcType="VARCHAR" property="notifierName" />
-    <result column="OUTER_TITLE" jdbcType="VARCHAR" property="outerTitle" />
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="notifier" jdbcType="BIGINT" property="notifier" />
+    <result column="receiver" jdbcType="BIGINT" property="receiver" />
+    <result column="outerid" jdbcType="BIGINT" property="outerid" />
+    <result column="type" jdbcType="INTEGER" property="type" />
+    <result column="gmt_create" jdbcType="BIGINT" property="gmtCreate" />
+    <result column="status" jdbcType="INTEGER" property="status" />
+    <result column="notifier_name" jdbcType="VARCHAR" property="notifierName" />
+    <result column="outer_title" jdbcType="VARCHAR" property="outerTitle" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     <where>
       <foreach collection="oredCriteria" item="criteria" separator="or">
@@ -55,7 +55,7 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     <where>
       <foreach collection="example.oredCriteria" item="criteria" separator="or">
@@ -89,22 +89,22 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    ID, NOTIFIER, RECEIVER, OUTERID, TYPE, GMT_CREATE, STATUS, NOTIFIER_NAME, OUTER_TITLE
+    id, notifier, receiver, outerid, type, gmt_create, status, notifier_name, outer_title
   </sql>
   <select id="selectByExample" parameterType="life.majiang.community.model.NotificationExample" resultMap="BaseResultMap">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
       distinct
     </if>
     <include refid="Base_Column_List" />
-    from NOTIFICATION
+    from notification
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -116,29 +116,29 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select 
     <include refid="Base_Column_List" />
-    from NOTIFICATION
-    where ID = #{id,jdbcType=BIGINT}
+    from notification
+    where id = #{id,jdbcType=BIGINT}
   </select>
   <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    delete from NOTIFICATION
-    where ID = #{id,jdbcType=BIGINT}
+    delete from notification
+    where id = #{id,jdbcType=BIGINT}
   </delete>
   <delete id="deleteByExample" parameterType="life.majiang.community.model.NotificationExample">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    delete from NOTIFICATION
+    delete from notification
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -147,11 +147,11 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    insert into NOTIFICATION (ID, NOTIFIER, RECEIVER, 
-      OUTERID, TYPE, GMT_CREATE, 
-      STATUS, NOTIFIER_NAME, OUTER_TITLE
+    insert into notification (id, notifier, receiver, 
+      outerid, type, gmt_create, 
+      status, notifier_name, outer_title
       )
     values (#{id,jdbcType=BIGINT}, #{notifier,jdbcType=BIGINT}, #{receiver,jdbcType=BIGINT}, 
       #{outerid,jdbcType=BIGINT}, #{type,jdbcType=INTEGER}, #{gmtCreate,jdbcType=BIGINT}, 
@@ -162,36 +162,36 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    insert into NOTIFICATION
+    insert into notification
     <trim prefix="(" suffix=")" suffixOverrides=",">
       <if test="id != null">
-        ID,
+        id,
       </if>
       <if test="notifier != null">
-        NOTIFIER,
+        notifier,
       </if>
       <if test="receiver != null">
-        RECEIVER,
+        receiver,
       </if>
       <if test="outerid != null">
-        OUTERID,
+        outerid,
       </if>
       <if test="type != null">
-        TYPE,
+        type,
       </if>
       <if test="gmtCreate != null">
-        GMT_CREATE,
+        gmt_create,
       </if>
       <if test="status != null">
-        STATUS,
+        status,
       </if>
       <if test="notifierName != null">
-        NOTIFIER_NAME,
+        notifier_name,
       </if>
       <if test="outerTitle != null">
-        OUTER_TITLE,
+        outer_title,
       </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -228,9 +228,9 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    select count(*) from NOTIFICATION
+    select count(*) from notification
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -239,36 +239,36 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update NOTIFICATION
+    update notification
     <set>
       <if test="record.id != null">
-        ID = #{record.id,jdbcType=BIGINT},
+        id = #{record.id,jdbcType=BIGINT},
       </if>
       <if test="record.notifier != null">
-        NOTIFIER = #{record.notifier,jdbcType=BIGINT},
+        notifier = #{record.notifier,jdbcType=BIGINT},
       </if>
       <if test="record.receiver != null">
-        RECEIVER = #{record.receiver,jdbcType=BIGINT},
+        receiver = #{record.receiver,jdbcType=BIGINT},
       </if>
       <if test="record.outerid != null">
-        OUTERID = #{record.outerid,jdbcType=BIGINT},
+        outerid = #{record.outerid,jdbcType=BIGINT},
       </if>
       <if test="record.type != null">
-        TYPE = #{record.type,jdbcType=INTEGER},
+        type = #{record.type,jdbcType=INTEGER},
       </if>
       <if test="record.gmtCreate != null">
-        GMT_CREATE = #{record.gmtCreate,jdbcType=BIGINT},
+        gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
       </if>
       <if test="record.status != null">
-        STATUS = #{record.status,jdbcType=INTEGER},
+        status = #{record.status,jdbcType=INTEGER},
       </if>
       <if test="record.notifierName != null">
-        NOTIFIER_NAME = #{record.notifierName,jdbcType=VARCHAR},
+        notifier_name = #{record.notifierName,jdbcType=VARCHAR},
       </if>
       <if test="record.outerTitle != null">
-        OUTER_TITLE = #{record.outerTitle,jdbcType=VARCHAR},
+        outer_title = #{record.outerTitle,jdbcType=VARCHAR},
       </if>
     </set>
     <if test="_parameter != null">
@@ -279,18 +279,18 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update NOTIFICATION
-    set ID = #{record.id,jdbcType=BIGINT},
-      NOTIFIER = #{record.notifier,jdbcType=BIGINT},
-      RECEIVER = #{record.receiver,jdbcType=BIGINT},
-      OUTERID = #{record.outerid,jdbcType=BIGINT},
-      TYPE = #{record.type,jdbcType=INTEGER},
-      GMT_CREATE = #{record.gmtCreate,jdbcType=BIGINT},
-      STATUS = #{record.status,jdbcType=INTEGER},
-      NOTIFIER_NAME = #{record.notifierName,jdbcType=VARCHAR},
-      OUTER_TITLE = #{record.outerTitle,jdbcType=VARCHAR}
+    update notification
+    set id = #{record.id,jdbcType=BIGINT},
+      notifier = #{record.notifier,jdbcType=BIGINT},
+      receiver = #{record.receiver,jdbcType=BIGINT},
+      outerid = #{record.outerid,jdbcType=BIGINT},
+      type = #{record.type,jdbcType=INTEGER},
+      gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
+      status = #{record.status,jdbcType=INTEGER},
+      notifier_name = #{record.notifierName,jdbcType=VARCHAR},
+      outer_title = #{record.outerTitle,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -299,66 +299,66 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update NOTIFICATION
+    update notification
     <set>
       <if test="notifier != null">
-        NOTIFIER = #{notifier,jdbcType=BIGINT},
+        notifier = #{notifier,jdbcType=BIGINT},
       </if>
       <if test="receiver != null">
-        RECEIVER = #{receiver,jdbcType=BIGINT},
+        receiver = #{receiver,jdbcType=BIGINT},
       </if>
       <if test="outerid != null">
-        OUTERID = #{outerid,jdbcType=BIGINT},
+        outerid = #{outerid,jdbcType=BIGINT},
       </if>
       <if test="type != null">
-        TYPE = #{type,jdbcType=INTEGER},
+        type = #{type,jdbcType=INTEGER},
       </if>
       <if test="gmtCreate != null">
-        GMT_CREATE = #{gmtCreate,jdbcType=BIGINT},
+        gmt_create = #{gmtCreate,jdbcType=BIGINT},
       </if>
       <if test="status != null">
-        STATUS = #{status,jdbcType=INTEGER},
+        status = #{status,jdbcType=INTEGER},
       </if>
       <if test="notifierName != null">
-        NOTIFIER_NAME = #{notifierName,jdbcType=VARCHAR},
+        notifier_name = #{notifierName,jdbcType=VARCHAR},
       </if>
       <if test="outerTitle != null">
-        OUTER_TITLE = #{outerTitle,jdbcType=VARCHAR},
+        outer_title = #{outerTitle,jdbcType=VARCHAR},
       </if>
     </set>
-    where ID = #{id,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
   </update>
   <update id="updateByPrimaryKey" parameterType="life.majiang.community.model.Notification">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update NOTIFICATION
-    set NOTIFIER = #{notifier,jdbcType=BIGINT},
-      RECEIVER = #{receiver,jdbcType=BIGINT},
-      OUTERID = #{outerid,jdbcType=BIGINT},
-      TYPE = #{type,jdbcType=INTEGER},
-      GMT_CREATE = #{gmtCreate,jdbcType=BIGINT},
-      STATUS = #{status,jdbcType=INTEGER},
-      NOTIFIER_NAME = #{notifierName,jdbcType=VARCHAR},
-      OUTER_TITLE = #{outerTitle,jdbcType=VARCHAR}
-    where ID = #{id,jdbcType=BIGINT}
+    update notification
+    set notifier = #{notifier,jdbcType=BIGINT},
+      receiver = #{receiver,jdbcType=BIGINT},
+      outerid = #{outerid,jdbcType=BIGINT},
+      type = #{type,jdbcType=INTEGER},
+      gmt_create = #{gmtCreate,jdbcType=BIGINT},
+      status = #{status,jdbcType=INTEGER},
+      notifier_name = #{notifierName,jdbcType=VARCHAR},
+      outer_title = #{outerTitle,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=BIGINT}
   </update>
   <select id="selectByExampleWithRowbounds" parameterType="life.majiang.community.model.NotificationExample" resultMap="BaseResultMap">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
       distinct
     </if>
     <include refid="Base_Column_List" />
-    from NOTIFICATION
+    from notification
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
diff --git a/src/main/resources/mapper/QuestionExtMapper.xml b/src/main/resources/mapper/QuestionExtMapper.xml
index fa789a8..cb36765 100644
--- a/src/main/resources/mapper/QuestionExtMapper.xml
+++ b/src/main/resources/mapper/QuestionExtMapper.xml
@@ -2,53 +2,103 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="life.majiang.community.mapper.QuestionExtMapper">
     <resultMap id="BaseResultMap" type="life.majiang.community.model.Question">
-        <id column="ID" jdbcType="INTEGER" property="id"/>
-        <result column="TITLE" jdbcType="VARCHAR" property="title"/>
-        <result column="GMT_CREATE" jdbcType="BIGINT" property="gmtCreate"/>
-        <result column="GMT_MODIFIED" jdbcType="BIGINT" property="gmtModified"/>
-        <result column="CREATOR" jdbcType="INTEGER" property="creator"/>
-        <result column="COMMENT_COUNT" jdbcType="INTEGER" property="commentCount"/>
-        <result column="VIEW_COUNT" jdbcType="INTEGER" property="viewCount"/>
-        <result column="LIKE_COUNT" jdbcType="INTEGER" property="likeCount"/>
-        <result column="TAG" jdbcType="VARCHAR" property="tag"/>
+        <id column="id" jdbcType="INTEGER" property="id"/>
+        <result column="title" jdbcType="VARCHAR" property="title"/>
+        <result column="gmt_create" jdbcType="BIGINT" property="gmtCreate"/>
+        <result column="gmt_modified" jdbcType="BIGINT" property="gmtModified"/>
+        <result column="creator" jdbcType="INTEGER" property="creator"/>
+        <result column="comment_count" jdbcType="INTEGER" property="commentCount"/>
+        <result column="view_count" jdbcType="INTEGER" property="viewCount"/>
+        <result column="like_count" jdbcType="INTEGER" property="likeCount"/>
+        <result column="tag" jdbcType="VARCHAR" property="tag"/>
+        <result column="sticky" jdbcType="INTEGER" property="sticky" />
     </resultMap>
 
     <update id="incView" parameterType="life.majiang.community.model.Question">
-    update QUESTION
+    update question
     set
-    VIEW_COUNT = VIEW_COUNT + #{viewCount,jdbcType=INTEGER}
+    view_count = view_count + #{viewCount,jdbcType=INTEGER}
     where id = #{id}
     </update>
 
     <update id="incCommentCount" parameterType="life.majiang.community.model.Question">
-    update QUESTION
+    update question
     set
-    COMMENT_COUNT = COMMENT_COUNT + #{commentCount,jdbcType=INTEGER}
+    comment_count = comment_count + #{commentCount,jdbcType=INTEGER}
     where id = #{id}
     </update>
 
     <select id="selectRelated" parameterType="life.majiang.community.model.Question" resultMap="BaseResultMap">
-        select * from QUESTION where id != #{id} and tag regexp #{tag}
+        select * from question
+        <where>
+            <if test="id != null">
+                and id != #{id}
+            </if>
+            <if test="tag != null and tag != ''">
+                and tag regexp #{tag}
+            </if>
+        </where>
+        order by gmt_create desc limit 20
     </select>
 
     <select id="countBySearch" parameterType="life.majiang.community.dto.QuestionQueryDTO"
             resultType="java.lang.Integer">
-        select count(*) from QUESTION
+        select count(*) from question
         <where>
             <if test="search != null and search != ''">
                 and title regexp #{search}
             </if>
+            <if test="tag != null and tag != ''">
+                and tag regexp #{tag}
+            </if>
+            <if test="sort != null and sort != '' and sort == 'no'">
+                and comment_count = 0
+            </if>
+            <if test="time != null and time != ''">
+                and gmt_create > #{time}
+            </if>
+            <if test="1 == 1">
+                and sticky = 0
+            </if>
         </where>
     </select>
 
+    <select id="selectSticky" parameterType="life.majiang.community.dto.QuestionQueryDTO"
+            resultMap="BaseResultMap">
+        select * from question where sticky > 0 order by sticky desc, gmt_create desc
+    </select>
     <select id="selectBySearch" parameterType="life.majiang.community.dto.QuestionQueryDTO"
             resultMap="BaseResultMap">
-        select * from QUESTION
+        select * from question
         <where>
             <if test="search != null and search != ''">
                 and title regexp #{search}
             </if>
+            <if test="tag != null and tag != ''">
+                and tag regexp #{tag}
+            </if>
+            <if test="sort != null and sort != '' and sort == 'no'">
+                and comment_count = 0
+            </if>
+            <if test="time != null and time != ''">
+                and gmt_create > #{time}
+            </if>
+            <if test="1 == 1">
+                and sticky = 0
+            </if>
         </where>
-        order by gmt_create desc limit #{page},#{size}
+        <if test="sort == null or sort == ''">
+            order by gmt_create desc
+        </if>
+        <if test="sort != null and sort != '' and sort == 'new'">
+            order by gmt_create desc
+        </if>
+        <if test="sort != null and sort != '' and sort == 'no'">
+            order by gmt_create desc
+        </if>
+        <if test="sort != null and sort != '' and (sort == 'hot' || sort == 'hot7' || sort == 'hot30')">
+            order by comment_count desc
+        </if>
+        limit #{page},#{size}
     </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/QuestionMapper.xml b/src/main/resources/mapper/QuestionMapper.xml
index fcec8ac..6b0c77c 100644
--- a/src/main/resources/mapper/QuestionMapper.xml
+++ b/src/main/resources/mapper/QuestionMapper.xml
@@ -5,31 +5,32 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    <id column="ID" jdbcType="BIGINT" property="id" />
-    <result column="TITLE" jdbcType="VARCHAR" property="title" />
-    <result column="GMT_CREATE" jdbcType="BIGINT" property="gmtCreate" />
-    <result column="GMT_MODIFIED" jdbcType="BIGINT" property="gmtModified" />
-    <result column="CREATOR" jdbcType="BIGINT" property="creator" />
-    <result column="COMMENT_COUNT" jdbcType="INTEGER" property="commentCount" />
-    <result column="VIEW_COUNT" jdbcType="INTEGER" property="viewCount" />
-    <result column="LIKE_COUNT" jdbcType="INTEGER" property="likeCount" />
-    <result column="TAG" jdbcType="VARCHAR" property="tag" />
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="gmt_create" jdbcType="BIGINT" property="gmtCreate" />
+    <result column="gmt_modified" jdbcType="BIGINT" property="gmtModified" />
+    <result column="creator" jdbcType="BIGINT" property="creator" />
+    <result column="comment_count" jdbcType="INTEGER" property="commentCount" />
+    <result column="view_count" jdbcType="INTEGER" property="viewCount" />
+    <result column="like_count" jdbcType="INTEGER" property="likeCount" />
+    <result column="tag" jdbcType="VARCHAR" property="tag" />
+    <result column="sticky" jdbcType="INTEGER" property="sticky" />
   </resultMap>
   <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="life.majiang.community.model.Question">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    <result column="DESCRIPTION" jdbcType="CLOB" property="description" />
+    <result column="description" jdbcType="LONGVARCHAR" property="description" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     <where>
       <foreach collection="oredCriteria" item="criteria" separator="or">
@@ -63,7 +64,7 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     <where>
       <foreach collection="example.oredCriteria" item="criteria" separator="or">
@@ -97,24 +98,24 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    ID, TITLE, GMT_CREATE, GMT_MODIFIED, CREATOR, COMMENT_COUNT, VIEW_COUNT, LIKE_COUNT, 
-    TAG
+    id, title, gmt_create, gmt_modified, creator, comment_count, view_count, like_count, 
+    tag, sticky
   </sql>
   <sql id="Blob_Column_List">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    DESCRIPTION
+    description
   </sql>
   <select id="selectByExampleWithBLOBs" parameterType="life.majiang.community.model.QuestionExample" resultMap="ResultMapWithBLOBs">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
@@ -123,7 +124,7 @@
     <include refid="Base_Column_List" />
     ,
     <include refid="Blob_Column_List" />
-    from QUESTION
+    from question
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -135,14 +136,14 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
       distinct
     </if>
     <include refid="Base_Column_List" />
-    from QUESTION
+    from question
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -154,31 +155,31 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select 
     <include refid="Base_Column_List" />
     ,
     <include refid="Blob_Column_List" />
-    from QUESTION
-    where ID = #{id,jdbcType=BIGINT}
+    from question
+    where id = #{id,jdbcType=BIGINT}
   </select>
   <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    delete from QUESTION
-    where ID = #{id,jdbcType=BIGINT}
+    delete from question
+    where id = #{id,jdbcType=BIGINT}
   </delete>
   <delete id="deleteByExample" parameterType="life.majiang.community.model.QuestionExample">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    delete from QUESTION
+    delete from question
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -187,54 +188,57 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    insert into QUESTION (ID, TITLE, GMT_CREATE, 
-      GMT_MODIFIED, CREATOR, COMMENT_COUNT, 
-      VIEW_COUNT, LIKE_COUNT, TAG, 
-      DESCRIPTION)
+    insert into question (id, title, gmt_create, 
+      gmt_modified, creator, comment_count, 
+      view_count, like_count, tag, 
+      sticky, description)
     values (#{id,jdbcType=BIGINT}, #{title,jdbcType=VARCHAR}, #{gmtCreate,jdbcType=BIGINT}, 
       #{gmtModified,jdbcType=BIGINT}, #{creator,jdbcType=BIGINT}, #{commentCount,jdbcType=INTEGER}, 
       #{viewCount,jdbcType=INTEGER}, #{likeCount,jdbcType=INTEGER}, #{tag,jdbcType=VARCHAR}, 
-      #{description,jdbcType=CLOB})
+      #{sticky,jdbcType=INTEGER}, #{description,jdbcType=LONGVARCHAR})
   </insert>
   <insert id="insertSelective" parameterType="life.majiang.community.model.Question">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    insert into QUESTION
+    insert into question
     <trim prefix="(" suffix=")" suffixOverrides=",">
       <if test="id != null">
-        ID,
+        id,
       </if>
       <if test="title != null">
-        TITLE,
+        title,
       </if>
       <if test="gmtCreate != null">
-        GMT_CREATE,
+        gmt_create,
       </if>
       <if test="gmtModified != null">
-        GMT_MODIFIED,
+        gmt_modified,
       </if>
       <if test="creator != null">
-        CREATOR,
+        creator,
       </if>
       <if test="commentCount != null">
-        COMMENT_COUNT,
+        comment_count,
       </if>
       <if test="viewCount != null">
-        VIEW_COUNT,
+        view_count,
       </if>
       <if test="likeCount != null">
-        LIKE_COUNT,
+        like_count,
       </if>
       <if test="tag != null">
-        TAG,
+        tag,
+      </if>
+      <if test="sticky != null">
+        sticky,
       </if>
       <if test="description != null">
-        DESCRIPTION,
+        description,
       </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -265,8 +269,11 @@
       <if test="tag != null">
         #{tag,jdbcType=VARCHAR},
       </if>
+      <if test="sticky != null">
+        #{sticky,jdbcType=INTEGER},
+      </if>
       <if test="description != null">
-        #{description,jdbcType=CLOB},
+        #{description,jdbcType=LONGVARCHAR},
       </if>
     </trim>
   </insert>
@@ -274,9 +281,9 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    select count(*) from QUESTION
+    select count(*) from question
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -285,39 +292,42 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update QUESTION
+    update question
     <set>
       <if test="record.id != null">
-        ID = #{record.id,jdbcType=BIGINT},
+        id = #{record.id,jdbcType=BIGINT},
       </if>
       <if test="record.title != null">
-        TITLE = #{record.title,jdbcType=VARCHAR},
+        title = #{record.title,jdbcType=VARCHAR},
       </if>
       <if test="record.gmtCreate != null">
-        GMT_CREATE = #{record.gmtCreate,jdbcType=BIGINT},
+        gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
       </if>
       <if test="record.gmtModified != null">
-        GMT_MODIFIED = #{record.gmtModified,jdbcType=BIGINT},
+        gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
       </if>
       <if test="record.creator != null">
-        CREATOR = #{record.creator,jdbcType=BIGINT},
+        creator = #{record.creator,jdbcType=BIGINT},
       </if>
       <if test="record.commentCount != null">
-        COMMENT_COUNT = #{record.commentCount,jdbcType=INTEGER},
+        comment_count = #{record.commentCount,jdbcType=INTEGER},
       </if>
       <if test="record.viewCount != null">
-        VIEW_COUNT = #{record.viewCount,jdbcType=INTEGER},
+        view_count = #{record.viewCount,jdbcType=INTEGER},
       </if>
       <if test="record.likeCount != null">
-        LIKE_COUNT = #{record.likeCount,jdbcType=INTEGER},
+        like_count = #{record.likeCount,jdbcType=INTEGER},
       </if>
       <if test="record.tag != null">
-        TAG = #{record.tag,jdbcType=VARCHAR},
+        tag = #{record.tag,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sticky != null">
+        sticky = #{record.sticky,jdbcType=INTEGER},
       </if>
       <if test="record.description != null">
-        DESCRIPTION = #{record.description,jdbcType=CLOB},
+        description = #{record.description,jdbcType=LONGVARCHAR},
       </if>
     </set>
     <if test="_parameter != null">
@@ -328,19 +338,20 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update QUESTION
-    set ID = #{record.id,jdbcType=BIGINT},
-      TITLE = #{record.title,jdbcType=VARCHAR},
-      GMT_CREATE = #{record.gmtCreate,jdbcType=BIGINT},
-      GMT_MODIFIED = #{record.gmtModified,jdbcType=BIGINT},
-      CREATOR = #{record.creator,jdbcType=BIGINT},
-      COMMENT_COUNT = #{record.commentCount,jdbcType=INTEGER},
-      VIEW_COUNT = #{record.viewCount,jdbcType=INTEGER},
-      LIKE_COUNT = #{record.likeCount,jdbcType=INTEGER},
-      TAG = #{record.tag,jdbcType=VARCHAR},
-      DESCRIPTION = #{record.description,jdbcType=CLOB}
+    update question
+    set id = #{record.id,jdbcType=BIGINT},
+      title = #{record.title,jdbcType=VARCHAR},
+      gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
+      creator = #{record.creator,jdbcType=BIGINT},
+      comment_count = #{record.commentCount,jdbcType=INTEGER},
+      view_count = #{record.viewCount,jdbcType=INTEGER},
+      like_count = #{record.likeCount,jdbcType=INTEGER},
+      tag = #{record.tag,jdbcType=VARCHAR},
+      sticky = #{record.sticky,jdbcType=INTEGER},
+      description = #{record.description,jdbcType=LONGVARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -349,18 +360,19 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update QUESTION
-    set ID = #{record.id,jdbcType=BIGINT},
-      TITLE = #{record.title,jdbcType=VARCHAR},
-      GMT_CREATE = #{record.gmtCreate,jdbcType=BIGINT},
-      GMT_MODIFIED = #{record.gmtModified,jdbcType=BIGINT},
-      CREATOR = #{record.creator,jdbcType=BIGINT},
-      COMMENT_COUNT = #{record.commentCount,jdbcType=INTEGER},
-      VIEW_COUNT = #{record.viewCount,jdbcType=INTEGER},
-      LIKE_COUNT = #{record.likeCount,jdbcType=INTEGER},
-      TAG = #{record.tag,jdbcType=VARCHAR}
+    update question
+    set id = #{record.id,jdbcType=BIGINT},
+      title = #{record.title,jdbcType=VARCHAR},
+      gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
+      creator = #{record.creator,jdbcType=BIGINT},
+      comment_count = #{record.commentCount,jdbcType=INTEGER},
+      view_count = #{record.viewCount,jdbcType=INTEGER},
+      like_count = #{record.likeCount,jdbcType=INTEGER},
+      tag = #{record.tag,jdbcType=VARCHAR},
+      sticky = #{record.sticky,jdbcType=INTEGER}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -369,80 +381,85 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update QUESTION
+    update question
     <set>
       <if test="title != null">
-        TITLE = #{title,jdbcType=VARCHAR},
+        title = #{title,jdbcType=VARCHAR},
       </if>
       <if test="gmtCreate != null">
-        GMT_CREATE = #{gmtCreate,jdbcType=BIGINT},
+        gmt_create = #{gmtCreate,jdbcType=BIGINT},
       </if>
       <if test="gmtModified != null">
-        GMT_MODIFIED = #{gmtModified,jdbcType=BIGINT},
+        gmt_modified = #{gmtModified,jdbcType=BIGINT},
       </if>
       <if test="creator != null">
-        CREATOR = #{creator,jdbcType=BIGINT},
+        creator = #{creator,jdbcType=BIGINT},
       </if>
       <if test="commentCount != null">
-        COMMENT_COUNT = #{commentCount,jdbcType=INTEGER},
+        comment_count = #{commentCount,jdbcType=INTEGER},
       </if>
       <if test="viewCount != null">
-        VIEW_COUNT = #{viewCount,jdbcType=INTEGER},
+        view_count = #{viewCount,jdbcType=INTEGER},
       </if>
       <if test="likeCount != null">
-        LIKE_COUNT = #{likeCount,jdbcType=INTEGER},
+        like_count = #{likeCount,jdbcType=INTEGER},
       </if>
       <if test="tag != null">
-        TAG = #{tag,jdbcType=VARCHAR},
+        tag = #{tag,jdbcType=VARCHAR},
+      </if>
+      <if test="sticky != null">
+        sticky = #{sticky,jdbcType=INTEGER},
       </if>
       <if test="description != null">
-        DESCRIPTION = #{description,jdbcType=CLOB},
+        description = #{description,jdbcType=LONGVARCHAR},
       </if>
     </set>
-    where ID = #{id,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
   </update>
   <update id="updateByPrimaryKeyWithBLOBs" parameterType="life.majiang.community.model.Question">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update QUESTION
-    set TITLE = #{title,jdbcType=VARCHAR},
-      GMT_CREATE = #{gmtCreate,jdbcType=BIGINT},
-      GMT_MODIFIED = #{gmtModified,jdbcType=BIGINT},
-      CREATOR = #{creator,jdbcType=BIGINT},
-      COMMENT_COUNT = #{commentCount,jdbcType=INTEGER},
-      VIEW_COUNT = #{viewCount,jdbcType=INTEGER},
-      LIKE_COUNT = #{likeCount,jdbcType=INTEGER},
-      TAG = #{tag,jdbcType=VARCHAR},
-      DESCRIPTION = #{description,jdbcType=CLOB}
-    where ID = #{id,jdbcType=BIGINT}
+    update question
+    set title = #{title,jdbcType=VARCHAR},
+      gmt_create = #{gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{gmtModified,jdbcType=BIGINT},
+      creator = #{creator,jdbcType=BIGINT},
+      comment_count = #{commentCount,jdbcType=INTEGER},
+      view_count = #{viewCount,jdbcType=INTEGER},
+      like_count = #{likeCount,jdbcType=INTEGER},
+      tag = #{tag,jdbcType=VARCHAR},
+      sticky = #{sticky,jdbcType=INTEGER},
+      description = #{description,jdbcType=LONGVARCHAR}
+    where id = #{id,jdbcType=BIGINT}
   </update>
   <update id="updateByPrimaryKey" parameterType="life.majiang.community.model.Question">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update QUESTION
-    set TITLE = #{title,jdbcType=VARCHAR},
-      GMT_CREATE = #{gmtCreate,jdbcType=BIGINT},
-      GMT_MODIFIED = #{gmtModified,jdbcType=BIGINT},
-      CREATOR = #{creator,jdbcType=BIGINT},
-      COMMENT_COUNT = #{commentCount,jdbcType=INTEGER},
-      VIEW_COUNT = #{viewCount,jdbcType=INTEGER},
-      LIKE_COUNT = #{likeCount,jdbcType=INTEGER},
-      TAG = #{tag,jdbcType=VARCHAR}
-    where ID = #{id,jdbcType=BIGINT}
+    update question
+    set title = #{title,jdbcType=VARCHAR},
+      gmt_create = #{gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{gmtModified,jdbcType=BIGINT},
+      creator = #{creator,jdbcType=BIGINT},
+      comment_count = #{commentCount,jdbcType=INTEGER},
+      view_count = #{viewCount,jdbcType=INTEGER},
+      like_count = #{likeCount,jdbcType=INTEGER},
+      tag = #{tag,jdbcType=VARCHAR},
+      sticky = #{sticky,jdbcType=INTEGER}
+    where id = #{id,jdbcType=BIGINT}
   </update>
   <select id="selectByExampleWithBLOBsWithRowbounds" parameterType="life.majiang.community.model.QuestionExample" resultMap="ResultMapWithBLOBs">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
@@ -451,7 +468,7 @@
     <include refid="Base_Column_List" />
     ,
     <include refid="Blob_Column_List" />
-    from QUESTION
+    from question
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -463,14 +480,14 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
       distinct
     </if>
     <include refid="Base_Column_List" />
-    from QUESTION
+    from question
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml
index 1dc50ac..8d99562 100644
--- a/src/main/resources/mapper/UserMapper.xml
+++ b/src/main/resources/mapper/UserMapper.xml
@@ -5,22 +5,24 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    <id column="ID" jdbcType="BIGINT" property="id" />
-    <result column="ACCOUNT_ID" jdbcType="VARCHAR" property="accountId" />
-    <result column="NAME" jdbcType="VARCHAR" property="name" />
-    <result column="TOKEN" jdbcType="VARCHAR" property="token" />
-    <result column="GMT_CREATE" jdbcType="BIGINT" property="gmtCreate" />
-    <result column="GMT_MODIFIED" jdbcType="BIGINT" property="gmtModified" />
-    <result column="BIO" jdbcType="VARCHAR" property="bio" />
-    <result column="AVATAR_URL" jdbcType="VARCHAR" property="avatarUrl" />
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="account_id" jdbcType="VARCHAR" property="accountId" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="token" jdbcType="VARCHAR" property="token" />
+    <result column="gmt_create" jdbcType="BIGINT" property="gmtCreate" />
+    <result column="gmt_modified" jdbcType="BIGINT" property="gmtModified" />
+    <result column="bio" jdbcType="VARCHAR" property="bio" />
+    <result column="avatar_url" jdbcType="VARCHAR" property="avatarUrl" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="disable" jdbcType="INTEGER" property="disable" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     <where>
       <foreach collection="oredCriteria" item="criteria" separator="or">
@@ -54,7 +56,7 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     <where>
       <foreach collection="example.oredCriteria" item="criteria" separator="or">
@@ -88,22 +90,22 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    ID, ACCOUNT_ID, NAME, TOKEN, GMT_CREATE, GMT_MODIFIED, BIO, AVATAR_URL
+    id, account_id, name, token, gmt_create, gmt_modified, bio, avatar_url, type, disable
   </sql>
   <select id="selectByExample" parameterType="life.majiang.community.model.UserExample" resultMap="BaseResultMap">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
       distinct
     </if>
     <include refid="Base_Column_List" />
-    from USER
+    from user
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -115,29 +117,29 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select 
     <include refid="Base_Column_List" />
-    from USER
-    where ID = #{id,jdbcType=BIGINT}
+    from user
+    where id = #{id,jdbcType=BIGINT}
   </select>
   <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    delete from USER
-    where ID = #{id,jdbcType=BIGINT}
+    delete from user
+    where id = #{id,jdbcType=BIGINT}
   </delete>
   <delete id="deleteByExample" parameterType="life.majiang.community.model.UserExample">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    delete from USER
+    delete from user
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -146,46 +148,54 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    insert into USER (ID, ACCOUNT_ID, NAME, 
-      TOKEN, GMT_CREATE, GMT_MODIFIED, 
-      BIO, AVATAR_URL)
+    insert into user (id, account_id, name, 
+      token, gmt_create, gmt_modified, 
+      bio, avatar_url, type, 
+      disable)
     values (#{id,jdbcType=BIGINT}, #{accountId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, 
       #{token,jdbcType=VARCHAR}, #{gmtCreate,jdbcType=BIGINT}, #{gmtModified,jdbcType=BIGINT}, 
-      #{bio,jdbcType=VARCHAR}, #{avatarUrl,jdbcType=VARCHAR})
+      #{bio,jdbcType=VARCHAR}, #{avatarUrl,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, 
+      #{disable,jdbcType=INTEGER})
   </insert>
   <insert id="insertSelective" parameterType="life.majiang.community.model.User">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    insert into USER
+    insert into user
     <trim prefix="(" suffix=")" suffixOverrides=",">
       <if test="id != null">
-        ID,
+        id,
       </if>
       <if test="accountId != null">
-        ACCOUNT_ID,
+        account_id,
       </if>
       <if test="name != null">
-        NAME,
+        name,
       </if>
       <if test="token != null">
-        TOKEN,
+        token,
       </if>
       <if test="gmtCreate != null">
-        GMT_CREATE,
+        gmt_create,
       </if>
       <if test="gmtModified != null">
-        GMT_MODIFIED,
+        gmt_modified,
       </if>
       <if test="bio != null">
-        BIO,
+        bio,
       </if>
       <if test="avatarUrl != null">
-        AVATAR_URL,
+        avatar_url,
+      </if>
+      <if test="type != null">
+        type,
+      </if>
+      <if test="disable != null">
+        disable,
       </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -213,15 +223,21 @@
       <if test="avatarUrl != null">
         #{avatarUrl,jdbcType=VARCHAR},
       </if>
+      <if test="type != null">
+        #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="disable != null">
+        #{disable,jdbcType=INTEGER},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="life.majiang.community.model.UserExample" resultType="java.lang.Long">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    select count(*) from USER
+    select count(*) from user
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
@@ -230,33 +246,39 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update USER
+    update user
     <set>
       <if test="record.id != null">
-        ID = #{record.id,jdbcType=BIGINT},
+        id = #{record.id,jdbcType=BIGINT},
       </if>
       <if test="record.accountId != null">
-        ACCOUNT_ID = #{record.accountId,jdbcType=VARCHAR},
+        account_id = #{record.accountId,jdbcType=VARCHAR},
       </if>
       <if test="record.name != null">
-        NAME = #{record.name,jdbcType=VARCHAR},
+        name = #{record.name,jdbcType=VARCHAR},
       </if>
       <if test="record.token != null">
-        TOKEN = #{record.token,jdbcType=VARCHAR},
+        token = #{record.token,jdbcType=VARCHAR},
       </if>
       <if test="record.gmtCreate != null">
-        GMT_CREATE = #{record.gmtCreate,jdbcType=BIGINT},
+        gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
       </if>
       <if test="record.gmtModified != null">
-        GMT_MODIFIED = #{record.gmtModified,jdbcType=BIGINT},
+        gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
       </if>
       <if test="record.bio != null">
-        BIO = #{record.bio,jdbcType=VARCHAR},
+        bio = #{record.bio,jdbcType=VARCHAR},
       </if>
       <if test="record.avatarUrl != null">
-        AVATAR_URL = #{record.avatarUrl,jdbcType=VARCHAR},
+        avatar_url = #{record.avatarUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="record.type != null">
+        type = #{record.type,jdbcType=VARCHAR},
+      </if>
+      <if test="record.disable != null">
+        disable = #{record.disable,jdbcType=INTEGER},
       </if>
     </set>
     <if test="_parameter != null">
@@ -267,17 +289,19 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update USER
-    set ID = #{record.id,jdbcType=BIGINT},
-      ACCOUNT_ID = #{record.accountId,jdbcType=VARCHAR},
-      NAME = #{record.name,jdbcType=VARCHAR},
-      TOKEN = #{record.token,jdbcType=VARCHAR},
-      GMT_CREATE = #{record.gmtCreate,jdbcType=BIGINT},
-      GMT_MODIFIED = #{record.gmtModified,jdbcType=BIGINT},
-      BIO = #{record.bio,jdbcType=VARCHAR},
-      AVATAR_URL = #{record.avatarUrl,jdbcType=VARCHAR}
+    update user
+    set id = #{record.id,jdbcType=BIGINT},
+      account_id = #{record.accountId,jdbcType=VARCHAR},
+      name = #{record.name,jdbcType=VARCHAR},
+      token = #{record.token,jdbcType=VARCHAR},
+      gmt_create = #{record.gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{record.gmtModified,jdbcType=BIGINT},
+      bio = #{record.bio,jdbcType=VARCHAR},
+      avatar_url = #{record.avatarUrl,jdbcType=VARCHAR},
+      type = #{record.type,jdbcType=VARCHAR},
+      disable = #{record.disable,jdbcType=INTEGER}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -286,62 +310,70 @@
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update USER
+    update user
     <set>
       <if test="accountId != null">
-        ACCOUNT_ID = #{accountId,jdbcType=VARCHAR},
+        account_id = #{accountId,jdbcType=VARCHAR},
       </if>
       <if test="name != null">
-        NAME = #{name,jdbcType=VARCHAR},
+        name = #{name,jdbcType=VARCHAR},
       </if>
       <if test="token != null">
-        TOKEN = #{token,jdbcType=VARCHAR},
+        token = #{token,jdbcType=VARCHAR},
       </if>
       <if test="gmtCreate != null">
-        GMT_CREATE = #{gmtCreate,jdbcType=BIGINT},
+        gmt_create = #{gmtCreate,jdbcType=BIGINT},
       </if>
       <if test="gmtModified != null">
-        GMT_MODIFIED = #{gmtModified,jdbcType=BIGINT},
+        gmt_modified = #{gmtModified,jdbcType=BIGINT},
       </if>
       <if test="bio != null">
-        BIO = #{bio,jdbcType=VARCHAR},
+        bio = #{bio,jdbcType=VARCHAR},
       </if>
       <if test="avatarUrl != null">
-        AVATAR_URL = #{avatarUrl,jdbcType=VARCHAR},
+        avatar_url = #{avatarUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="type != null">
+        type = #{type,jdbcType=VARCHAR},
+      </if>
+      <if test="disable != null">
+        disable = #{disable,jdbcType=INTEGER},
       </if>
     </set>
-    where ID = #{id,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
   </update>
   <update id="updateByPrimaryKey" parameterType="life.majiang.community.model.User">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
-    update USER
-    set ACCOUNT_ID = #{accountId,jdbcType=VARCHAR},
-      NAME = #{name,jdbcType=VARCHAR},
-      TOKEN = #{token,jdbcType=VARCHAR},
-      GMT_CREATE = #{gmtCreate,jdbcType=BIGINT},
-      GMT_MODIFIED = #{gmtModified,jdbcType=BIGINT},
-      BIO = #{bio,jdbcType=VARCHAR},
-      AVATAR_URL = #{avatarUrl,jdbcType=VARCHAR}
-    where ID = #{id,jdbcType=BIGINT}
+    update user
+    set account_id = #{accountId,jdbcType=VARCHAR},
+      name = #{name,jdbcType=VARCHAR},
+      token = #{token,jdbcType=VARCHAR},
+      gmt_create = #{gmtCreate,jdbcType=BIGINT},
+      gmt_modified = #{gmtModified,jdbcType=BIGINT},
+      bio = #{bio,jdbcType=VARCHAR},
+      avatar_url = #{avatarUrl,jdbcType=VARCHAR},
+      type = #{type,jdbcType=VARCHAR},
+      disable = #{disable,jdbcType=INTEGER}
+    where id = #{id,jdbcType=BIGINT}
   </update>
   <select id="selectByExampleWithRowbounds" parameterType="life.majiang.community.model.UserExample" resultMap="BaseResultMap">
     <!--
       WARNING - @mbg.generated
       This element is automatically generated by MyBatis Generator, do not modify.
-      This element was generated on Fri Jun 14 08:00:35 CST 2019.
+      This element was generated on Fri Apr 22 08:17:25 CST 2022.
     -->
     select
     <if test="distinct">
       distinct
     </if>
     <include refid="Base_Column_List" />
-    from USER
+    from user
     <if test="_parameter != null">
       <include refid="Example_Where_Clause" />
     </if>
diff --git a/src/main/resources/static/css/community.css b/src/main/resources/static/css/community.css
index 15bd54b..2af6945 100644
--- a/src/main/resources/static/css/community.css
+++ b/src/main/resources/static/css/community.css
@@ -7,6 +7,34 @@ body {
     margin: 30px;
 }
 
+.side {
+    margin: 5px 0;
+}
+
+.top-header {
+    padding-left: 20px;
+}
+
+.community-tag:hover {
+    background-color: #339dff;
+    color: #fff !important;
+    text-decoration-line: none;
+}
+
+.community-tag {
+    text-decoration-line: none;
+    cursor: pointer;
+    display: inline-block;
+    height: 20px;
+    line-height: 16px;
+    padding: 2px 5px;
+    background-color: #99cfff;
+    font-size: 12px;
+    color: #fff !important;
+    border-radius: 4px;
+    margin: 4px;
+}
+
 .btn-publish {
     float: right;
     margin-bottom: 15px;
@@ -48,7 +76,7 @@ body {
 }
 
 .question-wechat {
-    width: 70%;
+    width: 95%;
 }
 
 .publish-tag-tab {
@@ -133,6 +161,12 @@ body {
 }
 
 .footer {
-    padding: 10px 25%;
+    text-align: center;
+    font-size: 12px;
     color: #666;;
+    padding: 0 0 15px 0;
+}
+
+.red {
+    color: red !important;
 }
\ No newline at end of file
diff --git a/src/main/resources/static/images/gitee.png b/src/main/resources/static/images/gitee.png
new file mode 100644
index 0000000..d606ce6
Binary files /dev/null and b/src/main/resources/static/images/gitee.png differ
diff --git a/src/main/resources/static/images/github.png b/src/main/resources/static/images/github.png
new file mode 100644
index 0000000..e2ed759
Binary files /dev/null and b/src/main/resources/static/images/github.png differ
diff --git a/src/main/resources/static/images/hot.png b/src/main/resources/static/images/hot.png
new file mode 100644
index 0000000..aae1bbd
Binary files /dev/null and b/src/main/resources/static/images/hot.png differ
diff --git a/src/main/resources/static/images/logo.png b/src/main/resources/static/images/logo.png
index 0f4f94b..65928cf 100644
Binary files a/src/main/resources/static/images/logo.png and b/src/main/resources/static/images/logo.png differ
diff --git a/src/main/resources/static/images/official-account.png b/src/main/resources/static/images/official-account.png
new file mode 100644
index 0000000..0f0eaf6
Binary files /dev/null and b/src/main/resources/static/images/official-account.png differ
diff --git a/src/main/resources/static/images/official.jpg b/src/main/resources/static/images/official.jpg
deleted file mode 100644
index cd5cd73..0000000
Binary files a/src/main/resources/static/images/official.jpg and /dev/null differ
diff --git a/src/main/resources/static/images/wechat.png b/src/main/resources/static/images/wechat.png
deleted file mode 100644
index 4f055c9..0000000
Binary files a/src/main/resources/static/images/wechat.png and /dev/null differ
diff --git a/src/main/resources/static/js/community.js b/src/main/resources/static/js/community.js
index ac50a32..93ea125 100644
--- a/src/main/resources/static/js/community.js
+++ b/src/main/resources/static/js/community.js
@@ -33,8 +33,9 @@ function comment2target(targetId, type, content) {
                 if (response.code == 2003) {
                     var isAccepted = confirm(response.message);
                     if (isAccepted) {
-                        window.open("https://github.com/login/oauth/authorize?client_id=2859958f9f059979ed3a&redirect_uri=" + document.location.origin + "/callback&scope=user&state=1");
-                        window.localStorage.setItem("closable", true);
+                        $('#myModal').modal({});
+                        // window.open("https://github.com/login/oauth/authorize?client_id=7f316909bf70d1eaa2b2&redirect_uri=" + document.location.origin + "/callback&scope=user&state=1");
+                        // window.localStorage.setItem("closable", true);
                     }
                 } else {
                     alert(response.message);
@@ -124,11 +125,29 @@ function showSelectTag() {
 function selectTag(e) {
     var value = e.getAttribute("data-tag");
     var previous = $("#tag").val();
-    if (previous.indexOf(value) == -1) {
-        if (previous) {
+
+    if (previous) {
+        var index = 0;
+        var appear = false; //记录value是否已经作为一个独立的标签出现过
+        while (true) {
+            index = previous.indexOf(value, index); //value字符串在previous中出现的位置
+            if (index == -1) break;
+            //判断previous中出现的value是否是另一个标签的一部分
+            //即value的前一个和后一个字符都是逗号","或者没有字符时，才说明value是一个独立的标签
+            if ((index == 0 || previous.charAt(index - 1) == ",")
+                && (index + value.length == previous.length || previous.charAt(index + value.length) == ",")
+               ) {
+                appear = true;
+                break;
+            }
+            index++; //用于搜索下一个出现位置
+        }
+        if (!appear) {
+            //若value没有作为一个独立的标签出现过
             $("#tag").val(previous + ',' + value);
-        } else {
-            $("#tag").val(value);
         }
     }
+    else {
+        $("#tag").val(value);
+    }
 }
\ No newline at end of file
diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html
index 4e28f7e..39bc735 100644
--- a/src/main/resources/templates/error.html
+++ b/src/main/resources/templates/error.html
@@ -1,14 +1,8 @@
 <!DOCTYPE HTML>
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
-    <title>码匠社区</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-    <link rel="stylesheet" href="/css/bootstrap.min.css"/>
-    <link rel="stylesheet" href="/css/bootstrap-theme.min.css">
-    <link rel="stylesheet" href="/css/community.css">
-    <link rel="icon" href="/images/logo.png" type="image/x-icon"/>
-    <script src="/js/jquery-3.4.1.min.js"></script>
-    <script src="/js/bootstrap.min.js" type="application/javascript"></script>
+    <title>码问</title>
+    <head th:insert="~{import :: head}"></head>
 </head>
 <body>
 <div th:insert="~{navigation :: nav}"></div>
diff --git a/src/main/resources/templates/footer.html b/src/main/resources/templates/footer.html
index 0e66fbd..1bad914 100644
--- a/src/main/resources/templates/footer.html
+++ b/src/main/resources/templates/footer.html
@@ -3,7 +3,7 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <body>
 <div th:fragment="foot" class="footer">
-    <div>Copyright © 2019 · 码问社区 · 服务器赞助: <a href="https://passport.ucloud.cn/?invitation_code=nmtbj0lvttvx&ytag=re01B1">UCloud</a> · 网站程序: Spring Boot · ICP备000000号</div>
+    <div>Copyright © 2019  ICP备000000号 · 服务器赞助: <a href="https://www.ucloud.cn/site/active/kuaijie.html?invitation_code=C1x7BCF4128C511">UCloud</a> · All Rights Reserved Powered By <a href="http://www.mawen.co" target="_blank"> 码问 </a></div>
 </div>
 </body>
 </html>
diff --git a/src/main/resources/templates/import.html b/src/main/resources/templates/import.html
new file mode 100644
index 0000000..121274f
--- /dev/null
+++ b/src/main/resources/templates/import.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head th:fragment="head">
+    <link rel="stylesheet" href="/css/bootstrap.min.css"/>
+    <link rel="stylesheet" href="/css/bootstrap-theme.min.css">
+    <link rel="stylesheet" href="/css/community.css">
+    <link rel="icon" href="/images/logo.png" type="image/x-icon"/>
+    <script src="/js/jquery-3.4.1.min.js"></script>
+    <script src="/js/bootstrap.min.js" type="application/javascript"></script>
+    <script src="/js/community.js" type="application/javascript"></script>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <meta name="google-site-verification" content="QGf2OqDw91EjWtNE07HoLJi0x0G2rIYylk6jn6JEoEQ" />
+    <!-- Global site tag (gtag.js) - Google Analytics -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-89103576-8"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+
+
+        gtag('config', 'UA-89103576-8');
+    </script>
+
+</head>
+<head th:fragment="markdown">
+    <link rel="stylesheet" href="/css/editormd.min.css">
+    <link rel="stylesheet" href="/css/editormd.preview.min.css">
+    <script src="/js/editormd.min.js" type="application/javascript"></script>
+    <script src="/js/moment.js" type="application/javascript"></script>
+    <script src="/js/lib/marked.min.js"></script>
+    <script src="/js/lib/prettify.min.js"></script>
+</head>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index 2ce78db..f0287ad 100644
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -1,14 +1,8 @@
 <!DOCTYPE HTML>
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
-    <title>码匠社区</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-    <link rel="stylesheet" href="css/bootstrap.min.css"/>
-    <link rel="stylesheet" href="css/bootstrap-theme.min.css">
-    <link rel="stylesheet" href="css/community.css">
-    <link rel="icon" href="/images/logo.png" type="image/x-icon"/>
-    <script src="js/jquery-3.4.1.min.js"></script>
-    <script src="js/bootstrap.min.js" type="application/javascript"></script>
+    <title>码问</title>
+    <head th:insert="~{import :: head}"></head>
 </head>
 <script type="application/javascript">
     window.onload = function () {
@@ -24,8 +18,24 @@
 <div class="container-fluid main">
     <div class="row">
         <div class="col-lg-9 col-md-12 col-sm-12 col-xs-12">
-            <h2><span class="glyphicon glyphicon-list" aria-hidden="true"></span> 发现</h2>
-            <hr>
+            <h3><span class="glyphicon glyphicon-list" aria-hidden="true"></span> 发现</h3>
+            <ul class="nav nav-tabs">
+                <li role="presentation" th:class="${sort == 'new' || sort == '' ? 'active':''}">
+                    <a th:href="@{/(sort='new')}">最新</a>
+                </li>
+                <li role="presentation" th:class="${sort == 'hot30' ? 'active':''}">
+                    <a th:href="@{/(sort='hot30')}">30天最热</a>
+                </li>
+                <li role="presentation" th:class="${sort == 'hot7' ? 'active':''}">
+                    <a th:href="@{/(sort='hot7')}">7天最热</a>
+                </li>
+                <li role="presentation" th:class="${sort == 'hot' ? 'active':''}">
+                    <a th:href="@{/(sort='hot')}">最热</a>
+                </li>
+                <li role="presentation" th:class="${sort == 'no' ? 'active':''}">
+                    <a th:href="@{/(sort='no')}" class="red">消灭零回复</a>
+                </li>
+            </ul>
 
             <div class="media" th:each="question : ${pagination.data}">
                 <div class="media-left">
@@ -35,9 +45,9 @@ <h2><span class="glyphicon glyphicon-list" aria-hidden="true"></span> 发现</h2
                     </a>
                 </div>
                 <div class="media-body">
-                    <h4 class="media-heading">
-                        <a th:href="@{'/question/'+ ${question.id}}" th:text="${question.title}"></a>
-                    </h4>
+                    <h5 class="media-heading">
+                        <span style="color: #c74747" th:if="${question.sticky >= 1}">[置顶] </span><a th:href="@{'/question/'+ ${question.id}}" th:text="${question.title}"></a>
+                    </h5>
                     <span class="text-desc"><span th:text="${question.commentCount}"></span> 个回复 • <span
                             th:text="${question.viewCount}"></span> 次浏览 • <span
                             th:text="${#dates.format(question.gmtCreate,'yyyy-MM-dd HH:mm')}"></span></span>
@@ -46,27 +56,30 @@ <h4 class="media-heading">
             <nav aria-label="Page navigation">
                 <ul class="pagination">
                     <li th:if="${pagination.showFirstPage}">
-                        <a th:href="@{/(page=1,search=${search})}" aria-label="Previous">
+                        <a th:href="@{/(page=1,search=${search},tag=${tag},sort=${sort})}" aria-label="Previous">
                             <span aria-hidden="true">&lt;&lt;</span>
                         </a>
                     </li>
                     <li th:if="${pagination.showPrevious}">
-                        <a th:href="@{/(page=${pagination.page - 1},search=${search})}" aria-label="Previous">
+                        <a th:href="@{/(page=${pagination.page - 1},search=${search},tag=${tag},sort=${sort})}"
+                           aria-label="Previous">
                             <span aria-hidden="true">&lt;</span>
                         </a>
                     </li>
 
                     <li th:each="page : ${pagination.pages}" th:class="${pagination.page == page}? 'active' : ''">
-                        <a th:href="@{/(page=${page},search=${search})}" th:text="${page}"></a>
+                        <a th:href="@{/(page=${page},search=${search},tag=${tag},sort=${sort})}" th:text="${page}"></a>
                     </li>
 
                     <li th:if="${pagination.showNext}">
-                        <a th:href="@{/(page=${pagination.page +1 },search=${search})}" aria-label="Previous">
+                        <a th:href="@{/(page=${pagination.page +1 },search=${search},tag=${tag},sort=${sort})}"
+                           aria-label="Previous">
                             <span aria-hidden="true">&gt;</span>
                         </a>
                     </li>
                     <li th:if="${pagination.showEndPage}">
-                        <a th:href="@{/(page=${pagination.totalPage},search=${search})}" aria-label="Previous">
+                        <a th:href="@{/(page=${pagination.totalPage},search=${search},tag=${tag},sort=${sort})}"
+                           aria-label="Previous">
                             <span aria-hidden="true">&gt;&gt;</span>
                         </a>
                     </li>
@@ -74,10 +87,15 @@ <h4 class="media-heading">
             </nav>
         </div>
         <div class="col-lg-3 col-md-12 col-sm-12 col-xs-12">
+            <div th:insert="~{notice :: notice}"></div>
+            <!--相关问题-->
+            <hr class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
             <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
-                <h4>官方微信</h4>
-                <img class="img-thumbnail question-wechat" src="/images/official.jpg">
+                <h4>热门标签</h4>
+                <a th:each="tag : ${tags}" th:href="@{/(page=1,search=${search},tag=${tag},sort=${sort})}"
+                   th:text="${tag}" class="community-tag"></a>
             </div>
+            <div th:insert="~{side :: side}"></div>
         </div>
     </div>
 </div>
diff --git a/src/main/resources/templates/navigation.html b/src/main/resources/templates/navigation.html
index 4800913..2f813c9 100644
--- a/src/main/resources/templates/navigation.html
+++ b/src/main/resources/templates/navigation.html
@@ -10,10 +10,11 @@
             <div class="navbar-header">
                 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                         data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
-                    <span class="sr-only">码匠社区</span>
+                    <span class="sr-only">码问</span>
                 </button>
-                <a class="navbar-brand" href="/">码匠社区</a>
+                <a class="navbar-brand" href="/">码问</a>
             </div>
+
             <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                 <form class="navbar-form navbar-left" action="/" method="get">
                     <div class="form-group">
@@ -21,6 +22,21 @@
                     </div>
                     <button type="submit" class="btn btn-default">搜索</button>
                 </form>
+                <ul class="nav navbar-nav">
+                    <script>
+                        function clickNav(label) {
+                            gtag('event', 'click', {
+                                'event_category': 'LINK',
+                                'event_label': label,
+                                'transport_type': 'NAV'
+                            })
+                        }
+                    </script>
+                    <li th:each="ad : ${#httpServletRequest.getServletContext().getAttribute('NAV')}">
+                        <a th:href="${ad.url}" th:text="${ad.title}" th:onclick="clickNav([[${ad.title}]])"
+                           target="_blank"></a>
+                    </li>
+                </ul>
                 <ul class="nav navbar-nav navbar-right">
                     <li th:if="${session.user != null}">
                         <a href="/publish">提问</a>
@@ -39,13 +55,37 @@
                         </ul>
                     </li>
                     <li th:if="${session.user == null}">
-                        <a th:href="@{https://github.com/login/oauth/authorize(client_id='2859958f9f059979ed3a',redirect_uri=${#httpServletRequest.getServletContext().getAttribute('redirectUri')},scope='user',state=1)}">登录</a>
+                        <!--                        <a th:href="@{https://github.com/login/oauth/authorize(client_id='7f316909bf70d1eaa2b2',redirect_uri=${#httpServletRequest.getServletContext().getAttribute('redirectUri')},scope='user',state=1)}">登录</a>-->
+                        <a href="#" data-toggle="modal" data-target="#myModal">登录</a>
                     </li>
 
                 </ul>
             </div>
         </div>
     </nav>
+
+    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
+        <div class="modal-dialog" role="document" style="margin-top: 200px;width: 300px;">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
+                            aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title" id="myModalLabel">登录注册</h4>
+                </div>
+                <div class="modal-body" style="text-align:center">
+                    <a th:href="@{https://gitee.com/oauth/authorize(client_id='e542c33bb680ea612ce21b8efb397274eae34833553bc80bc9ff881425d1b883',redirect_uri=${#httpServletRequest.getServletContext().getAttribute('giteeRedirectUri')},response_type=code)}">
+                        <img src="/images/gitee.png">
+                    </a>
+                    <a th:href="@{https://github.com/login/oauth/authorize(client_id='7f316909bf70d1eaa2b2',redirect_uri=${#httpServletRequest.getServletContext().getAttribute('githubRedirectUri')},scope='user',state=1)}">
+                        <img src="/images/github.png">
+                    </a>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
+                </div>
+            </div>
+        </div>
+    </div>
 </div>
 
 </body>
diff --git a/src/main/resources/templates/notice.html b/src/main/resources/templates/notice.html
new file mode 100644
index 0000000..dbae665
--- /dev/null
+++ b/src/main/resources/templates/notice.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+
+<body>
+
+<div th:fragment="notice">
+    <!--码问官方公众号-->
+<!--    <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 side">-->
+<!--        <h4>官方微信</h4>-->
+<!--        <img class="img-thumbnail question-wechat" src="/images/official-account.png">-->
+<!--    </div>-->
+</div>
+</body>
+</html>
diff --git a/src/main/resources/templates/profile.html b/src/main/resources/templates/profile.html
index caadfe2..9cbb84b 100644
--- a/src/main/resources/templates/profile.html
+++ b/src/main/resources/templates/profile.html
@@ -2,13 +2,7 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
     <title th:text="${sectionName}"></title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-    <link rel="stylesheet" href="/css/bootstrap.min.css"/>
-    <link rel="stylesheet" href="/css/bootstrap-theme.min.css">
-    <link rel="stylesheet" href="/css/community.css">
-    <link rel="icon" href="/images/logo.png" type="image/x-icon"/>
-    <script src="/js/jquery-3.4.1.min.js"></script>
-    <script src="/js/bootstrap.min.js" type="application/javascript"></script>
+    <head th:insert="~{import :: head}"></head>
 </head>
 <body>
 <div th:insert="~{navigation :: nav}"></div>
@@ -27,9 +21,9 @@ <h2><span th:text="${sectionName}"></span></h2>
                         </a>
                     </div>
                     <div class="media-body">
-                        <h4 class="media-heading">
+                        <h5 class="media-heading">
                             <a th:href="@{'/question/'+ ${question.id}}" th:text="${question.title}"></a>
-                        </h4>
+                        </h5>
                         <span class="text-desc">
                         <span th:text="${question.commentCount}"></span> 个回复 • <span
                                 th:text="${question.viewCount}"></span> 次浏览 • <span
diff --git a/src/main/resources/templates/publish.html b/src/main/resources/templates/publish.html
index e03d229..d1cf8ef 100644
--- a/src/main/resources/templates/publish.html
+++ b/src/main/resources/templates/publish.html
@@ -1,17 +1,9 @@
 <!DOCTYPE HTML>
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
-    <title>发布 - 码匠社区</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-    <link rel="stylesheet" href="/css/bootstrap.min.css"/>
-    <link rel="stylesheet" href="/css/bootstrap-theme.min.css">
-    <link rel="stylesheet" href="/css/community.css">
-    <link rel="stylesheet" href="/css/editormd.min.css">
-    <link rel="icon" href="/images/logo.png" type="image/x-icon"/>
-    <script src="/js/jquery-3.4.1.min.js"></script>
-    <script src="/js/bootstrap.min.js" type="application/javascript"></script>
-    <script src="/js/community.js" type="application/javascript"></script>
-    <script src="/js/editormd.min.js" type="application/javascript"></script>
+    <title>发布 - 码问</title>
+    <head th:insert="~{import :: head}"></head>
+    <head th:insert="~{import :: markdown}"></head>
 </head>
 <body>
 
@@ -30,7 +22,7 @@ <h2><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 发起</h2
                            placeholder="问题标题……"
                            autocomplete="off">
                 </div>
-                <div class="form-group" id="question-editor">
+                <div class="form-group" id="question-editor" style="z-index: 2">
                     <label for="description">问题补充 (必填，请参照右侧提示):</label>
                     <textarea name="description" id="description" th:text="${description}" style="display:none;"
                               class="form-control"
@@ -71,8 +63,8 @@ <h2><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 发起</h2
                                  th:each="selectCategory: ${tags}"
                                  th:class="${selectCategoryStat.first ? 'active tab-pane':'tab-pane'}">
                                 <span>
-                                    <span class="label label-info" th:each="selectTag: ${selectCategory.tags}">
-                                    <span class="glyphicon glyphicon-tags" onclick="selectTag(this)"
+                                    <span th:each="selectTag: ${selectCategory.tags}">
+                                    <span class="community-tag" onclick="selectTag(this)"
                                           th:data-tag="${selectTag}"
                                           th:text="${' '+selectTag}">
                                     </span>
diff --git a/src/main/resources/templates/question.html b/src/main/resources/templates/question.html
index 153b15e..8cea870 100644
--- a/src/main/resources/templates/question.html
+++ b/src/main/resources/templates/question.html
@@ -2,20 +2,8 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
     <title th:text="${question.title}"></title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-    <link rel="stylesheet" href="/css/bootstrap.min.css"/>
-    <link rel="stylesheet" href="/css/bootstrap-theme.min.css">
-    <link rel="stylesheet" href="/css/community.css">
-    <link rel="icon" href="/images/logo.png" type="image/x-icon"/>
-
-    <link rel="stylesheet" href="/css/editormd.preview.min.css">
-    <script src="/js/jquery-3.4.1.min.js"></script>
-    <script src="/js/bootstrap.min.js" type="application/javascript"></script>
-    <script src="/js/moment.js" type="application/javascript"></script>
-    <script src="/js/community.js" type="application/javascript"></script>
-    <script src="/js/editormd.min.js" type="application/javascript"></script>
-    <script src="/js/lib/marked.min.js"></script>
-    <script src="/js/lib/prettify.min.js"></script>
+    <head th:insert="~{import :: head}"></head>
+    <head th:insert="~{import :: markdown}"></head>
 </head>
 <body>
 <div th:insert="~{navigation :: nav}"></div>
@@ -34,6 +22,14 @@ <h4 class="question-title"><span th:text="${question.title}"></span></h4>
             </span>
                 <hr class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
 
+                <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 top-header"
+                     th:if="${!#lists.isEmpty(#httpServletRequest.getServletContext().getAttribute('HEADER'))}"
+                     th:each="ad : ${#httpServletRequest.getServletContext().getAttribute('HEADER')}">
+                    <a th:href="${ad.url}" th:text="${ad.title}" target="_blank"
+                       style="color: #A00;font-weight: bold;"></a>
+                    <img src="/images/hot.png"/>
+                </div>
+
                 <!--内容-->
                 <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" id="question-view">
                     <textarea style="display:none;" th:text="${question.description}"></textarea>
@@ -44,12 +40,33 @@ <h4 class="question-title"><span th:text="${question.title}"></span></h4>
                     });
                 </script>
 
+                <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"
+                     th:if="${!#lists.isEmpty(#httpServletRequest.getServletContext().getAttribute('FOOTER'))}"
+                     th:each="ad : ${#httpServletRequest.getServletContext().getAttribute('FOOTER')}">
+                    <a th:href="${ad.url}" th:text="${ad.title}" target="_blank"
+                       style="color: #A00;font-weight: bold;"></a>
+                </div>
+                <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" style="width: 100%;"
+                     th:if="${#lists.isEmpty(#httpServletRequest.getServletContext().getAttribute('FOOTER'))}">
+                    <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+                    <!-- 页尾广告 -->
+                    <ins class="adsbygoogle"
+                         style="display:block"
+                         data-ad-client="ca-pub-9804684553882114"
+                         data-ad-slot="4772323686"
+                         data-ad-format="auto"
+                         data-full-width-responsive="true"></ins>
+                    <script>
+                        (adsbygoogle = window.adsbygoogle || []).push({});
+                    </script>
+                </div>
+
                 <!--标签-->
                 <hr class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
                 <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
-                    <span class="label label-info question-tag" th:each="tag : ${question.tag.split(',')}">
-                        <span class="glyphicon glyphicon-tags"></span>
-                        <span class="label label-info" th:text="${tag}"></span>
+                    <span class="question-tag" th:each="tag : ${question.tag.split(',')}">
+                        <a th:href="@{/(page=1,tag=${tag})}"
+                           th:text="${tag}" class="community-tag"></a>
                     </span>
                 </div>
 
@@ -155,14 +172,8 @@ <h5 class="media-heading">
                     </div>
                 </div>
             </div>
-
-            <!--微信号-->
-            <hr class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
-            <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
-                <h4>官方微信</h4>
-                <img class="img-thumbnail question-wechat" src="/images/official.jpg">
-            </div>
-
+            <div th:insert="~{notice :: notice}"></div>
+            <div th:insert="~{side :: side}"></div>
             <!--相关问题-->
             <hr class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
             <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
diff --git a/src/main/resources/templates/side.html b/src/main/resources/templates/side.html
new file mode 100644
index 0000000..c7e2afa
--- /dev/null
+++ b/src/main/resources/templates/side.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+
+<body>
+
+<div th:fragment="side">
+    <hr class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
+    <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 side"
+         th:if="${#lists.size(#httpServletRequest.getServletContext().getAttribute('SIDE')) != 0}"
+         th:each="ad : ${#httpServletRequest.getServletContext().getAttribute('SIDE')}">
+        <a th:href="${ad.url}" th:onclick="clickSide([[${ad.title}]])"
+           target="_blank">
+            <img class="img-thumbnail question-wechat" th:src="${ad.image}">
+        </a>
+    </div>
+    <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 side"
+         th:if="${#lists.size(#httpServletRequest.getServletContext().getAttribute('SIDE')) == 0}">
+        <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+        <!-- 侧边栏广告位 -->
+        <ins class="adsbygoogle"
+             style="display:block"
+             data-ad-client="ca-pub-9804684553882114"
+             data-ad-slot="2615744269"
+             data-ad-format="auto"
+             data-full-width-responsive="true"></ins>
+        <script>
+            (adsbygoogle = window.adsbygoogle || []).push({});
+        </script>
+    </div>
+</div>
+</body>
+</html>
