# blog-java **Repository Path**: whales-s/blog-java ## Basic Information - **Project Name**: blog-java - **Description**: 前后端分离项目--后端代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-07 - **Last Updated**: 2022-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # blog-java ## 前后端分离项目 --后端 *** > 版本:lookupstar 博客系统1.0 > > 该项目是一个简单的前后端分离的博客网站,实现用户登录,发布文章,修改文章,删除文章的功能。后端使用spring boot框架,集整合mybatis plus 等,前端使用vue ,安装mavon-editor富文本编辑器。使用MySQL数据库,有article和user两张表。 > > [项目演示](http://122.9.13.245:8091/) #### 0. 前言 ##### 技术栈: * spring boot * mybatis plus * mysql * jdk 8 ##### 开发工具: * IDEA * navicat #### 1. 新建springboot项目 使用IEDA创建springboot项目,版本2.7.2 ```xml org.springframework.boot spring-boot-starter-parent 2.7.2 ``` #### 2. 整合 mybatis plus ​ 源代码中的pom.xml文件添加了mybatis plus 代码生成器需要用到的模板,该项目并未用到代码生成器 > [ MyBatis-Plus 官网](https://baomidou.com/) ```xml com.baomidou mybatis-plus-boot-starter 3.5.2 ``` #### 3. 实体类entity ​ 数据库表结构 ```sql SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for article -- ---------------------------- DROP TABLE IF EXISTS `article`; CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `theme` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '题目', `userid` int(255) DEFAULT NULL COMMENT '作者id', `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '来源地址', `original` tinyint(255) DEFAULT NULL COMMENT '是否原创,1原创,0其他', `description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci COMMENT '描述,形容', `text` text CHARACTER SET utf8 COLLATE utf8_unicode_ci COMMENT '内容', `time` date DEFAULT NULL COMMENT '编辑日期', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of article -- ---------------------------- INSERT INTO `article` VALUES (2, '标题', 1, 'http://lookupstar.top', 1, 'null22', '帝高阳之苗裔兮2,朕皇考曰伯庸3。\n摄提贞于孟陬兮4,惟庚寅吾以降5。\n皇览揆余初度兮6,肇锡余以嘉名7。\n名余曰正则兮8,字余曰灵均9。\n纷吾既有此内美兮10,又重之以脩能11。\n扈江离与辟芷兮12,纫秋兰以为佩13。\n汩余若将不及兮14,恐年岁之不吾与15。\n朝搴阰之木兰兮16,夕揽洲之宿莽17。\n日月忽其不淹兮18,春与秋其代序19。\n惟草木之零落兮20,恐美人之迟暮21。\n不抚壮而弃秽兮22,何不改乎此度23?\n乘骐骥以驰骋兮24,来吾道夫先路25!\n昔三后之纯粹兮26,固众芳之所在27。\n杂申椒与菌桂兮28,岂维纫夫蕙茝29!\n彼尧舜之耿介兮30,既遵道而得路31。\n何桀纣之猖披兮32,夫唯捷径以窘步33。\n说操筑于傅岩兮278,武丁用而不疑279。\n吕望之鼓刀兮280,遭周文而得举281。\n宁戚之讴歌兮282,齐桓闻以该辅283。\n及年岁之未晏兮284,时亦犹其未央285。\n国无人莫我知兮350,又何怀乎故都!\n既莫足与为美政兮351,吾将从彭咸之所居352! [1] [2] [3] ', '2022-08-13'); INSERT INTO `article` VALUES (3, '测试2', 1, 'http://lookupstar.top', 1, '测试2', NULL, '2022-08-27'); INSERT INTO `article` VALUES (4, '测试2', 1, 'http://lookupstar.top', 1, '简介', NULL, '2022-08-27'); INSERT INTO `article` VALUES (5, '测试2', 1, 'http://lookupstar.top', 1, '简介', NULL, '2022-08-27'); INSERT INTO `article` VALUES (6, '测试2', 1, 'http://lookupstar.top', 1, '简介', NULL, '2022-08-30'); INSERT INTO `article` VALUES (7, '测试2\r\n测试2\r\n\r\n标题\r\n标题', 1, 'http://lookupstar.top', 1, '简介', NULL, '2022-08-27'); INSERT INTO `article` VALUES (8, '标题', 1, 'http://lookupstar.top', 1, '简介', '帝高阳之苗裔兮2,朕皇考曰伯庸3。\n摄提贞于孟陬兮4,惟庚寅吾以降5。\n皇览揆余初度兮6,肇锡余以嘉名7。\n名余曰正则兮8,字余曰灵均9。\n纷吾既有此内美兮10,又重之以脩能11。\n扈江离与辟芷兮12,纫秋兰以为佩13。\n汩余若将不及兮14,恐年岁之不吾与15。\n朝搴阰之木兰兮16,夕揽洲之宿莽17。\n日月忽其不淹兮18,春与秋其代序19。\n惟草木之零落兮20,恐美人之迟暮21。\n不抚壮而弃秽兮22,何不改乎此度23?\n乘骐骥以驰骋兮24,来吾道夫先路25!\n昔三后之纯粹兮26,固众芳之所在27。\n杂申椒与菌桂兮28,岂维纫夫蕙茝29!\n彼尧舜之耿介兮30,既遵道而得路31。\n何桀纣之猖披兮32,夫唯捷径以窘步33。\n说操筑于傅岩兮278,武丁用而不疑279。\n吕望之鼓刀兮280,遭周文而得举281。\n宁戚之讴歌兮282,齐桓闻以该辅283。\n及年岁之未晏兮284,时亦犹其未央285。\n国无人莫我知兮350,又何怀乎故都!\n既莫足与为美政兮351,吾将从彭咸之所居352! [1] [2] [3] ', '2022-07-27'); INSERT INTO `article` VALUES (9, '标题', 1, 'http://lookupstar.top', 1, '简介', '帝高阳之苗裔兮2,朕皇考曰伯庸3。\n摄提贞于孟陬兮4,惟庚寅吾以降5。\n皇览揆余初度兮6,肇锡余以嘉名7。\n名余曰正则兮8,字余曰灵均9。\n纷吾既有此内美兮10,又重之以脩能11。\n扈江离与辟芷兮12,纫秋兰以为佩13。\n汩余若将不及兮14,恐年岁之不吾与15。\n朝搴阰之木兰兮16,夕揽洲之宿莽17。\n日月忽其不淹兮18,春与秋其代序19。\n惟草木之零落兮20,恐美人之迟暮21。\n不抚壮而弃秽兮22,何不改乎此度23?\n乘骐骥以驰骋兮24,来吾道夫先路25!\n昔三后之纯粹兮26,固众芳之所在27。\n杂申椒与菌桂兮28,岂维纫夫蕙茝29!\n彼尧舜之耿介兮30,既遵道而得路31。\n何桀纣之猖披兮32,夫唯捷径以窘步33。\n说操筑于傅岩兮278,武丁用而不疑279。\n吕望之鼓刀兮280,遭周文而得举281。\n宁戚之讴歌兮282,齐桓闻以该辅283。\n及年岁之未晏兮284,时亦犹其未央285。\n国无人莫我知兮350,又何怀乎故都!\n既莫足与为美政兮351,吾将从彭咸之所居352! [1] [2] [3] ', '2022-08-27'); INSERT INTO `article` VALUES (10, 'http://localhost:8090/article', 1, 'http://lookupstar.top', 1, '简介', '**粗体**http://localhost:8090/article', '2022-08-27'); INSERT INTO `article` VALUES (11, '测试3', 1, 'http://lookupstar.top', 1, '测试3', '![Abstract1.jpg](1)测试3测试3', '2022-08-27'); INSERT INTO `article` VALUES (12, '测试3', 1, 'http://lookupstar.top', 1, '测试3', '![Abstract1.jpg](1)测试3测试3', '2022-08-18'); INSERT INTO `article` VALUES (13, 'http://localhost:8080/BlogEdit', 1, 'http://lookupstar.top', 1, '简介', 'http://localhost:8080/BlogEdit', '2022-08-16'); INSERT INTO `article` VALUES (14, '测试2\r\n测试2\r\n\r\n标题\r\n标题', 1, 'http://lookupstar.top', 1, '简介', '', '2022-08-09'); INSERT INTO `article` VALUES (15, '测试2\r\n测试2\r\n\r\n标题\r\n标题测试2\r\n测试2\r\n\r\n标题', 1, 'http://lookupstar.top', 1, '简介', '', '2022-08-17'); INSERT INTO `article` VALUES (16, '测试2\r\n测试2\r\n\r\n标题\r\n标题', 1, 'http://lookupstar.top', 1, '简介', '', '2022-08-11'); INSERT INTO `article` VALUES (17, '测试2\r\n测试2\r\n\r\n标题\r\n标题', 1, 'http://lookupstar.top', 1, '简介', '', '2022-08-09'); INSERT INTO `article` VALUES (18, '测试2\r\n测试2\r\n\r\n标题\r\n标题', 1, 'http://lookupstar.top', 1, '简介', '', '2022-08-07'); INSERT INTO `article` VALUES (19, '测试', 1, 'http://lookupstar.top', 1, '测试', '测试', '2022-08-07'); INSERT INTO `article` VALUES (20, '测·搜索', 1, 'http://lookupstar.top\r\nhttp://lookupstar.top\r\nhttp://lookupstar.top\r\nhttp://lookupstar.top\r\nhttp://lookupstar.top\r\nhttp://lookupstar.top\r\nhttp://lookupstar.top', 1, '测·搜索', '测·搜索', '2022-08-07'); INSERT INTO `article` VALUES (21, '### # 一级标题3', NULL, '', 1, '### # 一级标题3', '### # 一级标题3\n### 一级标题3', '2022-08-28'); INSERT INTO `article` VALUES (22, '44 ### 3 ### 3', NULL, '', 1, '\n### 3\n### 3', '### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3\n### 3', '2022-08-28'); INSERT INTO `article` VALUES (23, '抓取FTP服务账号密码', NULL, '', 1, '抓取FTP服务账号密码', '(合天网安实验室\nWindows7系统\nFTPserver软件\nWireshark抓包工具\n1. 启动Wireshark抓包工具\n \n2. 连接FTP服务器\n \n3. 停止Wireshark抓包\n \n4. 分析数据包,找到FTP服务账号密码\n \n', '2022-09-03'); INSERT INTO `article` VALUES (24, '强强强强', NULL, '', 1, '强强强强qq', '强强强强强强强强强强', '2022-09-07'); -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `time` date DEFAULT NULL, `role` int(255) DEFAULT NULL COMMENT '角色,默认1,管理员0', `state` int(10) DEFAULT NULL COMMENT '账号是否可用,可用为1,不可用为0', PRIMARY KEY (`id`, `username`) USING BTREE, UNIQUE INDEX `username`(`username`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, '测试1', '测试1', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (2, '测试2', '测试2', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (3, '测试3', '测试2', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (4, '测试4', '测试3', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (5, '测试5', '测试3', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (6, '测试6', '测试4', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (7, '测试7', '测试7', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (8, '测试8', '测试8', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (10, '测试9', '测试9', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (11, '测试11', '测试9', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (14, 'admin', '5f4dcc3b5aa765d61d8327deb882cf99', '2022-07-31', 1, 1); INSERT INTO `user` VALUES (15, 'admin2', 'password', '2022-07-31', 1, 1); INSERT INTO `user` VALUES (16, '测试16', '测试19', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (17, 'admin3', 'password', '2022-07-31', 1, 1); INSERT INTO `user` VALUES (18, '测试55', '测试19', '2022-07-27', 1, 1); INSERT INTO `user` VALUES (19, '测试18', '测试3', '2022-07-27', 1, 1); ``` 实体类的开发可以自动通过工具手工生成get/set方法,然后覆盖toString()方法,方便调试,等等。不过这一套操作书写很繁琐,有对应的工具可以帮助我们简化开发,介绍一个小工具,lombok。 ​ Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发,SpringBoot目前默认集成了lombok技术,并提供了对应的版本控制,所以只需要提供对应的坐标即可,在pom.xml中添加lombok的坐标。 ```xml org.projectlombok lombok true ``` 使用lombok可以通过一个注解@Data完成一个实体类对应的getter,setter,toString,equals,hashCode等操作的快速添加 ```java package com.lookupstar.entity; import lombok.Data; /** * Author whales * Data 2022/7/27 14:04 */ @Data public class Article { private Integer id; private String theme; private Integer userid; private String url; private Integer original; private String text; private String description; private String time; } ``` #### 4. 数据层mapper——基础CRUD ​ 数据层开发使用MyBatisPlus技术,数据源Druid。 1. 导入MyBatisPlus与Druid对应的starter,当然mysql的驱动不能少 ```xml mysql mysql-connector-java runtime com.baomidou mybatis-plus-boot-starter 3.5.2 com.alibaba druid 1.1.12 ``` 2. 配置数据库连接相关的数据源配置 ```yaml #druid 数据库连接池 数据源 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root url: jdbc:mysql://localhost:3306/lookupstar thymeleaf: mode: html encoding: UTF-8 servlet: content-type: text/html cache: false ``` 3. 使用MyBatisPlus的标准通用接口BaseMapper加速开发,注意@Mapper和泛型的指定 ```java package com.lookupstar.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lookupstar.entity.Article; import org.apache.ibatis.annotations.Mapper; /** * Author whales * Data 2022/7/27 14:10 */ @Mapper public interface ArticleMapper extends BaseMapper
{ } ``` 4. 制作测试类测试结果 ```java package com.lookupstar.mapper; import com.lookupstar.entity.Article; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.text.SimpleDateFormat; import java.util.Date; /** * Author whales * Data 2022/7/27 14:13 */ @SpringBootTest public class ArticleMapperTest { @Autowired ArticleMapper articleMapper; @Test void textInster(){ Date dNow = new Date(); SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Article article = new Article(); article.setTheme("标题"); article.setUserid(1); article.setUrl("http://lookupstar.top"); article.setOriginal(1); article.setText("帝高阳之苗裔兮2,朕皇考曰伯庸3。\n" + "摄提贞于孟陬兮4,惟庚寅吾以降5。\n" + "皇览揆余初度兮6,肇锡余以嘉名7。\n" + "名余曰正则兮8,字余曰灵均9。\n" + "纷吾既有此内美兮10,又重之以脩能11。\n" + "扈江离与辟芷兮12,纫秋兰以为佩13。\n" + "汩余若将不及兮14,恐年岁之不吾与15。\n" + "朝搴阰之木兰兮16,夕揽洲之宿莽17。\n" + "日月忽其不淹兮18,春与秋其代序19。\n" + "惟草木之零落兮20,恐美人之迟暮21。\n" + "不抚壮而弃秽兮22,何不改乎此度23?\n" + "乘骐骥以驰骋兮24,来吾道夫先路25!\n" + "昔三后之纯粹兮26,固众芳之所在27。\n" + "杂申椒与菌桂兮28,岂维纫夫蕙茝29!\n" + "彼尧舜之耿介兮30,既遵道而得路31。\n" + "何桀纣之猖披兮32,夫唯捷径以窘步33。\n" + "说操筑于傅岩兮278,武丁用而不疑279。\n" + "吕望之鼓刀兮280,遭周文而得举281。\n" + "宁戚之讴歌兮282,齐桓闻以该辅283。\n" + "及年岁之未晏兮284,时亦犹其未央285。\n" + "国无人莫我知兮350,又何怀乎故都!\n" + "既莫足与为美政兮351,吾将从彭咸之所居352! [1] [2] [3] "); article.setTime(ft.format(dNow)); articleMapper.insert(article); } @Test void textUpdate(){ Date dNow = new Date(); SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Article article = new Article(); article.setId(1); article.setTheme("标题"); article.setUserid(1); article.setUrl("http://lookupstar.top"); article.setOriginal(1); article.setText("何离心之可同兮320?吾将远逝以自疏321。\n" + "邅吾道夫昆仑兮322,路脩远以周流。\n" + "扬云霓之晻蔼兮323,鸣玉鸾之啾啾324。\n" + "朝发轫于天津兮325,夕余至乎西极326。\n" + "凤皇翼其承旗兮327,高翱翔之翼翼328。\n" + "忽吾行此流沙兮329,遵赤水而容与330。\n" + "麾蛟龙使梁津兮331,诏西皇使涉予332。\n" + "路脩远以多艰兮,腾众车使径待333。\n" + "路不周以左转兮334,指西海以为期335。\n" + "屯余车其千乘兮336,齐玉轪而并驰337。\n" + "驾八龙之婉婉兮338,载云旗之委蛇339。\n" + "抑志而弭节兮340,神高驰之邈邈341。\n" + "奏九歌而舞韶兮342,聊假日以媮乐343。\n" + "陟升皇之赫戏兮344,忽临睨夫旧乡345。\n" + "仆夫悲余马怀兮346,蜷局顾而不行347。\n" + "乱曰348:已矣哉349!\n" + "国无人莫我知兮350,又何怀乎故都!\n" + "既莫足与为美政兮351,吾将从彭咸之所居352! [1] [2] [3] "); article.setTime(ft.format(dNow)); articleMapper.updateById(article); } @Test void textSelectAll(){ System.out.println(articleMapper.selectList(null)); } @Test void textDelete(){ articleMapper.deleteById(1); } } ``` #### 5.查看MyBatisPlus运行日志 在控制台输出执行期运行的SQL语句 ```yaml # 数据库表名前缀 mybatis-plus: global-config: db-config: table-prefix: #设置表名通用前缀 id-type: auto #设置主键id字段的生成策略为参照数据库设定的策略,当前数据库设置id生成策略为自增 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #查看MyBatisPlus运行日志 ``` #### 6. 业务层service 业务层接口快速开发 ```java package com.lookupstar.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.lookupstar.entity.Article; /** * Author whales * Data 2022/7/27 17:13 */ public interface ArticleService extends IService
{ //添加非通用操作API接口 IPage
getPage(int currentPage, int pageSize); } ``` 业务层实现类快速开发 ```java package com.lookupstar.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.lookupstar.entity.Article; import com.lookupstar.mapper.ArticleMapper; import com.lookupstar.service.ArticleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * Author whales * Data 2022/7/27 17:14 */ @Service public class ArticleServiceImpl extends ServiceImpl implements ArticleService { @Autowired private ArticleMapper articleMapper; @Override public IPage
getPage(int currentPage, int pageSize) { IPage page = new Page(currentPage, pageSize); articleMapper.selectPage(page, null); return page; } // // @Autowired // private ArticleService articleService; } ``` #### 7. 表现层开发controller ```java package com.lookupstar.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.lookupstar.controller.util.R; import com.lookupstar.controller.util.Result; import com.lookupstar.entity.Article; import com.lookupstar.service.ArticleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * Author whales * Data 2022/8/1 13:27 */ @RestController @RequestMapping("/api/article") public class ArticleController { /** * R <> 消息统一处理 */ @Autowired private ArticleService articleService; @GetMapping public R> getAll(){ return R.success(articleService.list()); } // 根据文章id查询文章,文章详情页面 @GetMapping("{id}") public R
getById(@PathVariable Integer id){ return R.success(articleService.getById(id)); } // 根据文章id ,修改文章 @PutMapping("{id}") public R Update(@RequestBody Article article){ return R.success(articleService.updateById(article)); } // 删除文章 @DeleteMapping("{id}") public R delete(@PathVariable Integer id) { return R.success(articleService.removeById(id)); } // 新增文章 @PostMapping public R save(@RequestBody Article article) { return R.success(articleService.save(article)); } // 分页查询 @GetMapping("{currentPage}/{pageSize}") public R> getPage(@PathVariable int currentPage, @PathVariable int pageSize) { return R.success(articleService.getPage(currentPage, pageSize)); } /** * * Result 统一处理 * @return */ @GetMapping("/article2") public Result getAll2(){ return new Result(true,articleService.list()); } } ``` 使用Postman测试 #### 8. 表现层消息一致性处理Result util包下创建R用于消息一致性处理 ```java package com.lookupstar.controller.util; import lombok.Data; import java.util.HashMap; import java.util.Map; /** * Author whales * Data 2022/7/30 23:50 */ @Data public class R { private Integer code; // 1成功,0和其它数字为失败 private String msg; //错误信息 private T data; //数据 private String token; //token // private Map map = new HashMap(); //动态数据 public static R success(T object) { R r = new R(); r.data = object; r.code = 1; return r; } public static R error(String msg) { R r = new R(); r.msg = msg; r.code = 0; return r; } // // public R add(String key, Object value) { // this.map.put(key, value); // return this; // } public static R login(T object,String token){ R r=new R(); r.data = object; r.code = 1; r.token =token; return r; } } ``` #### 介绍 {**以下是 Gitee 平台说明,您可以替换此简介** Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)