获得徽章 0
- 自学Java第149天
商品的数据结构是比较复杂的
不像前几天学的商品分类和品牌这么简单
-
分类和品牌分别一张表就能说清楚
最多加一个中间表将这两种关联起来
但是商品相关的就太复杂了
-
更何况本身就是电商网站
对商品的各种参数都要做好说明
就拿非常常见的手机来说吧
-
大众所熟知的就有手机内存、颜色…等
还有一些专业性的参数:
什么屏幕像素密度,什么屏幕刷新率
……等等,估计很多用户压根都不知道
-
总之关于其参数有一大堆的说明:
这可不是一张表能够搞定的
或者说都装在一张表中显然是不合适的
-
并且有的参数还要加入搜索的功能
就是用户在搜索框搜索64G
那么64G手机内存的手机要显示出来
-
所以要将商品参数拆分成多张表
我们今天学的就是商品规格参数组
一组下面又有多个规格参数
-
关于其前端页面和后台代码一并编写完成
笔记中只是说明了查询业务
至于增删改,思路是大同小异的
-
行有不得反求诸己,我是@刘小爱
一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。展开1点赞 - 自学Java第148天
关于图片上传,这个太常见了
朋友圈,微头条都涉及到图片的上传
以前我们也编写过对应的demo
-
当前项目中,将图片上传独立成微服务
关于其前端代码,昨天就接触过
一样的还是确定4大参数:
-
请求路径:网关映射路径+真实路径
网关域名和路由是在其对应配置文件中配置的
真实路径才是我们在Controller层中需要接受的
-
请求方式:文件上传,POST请求
请求参数:file文件,这个file啊
以前上传图片利用IO流将其复制到对应路径
-
现在MultipartFile直接transferTo()方法搞定
这个类在SpringMVC讲解过,功能比file更强大
getContenType()方法可以获取文件类型等等
-
返回值:图片对应的url,即图片域名+图片名
图片上传成功后,会返回一个url
通过该url可以直接访问到对应的图片
那么问题来了:图片到底保存在哪里呢?
-
一般来说会保存在分布式文件系统中
这个暂且先不说,后续花时间在学习
我们今天是直接将其保存在了nginx中
-
nginx有一个html文件可以存储静态资源
至于图片对应的域名
利用SwitchHosts加上nginx实现域名的使用
这个在第142天有详细学习过
-
总之就是浏览器上输入对应的域名+图片名
其实访问到的是nginx里html中的文件
-
代码编写完成,做一个测试
利用insomnia模拟文件上传,看是否存在问题
-
行有不得反求诸己,我是@刘小爱
一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。展开等人赞过29 - 自学Java第147天
品牌新增业务的前后端实现
我发现呀,这个前端页面眼睛都快看瞎
以新增品牌作为例子做一个说明
-
首先找到新增品牌按钮
确定其对应的vue组件绑定的的点击事件
点击事件对应的方法addBrand()
该方法执行后会将属性show设置为true
-
show对应的又是一个vue组件
通过show来控制vue组件的显示和隐藏
其对应的也就是新增品牌按钮弹出的页面
这个vue页面中又引入了一个自定义组件
通过该组件向后台服务器发送请求
-
前端页面也可以通过Ctrl+鼠标左键快速定位
总之、要根据前端页面弄明白4个点
请求路径、请求方式、请求参数、返回值
-
这四点搞清楚了,后台代码也就好编写了
Controller层接受请求和响应数据
Service层处理具体的业务逻辑
Mapper层对数据库操作
-
其中要注意的是关于新增品牌
因为牵扯到了一个品牌分类属性
要将数据添加到对应的中间表中
而这张中间表我们并没有创建对应的实体类
所以不能使用通用mapper
这里我使用的是注解,当然也可以配置xml
-
其中详细的学习笔记如下:
icon品牌新增业务之后台代码的编写
-
行有不得反求诸己,我是@刘小爱
一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。展开等人赞过515 - 自学Java第146天
拖延症越来越严重了,加上恰逢自己生日
本来打算休息一天就当是给自己份生日礼物
-
但是想了想还是算了,有了这次开头
下次又会找各种各样的借口偷懒了
所以虽然很晚才写完学习笔记,但也没有断更
-
晚上没多少人看,发文时间也不好
但还是发了,只能说算是自己的执念吧
我不知道自己还能坚持多久
至少我会尽自己最大的努力保证不断更
-
学习内容主要如下:
对于异步请求工具axios的说明
其实昨天发送的请求就是使用的axios
不是使用的jQuery,但是当时没说清楚
所以今天对其做了一个简单的说明
-
同时关于商品品牌业务后台代码的编写
其中有一个核心点就是关于分页助手的使用
这是mybatis的一个开源的分页插件
-
以前在做项目一时,分页全都是自己写的
现在使用分页助手PageHepler方便了很多
以前要写一堆代码说明分页属性之间的关系
现在两行代码搞定,具体在笔记中都有说明
-
一般来说写后台代码,我个人的一个思路:
先确定实体类和数据表,一一对应
-
其次确定请求路径和请求参数
据我所知前端和后台会根据开发文档来编写
但我这前端和后台都要自己写,总之要保证一致
-
其次确定返回值数据
因为我们这里需要的是一个分页数据
所以要专门编写一个和分页相关的分页类
其包含总页数,总记录数,以及每页对应的数据
-
最后也就是Java经典三层结构的代码编写了
使用通用mapper即可完成
其中要利用到高阶用法example的使用
具体实现过程都在笔记中有图文说明
-
行有不得反求诸己,我是@刘小爱 。
白天上班晚上学习,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。
展开等人赞过48 - 自学Java第145天
差点就断更了,我擦咧
用Vue写了一个品牌管理的页面
当然呢,数据暂时都是填写的假数据
-
本来打算独立将前端页面和后台代码写完的
并且Vue学了几天,好歹要实战一把吧
但是显然我高估了我自己的实力
-
只完成了一个前端页面的编写,还没写完
我打算自己找组件的,试了下,但是时间太少了
最终还是得跟着教程,这个没办法
-
想要求质量,就得花费大量的时间
想要求数量保持日更,质量就会打折扣
目前我还没法解决这个问题
-
使用的是Vuetify这个框架提供的组件
老实说使用起来确实特别的方便
找到组件之后,它有提供的代码样板
自己将代码copy到对应的vue文件中即可
就算是一个个试也能试出来其作用
-
最主要的是vue是热部署
不像以前写Java,修改代码后还得重新启动
虽然有一个JRebel的插件,但使用也不太方便
-
但是也有一个问题,就是找到对应的组件不容易
我想找搜索框的组件找了我好一会儿,我擦咧
最终才在表单和控件选项栏下的文本框中找到
-
当然呢,主要也是次数用得太少了
导致很多组件用都没用过,所以得一一试
-
并且教程上的内容和现在Vuetify框架内容不一样
就比如说栅格组件中:
v-row就代替了v-layout,v-col就代替了v-flex
-
感觉前端的技术更新迭代的太快了
我的这个教程虽然说不是最新,但也不老呀
当然呢也不是说老版本的用法就不能用了
-
只是我一想既然官网上都说了,那我就试下新用法
结果一试发现和以前的样式不一样
然后就又得一点点调
-
这个呀,你说它难吧其实也还好
不像Java有时候会涉及到一些数学逻辑运算
你说它简单吧,可能一个组件调来调去就要调半天
特别是有强迫症的话更是要把样式给调舒服才行
-
感觉这个东西没别的途径,就是多用,熟能生巧
-
行有不得反求诸己,我是@刘小爱 。
一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。展开等人赞过96 - 自学Java第144天
什么是跨域问题?以及其解决方法
本来呢,这块知识点我是不想写笔记的
-
就自己看一遍,知道有这回事,怎么做就够了
花时间还写一篇文章实在是不太值得
但是最终还是写了,为什么呢?
-
因为其使用到了两个重要知识点:
一个是SpringBoot中的Java配置类的使用
一个是jdk8中的新特性方法引用的使用
-
老实说这两个知识点都忘得差不多了
因为自己每天编写的代码有限
并且还学了好几天的vue,使用到它们的机会很少
所以趁此次机会也算是做了一个系统地回顾:
-
Java配置类在我第131天的笔记中有详细讲解
方法引用在我第50、51天的笔记中有详细讲解
-
忘了再去回顾和完全没学过真心就是两码事
从0开始学一个知识点可能要几个小时都不够
忘了去回顾可能几分钟就搞定了
-
好,言归正传,还是说下跨域问题
这个跨域说白了就是跨域名访问,有三种情况:
域名不同、域名相同但端口不同、二级域名不同
-
关于域名、二级域名我就不举例说明了
出现域名会被平台给屏蔽掉,还会被举报…
-
总之就是我们昨天编写的商品分类业务
它所属于的是项目中网关对应的域名
我们要在管理系统的前端页面中发送请求访问
这个前端页面对应的又是管理系统的域名
所以就出现跨域问题了
-
那这个问题怎么解决呢?
被访问的对象是谁?是网关
要访问网关的对象是谁?是后台管理系统
-
这样的话我们在网关中加一个配置
说明后台管理系统对应的域名可以访问我就好了
就相当于给它加了一个白名单
-
我们这里使用的是CORS解决跨域
当然具体的代码编写三两句也说不清楚
都在笔记中有详细的说明
-
行为不得反求诸己,大家好,我是@刘小爱
一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。展开赞过21 - 自学Java第143天
商品分类业务,说下其实现的整个思路
思路搞清楚了,剩下的就是搬砖了
-
哼,我才不是在搬砖呢
就算是在搬砖,我也要告诉自己
我其实是在修万里长城……
-
一般来说需求拿到手,先分析数据模型:
数据表中的字段是如何设计的?
Java中对应的实体类又如何设计?
前端页面中vue组件使用哪个?
数据模型清楚了,代码编写也就好说了
-
商品分类,是一个多级类目的关系
比如说家用电器是一个一级类目
它有很多个子节点,比如电视、冰箱…等
-
此时电视、冰箱这些就是一个二级类目
其中电视也有多个子节点
比如全面屏电视、超薄电视……等
-
这些都是国内某网站的一个分类划分
那在数据库中如何设计呢?
使用两个字段来说明这种多级关系
-
id和name字段不用多说,一般都会有
parent_id字段用于说明我的父节点的id
该字段就将同一张表中的数据自关联起来了
理论上三级四级无数级都可以用该字段来说明
-
is_parent字段用来说明是否是父节点
如果为true,表示还有子节点,商品分类业务
如果为false,表示没有子节点,其它业务
这个字段也很关键,一开始被我自己忽略了
-
如一级类目,我只需要查询它的子节点有哪些?
但最后一级类目没有子节点了呢?
就要查询具体商品了,不属于商品分类业务
-
确定了数据表设计,编写对应的Java实体类
使用通用mapper将它们联系起来
至于前端页面使用对应的ui组件模板编写
-
再就是确认请求路径了,根据路径编写代码
Controller层接受请求和响应
Servic层处理具体的业务,以及判断查询结果
Mapper层这里直接使用了通用Mapper
-
关于实体类是放在子工程lxa-item-pojo中
关于具体业务是放在子工程lxa-item-service中
编写好该业务后,做个测试看是否能查询到数据
-
同时将其对应到网关当中,网关中配置路由
再通过网关访问,确定是否也没问题
网关本质上只是在访问路径上加了一层保护
本质上还是执行我们编写的具体业务代码
不然别人都能直接看到我们的业务路径,比较危险
-
我是@刘小爱,一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。
展开等人赞过87 - 自学Java第142天
实现了通过域名访问对应的网站
SwitchHosts解决域名问题
nginx解决端口问题
-
SwitchHost完全就是自己骗自己啊
具体是什么意思呢?
本来一个项目照理说是要去买域名的
但是我不可能说为了学一个项目还去买个域名
-
那怎么办呢?
就是通过switchHost修改hosts文件
将对应域名解析成本地ip地址
比如说我们输入manage.liuxiaoai.com
它就给解析到本地ip了
-
而nginx的使用是很广泛的
这里主要是反向代理解决端口问题
-
如果没有说明端口,直接用域名访问
浏览器会将该访问路径默认设置成80端口
通过nginx的配置,监听80端口
根据不同的域名,将其方向代理到对应端口
-
输入manage.liuxiaoai.com
浏览器将该路径默认端口设置为80
这样就被nginx给监听到了
根据我们在nginx中的配置将其代理到
我们的后台管理系统中对应的本地ip+端口
-
nginx在此处厉害的地方在于:
以后我们在浏览器上访问时都不用管端口号了
只需要在nginx中配置好对应的映射路径即可
-
说来说去完全就是实现这么一个作用
当然关于nginx,还有其它作用
比如对于并发的处理要比Tomcat强的多
反正就是非常的厉害
展开赞过31 - 自学Java第141天
后台管理系统之配置微服务
昨天搭建了管理系统的前端页面
今天就是后台微服务的搭建了
-
采用的是用父工程管理依赖及其版本
再创建各个子模块微服务
其中基础微服务包括注册中心和网关
同时也算是对以前学习知识点的一个回顾
-
其中关于网关有一个路由设置
每新建一个微服务都需要配置一个路由
搭建完基础的微服务,再进入业务的搭建
-
在后台管理系统中有一块内容就是商品管理
商品微服务,这是我们优先要创建的
现对其内容做一个分析
-
商品微服务中会存在多个实体类
这些实体类若是其它微服务要用怎么办?
难道去copy同事的代码嘛?
-
所以为了解决这个问题
将微服务拆分成pojo和service两个子工程
pojo子工程用来存放相关的实体类
service子工程才用来处理具体的业务
-
这样的好处在于其它微服务若是需要实体类时
直接导入对应的pojo子工程依赖即可
所有业务相关的微服务基本都被拆分成这两个
-
除此之外还有一个重要的微服务common
专门存放通用代码,其它微服务可以直接用
其典型例子就是各种工具类的存放
-
再比如说关于异常的处理
这也是非常重要的一个知识点
以前遇到异常都是throw异常或者try…catch
现在要自定义异常,方便统一处理
-
使用到的方式就是配置一个切面
异常信息用枚举来说明
其实现起来较为复杂,未学完展开等人赞过89