TH9-搭建后台系统
创始人
2024-03-28 07:23:11
0

TH9-搭建后台系统

    • 1、项目架构
      • 1.1 概述
      • 1.2 API网关
      • 1.2.1 搭建网关
        • 依赖
        • 引导类
        • 跨域问题配置类
        • 配置文件
      • 1.2.2 配置鉴权管理器
      • 1.3 Nacos配置中心
        • 1.3.1 添加依赖
        • 1.3.2 添加bootstrap.yml配置
        • 1.3.3 nacos添加配置
    • 2、后台系统
      • 2.1 概述
      • 2.2 环境前端搭建
        • 2.2.1 导入数据库
        • 2.2.2 导入静态页面
          • nginx安装
          • 测试
      • 2.3 搭建后端环境
        • 2.3.1 Admin实体类
        • 2.3.2 导入项目
        • 2.3.3 nacos中加入配置
      • 2.4 管理员登录
        • 2.4.1 生成验证码
          • SystemController
        • 2.4.2 用户登录
          • SystemController
          • SystemService
        • 2.4.3 获取用户资料
          • AdminVO
          • SystemController
          • SystemService
    • 3、用户管理
      • 3.1 需求分析
      • 3.2 查询用户列表
        • ManageController
        • ManagerService
        • UserInfoAPI
      • 3.3 查看用户详情
        • ManageController
        • ManagerService
      • 3.4 查看视频列表
        • ManageController
        • ManagerService
      • 3.5 查看动态列表
        • ManageController
        • ManagerService

1、项目架构

1.1 概述

API网关有很多实现方式,我们通过SpringCloud Gateway实现

使用Nacos作为配置中心
在这里插入图片描述

1.2 API网关

1.2.1 搭建网关

依赖

org.springframework.cloudspring-cloud-starter-gatewaycom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoveryorg.springframework.bootspring-boot-starter-actuatorcom.itheimatanhua-commons1.0-SNAPSHOT

引导类

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

跨域问题配置类

package com.itheima.gateway.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;/*** 跨域支持*/
@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedHeader("*");UrlBasedCorsConfigurationSource source =new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

配置文件

server:port: 8888
spring:profiles:active: prodapplication:name: tanhua-gatewaycloud:nacos:discovery:server-addr: 192.168.136.160:8848gateway:globalcors:add-to-simple-url-handler-mapping: truecorsConfigurations:'[/**]':allowedHeaders: "*"allowedOrigins: "*"allowedMethods:- GET- POST- DELETE- PUT- OPTION
server:port: 8888
spring:profiles:active: prodapplication:name: tanhua-gatewaycloud:nacos:discovery:server-addr: 192.168.136.160:8848gateway:globalcors:add-to-simple-url-handler-mapping: truecorsConfigurations:'[/**]':allowedHeaders: "*"allowedOrigins: "*"allowedMethods:- GET- POST- DELETE- PUT- OPTIONroutes:# 探花系统- id: tanhua-app-serveruri: lb://tanhua-app-serverpredicates:- Path=/app/**filters:- StripPrefix= 1# 后台系统- id: tanhua-adminuri: lb://tanhua-adminpredicates:- Path=/admin/**filters:- StripPrefix= 1
gateway:excludedUrls: /user/login,/user/loginVerification,/system/users/verification,/system/users/login

1.2.2 配置鉴权管理器

@Component
public class AuthFilter implements GlobalFilter, Ordered {//排除的链接@Value("#{'${gateway.excludedUrls}'.split(',')}")private List excludedUrls;@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {String url = exchange.getRequest().getURI().getPath();System.out.println( "url:"+ url);//排除特殊接口 不校验if(excludedUrls.contains(url)){return chain.filter(exchange);}String token = exchange.getRequest().getHeaders().getFirst("Authorization");if(!StringUtils.isEmpty(token)){token = token.replace("Bearer ", "");}ServerHttpResponse response = exchange.getResponse();//2、使用工具类,判断token是否有效boolean verifyToken = JwtUtils.verifyToken(token);//3、如果token失效,返回状态码401,拦截if(!verifyToken) {Map responseData = new HashMap<>();responseData.put("errCode", 401);responseData.put("errMessage", "用户未登录");return responseError(response,responseData);}return chain.filter(exchange);}//响应错误数据private Mono responseError(ServerHttpResponse response,Map responseData){// 将信息转换为 JSONObjectMapper objectMapper = new ObjectMapper();byte[] data = new byte[0];try {data = objectMapper.writeValueAsBytes(responseData);} catch (JsonProcessingException e) {e.printStackTrace();}// 输出错误信息到页面DataBuffer buffer = response.bufferFactory().wrap(data);response.setStatusCode(HttpStatus.UNAUTHORIZED);response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");return response.writeWith(Mono.just(buffer));}/*** 设置过滤器的执行顺序*/@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}
}

1.3 Nacos配置中心

Nacos提供了注册中心和配置管理的能力,使用Nacos可以快速实现服务发现、服务配置管理等需求

在这里插入图片描述

1.3.1 添加依赖

com.alibaba.cloudspring-cloud-starter-alibaba-nacos-config

1.3.2 添加bootstrap.yml配置

server:port: 8888
spring:profiles:active: prodapplication:name: tanhua-gatewaycloud:nacos:discovery:server-addr: 192.168.136.160:8848config:server-addr: 192.168.136.160:8848file-extension: yml

1.3.3 nacos添加配置

server:port: 9997
spring:cloud:gateway:globalcors:add-to-simple-url-handler-mapping: truecorsConfigurations:'[/**]':allowedHeaders: "*"allowedOrigins: "*"allowedMethods:- GET- POST- DELETE- PUT- OPTIONroutes:# 用户微服务- id: tanhua-app-serveruri: lb://tanhua-app-serverpredicates:- Path=/app/**filters:- StripPrefix= 1# 文章微服务- id: tanhua-adminuri: lb://tanhua-adminpredicates:- Path=/admin/**filters:- StripPrefix= 1
gateway:excludedUrls: /user/login,/user/loginVerification,/system/users/verification,/system/users/login

2、后台系统

2.1 概述

探花交友APP建立的后台管理系统,目的是完成探花交友项目的业务闭环,主要功能包括:用户管理、动态管理、审核管理以及系统管理。

在这里插入图片描述

课程中实现的功能有:登录、首页、用户管理、动态审核。

2.2 环境前端搭建

2.2.1 导入数据库

将资料中的tanhua-admin.sql引入到mysql数据库中

在这里插入图片描述

2.2.2 导入静态页面

后台系统也是采用前后端分离的方式,前端采用Vue.js实现,关于前端系统我们不进行实现,拿来直接使用。

在这里插入图片描述

nginx安装

将资料中提供的nginx解压到合适的位置

在这里插入图片描述

其中html目录中为,vue编译后的所有页面。

修改Nginx的/conf/nginx.conf配置文件:

    server {listen       8088;  #请求端口server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;}location  /management {proxy_pass http://127.0.0.1:18083/;  #转发后台地址}#....略}
  • 访问vue页面的路径:localhost:8088
  • 其中内部调用java服务器的路径 : http://127.0.0.1:18083/
测试

双击nginx.exe,待启动完成后访问:http://127.0.0.1:8088即可访问后台项目

2.3 搭建后端环境

2.3.1 Admin实体类

//后台系统的管理员对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Admin implements Serializable {/*** id*/private Long id;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 头像*/private String avatar;
}

2.3.2 导入项目

将今日资料中的tanhua-admin模块导入到探花项目中,完成开发。

在这里插入图片描述

2.3.3 nacos中加入配置

DataID:tanhua-admin-prod.yml

spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/tanhua-admin?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=falseusername: rootpassword: rootrabbitmq:host: 192.168.136.160port: 5672username: guestpassword: guest    redis:host: 192.168.136.160port: 6379cloud:  #nacos配置nacos:discovery:server-addr: 192.168.136.160:8848
dubbo:    #dubbo配置registry:address: spring-cloud://localhostconsumer:check: falseretries: 0protocols:dubbo:port: -1#配置短信平台信息
tanhua:  #手机验证码,咱们自己注册(不要白嫖)sms:signName: 物流云商templateCode: SMS_106590012accessKey: LTAI4GKgob9vZ53k2SZdyAC7secret: LHLBvXmILRoyw0niRSBuXBZewQ30laoss:accessKey: LTAI4GKgob9vZ53k2SZdyAC7secret: LHLBvXmILRoyw0niRSBuXBZewQ30laendpoint: oss-cn-beijing.aliyuncs.combucketName: tanhua143url: https://tanhua143.oss-cn-beijing.aliyuncs.comaip:appId: 22837663apiKey: nA43galrxfUZTGtYRVK8F8tbsecretKey: MQp567q4nGnIKfniURa2XAw8bT1SlPE3huanxin:appkey: 1110201018107234#tanhuaclientId: YXA6nxJJ_pdEQ_eYUlqcRicS4wclientSecret: YXA6GMUxVEZhAvxlMn4OvHSXbWuEUTE
#mybaits-plus
mybatis-plus:global-config:db-config:table-prefix: tb_    #数据库表前缀id-type: auto        #数据库表主键的策略

2.4 管理员登录

后台系统的登录模块独立于APP端的登录。

2.4.1 生成验证码

验证码:页面端发送请求到服务端。服务端生成一个验证码的图片,已流的形式返回

SystemController
/*** 生成图片验证码*/
@GetMapping("/verification")
public void verification(String uuid, HttpServletResponse response) throws IOException {//设置响应参数response.setDateHeader("Expires", 0);// Set standard HTTP/1.1 no-cache headers.response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");// Set IE extended HTTP/1.1 no-cache headers (use addHeader).response.addHeader("Cache-Control", "post-check=0, pre-check=0");// Set standard HTTP/1.0 no-cache header.response.setHeader("Pragma", "no-cache");response.setContentType("image/jpeg");//1、通过工具类生成验证码对象(图片数据和验证码信息)LineCaptcha captcha = CaptchaUtil.createLineCaptcha(299, 97);String code = captcha.getCode();  //1234//2、调用service,将验证码存入到redisredisTemplate.opsForValue().set(Constants.CAP_CODE+uuid,code);//3、通过输出流输出验证码captcha.write(response.getOutputStream());
}

2.4.2 用户登录

SystemController
/*** 用户登录:*/
@PostMapping("/login")
public ResponseEntity login(@RequestBody Map map) {Map retMap = adminService.login(map);return ResponseEntity.ok(retMap);
}
SystemService
//用户登录
public ResponseEntity login(Map map) {//1、获取请求的参数(username,password,verificationCode(验证码),uuid)String username = (String) map.get("username");String password = (String) map.get("password");String verificationCode = (String) map.get("verificationCode");String uuid = (String) map.get("uuid");//2、判断用户名或者密码是否为空if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {//用户名或者密码为空//throw new BusinessException("用户名或者密码为空");Map map1 = new HashMap();map.put("message","用户名或者密码为空");return ResponseEntity.status(500).body(map1);}//3、判断验证码是否正确if (StringUtils.isEmpty(username)) {//验证码为空throw new BusinessException("验证码为空");}//从redis中获取验证码String key = Constants.CAP_CODE+uuid;String code = redisTemplate.opsForValue().get(key);if (StringUtils.isEmpty(code) || !code.equals(verificationCode)) {//验证码错误throw new BusinessException("验证码错误");}redisTemplate.delete(key);//4、根据用户名查询用户QueryWrapper qw = new QueryWrapper<>();qw.eq("username", username);Admin admin = adminMapper.selectOne(qw);//5、判断用户是否存在,密码是否一致password = SecureUtil.md5(password); //md5加密if(admin == null || !admin.getPassword().equals(password)) {//用户名错误或者密码不一致throw new BusinessException("用户名或者密码");}//6、通过JWT生成tokenMap claims = new HashMap();claims.put("username", username);claims.put("id", admin.getId());String token = JwtUtils.getToken(claims);//8、构造返回值Map res = new HashMap();res.put("token", token);return ResponseEntity.ok(res);
}

2.4.3 获取用户资料

AdminVO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdminVo {/*** id*/private String id;/*** 用户名*/private String username;/*** 头像*/private String avatar;public static AdminVo init(Admin admin) {AdminVo vo = new AdminVo();vo.setAvatar(admin.getAvatar());vo.setUsername(admin.getUsername());vo.setId(admin.getId().toString());return vo;}}
SystemController
/*** 获取用户的信息*/
@PostMapping("/profile")
public ResponseEntity profile() {AdminVo vo = adminService.profile();return ResponseEntity.ok(vo);
}
SystemService
//获取当前用户的用户资料
public AdminVo profile() {Long id = AdminHolder.getId();Admin admin = adminMapper.selectById(id);return AdminVo.init(admin);
}

3、用户管理

3.1 需求分析

用户管理:对探花交友客户端注册用户的管理(查询业务数据),使用Dubbo的形式调用tanhua-dubbo-service获取响应的数据结果

3.2 查询用户列表

ManageController

@GetMapping("/users")
public ResponseEntity users(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pagesize) {PageResult result = managerService.findAllUsers(page,pagesize);return ResponseEntity.ok(result);
}

ManagerService

public ResponseEntity findAllUsers(Integer page, Integer pagesize) {//1、调用API分页查询数据列表   IpageIPage iPage = userInfoApi.findAll(page,pagesize);//2、需要将Ipage转化为PageResultPageResult result = new PageResult(page, pagesize, iPage.getTotal(), iPage.getRecords());//3、构造返回值return ResponseEntity.ok(result);
}

UserInfoAPI

@Override
public IPage findAll(Integer page, Integer pagesize) {return userInfoMapper.selectPage(new Page(page,pagesize),null);
}

3.3 查看用户详情

ManageController

/*** 根据id查询用户详情*/
@GetMapping("/users/{userId}")
public ResponseEntity findById(@PathVariable("userId") Long userId) {return managerService.findById(userId);
}

ManagerService

//根据id查询用户详情
public ResponseEntity findById(Long userId) {UserInfo info = userInfoApi.findById(userId);return ResponseEntity.ok(info);
}

3.4 查看视频列表

ManageController

/*** 查询指定用户发布的所有视频列表*/
@GetMapping("/videos")
public ResponseEntity videos(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pagesize,Long uid ) {PageResult result = managerService.findAllVideos(page,pagesize,uid);return ResponseEntity.ok(result)
}

ManagerService

//根据用户id分页查询此用户发布的所有视频列表
public PageResult findAllVideos(Integer page, Integer pagesize, Long userId) {//1、调用API查询视频列表(PageResult

3.5 查看动态列表

ManageController

@GetMapping("/messages")
public ResponseEntity messages(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pagesize,Long uid,Integer state ) {PageResult result = managerService.findAllMovements(page,pagesize,uid,state);return ResponseEntity.ok(result)
}

ManagerService

//查询指定用户发布的所有动态
public ResponseEntity findAllMovements(Integer page, Integer pagesize, Long userId, Integer state) {//1、调用API查询 :(PageResult)PageResult result = movementApi.findByUserId(userId,page,pagesize);//2、一个Publsh构造一个MovementsList items = ( List)result.getItems();List list = new ArrayList<>();for (Movement item : items) {UserInfo userInfo = userInfoApi.findById(item.getUserId());MovementsVo vo = MovementsVo.init(userInfo, item);list.add(vo);}//3、构造返回值result.setItems(list);return ResponseEntity.ok(result);
}

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...