Java阶段五Day15

Java阶段五Day15

文章目录

  • Java阶段五Day15
    • 分层其他依赖
      • dao-api
      • dao-impl
      • infrustructure
      • domain
      • adapter
      • main
    • 测试整合项目main
    • 前台师傅功能
      • luban-front配置
      • 师傅相关表格ER图
        • ER练习案例
        • 鲁班表格ER关系(非常重要)
      • 前台师傅接口——师傅入驻
        • adapter
        • domain
        • infrustructure
        • dao-impl映射文件
        • main模块启动

分层其他依赖

保证最后 main 启动的时候,可以支持SSM框架内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mT4I9qS1-1690457348974)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day15/assets/image-20230727090240045.png)]

简单的启动测试案例,能否从 main 启动时,获取controller service repository dao接口代理

dao-api

定义持久层接口,定义使用的数据库表格对应po

<dependency><groupId>org.example</groupId><artifactId>worker-po</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

dao-impl

定义持久层实现,看到实现的依赖jpa hibernate mybatis

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.1.0</version>
</dependency>

infrustructure

domain

添加一个公用common

<dependency><groupId>org.example</groupId><artifactId>worker-common</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

adapter

需要spring mvc等支持

<!--私服提供的 adapter支持依赖-->
<dependency><groupId>com.tedu.inn</groupId><artifactId>inn-spring-adapter-support</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>

main

负责整合,跑通应用

<!--持久层整合-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency>
</dependency>
<!--TODO dubbo配置-->
<!--TODO nacos-->

测试整合项目main

main 提供了所需的启动 web 应用依赖内容

配置持久层

    • 依赖
    • 编写持久层实现(xml映射文件)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QGLQ1NZl-1690457348975)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day15/assets/image-20230727093648649.png)]

namespace对应接口全路径

select标签的id值对应接口的方法名称

    • 编写持久层接口

    在这里插入图片描述

    • main扫描接口包
    @SpringBootApplication
    @MapperScan("cn.tedu.luban.test.dao")
    public class WorkerServerApplication {//检测以下是否能够创建myabtis的实现对象DaoTestpublic static void main(String[] args) {//从启动方法获取返回值,spring上下文对象ConfigurableApplicationContextcontext = SpringApplication.run(WorkerServerApplication.class, args);DaoTest proxy = context.getBean(DaoTest.class);System.out.println(proxy.getClass().getName());int select = proxy.select();System.out.println(select);}
    }
    
  1. yaml 数据源mybatis各种属性

server:port: 9001
spring:application:name: luban-worker-serverdatasource:url: jdbc:mysql://localhost:3306/tarena_tp_luban_worker?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
# mybatis
mybatis:configuration:cache-enabled: false   # 不启用mybatis缓存map-underscore-to-camel-case: true # 映射支持驼峰命名法log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 将运行的sql输出到控制台mapper-locations: classpath*:mapper/*.xml

前台师傅功能

luban-front配置

项目中 vue.config.js 的文件,配置了前端请求的代理,代理会根据配置向外发出请求

一共配置了4个代理

  • 访问功能的网关

  • 图片上传服务

只考虑上传,访问演示系统环境中图片上传是没问题的,考虑的是读取图片,rpc调用,必须使用本地attach

  • base基本服务

在系统中查询服务区域,查询服务类型,都可以访问演示系统提供的base服务

  • 登录注册

师傅相关表格ER图

目标:

  • 掌握ER图分析创建过程

ER图——实体关系图(entity Relationship

在设计项目之初,做数据库设计的一个阶段性分析过程,产出ER图(数据库的概念设计)

ER练习案例

设计步骤:需求分析,实体确定,实体关系

需求:请给一个论坛,设计功能,包含用户可以登录,用户可以申请成为版主,论坛有板块,用户可以在板块里发帖,可以回帖,版主可以删除所有回帖和发帖,用户只能删除自己的回帖和发帖

确定实体: 用户 版主 板块 帖子 回帖

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5xs12jhz-1690457348976)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day15/assets/image-20230727104520379.png)]

实体关系: 需要根据实体提供的功能,完成实体与其他实体的关系确定,最后需要优化,删除间接关系保留最清晰联系。最终由创建数据库DBA决定到底如何关联实体对应表格

(数据库设计六个阶段 需求分析,概念设计,逻辑设计,物理设计,数据库创建,数据库运维)

如果设计到表格落地:

user: table_user

role: table_role

user_role: table_user_role

reply: table_reply(uerId),外键需要加到哪里

如果是1对1的表格,任何一方理论上做外键,但是应该区分主从表

主表: 核心数据

从表: 数据依赖主表数据存在

鲁班表格ER关系(非常重要)

鲁班平台需求描述: 支持运营商 供应商 厂家入住提供维修需求订单的平台,可以允许用户登录注册,线下培训考核,成为师傅进行抢单,并且对订单结果负责的一个服务平台系统

  • 运营商 / 厂家 / 供应商 入住
  • 用户的登录注册
  • 用户成为师傅需要师傅入住
  • 师傅入住后,绑定给一个平台账号
  • 厂家提供需求单,平台定义结算分润
  • 师傅入住时选择服务区域
  • 师傅入住时选择服务分类
  • 师傅入住时上传身份信息图片
  • 师傅查询需求单,抢单,生成订单
  • 师傅签到,上传施工图片,完成订单
  • 平台进行订单结算

实体确定:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GsaQcw6J-1690457348977)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day15/assets/image-20230727115638551.png)]

前台师傅接口——师傅入驻

  • 从上向下开发业务功能
    • adapter 接收请求 controller
    • domain 处理业务
      • service
      • repository 定义domain接口 **Repository
    • infrustructure 定义repositoryImpl
    • dao-api 接口定义持久层功能
    • dao-impl xml 映射文件 sql 语句

adapter

  • WorkerServerController
package com.tarena.luban.worker.server.controller;import com.tarena.tp.luban.worker.server.dto.param.WorkerCreateParam;
import com.tedu.inn.protocol.exception.BusinessException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/**前台师傅接口1. 入住 写操作2. 查询详情,查询的是已经审核通过的当前登录的师傅信息*/
@RestController
@RequestMapping("/worker")
public class WorkerServerController {@Autowiredprivate WorkerServerService workerServerService;/*** 返回 通用数据result*/@PostMapping("/create")public Long createWorker(@RequestBody WorkerCreateParam workerCreateParam) throws BusinessException {//调用 worker service 新增return workerServerService.create(workerCreateParam);}
}

domain

相关代码,处理的问题,后端代码如何获取userId

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H9chWCdf-1690457348978)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day15/assets/image-20230727145931514.png)]

  • WorkerServerService
package com.tarena.luban.worker.server.manange;
import com.tarena.luban.worker.server.repository.WorkerAreaRepository;
import com.tarena.luban.worker.server.repository.WorkerCategoryRepsoitory;
import com.tarena.luban.worker.server.repository.WorkerRepository;
import com.tarena.passport.protocol.LoginUser;
import com.tarena.passport.sdk.context.SecurityContext;
import com.tarena.tp.luban.worker.server.common.enums.ResultEnum;
import com.tarena.tp.luban.worker.server.dto.param.WorkerAreaParam;
import com.tarena.tp.luban.worker.server.dto.param.WorkerCategoryParam;
import com.tarena.tp.luban.worker.server.dto.param.WorkerCreateParam;
import com.tedu.inn.commons.utils.Asserts;
import com.tedu.inn.protocol.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;import java.util.List;/*** @author liner* @version 1.0*/
@Service
@Slf4j
public class WorkerServerService {@Autowiredprivate WorkerRepository workerRepository;@Autowiredprivate WorkerAreaRepository workerAreaRepository;@Autowiredprivate WorkerCategoryRepsoitory workerCategoryRepsoitory;/*** 1. 补充userId* 2. 检查 手机号* 3. 检查 身份证 和真实名称是否匹配 TODO* 4. 存储 worker workerCategory workerArea* 使用定义好的repository接口* @param workerCreateParam* @return*/@Transactional(rollbackFor = Exception.class)public Long create(WorkerCreateParam workerCreateParam) throws BusinessException {//获取userIdLong userId=getUserIdByToken();//检查 手机号 身份证 TODOcheckPhoneAndIdCard(workerCreateParam);//挨个存储对应数据到持久层workerCreateParam.setUserId(userId);Long id=saveWorker(workerCreateParam);saveWorkerArea(workerCreateParam);saveWorkerCategory(workerCreateParam);return id;}/*** 先删除,后新增* @param workerCreateParam*/private void saveWorkerCategory(WorkerCreateParam workerCreateParam) {workerCategoryRepsoitory.deleteByUserId(workerCreateParam.getUserId());List<WorkerCategoryParam> workerCategoryParams = workerCreateParam.getWorkerCategoryParams();if (!CollectionUtils.isEmpty(workerCreateParam.getWorkerCategoryParams())){//循环workerCategoryParams.forEach(param -> {param.setUserId(workerCreateParam.getUserId());workerCategoryRepsoitory.save(param);});}}/*** 先删除,后新增* @param workerCreateParam*/private void saveWorkerArea(WorkerCreateParam workerCreateParam) {workerAreaRepository.deleteByUserId(workerCreateParam.getUserId());//循环存储 <foreach>//TODO 批量存List<WorkerAreaParam> workerAreaParams= workerCreateParam.getWorkerAreaParams();for (WorkerAreaParam workerAreaParam : workerAreaParams) {//提交的参数 workerCategoryParam中和workerParam类似的,也没有userId;workerAreaParam.setUserId(workerCreateParam.getUserId());//insert into worker_areaworkerAreaRepository.save(workerAreaParam);}}/*** 1. 当前用户有可能已经是师傅了.* 1.1 先查讯数据库是否有当前用户.师傅信息 有就报错 没有 就新增* 1.2 不管有没有 如果有就删除.重新新增* @param workerCreateParam* @return*/private Long saveWorker(WorkerCreateParam workerCreateParam) {//如果当前用户在数据库中有师傅信息,就删除 重新入住师傅信息workerRepository.delete(workerCreateParam.getUserId());Long id=workerRepository.save(workerCreateParam);//TODO rpc 调用 将身份信息,worker-id,和当前图片传递给attach系统,做更新return id;}private void checkPhoneAndIdCard(WorkerCreateParam workerCreateParam) {//TODOlog.info("check phone and idCard,now passed");}private Long getUserIdByToken() throws BusinessException {LoginUser loginToken = SecurityContext.getLoginToken();//判断 user登录还是没登录 如果loginUser是空的,说明没登录Asserts.isTrue(loginToken==null,new BusinessException(ResultEnum.USER_TOKEN_VERIFY_FAILED));return loginToken.getUserId();}}

infrustructure

  • 实现domain定义的repository接口
  • 根据代码需求创建dao-apidao接口

dao-impl映射文件

  • worker insert delete
  • workerArea insert delete
  • workerCategory insert delete

实现xml映射文件,从源代码中粘贴修改

  • namespace 对应当前接口类
  • 不需要方法的删除
  • 根据当前接口中方法名,确定标签的 id 是否对应
  • 根据接口中方法参数,确定 sql 中 #{参数名} 是否正确

insert标签

<insert id="insert" parameterType="com.tarena.tp.luban.worker.po.Worker" useGeneratedKeys="true" keyColumn="id"keyProperty="id">

mybatis可以通过 useGeneratedKeys属性 决定是否要补充参数的属性值

keyColumn就是读取数据库的字段

keyProperty补充到对象的属性

main模块启动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SQosGTe-1690457348978)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day15/assets/image-20230727174543269.png)]

spring-boot-starter-web 底层web容器 默认tomcat

tomcat容器里默认加载servlet容器,会有servlet-api存在

main依赖分层的模块,依赖中存在servlet-api,会和main starter-web冲突

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何判断某个视频是深度伪造的?

目录 一、前言 二、仔细检查面部动作 三、声音可以提供线索 四、观察视频中人物的身体姿势 五、小心无意义的词语 深造伪造危险吗&#xff1f; 一、前言 制作深度伪造视频就像在Word文档中编辑文本一样简单。换句话说&#xff0c;您可以拍下任何人的视频&#xff0c;让他…

谷粒商城第六天-实现功能的前序工作(网关的配置 跨域配置)

目录 一、为什么要做这项工作 1.1 为什么要配置网关 1.2 为什么要使用网关统一配置跨域 二、网关配置 三、统一跨域配置 四、总结 一、为什么要做这项工作 1.1 为什么要配置网关 我们知道网关的作用其实主要就是进行路由的&#xff0c;也就是根据前端发送到网关的请求&…

【docker】docker部署nginx

目录 一、步骤二、示例 一、步骤 1.搜索nginx镜像 2.拉取nginx镜像 3.创建容器 4.测试nginx 二、示例 1.搜索nginx镜像 docker search nginx2.拉取nginx镜像 docker pull nginx3.创建容器&#xff0c;设置端口映射、目录映射 # 在root目录下创建nginx目录用于存储nginx数据…

Vue3解决:Mockjs 引入后并访问 404(Not Found) 的页面报错问题

1、问题描述&#xff1a; 其一、报错为&#xff1a; GET http://localhost:5173/list 404 (Not Found) ncaught (in promise) AxiosError {message: Request failed with status code 404, name: AxiosError, code: ERR_BAD_REQUEST, config: {…}, request: XMLHttpRequest,…

大采购3.0,打造企业采购数智化的韧性变革!

大采购3.0&#xff0c;深化采购全链路管控&#xff0c;聚焦数智化运营、智慧化监管、个性化需求适配、一体化协同、稳定可靠、安全可信、企业级服务七大核心基因&#xff0c;围绕采购管理、供应商全生命周期管理、人工智能深入应用、易用性、交付能力等方面进行了全面升级和优化…

.NET 8 Preview 5推出!

作者&#xff1a;Jiachen Jiang 排版&#xff1a;Alan Wang 我们很高兴与您分享 .NET 8 Preview 5 中的所有新功能和改进&#xff01;此版本是 Preview 4 版本的后续版本。在每月发布的版本中&#xff0c;您将看到更多新功能。.NET 6 和 7 用户可以密切关注此版本&#xff0c;而…

数据结构--图的遍历 BFS

数据结构–图的遍历 BFS 树的广度优先遍历 从 1 结点进行 b f s bfs bfs的顺序&#xff1a; 【1】 【2】【3】【4】 【4】【6】【7】【8】 图的广度优先遍历 从 2 号点开始 b f s bfs bfs的顺序&#xff1a; 【2】 【1】【6】 【5】【3】【7】 【4】【8】 树 vs 图 不存在“回…

系统学习Linux-MySQL服务基础(一)

一、MySQL服务概述 什么是数据库&#xff1f; 将大量数据保存起来&#xff0c;通过计算机加工而成的可以进行高效访问的数据集合 数据库是存储、管理和操作组织化数据的软件系统 数据库能干什么&#xff1f; 企业应用存放用户数据、管理企业数据金融行业存储分析客户的财务…

pear文件利用 (远程文件下载、生成配置文件、写配置文件) 从一道题看——CTFshow私教 web40

web40 考点&#xff1a;pear文件包含 pear是PHP的一个扩展 条件&#xff1a; 1 有文件包含点 2 开启了pear扩展 &#xff08;可以当他是一个框架&#xff09; 3 配置文件中register_argc_argv 设置为On,而默认为Off&#xff08;$_SERVER[‘argv’]生效&#xff09; 4 找到…

【力扣每日一题】2023.7.25 将数组和减半的最少操作次数

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个数组&#xff0c;我们每次可以将任意一个元素减半&#xff0c;问我们操作几次之后才可以将整个数组的和减半&…

【cpolar内网穿透工具】

文章目录 cpolar内网穿透工具.md概述什么是cpolar&#xff1f;cpolar可以用在哪些场景&#xff1f; 1. 注册cpolar帐号1.1 访问官网站点&#xff1a;[https://www.cpolar.com](https://link.zhihu.com/?targethttps%3A//www.cpolar.com/) 1.2 注册帐号 2. 下载Windows版本cpol…

【ARM Cache 系列文章 2 -- Cache Coherence及内存顺序模学习】

文章目录 Cache Coherence 背景1.1 内存顺序模型简介(Memory Model)1.1.1 Normal Memory1.1.2 Device Memory 1.2 Cache 一致性问题解决方案1.2.1 Shareability 属性1.2.2 Non-Shareable 属性1.2.3 Inner-Shareable 属性1.2.4 Out-Shareable 属性 1.3 Shareability 和 PoC/PoU …

【干货防踩坑/全图文分步/Gitlab镜像仓库自动同步】Gitlab CE/EE镜像仓库的配置技巧(含ssh/密码两验证方法)

【干货踩坑】Gitlab CE/EE镜像仓库的配置技巧&#xff08;含ssh/密码两验证方法&#xff09; 众所周知&#xff0c;Gitlab是个好东西。为什么呢&#xff1f;GitHub没有的功能&#xff0c;他全有了。更何况还可以私有部署。这两天自己部署了Gitlab&#xff0c;然后想把自己的项…

2. Spring 的创建和使用

目录 1. 创建 Spring 项目 1.1 创建一个 maven 项目 1.2 添加 Spring 框架支持 1.3 添加启动类 2. 存储 Bean 对象 2.1 创建 Bean 2.2 将 Bean 注册到容器 3. 获取并使用 Bean 对象 3.1 创建 Spring 上下文 ApplicationContext 和 BeanFactory 的区别&#xff08;重点…

分布式锁:Redis、Zookeeper

1.基于Redis实现分布式锁&#xfeff; Redis分布式锁原理如上图所示&#xff0c;当有多个Set命令发送到Redis时&#xff0c;Redis会串行处理&#xff0c;最终只有一个Set命令执行成功&#xff0c;从而只有一个线程加锁成功 2.SetNx命令加锁 利用Redis的setNx命令在Redis数据库…

MySQL数据库关于表的一系列操作

MySQL中的数据类型 varchar 动态字符串类型&#xff08;最长255位&#xff09;&#xff0c;可以根据实际长度来动态分配空间&#xff0c;例如&#xff1a;varchar(100) char 定长字符串&#xff08;最长255位&#xff09;&#xff0c;存储空间是固定的&#xff0c;例如&#…

系统架构设计师-软件架构设计(4)

目录 一、软件架构评估 1、敏感点 2、权衡点 3、风险点 4、非风险点 5、架构评估方法 5.1 基于调查问卷或检查表的方式 5.2 基于度量的方式 5.3 基于场景的方式 6、基于场景的评估方法 6.1 软件架构分析法&#xff08;SAAM&#xff09; 6.2 架构权衡分析法&#xff08;ATAM&am…

J2EE通用分页02

目录 一.重构-提取公用方法 1.为了进行公共方法的抽取&#xff0c;需要找出上面实习中的可通用部分&#xff0c;和差异化部分 2.公用方法封装思路 3. 具体实现 二.分页标签 2.1 准备一个Servlet 3.2 结果展示页面 三. 过滤器解决中文乱码问题 四.加入分页功能 四…

Clion开发STM32之W5500系列(NTP服务封装)

概述 在w5500基础库中进行封装&#xff0c;获取服务端的时间&#xff0c;来校准本地时间。本次使用的方案是通过ntp获取时间定时器更新保证时间准确。 NTP封装 头文件 /*******************************************************************************Copyright (c) [sc…

2:SpringIOC

文章目录 一&#xff1a;Spring_IOC概念引入_重要1&#xff1a;Spring解耦合的原理2&#xff1a;创建一个spring项目并实现IOC基本功能 二&#xff1a;Spring_IOC原理分析 ***1&#xff1a;XML解析技术读取配置文件**2**&#xff1a;反射技术实例化对象,放到容器中3&#xff1a…