Java阶段五Day15

news2024/9/24 17:20:55

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的实现对象DaoTest
        public static void main(String[] args) {
            //从启动方法获取返回值,spring上下文对象
            ConfigurableApplicationContext
            context = 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-server
  datasource:
    url: jdbc:mysql://localhost:3306/tarena_tp_luban_worker?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
    username: root
    password: root
    driver-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 {
    @Autowired
    private 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 {
    @Autowired
    private WorkerRepository workerRepository;
    @Autowired
    private WorkerAreaRepository workerAreaRepository;
    @Autowired
    private 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 {
        //获取userId
        Long userId=getUserIdByToken();
        //检查 手机号 身份证 TODO
        checkPhoneAndIdCard(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_area
            workerAreaRepository.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) {
        //TODO
        log.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.coloradmin.cn/o/798330.html

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

相关文章

【C语言】指针进阶(二)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

使用xtcp映射穿透指定服务

使用xtcp映射穿透指定服务 管理员Ubuntu配置公网服务端frps配置service自启(可选) 配置内网服务端frpc配置service自启(可选) 使用者配置service自启(可选) 通过frp实现内网client访问另外一个内网服务器 管理员 1&#xff09;配置公网服务端frps2&#xff09;配置内网服务端…

2023年 React 最佳学习路线

CSS CSS JavaScript JavaScript TypeScript 目前没有找到比其他文档好很多的文档地址 可以先看官网 React 新版 React 官方文档无敌 React React-router-dom V5 V6 Webpack webpack Antd antd

基于贴花的热力图呈现方法参考

首先是热力图信息类&#xff1a; using System; using UnityEngine;[Serializable] public class HeatMapInfo {public Rect rect Rect.zero;public float pixelDensity 1;public float valBase 0;public float valRange 1;public PercentColor[] ribbon;//色带public Col…

关联分析-Apriori

关联分析-Apriori 1. 定义 关联分析就是从大规模数据中&#xff0c;发现对象之间隐含关系与规律的过程&#xff0c;也称为关联规则学习。 2. 相关概念 2.1 事务、项与项集 订单号购买商品0001可乐、薯片0002口香糖、可乐0003可乐、口香糖、薯片 以上面的订单为例&#xf…

一套流程6个步骤,教你如何正确采购询价

采购询价&#xff08;RFQ&#xff09;是一种竞争性投标文件&#xff0c;用于邀请供应商或承包商就标准化或重复生产的产品或服务提交报价。 询价通常用于大批量/低价值项目&#xff0c;买方必须提供技术规格和商业要求&#xff0c;该文件有时也称为招标书或投标邀请书。询价流…

客户问题解决平台-帮助与支持中心

在现代企业中&#xff0c;帮助与支持中心扮演着至关重要的角色。随着市场的竞争日趋激烈&#xff0c;客户对于产品和服务的期望也越来越高。因此&#xff0c;建立一个高效的客户问题解决平台是企业成功的关键之一。本文将探讨帮助与支持中心的作用&#xff0c;介绍其功能和优势…

Linux(二)--Linux基础命令

我们在前面学习的Linux命令&#xff0c;其实它们的本体就是一个个的二进制可执行程序。 和Windows系统中的.exe文件&#xff0c;是一个意思。 一.Linux的目录结构 Linux的目录结构是一个树形结构。 Windows系统可以拥有多个顶级目录&#xff0c;称之为盘符&#xff0c;如C盘&…

Journal of Information Security and Applications (JISA) 投稿经验分享

Journal of Information Security and Applications (JISA) 投稿经验分享 基本情况: 中科院三区 JCR Q2 2023影响因子&#xff1a;5.6 老牌信息安全类期刊 投稿经验&#xff1a; With editor 周期&#xff1a; 1-2个月&#xff0c;稍微有点慢 Under review 周期&#xff1a; 2…

Nautilus Chain 即将发行治理通证 NAUT ,生态发展进程加速

独特且优势明显的 Nautilus Chain 目前&#xff0c;行业内首个模块化底层 Nautilus Chain 已经上线主网&#xff0c;并且即将有超过 70 个应用原生部署在 Nautilus Chain 上。Nautilus Chain 本身是一个以 Layer3 为定位的区块链系统&#xff0c;其通过 Celestia 模块化底层来获…

C++初阶之一篇文章让你掌握string类(模拟实现)

string类模拟实现 1.为什么要模拟实现string2.string的模拟实现需要注意哪些问题3.经典的string类问题4.写时拷贝5.传统版写法的String类&#xff08;参考&#xff09;6.现代版写法的String类&#xff08;参考&#xff09;7.string类的模拟实现&#xff08;讲解&#xff09;7.1…

Vue基础-综合案例(基于vue2)

一、目标 能够知道如何使用vue-cli创建vue项目能够知道如何在项目中安装与配置element-ui能够知道element-ui中常见组件的用法能够知道如何使用axios中的拦截器能够知道如何配置proxy接口代理 二、目录 vue-cli组件库axios拦截器proxy跨域代理用户列表案例 vue-cli 1.什么…

浅谈密码学的由来

目录 1.什么是密码学 2.密码学的发展 3.密码学的应用 4.密码学未来的发展趋势 1.什么是密码学 密码学是关于安全通信的科学研究&#xff0c;它研究如何在敌对环境中保护通信的机密性、完整性和身份验证。密码学涉及使用各种算法和技术来加密和解密信息&#xff0c;以确保只有…

C++基础算法⑤——递推算法(昆虫繁殖 过河卒 Pell数列 上台阶 流感传染 移动路线)

递推掌握核心&#xff1a; 递推公式(规律)递推边界(初始化条件) 分析题目意思&#xff1a;如下图 递推式&#xff1a;a[n] a[n-1]a[n-2]; 递推边界&#xff1a;a[1]1 a[2]2 #include<iostream> using namespace std; long long a[100],x,y,z; int main(){ //昆虫繁衍…

c++类和对象(拷贝构造、运算符重载、初始化列表、静态成员、友元等)

一、拷贝构造 拷贝构造函数的特征&#xff1a; 1、拷贝构造函数是构造函数的一个重载形式&#xff1b; 2、拷贝构造函数的参数只有一个且必须是同类类型对象的引用&#xff0c;使用传值方式编译器直接报错&#xff0c;因为会引发无穷递归调用。 在c中自定义类型传值传参的时…

vue中的.env文件分析

问题说明 有米有小伙伴&#xff0c; 在看一个新鲜的项目的时候&#xff0c; 会发现在项目中会有类似于下方的文件。 那这些文件是干什么的呢&#xff1f; 它们在项目中会有什么作用呢&#xff1f; 如何调用这些文件的呢 问题解答 0&#xff0c;对于vue中模式与环境变量的说…

专注:如何提高专注力和注意力的简要指南

专注力和集中力可能很难掌控的很好。大多数人都想学习如何提高注意力和注意力。但真的做到了&#xff1f;我们生活在一个嘈杂的世界里&#xff0c;不断的分心会使注意力难以集中。 此指南包含有关如何获得并保持专注的研究。我们将分解提升您的思维并关注重要事物背后的理论依…

平衡二叉树介绍

一、树的概念 1.1 空树和非空树 空树&#xff1a;结点数为0的树 非空树&#xff1a;有且仅有一个根节点。其中&#xff0c;没有后继的结点叫叶子结点&#xff0c;有后继的结点叫做分支结点。 如下图所示&#xff1a; 1.2树的属性 除了根结点外任何一个结点都有且仅有一个前…

阿里Java开发手册~应用分层

1. 【推荐】图中默认上层依赖于下层&#xff0c;箭头关系表示可直接依赖&#xff0c;如&#xff1a;开放接口层可以依赖于 Web 层&#xff0c;也可以直接依赖于 Service 层&#xff0c;依此类推&#xff1a; 开放接口层 &#xff1a;可直接封装 Service 方法暴露成 RP…

600就能用上7000MHz的DDR5内存,这套32GB的光威天策真是快又稳

大家都知道&#xff0c;DDR5内存性能提升很大&#xff0c;而且Intel 13代平台和AMD Zen 4平台都已经兼容了&#xff0c;可以带来更稳定的性能表现&#xff0c;之前因为DDR5内存价格高昂&#xff0c;许多消费者望而却步&#xff0c;而随着今年DDR5内存售价的逐渐下降&#xff0c…