谷粒商城分布式基础篇
谷粒商城分布式高级篇(上)
谷粒商城分布式高级篇(中)
谷粒商城分布式高级篇(下)
文章目录
简介
环境
使用vagrant快速创建linux虚拟机
- 使用
virtualbox 6.1.10
- 使用
vagrant2.2.9
- cmd窗口 vagrant 初始化 centos
vagrant init centos7 https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7.box
vagrant up
vagrant ssh
(注意在有vagrantfile
的目录 启动vagrant
命令)
虚拟机网络设置
未设置前需手动指定端口映射
给虚拟机固定IP地址
在VagrantFile
修改配置
vagrant reload
互相ping 通
linux安装docker
网上都有: 教程
如果国内镜像下载docker
很慢,可以试试用手机热点下载,亲测有效
docker 开机自启 systemctl enable docker
配置docker阿里云镜像加速
docker安装MySQL
- 下载镜像文件
docker pull mysql:5.7
- 创建实例并启动
docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/log:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7
- 参数说明
-p 3306:3306
将容器的3306端口映射到主机的3306端口
--name mysql
容器命名为 mysql
-v /mydata/mysql/cong:/etc/mysql
将docker的实例配置文件夹挂载到主机
-v /mydata/mysql/log:/var/lib/mysql
将docker的日志文件夹载到主机
-v /mydata/mysql/conf:/etc/mysql
将docker的配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root
初始化root用的密码 docker ps
查看在运行的容器- 创建mysql配置文件
vi /mydata/mysql/conf/my.cnf
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve
- 设置容器随
docker
自启动docker update mysql --restart=always
- 进入mysql容器内部的命令
docker exec -it mysql /bin/bash/
mysql启动报错
启动失败 docker logs [容器id]
查看日志
2023-01-19 01:09:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.41-1.el7 started.
2023-01-19 01:09:34+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.JmvWhCmjVf
mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory)
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
配置文件有问题
删掉docker 容器
sudo mkdir -p /etc/mysql/conf.d
sudo docker run --privileged=true \
-p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
docker安装redis
- 下载 redis 镜像
docker pull redis
- 创建实例并启动
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/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
- 使用redis镜像执行
redis-cli
命令连接docker exec -it redis redis-cli
- 开启redis持久化存储
vi /mydata/redis/conf/redis.conf # 添加如下内容 appendonly yes
- 设置容器随docker自启动
docker update redis --restart=always
开发工具&环境安装配置
-
配置好
maven
-
idea 插件
lombok
mybatisX
gitee
-
vscode 插件
配置git-ssh
- 下载并安装
git
- 任意位置
git bash
配置用户名
git config --global user.name "username"
username 随意
配置邮箱
git config --global user.email "xx@xx.com"
注册gitee 时用的邮箱 - 配置ssh 免密登录
git bash 中ssh-keygen -t rsa -C "xx@xx.com"
连续三次回车
cat ~/.ssh/id_rsa.pub
或找到生成路径查看生成的密钥
进入gitee设置中添加ssh公钥
ssh -T git@gitee.com
测试是否成功
项目结构创建&提交到码云
码云创建仓库
idea 新建版本控制项目
模块创建示例
必要组件的导入
根目录新建pom 聚合服务
pom添加进maven工程
设置忽略文件
第一次commit
数据库初始化
创建5个数据库并导入表
快速开发
人人开源搭建后台管理系统
克隆两个项目
renren-fast属于后端模块导入工程
创建后台管理的数据库并导入
修改配置 并运行
逆向工程搭建使用
clone导入renren-genertor
填入需要逆向的数据库地址,模块名,包名
创建 common 模块,抽取各个公共依赖放入
每个模块都依赖common
调整生成器Controller的模板 注释这一段
配置&测试微服务基本CRUD功能(整合MyBatis-Plus)
主键自增
依法炮制各个模块
nodejs
安装 10.* . *
版本,与教学中大版本保持一致
注意设置淘宝镜像源
在npm install
时 模块 node-sass
还是从github
中拉取,导致拉取失败所以还需单独设置 此模块的镜像源
npm config set registry http://registry.npm.taobao.org/
npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
//运行前端项目
npm install
npm run dev
分布式组件
SpringCloud Alibaba简介
检查 spring-cloud 、spring-boot、spring-cloud-alibaba 的对应版本
需根据 对应版本说明 调整 自身项目的对应版本,或严格按照教程所示版本
SpringCloud Alibaba-Nacos注册中心
common中导入nacos
1.1.3版本 启动nacos
配置文件nacos地址和模块名
模块名
SpringCloud-OpenFeign测试远程调用
SpringCloud Alibaba-Nacos配置中心-简单示例
- 导入配置
测试
未使用配置中心
使用配置中心
配置中心配置列表新建配置,默认为模块名的properties文件
controller上注解动态刷新配置
SpringCloud Alibaba-Nacos配置中心-命名空间与配置分组
配置集
配置文件中可指定命名空间,可以开发环境隔离
也可以
配置分组
可以分组隔离
bootstrap.properties文件中
SpringCloud Alibaba-Nacos配置中心-加载多配置集
就是 拆分配置文件,
SpringCloud-Gateway网关核心概念&原理
一个路由里面包含多个Predicate和多个Filter
请求到达网关,网关利用断言 Predicate 判断这次请求是否符合路由规则 Route 如果符合了,经过一系列 Filter 路由到指定地方
SpringCloud-Gateway-创建&测试API网关
spring初始化向导创建一个moudle网关
配置模块将模块注册到 nacos 注册中心和配置中心
排除数据库相关配置
测试application.yml
前端基础
技术栈简介
ES6
let&const
解构&字符串
箭头函数
Vue
介绍&HelloWorld
初始化vue
基本语法&插件安装
整合ElementUI快速开发
商品服务-API
三级分类
查询-递归树形结构数据获取
product控制器下
- 查出所有
- 组装父子结构
配置网关路由与路径重写
前端新增目录
新增菜单
在element组件加入 Tree树形控件
发现请求路径错误
修改基准地址
转发至网关 88 端口
发现验证码错误,将后端管理模块renren-fast也加入注册中心,也由网关分配地址
网关路径重写为正确地址
网关统一配置跨域
在网关模块配置跨域
去除 renren-fast 多余的跨域配置
查询-树形展示三级分类数据
配置商品服务的网关
粒度大的往后,粒度细的提前
前端获取到数据
正确显示
删除-页面效果
使用scope
只有在点击箭头才收缩节点
限制按钮显示
添加选择框
设置节点唯一标识
删除-逻辑删除
category控制器中delete方法自定义逻辑删除
查看官方文档
此步可省略,直接在字段属性上加@TableLogin
注解
删除-删除效果细化
确认提示框
默认展开节点
因为做了mybtis的逻辑删除,所以查询时会自动过滤逻辑标记字段
新增-新增效果完成
表单插件,显示表单插件el-dialog
修改-基本修改效果完成
同增加差不多
修改-拖拽效果
el-tree属性
修改-拖拽数据收集
修改-拖拽功能完成
品牌管理
使用逆向工程的前后端代码
品牌表
新增
效果优化与快速显示开关
云存储开通与使用
- 开通oss
- 创建bucket
- 安装sdk
- 开通子用户的Accesskey
OSS获取服务端签名
创建第三方模块,整合oss
排除数据库配置
三方服务模块创建 osscontroller 获取签名的接口
报错
OSSClient 组件未找到
原因
对象存储环境的自动配置中 容器 Bean放的ossClient OSS 是接口类型
自动注入时要保持一致
—>
配置好后也要将此模块加入到网关中
如果出现 OSS项目启动报错 Field ossClient not found
那么手动注入
OSS前后联调测试上传
将前端编写好的上传组件加入到 项目 commonents 中
替换文件中的 bucket 地址
在要用到文件上传功能的地方导入组件
小问题,接口方面优化返回值
设置bucket跨域权限
表单校验&自定义校验器
使用 elementui的 imge组件
报错没有注册 imge组件
组件注册步骤
- main.js中导入 src目录的element-ui
- src目录下的element-ui中的index.js中导入了各个注册的组件
3. 可按需导入需要的组件
4. 此报错为 此版本 element-ui 没有以下组件,删除这些组件即可
页面的校验
校验规则命名为了 dataRule
自定义的校验规则
与上区别为 自定义了校验方法,
也可以将校验器直接定义在内部
JSR303数据校验
在bean加入校验注解
controller开启校验
还可以自定义返回提示
自定义校验返回,紧跟被校验对象加BindingResult
获取和处理校验返回结果
可以标注多个校验注解
统一异常处理
用到SpringMVC提供的 ControllerAdvice
新建一个包存放统一处理,指定需要处理的包basepackge
取消方法中的异常处理,都交给统一处理
@ExceptionHandler 感知异常和指定的异常类
发现异常类型为
遂可以精确获取异常
上面处理精确异常,而后需要一个捕获所有异常
并统一异常代码
再公共模块中编写统一异常码的枚举类
JSR303分组校验
groups必须指定一个接口类型,此接口类型仅作标识用,无需任何实现
接口方法指定校验组,使用spring提供的validated
JSR303自定义校验注解
- 编写一个注解,必须满足jsr303规范,查看自带注解可以看到规范
- 校验注解的规范,两部分,原信息和三个属性,和一个注解传入的值
vals
- 配置错误提示信息,一般为当前包全路径,在resource
- 指定用什么自定义的类来校验
validateBy的值为数组且类型为ConstraintValidator
接口所以,自定义的检验类必须实现ConstraintValidator
这个接口
ConstraintValidator
接口有两个泛型,第一个泛型指定注解,第二个泛型为被校验数据的基本类型
6. 编写自定义校验器,添加两个实现方法
initialize
初始化方法,获取校验注解上输入的 vals
的值 ,并封装在 set 数组里,方便isValid
方法处理
isValid
方法对输入的值进行判断处理, Integer value
参数为输入的值
7. 校验器的原信息中指定刚才编写的检验方法
小修改,
概念-SPU&SKU&规格参数&销售属性
spu与sku的关系类似与 java中 类与对象的关系
spu => 基本属性 => 规格与包装
sku=>销售属性
关联关系
属性分组
前端组件抽取&父子组件交互
导入菜单表
抽取一个三级分类
使用分隔jianlan
导入抽取的三级分类
导入自动生成 的 attrgroup组件及其方法
父子组件传递数据
tree组件中的事件函数
函数中向父组件发送数据 this.$emit
父组件的子引用部分可以 接受这个事件
父组件就可以处理这个事件
就可以获取到被点击的 catid
获取分类属性分组
查询的 是 pms_attr_group
一个被封装的标准分页返回
当前类默认生成的方法 this.page,传入分页信息page 和查询条件封装 queryWrapper
构造查询条件
select * from pms_attr_group where catelog_id=? and (attr_group_id=key or attr_group_name like %key%)
等同于上面的sql语句
前端部分 点击三级分类后 重新加载
分组新增&级联选择器
前端 级联选择器的使用
在生命周期创建时 触发此查询
设置级联选择器的 属性
后端去掉children的空集合
级联选择器的选中值为数组
所以提交时,只提交数组最后一个元素
分组修改&级联选择器回显
级联选择器的正确显示需要一个数组,所以要根据cateLogId查询完整的 父子 路径
前端,关闭后清空选择器
可搜索
品牌管理-品牌分类关联与级联更新
配置分页插件
品牌管理页的查询
替换前端已编写好的功能
关联表设置了两个字段的冗余
重新编写实现,做冗余
保证冗余数据的准确性,修改相关冗余时,同时修改冗余
修改 品牌修改接口增加冗余修改
分类修改时同上
首先保证基本更新,再冗余更新
mybatis 快捷 创建sql
使用 @Param 注解快捷传入sql 值
平台属性
规格参数新增与VO
属性分组 查询全部时 没有模糊查询
更改接口细节
什么是vo ,vo是根据当次接口需要的数据字段,替代原装持久层的
接受页面传递来的数据,封装对象
将业务处理完成的对象,封装成页面要用的对象
多了attrGroupId
重新编写保存接口
规格参数列表
相应数据多了 两个字段
可以继承基本的,再添加多出的
规格修改
数据的返回类型
销售属性维护
查询分组关联属性&删除关联
点击关联理出当前分组关联的所有属性
提交的一个自定义数据可以封装为vo
查询分组未关联的属性
新建关联
新增分组与属性关联
新增商品
调试会员等级相关接口
配置会员服务的路由.
前端编写好的文件导入
获取分类关联的品牌
提到规范
获取分类下所有分组以及属性
根据上图所示响应数据封装新的vo
效果
商品新增vo抽取
复制需要提交的json数据,格式化json数据
使用工具 json转java 实体类,设置好 类名和包名生成并下载,导入到工程
商品新增业务流程分析
调整 上一步生成的vo 价格字段都设为BigDeciaml,主键都为Long类型
由于有 Lomobank 所以去掉 get set
加上事务注解
保存SPU基本信息
保存SKU基本信息
调用远程服务保存优惠等信息
商品保存debug完成
设置一个 compund 统一启动
给每个服务设置内存占用
设置 mysql 隔离级别为读未提交,可以读到 事务中已经提交的数据,事物失败后会回滚
商品保存其他问题处理
过滤空的图片路径
商品管理
SPU检索
复杂检索
统一日期格式化
SKU检索
仓储服务-API
仓库管理
整合ware服务&获取仓库列表
- 加入注册中心
- 加入网关路由
查询库存&创建采购需求
查询采购需求
合并采购需求
领取采购单
完成采购
商品服务-API-商品管理-SPU规格维护
显示400,给admin表加入菜单
INSERT INTO sys_menu (menu_id, parent_id, name, url, perms, type, icon, order_num) VALUES (76, 37, '规格维护', 'product/attrupdate', '', 2, 'log', 0);