面试官你好,最近做的一个项目是在上一家外包公司做的社区团购系统,主要针对社区使用,通过招募小区业主或者利店店主作为社区合作人(团长),然后团长微信开团、商品推广以及和用户沟通。用户通过小程序下单,然后小程序下单的订单量统计至平台,通知提供链进行产品采购、分级、包装、然后以仓库通配的方式,配送至团长处。然后次日用户可以去团长处对商品进行自提就行了。
模块:
项目为分布式开发模式,其中有三个端,用户端、团长端、后台管理端。(用户端和团长端都是小程序、后台管理端为web方面)
用户端有首页模块、分类、购物车、我的。首页包括商品的轮播图、商品分类、限时秒杀、拼团等。分类模块展示商品的基本信息优惠信息、搜索商品等。购物车模块包括用户添加到购物车的商品基本规格和一些根据用户最近浏览的分类推荐还有失效商品等,如果用户没登录需要提示登录。我的模块需要用户登录,登录后展示用户的基本信息,比如地址、快递状态、活动中心等。
其次是团长端、进入控制页面需要先登录,如果不是团长用户会有两个选择申请团长和进入用户端的入口,申请团长会有两个状态,申请中和未申请,后台会进行判断,跳转对应的界面。然后团长有首页、订单、我的模块,首页可以看到当前社区团的基本情况,比如(今日预估佣金,今日订单,下单人数)也有对应推广码奖励。
订单模块包括顾客提货、提醒顾客收货等。然后我的模块包括一些资金管理,意见投诉等。
最后是后台管理端,包括管理员的登录注册,然后是对一些团长、订单、商品、用户、运营等管理,对于一些团长的筛查违规进行处理,还有就是对于首页的一些轮播图,字典表中的数据进行动态操作,做到项目中一些数据可配置化。
技术架构:
项目是分布式的,
前端采用Vue全家桶+百度Echars
后端采用springcloudAlibaba为主体架构,因为前后端分离,所以这里使用nginx来做动态代理避免前后端的跨域问题,SpringSecurity做登录权限认证,项目中对于MySql数据库使用了两种框架进行数据访问(SpringDataJPA + Mybatis),其中SpringDataJPA 用来做一些比较简单的查询或者插入等操作,Mybatis主要用来做一些复杂查询,主要作用于报表数据等,因为考虑到校园博客后面可能不止是一两所学校,所以我们还使用了另外一个数据源MongoDB,用做文件信息存储,Rabbitmq作为消息中间件,redis做数据缓存包括做一些原子操作(比如说一个管理员在操作一个东西的时候另外一个人不能对其进行操作)
4、项目开发周期:
(①需求确认;②原型设计;③UI设计;④程序开发;⑤测试&验收;⑥上线,) 本项目开发人员有2个前端4个后端,开发周期六个月,期间有百分之八十的时间是和前端约定整理接口,逻辑分析和表的设计、等。剩下的时间就完成代码书写,测试优化等。
5、项目中你的职责是什么:
我担任用户端的首页模块、商品详情展示、后端的用户管理模块、然后是三个端的登录和注册。
登录:
我使用了SpringSecurity这个安全框架,责用户的认证与授权,认证就是用户登录认证,授权就是对于用户的权限操作比如要进入(个人详情,订单详情等等)都需要进行登录,然后后台管理有一个动态路由的处理对于不同等级的管理员划分不同的控制模块
动态路由基本实现流程:
在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。然后设置资源所需要的权限即可。
根据权限实现动态路由效果简述:
使用springSecurity的RBAC权限模型,基于角色的权限控住,我们使用的是以注解方式定义在接口上进行权限的标识(然后会给各个功能提供对应的权限表(menu表),还有角色表可以理解为权限组表,一个角色对应多个权限,当然一个权限对应多个角色,此时就需要一个中间表来对应。那么用户和角色也是一样的),登录的时候把权限信息封装到UserDetails实现类中,然后实现getAuthorities方法,框架底层Authentication就会调用此方法获取传进来的权限信息存入redis,那么在登录接口里就可以从redis经过过滤器取出权限信息给到usernamepasswordAuthentionToken中,到时候springSecurity就可以拿到对应的权限信息,进行相应的校验。
=================================================================
注册:
注册要求用户能够在注册界面完成用户的注册。要求用户的基本填写信息不能有跟数据库重复的数据。如果某项重复了注册失败并且要有对应的提示。并且要求用户名,密码,昵称,邮箱都不能为空而且密码必须密文存储到数据库中可以使用我们 jwt 技术进行加密处理,然后添加到表中。还有对应的微信登录功能
=================================================================
首页模块
首页商品展示和分类入口展示,然后平台有什么优惠或者送红包什么的都会在用户进入首页的时候进行展示。
=================================================================
用户管理模块:
对用户进行一些增删改查的操作
=================================================================
6. 你觉得项目中有什么特色/亮点
在我负责的这几个模块和功能中,我的一个测试代码覆盖率达到了百分之八十以上主要使用了junit单元测试框架还有我的一个书写格式和注释的标识都有去严格遵守公司的一个规定。
然后我也会对编写代码时进行优化,通过日志去记录接口的调用信息(有打印所访问这个接口的URL、业务的一个名称或者说接口的一个名称、http请求方式、方法所在的类还有方法名、访问接口的ip地址、请求参数、响应参数数据),这样可以便于我们进行一些调试和排查,然后因为可能有很多的接口对原有的功能去增加这个功能的增强并且都要进行一个增强,所以我采用的是一个spring AOP(面向切面)的一个方式它可以是批量的进行增强,而且aop的增强功能对原有的逻辑没有耦合出现。
7. 你开发项目过程中有没有遇到过什么问题(重点)
在商品详情展示中有一个展示月售的功能,每个用户在购买后都会增加该商品的月售数据,一开始是对对应的表里面修改一条字段viewcont来实现的,在测试的时候出现了问题,实际上对一条字段的更改默认情况下mysql会对这条记录进行一个写锁的,那在写锁的情况下如果有其他用户进行一个访问其实是会受到影响的,如果并发量大的情况下肯定会对性能造成影响。
解决方案
所以跟我一旁的同事讨论,引入redis,那么对应浏览次数更新的时候前端请求到后端后端直接从redis里面进行更新,读的话也从redis里面去读。但开始的时候是redis是没有对应商品的月售数据的,那么可以在程序启动的时候可以先把mysql当中的商品id和月售量读取出来然后把id做为key月售量作为值存到redis中,那么在实际操作的时候前端请求后端,后端对reids里的对应月售量的数据进行递增。然后就是在程序启动时把商品的月售量存储到redis中,我们可以实现CommandLineRunner这个注解加入到spring容器后,这样就会在程序启动的时候就spring会帮助我们执行对应的代码,然后我们还会用到rabbitmq延时死信队列每隔10分钟把Redis中的浏览量异步更新到数据库中也可以防止数据丢失问题(比如redis数据在更新完之后,mysql数据更新完之前,redis挂掉了也不会丢失数据)。然后读取商品月售量的时候就从redis里面读取就解决了这个问题。
问题:商品月售量的递增如果只是更改表里字段高并发的情况下会对性能造成影响
1、在应用启动时把商品的月售量存储到redis中
2、每隔10分钟把Redis中的月售量更新到数据库中
3、更新月售量时去更新redis中的数据
4、进入商品详情时或者在首页展示时从redis读取月售量
8. 你做完项目有什么感受
在我做商品详情的时候,在展示父子评论时的子评论出现了问题,接口能查到但是前端不显示也是思考了挺久,最终发现了我的问题,vo类里的封装子评论的list集合字段名跟前端的不对应,所以出现了前端取不到数据的情况改一下就可以了。在解决问题之前啊我去问前端的兄弟才知道 。也是感受到了团队的重要性。
标签:登录,项目,redis,用户,商品,模块,权限 From: https://www.cnblogs.com/Zz198/p/16751281.html