商城项目
该项目的主要内容
谷粒商城是一个B2C模式的电商平台,销售自营商品给客户
前后分离开发,分为内网部署和外网部署,外网是面向公众访问的。
访问前端项目,可以有手机APP,电脑网页;内网部署的是后端集群,
前端在页面上操作发送请求到后端,在这途中会经过Nginx集群,
Nginx把请求转交给API网关(springcloud gateway)(网关可以根据当
前请求动态地路由到指定的服务,看当前请求是想调用商品服务还是购
物车服务还是检索服务),从路由过来如果请求很多,可以负载均衡地调
用商品服务器中一台(商品服务复制了多份),当商品服务器出现问题也
可以在网关层面对服务进行熔断或降级(使用阿里的sentinel组件),网关
还有其他的功能如认证授权、限流(只放行部分到服务器)等。
到达服务器后进行处理(springboot为微服务),服务与服务可能会相互
调用(使用feign组件),有些请求可能经过登录才能进行(基于OAuth2.0的
认证中心。安全和权限使用springSecurity控制)
服务可能保存了一些数据或者需要使用缓存,我们使用redis集群(分片+哨兵集
群)。持久化使用mysql,读写分离和分库分表。
服务和服务之间会使用消息队列(RabbitMQ),来完成异步解耦,分布式事务
的一致性。有些服务可能需要全文检索,检索商品信息,使用ElaticSearch。
服务可能需要存取数据,使用阿里云的对象存储服务OSS。
项目上线后为了快速定位问题,使用ELK对日志进行处理,使用LogStash收
集业务里的各种日志,把日志存储到ES中,用Kibana可视化页面从ES中检
索出相关信息,帮助我们快速定位问题所在。
在分布式系统中,由于我们每个服务都可能部署在很多台机器,服务和服务
可能相互调用,就得知道彼此都在哪里,所以需要将所有服务都注册到注册
中心。服务从注册中心发现其他服务所在位置(使用阿里Nacos作为注册
中心)。
每个服务的配置众多,为了实现改一处配置相同配置就同步更改,就需要配
置中心,也使用阿里的Nacos,服务从配置中心中动态取配置。
服务追踪,追踪服务调用链哪里出现问题,使用springcloud提供的Sleuth、
Zipkin、Metrics,把每个服务的信息交给开源的Prometheus进行聚合分析,
再由Grafana进行可视化展示,提供Prometheus提供的AlterManager实时
得到服务的警告信息,以短信/邮件的方式告知服务开发人员。
还提供了持续集成和持续部署。项目发布起来后,因为微服务众多,每一个都打
包部署到服务器太麻烦,有了持续集成后开发人员可以将修改后的代码提交到
github,运维人员可以通过自动化工具Jenkins Pipeline将github中获取的代码打
包成docker镜像,最终是由k8s集成docker服务,将服务以docker容器的方式运行。
反映了需要创建的微服务以及相关技术。
前后分离开发。前端项目分为admin-vue(工作人员使用的后台管理系统)、
shop-vue(面向公众访问的web网站)、app(公众)、小程序(公众)
商品服务:商品的增删改查、商品的上下架、商品详情
支付服务
优惠服务
用户服务:用户的个人中心、收货地址
仓储服务:商品的库存
秒杀服务
订单服务:订单增删改查
检索服务:商品的检索ES
中央认证服务:登录、注册、单点登录、社交登录
购物车服务
后台管理系统:添加优惠信息等
反映了需要创建的微服务以及相关技术。
前后分离开发。前端项目分为admin-vue(工作人员使用的后台管理系统)、
shop-vue(面向公众访问的web网站)、app(公众)、小程序(公众)
商品服务:商品的增删改查、商品的上下架、商品详情
支付服务
优惠服务
用户服务:用户的个人中心、收货地址
仓储服务:商品的库存
秒杀服务
订单服务:订单增删改查
检索服务:商品的检索ES
中央认证服务:登录、注册、单点登录、社交登录
购物车服务
后台管理系统:添加优惠信息等
进度条 2021.10.22
1.我服务端有mysql 5.7.6(作nacos的持久化),所以配置数据库时,并没有运行新的mysql容器,也没有挂载,后续有问题再说。
2.maven暂用中央仓库
3.jdk 11
4.redis持久化时,挂载的文件redis.conf操作不了,所以我在启动容器时直接追加命令了
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf --appendonly yes
进入redis的命令:
docker exec -it redis redis-cli
该项目中引入了spring-boot-maven-plugin,打包时会去扫描项目main方法入口,也就是说引入该配置,你就必须在项目src/main/java/下创建一个spring-boot启动类。
<!-- 该模块没有需要启动的web模块,故不需要该插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>-->
6.我的git忽略目录和博主不一致
在maven窗口刷新,并点击+号,找到刚才的pom.xml添加进来,发现多了个root。这样比如运行root的clean命令,其他项目也一起clean了。
修改总项目的.gitignore,把小项目里的垃圾文件在提交的时候忽略掉
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
**/mvnw
**/mvnw.cmd
**/.mvn
**/target
.idea
**/.gitignore
**/README.md
7.数据库
所有的数据库数据再复杂也不建立外键,因为在电商系统里,数据量大,
做外键关联很耗性能。
真的??
/*==============================================================*/
/* Database: gulimall_oms */
/*==============================================================*/
create database gulimall_oms;
use gulimall_oms;
/*==============================================================*/
/* Table: oms_order */
/*==============================================================*/
drop table if exists oms_order;
create table oms_order
(
id bigint not null auto_increment comment \'id\',
member_id bigint comment \'member_id\',
order_sn char(32) comment \'订单号\',
coupon_id bigint comment \'使用的优惠券\',
create_time datetime comment \'create_time\',
member_username varchar(200) comment \'用户名\',
total_amount decimal(18,4) comment \'订单总额\',
pay_amount decimal(18,4) comment \'应付总额\',
freight_amount decimal(18,4) comment \'运费金额\',
promotion_amount decimal(18,4) comment \'促销优化金额(促销价、满减、阶梯价)\',
integration_amount decimal(18,4) comment \'积分抵扣金额\',
coupon_amount decimal(18,4) comment \'优惠券抵扣金额\',
discount_amount decimal(18,4) comment \'后台调整订单使用的折扣金额\',
pay_type tinyint comment \'支付方式【1->支付宝;2->微信;3->银联; 4->货到付款;】\',
source_type tinyint comment \'订单来源[0->PC订单;1->app订单]\',
status tinyint comment \'订单状态【0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单】\',
delivery_company varchar(64) comment \'物流公司(配送方式)\',
delivery_sn varchar(64) comment \'物流单号\',
auto_confirm_day int comment \'自动确认时间(天)\',
integration int comment \'可以获得的积分\',
growth int comment \'可以获得的成长值\',
bill_type tinyint comment \'发票类型[0->不开发票;1->电子发票;2->纸质发票]\',
bill_header varchar(255) comment \'发票抬头\',
bill_content varchar(255) comment \'发票内容\',
bill_receiver_phone varchar(32) comment \'收票人电话\',
bill_receiver_email varchar(64) comment \'收票人邮箱\',
receiver_name varchar(100) comment \'收货人姓名\',
receiver_phone varchar(32) comment \'收货人电话\',
receiver_post_code varchar(32) comment \'收货人邮编\',
receiver_province varchar(32) comment \'省份/直辖市\',
receiver_city varchar(32) comment \'城市\',
receiver_region varchar(32) comment \'区\',
receiver_detail_address varchar(200) comment \'详细地址\',
note varchar(500) comment \'订单备注\',
confirm_status tinyint comment \'确认收货状态[0->未确认;1->已确认]\',
delete_status tinyint comment \'删除状态【0->未删除;1->已删除】\',
use_integration int comment \'下单时使用的积分\',
payment_time datetime comment \'支付时间\',
delivery_time datetime comment \'发货时间\',
receive_time datetime comment \'确认收货时间\',
comment_time datetime comment \'评价时间\',
modify_time datetime comment \'修改时间\',
primary key (id)
);
alter table oms_order comment \'订单\';
/*==============================================================*/
/* Table: oms_order_item */
/*==============================================================*/
drop table if exists oms_order_item;
create table oms_order_item
(
id bigint not null auto_increment comment \'id\',
order_id bigint comment \'order_id\',
order_sn char(32) comment \'order_sn\',
spu_id bigint comment \'spu_id\',
spu_name varchar(255) comment \'spu_name\',
spu_pic varchar(500) comment \'spu_pic\',
spu_brand varchar(200) comment \'品牌\',
category_id bigint comment \'商品分类id\',
sku_id bigint comment \'商品sku编号\',
sku_name varchar(255) comment \'商品sku名字\',
sku_pic varchar(500) comment \'商品sku图片\',
sku_price decimal(18,4) comment \'商品sku价格\',
sku_quantity int comment \'商品购买的数量\',
sku_attrs_vals varchar(500) comment \'商品销售属性组合(JSON)\',
promotion_amount decimal(18,4) comment \'商品促销分解金额\',
coupon_amount decimal(18,4) comment \'优惠券优惠分解金额\',
integration_amount decimal(18,4) comment \'积分优惠分解金额\',
real_amount decimal(18,4) comment \'该商品经过优惠后的分解金额\',
gift_integration int comment \'赠送积分\',
gift_growth int comment \'赠送成长值\',
primary key (id)
);
alter table oms_order_item comment \'订单项信息\';
/*==============================================================*/
/* Table: oms_order_operate_history */
/*==============================================================*/
drop table if exists oms_order_operate_history;
create table oms_order_operate_history
(
id bigint not null auto_increment comment \'id\',
order_id bigint comment \'订单id\',
operate_man varchar(100) comment \'操作人[用户;系统;后台管理员]\',
create_time datetime comment \'操作时间\',
order_status tinyint comment \'订单状态【0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单】\',
note varchar(500) comment \'备注\',
primary key (id)
);
alter table oms_order_operate_history comment \'订单操作历史记录\';
/*==============================================================*/
/* Table: oms_order_return_apply */
/*==============================================================*/
drop table if exists oms_order_return_apply;
create table oms_order_return_apply
(
id bigint not null auto_increment comment \'id\',
order_id bigint comment \'order_id\',
sku_id bigint comment \'退货商品id\',
order_sn char(32) comment \'订单编号\',
create_time datetime comment \'申请时间\',
member_username varchar(64) comment \'会员用户名\',
return_amount decimal(18,4) comment \'退款金额\',
return_name varchar(100) comment \'退货人姓名\',
return_phone varchar(20) comment \'退货人电话\',
status tinyint(1) comment \'申请状态[0->待处理;1->退货中;2->已完成;3->已拒绝]\',
handle_time datetime comment \'处理时间\',
sku_img varchar(500) comment \'商品图片\',
sku_name varchar(200) comment \'商品名称\',
sku_brand varchar(200) comment \'商品品牌\',
sku_attrs_vals varchar(500) comment \'商品销售属性(JSON)\',
sku_count int comment \'退货数量\',
sku_price decimal(18,4) comment \'商品单价\',
sku_real_price decimal(18,4) comment \'商品实际支付单价\',
reason varchar(200) comment \'原因\',
description述 varchar(500) comment \'描述\',
desc_pics varchar(2000) comment \'凭证图片,以逗号隔开\',
handle_note varchar(500) comment \'处理备注\',
handle_man varchar(200) comment \'处理人员\',
receive_man varchar(100) comment \'收货人\',
receive_time datetime comment \'收货时间\',
receive_note varchar(500) comment \'收货备注\',
receive_phone varchar(20) comment \'收货电话\',
company_address varchar(500) comment \'公司收货地址\',
primary key (id)
);
alter table oms_order_return_apply comment \'订单退货申请\';
/*==============================================================*/
/* Table: oms_order_return_reason */
/*==============================================================*/
drop table if exists oms_order_return_reason;
create table oms_order_return_reason
(
id bigint not null auto_increment comment \'id\',
name varchar(200) comment \'退货原因名\',
sort int comment \'排序\',
status tinyint(1) comment \'启用状态\',
create_time datetime comment \'create_time\',
primary key (id)
);
alter table oms_order_return_reason comment \'退货原因\';
/*==============================================================*/
/* Table: oms_order_setting */
/*==============================================================*/
drop table if exists oms_order_setting;
create table oms_order_setting
(
id bigint not null auto_increment comment \'id\',
flash_order_overtime int comment \'秒杀订单超时关闭时间(分)\',
normal_order_overtime int comment \'正常订单超时时间(分)\',
confirm_overtime int comment \'发货后自动确认收货时间(天)\',
finish_overtime int comment \'自动完成交易时间,不能申请退货(天)\',
comment_overtime int comment \'订单完成后自动好评时间(天)\',
member_level tinyint(2) comment \'会员等级【0-不限会员等级,全部通用;其他-对应的其他会员等级】\',
primary key (id)
);
alter table oms_order_setting comment \'订单配置信息\';
/*==============================================================*/
/* Table: oms_payment_info */
/*==============================================================*/
drop table if exists oms_payment_info;
create table oms_payment_info
(
id bigint not null auto_increment comment \'id\',
order_sn char(32) comment \'订单号(对外业务号)\',
order_id bigint comment \'订单id\',
alipay_trade_no varchar(50) comment \'支付宝交易流水号\',
total_amount decimal(18,4) comment \'支付总金额\',
subject varchar(200) comment \'交易内容\',
payment_status varchar(20) comment \'支付状态\',
create_time datetime comment \'创建时间\',
confirm_time datetime comment \'确认时间\',
callback_content varchar(4000) comment \'回调内容\',
callback_time datetime comment \'回调时间\',
primary key (id)
);
alter table oms_payment_info comment \'支付信息表\';
/*==============================================================*/
/* Table: oms_refund_info */
/*==============================================================*/
drop table if exists oms_refund_info;
create table oms_refund_info
(
id bigint not null auto_increment comment \'id\',
order_return_id bigint comment \'退款的订单\',
refund decimal(18,4) comment \'退款金额\',
refund_sn varchar(64) comment \'退款交易流水号\',
refund_status tinyint(1) comment \'退款状态\',
refund_channel tinyint comment \'退款渠道[1-支付宝,2-微信,3-银联,4-汇款]\',
refund_content varchar(5000),
primary key (id)
);
alter table oms_refund_info comment \'退款信息\';
/*==============================================================*/
/* Database: gulimall_pms */
/*==============================================================*/
create database gulimall_pms;
use gulimall_pms;
/*==============================================================*/
/* Table: pms_attr */
/*==============================================================*/
drop table if exists pms_attr;
create table pms_attr
(
attr_id bigint not null auto_increment comment \'属性id\',
attr_name char(30) comment \'属性名\',
search_type tinyint comment \'是否需要检索[0-不需要,1-需要]\',
icon varchar(255) comment \'属性图标\',
value_select char(255) comment \'可选值列表[用逗号分隔]\',
attr_type tinyint comment \'属性类型[0-销售属性,1-基本属性,2-既是销售属性又是基本属性]\',
enable bigint comment \'启用状态[0 - 禁用,1 - 启用]\',
catelog_id bigint comment \'所属分类\',
show_desc tinyint comment \'快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整\',
primary key (attr_id)
);
alter table pms_attr comment \'商品属性\';
/*==============================================================*/
/* Table: pms_attr_attrgroup_relation */
/*==============================================================*/
drop table if exists pms_attr_attrgroup_relation;
create table pms_attr_attrgroup_relation
(
id bigint not null auto_increment comment \'id\',
attr_id bigint comment \'属性id\',
attr_group_id bigint comment \'属性分组id\',
attr_sort int comment \'属性组内排序\',
primary key (id)
);
alter table pms_attr_attrgroup_relation comment \'属性&属性分组关联\';
/*==============================================================*/
/* Table: pms_attr_group */
/*==============================================================*/
drop table if exists pms_attr_group;
create table pms_attr_group
(
attr_group_id bigint not null auto_increment comment \'分组id\',
attr_group_name char(20) comment \'组名\',
sort int comment \'排序\',
descript varchar(255) comment \'描述\',
icon varchar(255) comment \'组图标\',
catelog_id bigint comment \'所属分类id\',
primary key (attr_group_id)
);
alter table pms_attr_group comment \'属性分组\';
/*==============================================================*/
/* Table: pms_brand */
/*==============================================================*/
drop table if exists pms_brand;
create table pms_brand
(
brand_id bigint not null auto_increment comment \'品牌id\',
name char(50) comment \'品牌名\',
logo varchar(2000) comment \'品牌logo地址\',
descript longtext comment \'介绍\',
show_status tinyint comment \'显示状态[0-不显示;1-显示]\',
first_letter char(1) comment \'检索首字母\',
sort int comment \'排序\',
primary key (brand_id)
);
alter table pms_brand comment \'品牌\';
/*==============================================================*/
/* Table: pms_category */
/*==============================================================*/
drop table if exists pms_category;
create table pms_category
(
cat_id bigint not null auto_increment comment \'分类id\',
name char(50) comment \'分类名称\',
parent_cid bigint comment \'父分类id\',
cat_level int comment \'层级\',
show_status tinyint comment \'是否显示[0-不显示,1显示]\',
sort int comment \'排序\',
icon char(255) comment \'图标地址\',
product_unit char(50) comment \'计量单位\',
product_count int comment \'商品数量\',
primary key (cat_id)
);
alter table pms_category comment \'商品三级分类\';
/*==============================================================*/
/* Table: pms_category_brand_relation */
/*==============================================================*/
drop table if exists pms_category_brand_relation;
create table pms_category_brand_relation
(
id bigint not null auto_increment,
brand_id bigint comment \'品牌id\',
catelog_id bigint comment \'分类id\',
brand_name varchar(255),
catelog_name varchar(255),
primary key (id)
);
alter table pms_category_brand_relation comment \'品牌分类关联\';
/*==============================================================*/
/* Table: pms_comment_replay */
/*==============================================================*/
drop table if exists pms_comment_replay;
create table pms_comment_replay
(
id bigint not null auto_increment comment \'id\',
comment_id bigint comment \'评论id\',
reply_id bigint comment \'回复id\',
primary key (id)
);
alter table pms_comment_replay comment \'商品评价回复关系\';
/*==============================================================*/
/* Table: pms_product_attr_value */
/*==============================================================*/
drop table if exists pms_product_attr_value;
create table pms_product_attr_value
(
id bigint not null auto_increment comment \'id\',
spu_id bigint comment \'商品id\',
attr_id bigint comment \'属性id\',
attr_name varchar(200) comment \'属性名\',
attr_value varchar(200) comment \'属性值\',
attr_sort int comment \'顺序\',
quick_show tinyint comment \'快速展示【是否展示在介绍上;0-否 1-是】\',
primary key (id)
);
alter table pms_product_attr_value comment \'spu属性值\';
/*==============================================================*/
/* Table: pms_sku_images */
/*==============================================================*/
drop table if exists pms_sku_images;
create table pms_sku_images
(
id bigint not null auto_increment comment \'id\',
sku_id bigint comment \'sku_id\',
img_url varchar(255) comment \'图片地址\',
img_sort int comment \'排序\',
default_img int comment \'默认图[0 - 不是默认图,1 - 是默认图]\',
primary key (id)
);
alter table pms_sku_images comment \'sku图片\';
/*==============================================================*/
/* Table: pms_sku_info */
/*==============================================================*/
drop table if exists pms_sku_info;
create table pms_sku_info
(
sku_id bigint not null auto_increment comment \'skuId\',
spu_id bigint comment \'spuId\',
sku_name varchar(255) comment \'sku名称\',
sku_desc varchar(2000) comment \'sku介绍描述\',
catalog_id bigint comment \'所属分类id\',
brand_id bigint comment \'品牌id\',
sku_default_img varchar(255) comment \'默认图片\',
sku_title varchar(255) comment \'标题\',
sku_subtitle varchar(2000) comment \'副标题\',
price decimal(18,4) comment \'价格\',
sale_count bigint comment \'销量\',
primary key (sku_id)
);
alter table pms_sku_info comment \'sku信息\';
/*==============================================================*/
/* Table: pms_sku_sale_attr_value */
/*==============================================================*/
drop table if exists pms_sku_sale_attr_value;
create table pms_sku_sale_attr_value
(
id bigint not null auto_increment comment \'id\',
sku_id bigint comment \'sku_id\',
attr_id bigint comment \'attr_id\',
attr_name varchar(200) comment \'销售属性名\',
attr_value varchar(200) comment \'销售属性值\',
attr_sort int comment \'顺序\',
primary key (id)
);
alter table pms_sku_sale_attr_value comment \'sku销售属性&值\';
/*==============================================================*/
/* Table: pms_spu_comment */
/*==============================================================*/
drop table if exists pms_spu_comment;
create table pms_spu_comment
(
id bigint not null auto_increment comment \'id\',
sku_id bigint comment \'sku_id\',
spu_id bigint comment \'spu_id\',
spu_name varchar(255) comment \'商品名字\',
member_nick_name varchar(255) comment \'会员昵称\',
star tinyint(1) comment \'星级\',
member_ip varchar(64) comment \'会员ip\',
create_time datetime comment \'创建时间\',
show_status tinyint(1) comment \'显示状态[0-不显示,1-显示]\',
spu_attributes varchar(255) comment \'购买时属性组合\',
likes_count int comment \'点赞数\',
reply_count int comment \'回复数\',
resources varchar(1000) comment \'评论图片/视频[json数据;[{type:文件类型,url:资源路径}]]\',
content text comment \'内容\',
member_icon varchar(255) comment \'用户头像\',
comment_type tinyint comment \'评论类型[0 - 对商品的直接评论,1 - 对评论的回复]\',
primary key (id)
);
alter table pms_spu_comment comment \'商品评价\';
/*==============================================================*/
/* Table: pms_spu_images */
/*==============================================================*/
drop table if exists pms_spu_images;
create table pms_spu_images
(
id bigint not null auto_increment comment \'id\',
spu_id bigint comment \'spu_id\',
img_name varchar(200) comment \'图片名\',
img_url varchar(255) comment \'图片地址\',
img_sort int comment \'顺序\',
default_img tinyint comment \'是否默认图\',
primary key (id)
);
alter table pms_spu_images comment \'spu图片\';
/*==============================================================*/
/* Table: pms_spu_info */
/*==============================================================*/
drop table if exists pms_spu_info;
create table pms_spu_info
(
id bigint not null auto_increment comment \'商品id\',
spu_name varchar(200) comment \'商品名称\',
spu_description varchar(1000) comment \'商品描述\',
catalog_id bigint comment \'所属分类id\',
brand_id bigint comment \'品牌id\',
weight decimal(18,4),
publish_status tinyint comment \'上架状态[0 - 下架,1 - 上架]\',
create_time datetime,
update_time datetime,
primary key (id)
);
alter table pms_spu_info comment \'spu信息\';
/*==============================================================*/
/* Table: pms_spu_info_desc */
/*==============================================================*/
drop table if exists pms_spu_info_desc;
create table pms_spu_info_desc
(
spu_id bigint not null comment \'商品id\',
decript longtext comment \'商品介绍\',
primary key (spu_id)
);
alter table pms_spu_info_desc comment \'spu信息介绍\';
/*==============================================================*/
/* Database: gulimall_sms */
/*==============================================================*/
create database gulimall_sms;
use gulimall_sms;
drop table if exists sms_coupon;
drop table if exists sms_coupon_history;
drop table if exists sms_coupon_spu_category_relation;
drop table if exists sms_coupon_spu_relation;
drop table if exists sms_home_adv;
drop table if exists sms_home_subject;
drop table if exists sms_home_subject_spu;
drop table if exists sms_member_price;
drop table if exists sms_seckill_promotion;
drop table if exists sms_seckill_session;
drop table if exists sms_seckill_sku_notice;
drop table if exists sms_seckill_sku_relation;
drop table if exists sms_sku_full_reduction;
drop table if exists sms_sku_ladder;
drop table if exists sms_spu_bounds;
/*==============================================================*/
/* Table: sms_coupon */
/*==============================================================*/
create table sms_coupon
(
id bigint not null auto_increment comment \'id\',
coupon_type tinyint(1) comment \'优惠卷类型[0->全场赠券;1->会员赠券;2->购物赠券;3->注册赠券]\',
coupon_img varchar(2000) comment \'优惠券图片\',
coupon_name varchar(100) comment \'优惠卷名字\',
num int comment \'数量\',
amount decimal(18,4) comment \'金额\',
per_limit int comment \'每人限领张数\',
min_point decimal(18,4) comment \'使用门槛\',
start_time datetime comment \'开始时间\',
end_time datetime comment \'结束时间\',
use_type tinyint(1) comment \'使用类型[0->全场通用;1->指定分类;2->指定商品]\',
note varchar(200) comment \'备注\',
publish_count int(11) comment \'发行数量\',
use_count int(11) comment \'已使用数量\',
receive_count int(11) comment \'领取数量\',
enable_start_time datetime comment \'可以领取的开始日期\',
enable_end_time datetime comment \'可以领取的结束日期\',
code varchar(64) comment \'优惠码\',
member_level tinyint(1) comment \'可以领取的会员等级[0->不限等级,其他-对应等级]\',
publish tinyint(1) comment \'发布状态[0-未发布,1-已发布]\',
primary key (id)
);
alter table sms_coupon comment \'优惠券信息\';
/*==============================================================*/
/* Table: sms_coupon_history */
/*==============================================================*/
create table sms_coupon_history
(
id bigint not null auto_increment comment \'id\',
coupon_id bigint comment \'优惠券id\',
member_id bigint comment \'会员id\',
member_nick_name varchar(64) comment \'会员名字\',
get_type tinyint(1) comment \'获取方式[0->后台赠送;1->主动领取]\',
create_time datetime comment \'创建时间\',
use_type tinyint(1) comment \'使用状态[0->未使用;1->已使用;2->已过期]\',
use_time datetime comment \'使用时间\',
order_id bigint comment \'订单id\',
order_sn bigint comment \'订单号\',
primary key (id)
);
alter table sms_coupon_history comment \'优惠券领取历史记录\';
/*==============================================================*/
/* Table: sms_coupon_spu_category_relation */
/*==============================================================*/
create table sms_coupon_spu_category_relation
(
id bigint not null auto_increment comment \'id\',
coupon_id bigint comment \'优惠券id\',
category_id bigint comment \'产品分类id\',
category_name varchar(64) comment \'产品分类名称\',
primary key (id)
);
alter table sms_coupon_spu_category_relation comment \'优惠券分类关联\';
/*==============================================================*/
/* Table: sms_coupon_spu_relation */
/*==============================================================*/
create table sms_coupon_spu_relation
(
id bigint not null auto_increment comment \'id\',
coupon_id bigint comment \'优惠券id\',
spu_id bigint comment \'spu_id\',
spu_name varchar(255) comment \'spu_name\',
primary key (id)
);
alter table sms_coupon_spu_relation comment \'优惠券与产品关联\';
/*==============================================================*/
/* Table: sms_home_adv */
/*==============================================================*/
create table sms_home_adv
(
id bigint not null auto_increment comment \'id\',
name varchar(100) comment \'名字\',
pic varchar(500) comment \'图片地址\',
start_time datetime comment \'开始时间\',
end_time datetime comment \'结束时间\',
status tinyint(1) comment \'状态\',
click_count int comment \'点击数\',
url varchar(500) comment \'广告详情连接地址\',
note varchar(500) comment \'备注\',
sort int comment \'排序\',
publisher_id bigint comment \'发布者\',
auth_id bigint comment \'审核者\',
primary key (id)
);
alter table sms_home_adv comment \'首页轮播广告\';
/*==============================================================*/
/* Table: sms_home_subject */
/*==============================================================*/
create table sms_home_subject
(
id bigint not null auto_increment comment \'id\',
name varchar(200) comment \'专题名字\',
title varchar(255) comment \'专题标题\',
sub_title varchar(255) comment \'专题副标题\',
status tinyint(1) comment \'显示状态\',
url varchar(500) comment \'详情连接\',
sort int comment \'排序\',
img varchar(500) comment \'专题图片地址\',
primary key (id)
);
alter table sms_home_subject comment \'首页专题表【jd首页下面很多专题,每个专题链接新的页面,展示专题商品信息】\';
/*==============================================================*/
/* Table: sms_home_subject_spu */
/*==============================================================*/
create table sms_home_subject_spu
(
id bigint not null auto_increment comment \'id\',
name varchar(200) comment \'专题名字\',
subject_id bigint comment \'专题id\',
spu_id bigint comment \'spu_id\',
sort int comment \'排序\',
primary key (id)
);
alter table sms_home_subject_spu comment \'专题商品\';
/*==============================================================*/
/* Table: sms_member_price */
/*==============================================================*/
create table sms_member_price
(
id bigint not null auto_increment comment \'id\',
sku_id bigint comment \'sku_id\',
member_level_id bigint comment \'会员等级id\',
member_level_name varchar(100) comment \'会员等级名\',
member_price decimal(18,4) comment \'会员对应价格\',
add_other tinyint(1) comment \'可否叠加其他优惠[0-不可叠加优惠,1-可叠加]\',
primary key (id)
);
alter table sms_member_price comment \'商品会员价格\';
/*==============================================================*/
/* Table: sms_seckill_promotion */
/*==============================================================*/
create table sms_seckill_promotion
(
id bigint not null auto_increment comment \'id\',
title varchar(255) comment \'活动标题\',
start_time datetime comment \'开始日期\',
end_time datetime comment \'结束日期\',
status tinyint comment \'上下线状态\',
create_time datetime comment \'创建时间\',
user_id bigint comment \'创建人\',
primary key (id)
);
alter table sms_seckill_promotion comment \'秒杀活动\';
/*==============================================================*/
/* Table: sms_seckill_session */
/*==============================================================*/
create table sms_seckill_session
(
id bigint not null auto_increment comment \'id\',
name varchar(200) comment \'场次名称\',
start_time datetime comment \'每日开始时间\',
end_time datetime comment \'每日结束时间\',
status tinyint(1) comment \'启用状态\',
create_time datetime comment \'创建时间\',
primary key (id)
);
alter table sms_seckill_session comment \'秒杀活动场次\';
/*==============================================================*/
/* Table: sms_seckill_sku_notice */
/*==============================================================*/
create table sms_seckill_sku_notice
(
id bigint not null auto_increment comment \'id\',
member_id bigint comment \'member_id\',
sku_id bigint comment \'sku_id\',
session_id bigint comment \'活动场次id\',
subcribe_time datetime comment \'订阅时间\',
send_time datetime comment \'发送时间\',
notice_type tinyint(1) comment \'通知方式[0-短信,1-邮件]\',
primary key (id)
);
alter table sms_seckill_sku_notice comment \'秒杀商品通知订阅\';
/*==============================================================*/
/* Table: sms_seckill_sku_relation */
/*==============================================================*/
create table sms_seckill_sku_relation
(
id bigint not null auto_increment comment \'id\',
promotion_id bigint comment \'活动id\',
promotion_session_id bigint comment \'活动场次id\',
sku_id bigint comment \'商品id\',
seckill_price decimal comment \'秒杀价格\',
seckill_count decimal comment \'秒杀总量\',
seckill_limit decimal comment \'每人限购数量\',
seckill_sort int comment \'排序\',
primary key (id)
);
alter table sms_seckill_sku_relation comment \'秒杀活动商品关联\';
/*==============================================================*/
/* Table: sms_sku_full_reduction */
/*==============================================================*/
create table sms_sku_full_reduction
(
id bigint not null auto_increment comment \'id\',
sku_id bigint comment \'spu_id\',
full_price decimal(18,4) comment \'满多少\',
reduce_price decimal(18,4) comment \'减多少\',
add_other tinyint(1) comment \'是否参与其他优惠\',
primary key (id)
);
alter table sms_sku_full_reduction comment \'商品满减信息\';
/*==============================================================*/
/* Table: sms_sku_ladder */
/*==============================================================*/
create table sms_sku_ladder
(
id bigint not null auto_increment comment \'id\',
sku_id bigint comment \'spu_id\',
full_count int comment \'满几件\',
discount decimal(4,2) comment \'打几折\',
price decimal(18,4) comment \'折后价\',
add_other tinyint(1) comment \'是否叠加其他优惠[0-不可叠加,1-可叠加]\',
primary key (id)
);
alter table sms_sku_ladder comment \'商品阶梯价格\';
/*==============================================================*/
/* Table: sms_spu_bounds */
/*==============================================================*/
create table sms_spu_bounds
(
id bigint not null auto_increment comment \'id\',
spu_id bigint,
grow_bounds decimal(18,4) comment \'成长积分\',
buy_bounds decimal(18,4) comment \'购物积分\',
work tinyint(1) comment \'优惠生效情况[1111(四个状态位,从右到左);0 - 无优惠,成长积分是否赠送;1 - 无优惠,购物积分是否赠送;2 - 有优惠,成长积分是否赠送;3 - 有优惠,购物积分是否赠送【状态位0:不赠送,1:赠送】]\',
primary key (id)
);
alter table sms_spu_bounds comment \'商品spu积分设置\';
/*==============================================================*/
/* Database: gulimall_ums */
/*==============================================================*/
create database gulimall_ums;
use gulimall_ums;
drop table if exists ums_growth_change_history;
drop table if exists ums_integration_change_history;
drop table if exists ums_member;
drop table if exists ums_member_collect_spu;
drop table if exists ums_member_collect_subject;
drop table if exists ums_member_level;
drop table if exists ums_member_login_log;
drop table if exists ums_member_receive_address;
drop table if exists ums_member_statistics_info;
/*==============================================================*/
/* Table: ums_growth_change_history */
/*==============================================================*/
create table ums_growth_change_history
(
id bigint not null auto_increment comment \'id\',
member_id bigint comment \'member_id\',
create_time datetime comment \'create_time\',
change_count int comment \'改变的值(正负计数)\',
note varchar(0) comment \'备注\',
source_type tinyint comment \'积分来源[0-购物,1-管理员修改]\',
primary key (id)
);
alter table ums_growth_change_history comment \'成长值变化历史记录\';
/*==============================================================*/
/* Table: ums_integration_change_history */
/*==============================================================*/
create table ums_integration_change_history
(
id bigint not null auto_increment comment \'id\',
member_id bigint comment \'member_id\',
create_time datetime comment \'create_time\',
change_count int comment \'变化的值\',
note varchar(255) comment \'备注\',
source_tyoe tinyint comment \'来源[0->购物;1->管理员修改;2->活动]\',
primary key (id)
);
alter table ums_integration_change_history comment \'积分变化历史记录\';
/*==============================================================*/
/* Table: ums_member */
/*==============================================================*/
create table ums_member
(
id bigint not null auto_increment comment \'id\',
level_id bigint comment \'会员等级id\',
username char(64) comment \'用户名\',
password varchar(64) comment \'密码\',
nickname varchar(64) comment \'昵称\',
mobile varchar(20) comment \'手机号码\',
email varchar(64) comment \'邮箱\',
header varchar(500) comment \'头像\',
gender tinyint comment \'性别\',
birth date comment \'生日\',
city varchar(500) comment \'所在城市\',
job varchar(255) comment \'职业\',
sign varchar(255) comment \'个性签名\',
source_type tinyint comment \'用户来源\',
integration int comment \'积分\',
growth int comment \'成长值\',
status tinyint comment \'启用状态\',
create_time datetime comment \'注册时间\',
primary key (id)
);
alter table ums_member comment \'会员\';
/*==============================================================*/
/* Table: ums_member_collect_spu */
/*==============================================================*/
create table ums_member_collect_spu
(
id bigint not null comment \'id\',
member_id bigint comment \'会员id\',
spu_id bigint comment \'spu_id\',
spu_name varchar(500) comment \'spu_name\',
spu_img varchar(500) comment \'spu_img\',
create_time datetime comment \'create_time\',
primary key (id)
);
alter table ums_member_collect_spu comment \'会员收藏的商品\';
/*==============================================================*/
/* Table: ums_member_collect_subject */
/*==============================================================*/
create table ums_member_collect_subject
(
id bigint not null auto_increment comment \'id\',
subject_id bigint comment \'subject_id\',
subject_name varchar(255) comment \'subject_name\',
subject_img varchar(500) comment \'subject_img\',
subject_urll varchar(500) comment \'活动url\',
primary key (id)
);
alter table ums_member_collect_subject comment \'会员收藏的专题活动\';
/*==============================================================*/
/* Table: ums_member_level */
/*==============================================================*/
create table ums_member_level
(
id bigint not null auto_increment comment \'id\',
name varchar(100) comment \'等级名称\',
growth_point int comment \'等级需要的成长值\',
default_status tinyint comment \'是否为默认等级[0->不是;1->是]\',
free_freight_point decimal(18,4) comment \'免运费标准\',
comment_growth_point int comment \'每次评价获取的成长值\',
priviledge_free_freight tinyint comment \'是否有免邮特权\',
priviledge_member_price tinyint comment \'是否有会员价格特权\',
priviledge_birthday tinyint comment \'是否有生日特权\',
note varchar(255) comment \'备注\',
primary key (id)
);
alter table ums_member_level comment \'会员等级\';
/*==============================================================*/
/* Table: ums_member_login_log */
/*==============================================================*/
create table ums_member_login_log
(
id bigint not null auto_increment comment \'id\',
member_id bigint comment \'member_id\',
create_time datetime comment \'创建时间\',
ip varchar(64) comment \'ip\',
city varchar(64) comment \'city\',
login_type tinyint(1) comment \'登录类型[1-web,2-app]\',
primary key (id)
);
alter table ums_member_login_log comment \'会员登录记录\';
/*==============================================================*/
/* Table: ums_member_receive_address */
/*==============================================================*/
create table ums_member_receive_address
(
id bigint not null auto_increment comment \'id\',
member_id bigint comment \'member_id\',
name varchar(255) comment \'收货人姓名\',
phone varchar(64) comment \'电话\',
post_code varchar(64) comment \'邮政编码\',
province varchar(100) comment \'省份/直辖市\',
city varchar(100) comment \'城市\',
region varchar(100) comment \'区\',
detail_address varchar(255) comment \'详细地址(街道)\',
areacode varchar(15) comment \'省市区代码\',
default_status tinyint(1) comment \'是否默认\',
primary key (id)
);
alter table ums_member_receive_address comment \'会员收货地址\';
/*==============================================================*/
/* Table: ums_member_statistics_info */
/*==============================================================*/
create table ums_member_statistics_info
(
id bigint not null auto_increment comment \'id\',
member_id bigint comment \'会员id\',
consume_amount decimal(18,4) comment \'累计消费金额\',
coupon_amount decimal(18,4) comment \'累计优惠金额\',
order_count int comment \'订单数量\',
coupon_count int comment \'优惠券数量\',
comment_count int comment \'评价数\',
return_order_count int comment \'退货数量\',
login_count int comment \'登录次数\',
attend_count int comment \'关注数量\',
fans_count int comment \'粉丝数量\',
collect_product_count int comment \'收藏的商品数量\',
collect_subject_count int comment \'收藏的专题活动数量\',
collect_comment_count int comment \'收藏的评论数量\',
invite_friend_count int comment \'邀请的朋友数量\',
primary key (id)
);
alter table ums_member_statistics_info comment \'会员统计信息\';
/*==============================================================*/
/* Database: gulimall_wms */
/*==============================================================*/
create database gulimall_wms;
use gulimall_wms;
/*
SQLyog Ultimate v11.25 (64 bit)
MySQL - 5.7.27 : Database - gulimall_wms
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=\'\'*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=\'NO_AUTO_VALUE_ON_ZERO\' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`gulimall_wms` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `gulimall_wms`;
/*Table structure for table `undo_log` */
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `undo_log` */
/*Table structure for table `wms_purchase` */
DROP TABLE IF EXISTS `wms_purchase`;
CREATE TABLE `wms_purchase` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`assignee_id` bigint(20) DEFAULT NULL,
`assignee_name` varchar(255) DEFAULT NULL,
`phone` char(13) DEFAULT NULL,
`priority` int(4) DEFAULT NULL,
`status` int(4) DEFAULT NULL,
`ware_id` bigint(20) DEFAULT NULL,
`amount` decimal(18,4) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'采购信息\';
/*Data for the table `wms_purchase` */
/*Table structure for table `wms_purchase_detail` */
DROP TABLE IF EXISTS `wms_purchase_detail`;
CREATE TABLE `wms_purchase_detail` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`purchase_id` bigint(20) DEFAULT NULL COMMENT \'采购单id\',
`sku_id` bigint(20) DEFAULT NULL COMMENT \'采购商品id\',
`sku_num` int(11) DEFAULT NULL COMMENT \'采购数量\',
`sku_price` decimal(18,4) DEFAULT NULL COMMENT \'采购金额\',
`ware_id` bigint(20) DEFAULT NULL COMMENT \'仓库id\',
`status` int(11) DEFAULT NULL COMMENT \'状态[0新建,1已分配,2正在采购,3已完成,4采购失败]\',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*Data for the table `wms_purchase_detail` */
/*Table structure for table `wms_ware_info` */
DROP TABLE IF EXISTS `wms_ware_info`;
CREATE TABLE `wms_ware_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT \'id\',
`name` varchar(255) DEFAULT NULL COMMENT \'仓库名\',
`address` varchar(255) DEFAULT NULL COMMENT \'仓库地址\',
`areacode` varchar(20) DEFAULT NULL COMMENT \'区域编码\',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'仓库信息\';
/*Data for the table `wms_ware_info` */
/*Table structure for table `wms_ware_order_task` */
DROP TABLE IF EXISTS `wms_ware_order_task`;
CREATE TABLE `wms_ware_order_task` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT \'id\',
`order_id` bigint(20) DEFAULT NULL COMMENT \'order_id\',
`order_sn` varchar(255) DEFAULT NULL COMMENT \'order_sn\',
`consignee` varchar(100) DEFAULT NULL COMMENT \'收货人\',
`consignee_tel` char(15) DEFAULT NULL COMMENT \'收货人电话\',
`delivery_address` varchar(500) DEFAULT NULL COMMENT \'配送地址\',
`order_comment` varchar(200) DEFAULT NULL COMMENT \'订单备注\',
`payment_way` tinyint(1) DEFAULT NULL COMMENT \'付款方式【 1:在线付款 2:货到付款】\',
`task_status` tinyint(2) DEFAULT NULL COMMENT \'任务状态\',
`order_body` varchar(255) DEFAULT NULL COMMENT \'订单描述\',
`tracking_no` char(30) DEFAULT NULL COMMENT \'物流单号\',
`create_time` datetime DEFAULT NULL COMMENT \'create_time\',
`ware_id` bigint(20) DEFAULT NULL COMMENT \'仓库id\',
`task_comment` varchar(500) DEFAULT NULL COMMENT \'工作单备注\',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'库存工作单\';
/*Data for the table `wms_ware_order_task` */
/*Table structure for table `wms_ware_order_task_detail` */
DROP TABLE IF EXISTS `wms_ware_order_task_detail`;
CREATE TABLE `wms_ware_order_task_detail` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT \'id\',
`sku_id` bigint(20) DEFAULT NULL COMMENT \'sku_id\',
`sku_name` varchar(255) DEFAULT NULL COMMENT \'sku_name\',
`sku_num` int(11) DEFAULT NULL COMMENT \'购买个数\',
`task_id` bigint(20) DEFAULT NULL COMMENT \'工作单id\',
`ware_id` bigint(20) DEFAULT NULL COMMENT \'仓库id\',
`lock_status` int(1) DEFAULT NULL COMMENT \'1-已锁定 2-已解锁 3-扣减\',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'库存工作单\';
/*Data for the table `wms_ware_order_task_detail` */
/*Table structure for table `wms_ware_sku` */
DROP TABLE IF EXISTS `wms_ware_sku`;
CREATE TABLE `wms_ware_sku` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT \'id\',
`sku_id` bigint(20) DEFAULT NULL COMMENT \'sku_id\',
`ware_id` bigint(20) DEFAULT NULL COMMENT \'仓库id\',
`stock` int(11) DEFAULT NULL COMMENT \'库存数\',
`sku_name` varchar(200) DEFAULT NULL COMMENT \'sku_name\',
`stock_locked` int(11) DEFAULT \'0\' COMMENT \'锁定库存\',
PRIMARY KEY (`id`),
KEY `sku_id` (`sku_id`) USING BTREE,
KEY `ware_id` (`ware_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'商品库存\';
/*Data for the table `wms_ware_sku` */
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*==============================================================*/
/* Database: gulimall_admin */
/*==============================================================*/
create database gulimall_admin;
use gulimall_admin;
-- 菜单
CREATE TABLE `sys_menu` (
`menu_id` bigint NOT NULL AUTO_INCREMENT,
`parent_id` bigint COMMENT \'父菜单ID,一级菜单为0\',
`name` varchar(50) COMMENT \'菜单名称\',
`url` varchar(200) COMMENT \'菜单URL\',
`perms` varchar(500) COMMENT \'授权(多个用逗号分隔,如:user:list,user:create)\',
`type` int COMMENT \'类型 0:目录 1:菜单 2:按钮\',
`icon` varchar(50) COMMENT \'菜单图标\',
`order_num` int COMMENT \'排序\',
PRIMARY KEY (`menu_id`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'菜单管理\';
-- 系统用户
CREATE TABLE `sys_user` (
`user_id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT \'用户名\',
`password` varchar(100) COMMENT \'密码\',
`salt` varchar(20) COMMENT \'盐\',
`email` varchar(100) COMMENT \'邮箱\',
`mobile` varchar(100) COMMENT \'手机号\',
`status` tinyint COMMENT \'状态 0:禁用 1:正常\',
`create_user_id` bigint(20) COMMENT \'创建者ID\',
`create_time` datetime COMMENT \'创建时间\',
PRIMARY KEY (`user_id`),
UNIQUE INDEX (`username`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'系统用户\';
-- 系统用户Token
CREATE TABLE `sys_user_token` (
`user_id` bigint(20) NOT NULL,
`token` varchar(100) NOT NULL COMMENT \'token\',
`expire_time` datetime DEFAULT NULL COMMENT \'过期时间\',
`update_time` datetime DEFAULT NULL COMMENT \'更新时间\',
PRIMARY KEY (`user_id`),
UNIQUE KEY `token` (`token`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'系统用户Token\';
-- 系统验证码
CREATE TABLE `sys_captcha` (
`uuid` char(36) NOT NULL COMMENT \'uuid\',
`code` varchar(6) NOT NULL COMMENT \'验证码\',
`expire_time` datetime DEFAULT NULL COMMENT \'过期时间\',
PRIMARY KEY (`uuid`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'系统验证码\';
-- 角色
CREATE TABLE `sys_role` (
`role_id` bigint NOT NULL AUTO_INCREMENT,
`role_name` varchar(100) COMMENT \'角色名称\',
`remark` varchar(100) COMMENT \'备注\',
`create_user_id` bigint(20) COMMENT \'创建者ID\',
`create_time` datetime COMMENT \'创建时间\',
PRIMARY KEY (`role_id`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'角色\';
-- 用户与角色对应关系
CREATE TABLE `sys_user_role` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint COMMENT \'用户ID\',
`role_id` bigint COMMENT \'角色ID\',
PRIMARY KEY (`id`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'用户与角色对应关系\';
-- 角色与菜单对应关系
CREATE TABLE `sys_role_menu` (
`id` bigint NOT NULL AUTO_INCREMENT,
`role_id` bigint COMMENT \'角色ID\',
`menu_id` bigint COMMENT \'菜单ID\',
PRIMARY KEY (`id`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'角色与菜单对应关系\';
-- 系统配置信息
CREATE TABLE `sys_config` (
`id` bigint NOT NULL AUTO_INCREMENT,
`param_key` varchar(50) COMMENT \'key\',
`param_value` varchar(2000) COMMENT \'value\',
`status` tinyint DEFAULT 1 COMMENT \'状态 0:隐藏 1:显示\',
`remark` varchar(500) COMMENT \'备注\',
PRIMARY KEY (`id`),
UNIQUE INDEX (`param_key`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'系统配置信息表\';
-- 系统日志
CREATE TABLE `sys_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) COMMENT \'用户名\',
`operation` varchar(50) COMMENT \'用户操作\',
`method` varchar(200) COMMENT \'请求方法\',
`params` varchar(5000) COMMENT \'请求参数\',
`time` bigint NOT NULL COMMENT \'执行时长(毫秒)\',
`ip` varchar(64) COMMENT \'IP地址\',
`create_date` datetime COMMENT \'创建时间\',
PRIMARY KEY (`id`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'系统日志\';
-- 文件上传
CREATE TABLE `sys_oss` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`url` varchar(200) COMMENT \'URL地址\',
`create_date` datetime COMMENT \'创建时间\',
PRIMARY KEY (`id`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'文件上传\';
-- 定时任务
CREATE TABLE `schedule_job` (
`job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT \'任务id\',
`bean_name` varchar(200) DEFAULT NULL COMMENT \'spring bean名称\',
`params` varchar(2000) DEFAULT NULL COMMENT \'参数\',
`cron_expression` varchar(100) DEFAULT NULL COMMENT \'cron表达式\',
`status` tinyint(4) DEFAULT NULL COMMENT \'任务状态 0:正常 1:暂停\',
`remark` varchar(255) DEFAULT NULL COMMENT \'备注\',
`create_time` datetime DEFAULT NULL COMMENT \'创建时间\',
PRIMARY KEY (`job_id`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'定时任务\';
-- 定时任务日志
CREATE TABLE `schedule_job_log` (
`log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT \'任务日志id\',
`job_id` bigint(20) NOT NULL COMMENT \'任务id\',
`bean_name` varchar(200) DEFAULT NULL COMMENT \'spring bean名称\',
`params` varchar(2000) DEFAULT NULL COMMENT \'参数\',
`status` tinyint(4) NOT NULL COMMENT \'任务状态 0:成功 1:失败\',
`error` varchar(2000) DEFAULT NULL COMMENT \'失败信息\',
`times` int(11) NOT NULL COMMENT \'耗时(单位:毫秒)\',
`create_time` datetime DEFAULT NULL COMMENT \'创建时间\',
PRIMARY KEY (`log_id`),
KEY `job_id` (`job_id`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'定时任务日志\';
-- 用户表
CREATE TABLE `tb_user` (
`user_id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT \'用户名\',
`mobile` varchar(20) NOT NULL COMMENT \'手机号\',
`password` varchar(64) COMMENT \'密码\',
`create_time` datetime COMMENT \'创建时间\',
PRIMARY KEY (`user_id`),
UNIQUE INDEX (`username`)
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COMMENT=\'用户\';
-- 初始数据
INSERT INTO `sys_user` (`user_id`, `username`, `password`, `salt`, `email`, `mobile`, `status`, `create_user_id`, `create_time`) VALUES (\'1\', \'admin\', \'9ec9750e709431dad22365cabc5c625482e574c74adaebba7dd02f1129e4ce1d\', \'YzcmCZNvbXocrsz9dm8e\', \'root@renren.io\', \'13612345678\', \'1\', \'1\', \'2016-11-11 11:11:11\');
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (1, 0, \'系统管理\', NULL, NULL, 0, \'system\', 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (2, 1, \'管理员列表\', \'sys/user\', NULL, 1, \'admin\', 1);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (3, 1, \'角色管理\', \'sys/role\', NULL, 1, \'role\', 2);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (4, 1, \'菜单管理\', \'sys/menu\', NULL, 1, \'menu\', 3);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (5, 1, \'SQL监控\', \'http://localhost:8080/renren-fast/druid/sql.html\', NULL, 1, \'sql\', 4);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (6, 1, \'定时任务\', \'job/schedule\', NULL, 1, \'job\', 5);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (7, 6, \'查看\', NULL, \'sys:schedule:list,sys:schedule:info\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (8, 6, \'新增\', NULL, \'sys:schedule:save\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (9, 6, \'修改\', NULL, \'sys:schedule:update\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (10, 6, \'删除\', NULL, \'sys:schedule:delete\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (11, 6, \'暂停\', NULL, \'sys:schedule:pause\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (12, 6, \'恢复\', NULL, \'sys:schedule:resume\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (13, 6, \'立即执行\', NULL, \'sys:schedule:run\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (14, 6, \'日志列表\', NULL, \'sys:schedule:log\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (15, 2, \'查看\', NULL, \'sys:user:list,sys:user:info\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (16, 2, \'新增\', NULL, \'sys:user:save,sys:role:select\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (17, 2, \'修改\', NULL, \'sys:user:update,sys:role:select\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (18, 2, \'删除\', NULL, \'sys:user:delete\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (19, 3, \'查看\', NULL, \'sys:role:list,sys:role:info\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (20, 3, \'新增\', NULL, \'sys:role:save,sys:menu:list\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (21, 3, \'修改\', NULL, \'sys:role:update,sys:menu:list\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (22, 3, \'删除\', NULL, \'sys:role:delete\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (23, 4, \'查看\', NULL, \'sys:menu:list,sys:menu:info\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (24, 4, \'新增\', NULL, \'sys:menu:save,sys:menu:select\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (25, 4, \'修改\', NULL, \'sys:menu:update,sys:menu:select\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (26, 4, \'删除\', NULL, \'sys:menu:delete\', 2, NULL, 0);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (27, 1, \'参数管理\', \'sys/config\', \'sys:config:list,sys:config:info,sys:config:save,sys:config:update,sys:config:delete\', 1, \'config\', 6);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (29, 1, \'系统日志\', \'sys/log\', \'sys:log:list\', 1, \'log\', 7);
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (30, 1, \'文件上传\', \'oss/oss\', \'sys:oss:all\', 1, \'oss\', 6);
INSERT INTO `sys_config` (`param_key`, `param_value`, `status`, `remark`) VALUES (\'CLOUD_STORAGE_CONFIG_KEY\', \'{\"aliyunAccessKeyId\":\"\",\"aliyunAccessKeySecret\":\"\",\"aliyunBucketName\":\"\",\"aliyunDomain\":\"\",\"aliyunEndPoint\":\"\",\"aliyunPrefix\":\"\",\"qcloudBucketName\":\"\",\"qcloudDomain\":\"\",\"qcloudPrefix\":\"\",\"qcloudSecretId\":\"\",\"qcloudSecretKey\":\"\",\"qiniuAccessKey\":\"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ\",\"qiniuBucketName\":\"ios-app\",\"qiniuDomain\":\"http://7xqbwh.dl1.z0.glb.clouddn.com\",\"qiniuPrefix\":\"upload\",\"qiniuSecretKey\":\"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV\",\"type\":1}\', \'0\', \'云存储配置信息\');
INSERT INTO `schedule_job` (`bean_name`, `params`, `cron_expression`, `status`, `remark`, `create_time`) VALUES (\'testTask\', \'renren\', \'0 0/30 * * * ?\', \'0\', \'参数测试\', now());
-- 账号:13612345678 密码:admin
INSERT INTO `tb_user` (`username`, `mobile`, `password`, `create_time`) VALUES (\'mark\', \'13612345678\', \'8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918\', \'2017-03-23 22:37:41\');
-- quartz自带表结构
CREATE TABLE QRTZ_JOB_DETAILS(
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(10) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_CRON_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(120) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
STR_PROP_1 VARCHAR(512) NULL,
STR_PROP_2 VARCHAR(512) NULL,
STR_PROP_3 VARCHAR(512) NULL,
INT_PROP_1 INT NULL,
INT_PROP_2 INT NULL,
LONG_PROP_1 BIGINT NULL,
LONG_PROP_2 BIGINT NULL,
DEC_PROP_1 NUMERIC(13,4) NULL,
DEC_PROP_2 NUMERIC(13,4) NULL,
BOOL_PROP_1 VARCHAR(1) NULL,
BOOL_PROP_2 VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_BLOB_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_CALENDARS (
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_FIRED_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
FIRED_TIME BIGINT(13) NOT NULL,
SCHED_TIME BIGINT(13) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(200) NULL,
JOB_GROUP VARCHAR(200) NULL,
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_SCHEDULER_STATE (
SCHED_NAME VARCHAR(120) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
CHECKIN_INTERVAL BIGINT(13) NOT NULL,
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE QRTZ_LOCKS (
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
进度条2021/10/23
参考https://www.cnblogs.com/ya-qiang/p/9639187.html
- 未安装VSCode准备,用IDEA运行renren-fast-vue
1)node version:v14.17.6
npm version:8.1.1
cnpm --version
cnpm@7.0.0 (C:\Users\1014282\AppData\Roaming\npm\node_modules\cnpm\lib\parse_argv.js)
npm@6.14.15 (C:\Users\1014282\AppData\Roaming\npm\node_modules\cnpm\node_modules\npm\lib\npm.js)
node@14.17.6 (D:\Program Files\nodejs\node.exe)
npminstall@5.0.2 (C:\Users\1014282\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\index.js)
prefix=D:\Program Files\nodejs
win32 x64 10.0.19042
registry=https://registry.nlark.com
2)IDEA安装Vue.js插件
cnpm install -g vue-cli
3)在项目的terminal窗口执行:cnpm run dev
- 服务接口从8100开始
进度条2021/10/25
1.注释renren-generator\src\main\resources\template/Controller中所有的
@RequiresPermissions。
import org.apache.shiro.authz.annotation.RequiresPermissions;
这里是在代码生成器里去掉这个方法
2.不用额外加servlet
当使用Spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet、Filter和Servlet规范的所有监听器(如HttpSessionListener监听器)。
Spring boot 的主 Servlet 为 DispatcherServlet,其默认的url-pattern为“/”。也许我们在应用中还需要定义更多的Servlet,该如何使用SpringBoot来完成呢?
在spring boot中添加自己的Servlet有两种方法,代码注册Servlet和注解自动注册(Filter和Listener也是如此)。
one、代码注册通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制。
也可以通过实现 ServletContextInitializer 接口直接注册。
two、在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/catoop/article/details/50501686
————————————————
版权声明:本文为CSDN博主「catoop」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/catoop/article/details/50501686
3.mybatis-puls
#很久之前用过Mybatis-plus,和Mybatis区别
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
global-config:
db-config:
#auto得保证数据库得id是自增的
id-type: auto
id-type选项
补充:
mybatis-plus.global-config.db-config.id-type=auto 和 @TableId(value = "id", type = IdType.ASSIGN_ID)哪个优先生效
对于id自动生成的方式,有注解和配置两种。
含义相同:不过设置自动增长的时候必须保证数据库中id是自增,assign_id和assign_uuid则不需要。
含义相同,但没说明优先级啊
https://www.cnblogs.com/Ddlm2wxm/p/14818337.html
4.经BrandController的save方法测试得,数据存储可走通,
但是,BrandDao.java中没有insert方法,BrandDao.xml中也没有insert语句,都要自己写;
BrandService 重写save(),在方法体中调用BrandDao.insert()方法即可
@Service("brandService")
public class BrandServiceImpl extends ServiceImpl<BrandDao, BrandEntity> implements BrandService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
IPage<BrandEntity> page = this.page(
new Query<BrandEntity>().getPage(params),
new QueryWrapper<BrandEntity>()
);
return new PageUtils(page);
}
//增加save方法(实际是insert操作),实现品牌添加
@Resource
BrandDao brandDao;
@Override
public boolean save(BrandEntity entity) {
int result=brandDao.insert(entity);
System.out.println("hahahahah");
return result==1?true:false;
}
很意外,测试类中,BrandService竟然为null??,即使加了注解,原因:没加@RunWith(SpringJUnit4ClassRunner.class)注解
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class ProductApplicationTests {
@Resource
BrandService brandService;
@Test
//@Transactional//开启后,数据库会回滚,
public void contextLoads(){
BrandEntity brandEntity=new BrandEntity();
brandEntity.setDescript("no 1 of world");
brandEntity.setName("hua wei");
System.out.println(brandService);
brandService.save(brandEntity);
System.out.println("保存成功");
}
}
4.没配置注册中心时,nacos依赖和actuator依赖都不能加
5.为了避免麻烦,更改生成器
注释renren-generator\src\main\resources\template/Controller中所有的
1)@RequiresPermissions。
import org.apache.shiro.authz.annotation.RequiresPermissions;
2)生成工具包时,controller,dao,service,serviceimpl去掉每个模块的名字,这样更改的原因是,我把common放各个模块里了
例如:controller,(这个要去注解和包名)
更改前
package ${package}.${moduleName}.controller;
import java.util.Arrays;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import ${package}.${moduleName}.entity.${className}Entity;
import ${package}.${moduleName}.service.${className}Service;
import ${mainPath}.common.utils.PageUtils;
import ${mainPath}.common.utils.R;
/**
* ${comments}
*
* @author ${author}
* @email ${email}
* @date ${datetime}
*/
@RestController
@RequestMapping("${moduleName}/${pathName}")
public class ${className}Controller {
@Autowired
private ${className}Service ${classname}Service;
/**
* 列表
*/
@RequestMapping("/list")
@RequiresPermissions("${moduleName}:${pathName}:list")
public R list(@RequestParam Map<String, Object> params){
PageUtils page = ${classname}Service.queryPage(params);
return R.ok().put("page", page);
}
/**
* 信息
*/
@RequestMapping("/info/{${pk.attrname}}")
@RequiresPermissions("${moduleName}:${pathName}:info")
public R info(@PathVariable("${pk.attrname}") ${pk.attrType} ${pk.attrname}){
${className}Entity ${classname} = ${classname}Service.getById(${pk.attrname});
return R.ok().put("${classname}", ${classname});
}
/**
* 保存
*/
@RequestMapping("/save")
@RequiresPermissions("${moduleName}:${pathName}:save")
public R save(@RequestBody ${className}Entity ${classname}){
${classname}Service.save(${classname});
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@RequiresPermissions("${moduleName}:${pathName}:update")
public R update(@RequestBody ${className}Entity ${classname}){
${classname}Service.updateById(${classname});
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
@RequiresPermissions("${moduleName}:${pathName}:delete")
public R delete(@RequestBody ${pk.attrType}[] ${pk.attrname}s){
${classname}Service.removeByIds(Arrays.asList(${pk.attrname}s));
return R.ok();
}
}
更改后
package ${package}.controller;
import java.util.Arrays;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import ${package}.entity.${className}Entity;
import ${package}.service.${className}Service;
import ${mainPath}.utils.PageUtils;
import ${mainPath}.utils.R;
/**
* ${comments}
*
* @author ${author}
* @email ${email}
* @date ${datetime}
*/
@RestController
@RequestMapping("${moduleName}/${pathName}")
public class ${className}Controller {
@Autowired
private ${className}Service ${classname}Service;
/**
* 列表
*/
@RequestMapping("/list")
// @RequiresPermissions("${moduleName}:${pathName}:list")
public R list(@RequestParam Map<String, Object> params){
PageUtils page = ${classname}Service.queryPage(params);
return R.ok().put("page", page);
}
/**
* 信息
*/
@RequestMapping("/info/{${pk.attrname}}")
// @RequiresPermissions("${moduleName}:${pathName}:info")
public R info(@PathVariable("${pk.attrname}") ${pk.attrType} ${pk.attrname}){
${className}Entity ${classname} = ${classname}Service.getById(${pk.attrname});
return R.ok().put("${classname}", ${classname});
}
/**
* 保存
*/
@RequestMapping("/save")
// @RequiresPermissions("${moduleName}:${pathName}:save")
public R save(@RequestBody ${className}Entity ${classname}){
${classname}Service.save(${classname});
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
// @RequiresPermissions("${moduleName}:${pathName}:update")
public R update(@RequestBody ${className}Entity ${classname}){
${classname}Service.updateById(${classname});
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
// @RequiresPermissions("${moduleName}:${pathName}:delete")
public R delete(@RequestBody ${pk.attrType}[] ${pk.attrname}s){
${classname}Service.removeByIds(Arrays.asList(${pk.attrname}s));
return R.ok();
}
}
3)index.vue.vm,menu.sql.vm里的modulename也去掉了
进度条2021/10/26
1.controller里,正确是@RequestMapping("coupon-service/smscoupon")
而生成的是@RequestMapping("${moduleName}/smscouponhistory")
原因:生成器里我把modulename注释掉了
2.ware-service模块里的实体类UndoLogEntity有问题
//private Longblob rollbackInfo;
private byte[] rollbackInfo;
java里没有longblob类型
3.初级篇课程中注册中心nacos是采用的单个节点,我用的服务器上的nacos集群
4.pom中actuator的依赖,用于实现config的动态刷新
5.generator生成的list方法,利用Query和QueryWrapper和数据库进行交互
6.hystrix和feign的超时时间要配下
进度条2021/10/28
1.application.yml会把bootstrap.yml同标签属性替换掉。所以,若是,nacos配置中心的配置文件名称写成bootstrap.yml中的应用名,且bootstrap.yml和application.yml的应用名不一致时,则运行出错,找不到对应的属性值
1)配置中心的属性值会覆盖本地的(yml的)
2)nacos作配置中心时,需要的依赖
<!--nacos作配置中心要加这个依赖,不然不会读取nacos里的配置文件-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
除此之外,不加该依赖,bootstrap.yml里配置的属性是无效的。
3)动态刷新,只需要在API上加@RefreshScope注解即可,不需要再加入actuator依赖;而仅用springcloud中微服务或github作配置中心时,需要导入该依赖,监控更新
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>-->
4)命名空间,分组,
ext-config[0]这个用法被放弃了,,,
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
这个语法用时,至少要配齐data-id和group,不然定位不到配置文件
server:
port: 8102
spring:
application:
name: coupon-service-client
cloud:
nacos:
config:
server-addr: 47.100.28.3:1111
file-extension: yaml
group: dev
namespace: 7c44458f-31f3-42e7-9b64-e1dffaaeefc6
ext-config[0]:
data-id: datasource.yaml
group: test
refresh: true
5)命名空间用的是ID
2.gateway-service模块
1)依赖
<!--测试网关,有点回过味来了,前面都是基础,,,,-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
但是运行时一直报错:java.lang.NoClassDefFoundError: javax/servlet/Servlet
原因:数据库四件套(dependency)与spring-cloud-starter-gateway有冲突,或者跟数据库相关的配置不完整在。
试了以下,即使数据库的dao,mapper配完整,也还是会报错,所以网关模块不要与业务模块写在一起,,错都不知道哪错的
进度条2021/10/30
0.打开笔记发现昨天的笔记有部分没保存!!!
0.死磕到底!!!
1.商品分类
1)long类型的比较不要直接使用==,要用到longValue()来比较
2)教程排序是不是有问题
//菜单排序,一般前减后是从小到大(??)
(menu1,menu2)->{
return (menu1.getSort()==null?0:menu1.getSort())-(menu2.getSort()==null?0:menu2.getSort());
}
2)实体类中要添加属性,用于指向子分类
/**
* 用于实现多级菜单
* 因为分类之间具有父子关系,像一个树形结构,因此需要在分类这个bean类中添加一个属性,用于指向子分类。
* ,TableFiled(exist = false)作用是声明这个属性在数据库中不存在
*/
@TableField(exist = false)
private List<CategoryEntity> children;
3)stream
2.利用renren-fast-vue访问product-service的category api
1)他要给8100(renren-fast)发请求读取数据,但是数据是在8101(product-service)端口上,如果找到了这个请求改端口那改起来很麻烦。方法1是改vue项目里的全局配置,方法2是搭建个网关(gateway-service),让网关路由到8101.
step1:前端访问网关,引发跨域问题
renren-fast里定义跨域配置类,所以renren-fast-vue访问renren-fast时没有引发跨域问题。因此renren-fast的跨域配置类,在网关配置此类后,要注释掉
它是由浏览器的同源策略造成的,是浏览器对js施加的安全限制。(ajax可以)
同源策略:是指协议,域名,端囗都要相同,其中有一个不同都会产生跨域;
解决办法1:设置nginx包含admin(这里应该是renren-fast-vue和renren-fast,这两个和gateway的端口均不同,均会引发跨域问题)和gateway
解决办法2:让服务器告诉预检请求能跨域(在网关中定义“GulimallCorsConfiguration”类,该类用来做过滤,允许所有的请求跨域。)
@Configuration
public class GulimallCorsConfiguration {
//在网关里配置的原因:网关对前端是跨域;网关对各个由网关过滤的模块也是跨域;所以配置在网关节点正好承前启后,对不???
//但是之前同一个项目的不同模块,端口也不一致,并没有触发跨域问题啊
@Bean
public CorsWebFilter corsWebFilter(){
// 基于url跨域,选择reactive包下的
UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
//跨域配置信息
CorsConfiguration corsConfiguration=new CorsConfiguration();
//允许跨域的头,请求方式,请求来源,携带cookie
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
//任意url都进行跨域配置
source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(source);
}
}
renren-fast注册中心的配置要放在application-dev.yml
step2:在网关添加product-service的路由
filters里面不太懂??(重写请求路径)
版权声明:本文为CSDN博主「聚光灯哲学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43199379/article/details/107768203
- id: product-route
#精确路由要放在模糊路由前面(原理类似于try...catch)
uri: lb://product-service
predicates:
- Path=/api/product-service/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: admin_route
#renren-fast注册到了注册中心,所以直接写//renren-fast,还是http://localhost:8100/renren-fast,直接写服务名即可
uri: lb://renren-fast
predicates:
- Path=/api/** #默认前端项目都带上api前缀
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
因为允许跨域访问,所以前端8001可访问网关8107,网关8107可访问商品服务8101
problem 1:
getMenus () {
this.$http({ // this.$http.adornUrl(\'/product-service/category/list/tree\'),
url: \'http://localhost:8107/api/product-service/category/list/tree\',
method: \'get\'
}).then(({ data }) => {
console.log(\'成功获取到菜单数据...\', data.data)
this.menus = data.data
})
}
这里url直接写成地址可以,为什么用this.$http.adornUrl(\'/product-service/category/list/tree\')不行?
因为得到的地址是这样的:http://localhost:8001/proxyApi//product-service/category/list/tree
访问路径是:renren-fast/product-service/category/list/tree!!!!
所以当然访问不到了啊!!!,因此可以在前端里直接写网关的地址(主要是对前端不太了解,先这样干了)
原因是config/index.js里对访问地址进行了代理(本来是不用代理的,但是访问不到验证码)
// 代理列表, 是否开启代理通过[./dev.env.js]配置
proxyTable: devEnv.OPEN_PROXY === false ? {} : {
\'/proxyApi\': {
target: \'http://localhost:8100/renren-fast/\',
changeOrigin: true,
pathRewrite: {
\'^/proxyApi\': \'/\'
}
}
},
请求地址处理(仅在httpRequest.js里改成api,动态验证码就出不来了;所以httpRequest.js和index.js要都改,但是业务类还是要写明地址,不然还会有"/renren-fast/"影响)
进度条2021/11/1
1.逻辑删除
然而多数时候,我们并不希望删除数据,而是标记它被删除了,这就是逻辑删除;
逻辑删除是mybatis-plus 的内容,会在项目中配置一些内容,告诉此项目执行delete语句时并不删除,只是标志位
可以设置show_status为1,标记它已经被删除。
#很久之前用过Mybatis-plus,和Mybatis区别
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
global-config:
db-config:
#auto得保证数据库得id是自增的
id-type: auto
logic-delete-value: 0 #逻辑已删除值,不显示
logic-not-delete-value: 1 #逻辑未删除值,显示
1)网关配置合理,所以product-srevice下的controller只需配置一个网关即可
2.新增
新增分类在CategoryController调用的是IService的default方法(default默认方法,java 8新特性,具备方法体,且不强制实现类重写该方法)
1)三级目录不存在添加分类的功能
3.新增分类,修改分类,拖拽效果,批量删除都是用的default方法
4.vue在字符串中使用${}拼接变量
进度条2021/11/2
5.拖拽改变的cat_level;
6.批量删除改变的是show-status
7.edit修改分类有问题
新修改的分类没有显示在菜单上,而是增加到了数据库的最后面
进度条2021/11/2 篇3
1.新增品牌要注意的地方
1)createLintingRule注释方法
webpack.base.conf.js
const createLintingRule = () => ({})
/*const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: \'eslint-loader\',
enforce: \'pre\',
include: [resolve(\'src\'), resolve(\'test\')],
options: {
formatter: require(\'eslint-friendly-formatter\'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
})*/
2)brand-add-or-update.vue.js要新增的地方(博主没加:active-value="1"
:inactive-value="0",所以新增品牌时会报MismatchedInputException: Cannot deserialize instance of xxx out of Value_Token token的错误,我没系统学过vue,再具体原因就不知道了)
<el-form-item label="显示状态" prop="showStatus">
<el-switch
v-model="dataForm.showStatus"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value="1"
:inactive-value="0"
>
</el-switch>
</el-form-item>
2.文件上传到阿里云
改进:服务端签名后直传
背景
采用JavaScript客户端直接签名(参见JavaScript客户端签名直传)时,AccessKeyID和AcessKeySecret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。
文件上传背景
Web系统开发中,文件上传是非常常见的功能,本来也没啥好说的,就是通过IO流将文件写到另外一个地方,这个地方可以是
1. 项目的目录中的某个文件夹.
2. 本地盘符的某个文件下.
3. 云服务OSS里面.例如七牛云,OSS等.
4. FastDSF的分布式文件存储系统.
本次使用阿里云OSS为例介绍一下吧.
————————————————
版权声明:本文为CSDN博主「大道之简」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HcJsJqJSSM/article/details/80977735
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sunnyzyq/article/details/101678657
————————————————
版权声明:本文为CSDN博主「zyqok」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sunnyzyq/article/details/101678657
1)服务端签名后直传的原理如下:
用户发送上传Policy请求到应用服务器。
应用服务器返回上传Policy和签名给用户。
用户直接上传数据到OSS。
模块:third-party就是模拟的应用服务器
2)模拟云存储空间,将文件存储到指定位置
https://blog.csdn.net/caidewei121/article/details/107646525
3.JSR303数据校验实体类属性要配置@NotNull,方法上要配置@Valid
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
进度条2021/11/9
- API-属性分组-前端组件抽取&父子组件交互-------------前端知识,不懂
https://blog.csdn.net/JavaCoder_juejue/article/details/112062095
https://blog.csdn.net/pyd1040201698/article/details/107996507
https://blog.csdn.net/JavaCoder_juejue/article/details/109182191
https://www.codeleading.com/article/20575483882/
进度条2021/11/29
1.通过基础的 24 分栏,迅速简便地创建布局、类似之前学过的bootstrap
attrgroup.vue
<el-row :gutter="20">
<el-col :span="6">菜单</el-col>
<el-col :span="18">表格</el-col>
</el-row>
2.问题
在父组件attrgroup.vue中取不到 取不到node.level,data.catId的值,所以把判断(f (Node.level === 3))放在子组件;
父组件attrgroup.vue
// 父节点感知到子节点category.vue被点击,这里是父组件
treenodeclick (node, data, component) {
// 取不到node.level,data.catId的值,所以把判断放子组件
console.log(\'attrgroup感知到category节点被点击\', node.catId)
this.catId = node.catId
this.getDataList()
},
子组件category.vue
// component没用到,nodeClick,这里是子组件
nodeClick (data, Node, component) {
console.log(\'子组件被点击\', data, Node, component)
console.log(\'子组件被点击\', Node.level)
if (Node.level === 3) {
// 子组件给父组件attrgroup发送一个事件,携带上数据
this.$emit(\'tree-node-click\', data, Node, component)
}
}
3.接口文档地址
https://easydoc.xyz/s/78237135/ZUqEdvA4/OXTgKobR
4.修改回显路径
1)修改AttrGroupEntity:添加回显路径catelogPath;
v-model用于表单数据的双向绑定,其实它就是一个语法糖,这个背后就做了两个操作:
1. v-bind绑定一个value属性
2. v-on指令给当前元素绑定input事件
5.实现品牌管理搜索
bug1:前端传数据key了,但是key值为null
@Override
public PageUtils queryPage(Map<String, Object> params) {
//这个新功能是匹配查询
//获取key,
String key=(String) params.get("key");
QueryWrapper<BrandEntity> wrapper= new QueryWrapper<>();
//若key不为空,则给wrapper添加查询条件,key=brand_id或key=nme?
if(!StringUtils.isEmpty(key)){
wrapper.eq("brand_id",key).or().like("name",key);
}
IPage<BrandEntity> page = this.page(
new Query<BrandEntity>().getPage(params),
new QueryWrapper<BrandEntity>()
);
return new PageUtils(page);
}
6.实现category表和brand表更新时,也更新其中间表gulimall_pms.pms_category_brand_relation
CategoryService新增updateCascate();
BrandService新增updateDetails();
1)bug2:存数据的时候没给pms_category_brand_relation存数据啊!!!!
解决:新增brand时,新增category_brand_relation??,那品牌怎末跟分类关联起来的??
老师的方法,在品牌分类里关联了分类,他是在字段操作里添加的
我的,直接给brand表添加一个不存在的字段\'关联分类--catelog\',及级联选择器
2)添加字段后关联分类--catelog\',brand查询数据时,就得还得查pms_category_brand_relation表;
不添加字段,查询数据时就不用查这个表;
------------我的问题:查询时不查这个分类,那分类存在得意义是什么呢????,仅仅是统计一个分类下有多少个品牌吗??
而且分类名和品牌名都只能分别由分类名和品牌名修改,呀???中间表只是统计得关系???
我不会写前端界面,只能多在后端写个查询了
3)前端关联分类时显示得是分类名,传给后端得是分类名和分类ID----额不会,还是从后端查名字吧!!!!!
正确写法:应该是选择关联分类时就能获取分类名!!,而不是再去后端找!!!!
4)
品牌id
新增必须不指定brandId,要存到关联表时,查询一个brandId出来,这里得保证brandname也唯一
@Null(message = "新增不能指定id",groups = {AddGroup.class})
问题:品牌名必须唯一吗?,我理解得是这样
5)关联表pms_category_brand_relation的id不用指定
@Null(message = "新增不能指定id",groups = {AddGroup.class})
一个bug:categoryBrandRelationService忘加 @Autowired
bug2:数据表不识别中文字体??,将关联表pms_category_brand_relation的字符集改成utf-8
6)品牌列表数据回显,回显的是catelogName,不是catelogId,
所以回显的时候只回显catelogName,添加数据的时候只添加catelogId,
存数据存在的问题:没有考虑全局的数据唯一性问题,这个跟更新过程的全局唯一性一起处理
7)实现更新品牌数据时,关联表也更新
step1:这里更改品牌表的时候,更改的只是品牌名和品牌Id,并没有提供修改品牌所属分类的方法!
step2: 品牌表由品牌修改,分类表由分类修改,中间表只是两者的中间键,并不是要品牌修改分类及让分类修改品牌,所以不应该在修改品牌信息时修改分类信息;反之,同理;
step3:在前端处理修改品牌信息时,不能动分类信息,因此要隐藏分类菜单,
step4:前端没隐藏了,但是分类Id并没有传递给后端,,,,
8)实现更新分类数据时,关联表也更新
分类表的更新数据不对:只更新了分类名称,且是新建了一个分类,不是在原先的基础上更新
bug: 更改分类时获取不到category的原因data.category.catId获取不到值,
只能this.category = data.category
bug:@click="editCategory"绑定的是editCategory,而不是addCategory
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="editCategory">确 定</el-button>
</span>
效果
9)更新原理
//更新category表的同时,更新中间表
@Override
public void updateCategory(Long catelogId, String catelogName) {
//更新category表的同时,更新中间表
CategoryBrandRelationEntity relationEntity= new CategoryBrandRelationEntity();
relationEntity.setCatelogId(catelogId);
relationEntity.setCatelogName(catelogName);
// 调用原生update方法
// 把分类Id为catelogId的关联实体relationEntity的名字改为catelogName
this.update(relationEntity,new UpdateWrapper<CategoryBrandRelationEntity>().eq("catelog_id",catelogId));
}
// 底层实现
// 所以底层是这样实现的吗: 先按updateWrapper筛选出记录(一行数据),再把entity中对应属性修改的值更新到记录的相应字段中??
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);