├── README.md ├── blog.sql ├── vueblog ├── .gitignore ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ └── index.html ├── src │ ├── App.vue │ ├── assets │ │ └── logo.png │ ├── components │ │ ├── Login.vue │ │ └── blogs │ │ │ ├── BlogListCom.vue │ │ │ └── SearchBlogsCom.vue │ ├── main.js │ ├── router │ │ └── index.js │ ├── utils │ │ └── api.js │ └── views │ │ ├── Home.vue │ │ └── blogs │ │ ├── AllBlogs.vue │ │ ├── CategoryBlog.vue │ │ ├── CommentBlog.vue │ │ ├── EditBlog.vue │ │ ├── LinksBlog.vue │ │ ├── TagBlog.vue │ │ └── WriteBlog.vue └── vue.config.js ├── xlblog ├── .gitignore ├── .mvn │ └── wrapper │ │ ├── MavenWrapperDownloader.java │ │ ├── maven-wrapper.jar │ │ └── maven-wrapper.properties ├── mvnw ├── mvnw.cmd ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── xlblog │ │ │ └── blog │ │ │ ├── BlogApplication.java │ │ │ ├── CodeGenerator.java │ │ │ ├── config │ │ │ ├── MybatisPlusConfig.java │ │ │ ├── SecurityConfig.java │ │ │ └── SwaggerConfig.java │ │ │ ├── controller │ │ │ ├── LoginController.java │ │ │ ├── TBlogController.java │ │ │ ├── TBlogTagsController.java │ │ │ ├── TCommentController.java │ │ │ ├── TContactController.java │ │ │ ├── TLinksController.java │ │ │ ├── TRoleController.java │ │ │ ├── TTagController.java │ │ │ ├── TTrafficController.java │ │ │ ├── TTypeController.java │ │ │ ├── TUserController.java │ │ │ └── TUserRoleController.java │ │ │ ├── entity │ │ │ ├── TBlog.java │ │ │ ├── TBlogTags.java │ │ │ ├── TComment.java │ │ │ ├── TContact.java │ │ │ ├── TLinks.java │ │ │ ├── TRole.java │ │ │ ├── TTag.java │ │ │ ├── TTraffic.java │ │ │ ├── TType.java │ │ │ ├── TUser.java │ │ │ ├── TUserRole.java │ │ │ └── Tcount.java │ │ │ ├── form │ │ │ └── BlogForm.java │ │ │ ├── mapper │ │ │ ├── TBlogMapper.java │ │ │ ├── TBlogTagsMapper.java │ │ │ ├── TCommentMapper.java │ │ │ ├── TContactMapper.java │ │ │ ├── TLinksMapper.java │ │ │ ├── TRoleMapper.java │ │ │ ├── TTagMapper.java │ │ │ ├── TTrafficMapper.java │ │ │ ├── TTypeMapper.java │ │ │ ├── TUserMapper.java │ │ │ └── TUserRoleMapper.java │ │ │ ├── service │ │ │ ├── TBlogService.java │ │ │ ├── TBlogTagsService.java │ │ │ ├── TCommentService.java │ │ │ ├── TContactService.java │ │ │ ├── TLinksService.java │ │ │ ├── TRoleService.java │ │ │ ├── TTagService.java │ │ │ ├── TTrafficService.java │ │ │ ├── TTypeService.java │ │ │ ├── TUserRoleService.java │ │ │ ├── TUserService.java │ │ │ └── impl │ │ │ │ ├── CustomUserServiceImpl.java │ │ │ │ ├── TBlogServiceImpl.java │ │ │ │ ├── TBlogTagsServiceImpl.java │ │ │ │ ├── TCommentServiceImpl.java │ │ │ │ ├── TContactServiceImpl.java │ │ │ │ ├── TLinksServiceImpl.java │ │ │ │ ├── TRoleServiceImpl.java │ │ │ │ ├── TTagServiceImpl.java │ │ │ │ ├── TTrafficServiceImpl.java │ │ │ │ ├── TTypeServiceImpl.java │ │ │ │ ├── TUserRoleServiceImpl.java │ │ │ │ └── TUserServiceImpl.java │ │ │ └── utils │ │ │ ├── RespBean.java │ │ │ ├── Result.java │ │ │ └── blogQuartz.java │ └── resources │ │ ├── application.yml │ │ ├── mapper │ │ ├── TBlogMapper.xml │ │ ├── TBlogTagsMapper.xml │ │ ├── TCommentMapper.xml │ │ ├── TContactMapper.xml │ │ ├── TLinksMapper.xml │ │ ├── TRoleMapper.xml │ │ ├── TTagMapper.xml │ │ ├── TTrafficMapper.xml │ │ ├── TTypeMapper.xml │ │ ├── TUserMapper.xml │ │ └── TUserRoleMapper.xml │ │ └── static │ │ └── images │ │ └── avatar.jpg │ └── test │ └── java │ └── com │ └── xlblog │ └── blog │ └── BlogApplicationTests.java └── xlvueblog ├── .gitignore ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── assets │ ├── css │ │ └── mycss.css │ ├── image │ │ ├── bg.jpg │ │ └── code.jpg │ ├── js │ │ ├── clock.js │ │ ├── mouse.js │ │ └── myjs.js │ └── logo.png ├── components │ ├── Blog.vue │ ├── Comment.vue │ ├── Foot.vue │ └── Head.vue ├── main.js ├── router │ └── index.js └── views │ ├── BlogLinks.vue │ ├── BlogSearch.vue │ ├── BlogTag.vue │ ├── BlogType.vue │ ├── Home.vue │ ├── Index.vue │ └── Message.vue └── vue.config.js /README.md: -------------------------------------------------------------------------------- 1 | ### 关注小L,为你分享更多优质文章和实用资源~ 2 |  3 | 4 | ### 简介 5 | 这是一个使用 SpringBoot+Vue+Mybatis-Plus 开发的前后端分离个人博客,有配套开发教程,欢迎star学习! 6 | 7 | ### 文件介绍 8 | - vueblog:这是后台博客管理的前端 9 | - xlblog:这是后台博客管理后端 10 | - xlvueblog:这是前台博客 11 | 12 | ### 技术路线 13 | - SpringBoot 14 | - Vue 15 | - Mybatis-Plus 16 | - SpringSecurity 17 | - MySQL ... 18 | 19 | ### 项目部署 20 | 后端项目-xlblog 21 | - 1、导入sql。 22 | - 2、修改application.yml文件(配置数据库连接,修改账号密码)。 23 | - 3、启动。 24 | 25 | 前端-vueblog、xlvueblog 26 | - 1、输入 npm install 安装依赖。 27 | - 2、输入 npm run serve 启动项目即可(vueblog启动后登陆的账号:admin,密码:123)。 28 | - 3、浏览器访问:http://localhost:8080。 29 | 30 | 31 | ### 配套教程 32 | - [SpringBoot+Vue+Mybatis-plus 博客:个人博客介绍及效果展示](https://blog.csdn.net/m0_45234510/article/details/114599074) 33 | - [SpringBoot+Vue+Mybatis-plus 博客(一):完成博客后台前端登录页面、后端登录接口](https://blog.csdn.net/m0_45234510/article/details/110405346) 34 | - [SpringBoot+Vue+Mybatis-plus 博客(二):完成登录的前后端对接、完善左侧菜单栏](https://blog.csdn.net/m0_45234510/article/details/110494715) 35 | - [SpringBoot+Vue+Mybatis-plus 博客(三):完成搜索及博客列表展示功能前后端](https://blog.csdn.net/m0_45234510/article/details/110932322) 36 | - [SpringBoot+Vue+Mybatis-plus 博客(四):完成发布文章、编辑文章、删除文章及查询文章功能](https://blog.csdn.net/m0_45234510/article/details/111075386) 37 | - [SpringBoot+Vue+Mybatis-plus 博客(五):完成分类管理和标签管理前后端对接](https://blog.csdn.net/m0_45234510/article/details/112315926) 38 | - [SpringBoot+Vue+Mybatis-plus 博客(六):完成评论管理前后端交互](https://blog.csdn.net/m0_45234510/article/details/114150638) 39 | - [SpringBoot+Vue+Mybatis-plus 博客(七):完成友链管理前后端对接](https://blog.csdn.net/m0_45234510/article/details/114155484) 40 | 41 | ### 效果展示 42 | #### 前台页面 43 | - 博客首页 44 |  45 | 46 | - 分类专栏 47 |  48 | 49 | - 标签 50 |  51 | 52 | - 留言板 53 |  54 | 55 | - 友链 56 |  57 | 58 | - 搜索 59 |  60 | 61 | 62 | #### 后台博客管理前端页面 63 | 64 | - 写博客 65 |  66 | 67 | - 文章管理 68 |  69 | 70 | - 分类管理 71 |  72 | 73 | - 标签管理 74 |  75 | 76 | - 评论管理 77 |  78 | 79 | - 友链管理 80 |  81 | -------------------------------------------------------------------------------- /vueblog/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /vueblog/README.md: -------------------------------------------------------------------------------- 1 | # vueblog 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Customize configuration 19 | See [Configuration Reference](https://cli.vuejs.org/config/). 20 | -------------------------------------------------------------------------------- /vueblog/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /vueblog/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vueblog", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build" 8 | }, 9 | "dependencies": { 10 | "axios": "^0.21.0", 11 | "core-js": "^3.6.5", 12 | "element-ui": "^2.14.1", 13 | "mavon-editor": "^2.9.0", 14 | "vue": "^2.6.11", 15 | "vue-router": "^3.2.0" 16 | }, 17 | "devDependencies": { 18 | "@vue/cli-plugin-babel": "~4.5.0", 19 | "@vue/cli-plugin-router": "~4.5.0", 20 | "@vue/cli-service": "~4.5.0", 21 | "vue-template-compiler": "^2.6.11" 22 | }, 23 | "browserslist": [ 24 | "> 1%", 25 | "last 2 versions", 26 | "not dead" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /vueblog/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xdragon0/xiaoLBlog/91ed66993f8133902ffbc7f59f192abc7c40d306/vueblog/public/favicon.ico -------------------------------------------------------------------------------- /vueblog/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 |22 | * 读取控制台内容 23 | *
24 | */ 25 | public static String scanner(String tip) { 26 | Scanner scanner = new Scanner(System.in); 27 | StringBuilder help = new StringBuilder(); 28 | help.append("请输入" + tip + ":"); 29 | System.out.println(help.toString()); 30 | if (scanner.hasNext()) { 31 | String ipt = scanner.next(); 32 | if (StringUtils.isNotEmpty(ipt)) { 33 | return ipt; 34 | } 35 | } 36 | throw new MybatisPlusException("请输入正确的" + tip + "!"); 37 | } 38 | 39 | public static void main(String[] args) { 40 | // 代码生成器 41 | AutoGenerator mpg = new AutoGenerator(); 42 | 43 | // 全局配置 44 | GlobalConfig gc = new GlobalConfig(); 45 | String projectPath = System.getProperty("user.dir"); 46 | gc.setOutputDir(projectPath + "/src/main/java"); 47 | // gc.setOutputDir("D:\\test"); 48 | gc.setAuthor("关注公众号:小L星光"); 49 | gc.setOpen(false); 50 | gc.setSwagger2(true); //实体属性 Swagger2 注解 51 | gc.setServiceName("%sService"); 52 | mpg.setGlobalConfig(gc); 53 | 54 | // 数据源配置 55 | DataSourceConfig dsc = new DataSourceConfig(); 56 | dsc.setUrl("jdbc:mysql://localhost:3306/blog?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC"); 57 | // dsc.setSchemaName("public"); 58 | dsc.setDriverName("com.mysql.cj.jdbc.Driver"); 59 | dsc.setUsername("root"); 60 | dsc.setPassword("xxx"); 61 | mpg.setDataSource(dsc); 62 | 63 | // 包配置 64 | PackageConfig pc = new PackageConfig(); 65 | pc.setModuleName(null); 66 | pc.setParent("com.xlblog.blog"); 67 | mpg.setPackageInfo(pc); 68 | 69 | // 自定义配置 70 | InjectionConfig cfg = new InjectionConfig() { 71 | @Override 72 | public void initMap() { 73 | // to do nothing 74 | } 75 | }; 76 | 77 | // 如果模板引擎是 freemarker 78 | String templatePath = "/templates/mapper.xml.ftl"; 79 | // 如果模板引擎是 velocity 80 | // String templatePath = "/templates/mapper.xml.vm"; 81 | 82 | // 自定义输出配置 83 | List10 | * 前端控制器 11 | *
12 | * 13 | * @author 关注公众号:小L星光 14 | * @since 2020-11-30 15 | */ 16 | @RestController 17 | @RequestMapping("/t-blog-tags") 18 | public class TBlogTagsController { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/controller/TCommentController.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.controller; 2 | 3 | 4 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 5 | import com.xlblog.blog.entity.TBlog; 6 | import com.xlblog.blog.entity.TComment; 7 | import com.xlblog.blog.entity.TUser; 8 | import com.xlblog.blog.service.TBlogService; 9 | import com.xlblog.blog.service.TCommentService; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.beans.factory.annotation.Value; 12 | import org.springframework.security.core.Authentication; 13 | import org.springframework.web.bind.annotation.*; 14 | 15 | import org.springframework.web.servlet.mvc.support.RedirectAttributes; 16 | 17 | import javax.servlet.http.HttpServletRequest; 18 | import javax.servlet.http.HttpSession; 19 | import java.security.Principal; 20 | import java.util.List; 21 | 22 | /** 23 | *24 | * 前端控制器 25 | *
26 | * 27 | * @author 关注公众号:小L星光 28 | * @since 2020-11-30 29 | */ 30 | @RestController 31 | @RequestMapping("/comment") 32 | public class TCommentController { 33 | 34 | @Autowired 35 | private TCommentService commentService; 36 | @Autowired 37 | private TBlogService tBlogService; 38 | 39 | //查询评论列表 40 | @GetMapping("/comments/{blogId}") 41 | public List10 | * 前端控制器 11 | *
12 | * 13 | * @author 关注公众号:小L星光 14 | * @since 2020-11-30 15 | */ 16 | @RestController 17 | @RequestMapping("/t-contact") 18 | public class TContactController { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/controller/TLinksController.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.controller; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 | import com.xlblog.blog.entity.TLinks; 6 | import com.xlblog.blog.service.TLinksService; 7 | import com.xlblog.blog.utils.RespBean; 8 | import io.swagger.annotations.ApiImplicitParam; 9 | import io.swagger.annotations.ApiImplicitParams; 10 | import io.swagger.annotations.ApiOperation; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | import java.time.LocalDateTime; 15 | import java.util.List; 16 | 17 | /** 18 | *19 | * 前端控制器 20 | *
21 | * 22 | * @author 关注公众号:小L星光 23 | * @since 2020-11-30 24 | */ 25 | @RestController 26 | @RequestMapping("/links") 27 | public class TLinksController { 28 | @Autowired 29 | TLinksService tLinksService; 30 | 31 | RespBean respBean = RespBean.build(); 32 | 33 | /** 34 | * 新增友链 35 | * @param tLinks 36 | * @return 37 | */ 38 | @PostMapping("/saveLink") 39 | public RespBean saveLink(@RequestBody TLinks tLinks){ 40 | tLinks.setCreateTime(LocalDateTime.now()); 41 | Boolean result = tLinksService.save(tLinks); 42 | if (result){ 43 | respBean.setStatus(200); 44 | respBean.setMsg("添加友链成功!"); 45 | return respBean; 46 | }else { 47 | respBean.setStatus(500); 48 | respBean.setMsg("添加友链失败!"); 49 | return respBean; 50 | } 51 | 52 | } 53 | 54 | /** 55 | * 查询所有 56 | * @return 57 | */ 58 | @GetMapping("/getAllLink") 59 | public RespBean getAllLink(){ 60 | List10 | * 前端控制器 11 | *
12 | * 13 | * @author 关注公众号:小L星光 14 | * @since 2020-11-30 15 | */ 16 | @RestController 17 | @RequestMapping("/t-role") 18 | public class TRoleController { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/controller/TTagController.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.controller; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 | import com.baomidou.mybatisplus.core.toolkit.StringUtils; 6 | import com.xlblog.blog.entity.TTag; 7 | import com.xlblog.blog.entity.TType; 8 | import com.xlblog.blog.service.TTagService; 9 | import com.xlblog.blog.service.TTypeService; 10 | import com.xlblog.blog.utils.RespBean; 11 | import io.swagger.annotations.ApiImplicitParam; 12 | import io.swagger.annotations.ApiImplicitParams; 13 | import io.swagger.annotations.ApiOperation; 14 | import org.springframework.beans.factory.annotation.Autowired; 15 | import org.springframework.web.bind.annotation.*; 16 | 17 | import java.util.List; 18 | 19 | /** 20 | *21 | * 前端控制器 22 | *
23 | * 24 | * @author 关注公众号:小L星光 25 | * @since 2020-11-30 26 | */ 27 | @RestController 28 | @RequestMapping("/tag") 29 | public class TTagController { 30 | 31 | @Autowired 32 | TTagService tTagService; 33 | 34 | RespBean respBean = RespBean.build(); 35 | 36 | @PostMapping("/saveTag") 37 | public RespBean saveTag(@RequestBody TTag tTag){ 38 | if (StringUtils.isEmpty(tTag.getName())){ 39 | respBean.setStatus(500); 40 | respBean.setMsg("标签名称不能为空!"); 41 | return respBean; 42 | } 43 | QueryWrapper10 | * 前端控制器 11 | *
12 | * 13 | * @author 关注公众号:小L星光 14 | * @since 2020-11-30 15 | */ 16 | @RestController 17 | @RequestMapping("/t-traffic") 18 | public class TTrafficController { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/controller/TTypeController.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.controller; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 | import com.baomidou.mybatisplus.core.toolkit.StringUtils; 6 | import com.xlblog.blog.entity.TBlog; 7 | import com.xlblog.blog.entity.TType; 8 | import com.xlblog.blog.service.TTypeService; 9 | import com.xlblog.blog.utils.RespBean; 10 | import io.swagger.annotations.ApiImplicitParam; 11 | import io.swagger.annotations.ApiImplicitParams; 12 | import io.swagger.annotations.ApiOperation; 13 | import org.springframework.beans.factory.annotation.Autowired; 14 | import org.springframework.web.bind.annotation.*; 15 | 16 | import java.util.List; 17 | 18 | /** 19 | *20 | * 前端控制器 21 | *
22 | * 23 | * @author 关注公众号:小L星光 24 | * @since 2020-11-30 25 | */ 26 | @RestController 27 | @RequestMapping("/type") 28 | public class TTypeController { 29 | 30 | @Autowired 31 | TTypeService tTypeService; 32 | 33 | RespBean respBean = RespBean.build(); 34 | 35 | /** 36 | * 保存分类专栏 37 | * @param tType 38 | * @return 39 | */ 40 | @PostMapping("/saveType") 41 | public RespBean saveType(@RequestBody TType tType){ 42 | if (StringUtils.isEmpty(tType.getName())){ 43 | respBean.setStatus(500); 44 | respBean.setMsg("分类专栏名称不能为空!"); 45 | return respBean; 46 | } 47 | QueryWrapper17 | * 前端控制器 18 | *
19 | * 20 | * @author 关注公众号:小L星光 21 | * @since 2020-11-30 22 | */ 23 | @RestController 24 | public class TUserController { 25 | 26 | @GetMapping("/hello") 27 | public RespBean test() { 28 | return RespBean.ok("hello"); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/controller/TUserRoleController.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *10 | * 前端控制器 11 | *
12 | * 13 | * @author 关注公众号:小L星光 14 | * @since 2020-11-30 15 | */ 16 | @RestController 17 | @RequestMapping("/t-user-role") 18 | public class TUserRoleController { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/entity/TBlog.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.entity; 2 | 3 | import java.time.LocalDateTime; 4 | import java.io.Serializable; 5 | import java.util.List; 6 | 7 | import com.baomidou.mybatisplus.annotation.TableField; 8 | import com.baomidou.mybatisplus.annotation.TableName; 9 | import com.fasterxml.jackson.annotation.JsonFormat; 10 | import com.fasterxml.jackson.databind.annotation.JsonSerialize; 11 | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 12 | import io.swagger.annotations.ApiModel; 13 | import io.swagger.annotations.ApiModelProperty; 14 | import lombok.Data; 15 | import lombok.EqualsAndHashCode; 16 | import lombok.experimental.Accessors; 17 | 18 | /** 19 | *20 | * 21 | *
22 | * 23 | * @author 关注公众号:小L星光 24 | * @since 2020-11-30 25 | */ 26 | @Data 27 | @EqualsAndHashCode(callSuper = false) 28 | @Accessors(chain = true) 29 | @ApiModel(value="TBlog对象", description="") 30 | //@TableName(value = "t_blog" ,resultMap = "MyBlogMap") 31 | public class TBlog implements Serializable { 32 | 33 | private static final long serialVersionUID = 1L; 34 | 35 | @JsonSerialize(using = ToStringSerializer.class) //系统序列化时,保留相关精度 36 | @ApiModelProperty(value = "博客id") 37 | private Long id; 38 | 39 | // @ApiModelProperty(value = "是否开启赞赏") 40 | // private Boolean appreciation; 41 | // 42 | // @ApiModelProperty(value = "是否开启评论") 43 | // private Boolean commentabled; 44 | 45 | @ApiModelProperty(value = "博客内容") 46 | private String content; 47 | 48 | @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "Asia/ShangHai") 49 | @ApiModelProperty(value = "创建时间") 50 | private LocalDateTime createTime ; 51 | 52 | @ApiModelProperty(value = "描述") 53 | private String description; 54 | 55 | @ApiModelProperty(value = "首图地址") 56 | private String firstPicture; 57 | 58 | @ApiModelProperty(value = "原创") 59 | private String flag; 60 | 61 | @ApiModelProperty(value = "是否公开") 62 | private Boolean published; 63 | 64 | // @ApiModelProperty(value = "是否可以回复") 65 | // private Boolean recommend; 66 | 67 | @ApiModelProperty(value = "草稿") 68 | private Boolean shareStatement; 69 | 70 | @ApiModelProperty(value = "标题") 71 | private String title; 72 | 73 | @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "Asia/ShangHai") 74 | @ApiModelProperty(value = "更新时间") 75 | private LocalDateTime updateTime; 76 | 77 | @ApiModelProperty(value = "浏览量") 78 | private Integer views; 79 | 80 | @JsonSerialize(using = ToStringSerializer.class) //系统序列化时,保留相关精度 81 | @ApiModelProperty(value = "分类id") 82 | private Long typeId; 83 | 84 | @JsonSerialize(using = ToStringSerializer.class) //系统序列化时,保留相关精度 85 | @ApiModelProperty(value = "用户id") 86 | private Long userId; 87 | 88 | @JsonSerialize(using = ToStringSerializer.class) //系统序列化时,保留相关精度 89 | @ApiModelProperty(value = "评论次数") 90 | private Long commentCount; 91 | 92 | @ApiModelProperty(value = "逻辑删除") 93 | private Boolean isDelete; 94 | 95 | @TableField(exist = false) //查询时过滤非数据库字段 96 | @ApiModelProperty(value = "博客标签集合") 97 | private List16 | * 17 | *
18 | * 19 | * @author 关注公众号:小L星光 20 | * @since 2020-11-30 21 | */ 22 | @Data 23 | @EqualsAndHashCode(callSuper = false) 24 | @Accessors(chain = true) 25 | @ApiModel(value="TBlogTags对象", description="") 26 | public class TBlogTags implements Serializable { 27 | 28 | private static final long serialVersionUID = 1L; 29 | 30 | @JsonSerialize(using = ToStringSerializer.class) 31 | @ApiModelProperty(value = "博客id") 32 | private Long blogsId; 33 | 34 | @JsonSerialize(using = ToStringSerializer.class) 35 | @ApiModelProperty(value = "标签id") 36 | private Long tagsId; 37 | 38 | @TableField(exist = false) 39 | @ApiModelProperty(value = "博客对象") 40 | private TBlog tBlog; 41 | 42 | @TableField(exist = false) 43 | @ApiModelProperty(value = "标签对象") 44 | private TTag tTag; 45 | 46 | 47 | } 48 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/entity/TComment.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.entity; 2 | 3 | import java.time.LocalDateTime; 4 | import java.io.Serializable; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import com.baomidou.mybatisplus.annotation.TableField; 9 | import com.fasterxml.jackson.annotation.JsonFormat; 10 | import com.fasterxml.jackson.databind.annotation.JsonSerialize; 11 | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 12 | import io.swagger.annotations.ApiModel; 13 | import io.swagger.annotations.ApiModelProperty; 14 | import lombok.Data; 15 | import lombok.EqualsAndHashCode; 16 | import lombok.experimental.Accessors; 17 | 18 | /** 19 | *20 | * 21 | *
22 | * 23 | * @author 关注公众号:小L星光 24 | * @since 2020-11-30 25 | */ 26 | @Data 27 | @EqualsAndHashCode(callSuper = false) 28 | @Accessors(chain = true) 29 | @ApiModel(value="TComment对象", description="") 30 | public class TComment implements Serializable { 31 | 32 | private static final long serialVersionUID = 1L; 33 | 34 | @JsonSerialize(using = ToStringSerializer.class) //系统序列化时,保留相关精度 35 | @ApiModelProperty(value = "评论id") 36 | private Long id; 37 | 38 | @ApiModelProperty(value = "是否为管理员评论") 39 | private Boolean adminComment; 40 | 41 | @ApiModelProperty(value = "头像") 42 | private String avatar; 43 | 44 | @ApiModelProperty(value = "评论内容") 45 | private String content; 46 | 47 | @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "Asia/ShangHai") 48 | @ApiModelProperty(value = "创建时间") 49 | private LocalDateTime createTime; 50 | 51 | @ApiModelProperty(value = "邮箱") 52 | private String email; 53 | 54 | @ApiModelProperty(value = "ip地址") 55 | private String ip; 56 | 57 | @ApiModelProperty(value = "昵称") 58 | private String nickname; 59 | 60 | @JsonSerialize(using = ToStringSerializer.class) //系统序列化时,保留相关精度 61 | @ApiModelProperty(value = "博客id") 62 | private Long blogId; 63 | 64 | @JsonSerialize(using = ToStringSerializer.class) //系统序列化时,保留相关精度 65 | @ApiModelProperty(value = "父评论id") 66 | private Long parentCommentId; 67 | 68 | //回复评论 69 | @TableField(exist = false) //查询时过滤非数据库字段 70 | private List12 | * 13 | *
14 | * 15 | * @author 关注公众号:小L星光 16 | * @since 2020-11-30 17 | */ 18 | @Data 19 | @EqualsAndHashCode(callSuper = false) 20 | @Accessors(chain = true) 21 | @ApiModel(value="TContact对象", description="") 22 | public class TContact implements Serializable { 23 | 24 | private static final long serialVersionUID = 1L; 25 | 26 | @ApiModelProperty(value = "主键id") 27 | private Long id; 28 | 29 | @ApiModelProperty(value = "邮箱") 30 | private String email; 31 | 32 | @ApiModelProperty(value = "微信支付二维码") 33 | private String payByWechat; 34 | 35 | @ApiModelProperty(value = "支付宝二维码") 36 | private String payByZhi; 37 | 38 | @ApiModelProperty(value = "qq账号") 39 | private String qq; 40 | 41 | @ApiModelProperty(value = "微信号") 42 | private String wechat; 43 | 44 | @ApiModelProperty(value = "微信二维码") 45 | private String wechatCode; 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/entity/TLinks.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.entity; 2 | 3 | import java.time.LocalDateTime; 4 | import java.io.Serializable; 5 | 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | import com.fasterxml.jackson.databind.annotation.JsonSerialize; 8 | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 9 | import io.swagger.annotations.ApiModel; 10 | import io.swagger.annotations.ApiModelProperty; 11 | import lombok.Data; 12 | import lombok.EqualsAndHashCode; 13 | import lombok.experimental.Accessors; 14 | 15 | /** 16 | *17 | * 18 | *
19 | * 20 | * @author 关注公众号:小L星光 21 | * @since 2020-11-30 22 | */ 23 | @Data 24 | @EqualsAndHashCode(callSuper = false) 25 | @Accessors(chain = true) 26 | @ApiModel(value="TLinks对象", description="") 27 | public class TLinks implements Serializable { 28 | 29 | private static final long serialVersionUID = 1L; 30 | 31 | @JsonSerialize(using = ToStringSerializer.class) //系统序列化时,保留相关精度 32 | @ApiModelProperty(value = "主键id") 33 | private Long id; 34 | 35 | @ApiModelProperty(value = "博客地址") 36 | private String blogAddress; 37 | 38 | @ApiModelProperty(value = "博客名称") 39 | private String blogName; 40 | 41 | @ApiModelProperty(value = "首图") 42 | private String pictureAddress; 43 | 44 | @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "Asia/ShangHai") 45 | @ApiModelProperty(value = "创建时间") 46 | private LocalDateTime createTime; 47 | 48 | } 49 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/entity/TRole.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import java.io.Serializable; 5 | import io.swagger.annotations.ApiModel; 6 | import io.swagger.annotations.ApiModelProperty; 7 | import lombok.Data; 8 | import lombok.EqualsAndHashCode; 9 | import lombok.experimental.Accessors; 10 | 11 | /** 12 | *13 | * 14 | *
15 | * 16 | * @author 关注公众号:小L星光 17 | * @since 2020-11-30 18 | */ 19 | @Data 20 | @EqualsAndHashCode(callSuper = false) 21 | @Accessors(chain = true) 22 | @ApiModel(value="TRole对象", description="") 23 | public class TRole implements Serializable { 24 | 25 | private static final long serialVersionUID = 1L; 26 | 27 | @ApiModelProperty(value = "角色id") 28 | private Long id; 29 | 30 | @ApiModelProperty(value = "角色名") 31 | private String name; 32 | 33 | @ApiModelProperty(value = "角色中文名") 34 | @TableField("nameZh") 35 | private String nameZh; 36 | 37 | 38 | } 39 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/entity/TTag.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.entity; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | import com.baomidou.mybatisplus.annotation.TableField; 7 | import com.fasterxml.jackson.databind.annotation.JsonSerialize; 8 | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 9 | import io.swagger.annotations.ApiModel; 10 | import io.swagger.annotations.ApiModelProperty; 11 | import lombok.Data; 12 | import lombok.EqualsAndHashCode; 13 | import lombok.experimental.Accessors; 14 | 15 | /** 16 | *17 | * 18 | *
19 | * 20 | * @author 关注公众号:小L星光 21 | * @since 2020-11-30 22 | */ 23 | @Data 24 | @EqualsAndHashCode(callSuper = false) 25 | @Accessors(chain = true) 26 | @ApiModel(value="TTag对象", description="") 27 | public class TTag implements Serializable { 28 | 29 | private static final long serialVersionUID = 1L; 30 | 31 | @JsonSerialize(using = ToStringSerializer.class) 32 | @ApiModelProperty(value = "主键id") 33 | private Long id; 34 | 35 | @ApiModelProperty(value = "颜色") 36 | private String color; 37 | 38 | @ApiModelProperty(value = "名称") 39 | private String name; 40 | 41 | @TableField(exist = false) //查询时过滤非数据库字段 42 | @ApiModelProperty(value = "博客标签集合") 43 | private List15 | * 16 | *
17 | * 18 | * @author 关注公众号:小L星光 19 | * @since 2020-11-30 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = false) 23 | @Accessors(chain = true) 24 | @ApiModel(value="TTraffic对象", description="") 25 | public class TTraffic implements Serializable { 26 | 27 | private static final long serialVersionUID = 1L; 28 | 29 | @ApiModelProperty(value = "id") 30 | @TableId(value = "id", type = IdType.AUTO) 31 | private Long id; 32 | 33 | @ApiModelProperty(value = "创建时间") 34 | private LocalDateTime createTime; 35 | 36 | @ApiModelProperty(value = "ip地址") 37 | private String ip; 38 | 39 | 40 | } 41 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/entity/TType.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.entity; 2 | 3 | import java.io.Serializable; 4 | import java.util.UUID; 5 | 6 | import com.baomidou.mybatisplus.annotation.TableField; 7 | import com.fasterxml.jackson.annotation.JsonProperty; 8 | import com.fasterxml.jackson.databind.annotation.JsonSerialize; 9 | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 10 | import io.swagger.annotations.ApiModel; 11 | import io.swagger.annotations.ApiModelProperty; 12 | import lombok.Data; 13 | import lombok.EqualsAndHashCode; 14 | import lombok.experimental.Accessors; 15 | 16 | /** 17 | *18 | * 19 | *
20 | * 21 | * @author 关注公众号:小L星光 22 | * @since 2020-11-30 23 | */ 24 | @Data 25 | @EqualsAndHashCode(callSuper = false) 26 | @Accessors(chain = true) 27 | @ApiModel(value="TType对象", description="") 28 | public class TType implements Serializable { 29 | 30 | private static final long serialVersionUID = 1L; 31 | 32 | @JsonSerialize(using = ToStringSerializer.class) 33 | @ApiModelProperty(value = "分类id") 34 | private Long id; 35 | 36 | @ApiModelProperty(value = "分类名称") 37 | private String name; 38 | 39 | @TableField(exist = false) //查询时过滤非数据库字段 40 | private Integer countType; 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/entity/TUser.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.entity; 2 | 3 | import java.time.LocalDateTime; 4 | import java.io.Serializable; 5 | import java.util.ArrayList; 6 | import java.util.Collection; 7 | import java.util.List; 8 | 9 | import io.swagger.annotations.ApiModel; 10 | import io.swagger.annotations.ApiModelProperty; 11 | import lombok.Data; 12 | import lombok.EqualsAndHashCode; 13 | import lombok.experimental.Accessors; 14 | import org.springframework.security.core.GrantedAuthority; 15 | import org.springframework.security.core.authority.SimpleGrantedAuthority; 16 | import org.springframework.security.core.userdetails.UserDetails; 17 | 18 | /** 19 | *20 | * 21 | *
22 | * 23 | * @author 关注公众号:小L星光 24 | * @since 2020-11-30 25 | */ 26 | @Data 27 | @EqualsAndHashCode(callSuper = false) 28 | @Accessors(chain = true) 29 | @ApiModel(value="TUser对象", description="") 30 | public class TUser implements Serializable,UserDetails { 31 | 32 | private static final long serialVersionUID = 1L; 33 | 34 | @ApiModelProperty(value = "用户id") 35 | private Long id; 36 | 37 | @ApiModelProperty(value = "头像") 38 | private String avatar; 39 | 40 | @ApiModelProperty(value = "创建时间") 41 | private LocalDateTime createTime; 42 | 43 | @ApiModelProperty(value = "邮箱") 44 | private String email; 45 | 46 | @ApiModelProperty(value = "昵称") 47 | private String nickname; 48 | 49 | @ApiModelProperty(value = "密码") 50 | private String password; 51 | 52 | @ApiModelProperty(value = "角色") 53 | private Integer type; 54 | 55 | @ApiModelProperty(value = "更新时间") 56 | private LocalDateTime updateTime; 57 | 58 | @ApiModelProperty(value = "用户名") 59 | private String username; 60 | 61 | private List12 | * 13 | *
14 | * 15 | * @author 关注公众号:小L星光 16 | * @since 2020-11-30 17 | */ 18 | @Data 19 | @EqualsAndHashCode(callSuper = false) 20 | @Accessors(chain = true) 21 | @ApiModel(value="TUserRole对象", description="") 22 | public class TUserRole implements Serializable { 23 | 24 | private static final long serialVersionUID = 1L; 25 | 26 | @ApiModelProperty(value = "用户角色id") 27 | private Integer id; 28 | 29 | @ApiModelProperty(value = "用户id") 30 | private Integer uid; 31 | 32 | @ApiModelProperty(value = "角色id") 33 | private Integer rid; 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/entity/Tcount.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.entity; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | import lombok.experimental.Accessors; 6 | 7 | @Data 8 | @EqualsAndHashCode(callSuper = false) 9 | @Accessors(chain = true) 10 | public class Tcount { 11 | private static final long serialVersionUID = 1L; 12 | private Integer blogCount; 13 | private Integer viewCount; 14 | private Long commentCount; 15 | private Long messageCount; 16 | } 17 | -------------------------------------------------------------------------------- /xlblog/src/main/java/com/xlblog/blog/form/BlogForm.java: -------------------------------------------------------------------------------- 1 | package com.xlblog.blog.form; 2 | 3 | import com.baomidou.mybatisplus.core.toolkit.StringUtils; 4 | import com.xlblog.blog.utils.RespBean; 5 | 6 | import java.util.HashMap; 7 | import java.util.List; 8 | 9 | /** 10 | * 表单校验 11 | */ 12 | public class BlogForm { 13 | public static RespBean check(HashMap12 | * Mapper 接口 13 | *
14 | * 15 | * @author 关注公众号:小L星光 16 | * @since 2020-11-30 17 | */ 18 | public interface TBlogMapper extends BaseMapper8 | * Mapper 接口 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TBlogTagsMapper extends BaseMapper11 | * Mapper 接口 12 | *
13 | * 14 | * @author 关注公众号:小L星光 15 | * @since 2020-11-30 16 | */ 17 | public interface TCommentMapper extends BaseMapper8 | * Mapper 接口 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TContactMapper extends BaseMapper8 | * Mapper 接口 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TLinksMapper extends BaseMapper8 | * Mapper 接口 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TRoleMapper extends BaseMapper10 | * Mapper 接口 11 | *
12 | * 13 | * @author 关注公众号:小L星光 14 | * @since 2020-11-30 15 | */ 16 | public interface TTagMapper extends BaseMapper8 | * Mapper 接口 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TTrafficMapper extends BaseMapper10 | * Mapper 接口 11 | *
12 | * 13 | * @author 关注公众号:小L星光 14 | * @since 2020-11-30 15 | */ 16 | public interface TTypeMapper extends BaseMapper9 | * Mapper 接口 10 | *
11 | * 12 | * @author 关注公众号:小L星光 13 | * @since 2020-11-30 14 | */ 15 | public interface TUserMapper extends BaseMapper8 | * Mapper 接口 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TUserRoleMapper extends BaseMapper12 | * 服务类 13 | *
14 | * 15 | * @author 关注公众号:小L星光 16 | * @since 2020-11-30 17 | */ 18 | public interface TBlogService extends IService8 | * 服务类 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TBlogTagsService extends IService11 | * 服务类 12 | *
13 | * 14 | * @author 关注公众号:小L星光 15 | * @since 2020-11-30 16 | */ 17 | public interface TCommentService extends IService8 | * 服务类 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TContactService extends IService9 | * 服务类 10 | *
11 | * 12 | * @author 关注公众号:小L星光 13 | * @since 2020-11-30 14 | */ 15 | public interface TLinksService extends IService8 | * 服务类 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TRoleService extends IService9 | * 服务类 10 | *
11 | * 12 | * @author 关注公众号:小L星光 13 | * @since 2020-11-30 14 | */ 15 | public interface TTagService extends IService8 | * 服务类 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TTrafficService extends IService11 | * 服务类 12 | *
13 | * 14 | * @author 关注公众号:小L星光 15 | * @since 2020-11-30 16 | */ 17 | public interface TTypeService extends IService8 | * 服务类 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | public interface TUserRoleService extends IService8 | * 服务类 9 | *
10 | * 11 | * @author 关注公众号:小L星光 12 | * @since 2020-11-30 13 | */ 14 | 15 | public interface TUserService extends IService11 | * 服务实现类 12 | *
13 | * 14 | * @author 关注公众号:小L星光 15 | * @since 2020-11-30 16 | */ 17 | @Service 18 | public class TBlogTagsServiceImpl extends ServiceImpl22 | * 服务实现类 23 | *
24 | * 25 | * @author 关注公众号:小L星光 26 | * @since 2020-11-30 27 | */ 28 | @Service 29 | public class TCommentServiceImpl extends ServiceImpl11 | * 服务实现类 12 | *
13 | * 14 | * @author 关注公众号:小L星光 15 | * @since 2020-11-30 16 | */ 17 | @Service 18 | public class TContactServiceImpl extends ServiceImpl18 | * 服务实现类 19 | *
20 | * 21 | * @author 关注公众号:小L星光 22 | * @since 2020-11-30 23 | */ 24 | @Service 25 | public class TLinksServiceImpl extends ServiceImpl11 | * 服务实现类 12 | *
13 | * 14 | * @author 关注公众号:小L星光 15 | * @since 2020-11-30 16 | */ 17 | @Service 18 | public class TRoleServiceImpl extends ServiceImpl18 | * 服务实现类 19 | *
20 | * 21 | * @author 关注公众号:小L星光 22 | * @since 2020-11-30 23 | */ 24 | @Service 25 | public class TTagServiceImpl extends ServiceImpl11 | * 服务实现类 12 | *
13 | * 14 | * @author 关注公众号:小L星光 15 | * @since 2020-11-30 16 | */ 17 | @Service 18 | public class TTrafficServiceImpl extends ServiceImpl18 | * 服务实现类 19 | *
20 | * 21 | * @author 关注公众号:小L星光 22 | * @since 2020-11-30 23 | */ 24 | @Service 25 | public class TTypeServiceImpl extends ServiceImpl11 | * 服务实现类 12 | *
13 | * 14 | * @author 关注公众号:小L星光 15 | * @since 2020-11-30 16 | */ 17 | @Service 18 | public class TUserRoleServiceImpl extends ServiceImpl16 | * 服务实现类 17 | *
18 | * 19 | * @author 关注公众号:小L星光 20 | * @since 2020-11-30 21 | */ 22 | @Service 23 | public class TUserServiceImpl extends ServiceImplEmail:1556187290@qq.com
13 |QQ:1556187290
14 | 15 |文章总数:{{blogCount}} 篇
36 |访问总数:{{viewCount}} 次
37 |评论总数:{{commentCount}} 条
38 |留言总数:{{messageCount}} 条
39 | 40 | 41 |