佳能:感动常在
记得很早之前看过的一个广告:男子拿着妻子的相机发呆,父亲尝试安慰着他,然后接过相机给他拍了张照片,突然他进去了相机的世界,相机里的他一直给父亲做手势,直到父亲翻到了最后一张照片,那一张照片有他的妻子,如愿以偿,男子遇到了他去世的妻子,男子快速在手上写着什么,父亲满含泪水,把照片放大打印出来,手上写的是 Leave me…
系列文章目录
- 项目搭建
- App登录及网关
- App文章
- 自媒体平台(博主后台)
- 内容审核(自动)
文章目录
- 系列文章目录
- 一、需求分析
- 二、表结构分析
- 1. 导入数据库
- 2. 实体类
- ⑴. 管理员用户信息表
- ⑵. APP实名认证信息表
- 三、后台管理端
- 1. 创建模块
- 2. 引导类
- 3. 微服务配置文件
- 4. 日志配置文件
- 5. Nacos
- 四、登录
- 1. 接口定义
- ⑴. 接口说明
- ⑵. Dto
- 2. 功能实现
- ⑴. Controller
- ⑵. Mapper
- ⑶. service
- ⑷. Impl
- ⑸. Controller
- 五、gateway网关
- 1. 创建模块
- 2. 引导类
- 3. 配置文件
- 4. nacos配置
- 六、测试
- 七、nginx
- 1. 导入nginx(这里的nginx包异常)
- 2. 配置nginx.conf文件
- 3. 测试
一、需求分析
- 登录: 用户名和密码、加盐验证
- 敏感词管理: 游客只有查看的权限
- 频道管理: 增删改、分页查询、模糊查询
- 用户审核管理: 分页查询、审核失败、审核成功
- 自媒体文章人工审核: 分页查询、文章详情、审核失败、审核成功
二、表结构分析
1. 导入数据库
sql文件链接:https://pan.baidu.com/s/1ZditX-YHPKppYt3GveFfbA?pwd=abcd
2. 实体类
⑴. 管理员用户信息表
新建 heima-leadnews-model\src\main\java\com\heima\model\admin\pojos\AdUser.java
文件:
/**
* <p>
* 管理员用户信息表
* </p>
* @author itheima
*/
@Data
@TableName("ad_user")
public class AdUser implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private Integer id;
/**
* 登录用户名
*/
@TableField("name")
private String name;
/**
* 登录密码
*/
@TableField("password")
private String password;
/**
* 盐
*/
@TableField("salt")
private String salt;
/**
* 昵称
*/
@TableField("nickname")
private String nickname;
/**
* 头像
*/
@TableField("image")
private String image;
/**
* 手机号
*/
@TableField("phone")
private String phone;
/**
* 状态
0 暂时不可用
1 永久不可用
9 正常可用
*/
@TableField("status")
private Integer status;
/**
* 邮箱
*/
@TableField("email")
private String email;
/**
* 最后一次登录时间
*/
@TableField("login_time")
private Date loginTime;
/**
* 创建时间
*/
@TableField("created_time")
private Date createdTime;
}
⑵. APP实名认证信息表
新建 heima-leadnews-model\src\main\java\com\heima\model\admin\pojos\ApUserRealname.java
文件:
/**
* <p>
* APP实名认证信息表
* </p>
* @author itheima
*/
@Data
@TableName("ap_user_realname")
public class ApUserRealname implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 账号ID
*/
@TableField("user_id")
private Integer userId;
/**
* 用户名称
*/
@TableField("name")
private String name;
/**
* 资源名称
*/
@TableField("idno")
private String idno;
/**
* 正面照片
*/
@TableField("font_image")
private String fontImage;
/**
* 背面照片
*/
@TableField("back_image")
private String backImage;
/**
* 手持照片
*/
@TableField("hold_image")
private String holdImage;
/**
* 活体照片
*/
@TableField("live_image")
private String liveImage;
/**
* 状态
0 创建中
1 待审核
2 审核失败
9 审核通过
*/
@TableField("status")
private Short status;
/**
* 拒绝原因
*/
@TableField("reason")
private String reason;
/**
* 创建时间
*/
@TableField("created_time")
private Date createdTime;
/**
* 提交时间
*/
@TableField("submited_time")
private Date submitedTime;
/**
* 更新时间
*/
@TableField("updated_time")
private Date updatedTime;
}
三、后台管理端
1. 创建模块
2. 引导类
新建 heima-leadnews-service\heima-leadnews-admin\src\main\java\com\heima\admin\AdminApplication.java
文件:
@SpringBootApplication
@EnableDiscoveryClient // 集成当前的注册中心
@MapperScan("com.heima.admin.mapper") // 集成myBatisPlus 扫描mapper
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
}
3. 微服务配置文件
新建 heima-leadnews-service\heima-leadnews-admin\src\main\resources\bootstrap.yml
文件:
server:
port: 51809
spring:
application:
name: leadnews-admin
cloud:
nacos:
discovery:
server-addr: 192.168.200.130:8848
config:
server-addr: 192.168.200.130:8848
file-extension: yml
4. 日志配置文件
新建 heima-leadnews-service\heima-leadnews-admin\src\main\resources\logback.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定义日志文件的存储地址,使用绝对路径-->
<property name="LOG_HOME" value="d:/logs"/>
<!-- Console 输出设置 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/leadnews.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 异步输出 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="FILE"/>
</appender>
<logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.springframework.boot" level="debug"/>
<root level="info">
<!--<appender-ref ref="ASYNC"/>-->
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
5. Nacos
新建 leadnews-admin
配置:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/leadnews_admin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username: root
password: 123456
# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
# 设置别名包扫描路径,通过该属性可以给包中的类注册别名
type-aliases-package: com.heima.model.admin.pojos
四、登录
1. 接口定义
⑴. 接口说明
接口地址:/login/in
请求方式:POST
请求数据类型:application/json
响应数据类型:*/*
接口描述:
请求示例:
{
"name": "",
"password": ""
}
请求参数:
参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
---|---|---|---|---|---|
dto | dto | body | true | AdUserDto | AdUserDto |
name | true | string | |||
password | true | string |
响应状态:
状态码 | 说明 | schema |
---|---|---|
200 | OK | ResponseResult |
201 | Created | |
401 | Unauthorized | |
403 | Forbidden | |
404 | Not Found |
响应参数:
参数名称 | 参数说明 | 类型 | schema |
---|---|---|---|
code | integer(int32) | integer(int32) | |
data | object | ||
errorMessage | string | ||
host | string |
响应示例:
{
"host":null,
"code":1002,
"errorMessage":"数据不存在",
"data":null
}
{
"host":null,
"code":2,
"errorMessage":"密码错误",
"data":null
}
{
"host":null,
"code":200,
"errorMessage":"操作成功",
"data":{
"user":{
"id":"3",
"name":"guest",
"password":"",
"salt":"",
"nickname":"gu",
"image":null,
"phone":"13412345676",
"status":1,
"email":"guest@qq.com",
"loginTime":1596092403000,
"createdTime":1596092406000
},
"token":"..."
}
}
⑵. Dto
新建 heima-leadnews-model\src\main\java\com\heima\model\admin\dtos\AdLoginDto.java
文件:
@Data
public class AdLoginDto {
/**
* 用户名
*/
private String name;
/**
* 密码
*/
private String password;
}
2. 功能实现
⑴. Controller
新建 heima-leadnews-service\heima-leadnews-admin\src\main\java\com\heima\admin\controller\v1\LoginController.java
文件:
@RestController
@RequestMapping("/api/v1/admin/login")
public class LoginController {
@PostMapping("/in")
public ResponseResult login(@RequestBody AdLoginDto adLoginDto) {
return null;
}
}
⑵. Mapper
新建 heima-leadnews-service\heima-leadnews-admin\src\main\java\com\heima\admin\mapper\AdUserMapper.java
文件:
public interface AdUserMapper extends BaseMapper<AdUser> {
}
⑶. service
新建 heima-leadnews-service\heima-leadnews-admin\src\main\java\com\heima\admin\service\AdUserService.java
文件:
public interface AdUserService {
/**
* 后台系统登录
* @param adminLoginDto
* @return
*/
public ResponseResult login(AdLoginDto adminLoginDto);
}
⑷. Impl
新建 heima-leadnews-service\heima-leadnews-admin\src\main\java\com\heima\admin\service\impl\AdUserServiceImpl.java
文件:
@Service
@Slf4j
public class AdUserServiceImpl extends ServiceImpl<AdUserMapper, AdUser> implements AdUserService {
/**
* 后台系统登录
* @param dto
* @return
*/
@Override
public ResponseResult login(AdLoginDto dto) {
//1.检查参数
if (StringUtils.isBlank(dto.getName()) || StringUtils.isBlank(dto.getPassword())) {
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "用户名或密码为空");
}
//2.查询用户
AdUser adUser = getOne(Wrappers.<AdUser>lambdaQuery().eq(AdUser::getName, dto.getName()));
if (adUser == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
}
//3.比对密码
String salt = adUser.getSalt();
String pswd = dto.getPassword();
pswd = DigestUtils.md5DigestAsHex((pswd + salt).getBytes());
if (pswd.equals(adUser.getPassword())) {
//4.返回数据 jwt
Map<String, Object> map = new HashMap<>();
map.put("token", AppJwtUtil.getToken(adUser.getId().longValue()));
adUser.setSalt("");
adUser.setPassword("");
map.put("user", adUser);
return ResponseResult.okResult(map);
} else {
return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
}
}
}
⑸. Controller
编辑 heima-leadnews-service\heima-leadnews-admin\src\main\java\com\heima\admin\controller\v1\LoginController.java
文件:
@RestController
@RequestMapping("/api/v1/admin/login")
public class LoginController {
@Autowired
private AdUserService adUserService;
@PostMapping("/in")
public ResponseResult login(@RequestBody AdLoginDto adLoginDto) {
return adUserService.login(adLoginDto);
}
}
五、gateway网关
1. 创建模块
- heima-leadnews-gateway 网关
- heima-leadnews-admin-gateway 系统管理平台
- heima-leadnews-wemedia-gateway 用户自媒体平台
- heima-leadnews-app-gateway 用户移动APP
2. 引导类
新建 heima-leadnews-gateway\heima-leadnews-admin-gateway\src\main\java\com\heima\admin\gateway\AdminGatewayApplication.java
文件:
@SpringBootApplication
@EnableDiscoveryClient
public class AdminGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(AdminGatewayApplication.class, args);
}
}
3. 配置文件
新建 heima-leadnews-gateway\heima-leadnews-admin-gateway\src\main\resources\bootstrap.yml
文件:
server:
port: 51603
spring:
application:
name: leadnews-admin-gateway
cloud:
nacos:
discovery:
server-addr: 192.168.200.130:8848
config:
server-addr: 192.168.200.130:8848
file-extension: yml
4. nacos配置
nocos地址: http://192.168.200.130:8848/nacos
新建 leadnews-admin-gateway
配置:
spring:
cloud:
gateway:
globalcors:
add-to-simple-url-handler-mapping: true
cors-configurations:
'[/**]': # 匹配所有请求
allowedOrigins: "*" #跨域处理 允许所有的域
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
- OPTION
routes:
# 平台管理
- id: service_6001
uri: lb://leadnews-admin
predicates:
- Path=/service_6001/**
filters:
- StripPrefix= 1
六、测试
启动项目网关和后台微服务两个服务,使用postman进行测试
网关后的请求地址: http://localhost:51809/api/v1/admin/login/in
七、nginx
1. 导入nginx(这里的nginx包异常)
资源链接: https://pan.baidu.com/s/1R7akEh2ceQNH8CL2pwV-uA?pwd=abcd
解压至 nginx 目录下(同自媒体端nginx)
2. 配置nginx.conf文件
(nginx包中)新建 D:\code\hm\leadnews\config\nginx-1.18.0\conf\leadnews.conf\heima-leadnews-admin.conf
文件:
upstream heima-admin-gateway{
server localhost:51603;
}
server {
listen 8803;
location / {
root D:/code/hm/leadnews/config/admin-web/;
index index.html;
}
location ~/service_6001/(.*) {
proxy_pass http://heima-admin-gateway/$1;
proxy_set_header HOST $host; # 不改变源请求头的值
proxy_pass_request_body on; #开启获取请求体
proxy_pass_request_headers on; #开启获取请求头
proxy_set_header X-Real-IP $remote_addr; # 记录真实发出请求的客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息
}
}
3. 测试
启动nginx,启动后台微服务和后台网关,后台系统地址: http://localhost:8803/#/login