当前位置: 首页 > article >正文

【JavaWeb学习Day13】

Tlias智能学习系统

需求:

部门管理:查询、新增、修改、删除

员工管理:查询、新增、修改、删除和文件上传

报表统计

登录认证

日志管理

班级、学员管理(实战内容)

部门管理:

01准备工作
开发规范-开发模式

前后端混合开发缺点:分工不明确、不便管理、难以维护

前后端分离开发:当前最为主流的开发模式:前后端分离

开发流程:

开发规范-Restful风格

REST(REpresentational State Transfer),表述性状态转换,它是一种软件架构风格。

注意:

1.REST是风格,是约定方式,约定不是规定,可以打破

2.描述功能模块通常使用复数形式(加s),表示此类资源,而非单个资源。如:users、books...

Apifox

介绍:Apifox是一款集成了Api文档、Api调试、Api Mock、Api测试的一体化协作平台。

作用:接口文档管理、接口请求测试、mock服务。

官网:Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。

工程搭建:

1.创建SpringBoot工程,并引入Web开发起步依赖、mybatis、mysql驱动、lombok。

2.创建数据库表dept,并在application.yml中配置数据库的基本信息。

CREATE TABLE dept (id int unsigned PRIMARY KEY AUTO_INCREMENT COMMENT 'ID, 主键',name varchar(10) NOT NULL UNIQUE COMMENT '部门名称',create_time datetime DEFAULT NULL COMMENT '创建时间',update_time datetime DEFAULT NULL COMMENT '修改时间'
) COMMENT '部门表';
​
INSERT INTO dept VALUES (1,'学工部','2023-09-25 09:47:40','2024-07-25 09:47:40'),(2,'教研部','2023-09-25 09:47:40','2024-08-09 15:17:04'),(3,'咨询部','2023-09-25 09:47:40','2024-07-30 21:26:24'),(4,'就业部','2023-09-25 09:47:40','2024-07-25 09:47:40'),(5,'人事部','2023-09-25 09:47:40','2024-07-25 09:47:40'),(6,'行政部','2023-11-30 20:56:37','2024-07-30 20:56:37');
spring:application:name: tlias-web-management#mysql连接配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/tliasusername: rootpassword: 1234
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.准备基础代码结构,并引入实体类Dept以及统一的响应结果封装类Result。

package com.itheima.pojo;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
import java.time.LocalDateTime;
​
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {private Integer id;private String name;private LocalDateTime createTime;private LocalDateTime updateTime;
}
package com.itheima.pojo;
​
import lombok.Data;
import java.io.Serializable;
​
/*** 后端统一返回结果*/
@Data
public class Result {
​private Integer code; //编码:1成功,0为失败private String msg; //错误信息private Object data; //数据
​public static Result success() {Result result = new Result();result.code = 1;result.msg = "success";return result;}
​public static Result success(Object object) {Result result = new Result();result.data = object;result.code = 1;result.msg = "success";return result;}
​public static Result error(String msg) {Result result = new Result();result.msg = msg;result.code = 0;return result;}
​
}
02查询部门

接口开发:

思路分析:明确了查询部门的需求之后,再来梳理一下实现该功能时,三层架构每一层的职责:

Controller:1.接收请求 2.调用service层 3.响应结果

Service:调用Mapper接口方法

Mapper:Selselect id, name, create_time, update_time from dept order by update_time desc ;(SQL)

代码实现:

1). Controller层

DeptController 中,增加 list 方法,代码如下:

/*** 部门管理控制器*/
@RestController
public class DeptController {
​@Autowiredprivate DeptService deptService;
​/*** 查询部门列表*/@RequestMapping("/depts")public Result list(){List<Dept> deptList = deptService.findAll();return Result.success(deptList);}
}

2). Service层

DeptService 中,增加 findAll方法,代码如下:

public interface DeptService {/*** 查询所有部门*/public List<Dept> findAll();
}

DeptServiceImpl 中,增加 findAll方法,代码如下:

@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;
​public List<Dept> findAll() {return deptMapper.findAll();}
}

3). Mapper层

DeptMapper 中,增加 findAll方法,代码如下:

@Mapper
public interface DeptMapper {/*** 查询所有部门*/@Select("select * from dept")public List<Dept> findAll();}

数据封装:

1.问题:

实体类属性名 和 数据库表查询返回的字段一致,mybatis会自动封装。

如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。

2.解决方案:

手动结果映射:通过@Results以及@Result进行手动结果映射。

package com.itheima.mapper;
​
import com.itheima.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
​
import java.util.List;
​
@Mapper
​
public interface DaotMapper {/***查询所有的部门数据*/@Results({@Result(column = "create_time",property = "createTime"),@Result(column = "update_time",property = "updateTime")})@Select("select id, name, create_time, update_time  from dept order by update_time desc ;")List<Dept> findAll();
}

起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。

public interface DaotMapper {/***查询所有的部门数据*/@Select("select id, name, create_time createTime, update_time updateTime  from dept order by update_time desc ;")List<Dept> findAll();
}
3.开启驼峰(camel)命名:如果字段名和属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。(推荐方式)mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl#开启驼峰命名映射开关map-underscore-to-camel-case: true

前后端联调测试

将资料中提供的前端工程文件夹中的压缩包,拷贝到一个没有中文不带空格的目录下,解压。

启动nginx,访问测试:http://localhost:90

前端工程请求服务器的地址为http://localhost:90/api/depts,是如何访问到后端的tomcat服务器的?

(反向代理是一种网络架构,通过代理服务器为后端的服务器做代理,客户端的请求直接代理服务器,然后转发给后端的服务器。(安全,灵活,负载均衡))

Nginx配置文件:

1.location:用于定义匹配路径的规则。

2.^~ /api/:表示精确匹配,即只匹配以/api/开头的路径。

3.rewrite:该指令用于重写匹配到的路径。

4.proxy_pass:该指令用于代理转发,他将匹配到的请求转发给位于后端的指令服务器。

03删除部门

思路分析:

明确了查询部门的需求之后,再来梳理一下实现该功能时,三层架构每一层的职责:

Controller:1.接收请求参数 2.调用service层 3.响应结果

Service:调用Mapper接口方法

Mapper:delete from dept where id = ?;(SQL)

Controller接收参数:

接收请求参数:DELETE /depts?id=8 (简单参数)

方式一:通过原始的HttpServletRequest对象获取请求参数

/*** 删除部门-方式一:通过原始的HttpServletRequest对象获取请求参数*/
@DeleteMapping("/depts")
public Result delete(HttpServletRequest request){String idStr = request.getParameter("id");int id = Integer.parseInt(idStr);System.out.println("根据ID删除部门:"+id);return Result.success();
​
}

方式二:通过Spring提供的@RequestParam注解,将请求参数绑定给方法形参。

(注意:一旦声明了@RequestParam,该参数在请求时必须传递,如果不传递将会报错,因为默认required为true)

/*** 删除部门-方式二:通过Spring提供的@RequestParam注解,将请求参数绑定给方法形参。*/
@DeleteMapping("/depts")
public Result delete(@RequestParam("id") Integer deptId){System.out.println("根据ID删除部门:"+deptId);return Result.success();
​
}

方式三:如果请求参数与形参变量名相同,直接定义方法形参即可接收(省略@RequestParam)

/*** 删除部门-方式三:如果请求参数与形参变量名相同,直接定义方法形参即可接收(省略@RequestParam)*/
@DeleteMapping("/depts")
public Result delete(Integer id){System.out.println("根据ID删除部门:"+id);return Result.success();
​
}
04新增部门
05修改部门
06日志技术

相关文章:

【JavaWeb学习Day13】

Tlias智能学习系统 需求&#xff1a; 部门管理&#xff1a;查询、新增、修改、删除 员工管理&#xff1a;查询、新增、修改、删除和文件上传 报表统计 登录认证 日志管理 班级、学员管理&#xff08;实战内容&#xff09; 部门管理&#xff1a; 01准备工作 开发规范-…...

springboot使用tomcat浅析

springboot使用tomcat浅析 关于外部tomcat maven pom配置 // 打包时jar包改为war包 <packaging>war</packaging>// 内嵌的tomcat的scope标签影响范围设置为provided&#xff0c;只在编译和测试时有效&#xff0c;打包时不带入 <dependency><groupId>…...

rust 自定义错误(十二)

错误定义&#xff1a; let file_content parse_file("test.txt");if let Err(e) file_content {println!("Error: {:?}", e);}let file_content parse_file2("test.txt");if let Err(e) file_content {match e {ParseFileError::File > …...

如何使用CRM数据分析优化销售和客户关系?

嘿&#xff0c;大家好&#xff01;你有没有想过为什么有些公司在市场上如鱼得水&#xff0c;而另一些却在苦苦挣扎&#xff1f;答案可能就藏在他们的销售策略和客户关系管理&#xff08;CRM&#xff09;系统里。今天我们要聊的就是如何通过有效的 CRM 数据分析来提升你的销售额…...

导出地图为pdf文件

有时我们只是想创建能共享的pdf文件,而不是将地图打印出来,arcpy的ExportToPDF()函数可以实现该功能. 操作方法: 1.在arcmap中打开目标地图 2.导入arcpy.mapping模块 import arcpy.mapping as mapping 3.引用当前活动地图文档,把该引用赋值给变量 mxd mapping.MapDocumen…...

Qt 控件与布局管理

1. Qt 控件的父子继承关系 在 Qt 中&#xff0c;继承自 QWidget 的类&#xff0c;通常会在构造函数中接收一个 parent 参数。 这个参数用于指定当前空间的父控件&#xff0c;从而建立控件间的父子关系。 当一个控件被设置为另一控件的子控件时&#xff0c;它会自动成为该父控…...

电力场效应晶体管(电力 MOSFET),全控型器件

电力场效应晶体管&#xff08;Power MOSFET&#xff09;属于全控型器件是一种电压触发的电力电子器件&#xff0c;一种载流子导电&#xff08;单极性器件&#xff09;一个器件是由一个个小的mosfet组成以下是相关介绍&#xff1a; 工作原理&#xff08;栅极电压控制漏极电流&a…...

一文讲解Java中的重载、重写及里氏替换原则

提到重载和重写&#xff0c;Java小白应该都不陌生&#xff0c;接下来就通过这篇文章来一起回顾复习下吧&#xff01; 重载和重写有什么区别呢&#xff1f; 如果一个类有多个名字相同但参数不同的方法&#xff0c;我们通常称这些方法为方法重载Overload。如果方法的功能是一样…...

StarRocks常用命令

目录 1、StarRocks 集群管理&配置命令 2、StarRocks 常用操作命令 3、StarRocks 数据导入和导出 1、StarRocks 集群管理&配置命令 查询 FE 节点信息 SHOW frontends; SHOW PROC /frontends; mysql -h192.168.1.250 -P9030 -uroot -p -e "SHOW PROC /dbs;"…...

Pandas基础02(DataFrame创建/索引/切片/属性/方法/层次化索引)

DataFrame数据结构 DataFrame 是一个二维表格的数据结构&#xff0c;类似于数据库中的表格或 Excel 工作表。它由多个 Series 组成&#xff0c;每个 Series 共享相同的索引。DataFrame 可以看作是具有列名和行索引的二维数组。设计初衷是将Series的使用场景从一维拓展到多维。…...

Meta-CoT:通过元链式思考增强大型语言模型的推理能力

大型语言模型&#xff08;LLMs&#xff09;在处理复杂推理任务时面临挑战&#xff0c;这突显了其在模拟人类认知中的不足。尽管 LLMs 擅长生成连贯文本和解决简单问题&#xff0c;但在需要逻辑推理、迭代方法和结果验证的复杂任务&#xff08;如高级数学问题和抽象问题解决&…...

【时时三省】(C语言基础)二进制输入输出

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 二进制输入 用fread可以读取fwrite输入的内容 字符串以文本的形式写进去的时候&#xff0c;和以二进制写进去的内容是一样的 整数和浮点型以二进制写进去是不一样的 二进制输出 fwrite 字…...

【go语言】数组和切片

一、数组 1.1 什么是数组 数组是一组数&#xff1a;数组需要是相同类型的数据的集合&#xff1b;数组是需要定义大小的&#xff1b;数组一旦定义了大小是不可以改变的。 1.2 数组的声明 数组和其他变量定义没有什么区别&#xff0c;唯一的就是这个是一组数&#xff0c;需要给…...

10.片元

**片元&#xff08;Fragment&#xff09;**是渲染管线中的一个重要概念&#xff0c;可以理解为“潜在的像素”。用通俗易懂的方式来解释&#xff1a; 通俗解释&#xff1a;片元就像候选的颜料点 想象你是一个画家&#xff0c;正在画一幅画&#xff1a; 片元是候选的颜料点&…...

SQL-leetcode—1179. 重新格式化部门表

1179. 重新格式化部门表 表 Department&#xff1a; ---------------------- | Column Name | Type | ---------------------- | id | int | | revenue | int | | month | varchar | ---------------------- 在 SQL 中&#xff0c;(id, month) 是表的联合主键。 这个表格有关…...

k8s简介,k8s环境搭建

目录 K8s简介环境搭建和准备工作修改主机名&#xff08;所有节点&#xff09;配置静态IP&#xff08;所有节点&#xff09;关闭防火墙和seLinux&#xff0c;清除iptables规则&#xff08;所有节点&#xff09;关闭交换分区&#xff08;所有节点&#xff09;修改/etc/hosts文件&…...

Docker常用知识点问题

1.dockerfile基础命令及作用 —copy和add区别 —为什么要指定workdir —expose作用&#xff0c;能不能不用&#xff0c;不用会导致什么情况&#xff1f; —env&#xff0c;不用怎么打镜像 —from 2.dockerfile编写规范 —jdk版本 —依赖问题 —shell指令引用 —字体和时区配置 …...

基于微信小程序的网上订餐管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

Java使用FFM API调用SDL

首发于Enaium的个人博客 首先我们需要创建一个Gradle项目&#xff0c;之后设置项目的JDK版本&#xff0c;设置为22及以上版本。 plugins {kotlin("jvm") version "2.1.0" }group "cn.enaium" version "1.0-SNAPSHOT"repositories {…...

java入门基础笔记语法篇(3)

一、 注释 什么是注释 注释定义&#xff1a;注释是写在程序中对代码进行解释说明的文字&#xff0c;方便自己和他人查看以理解程序。 Java注释的三种写法&#xff1a; 单行注释&#xff1a;以“//”开头&#xff0c;注释内容只能写一行。多行注释&#xff1a;以“/*”开头&…...

【数据结构】深入解析:构建父子节点树形数据结构并返回前端

树形数据结构列表 一、前言二、测试数据生成三、树形代码3.1、获取根节点3.2、遍历根节点&#xff0c;递归获取所有子节点3.3、排序3.4、完整代码 一、前言 返回前端VO对象中&#xff0c;有列情况列表展示需要带树形结构&#xff0c;例如基于RBAC权限模型中的菜单返回&#xf…...

JAVA 使用反射比较对象属性的变化,记录修改日志。使用注解【策略模式】,来进行不同属性枚举值到中英文描述的切换,支持前端国际化。

1.首先定义一个接口&#xff0c;接口中有两个方法&#xff0c;分别是将属性转换成英文描述和中文描述。 其实就是将数据库中记录的 0 1 &#xff0c;转换成后面的描述 这边定义了中文转换为默认方法&#xff0c;是因为有些属性不需要进行中文转换&#xff0c;或者该属性的枚举…...

第27章 测试驱动开发模式:深入测试技术

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

基于模糊PID的孵化箱温度控制系统(论文+源码)

1系统方案设计 本课题为基于模糊PID的孵化箱温度控制系统&#xff0c;其以STM32最小系统与模糊PID控制器为控制核心。系统主要包括数据采集模块、处理器模块、电机控制模块。 数据采集模块由温度传感器构成&#xff0c;通过温度传感器感应温度变化&#xff0c;获得待处理的数据…...

机器学习-数据集划分

文章目录 一. 为什么要划分数据集二. 数据集划分的方法1. 留出法&#xff1a;2. 交叉验证&#xff1a;将数据集划分为训练集&#xff0c;验证集&#xff0c;测试集3. 留一法&#xff1a;4. 自助法&#xff1a; 一. 为什么要划分数据集 为了能够评估模型的泛化能力&#xff0c;可…...

C++ 可变函数和参数

写一个函数&#xff0c;函数的参数是函数对象及参数&#xff0c;功能和thread类的构造函数相同。 代码示例&#xff1a; #include <iostream>#include <thread>#include <functional> using namespace std;void show0() { // 普通函数。cout <&…...

Hive之加载csv格式数据到hive

场景&#xff1a; 今天接了一个需求&#xff0c;将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移&#xff0c;只需要迁移ads表 解决方案&#xff1a; 拿到这个需求首先想到两个方案&#xff1a; 1、将数据通过insert into语句导出&#xff0c;然后运行脚本 …...

C# OpenCV机器视觉:利用CNN实现快速模板匹配

在一个阳光灿烂的周末&#xff0c;阿强正瘫在沙发上&#xff0c;百无聊赖地换着电视频道。突然&#xff0c;一则新闻吸引了他的注意&#xff1a;某博物馆里一幅珍贵的古画离奇失踪&#xff0c;警方怀疑是被一伙狡猾的盗贼偷走了&#xff0c;现场只留下一些模糊不清的监控画面&a…...

【MCAL实战】MCU模块配置实践

目录 前言 正文 1.硬件分析 1.1 MCU系统模式分析 1.2MCU晶振使用分析 2.MCU通用配置 2.1 McuGeneralConfiguration 2.2 McuModuleConfiguration 2.3 McuResetSettingConf 2.4 McuTrapSettingConf 2.4 其他 3.MCU模式配置 3.1 McuModeSettingConf_0 3.2 McuModeSe…...

Vue3笔记——(三)hooks、路由

015 hooks 作用&#xff1a;使得代码更加模块化和可维护 Person.vue <template><div><h2>当前求和{{ sum }}</h2><button click"addFn">点我sum1</button></div> </template> <script setup lang"ts"…...