【业务功能篇68】电商项目相关核心设计

https证书

http

超文本传输协议:

超文本:包括:文字,图片,音频,视频等。

传输:客户端向服务端发东西,服务端向客户端发东西。

协议:三方协议。怎么传,错误处理。责权利。

总结:在计算机世界中:两点(客户端,服务端)直接传输 超文本的一个约定 、 规范。应用层协议。

域名解析过程:

  1. www.taobao.com
  2. 浏览器缓存
  3. 操作系统缓存。(hosts,有可能被篡改)
  4. LDNS(本地域名服务器)
  5. 根域名(cn,com):com
  6. 主域名服务器(taobao.com)
  7. 具体域名服务器(www.taobao.com)–>ip
  8. 缓存(ttl,过期时间)

服务端

公钥,私钥

keystore

存储:密钥和证书+公钥的一个实体。(1.公私钥对,2.证书公钥)

keytools

生成keystore

PS D:\Java\jdk1.8.0_131\bin> .\keytool.exe -genkeypair -alias dongbao-alias -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore e:\cer2\dongbao-alias.keystore -storepass 123456
您的名字与姓氏是什么?
  [Unknown]:  chao
您的组织单位名称是什么?
  [Unknown]:  msb
您的组织名称是什么?
  [Unknown]:  msb
您所在的城市或区域名称是什么?
  [Unknown]:  bj
您所在的省/市/自治区名称是什么?
  [Unknown]:  bj
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=chao, OU=msb, O=msb, L=bj, ST=bj, C=cn是否正确?
  []:  是

PS D:\Java\jdk1.8.0_131\bin>

查看keystore

PS D:\Java\jdk1.8.0_131\bin> .\keytool.exe -list -v -keystore E:\cer2\dongbao-alias.keystore
输入密钥库口令:

密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: dongbao-alias
创建日期: 2021-5-14
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=chao, OU=msb, O=msb, L=bj, ST=bj, C=cn
发布者: CN=chao, OU=msb, O=msb, L=bj, ST=bj, C=cn
序列号: be4b676
有效期开始日期: Fri May 14 20:17:28 CST 2021, 截止日期: Sat May 14 20:17:28 CST 2022
证书指纹:
         MD5: FE:6C:2B:E6:10:AF:4E:65:E6:23:31:2C:0E:7E:B5:65
         SHA1: 02:69:99:B8:FB:7A:84:FD:53:88:60:60:24:9F:91:9D:9A:0B:35:E4
         SHA256: ED:DF:DE:9E:15:EA:CB:68:76:94:FE:C1:C9:B2:89:93:51:FA:E8:5C:9E:9D:B6:03:05:79:87:DD:E0:89:EB:82
         签名算法名称: SHA256withRSA
         版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B4 B9 C3 B6 5A B8 4E 15   AA CB D3 4D 17 8C E1 38  ....Z.N....M...8
0010: 35 3D B5 94                                        5=..
]
]



*******************************************
*******************************************


PS D:\Java\jdk1.8.0_131\bin> .\keytool.exe -list -rfc -keystore E:\cer2\dongbao-alias.keystore
输入密钥库口令:

密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: dongbao-alias
创建日期: 2021-5-14
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
-----BEGIN CERTIFICATE-----
MIICPjCCAaegAwIBAgIEC+S2djANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJj
bjELMAkGA1UECBMCYmoxCzAJBgNVBAcTAmJqMQwwCgYDVQQKEwNtc2IxDDAKBgNV
BAsTA21zYjENMAsGA1UEAxMEY2hhbzAeFw0yMTA1MTQxMjE3MjhaFw0yMjA1MTQx
MjE3MjhaMFIxCzAJBgNVBAYTAmNuMQswCQYDVQQIEwJiajELMAkGA1UEBxMCYmox
DDAKBgNVBAoTA21zYjEMMAoGA1UECxMDbXNiMQ0wCwYDVQQDEwRjaGFvMIGfMA0G
CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEXr8P0dlvpZRhcKSkKgfzSRA3TpH8RfZc
7b529PeiaRQGm7cXlath5w0Nj1gs6jZWSzltcf7SIdMEkpxTX4/xbXt8v/87L7Dd
icGOt4+VVh6NOrqB9HhNqeEtGRMv+DAHg6zij3uA+YCNA40Oretojjf4v51QSsvf
Qv6W4DWhTQIDAQABoyEwHzAdBgNVHQ4EFgQUtLnDtlq4ThWqy9NNF4zhODU9tZQw
DQYJKoZIhvcNAQELBQADgYEAO44gcNl5M2J8aYovmV+yh48gvF3JXjE0UudfHony
/3Gy36HIvJxADrKcTZ+6ScCg9w/BzJdYaQyHYvALG/ICMc4EMQhwPsiDu4VGLQqF
HxWSY0Is5gBSIV+WHa+KxgQ5j05qeIOIxt5peBJg/+ShuAdyn2e0OIwzaUq6fcqh
698=
-----END CERTIFICATE-----


*******************************************
*******************************************


PS D:\Java\jdk1.8.0_131\bin>

代码验证过了。公私钥对没问题。

客户端

CA的公钥

导出证书

PS D:\Java\jdk1.8.0_131\bin> .\keytool.exe -exportcert -alias dongbao-alias -keystore E:\cer2\dongbao-alias.keystore -file e:\cer2\my.cer
输入密钥库口令:
存储在文件 <e:\cer2\my.cer> 中的证书
PS D:\Java\jdk1.8.0_131\bin>

生成带域名的keystore

PS D:\Java\jdk1.8.0_131\bin> .\keytool.exe -genkeypair -alias dongbao-alias -keypass 123456 -keyalg RSA -validity 365 -keystore e:\cer2\dongbao-alias.keystore -storepass 123456 -ext san=dns:localhost
您的名字与姓氏是什么?
  [Unknown]:  chao
您的组织单位名称是什么?
  [Unknown]:  msb
您的组织名称是什么?
  [Unknown]:  msb
您所在的城市或区域名称是什么?
  [Unknown]:  msb
您所在的省/市/自治区名称是什么?
  [Unknown]:  cn
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=chao, OU=msb, O=msb, L=msb, ST=cn, C=cn是否正确?
  []:  是

PS D:\Java\jdk1.8.0_131\bin> .\keytool.exe -exportcert -alias dongbao-alias -keystore E:\cer2\dongbao-alias.keystore -file e:\cer2\my.cer
输入密钥库口令:
存储在文件 <e:\cer2\my.cer> 中的证书
PS D:\Java\jdk1.8.0_131\bin>

nginx

自己装openssl

PS E:\cer2\nginx> openssl genrsa -des3 -out dongbao.key 1024
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
..................++++++
....++++++
e is 65537 (0x10001)
Enter pass phrase for dongbao.key:
Verifying - Enter pass phrase for dongbao.key:
PS E:\cer2\nginx> openssl req -new -key dongbao.key -out dongbao.csr
Enter pass phrase for dongbao.key:
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:bj
Locality Name (eg, city) []:bj
Organization Name (eg, company) [Internet Widgits Pty Ltd]:msb
Organizational Unit Name (eg, section) []:msb
Common Name (e.g. server FQDN or YOUR name) []:cpf.com
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:
PS E:\cer2\nginx> openssl rsa -in .\dongbao.key.src -out dongbao.key
Enter pass phrase for .\dongbao.key.src:
writing RSA key
PS E:\cer2\nginx> openssl x509 -req -days 365 -in .\dongbao.csr -signkey .\dongbao.key -out dongbao.crt
Loading 'screen' into random state - done
Signature ok
subject=/C=cn/ST=bj/L=bj/O=msb/OU=msb/CN=cpf.com/emailAddress=[email protected]
Getting Private key
PS E:\cer2\nginx>

conf


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
	
	
	upstream com.cpf {
		server 127.0.0.1:8080; # 需要监听的端口名 我用的
		keepalive 64;
	}

    # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  cpf.com;
		

        ssl_certificate      E://cer2//nginx//dongbao.crt;
        ssl_certificate_key  E://cer2//nginx//dongbao.key;
		

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            proxy_pass http://com.cpf;
        }
    }
	

}


参数防篡改

防篡改

api(接口) 公司用。

其他公司会用。

这俩参数:

appId(阿里的飞猪,xx部门,下应用id), appKey(appSecret)(网络中不传输。),默认值就是你当前公司的就ok了。

提供方将这两个参数 下发给 使用方。

思路

用户参数,用户的签名。

sign1=Md5/sha256(age=10name=张三appSecret=xxx)

传给后端:name=李四&age=10&sign=xxxxxxx,

sign2=Md5/sha256(age=10name=李四appSecret=xxx)

md5:

74f0c8c14fd2869121c910601e9ea859

sha256:

b5cd72e2fccedcc36b028cd1d995af7218ce53e30de72fc98d4ecc107f495b7b

加密不可逆的散列算法。

可加密的参数是任意长度的,所以用byte数组为输入参数。

sha256的碰撞几率 远远 小于 md5,sha256更安全。

防止重复请求

加时间戳(2min)

你请求过的url,我做了md5之后,放到redis。

参数自动获取

// 获取get中的参数
		Enumeration<String> parameterNames = httpServletRequest.getParameterNames();
		while (parameterNames.hasMoreElements()){
			//获取 name
			String parametename = parameterNames.nextElement();

			// 获取值
			String parameterValue = httpServletRequest.getParameter(parametename);
			map.put(parametename,parameterValue);
		}

get和post区别

其实没有长度限制。get /uri http/1.1 post /uri http/1.1.长度的限制是由浏览器决定的。

其实参数位置一样。get?a=b&dd=d 可以放body的。 post body也可以放url中。参数位置可以一样。

只要是http,都不安全。

tcp和ip,可靠的。

汽车在高速路上。get post

运输公司 限制了参数长度的请求。

/asdfa/asdfasdf?asdfa=asdf&a=b md5值= redis中 , 无法保证 不误杀。(两次不同的请求是一样的摘要)

header里 :key value

商品中心

揪头发(把自己拔高)

京东,淘宝 spu和sku的 重视度不同?

淘宝减少 存储空间。多个sku共享一个详情页。

京东重视sku,更精细化以下,用户体验好。便于物流管理。

淘宝的商品量级:亿级,ioe。ibm,Oracle,emc存储

京东:百万级。

商品中心两部分:买家:多样化展示;管理端:方便管理,或者流转。

基本概念

SKU:Stock Keeping Unit: 库存保存单元。库存控制的最小可用单位。iphone12 plus 128g。它有多少个,库存。

SPU: Standard Product Unit:标准化产品单元。iphone12 (品牌苹果)。

spu是sku的大集。

sku 能对应 几个 spu?

一条白色花边xxxx修饰裤子=sku,对应2个spu:1. 七分裤夏季薄款运动休闲,2.男士大码小脚潮。xxx更多的。

买家也得关心sku。

商品 订单数量 sku 组合sku 仓库发货sku
确定的桌子 1 sku1 1*sku1
确定的凳子 1 sku2 1*sku2
一套饭桌 套餐 1 sku3 1sku1 + 4sku2(1) 1sku1 + 4sku2

类目

SKU: 能定位到一个实际商品的信息。

SPU: 商品。

类目:sku的分类。

前台类目:便于用户搜索的。

后台类目:运营人员管理sku,(用户是商家或者平台)。

店铺类目:店家自定义类目。

后台类目:服装->女装->连衣裙; 前台类目:女装->连衣裙

前台:夏季热卖。

03年上线,08年才区分 前台和后台类目。

类目设计

数据结构 + 操作(删除需要删除标记,逻辑删除,排序需要排序字段)

属性。

管理类目(删除,属性和商品),管理商品(添加商品,增删改查)

树形结构。父类目ID。3、4级。

叶子类目。商品只存在于叶子类目。是否叶子节点。

操作

查询:

  1. 前台:用户端,一般静态。
  2. 后台:树形结构。延迟加载。后台管理类目的时候,都用动态。

新增,修改,

删除:

逻辑删除,有孩子不删除。

指向谁,谁是爹,谁多。

搜索词对应 前台类目。

品牌:

logo,中文名,英文名,产地,xxxxxx,xxxx。

品牌和类目的对应关系:

雀巢:咖啡,奶粉,饮料。

服装->女装:属性A们

通讯->手机:属性B们

促销系统

目的:

  1. 拉新。简历中,体现你的个人职责中的价值。

  2. 去库存。库存也是成本。减少公司的库存成本。节省几百万库存费用。

  3. 扩大系统品牌的知名度。

  4. 新app上线。

  5. 常态,竞争。

  6. 提高销量,客单量,客单价。(你用xxx技术,实现了xxx业务,给公司带来了xxxx销量,提高了xxx订单量,提高了xxx客单价)。

1.5亿日活。

长时间周期中,想测试哪个活动策略 最优。----A/B测试(灰度发布,金丝雀发布)。

10亿用户。1.5亿(在北京 55%做测试),8.5亿(在杭州)。

促销类型

满减促销:

  1. 阶梯满减:满100减10,满300减50.
  2. 每满减:每满100,减10。等差数列。

单品促销:数量限制,某个商品,打N折。

套装促销:A商品10,B商品10,C商品10,A+B+C=25。

赠品促销:买主商品,送N个赠品。

满赠促销:

  1. 满100送东西A,
  2. 满100,加10块,送东西B
  3. 满100送自拍杆,满200,送充电宝,满500,送手机。

多买优惠促销:

  1. M元买N件
  2. M件打N折

定金促销:

  1. 交100,到时候享受1000元购买2000元东西。

  2. 交10块,顶100元。(90元)


时间段

促销活动:

活动名称:618大促活动,活动规则:单品促销。时间段(开始时间,结束时间)

会员系统

目的:提高用户粘性,开发新用户,增加用户活跃度。

CRM:customer relationship management,客户关系管理系统。

两种

2C:会员基础信息,成长值,积分

2B:组织架构管理,客户拓展,店铺的会员体系。

设计上 产生重合。

设计系统之前,要充分理解需求。事半功倍。抽取系统的共同点。

场景

会员系统,被几乎所有的系统调用。

基础信息管理

基本信息:用户属性。(注册时间,手机号,性别,会员等级,积分,余额,收货地址。)

优惠券信息:隶属于 促销系统。 优惠券信息,消费明细,金额,使用条件,使用时间,有效期。

订单信息:id,冗余(快照)

售后信息:客诉,维保

会员等级:铁牌,铜牌,银牌,金牌。(有明确值的时候,需要有 变动记录)

会员积分。(有明确值的时候,需要有 变动记录) record

聚合的出口。

会员成长体系

淘宝:淘气值。100,对应不同 的会员等级:普通会员,超级会员,APASS

​ RFM模型。

京东:成长值。注册会员,铜牌,银牌,金牌,钻石。

​ 用户行为增长模型。

RFM 客户消费行为特征分析模型

Recency, 最近一次消费时间。

Frequency, 某一个时间范围内的消费频次。

Monetary,某一个时间范围内:平均客单价,累计交易额。

字典表

R 对应的值 F M
7天 50 10以上 50 1000元 50
100天 -50

多条记录。

扩展:登录次数,评价次数,评价图,晒单等。

用户行为增长模型。

单向积累。

指标:登录一次,+几分。 login。购物后,+几分。评价后,+几分,晒单 +几分。退货后,-几分。,删除评论,-几分。

多个系统调用同一个功能,解耦。二方库。

第三方:1方,微信是3方。二方(我调我公司的接口,jar包)


给平台对你采取的措施,提供依据。

数据分析。

荣誉感。权益。APASS. (高级退货功能),不需要退货的。

积分体系

加:动作产生积分。

减:订单结算积分抵扣,积分商城购买商品,用户权益置换。

实际消费价值。

你可能感兴趣的:(业务场景实例问题,电商项目,电商系统设计)