实名认证
分布式事务
@Transactional注解 对ap_user_realname ap_user的操作会回滚
而基于远程调用的article服务和wemedia服务 不会回滚
这时传统的数据库事务无法解决,需要用到分布式事务的解决方案
seata时2019年阿里巴巴开源的分布式事务解决方案 (一站式的分布式解决方案)
用docker部署seata,nacos作为seata的注册和配置中心,方便以后的高可用和统一的配置管理
修改seataTC配置
# 进入到挂载目录cd /var/lib/docker/volumes/seata-config/_data# 修改注册中心配置vi registry.conf# 配置中的内容registry {# tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等type = "nacos"nacos {# seata tc 服务注册到 nacos的服务名称,可以自定义 spring.application.nameapplication = "seata-tc-server"serverAddr = "192.168.200.130:8848"group = "SEATA_GROUP"namespace = "seata"cluster = "SH"username = "nacos"password = "nacos"}}config {# 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置type = "nacos"# 配置nacos地址等信息nacos {serverAddr = "192.168.200.130:8848"namespace = "seata"group = "SEATA_GROUP"username = "nacos"password = "nacos"dataId = "seataServer.properties"}}
微服务配置seata
#创建seata共享配置 #在配置中心nacos 的 dev 环境中 创建share-seata.yml seata: registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址 # 参考tc服务自己的registry.conf中的配置 type: nacos nacos: # tc server-addr: ${spring.profiles.ip}:8848 namespace: "seata" group: SEATA_GROUP application: seata-tc-server # tc服务在nacos中的服务名称 tx-service-group: seata-demo # 事务组,根据这个获取tc服务的cluster名称 service: vgroup-mapping: # 事务组与TC服务cluster的映射关系 seata-demo: SH引入依赖
<dependencies> <!--seata--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <exclusions> <!--版本较低,1.3.0,因此排除--> <exclusion> <artifactId>seata-spring-boot-starter</artifactId> <groupId>io.seata</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <!--seata starter 采用1.4.2版本--> <version>${seata.version}</version> </dependency> </dependencies>修改bootstrap.yml配置
#以 leadnews-user服务为例 其它一样 spring: application: name: leadnews-user # 服务名称 profiles: active: dev # 开发环境配置 ip: 192.168.200.130 # 环境ip地址 cloud: nacos: discovery: # 注册中心地址配置 server-addr: ${spring.profiles.ip}:8848 namespace: ${spring.profiles.active} config: # 配置中心地址配置 server-addr: ${spring.profiles.ip}:8848 namespace: ${spring.profiles.active} file-extension: yml # data-id 后缀 name: ${spring.application.name} # data-id名称 shared-configs: # 共享配置 - data-id: share-feign.yml # 配置文件名-Data Id group: DEFAULT_GROUP # 默认为DEFAULT_GROUP refresh: false # 是否动态刷新,默认为false - data-id: share-seata.yml # 配置文件名-Data Id group: DEFAULT_GROUP # 默认为DEFAULT_GROUP refresh: false # 是否动态刷新,默认为fals加上seata提供的全局事务管理注解 @GlobalTransactional 注解, 开启全局事务
云存储解决方案
阿里云对象存储服务(Object Storage Service,简称OSS)为您提供基于网络的数据存取服务。
阿里云OSS将数据文件以对象(object)的形式上传到存储空间(bucket)中。开通OSS
- 创建存储空间
-
OSS starter工具封装
heima-leadnews-basic 模块,在当前模块下创建 heima-file-spring-boot-starter子模块,
添加依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <!--OSS--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>21.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>创建包com.heima.file
资料文件夹下导入 service和 config包下的内容:
结构如下:
在resources目录下新建 META-INF/spring.factories 配置文件org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.heima.file.service.impl.OSSAliyunFileStorageServicewemedia-service 添加OSS配置
<dependency> <artifactId>heima-file-spring-boot-starter</artifactId> <groupId>com.heima</groupId> <version>1.0-SNAPSHOT</version> </dependency>配置中心nacos添加 share-file.yml 共享配置
#OSS配置 file: oss: bucket-name: <替换成自己的> access-key-id: <替换成自己的> access-key-secret: <替换成自己的> endpoint: oss-cn-shanghai.aliyuncs.com web-site: <替换成自己的> proxy-username: aliyun-sdk-java socket-timeout: 10000 idle-connection-time: 10000 connection-request-timeout: 4000 max-connections: 2048 max-error-retry: 5 white-list: 127.0.0.1 connection-timeout: 10000 prefix: materialbucket就是我们刚刚申请的,在它的概览页面 有对应的外网访问地址前缀,贴到配置中 记得加上http://开头 和 斜杠结尾哦

bootstrap.yml新增共享配置spring: cloud: nacos: config: # 配置中心地址配置 shared-configs: # 共享配置 - data-id: share-file.yml # 配置文件名-Data Id group: DEFAULT_GROUP # 默认为DEFAULT_GROUP refresh: false # 是否动态刷新,默认为false自媒体用户登录 (wm_user)
在网关里定义一个全局过滤器必须携带token才能进入(白名单列外),token有没有过期等
- 校验参数,判断name在数据库有没有
- password使用工具类进行加密(加密方式是(password+盐)用MD5进行加密),然后判断password加密后的跟数据库对比
-
自媒体网关和获取登录用户
图片上传
- 参数校验,检查用户是否登录
- 解析图片是否是正确格式(jpg,jpeg,png,gif结尾)
- 给图片拼接一个新的名字(怕名字重复吧之前的图片覆盖)存放到数据库和oss中
- 素材列表加载
- 参数校验,检查用户是否登录,分页校验
- 根据传过来的参进行分页查询
- 判断是否收藏如果收藏根据收藏查询降序
- 把图片url都加上webSite然后存到结果中
- 响应封装参数
- 图片删除
- 参数校验,检查用户是否登录
- 判断图片如果当前图片被引用,则不能删除(拿图片的名称去wm_news表中去查询图片字段(count)如果count>0那么就是被引用了)
- 删除id
- 返回参数
- 收藏与取消图片
- 参数校验,检查用户是否登录
- 检查是否是收藏着收藏或取消收藏
- 修改状态字段进行修改
- 返回参数
