阅读 421

软件架构-解密电商系统营销-会员模块业务

上次说了商品,商品分类,品牌,分类的属性,规格。很多电商网站例如:京东,国美,苏宁他们的商品都是存储在redis中的,通过请求获取到的redis进行js的渲染动态的展示商品的信息。

(一)营销模块

  • 营销工具

  • 营销活动

商品的ID,营销工具的ID,营销工具的编号,营销工具的类型(商品级别的,订单级别的,全站级别的),渠道(PC端的,IOS端的,android端的)

  • 营销活动对应的订单数据

针对营销活动产生的订单

  • 营销技术方案

1个用户或者一个商品对应1-3个营销活动,1万个商品(购物车)就有3万个营销活动如果持久化到mysql上,mysql肯定是受不了的。如果是100个用户,双十一必须挂了服务。

优化方案(缓存,redis也会有问题。redis里面存3万多条数据,浪费了大量的网络资源)

解决方案是:类似新华字典一样,redis里面针对某个活动只存储key值,内容保存在JVM cache中。因为目前都是存在JVM中,如果是分布式同步下,需要使用zookeeper。

####(二)会员模块

电商里面最复杂的就是商品,最简单的业务就是会员。

  • 业务

会员模块用户注册、登录、找回密码、积分业务

  • 技术点:会员SSO、分库分表

单点登录。1.session如何存储的(redis)

单点登录。2、服务端如何获取你信息?Token(客户端跟服务端 包含登录)

sale.jd.com登录 item.jd.com(我不知道你登录) 登录后把token放入redis中作为key,token的信息保存在cookies中,当访问在item.jd.com后,通过cookies里面的token来确认用户是否登录。

分库分表。hash取模、list预定义、range范围,具体都是通过shardingjdbc处理的

说说之前的公司关于会员表一共8个库,后来变成了16个库。这个是如何处理的。

1.当时8个库的分库思路是通过hash取模的方式。(每个库800万数据) 2.如果改成16个库,凌晨进行处理,先将数据进行处理分为:待迁移%8、 (服务可用)迁移中(%8) 、迁移完(%16),通过copy的方式。2个小时搞定的。 3.迁移完后进行取模改成16。停机2个小时。 4.当时同事提出不停机,如果在这个期间会员信息发生修改,通过binlog的方式在新迁移的信息通过binlog的方式在新迁移的库中执行,因为比较麻烦后来放弃了。 5.直接停机2个小时。前提这些都是在测试环境测试过了。迁移完后等于2份,一个在0库,一个在16库,删除原来0库中的数据。

  • 表设计

t_account会员表

参数名称类型主键唯一
id会员IDintY
nickname昵称varchary
account用户名_out_当前时间戳varchary
password密码varchar
accountType会员类型。qq,sinawb,alipayString
trueName真实姓名String
sex性别。m:男,f:女,s:保密String
birthday出生年月日Date
province省份String
city所在城市varchar
address联系地址varchar
postcode邮政编码varchar
cardNO证件号码varchar
cardType证件类型varchar
grade等级int
amount消费额money
tel电话varchar
emailEmail地址varchary
emailIsActive邮箱是否已激活。y:已激活,n:未激活。默认nString
freeze是否冻结 n:未冻结,y:已冻结;默认nString
freezeStartdate冻结的开始日期Date
freezeEnddate冻结的结束日期Date
lastLoginTime最后登录时间Date
lastLoginIp最后登录IPString
lastLoginArea最后登陆地点String
diffAreaLogin是否是异地登陆y:是,n:否String
regeistDate注册日期Date
addressID配送信息IDInt
openIdQQ登陆返回Stringy
accessTokenQQ登陆返回String
alipayUseId支付宝快捷登陆返回的用户IDStringy
sinaWeiboID新浪微博登陆返回的用户IDStringy
rank会员等级。和t_accountType.code进行挂钩。默认R1String
score会员积分。默认0Int

t_accountRank会员级别表

参数名称类型主键
id自增int
code级别编码R1:普通会员,0-499R2:铜牌会员,积分范围500-999R3:银牌会员,1000-1999R4:金牌会员,2000-4000R5:钻石会员,大于4000String
name级别名称String
minScore最小积分Int
maxScore最大积分Int
remark备注String

t_address配送地址信息表

参数名称类型主键
id自增Int
account会员账号String
name收货人姓名String
province省份String
city城市String
area区域String
pcadetail省市区的地址中文合并String
address收货人详细地址String
zip收货人邮编String
phone收货人电话号码String
mobile收货人手机号码String
isdefault是否默认;n=不是,y=默认String默认n

(三)权限模块

很多系统的权限这块 公共。权限系统一般有:账号、角色、权限、资源。

权限可以分为三种:页面权限,操作权限,数据权限。

在互联网公司有个专业术语:权限这块防小人(不懂电脑的),防君子(IT人员)

  • 页面权限

控制你可以看到哪个页面,看不到哪个页面。

很多系统都只做到了控制页面这一层级,它实现起来比较简单,一些系统会这样设计,但是比较古板,控制的权限不精细,难以在页面上对权限进行更下一层级的划分。

  • 操作权限

则控制你可以在页面上操作哪些按妞。

延伸:当我们进入一个页面,我们的目的无非是在这个页面上进行增删改查,那在页面上对应的操作可能是:查询,删除,编辑,新增四个按钮。 可能你在某个页面上,只能查询数据,而不能修改数据。

  • 数据权限

数据权限则是控制你可以看到哪些数据,比如市场A部的人只能看到或者修改A部创建的数据,他看不到或者不能修改B部的数据。

延伸:数据的控制我们一般通过部门去实现,每条记录都有一个创建人,而每一个创建人都属于某个部门,因此部门分的越细,数据的控制层级也就越精细,这里是否有其他好的方式除了部门这个维度还有其他什么方式可以控制数据权限。

  • t_user用户表
参数名称类型备注
id自增长int唯一
username帐号String唯一
password密码stringMD5加密
createtime创建时间String
createAccount创建人String
updatetime最后修改时间String
updateAccount最后修改人String
status状态Stringy:启用,n:禁用;默认y
rid角色IDInt
nickname昵称String
email邮箱String
  • t_role角色表
参数名称类型备注
id自增长int唯一
role_name角色名称String
role_desc角色描述string
role_dbPrivilege数据库权限String
status角色状态,如果角色被禁用,则该角色下的所有的账号都不能使用,除非角色被解禁。Stringy:启用,n:禁用;默认y
  • t_privilege权限表
参数名称类型备注
id自增长int唯一
rid角色IDint
mid资源IDint
  • t_menu资源表
参数名称类型备注
id自增长int唯一
pid父IDInt
url资源String
name资源名称string
orderNum序号int
type功能类型Stringmodule:模块page:页面button:功能

(四)黑科技动态执行aop里面的方法

大型网络公司内部使用的,建议内部粉丝专用,这里不做演示,详细使用建议联系我。 源码:github.com/limingios/n…

1、存储在jvm的对象可视化 可以操作 2、调试bug比较有用 查看最新代码 3、给系统留后门(生产 不需要重启机器可以改配置 )

  • 在pom.xml 同级目录放入dynamo.jar

  • pom.xml 中的配置,先将jar包放入web-info
<dependency>
            <groupId>com.gome.spring.compents</groupId>
            <artifactId>dynamo</artifactId>
           <scope>system</scope>
           <systemPath>${basedir}\..\dynamo.jar</systemPath>
           <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>
复制代码
  • web.xml中加入
<servlet>
        <servlet-name>springdyn</servlet-name>
        <servlet-class>com.gome.spring.compents.servlet.DynServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>springdyn</servlet-name>
        <url-pattern>/dyn/admin/*</url-pattern>
    </servlet-mapping>

复制代码
  • 访问方式

http://ip:端口/项目名称/dyn/admin 用户名:admin 密码: admin

PS:今天说了营销的设计思路:营销工具,营销活动,营销活动订单。 会员管理:单点问题,会员信息session共享问题。权限问题:页面权限,操作权限,数据权限。黑科技:动态aop控制工具。

文章分类
后端
文章标签