上海网页制作与网站设计,天猫网站建设,网页界面设计中表单的组成部分有哪些提示信息,番禺 大石网站建设一、项目分层结构介绍
controller层#xff08;控制器层#xff09;#xff1a;
作用#xff1a;负责输出和输入#xff0c;接收前端数据#xff0c;把结果返回给前端。
1.处理用户请求#xff0c;接收用户参数
2.调用service层处理业务#xff0c;返回响应
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层负责访问具体数据。
ps1mapper层和controller层和面向对象没太多关系。主要战场是在service和dao层。
ps2oomall是六边形体系结构沿用了mvc体系结构强调领域模型bo应用service尽量要让领域模型部分变得肥大尽量把service和dao层代码放到bo中把尽可能多的代码放到其中。
颜色的具体含义
白色存在mysql数据库蓝色表示从其它部分拿到的黄色表示存在mongo数据库绿色部分是全用java写的代码。
调用逻辑
用户请求发送到controller层controller层去调用service层service层调用dao层或mapper层从数据库返回数据。
二、dto、vo、bo、po介绍
dtodata 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记录AB用到AB有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层代码如何缓存regionserviceregion(getparentregiongetancestor,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中删除指定的键。