聊城正规网站建设设计公司/58同城黄页推广
,修改目录 wordpress一、项目分层结构介绍
controller层(控制器层):
作用:负责输出和输入,接收前端数据,把结果返回给前端。
1.处理用户请求,接收用户参数
2.调用service层处理业务,返回响应
servi… 一、项目分层结构介绍
controller层(控制器层):
作用:负责输出和输入,接收前端数据,把结果返回给前端。
1.处理用户请求,接收用户参数
2.调用service层处理业务,返回响应
service层(业务逻辑层):
1.封装业务逻辑,为controller层提供服务
2.调用dao层或mapper层处理数据。
3.总控,所有事物的切入点
dao层(数据访问层):
1.主要职责是对数据库进行增删改查,不包含业务逻辑,直接与数据库交互。
ps(传统是:dao层和service层的代码是功能性的,是一个个函数,service去调用dao层,bo是作为值在传递,只有get和set方法)。
(满血模型,service变成了协调者。把service层一个方法中的代码切割成bo对象中若干个方法。把代码块分得更小。更自然容易理解重用性提高。)
dao层负责生成bo对象,bo对象用于承接service层分配的任务。
mapper层:
主要职责:数据存储或获取数据。
mapper层负责访问具体数据。
ps1:mapper层和controller层和面向对象没太多关系。主要战场是在service和dao层。
ps2:oomall是六边形体系结构,沿用了mvc体系结构,强调领域模型(bo),应用(service),尽量要让领域模型部分变得肥大,尽量把service和dao层代码放到bo中,把尽可能多的代码放到其中。
颜色的具体含义:
白色存在mysql数据库,蓝色表示从其它部分拿到的,黄色表示存在mongo数据库,绿色部分是全用java写的代码。
调用逻辑:
用户请求发送到controller层,controller层去调用service层,service层调用dao层或mapper层,从数据库返回数据。
二、dto、vo、bo、po介绍
dto(data transfer object)数据传输对象:【controller层】
用于服务层之间数据传输。
包含数据对象,主要是变量定义和get、set方法。
dto可以封装需要传输的数据。
vo(view object)视图对象:【controller层】
用于controller层和前端数据传输。
同样包含数据对象,主要是变量定义和get、set方法。
在controller层将数据传递给前端展示。
bo(business object)业务对象:【dao层】
封装业务逻辑中的数据。
包含业务逻辑。
包含业务逻辑的数据以及与这些数据相关的业务方法。
po(persistent object)持久化对象:【mapper层】
用于表示数据库中的一条记录,与数据库表结构对应
po通常与数据库表中字段一一对应
一般用在mapper层或dao层与数据库交互
oomall项目特点:包含业务逻辑的bo对象写在了dao层中,称之为满血模型。
三、设计模式
3.1 创建者
对象A由谁创建。
如果B包含A(整体和局部关系,如组合关系。比如上级地区创建下级地区。),B记录A,B用到A,B有A的初始化数据,则由对象B创建对象A。
3.2 信息专家
问题:分配职责给对象的基本原则是什么?
“知者为之”谁具备完成职责所需的信息,就由谁来承担职责。
比如:api的分配
3.3 模板方法设计模式
模板方法是定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或总行为的方法。
基本方法是实现算法各个步骤的方法。
写在父类中的填空题,子类不同会给空填上不同内容。
3.4 策略模式
定义一系列算法,把它们封装在对象内部,并且可以任意替换。
最好在变化点使用,为了将系统和变化点松耦合,将变化点从代码中提出。用多态方式实现不同的子类,以便日后增加新算法。
老师例子:shop模块的打包算法。用策略模式把会变化的点抽离出来,用了低耦合和多态,让其满足依赖倒置原则和Liskov可替换原则,使得算法部分满足面向对象的终极目标开闭原则。
3.5 桥接器模式
将问题分解成独立的两个部分,任意组合形成最后的解决方案。
四、软件设计的七大原则
1.开闭原则
对于扩展开放,对修改关闭。
每一次的修改不会动到已有的代码,不会影响已有代码,已经写好的代码都不用动,想扩展,不需要去动其它代码。
不论新增还是修改影响面都很小,修改只波及到一小部分代码。
抽象(新设一个抽象接口,把所有的接口都统一到该接口上)、约束(多态),封装、变化(间接)
判断点和演进点,可能会修改的地方,使用开闭原则。
2.Liskov可替换原则
继承必须确保超类所拥有的性质在子类中仍然成立(父类和子类)。
这意味着去overwrite父类的方法时,不能去随意overwrite,必须要让父类具备的性质在子类中依然成立。
不能违背父类中的性质,父类有的性质在子类中依然有,子类可以加入自己的性质。
满足Liskov替换原则必然满足开闭原则。
继承是耦合度很高的行为,Liskov替换原则要求继承不能修改父类的行为。
3.依赖倒置原则(激进)
面向接口编程,不面向实现编程。
高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。(人说的话就是要做接口,依赖接口)。
简单来说就是:只调用接口,不去调用具体的实现。
满足依赖倒置原则必然满足Liskov可替换原则:因为接口里只定义了方法,没有定义任何的实现。
4.单一职责原则(激进)
一个类有且仅有一个引起它变化的原因,否则类应该被拆分。
职责:每一个业务的方法,把职责分配给一个对象。
5.接口隔离原则(激进)
客户端不应该被迫依赖于它不使用的方法。(人话说:接口不能对应有它不需要的方法,要把接口拆分为多个小接口,然后逐个依赖,直到形成原子性的,完美的配对)
6.迪米特原则(激进)
不跟“陌生人”说话,只与你的直接朋友交谈。
如果两个软件实体无需直接通信,就不应该发生直接的相互调用,可以通过第三方转发该调用。
7.合成复用原则(激进)
优先考虑组合或聚合等关联关系来实现,其次才考虑继承关系实现。

五、region模块
4.1 使用模式:
创建者+信息专家
4.2 知识点:
— 缓存只在service和dao对象中做,bo对象不做缓存。
— 缓存不存相同东西。
— 动态模型是面向对象的血和肉,动态模型是顺序图,静态模型是类图。
— exception分支不会测到,所有分支都要测到。从功能角度去测试。
4.3 阅读源码:
— 1.如何创建对象。2.如何增和查(createregion,findbyid)。3.看dao层代码如何缓存(regionservice,region(getparentregion,getancestor,changestatus))。
— 要看javaee缓存的知识
4.4 模块结构:
controller【dtp】【vo】
dao【bo】
mapper【po】
4.5 流程图分析:

1、2、3、8是面向功能的,因为此时还没有对象。
service层职责分配,如何把要实现的功能交给不同部分去做。service外面向功能,service内面向对象。增删改等第1步要做的是变出对象。

以后只画从service层开始到dao层结束。
dao层提供对象。
loop循环10代表10级行政区,


六、payment模块
4.1 使用模式:
工厂方法+适配器模式
4.2 知识点:
— 做判断时机的标准是,如果当前已有信息足够进行判断,则进行判断。
— 如果报红要编译一下compile
— redis的操作是在core/mapper/redisUtil下
— openfeign借用了controller中所有的注解,定义了自身去调其它平台的接口,用restful风格。
— controller是定义了别人来调我们应该提供一个什么样的restful风格。
— 多态:共性的放在父类里,个性的放在子类里。(有子类的类是父类,父类有子类共性的属性)。
— 值对象:不是满血对象,只有值。
4.3 阅读源码:
— 1.阅读一下登录授权的代码,关注AOP。2.dao层channeldao的代码。
— 要看javaee微服务的知识。
4.4 模块结构:
config:
controller:【dto】【vo】
dao:【bo】【channel】
mapper:【generator】【manual】【openfeign】
service:

channel是支付渠道。
generator是自动生成的代码,mannual是自己写的代码。
openfeign(基于restful的api)是外部接口。
4.5 流程图分析:
第3步创建者,第6步adaptor是一个适配器接口,满足间接和多态,满足可替换达成开闭,遵循依赖倒置,不满足接口隔离(所有接口合在一起),第5步取出的是满血对象。

七、shop模块
4.1 使用模式:
策略模式+桥接器模式
4.2 知识点:
— 当要求插入数据不重复时,可以直接利用mysql的唯一索引的特性。
— 商铺和模板原本是一对多,现在对象模型变成一对一,只记默认模板计算运费。
— 父类白色,子类黄色,把对象一劈两半,一般存mysql,一半存mongo,拿到运费模板要看到底下所有地区,nosql只支持主键查询功能,不能直接看到运费模板下所有主键,要在mysql中记录nosql中所有的主键,索性把共用属性也放到mysql中。nosql的好处是能将数据量搞到最大。
— 订单模块订单的数量级很大,所以在订单要用mongo,在大数量的前提下,用mongo的查询和插入速度会快。
4.3 阅读源码:
1.RegionTemplateDao中的insert函数。weightTemplateDao的insert函数。
4.4 模块结构:
config
controller【dto】【vo】:
dao【bo】【openfeign】【template】
mapper【openfeign】【po】
service【listener】

service中listener中存放的是MQ的内容。bo对象分为两个包,白色在根目录底下,黄色在template底下,绿色在divide底下;和mongo有关的放在template下,无关的放在根目录下。openfeign因为有调region模块,写在mapper下。
4.5 流程图分析:
用了多态的方法去支持两种模板类型,分为运费模板和重量模板,定义了虚拟的接口:

八、product模块
4.1 使用模式:
4.2 知识点:
— 打折优惠活动是变化点和演进点。
— 缓存了Category、Product、Onsale、各类Activity以及它们的关系。
4.3 阅读源码:
1.javaee布隆过滤器
4.4 模块结构:
config
controller【dto】【vo】
dao【activity】【bo】【onsale】【openfeign】
mapper【jpa】【mongo】【openfeign】【po】
model【strategy】
service【listener】
4.5 流程图分析:
对1来说,设置了一个OnSaleExecutor接口,使得调用Product和OnSale时通过接口来访问,满足依赖倒置原则,进而满足Liskov可替换原则,进而满足开闭原则。Excutor不同,会得到不同的Onsale对象。
对2来说,ProductFactory是从ProductDao中的build方法抽离出来,形成一个独立的抽象类,对于底下不同的Excutor,在做build的时候,放入的excute不一样,做成不同的子类,build出不同的executor。运用了多态的设计模式。
运用了工厂方法的设计模式,SpecOnSaleProductFactory和ValidSaleProductFactory和NoOnSaleProductFactory是工程,然后SpecOnSaleExecutor和ValidOnSaleExecutor和NoOnSaleExecutor是产品。


九、其它内容
一、写代码思路:
1.先理清选做部分,各个模块间的调用关系。
2.从比较简单和孤立的部分开始。
二、学习心得:
— 面向对象一定要新建对象。
— region模块的集成测试可以作为案例进行学习。
— 用mysql 10秒400个请求已经严重阻塞,用redis进行缓存第1次速度会慢,后面会快。bo、po理论上都可以存,但redis一般只存bo,而且是存贫血bo,仅仅存属性,关系也不存,存dto是最快的,但不能存dto,因为属性改名了不能及时反应。
— 蓝色是调其它模块的api,黄色是mongodb,白色是mysql,绿色是redis。
三、注解:
@Repository注解表明这个接口是一个Spring Data Repository,即一个持久层的抽象,用于访问数据源中的数据。
四、redis语句:
redisUtil.hasKey(参数):检查Redis中是否存在指定的键,返回一个布尔值表示是否存在。
redisUtil.decr(参数):对指定的键对应的值进行减1操作,并返回减1后的值。
redisUtil.set(参数):设置指定的键值对到Redis中,可以设置键的过期时间。
redisUtil.get(参数):从Redis中获取指定键对应的值。
redisUtil.del(参数):从Redis中删除指定的键。
相关文章:
oomall课堂笔记
一、项目分层结构介绍
controller层(控制器层):
作用:负责输出和输入,接收前端数据,把结果返回给前端。
1.处理用户请求,接收用户参数
2.调用service层处理业务,返回响应
servi…...
Qt6.5类库实例大全:QFrame
哈喽大家好,我是20YC小二!欢迎扫码关注公众号,现在可免费领取《C程序员》在线视频教程哦!
~下面开始今天的分享内容~ 1. QFrame介绍
QFrame是Qt框架中的一个框架控件类,主要用于在图形用户界面(GUI)中创建框架&#…...
Java 数据结构篇-用数组、堆实现优先级队列
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 优先级队列说明 2.0 用数组实现优先级队列 3.0 无序数组实现优先级队列 3.1 无序数组实现优先级队列 - 入队列 offer(E value) 3.2 无序数组实现优先级队列 - 出…...
Reactor模型
目录 1.Reactor模型是什么2.Reactor 模型应用场景3.使用 Reactor 模型的软件4.Reactor 模型 与 Actor 模型 的关系 本文主要介绍Reactor模型基本概念以及应用场景。
1.Reactor模型是什么
Reactor模型是一种事件驱动的设计模式,用于处理服务请求,它是由…...
【SpringCloud】通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题
文章目录 前言1.第一次尝试1.1服务被调用方更新1.2压测第一次尝试1.3 问题分析1.4 同步的不是最新列表 2.第二次尝试2.1调用方过滤下线服务2.2压测第二次尝试2.3优化 写到最后 前言
在上文的基础上,通过压测的结果可以看出,使用DiscoveryManager下线服务…...
如何做好性能压测?压测环境设计和搭建的7个步骤你知道吗?
简介:一般来说,保证执行性能压测的环境和生产环境高度一致是执行一次有效性能压测的首要原则。有时候,即便是压测环境和生产环境有很细微的差别,都有可能导致整个压测活动评测出来的结果不准确。
1. 性能环境要考虑的要素
1.1 系…...
Qt12.13
...
目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】SLAM(基础篇)(五)
目录
前言
几个相关概念
双目视惯雷达SLAM 相关工作
系统综述 视觉前端...
鸿蒙开发之页面与组件生命周期
一、页面间的跳转
创建文件的时候记得选择创建page文件,这样就可以在main->resources->profile->main_pages.json中自动形成页面对应的路由了。如果创建的时候你选择了ArkTS文件,那么需要手动修改main_pages.json文件中,添加相应的…...
Kotlin开发之低功耗蓝牙(引用三方库)的详解一
在我们工作中,如果涉及到软硬结合,经常会用到蓝牙,而蓝牙有两种:一种是普通的蓝牙,一种是低功耗的蓝牙,今天我们主要讲解的是低功耗蓝牙:主要根据第三方库进行的讲解
第一步:在使用…...
5G/4G工业DTU扬尘在线监测:解决工地扬尘困扰的最佳方案
在如今快速发展的工业环境中,扬尘污染成为了一个严重的问题。工地扬尘不仅对环境造成污染,还对工作人员的健康产生负面影响。为了解决这一问题,5G/4G工业DTU扬尘在线监测应运而生。 5G/4G工业DTU扬尘在线监测原理 5G/4G工业DTU扬尘在线监测是…...
思源黑体某些字显示成日式中文,太先进了(附解法)
由于字体版权问题,公司外发的材料一般都需要把字体换成“思源黑体”才可以。
很久以前下载过显示为“Noto Sans CJK”的思源黑,后来改成了“SourceHanSans”,一直以为自己的思源黑体是正常的。
然后问题来了:在替换ppt里的字体后…...
.NET医院检验系统LIS源码,使用了oracle数据库,保证数据的隔离和安全性
医院检验系统LIS源码,LIS系统全套商业源码 LIS系统实现了实验室人力资源管理、标本管理、日常事务管理、网络管理、检验数据管理(采集、传输、处理、输出、发布)、报表管理过程的自动化,使实验室的操作人员和管理者从繁杂的手工劳…...
html实现动漫视频网站模板源码
文章目录 1.视频设计来源1.1 主界面1.2 动漫、电视剧、电影视频界面1.3 播放视频界面1.4 娱乐前线新闻界面1.5 关于我们界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/detail…...
python zblog API实现类似XMLRPC/发布文章
我发现python对Zblog的XML发布并不友好,虽然也有对应的模块,但是远远没有XPCRPC更直接方便,但是使用xmlRpc是直接给发布文章带来了不小的便利,但是对系统也并不友好,但是zblog也开放了Api,但是干部子弟不乐…...
后台业务管理系统原型模板,Axure后台组件库(整套后台管理页面)
后台业务系统需要产品经理超强的逻辑思维能力和业务理解能力,整理了一批后台原型组件及完整的用 Axure 8 制作的后台系统页面,方便产品经理们快速上手制作后台原型。
包括交互元件、首页、商品、订单、库存、用户、促销、运营、内容、统计、财务、设置、…...
kyuubi整合flink yarn application model
目录 概述配置flink 配置kyuubi 配置kyuubi-defaults.confkyuubi-env.shhive 验证启动kyuubibeeline 连接使用hive catalogsql测试 结束 概述
flink 版本 1.17.1、kyuubi 1.8.0、hive 3.1.3、paimon 0.5
整合过程中,需要注意对应的版本。
注意以上版本 姊妹篇 k…...
使用openpyxl调整Excel的宽度
逐行加载Excel,并将行宽调整为行中的最大字符数。 希望在打开 Excel 时能够看到所有字符。
失败代码:
#失败代码:
wb openpyxl.load_workbook(./targetExcelFile.xlsx)
ws wb.worksheets[0]for col in ws.iter_cols():max_length 0colum…...
前端面试——CSS面经(持续更新)
1. CSS选择器及其优先级
!important > 行内样式 > id选择器 > 类/伪类/属性选择器 > 标签/伪元素选择器 > 子/后台选择器 > *通配符
2. 重排和重绘是什么?浏览器的渲染机制是什么?
重排(回流):当增加或删除dom节点&…...
【C语言】结构体实现位段
引言
对位段进行介绍,什么是位段,位段如何节省空间,位段的内存分布,位段存在的跨平台问题,及位段的应用。 ✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,…...
IEEE RAS 机器人最优控制(Model-based Optimization for Robotics)学习资料
系列文章目录 前言
电气和电子工程师学会机器人模型优化技术委员会 一、学习资料
1.1 教程和暑期学校
2020 年 Memmo 欧盟项目暑期班2019年Memmo欧盟项目冬季学校Matthias Gerdts(德国慕尼黑联邦国防军大学)在拜罗伊特 OMPC 2013 上举办的最优控制教程…...
redis中缓存雪崩,缓存穿透,缓存击穿等
缓存雪崩 由于原有缓存失效(或者数据未加载到缓存中),新缓存未到期间(缓存正常从Redis中获取,如下图)所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,…...
C_8练习题答案
一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 编写C语言程序一般需经过的几个步骤依次是(B)。A.编辑、调试、编译、连接 B.编辑、编译、连接、运行 C.编译、调试、编辑、连…...
Web漏洞分析-文件解析及上传(中)
随着互联网的迅速发展,网络安全问题变得日益复杂,而文件解析及上传漏洞成为攻击者们频繁攻击的热点之一。本文将深入研究文件解析及上传漏洞,通过对文件上传、Web容器IIS、命令执行、Nginx文件解析漏洞以及公猫任意文件上传等方面的细致分析&…...
使用Node.js创建接口
当使用Node.js创建接口时,有两种主要方式:使用Express框架和使用Node.js的HTTP模块。
Express框架方式: 总的来说,使用Express框架可以更快速地搭建和管理接口,而使用Node.js的HTTP模块则提供了更多底层控制和灵活性&…...
【起草】人人都应该有一个chatGPT助手
第一章:ChatGPT 简介 - 介绍 ChatGPT 的基本概念和工作原理 - 讨论 ChatGPT 在自然语言处理领域的重要性和应用价值
【起草】章节 1-1 介绍 ChatGPT 的基本概念和工作原理-CSDN博客
【起草】1-2 讨论 ChatGPT 在自然语言处理领域的重要性和应用价值-CSDN博客…...
TCP/IP详解——网络基本概念
文章目录 一、网络基本概念1. OSI 7层模型1.1 每层对应的协议1.2 每层涉及的设备1.2.1 物理层设备1.2.2 数据链路层设备1.2.3 网络层设备1.2.4 传输层设备1.2.5 交换机和路由器的应用1.2.6 问题 2. TCP/IP 4层模型3. 物理层传输介质3.1 冲突域 4. 数据链路层4.1 以太网帧结构4.…...
[Linux] ps命令详解
ps命令
ps命令用于显示当前系统中的进程状态信息。以下是ps命令的一些常见参数及其作用: ps命令的基本形式: ps这将显示当前用户自己的运行中的进程的快照。 参数选项: -a: 显示所有进程,包括其他用户的进程。 -u: 显示与用户相…...
QT 中基于 TCP 的网络通信 (备查)
基础 基于 TCP 的套接字通信需要用到两个类: 1)QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。 2)QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。 这两个套接字通信类…...
使用MIB builder自定义物联网网关的MIB结构
文章目录 物联网网关初识(了解即可)IoT的通用MIB库结构MIB Builder开发流程指导问题总结子叶没所属分组值范围不为0 物联网网关初识(了解即可)
网关又称网间连接器、协议转换器。简单说,物联网网关是一台智能计算机&a…...