主要对项目一个思路进行一个梳理。
对于用户模块只需要一个重点就是AOP切面变成以及前后端精度修补,后端因为用户ID使用的是Long类型并且使用雪花算法,所以到前端会有精度丢失。
首先是AOP编程,先写一个@interface类 不是interface类,里面定义一个mustrole变量用于后面赋值。重点是拥有@Aspect以及@Component的类 类里面方法使用了注解@Around
然后方法里面参数首先是切入点ProcessingJoinPoint 以及 我们之前定义的@interface类
然后就可以根据mustrole枚举类进行权限的校验了。
齐次是精度修补。我们直接使用@JsonComponent注解定义一个类,里面直接方法放上@Bean注解。
@Bean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(module);
return objectMapper;
}
总的来说只有一个重点就是AOP编程。
图片模块。
总的来说就只有COS的上传和下载。配置好COS的信息以后,直接调用CosClient里面的putobjet和getobject即可,对于上传直接上传到cos对象存储当中,但是现在的下载还不能直接获取到本地浏览器下载里面,因为还没有设置response的head头响应。除了这两个还有一个tag的返回,直接定义好标签数组,直接返回即可。
对于下载图片,我们使用getobject以后得到结果,然后使用结果得到流,然后我们设置HttpServiceResponse response ,设置response里面的utf-8等信息,最重要的就是使用response.outputstream.werite(bytes),然后response.outputstream.flush()刷新一下就可以下载到浏览器了。
用户传图模块:
首先就是审核功能,用户传图以后我们先看是否是管理员上传图片,管理员上传直接默认设置值不需要审核,否则默认为审核中,然后返回给公共图库的是已经审核过的,然后管理员的图片管理返回的是图片没有脱敏的信息,可以直接审核通过或者拒绝。
还有就是再加一个通过Url下载,我们获取到url路径以后我们使用HttpUtil.download直接下载到临时文件,然后直接调用putobject函数就可以上传上去了。因为我们之前有一个文件上传和这个差不多,所以我们使用一个模版方式模式,我们直接把公共的部分拿出来,然后不同的放在两个类再实现就行。
然后就是批量上传图片功能,我们使用一个免费的网站进行爬虫,因为我们看到网站里面返回的是html格式文件,所以我们使用jsoup来进行解析,连接到地址以后返回结果我们首先获取到最外边一层dgController,然后在找到里面的img.ming这里就是一个列表了,有很多的图片信息,再然后我们就可以使用src获取到图片的地址了,但是我们只需要?前面的部分,我们再进行一个字符串处理就可以使用url上传图片上去了,外加一个for循环就可以了。
图片优化功能:
首先是redis和caffie,redis就用StringRedisTemplate,caffine还需要new一下 使用Caffine.newbuider然后设置里面的初始值就可以获取了。我们现在caffine查找 找不到去redis里面找 再找不到就去数据库里面查找,然后我们设置caffine和redis里面的缓存。多级缓存就好了。
然后就是压缩图,我们上传到cos上面的是已经压缩好的图片,减少图片上传大小,上传更快,降低流量的使用,我们使用阿里的数据万象,设置好规则以后他会处理好的。然后我们还要进行缩略图的设置,我们显示在公共图库首页的是原图,原图和缩略图相差几十倍有时候甚至上百倍,这时候如果显示原图的话就会造成很大的流量消耗,所以我们进行缩略图的设置,显示缩略图这样减少流量的消耗提高图片的显示效率。所以总的来说就是上传压缩图,显示缩略图到首页。只有用于点击预览以及下载我们才回去下载原图。
空间模块:
其实就是上传图片到空间数据库里面,然后我们再进行一个空间的图片操作而已。外加一个上传时内存够不够,删除时删除内存大小。
空间优化:
亮点就一个,以图搜图功能。(着重看)
以图搜图是在百度的接口里面进行全局搜索的。所以我们先进行百度接口的网址访问,返回的记过就是以图搜图的页面地址,然后通过页面地址获取到firsturl以后访问firsturl,然后结果就是JSON格式了,这里面就是url列表了,我们进行list转换就可以返回了。
AI扩图功能:
对于创建任务我们使用AliyunApi.createoutpaintingtast() ,查询结果是否成功就可以用getoutpaintingtast()
图库分析不是亮点,直接跳过。对于后端来说就是数据库的查询。
团队空间:(这个也重点看)
主要是分库分表ShardingSphere,以及Satoken的kit模式进行权限RBAC的校验。
权限校验这样看
在云图库项目里,空间有“私有空间”和“团队空间”两种类型,后者需要不同成员进行协同管理和操作,所以必须提供更细粒度的权限控制,比如谁能上传图片、谁能删除图片、谁能管理成员等。为此我使用基于角色的权限管理(RBAC)来实现团队空间的权限管理,并配合Sa-Token框架实现统一的注解式权限校验。
实现步骤:
1)空间角色与权限的定义:根据团队空间中的操作场景,设计了权限和角色。并且以JSON配置文件的方式存储角色和权限的关系,避免了新建数据表和关联查询。
2)空间成员管理:对于团队空间,通过空间成员关系表实现多对多关联,并标注用户在该空间的角色。
3)Sa-Token鉴权框架:基于Sa-Token的Kit模式实现了多账号体系的RBAC权限控制,通过从请求上下文中获取参数实现了统一的权限校验逻辑,并运用注解合并简化了鉴权注解的使用,轻松实现方法级别的权限校验。
举个例子:
1. 在代码中,可使用自定义的Sa-Token注解@SaSpaceCheckPermission("picture:delete")标记敏感操作接口,让框架在调用方法前自动做校验。
2. Sa-Token会调用自定义的StpInterfaceImpl#getPermissionList(...)方法,这里读取空间上下文信息+ space_user表的角色,再用通过角色权限关系获取到最终的权限列表,如果不包含"picture:delete"就直接抛异常。这样就避免了每个接口都手写”if-else”或编码来判断权限。
4)前后端交互:为了前端能根据权限隐藏或显示某些按钮,我在“获取空间详情”和“获取图片详情”时,额外返回permissionList字段,让前端知道当前用户对该空间/图片拥有哪些权限,从而进行动态UI控制。
然后ShardingSphere
重点看
ShardingSphrer是一个提供分库分表、读写分离、分布式事务等功能的开源数据库中间件,支持多种模式和灵活分片配置方式。
那么我在项目中,由于有些团队空间要求较高,且会存储大量图片,那么我将该团队空间的图片单独分表,在ShardingSphrer中配置根据空间id进行分表,在创建该团队空间的时候为该团队空间创建分表,可以加快团队空间的操作速率。
·如何实现:首先我需要在配置中指定分表规则(可以设置根据什么字段分表)和分表搜索算法,这里我使用的是
自定义算法和动态分表,可以在配置类中配置,我的配置内容是如果指定字段有分表就查询分表,没有分表就查询逻辑表。
·动态分表:由于分表是由团队空间确定,所以我实在团队空间创建后,查询数据库的分表集合,并修改配置,实现的动态分表。