『互联网架构』软件架构-解密电商系统营销-会员模块业务(73)

上次说了商品,商品分类,品牌,分类的属性,规格。很多电商网站例如:京东,国美,苏宁他们的商品都是存储在redis中的,通过请求获取到的redis进行js的渲染动态的展示商品的信息。
源码:https://github.com/limingios/netFuture/tree/master//源码/『互联网架构』软件架构-解密电商系统营销-会员模块业务(72)/

(一)营销模块

  • 营销工具

  • 营销活动
    > 商品的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 会员ID int Y
nickname 昵称 varchar y
account 用户名out当前时间戳 varchar y
password 密码 varchar
accountType 会员类型。qq,sinawb,alipay String
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
email Email地址 varchar y
emailIsActive 邮箱是否已激活。y:已激活,n:未激活。默认n String
freeze 是否冻结 n:未冻结,y:已冻结;默认n String
freezeStartdate 冻结的开始日期 Date
freezeEnddate 冻结的结束日期 Date
lastLoginTime 最后登录时间 Date
lastLoginIp 最后登录IP String
lastLoginArea 最后登陆地点 String
diffAreaLogin 是否是异地登陆y:是,n:否 String
regeistDate 注册日期 Date
addressID 配送信息ID Int
openId QQ登陆返回 String y
accessToken QQ登陆返回 String
alipayUseId 支付宝快捷登陆返回的用户ID String y
sinaWeiboID 新浪微博登陆返回的用户ID String y
rank 会员等级。和t_accountType.code进行挂钩。默认R1 String
score 会员积分。默认0 Int

t_accountRank会员级别表

参数 名称 类型 主键
id 自增 int
code 级别编码R1:普通会员,0-499R2:铜牌会员,积分范围500-999R3:银牌会员,1000-1999R4:金牌会员,2000-4000R5:钻石会员,大于4000 String
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 密码 string MD5加密
createtime 创建时间 String
createAccount 创建人 String
updatetime 最后修改时间 String
updateAccount 最后修改人 String
status 状态 String y:启用,n:禁用;默认y
rid 角色ID Int
nickname 昵称 String
email 邮箱 String
  • t_role角色表
参数 名称 类型 备注
id 自增长 int 唯一
role_name 角色名称 String
role_desc 角色描述 string
role_dbPrivilege 数据库权限 String
status 角色状态,如果角色被禁用,则该角色下的所有的账号都不能使用,除非角色被解禁。 String y:启用,n:禁用;默认y
  • t_privilege权限表
参数 名称 类型 备注
id 自增长 int 唯一
rid 角色ID int
mid 资源ID int
  • t_menu资源表
参数 名称 类型 备注
id 自增长 int 唯一
pid 父ID Int
url 资源 String
name 资源名称 string
orderNum 序号 int
type 功能类型 String module:模块page:页面button:功能

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

大型网络公司内部使用的,建议内部粉丝专用,这里不做演示,详细使用建议联系我。
源码:https://github.com/limingios/netFuture/tree/master//源码/『互联网架构』软件架构-解密电商系统营销-会员模块业务(72)/

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控制工具。

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
>>原文链接地址:『互联网架构』软件架构-解密电商系统营销-会员模块业务(73)
上一篇: 下一篇:

发表评论

电子邮件地址不会被公开。 必填项已用*标注