目录

项目初始工程搭建:

不同项目需要的前后端环境也不同

前端项目搭建:

熟悉模块的方式

代码阅读

如何开发一个接口

Swagger(接口文档)

Api注解的说明


​​​​​​​项目初始工程搭建:

公司项目分两种,新立项目(0-1)和已有项目开发(1-2)

熟悉项目结构,每个模块对应的作用,比如这个项目中web依赖service,service依赖common,他们都有共同的父工程

代码在企业中常常通过Git拉取和管理(不会的可以在我主页搜索相关文章)

不同项目需要的前后端环境也不同

第一步:安装JDK11


win10系统
https://blog.csdn.net/climber16/article/details/83242425

win11系统
https://blog.csdn.net/Li_Ya_Fei/article/details/131189321

mac系统
https://blog.51cto.com/u_15294985/5132958

第二步,将对应maven导入到自己容易查找的目录

第三步.在idea中导入项目,这里是复制粘贴,企业里根据git拉代码,(将代码上传至github管理,具体见我前面文章),配置idea到对应jdk,修改maven

第四步.使用内置datagrip导入数据库

第五步,修改配置文件,数据库连接池和密码

配置文件和启动类单独放在zzyl-web中

前端项目搭建:

拉取代码,放到非中文目录

下在node.js

cmd中用node-v检验

在管理员打开的cmd中用 npm install -g yarn下载yarn(另一个JavaScript资源管理包),用来解决早期npm的一些性能和安全问题

yarn -v 验证版本
 

  • 现代 npm(v5+)的性能已显著提升,但 Yarn 仍因其特性(如离线缓存、yarn.lock 文件)被广泛使用。

之后可以使用yarn install下载依赖,yarn的很多命令和npm是相似的,只改变了前缀

前端项目中,项目的根目录vite.config.ts文件中定义了访问后端接口的服务地址

最后在终端通过一下命令运行

yarn run dev

失败的可以试一下

npm run dev


熟悉模块的方式

1.阅读原型文档和需求文档

两种方式:(1).原型文档文件夹

(2).项目原型地址

在观察原型图时,找到需要开发的接口和对应的需求,严格按照需求开发功能

首先观察文档的全局说明,在有全局说明的情况下,很多接口是默认按照全局说明处理的,比如单页10条数据,超出自动分页

看原型文档需要看到什么程度:

1)了解产品的背景和定位,熟悉业务流程

2)了解功能描述和系统流程(大概知道有几个接口,每个接口的作用是什么)

3).和产品经理确认理解没有偏差

2.熟悉表结构

在DataGrip中有Modify Table(修改表)

里面包括表的名称,备注,主键,外键,唯一约束等等

3.页面点击访问感受(推测一下流程)

自己在测试功能时就可以熟悉功能,检验bug,比如我在测试图片上传功能时原代码就有bug,调错了构造方法,msg本来应该是返回一个友好消息,比如文件上传成功,用户创建成功等.

4.阅读对应模块代码

对于不熟悉的代码可以喂给AI去解读

代码阅读

1.查看浏览器http请求,F12调出开发者模式,通过网络查看接口请求和响应

2.控制层Controller

符合RESTful风格,Get查询,Post增加,Put修改,Delete删除

返回的格式:ResultResponse

继承了BaseController,BaseController封装了一些通用的方法(比如获取参数,日志打印,分页查询,返回封装结果,异常处理等)

DTO:Data Transfer Object 数据传输对象,接受前端传来的数据

VO:Value Object 展示对象:接口的出参

业务层:对象拷贝工具类BeanUtils(Hutool工具包,转化类型)

持久层

查看Sql语句类型

如何开发一个接口

1.根据原型图设计接口

2.制作接口文档

3.进行功能开发

其中:表结构设计,接口设计,测试缺陷过程是反复进行的,在开发过程中不断修正

接口设计大多由我们后端开发工程师完成,我们要遵循接口设计规范

1.粗粒度设计,根据原型图大致判断有几个接口,分别实现什么功能

2.细粒度设计,明确接口的功能

(1)需求分析:根据原型文档制作接口文档,并将不确定的接口与产品经理进行沟通

(2)接口四要素

  • 请求路径:命名以模块的英文名称区分
  • 请求方式(RESTful风格) Get(查),post(增),put(改),delete(查)
  • 接口入参      路径参数(?以及Path(后端以Pathvariable注解接收))  Json格式请求体用DTO接受
  • 返回参数     考虑全面,宁多不少,前端不需要的参数前端开发人员可以不出来(在不确定需要多少参数的时候)

我们在实现功能时,一些简单接口可以借助ai进行实现

第一步:获取表的建表语句

在数据库中new一个控制台

show create table "对应表名";粘贴查询到的查询语句

使用ai工具,将对应表结构复制到ai输入框,并补充要求:

例如:基于表结构,使用Springboot+mybatis生成CRUD操作,sql语句单独一个xml文件

ai会自动生成各个层次的代码:

但是我们要注意根据接口文档进行修改,比如:

controller层:传入参数是否全面?

service层:对表的逻辑处理是否到位?比如一些字段像创建时间修改时间这些逻辑需要我们手动添加

接口测试:

postman,apifox(问题是在工具里需要确定接口信息)

Swagger(接口文档)

为什么要有接口文档:现代企业开发通常采用前后端分离的架构,前后端沟通需要一个APi文档规范,而Swagger是一个动态变化的文档

Swagger是一个规范和完整的框架,用于生成,描述,调用和可视化Result风格的Web服务,它的作用是:

1.使前后端分离开发更加方便,有利于合作,因为前后端遵从同一个接口规范

2.接口的文档在线自动生成,降低后端开发人员编写接口文档的负担

3.功能测试,它可以模仿浏览器发送http请求

knife4j是JavaMVC继承Swagger生成Api文档的增强解决方案,kinife意思是像一把小刀一样小巧,轻量,强悍!现在开发中一般使用knife4j框架,它可以看 做Swagger文档的增强版

Api注解的说明

@Api                 用在类上,描述Contoller的作用,比如这个controller是登录接口,用户接口?

@ApiOperation         用在方法上,说明方法的用途和作用

@ApiParam                用在方法的参数上,描述单个形参的含义(如路径参数,具体的参数)

@ApiImplicitParam           用在方法上,描述单个形参的含义,使用范围更广(哪些传入多个参数的请求参数,例如HttpRequest)(想具体了解区别可以在Ai搜索)

@ApiModel        用在类上,用对象来接受参数或者返回参数,描述类的含义(这个用在实体类例如User,UserDTO中)

@ApiModelProperty       用在类的属性上,用对象来接收参数或返回参数,描述字段的含义(同上,这个作用在类中的属性上)

举例

package com.zzyl.controller;import com.zzyl.base.ResponseResult;
import com.zzyl.dto.BedDto;
import com.zzyl.entity.Bed;
import com.zzyl.service.BedService;
import com.zzyl.utils.ObjectUtil;
import com.zzyl.vo.BedVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/bed")
@Api(tags = "床位管理相关接口")
public class BedController extends BaseController {@Autowiredprivate BedService bedService;@GetMapping("/read/room/{roomId}")@ApiOperation(value = "根据房间id查询床位", notes = "传入房间id")public ResponseResult<List<BedVo>> readBedByRoomId(@ApiParam(value = "房间ID", required = true) @PathVariable("roomId") Long roomId) {List<BedVo> beds = bedService.getBedsByRoomId(roomId);return success(beds);}/*** 创建床位* @param bedDto* @return*/@PostMapping("/create")@ApiOperation(value = "创建床位", notes = "传入床位信息")public ResponseResult createBed(@RequestBody BedDto bedDto) {bedService.createBed(bedDto);return success();}/*** 根据id查询床位* @param id* @return*/@GetMapping("/read/{id}")@ApiOperation(value = "根据id查询床位", notes = "传入床位id")public ResponseResult getBedById(@ApiParam (value = "床位ID", required = true)@PathVariable Long id) {BedVo bedVo = bedService.getBedById(id);if (ObjectUtil.isEmpty(bedVo)) {return ResponseResult.error("查询失败,床位信息为空");}return ResponseResult.success("操作成功",bedVo);}/*** 修改床位* @param bed* @return*/@PutMapping("/update")@ApiOperation(value = "修改床位", notes = "传入床位信息")public ResponseResult updateBed(@RequestBody Bed bed) {bedService.updateBed(bed);return success();}/*** 删除床位* @param id* @return*/@DeleteMapping("/delete/{id}")@ApiOperation(value = "删除床位", notes = "传入床位id")public ResponseResult deleteBed(@ApiParam (value = "床位ID", required = true) @PathVariable Long id) {bedService.deleteBed(id);return success();}}

        

package com.zzyl.entity;import com.zzyl.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data
@ApiModel("床位")
public class Bed extends BaseEntity {/*** 床位编号*/@ApiModelProperty("床位编号")private String bedNumber;/*** 床位状态*/@ApiModelProperty(value = "床位状态: 未入住0, 已入住1",example = "0")private Integer bedStatus;/*** 房间ID*/@ApiModelProperty("房间ID")private Long roomId;/*** 排序号*/@ApiModelProperty(value = "排序号")private Integer sort;
}

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

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

相关文章

[1-01-01].第78节:Java8新特性 - Lambda表达式

java基础语法大纲 一、Lambda 表达式 1.1.概述&#xff1a; 1.Lambda 是一个匿名函数&#xff0c;我们可以把 Lambda 表达式理解为是一段可以传递的代码&#xff08;将代码像数据一样进行传递&#xff09;2.使用Lambda 表达式可以写出更简洁、更灵活的代码。作为一种更紧凑的…

【2025.6.27 校内 NOI 模拟赛】总结(贪心, 容斥、组合计数, dsu on tree、 虚树)

文章目录 时间安排反思题解[六省联考 2017] 期末考试&#xff08;贪心&#xff0c; 枚举&#xff09;[JSOI2019] 神经网络&#xff08;容斥&#xff0c; 组合计数&#xff0c; 树背包&#xff09;[ZJOI2019] 语言&#xff08;dsu on tree&#xff0c; 虚树&#xff0c; 结论&am…

实际前端开发中,常用指令的封装

实际前端开发中&#xff0c;常用指令的封装 全局指令处理步骤main.ts指令目录结构src/directives/index.ts 一、输入框空格禁止指令1、指令文件clearSpace.ts2、指令使用 全局指令处理步骤 main.ts import { createApp } from "vue"; import App from "./App.…

鸿蒙OH南向开发 轻量系统内核(LiteOS-M)【异常调测】

基本概念 OpenHarmony LiteOS-M提供异常接管调测手段&#xff0c;帮助开发者定位分析问题。异常接管是操作系统对运行期间发生的异常情况进行处理的一系列动作&#xff0c;例如打印异常发生时异常类型、发生异常时的系统状态、当前函数的调用栈信息、CPU现场信息、任务调用堆栈…

算法-堆排序

文章目录 整体架构流程技术细节小结 整体架构流程 大顶推&#xff1a;是构建一个完整的二叉树 大顶推&#xff1a;即父节点的值大于左右子树的值。 循环构建大顶推 在给定的数组&#xff0c;既可以明确树的高度。 在循环的时候&#xff0c;构建树的高度从lgn至0。即从堆低往堆…

【鸿蒙HarmonyOS Next App实战开发】二维码生成技术实现与解析

随着移动应用开发中对便捷交互体验的需求日益增长&#xff0c;二维码作为信息传递的重要载体&#xff0c;其生成与使用变得越来越普遍。本文将基于鸿蒙HarmonyOS应用开发框架&#xff0c;详细介绍如何实现一个功能完备的二维码生成器&#xff0c;并附上完整代码解析。 注意该实…

1 Studying《Is Parallel Programming Hard》6-9

目录 Chapter 6 Partitioning and Synchronization Design 6.1 分区练习 6.2 设计准则 6.3 同步粒度 6.4 并行快速路径 6.5 超越党派分歧 6.6 分区、并行和优化 Chapter 7 Locking 7.1 活命 7.2 锁的类型 7.3 锁定实施问题 7.4 基于锁的存在性保证 7.5 锁定&a…

Java练习题精选16-20

Java练习题精选16-20 一、第十六题二、第十七题三、第十八题四、第十九题五、第二十题一、第十六题 现有一个存放学生成绩的数组{66, 77, 88, 99},要求将该数组正序输出每个下标所对应的元素。 public class Test {public static void main(String[] args) {int<

新能源知识库(68)汽车电镀与蒸汽

汽车电镀是提升零部件耐磨性、抗腐蚀性和美观性的关键工艺&#xff0c;其流程根据基材&#xff08;金属或塑料&#xff09;和部件功能需求有所差异。 汽车电镀是以 基材特性和 功能需求为导向的精密工艺&#xff1a; ​金属件​&#xff1a;核心流程为 ​除油→酸洗→电镀→钝…

Veo 3 视频生成大模型完整操作教程(2025)

随着 AI 多模态能力的飞跃&#xff0c;Google DeepMind 发布的 Veo 3 成为了生成视频领域的一颗重磅炸弹。它不仅能够根据文本生成高质量的视频画面&#xff0c;还能同步生成对白、背景音和环境音&#xff0c;是目前最接近真正“AI 导演”的大模型。 本文将带你详细了解 Veo 3…

10【认识文件系统】

1 认识硬件——磁盘 1.1 物理构成 磁盘是计算机中唯一的机械设备&#xff0c;同时也是一种外部存储设备&#xff08;外设&#xff09;。早期的计算机通常配备的是机械硬盘&#xff08;HDD&#xff09;&#xff0c;依靠磁头和盘片的机械运动来进行数据的读写。但随着用户对计算…

Windows命令连接符的安全风险分析与防御策略

1. 命令连接符简介 在 Windows 的命令行环境&#xff08;CMD/PowerShell&#xff09;中&#xff0c;命令连接符用于在同一行执行多个命令&#xff0c;提高效率。然而&#xff0c;攻击者常利用这些符号构造恶意命令&#xff0c;绕过安全检测或执行多阶段攻击。 常见命令连接符…

大屏可视化制作指南

一、大屏可视化概述 &#xff08;一&#xff09;概念 大屏可视化是指通过大屏幕展示复杂数据的视觉呈现形式&#xff0c;它借助图形、图表、地图等元素&#xff0c;将海量数据以直观易懂的方式呈现出来&#xff0c;帮助用户快速理解数据背后的含义和价值。 &#xff08;二&a…

Halcon ——— OCR字符提取与多类型识别技术详解

工业视觉实战&#xff1a;OCR字符提取与多类型识别技术详解 在工业自动化领域&#xff0c;OCR字符提取是产品追溯、质量控制和信息读取的核心技术。本文将深入解析Halcon中OCR字符提取的全流程&#xff0c;重点解释核心算子参数&#xff0c;并提供完整的工业级代码实现。 一、O…

嵌入式项目:基于QT与Hi3861的物联网智能大棚集成控制系统

关键词&#xff1a;MQTT、物联网、QT、网络连接、远程控制 一、系统概述 本系统是一套完整的智能大棚监控解决方案&#xff0c;由两部分构成&#xff1a; 基于Hi3861的嵌入式硬件系统&#xff08;负责环境数据采集和设备控制&#xff09;基于Qt开发的跨平台控制软件&#xf…

揭开 Git 裸仓库的神秘面纱:`git clone --mirror` 详解与使用指南

大家好&#xff01;在使用 Git 进行版本控制时&#xff0c;我们最熟悉的莫过于那些带有工作目录的本地仓库了——我们在里面编辑文件、提交代码&#xff0c;然后推送到远程仓库。但有时候&#xff0c;我们可能会遇到一种特殊的仓库&#xff1a;裸仓库&#xff08;Bare Reposito…

opensuse安装rabbitmq

您好&#xff01;安装 RabbitMQ 消息队列是一个非常棒的选择&#xff0c;它是许多现代应用架构中的核心组件。 在 openSUSE Tumbleweed 上安装 RabbitMQ 主要有两种流行的方式&#xff1a;一种是使用系统的包管理器 zypper&#xff0c;另一种是使用 Docker 容器。我将为您详细…

超详细YOLOv8/11图像菜品分类全程概述:环境、数据准备、训练、验证/预测、onnx部署(c++/python)详解

文章目录 一、环境准备二、数据准备三、训练四、验证与预测五、模型部署 一、环境准备 我的都是在Linux系统下&#xff0c;训练部署的&#xff1b;模型训练之前&#xff0c;需要配置好环境&#xff0c;Anaconda、显卡驱动、cuda、cudnn、pytorch等&#xff1b; 参考&#xff1…

JUC:4.线程常见操作与两阶段终止模式

在线程中&#xff0c;wait()、join()、sleep()三个方法都是进行阻塞的方法。对应可以使用interrupt()方法进行打断&#xff0c;被打断后线程会抛出打断异常&#xff0c;但是不会修改IsInterrupt&#xff0c;也就是此时去调用IsInterrupted()方法后获得的实际上是false。 而当线…

分布式session解决方案

在实际项目中&#xff0c;前台代码部署在nginx中&#xff0c;后台服务内嵌了tomcat运行在不同的节点中&#xff0c;常见的架构如下&#xff1a; 在上述架构中&#xff0c;nginx转发前台请求&#xff0c;第一次登录后&#xff0c;将用户登录信息写入到一台服务session中&#xf…