在境外做网站网站,福州建设厅网站,大连做网站报价,网站开发排期表一、项目介绍
1. 项目背景介绍
项目概述
类似于今日头条#xff0c;是一个新闻资讯类项目。
随着智能手机的普及#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快#xff0c;很多人只能利用碎片时间来获取信息#xff0c;因此#xff0c;对于移动资讯客…一、项目介绍
1. 项目背景介绍
项目概述
类似于今日头条是一个新闻资讯类项目。
随着智能手机的普及人们更加习惯于通过手机来看新闻。由于生活节奏的加快很多人只能利用碎片时间来获取信息因此对于移动资讯客户端的需求也越来越高。黑马头条项目正是在这样背景下开发出来。黑马头条项目采用当下火热的微服务大数据技术架构实现。本项目主要着手于获取最新最热新闻资讯通过大数据分析用户喜好精确推送咨询新闻。 业务说明 项目术语 2. 技术栈说明
基础层 服务层 3. 课程概述
收获 项目课程大纲 二、nacos
1. 服务器环境准备
前提条件安装VWware
①解压课前资料提供的虚拟机镜像放到你喜欢的位置 ②打开VWware点击“打开虚拟机”选择CentosOS7-hmtt.vmx文件 ③修改虚拟网络配置子网IP改为192.168.200.0 ④修改系统的网络适配器 ⑤开启虚拟机使用MobaXterm连接虚拟机
用户名root 密码itcast 2. nacos安装
①docker拉取镜像
docker pull nacos/nacos-server:1.2.0
②创建容器
docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8848 nacos/nacos-server:1.2.0
MODEstandalone单机版--restartalways开机启动-p 8848:8848映射端口-d创建一个守护式容器在后台运行
③访问地址http://192.168.200.130:8848/nacos 三、初始工程搭建
1. 环境准备
项目依赖环境
JDK 1.8Intellij Ideamaven-3.6.1Git
步骤
①把课前资料的heima-leadnews.zip拷贝解压到一个不带空格和中文的目录下使用idea打开 如果识别不出来是SpringBoot工程打开一个pom.xml文件右键 add as maven project
②把pom.xml里报错的信息改成如下 ③把Encoding改为UTF-8 ④修改maven仓库为课前资料里提供的MAVEN仓库 2. 项目结构 common模块主要定义了一些全局异常类 feign-api模块主要定义了远程调用接口
gateway模块管理网关微服务
model模块实体类
service模块微服务工程
test模块项目中常用的测试
utils模块项目中常用的工具类 四、登录
1. 需求分析
用户点击开始使用登录后的用户权限较大可以查看也可以操作点赞、关注、评论
用户点击不登录先看看游客只有查看的权限 2. 表结构分析
关于app端用户相关的内容较多可以单独设置一个库leadnews_user
①启动MySQL服务连接数据库执行课前资料里提供的SQL脚本 ②user表放到model包下的user.pojos包
package com.heima.model.user.pojos;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.io.Serializable;
import java.util.Date;/*** p* APP用户信息表* /p** author itheima*/
Data
TableName(ap_user)
public class ApUser implements Serializable {private static final long serialVersionUID 1L;/*** 主键*/TableId(value id, type IdType.AUTO)private Integer id;/*** 密码、通信等加密盐*/TableField(salt)private String salt;/*** 用户名*/TableField(name)private String name;/*** 密码,md5加密*/TableField(password)private String password;/*** 手机号*/TableField(phone)private String phone;/*** 头像*/TableField(image)private String image;/*** 0 男1 女2 未知*/TableField(sex)private Boolean sex;/*** 0 未1 是*/TableField(is_certification)private Boolean certification;/*** 是否身份认证*/TableField(is_identity_authentication)private Boolean identityAuthentication;/*** 0正常1锁定*/TableField(status)private Boolean status;/*** 0 普通用户1 自媒体人2 大V*/TableField(flag)private Short flag;/*** 注册时间*/TableField(created_time)private Date createdTime;}
手动加密md5 随机字符串
md5是不可逆加密md5相同的密码每次加密都一样不太安全。在md5的基础上手动加盐salt处理。 3. app登录
①在service模块下新建如下 bootstrap.yml配置如下
server:port: 51801
spring:application:name: leadnews-usercloud:nacos:discovery:server-addr: 192.168.200.130:8848config:server-addr: 192.168.200.130:8848file-extension: yml
在nacos中创建配置文件 leadnews-user注意修改数据库连接密码
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/leadnews_user?useUnicodetruecharacterEncodingUTF-8serverTimezoneUTCuseSSLfalseusername: rootpassword: 123456
# 设置Mapper接口所对应的XML文件位置如果你在Mapper接口中有自定义方法需要进行该配置
mybatis-plus:mapper-locations: classpath*:mapper/*.xml# 设置别名包扫描路径通过该属性可以给包中的类注册别名type-aliases-package: com.heima.model.user.pojos logback.xml
?xml version1.0 encodingUTF-8?configuration!--定义日志文件的存储地址,使用绝对路径--property nameLOG_HOME valuee:/logs/!-- Console 输出设置 --appender nameCONSOLE classch.qos.logback.core.ConsoleAppenderencoder!--格式化输出%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符--pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/patterncharsetutf8/charset/encoder/appender!-- 按照每天生成日志文件 --appender nameFILE classch.qos.logback.core.rolling.RollingFileAppenderrollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy!--日志文件输出的文件名--fileNamePattern${LOG_HOME}/leadnews.%d{yyyy-MM-dd}.log/fileNamePattern/rollingPolicyencoderpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern/encoder/appender!-- 异步输出 --appender nameASYNC classch.qos.logback.classic.AsyncAppender!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --discardingThreshold0/discardingThreshold!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --queueSize512/queueSize!-- 添加附加的appender,最多只能添加一个 --appender-ref refFILE//appenderlogger nameorg.apache.ibatis.cache.decorators.LoggingCache levelDEBUG additivityfalseappender-ref refCONSOLE//loggerlogger nameorg.springframework.boot leveldebug/root levelinfo!--appender-ref refASYNC/--appender-ref refFILE/appender-ref refCONSOLE//root
/configuration ②接口定义 ③新增LoginDto
package com.heima.model.user.dtos;import lombok.Data;Data
public class LoginDto {/*** 手机号*/private String phone;/*** 密码*/private String password;
}④思路分析 ⑤实现
UserApplication
package com.heima.user;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplication
EnableDiscoveryClient
MapperScan(com.heima.user.mapper)
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}ApUserMapper
package com.heima.user.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.heima.model.user.pojos.ApUser;
import org.apache.ibatis.annotations.Mapper;Mapper
public interface ApUserMapper extends BaseMapperApUser {
}ApUserService
package com.heima.user.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;public interface ApUserService extends IServiceApUser {/*** app登录功能* param dto* return*/public ResponseResult login(LoginDto dto);
}ApUserServiceImpl
package com.heima.user.service.impl;import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;import java.util.HashMap;
import java.util.Map;Service
Transactional
Slf4j
public class ApUserServiceImpl extends ServiceImplApUserMapper, ApUser implements ApUserService {/*** app登录功能* param dto* return*/Overridepublic ResponseResult login(LoginDto dto) {// 1. 正常登录 用户名和密码if(StringUtils.isNotBlank(dto.getPhone()) StringUtils.isNotBlank(dto.getPassword())) {// 1.1 根据手机号查询用户信息ApUser dbUser getOne(Wrappers.ApUserlambdaQuery().eq(ApUser::getPhone, dto.getPhone()));if(dbUser null) {return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, 用户信息不存在);}// 1.2 对比密码String salt dbUser.getSalt();String password dto.getPassword();String paswd DigestUtils.md5DigestAsHex((password salt).getBytes());if(!paswd.equals(dbUser.getPassword())) {return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);}// 1.3 返回数据 jwtString token AppJwtUtil.getToken(dbUser.getId().longValue());MapString, Object map new HashMap();map.put(token, token);dbUser.setSalt();dbUser.setPassword();map.put(user, dbUser);return ResponseResult.okResult(map);} else {// 2. 游客登录MapString, Object map new HashMap();map.put(token, AppJwtUtil.getToken(0L));return ResponseResult.okResult(map);}}
}ApUserLoginController
package com.heima.user.controller.v1;import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.user.dtos.LoginDto;
import com.heima.user.service.ApUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;RestController
RequestMapping(/api/v1/login)
public class ApUserLoginController {Autowiredprivate ApUserService apUserService;PostMapping(/login_auth)public ResponseResult login(RequestBody LoginDto dto) {return apUserService.login(dto);}
}五、接口工具postman、swagger、knife4j
1. 接口工具-postman
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。Postman被500万开发者和超过100,000家公司用于每月访问1.3亿个API。
官网https://www.postman.com/ 登录请求的测试http://localhost:51801/api/v1/login/login_auth
{phone: 13511223456,password: admin
} 2. 接口工具-Swagger
前后端分离开发
项目基于前后端分离的架构进行开发前后端分离架构总体上包括前端和服务端通常是多人协作开发。 1简介
Swagger是一个规范和完整的框架用于生成、描述、调用和可视化RESTful风格的Web服务。它的主要作用是
使得前后端分离开发更加方便有利于团队协作接口的文档在线自动生成降低后端开发人员编写接口文档的负担功能测试
2SpringBoot集成Swagger
①引入依赖
在heima-leadnews-model和heima-leadnews-common模块的pom.xml中引入该依赖
dependencygroupIdio.springfox/groupIdartifactIdspringfox-swagger2/artifactId
/dependency
dependencygroupIdio.springfox/groupIdartifactIdspringfox-swagger-ui/artifactId
/dependency
②在heima-leadnews-common中进行配置其他微服务工程都直接或间接依赖common模块
新增com.heima.coomon.swagger.SwaggerConfiguration
package com.heima.common.swagger;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;Configuration
EnableSwagger2
public class SwaggerConfiguration {Beanpublic Docket buildDocket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(buildApiInfo()).select()// 要扫描的API(Controller)基础包.apis(RequestHandlerSelectors.basePackage(com.heima)).paths(PathSelectors.any()).build();}private ApiInfo buildApiInfo() {Contact contact new Contact(黑马程序员,,);return new ApiInfoBuilder().title(黑马头条-平台管理API文档).description(黑马头条后台api).contact(contact).version(1.0.0).build();}
}
③在heima-leadnews-common模块中的resources目录下的META-INF/spring.factories中新增如下
org.springframework.boot.autoconfigure.EnableAutoConfiguration\com.heima.common.exception.ExceptionCatch,\com.heima.common.swagger.SwaggerConfiguration
④Swagger常用注解
注解释义Api修饰整个类描述Controller的作用ApiOperation描述一个类的一个方法或者说一个接口ApiParam单个参数的描述信息ApiModel用对象接收参数ApiModelProperty用对象接收参数时描述对象的一个字段ApiResponseHTTP响应其中一个描述ApiResponsesHTTP响应整体描述ApiIgnore使用该注解忽略这个APIApiError发生错误返回的信息ApiImplicitParam一个请求参数ApiImplicitParams多个请求参数的描述信息
ApiImplicitParam属性
属性取值作用paramType查询参数类型path以地址的形式提交数据query直接跟参数完成自动映射赋值body以流的形式提交 仅支持POSTheader参数在request headers 里边提交form以form表单的形式提交 仅支持POSTdataType参数的数据类型 只作为标志说明并没有实际验证LongStringname接收参数名value接收参数的意义描述required参数是否必填true必填false非必填defaultValue默认值
在ApUserLoginController中添加Swagger注解
RestController
RequestMapping(/api/v1/login)
Api(value app端用户登录, tags app端用户登录)
public class ApUserLoginController {Autowiredprivate ApUserService apUserService;PostMapping(/login_auth)ApiOperation(用户登录)public ResponseResult login(RequestBody LoginDto dto) {return apUserService.login(dto);}
}在LoginDto添加注解
package com.heima.model.user.dtos;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;Data
public class LoginDto {/*** 手机号*/ApiModelProperty(value 手机号, required true)private String phone;/*** 密码*/ApiModelProperty(value 密码, required true)private String password;
}⑤启动UserApplication
访问接口文档http://localhost:51801/swagger-ui.html 3. 接口工具-knife4j
1简介
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案前身是swagger-boostrap-ui取名knife4j是希望它能像一把匕首一样小巧并且功能强悍。
gitee地址knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案
官方文档Knife4j · 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j
效果演示http://knife4j.xiaominfo.com/doc.html
2核心功能
文档说明根据Swagger的规范说明详细列出接口文档的说明包括接口地址、类型、请求示例、请求参数、响应示例、响应参数、响应码等信息使用swagger-bootstrap-ui能根据该文档说明对该接口的使用情况一目了然。在线调试提供在线接口联调的强大功能自动解析当前接口参数同时包含表单验证调用参数可返回接口响应内容、headers、Curl请求命令实例、响应时间、响应状态码等信息帮助开发者在线调试而不必通过其他测试工具测试接口是否正确简洁、强大。个性化设置通过个性化ui配置项可以自定义UI的相关显示信息离线文档根据标准规范生成的在线markdown离线文档开发者可以进行拷贝生成的markdown接口文档通过其他第三方markdown转换工具转换成html或pdf这样也可以放弃swagger2markdown组件接口排序自1.8.5后ui支持了接口排序功能例如一个注册功能主要包含了多个步骤可以根据swagger-bootstrap-ui提供的接口排序规则实现接口的排序step化接口操作方便其他开发者进行接口对接。
3快速集成
①在heima-leadnews-common模块中的pom.xml文件中引入knife4j的依赖
dependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-spring-boot-starter/artifactId
/dependency
②创建swagger配置文件
在heima-leadnews-common模块中新建配置类SwaggerConfiguration
package com.heima.common.knife4j;import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;Configuration
EnableSwagger2
EnableKnife4j
Import(BeanValidatorPluginsConfiguration.class)
public class Swagger2Configuration {Bean(value defaultApi2)public Docket defaultApi2() {Docket docketnew Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())//分组名称.groupName(1.0).select()//这里指定Controller扫描包路径.apis(RequestHandlerSelectors.basePackage(com.heima)).paths(PathSelectors.any()).build();return docket;}private ApiInfo apiInfo() {return new ApiInfoBuilder().title(黑马头条API文档).description(黑马头条API文档).version(1.0).build();}
}
注解说明EnableSwagger2该注解是Springfox-swagger框架提供的使用Swagger的注解该注解必须添加EnableKnife4j该注解是knife4j提供的增强注解Ui提供了例如动态参数、参数过滤、接口排序等增强功能如果你想使用这些增强功能就必须加该注解否则可以不用加 ③在META-INF/spring.factories中新增配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration\com.heima.common.exception.ExceptionCatch,\com.heima.common.swagger.SwaggerConfiguration,\com.heima.common.swagger.Swagger2Configuration
④启动UserApplication
访问地址http://localhost:51801/doc.html#/home 六、app端网关
1. app端网关
1网关概述 实现步骤
①在heima-leadnews-gateway导入以下依赖
dependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactId/dependency
/dependencies
②在heima-leadnews-gateway下创建heima-leadnews-app-gateway微服务 新增引导类AppGatewayApplication
package com.heima.app.gateway;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplication
EnableDiscoveryClient //开启注册中心
public class AppGatewayApplication {public static void main(String[] args) {SpringApplication.run(AppGatewayApplication.class,args);}
}
新增配置类bootstrap.yml
server:port: 51601
spring:application:name: leadnews-app-gatewaycloud:nacos:discovery:server-addr: 192.168.200.130:8848config:server-addr: 192.168.200.130:8848file-extension: yml
③在nacos添加Data ID为leadnews-app-gateway的配置文件 spring:cloud:gateway:globalcors:add-to-simple-url-handler-mapping: truecorsConfigurations:[/**]:allowedHeaders: *allowedOrigins: *allowedMethods:- GET- POST- DELETE- PUT- OPTIONroutes:# 平台管理- id: useruri: lb://leadnews-userpredicates:- Path/user/**filters:- StripPrefix 1
④启动AppGatewayApplication和UserApplication
网址http://localhost:51601/user/api/v1/login/login_auth 2. 认证过滤器 实现步骤
①拷贝一份jwt解析工具类AppJwtUtil到网关微服务中 ②在网关微服务中新建全局过滤器
package com.heima.app.gateway.filter;import com.heima.app.gateway.util.AppJwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;Component
Slf4j
public class AuthorizeFilter implements Ordered, GlobalFilter {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1. 获取request和response对象ServerHttpRequest request exchange.getRequest();ServerHttpResponse response exchange.getResponse();// 2. 判断是否是登录if(request.getURI().getPath().contains(/login)) {// 放行return chain.filter(exchange);}// 3. 获取tokenString token request.getHeaders().getFirst(token);// 4. 判断token是否存在if(StringUtils.isBlank(token)) {response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}// 5. 判断token是否有效try {Claims claimsBody AppJwtUtil.getClaimsBody(token);// 判断token是否过期int result AppJwtUtil.verifyToken(claimsBody);if (result 1 || result 2) {response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}} catch (Exception e) {e.printStackTrace();response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}// 6. 放行return chain.filter(exchange);}/*** 优先级设置值越小优先级越高* return*/Overridepublic int getOrder() {return 0;}
}③重启AppGatewayApplication和UserApplication
如果访问其他微服务会提示需要认证才能访问这个时候就需要在headers中设置token才能正常访问。 七、app前端项目集成 ①解压nginx-1.18.0.zip和app-web.zip到一个不带中文的路径下 ②启动nginx nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 如果有出现上面的问题可以查看正在占用80端口的程序并kill掉 或者在nginx.conf把监听端口改成其他的如8080 ③在niginx安装的conf目录下新建一个文件夹leadnews.conf在当前文件夹中新建heima-leadnews-app.conf文档配置如下根据自己的情况修改前端工程路径 upstream heima-app-gateway{server localhost:51601;
}server {listen 8801;location / {root D:/IDEA/frontProject/app-web/;index index.html;}location ~/app/(.*) {proxy_pass http://heima-app-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; # 记录真实发出请求的客户端IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息}
}
④把nginx.conf里面的内容覆盖为如下引入heima-leadnews-app.conf文件加载 #user nobody;
worker_processes 1;events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 引入自定义配置文件include leadnews.conf/*.conf;
}
⑤启动niginx在nginx安装包中使用命令提示符打开输入nignx启动项目
可查看进行检查nginx是否启动。
重新加载配置文件nginx -s reload
⑥启动UserApplication和AppGatewayApplication
访问http://localhost:8801/ 注意要先启动nacos