Skip to content

提供前端工程,只需要实现后端接口即可 项目以单体架构入手,先快速开发,不考虑项目优化,降低开发负担 开发完成后,开始优化项目,提升编程思维能力 比如页面静态化,缓存,云存储,日志等

Notifications You must be signed in to change notification settings

yacoding4325/blog-parent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

blog-parent

提供前端工程,只需要实现后端接口即可 项目以单体架构入手,先快速开发,不考虑项目优化,降低开发负担 开发完成后,开始优化项目,提升编程思维能力 比如页面静态化,缓存,云存储,日志等

spring boot 练手实战项目说明

码神之路网站所使用的博客,项目简单,需求明确,容易上手,非常适合做为练手级项目。

blog.mszlu.com

项目讲解说明:

  1. 提供前端工程,只需要实现后端接口即可
  2. 项目以单体架构入手,先快速开发,不考虑项目优化,降低开发负担
  3. 开发完成后,开始优化项目,提升编程思维能力
  4. 比如页面静态化,缓存,云存储,日志等
  5. docker部署上线
  6. 云服务器购买,域名购买,域名备案等

项目使用技术 :

springboot + mybatisplus+redis+mysql

1. 工程搭建

前端的工程:

npm install npm run build npm run dev

1.1 新建maven工程

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mszlu</groupId> <artifactId>blog-parent</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.0</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!-- 排除 默认使用的logback --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- log4j2 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/joda-time/joda-time --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.10</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

1.2 配置

#server server.port= 8888 spring.application.name=mszlu_blog # datasource spring.datasource.url=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&serverTimeZone=UTC spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #mybatis-plus mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus.global-config.db-config.table-prefix=ms_ 
package com.mszlu.blog.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration //扫包,将此包下的接口生成代理实现类,并且注册到spring容器中 @MapperScan("com.mszlu.blog.dao") public class MybatisPlusConfig { //分页插件 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }
package com.mszlu.blog.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { //跨域配置,不可设置为*,不安全, 前后端分离项目,可能域名不一致 //本地测试 端口不一致 也算跨域 registry.addMapping("/**").allowedOrigins("http://localhost:8080"); } }

1.3 启动类

package com.mszlu.blog; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class BlogApp { public static void main(String[] args) { SpringApplication.run(BlogApp.class,args); } }

2. 首页-文章列表

2.1 接口说明

接口url:/articles

请求方式:POST

请求参数:

参数名称 参数类型 说明
page int 当前页数
pageSize int 每页显示的数量

返回数据:

{ "success": true, "code": 200, "msg": "success", "data": [ { "id": 1, "title": "springboot介绍以及入门案例", "summary": "通过Spring Boot实现的服务,只需要依靠一个Java类,把它打包成jar,并通过`java -jar`命令就可以运行起来。\r\n\r\n这一切相较于传统Spring应用来说,已经变得非常的轻便、简单。", "commentCounts": 2, "viewCounts": 54, "weight": 1, "createDate": "2609-06-26 15:58", "author": "12", "body": null, "tags": [ { "id": 5, "avatar": null, "tagName": "444" }, { "id": 7, "avatar": null, "tagName": "22" }, { "id": 8, "avatar": null, "tagName": "11" } ], "categorys": null }, { "id": 9, "title": "Vue.js 是什么", "summary": "Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。", "commentCounts": 0, "viewCounts": 3, "weight": 0, "createDate": "2609-06-27 11:25", "author": "12", "body": null, "tags": [ { "id": 7, "avatar": null, "tagName": "22" } ], "categorys": null }, { "id": 10, "title": "Element相关", "summary": "本节将介绍如何在项目中使用 Element。", "commentCounts": 0, "viewCounts": 3, "weight": 0, "createDate": "2609-06-27 11:25", "author": "12", "body": null, "tags": [ { "id": 5, "avatar": null, "tagName": "444" }, { "id": 6, "avatar": null, "tagName": "33" }, { "id": 7, "avatar": null, "tagName": "22" }, { "id": 8, "avatar": null, "tagName": "11" } ], "categorys": null } ] }

2.2 编码

2.2.1 表结构

CREATE TABLE `blog`.`ms_article` ( `id` bigint(0) NOT NULL AUTO_INCREMENT, `comment_counts` int(0) NULL DEFAULT NULL COMMENT '评论数量', `create_date` bigint(0) NULL DEFAULT NULL COMMENT '创建时间', `summary` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '简介', `title` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标题', `view_counts` int(0) NULL DEFAULT NULL COMMENT '浏览数量', `weight` int(0) NOT NULL COMMENT '是否置顶', `author_id` bigint(0) NULL DEFAULT NULL COMMENT '作者id', `body_id` bigint(0) NULL DEFAULT NULL COMMENT '内容id', `category_id` int(0) NULL DEFAULT NULL COMMENT '类别id', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
CREATE TABLE `blog`.`ms_tag` ( `id` bigint(0) NOT NULL AUTO_INCREMENT, `article_id` bigint(0) NOT NULL, `tag_id` bigint(0) NOT NULL, PRIMARY KEY (`id`) USING BTREE, INDEX `article_id`(`article_id`) USING BTREE, INDEX `tag_id`(`tag_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
CREATE TABLE `blog`.`ms_sys_user` ( `id` bigint(0) NOT NULL AUTO_INCREMENT, `account` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '账号', `admin` bit(1) NULL DEFAULT NULL COMMENT '是否管理员', `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像', `create_date` bigint(0) NULL DEFAULT NULL COMMENT '注册时间', `deleted` bit(1) NULL DEFAULT NULL COMMENT '是否删除', `email` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱', `last_login` bigint(0) NULL DEFAULT NULL COMMENT '最后登录时间', `mobile_phone_number` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号', `nickname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '昵称', `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码', `salt` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '加密盐', `status` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
package com.mszlu.blog.dao.pojo; import lombok.Data; @Data public class Article { public static final int Article_TOP = 1; public static final int Article_Common = 0; private Long id; private String title; private String summary; private int commentCounts; private int viewCounts; /**  * 作者id  */ private Long authorId; /**  * 内容id  */ private Long bodyId; /**  *类别id  */ private Long categoryId; /**  * 置顶  */ private int weight = Article_Common; /**  * 创建时间  */ private Long createDate; }
package com.mszlu.blog.dao.pojo; import lombok.Data; @Data public class SysUser { private Long id; private String account; private Integer admin; private String avatar; private Long createDate; private Integer deleted; private String email; private Long lastLogin; private String mobilePhoneNumber; private String nickname; private String password; private String salt; private String status; }
package com.mszlu.blog.dao.pojo; import lombok.Data; @Data public class Tag { private Long id; private String avatar; private String tagName; }

2.2.2 Controller

package com.mszlu.blog.api; import com.mszlu.blog.dao.pojo.Article; import com.mszlu.blog.service.ArticleService; import com.mszlu.blog.vo.Archive; import com.mszlu.blog.vo.ArticleVo; import com.mszlu.blog.vo.Result; import com.mszlu.blog.vo.params.PageParams; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("articles") public class ArticleController { @Autowired private ArticleService articleService; //Result是统一结果返回 @PostMapping public Result articles(@RequestBody PageParams pageParams) { //ArticleVo 页面接收的数据 List<ArticleVo> articles = articleService.listArticlesPage(pageParams); return Result.success(articles); } }
package com.mszlu.blog.vo; import com.mszlu.blog.dao.pojo.Article; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor public class Result { private boolean success; private Integer code; private String msg; private Object data; public static Result success(Object data) { return new Result(true,200,"success",data); } public static Result fail(Integer code, String msg) { return new Result(false,code,msg,null); } }
package com.mszlu.blog.vo; import com.mszlu.blog.dao.pojo.ArticleBody; import com.mszlu.blog.dao.pojo.Category; import com.mszlu.blog.dao.pojo.SysUser; import com.mszlu.blog.dao.pojo.Tag; import lombok.Data; import java.util.List; @Data public class ArticleVo { private Long id; private String title; private String summary; private int commentCounts; private int viewCounts; private int weight; /**  * 创建时间  */ private String createDate; private String author; private ArticleBodyVo body; private List<TagVo> tags; private List<CategoryVo> categorys; }

2.2.3 Service

package com.mszlu.blog.service; import com.mszlu.blog.vo.Archive; import com.mszlu.blog.vo.ArticleVo; import com.mszlu.blog.vo.params.PageParams; import java.util.List; public interface ArticleService { List<ArticleVo> listArticlesPage(PageParams pageParams); }
package com.mszlu.blog.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mszlu.blog.dao.ArticleMapper; import com.mszlu.blog.dao.SysUserMapper; import com.mszlu.blog.dao.pojo.Article; import com.mszlu.blog.dao.pojo.SysUser; import com.mszlu.blog.dao.pojo.Tag; import com.mszlu.blog.service.ArticleService; import com.mszlu.blog.service.SysUserService; import com.mszlu.blog.service.TagsService; import com.mszlu.blog.vo.ArticleBodyVo; import com.mszlu.blog.vo.ArticleVo; import com.mszlu.blog.vo.TagVo; import com.mszlu.blog.vo.params.PageParams; import org.joda.time.DateTime; 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; @Service public class ArticleServiceImpl implements ArticleService { @Autowired private ArticleMapper articleMapper; @Autowired private SysUserService sysUserService; @Autowired private TagsService tagsService; public ArticleVo copy(Article article,boolean isAuthor,boolean isBody,boolean isTags){ ArticleVo articleVo = new ArticleVo(); BeanUtils.copyProperties(article, articleVo); if (isAuthor) { SysUser sysUser = sysUserService.findSysUserById(article.getAuthorId()); articleVo.setAuthor(sysUser.getNickname()); } articleVo.setCreateDate(new DateTime(article.getCreateDate()).toString("yyyy-MM-dd HH:mm")); if (isTags){ List<TagVo> tags = tagsService.findTagsByArticleId(article.getId()); articleVo.setTags(tags); } return articleVo; } private List<ArticleVo> copyList(List<Article> records,boolean isAuthor,boolean isBody,boolean isTags) { List<ArticleVo> articleVoList = new ArrayList<>(); for (Article article : records) { ArticleVo articleVo = copy(article,isAuthor,isBody,isTags); articleVoList.add(articleVo); } return articleVoList; } @Override public List<ArticleVo> listArticlesPage(PageParams pageParams) { QueryWrapper<Article> queryWrapper = new QueryWrapper<>(); Page<Article> page = new Page<>(pageParams.getPage(),pageParams.getPageSize()); Page<Article> articlePage = articleMapper.selectPage(page, queryWrapper); List<ArticleVo> articleVoList = copyList(articlePage.getRecords(),true,false,true); return articleVoList; } }
package com.mszlu.blog.service; import com.mszlu.blog.dao.pojo.SysUser; public interface UserService { SysUser findUserById(Long userId); }
package com.mszlu.blog.service.impl; import com.mszlu.blog.dao.SysUserMapper; import com.mszlu.blog.dao.pojo.SysUser; import com.mszlu.blog.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Autowired private SysUserMapper sysUserMapper; @Override public SysUser findUserById(Long userId) { SysUser sysUser = sysUserMapper.selectById(userId); if (sysUser == null) { sysUser = new SysUser(); sysUser.setNickname("码神之路"); } return sysUser; } }
package com.mszlu.blog.service; import com.mszlu.blog.dao.pojo.Tag; import com.mszlu.blog.vo.TagVo; import java.util.List; public interface TagsService { List<TagVo> findTagsByArticleId(Long id); }
package com.mszlu.blog.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.mszlu.blog.dao.TagMapper; import com.mszlu.blog.dao.pojo.Tag; import com.mszlu.blog.service.TagsService; import com.mszlu.blog.vo.TagVo; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @Service public class TagsServiceImpl implements TagsService { @Autowired private TagMapper tagMapper; public TagVo copy(Tag tag){ TagVo tagVo = new TagVo(); BeanUtils.copyProperties(tag,tagVo); return tagVo; } public List<TagVo> copyList(List<Tag> tagList){ List<TagVo> tagVoList = new ArrayList<>(); for (Tag tag : tagList) { tagVoList.add(copy(tag)); } return tagVoList; } @Override public List<TagVo> findTagsByArticleId(Long id) { List<Tag> tags = tagMapper.findTagsByArticleId(id); return copyList(tags); } }

2.2.4 Dao

package com.mszlu.blog.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mszlu.blog.dao.pojo.Article; import com.mszlu.blog.vo.ArticleVo; import java.util.List; public interface ArticleMapper extends BaseMapper<Article> { }
package com.mszlu.blog.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mszlu.blog.dao.pojo.Tag; import java.util.List; public interface TagMapper extends BaseMapper<Tag> { List<Tag> findTagsByArticleId(Long articleId); }
package com.mszlu.blog.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mszlu.blog.dao.pojo.SysUser; public interface SysUserMapper extends BaseMapper<SysUser> { }
<?xml version="1.0" encoding="UTF-8" ?> <!--MyBatis配置文件--> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mszlu.blog.dao.TagMapper"> <sql id="all"> id,avatar,tag_name as tagName </sql> <select id="findTagsByArticleId" parameterType="long" resultType="com.mszlu.blog.dao.pojo.Tag"> select <include refid="all" /> from ms_tag <where> id in (select tag_id from ms_article_tag where article_id = #{articleId}) </where> </select> </mapper>

2.2.5 测试

3. 首页-最热标签

3.1 接口说明

接口url:/tags/hot

请求方式:GET

请求参数:无

返回数据:

{ "success": true, "code": 200, "msg": "success", "data": [ { "id":1, "tagName":"4444" } ] }

3.2 编码

3.2.1 Controller

package com.mszlu.blog.api; import com.mszlu.blog.service.ArticleService; import com.mszlu.blog.service.TagsService; import com.mszlu.blog.vo.Archive; import com.mszlu.blog.vo.ArticleVo; import com.mszlu.blog.vo.Result; import com.mszlu.blog.vo.TagVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("tags") public class TagsController { @Autowired private TagsService tagsService; @GetMapping("/hot") public Result listHotTags() { int limit = 6; List<TagVo> tagVoList = tagsService.hot(limit); return Result.success(tagVoList); } }
package com.mszlu.blog.vo; import lombok.Data; @Data public class TagVo { private Long id; private String tagName; }

3.2.2 Service

package com.mszlu.blog.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.mszlu.blog.dao.TagMapper; import com.mszlu.blog.dao.pojo.Tag; import com.mszlu.blog.service.TagsService; import com.mszlu.blog.vo.TagVo; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @Service public class TagsServiceImpl implements TagsService { @Autowired private TagMapper tagMapper; public TagVo copy(Tag tag){ TagVo tagVo = new TagVo(); BeanUtils.copyProperties(tag,tagVo); return tagVo; } public List<TagVo> copyList(List<Tag> tagList){ List<TagVo> tagVoList = new ArrayList<>(); for (Tag tag : tagList) { tagVoList.add(copy(tag)); } return tagVoList; } @Override public List<TagVo> hot(int limit) { List<Long> hotsTagIds = tagMapper.findHotsTagIds(limit); if (CollectionUtils.isEmpty(hotsTagIds)){ return Collections.emptyList(); } List<Tag> tagList = tagMapper.findTagsByTagIds(hotsTagIds); return copyList(tagList); } }
package com.mszlu.blog.service; import com.mszlu.blog.vo.TagVo; import java.util.List; public interface TagsService { List<TagVo> hot(int limit); }

3.2.3 Dao

package com.mszlu.blog.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mszlu.blog.dao.pojo.Tag; import java.util.List; public interface TagMapper extends BaseMapper<Tag> { List<Tag> findTagsByTagIds(List<Long> tagIds); List<Long> findHotsTagIds(int limit); }
<?xml version="1.0" encoding="UTF-8" ?> <!--MyBatis配置文件--> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mszlu.blog.dao.TagMapper"> <sql id="all"> id,avatar,tag_name as tagName </sql> <select id="findTagsByTagIds" parameterType="list" resultType="com.mszlu.blog.dao.pojo.Tag"> select <include refid="all" /> from ms_tag where id in <foreach collection="tagIds" item="tagId" separator="," open="(" close=")"> #{tagId} </foreach> </select> <select id="findHotsTagIds" parameterType="int" resultType="long"> select tag_id from ms_article_tag at group by tag_id order by count(1) desc limit #{size} </select> </mapper>

3.2.4 测试

About

提供前端工程,只需要实现后端接口即可 项目以单体架构入手,先快速开发,不考虑项目优化,降低开发负担 开发完成后,开始优化项目,提升编程思维能力 比如页面静态化,缓存,云存储,日志等

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published