# 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', '测试3测试3', '2022-08-27');
INSERT INTO `article` VALUES (12, '测试3', 1, 'http://lookupstar.top', 1, '测试3', '测试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/)