96SEO 2026-02-23 13:02 29
创建controller.v1、service、mapper、config6.2.3

Controller层ApUserLoginController类7.1.3
http://192.168.204.129:8848/nacos
解压heima-leadnews.zip并且导入idea设置jdk为1.8
heima-leadnews-common模块下的com.heima.common.exception包下自定义异常类CustomException如果我们手动抛出异常就需要抛出CustomException类
CustomException(AppHttpCodeEnum
appHttpCodeEnum){this.appHttpCodeEnum
注解ControllerAdviceControllerAdvice本质上是一个Component因此也会被当成组件扫描一视同仁扫扫扫。
这个类是为那些声明了ExceptionHandler、InitBinder
ModelAttribute注解修饰的方法的类而提供的专业化的Component
return*/ExceptionHandler(Exception.class)ResponseBodypublic
e){e.printStackTrace();log.error(catch
exception:{},e.getMessage());return
ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR);}/***
return*/ExceptionHandler(CustomException.class)ResponseBodypublic
ResponseResult.errorResult(e.getAppHttpCodeEnum());}
}在heima-leadnews-model模块下的com.heima.model包下的common包下的enums包下有个枚举类AppHttpCodeEnum用来存放对异常的说明
登录段1~50NEED_LOGIN(1,需要登录后操作),LOGIN_PASSWORD_ERROR(2,密码错误),//
TOKEN50~100TOKEN_INVALID(50,无效的TOKEN),TOKEN_EXPIRE(51,TOKEN已过期),TOKEN_REQUIRE(52,TOKEN是必须的),//
100~120SIGN_INVALID(100,无效的SIGN),SIG_TIMEOUT(101,SIGN已过期),//
500~1000PARAM_REQUIRE(500,缺少参数),PARAM_INVALID(501,无效参数),PARAM_IMAGE_FORMAT_ERROR(502,图片格式有误),SERVER_ERROR(503,服务器内部错误),//
1000~2000DATA_EXIST(1000,数据已经存在),AP_USER_DATA_NOT_EXIST(1001,ApUser数据不存在),DATA_NOT_EXIST(1002,数据不存在),//
3000~3500NO_OPERATOR_AUTH(3000,无权限操作),NEED_ADMIND(3001,需要管理员权限);int
errorMessage;AppHttpCodeEnum(int
resource下META-INF有spring.factories只有有微服务引用了heima-leadnews-common服务器初始化spring容器的时候就会找到spring.factories把spring.factories中需要自动配置的文件加载到当前微服务的容器中也就能用全局处理器了。
打开本地sql工具引入sql脚本创建leadnews_user有四张表
在heima-leadnews-model模块下创建com.heima.model.user.pojos包下创建实体类ApUser
密码、通信等加密盐*/TableField(salt)private
密码,md5加密*/TableField(password)private
是*/TableField(is_certification)private
是否身份认证*/TableField(is_identity_au***ntication)private
0正常1锁定*/TableField(status)private
注册时间*/TableField(created_time)private
heima-leadnews-service模块是管理其他所有微服务模块
然后创建一个包com.heima.user再创建一个引导类UserApplication
MapperScan(com.heima.user.mapper)
继承MybatisPlus扫描Mapper接口没有就在com.heima.user下创建mapper包
MapperScan(com.heima.user.mapper)
{SpringApplication.run(UserApplication.class,
创建controller.v1、service、mapper、config
和bootstrap.yml在同一目录下bootstrap.yml
application.yml后加载application.yml会覆盖
leadnews-usercloud:nacos:discovery:server-addr:
192.168.204.129:8848config:server-addr:
192.168.204.129:8848file-extension:
yml这里面暂时只有Nacos的配置关于数据库的等等都需要在Nacos的配置中心进行配置
spring:datasource:driver-class-name:
jdbc:mysql://localhost:3306/leadnews_user?useUnicodetruecharacterEncodingUTF-8serverTimezoneUTCuseSSLfalseusername:
设置Mapper接口所对应的XML文件位置如果你在Mapper接口中有自定义方法需要进行该配置
设置别名包扫描路径通过该属性可以给包中的类注册别名type-aliases-package:
encodingUTF-8?configuration!--定义日志文件的存储地址,使用绝对路径--property
valueD:\Code\JavaCode\HeimaToutiao\logs/!--
classch.qos.logback.core.ConsoleAppenderencoder!--格式化输出%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符--pattern%d{yyyy-MM-dd
%msg%n/patterncharsetutf8/charset/encoder/appender!--
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
%msg%n/pattern/encoder/appender!--
classch.qos.logback.classic.AsyncAppender!--
不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志
--discardingThreshold0/discardingThreshold!--
nameorg.apache.ibatis.cache.decorators.LoggingCache
heima-leadnews-model模块下的com.heima.model.user.pojos.dtos包下创建LoginDto类
Controller层ApUserLoginController类
再在heima-leadnews-service模块下的com.heima.user.controller.v1下创建ApUserLoginController类
{PostMapping(/login_auth)public
login(RequestBody(requiredfalse)
在com.heima.user.mapper创建ApUserMapper接口
用户名、密码if(StringUtils.isNotBlank(dto.getPhone())
StringUtils.isNotBlank(dto.getPassword()))
getOne(Wrappers.ApUserlambdaQuery().eq(ApUser::getPhone,
ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST,
DigestUtils.md5DigestAsHex((password
salt).getBytes());if(!pwd.equals(dbUser.getPassword()))
ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR,
AppJwtUtil.getToken(dbUser.getId().longValue());MapString,Object
HashMap();map.put(token,token);//清空敏感信息前端只要id,手机号,昵称ApUser
ApUser();userVO.setId(dbUser.getId());userVO.setPhone(dbUser.getPhone());userVO.setName(dbUser.getName());map.put(user,userVO);return
ResponseResult.okResult(map);}else{//2.游客登录MapString,Object
HashMap();map.put(token,AppJwtUtil.getToken(0L));return
ResponseResult.okResult(map);}}
}加密采用DigestUtils.md5DigestAsHex传入字节流
生成JWT令牌是使用heima-leadnews-utils模块下的com.heima.utils.common包下的AppJWTUtil
MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY;//
HashMap();claimMaps.put(id,id);long
System.currentTimeMillis();return
Jwts.builder().setId(UUID.randomUUID().toString()).setIssuedAt(new
//接收用户.compressWith(CompressionCodecs.GZIP)
//数据压缩方式.signWith(SignatureAlgorithm.HS512,
Jwts.parser().setSigningKey(generalKey()).parseClaimsJws(token);}/***
getJws(token).getHeader();}/***
{claims.getExpiration().before(new
需要自动刷新TOKENif((claims.getExpiration().getTime()-System.currentTimeMillis())REFRESH_TIME*1000){return
Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());SecretKey
HashMap();map.put(id,11);*/System.out.println(AppJwtUtil.getToken(1102L));JwsClaims
AppJwtUtil.getJws(eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQqEMAwA_5KzhURNt_qb1KZYQSi0wi6Lf9942NsMw3zh6AVW2DYmDGl2WabkZgreCaM6VXzhFBfJMcMARTqsxIG9Z888QLui3e3Tup5Pb81013KKmVzJTGo11nf9n8v4nMUaEY73DzTabjmDAAAA.4SuqQ42IGqCgBai6qd4RaVpVxTlZIWC826QA9kLvt9d-yVUw82gU47HDaSfOzgAcloZedYNNpUcd18Ne8vvjQA);Claims
jws.getBody();System.out.println(claims.get(id));}}7.2.2
apUserService;PostMapping(/login_auth)public
访问http://localhost:51801/api/v1/login/login_auth
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
创建引导类com.heima.app.gateway.AppGatewayApplication
{SpringApplication.run(AppGatewayApplication.class,
leadnews-app-gatewaycloud:nacos:discovery:server-addr:
192.168.204.129:8848config:server-addr:
192.168.204.129:8848file-extension:
spring:cloud:gateway:globalcors:add-to-simple-url-handler-mapping:
truecorsConfigurations:[/**]:allowedHeaders:
当请求匹配到该路由时它会被路由到leadnews-user服务的实例。
URI的前缀lb://表示路由到负载均衡器。
predicates:
定义了路由的匹配规则。
在这种情况下请求路径必须以/user/开头才会匹配到此路由。
filters:
定义了路由的过滤器。
在这里使用了StripPrefix过滤器该过滤器会将请求的路径中的一层前缀移除。
具体来说这里是将路径中的第一层/user移除以便在转发请求到leadnews-user服务时去除不必要的前缀。
访问http://localhost:51601/user/api/v1/login/login_auth
在heima-leadnews-gateway模块下创建com.heima.app.gateway.filter.AuthorizeFilter类用作全局过滤器
{//1.获取Request对象和Response对象ServerHttpRequest
exchange.getRequest();ServerHttpResponse
exchange.getResponse();//2.判断当前请求是否为登录请求如果是直接放行if
(request.getURI().getPath().contains(/login))
chain.filter(exchange);}//3.获取当前请求的token信息String
request.getHeaders().getFirst(token);//4.判断token是否存在if(StringUtils.isBlank(token))
{response.setStatusCode(HttpStatus.UNAUTHORIZED);return
response.setComplete();}//5.判断token是否有效//5.1
AppJwtUtil.getClaimsBody(token);//5.2
AppJwtUtil.verifyToken(body);if(result
token过期response.setStatusCode(HttpStatus.UNAUTHORIZED);return
token无效response.setStatusCode(HttpStatus.UNAUTHORIZED);return
response.setComplete();}//6.放行return
在nginx的conf目录下创建文件夹leadnews.conf新建文件heimi-leadnews-app.conf
nginx端口8801然后转发到gateway端口51601gateway添加user路径后通过Nacos路由到leadnews-user也就是端口51801完成访问
静态资源存放在D:/Code/JavaCode/HeimaToutiao/app-web/展示其目录下的index.html
D:/Code/JavaCode/HeimaToutiao/app-web/;index
http://heima-app-gateway/$1;proxy_set_header
不改变源请求头的值proxy_pass_request_body
#开启获取请求体proxy_pass_request_headers
application/octet-stream;sendfile
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback