SpringBootWeb案例 Part 4
3. 修改员工
需求:修改员工信息
在进行修改员工信息的时候,我们首先先要根据员工的ID查询员工的信息用于页面回显展示,然后用户修改员工数据之后,点击保存按钮,就可以将修改的数据提交到服务端,保存到数据库。 具体操作为:
-
根据记录的ID进行查询用于页面回显展示员工信息{查询回显}
-
保存修改的员工信息提交到服务端,保存到数据库{更新数据库表当中的数据}
3.1 查询回显
3.1.1 接口文档
- 基本信息
- 请求参数
参数格式:路径参数
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | 员工ID |
请求参数样例:
响应数据
参数格式:application/json
参数说明:
名称 | 类型 | 是否必须 | 默认值 | 备注 |
---|---|---|---|---|
code | number | 必须 | 响应码, 1 成功 , 0 失败 | |
msg | string | 非必须 | 提示信息 | |
data | object | 必须 | 返回的数据 | |
|- id | number | 非必须 | id | |
|- username | string | 非必须 | 用户名 | |
|- name | string | 非必须 | 姓名 | |
|- password | string | 非必须 | 密码 | |
|- entrydate | string | 非必须 | 入职日期 | |
|- gender | number | 非必须 | 性别 , 1 男 ; 2 女 | |
|- image | string | 非必须 | 图像 | |
|- job | number | 非必须 | 职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师 | |
|- deptId | number | 非必须 | 部门id | |
|- createTime | string | 非必须 | 创建时间 | |
|- updateTime | string | 非必须 | 更新时间 |
响应数据样例:
3.1.2 实现思路
-
通过@PathVariable注解接收请求路径中的路径参数!
3.1.3 代码实现
EmpController
package com.gch.controller;import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;
import com.gch.pojo.Result;
import com.gch.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDate;
import java.util.List;/**员工管理控制器*/
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {@Autowiredprivate EmpService empService;/*** 条件分页查询* @param page 分页查询的页码* @param pageSize 分页查询的每页展示记录数* @param name 姓名* @param gender 性别* @param begin 入职日期的开始时间* @param end 入职日期的结束时间* 默认值的设置可以通过注解@RequestParam中的defaultValue()属性来指定默认值* 用@DateTimeFormat注解中的pattern属性指定日期时间类型的格式* 注意:方法签名上的形参变量名需要于接口文档中的请求参数名保持一致* @return*/@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
// 设置默认值,但写法比较繁琐
// if(page == null) {page = 1;}
// if(pageSize == null) {pageSize = 10;}// 记录日志log.info("条件分页查询,参数:page:{},pageSize:{},name:{},gender:{},begin:{},end:{}",page,pageSize,name,gender,begin,end);// 调用service分页查询PageBean pageBean = empService.page(page,pageSize,name,gender,begin,end);// 响应return Result.success(pageBean);}/*** 批量删除员工信息* @param ids 接收前端传递过来的路径参数id数组* @return*/@DeleteMapping("/{ids}")public Result delete(@PathVariable List<Integer> ids) {// 记录日志log.info("批量删除员工,ids:{}",ids);// 调用service批量删除empService.delete(ids);// 响应return Result.success();}/*** 新增员工* @param emp 员工对象* 在Controller中使用@RequestBody注解接收前端传递的JSON格式的数据并填充到实体类中* @return 返回统一响应结果*/@PostMappingpublic Result save(@RequestBody Emp emp) {// 记录日志log.info("新增员工 , emp:{}",emp);// 调用service添加员工empService.save(emp);// 响应return Result.success();}/*** 根据主键ID进行员工信息查询* @param id 主键ID* @return 响应统一结果* 在Controller中通过@PathVariable注解接收请求路径中的路径参数*/@GetMapping("/{id}")public Result getById(@PathVariable Integer id) {// 1.记录日志log.info("根据id查询员工信息,id:{}",id);// 2.调用service查询Emp emp = empService.selectById(id);// 3.响应return Result.success(emp);}
}
EmpService
package com.gch.service;import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;import java.time.LocalDate;
import java.util.List;/**员工业务规则*/
public interface EmpService {/*** 条件分页查询* @param page => 分页查询的页码* @param pageSize => 分页查询的每页展示记录数* @param name => 姓名* @param gender => 性别* @param begin => 入职日期的开始时间* @param end => 入职日期的结束时间* @return*/PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工信息操作* @param ids 前端传递过来的路径参数id集合*/void delete(List<Integer> ids);/*** 添加员工* @param emp 员工对象*/void save(Emp emp);/*** 根据主键ID查询员工* @param id 主键ID* @return 返回员工对象*/Emp selectById(Integer id);
}
EmpServiceImpl
package com.gch.service.impl;import com.gch.mapper.EmpMapper;
import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;
import com.gch.service.EmpService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;/**员工业务实现类*/
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;/*** 原始分页查询* @param page => 分页查询的页码* @param pageSize => 分页查询的每页展示记录数* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1.获取总记录数
// Long total = empMapper.count();
//
// // 2.获取分页查询的数据列表
// List<Emp> rows = empMapper.pageSelect((page - 1) * pageSize,pageSize);
//
// // 3.封装PageBean对象
// return new PageBean(total,rows);
// }/*** 基于PageHelper分页插件实现分页查询* @param page => 分页查询的页码* @param pageSize => 分页查询的每页展示记录数* @param name => 姓名* @param gender => 性别* @param begin => 入职日期的开始时间* @param end => 入职日期的结束时间* @return*/@Overridepublic PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end){// 1.设置分页参数PageHelper.startPage(page,pageSize);// 2.执行条件分页查询List<Emp> empList = empMapper.list(name,gender,begin,end);// 获取条件分页查询结果Page<Emp> p = (Page<Emp>)empList;// 3.封装PageBean对象并返回return new PageBean(p.getTotal(),p.getResult());}/*** 批量删除员工信息* @param ids 前端传递过来的路径参数id集合*/@Overridepublic void delete(List<Integer> ids) {empMapper.deleteById(ids);}/*** 添加员工* @param emp 员工对象*/@Overridepublic void save(Emp emp) {// 1.补全员工数据 / 属性emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());// 2.调用mapper层新增员工方法empMapper.add(emp);}/*** 根据主键ID进行员工查询* @param id 主键ID* @return 返回员工对象*/@Overridepublic Emp selectById(Integer id) {return empMapper.selectById(id);}
}
package com.gch.mapper;import com.gch.pojo.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.time.LocalDate;
import java.util.List;/**员工管理*/
@Mapper
public interface EmpMapper {/*** 查询总记录数* @return*/
// @Select("select count(*) from tlias.emp")
// public Long count();/*** 分页查询,获取数据列表/获取列表数据* @param startIndex => 起始索引* @param pageSize => 每页展示记录数* @return*/
// @Select("select * from tlias.emp limit #{startIndex},#{pageSize}")
// public List<Emp> pageSelect(Integer startIndex,Integer pageSize);/*** 基于PageHelper进行员工信息条件分页查询* 查询条件参数:* @param name => 姓名* @param gender => 性别* @param begin => 入职日期的开始时间* @param end => 入职日期的结束时间* @return*/public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工信息* @param ids 前端传递过来的路径参数id集合*/void deleteById(List<Integer> ids);/*** 新增/插入员工* @param emp 员工对象*/@Insert("insert into tlias.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +"values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")void add(Emp emp);/*** 根据主键ID进行员工信息查询* @param id 主键ID* @return 返回员工对象*/@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from tlias.emp where id = #{id}")Emp selectById(Integer id);
}
3.1.4 启动项目,Postman测试
3.1.5 前后端联调 - 查询回显
3.2 修改员工
当数据查询回显之后,就可以在表单当中展示出原来的数据,接下来就可以在原来数据的基础上来修改员工的基本信息。
当用户修改完数据之后,点击保存按钮,就需要将数据提交到服务端,然后服务端需要将修改后的数据更新到数据库中。
3.2.1 接口文档
-
基本信息
- 请求参数
参数格式:application/json
参数说明:
名称 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | id |
username | string | 必须 | 用户名 |
name | string | 必须 | 姓名 |
gender | number | 必须 | 性别, 说明: 1 男, 2 女 |
image | string | 非必须 | 图像 |
deptId | number | 非必须 | 部门id |
entrydate | string | 非必须 | 入职日期 |
job | number | 非必须 | 职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师 |
请求数据样例:
- 思考:更新员工数据的时候是根据主键ID来进行更新的,因为更新的时候除了主键ID不能变,其它都有可能发生变化。
- 响应数据
参数格式:application/json
参数说明:
响应数据样例:
3.2.2 实现思路
SQL语句:
-- update语法:update 表名 set 字段名1 = 值1, 字段名2 = 值2,...[where 条件];
-- 更新员工
update emp
set username = '',password = '',name = ',',gender = ?,image = '',job = ?,entrydate = ?,dept_id = ?,update_time = ?
where id = ?;
3.2.3 代码实现
- EmpController
package com.gch.controller;import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;
import com.gch.pojo.Result;
import com.gch.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDate;
import java.util.List;/**员工管理控制器*/
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {@Autowiredprivate EmpService empService;/*** 修改员工* @param emp 员工对象* @return 响应* 在Controller中通过@RequestBody注解接收前端传递过来的JSON格式的数据并填充到实体类中*/@PutMappingpublic Result updateById(@RequestBody Emp emp) {// 1.记录日志log.info("修改员工,emp:{}",emp);// 2.调用service修改员工empService.update(emp);// 3.响应return Result.success();}
}
- EmpService
package com.gch.service;import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;import java.time.LocalDate;
import java.util.List;/**员工业务规则*/
public interface EmpService {/*** 修改员工* @param emp*/void update(Emp emp);
}
- EmpServiceImpl
package com.gch.service.impl;import com.gch.mapper.EmpMapper;
import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;
import com.gch.service.EmpService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;/**员工业务实现类*/
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;/*** 修改员工* @param emp 员工对象*/@Overridepublic void update(Emp emp) {// 1.补全员工属性emp.setUpdateTime(LocalDateTime.now());// 2.调用mapper层修改员工empMapper.updateById(emp);}
}
- EmpMapper
package com.gch.mapper;import com.gch.pojo.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import java.time.LocalDate;
import java.util.List;/**员工管理*/
@Mapper
public interface EmpMapper {/*** 修改员工* @param emp 员工对象*/void updateById(Emp emp);
}
- EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gch.mapper.EmpMapper"><!-- 动态更新员工信息 SQL语句中的id需要与mapper接口方法名保持一致--><update id="updateById">update emp<set><if test="username != null and username != ''">username = #{username},</if><if test="password != null and password != ''">password = #{password},</if><if test="name != null and name != ''">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null and image != ''">image= #{image},</if><if test="job != null">job = #{job},</if>><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id = #{id}</update>
</mapper>
注意:动态更新员工信息 SQL语句中的id需要与mapper接口方法名保持一致!
3.2.4 Postman测试
3.2.5 前后端联调测试
掌握基于页面原型和接口文档来开发功能接口的能力。
相关文章:

SpringBootWeb案例 Part 4
3. 修改员工 需求:修改员工信息 在进行修改员工信息的时候,我们首先先要根据员工的ID查询员工的信息用于页面回显展示,然后用户修改员工数据之后,点击保存按钮,就可以将修改的数据提交到服务端,保存到数据…...

什么是ChatGPT水印,ChatGPT生成的内容如何不被检测出来,原理什么?
太长不看版 1. 什么是ChatGPT水印? ChatGPT水印是AI以伪随机方式生成的独特tokens序列。该序列用来作为水印,以区分AI生成内容和人类原创内容。 2. 如何规避ChatGPT水印? 一种规避方法是使用其他AI模型改写ChatGPT生成的文本。这会破坏水…...

Android 6.0 Settings中添加虚拟键开关
添加系统默认键值 b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml-212,4 212,7 <!-- Default for Settings.Secure.NFC_PAYMENT_COMPONENT --><string name"def_nfc_payment_component"></string><!--mh.modify 2019060…...

Yolov8小目标检测(12):动态稀疏注意力BiFormer | CVPR 2023
💡💡💡本文改进:动态稀疏注意力,cvpr2023。 BiFormer | 亲测在红外弱小目标检测涨点,map@0.5 从0.755提升至0.758 💡💡💡Yolo小目标检测,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,带你轻松实现小…...

C# VS调试技巧
一.按照条件调试步骤 ①在需要代码执行的行打断点 ②触发此断点,让代码执行到此处 ③鼠标滑至在断点处,点击设置 ④设置断点条件,如下图所示 二、多线程调试技巧 ①在需要代码执行的行打断点 ②触发此断点,让代码执行到此处…...

VS的调试技巧
Visual Studiohttps://visualstudio.microsoft.com/zh-hans/vs/ 目录 1、什么是调试? 2、debug和release 3、调试 3.1、环境 3.2、 快捷键 3.2.1、F10和F11 3.2.2、ctrlF5 3.2.3、F5与F9 3.2.3.1、条件断点 3.3、监视和内存观察 3.3.1、监视 3.3.2、内存 …...

lucene国内镜像 极速下载
文章目录 国内镜像汇总-极速下载【JavaPub版】 lucene国内镜像 https://mirrors.cloud.tencent.com/apache/lucene/ 国内镜像汇总-极速下载【JavaPub版】...

Qt 信号槽连接方式
使用示例: QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()), Qt::AutoConnection); 目录 连接方式 一、AutoConnection 二、DirectConnection 三、QueuedConnection 四、BlockingQueuedConnection 五、UniqueConnection 总结 连接方式 "q…...

(线程池) 100行以内的简单线程池
文章目录 前言CodeThreadPool.hppmain.cpp 简单讲解所需头文件using成员变量构造析构添加任务PS测试效果 END 前言 线程池_百度百科 (baidu.com) 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都…...

Mysql按姓氏从小到大排序的正确sql
一、前言 最近有个需求,要按姓氏从小到大查询数据。(姓名都是中文的) 写了一个sql: select a.* from mytable a order by substr(a.NAME,1,1) asc结果发现这样不行,排序是乱的。 二、解决办法 查询发现,如果mysql字符集是gbk的…...

【C++】详细介绍模版初阶—函数模版、类模板
文章目录 一、泛型编程二、函数模版2.1 函数模版概念2.2 函数模版格式2.3 函数模版的原理2.4 函数模版的实例化2.5 函数模版的匹配原则 三、类模版3.1 类模版定义3.2 类模版实例化 总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)ノ&…...

BananaPi BPI-6202工业控制板全志科技A40i、24V DC输入、RS485接口
Banana Pi BPI-6202“嵌入式单板计算机”采用工业级全志A40i四核Cortex-A7处理器,工业温度范围和长生命周期,2GB DDR3,8GB eMMC闪存,M.2 SATA插槽等。 这是自 Banana Pi去年推出Banana Pi BPI-M2 Ultra SBC 和BPI-M2 Berry以来&am…...

Python - functools.partial设置回调函数处理异步任务基本使用
一. 前言 在Python中,回调函数是指在一个函数执行完成后,调用另一个函数的过程。通常情况下,回调函数作为参数传递给原始函数,原始函数在执行完自己的逻辑后,会自动调用回调函数并将结果作为参数传递给它。 二. 回调…...

phpspreadsheet导出excel自动获得列,数字下标
安装composer require phpoffice/phpspreadsheetuse PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Style\Border;$spreadsheet new Spreadsheet(); $sheet $spreadsheet->getActiveSheet();//从65开&a…...

结算日-洛谷
结算日 - 洛谷 解释: 1.用sum记录贝西走到某位置的累计的总钱,flag标记是否有欠债还不了的情况(1为有),ans记录步数。 2.若sum<0,则欠债无法还,flag标记为1,并记录下此刻的位置…...

Android Native Code开发学习(一)环境配置
Android Native Code开发学习(一) 本教程为native code学习笔记,希望能够帮到有需要的人 我的电脑系统为ubuntu 22.04,当然windows也是可以的,区别不大 环境配置 首先我们新建一个native C项目 然后我们下载NDK和C…...

Python GUI应用程序开发之wxPython使用详解
概要 wxPython是一个强大的跨平台GUI工具包,它使用Python编程语言开发,提供了丰富的控件功能。如果你是一名Python开发者,而且希望创建一个功能齐全的桌面应用程序,那么wxPython是一个值得考虑的选择。 什么是wxPython wxPython…...

【电子学会真题】青少年软件编程(C语言)等级考试试卷(一级) 2021年9月
试卷下载 pdf 格式下载:https://download.csdn.net/download/SHUTIAN2010/88255543 word 格式下载:https://download.csdn.net/download/SHUTIAN2010/88255558 1.计算乘积 一行两个整数a、b,以空格分隔。(0࿱…...

学习完毕JavaSE的感想
今天,把Java复习完毕了,之前学习的时候,学校里学的总是有限的 ,自己上手操作之后才发觉差的很多,部署服务器发现要学操作系统,学完了web基础 ,又发现还得学前后端分离vue react这些,…...

FastJson的学习
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。 fastjson是json的序列化和反序列化 一、添加依赖 <dependency><groupId>com.ali…...

python scrapy框架
scrapy概述 Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试 scrapy安装 pip install scrapy -i https://pypi.tuna.tsinghua…...

滑动窗口系列3-Leetcode134题加油站
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 gas 和 cost &…...

LOIC(low orbit ion cannon)
前言 重要的话说三遍: 该程序仅用于学习用途,请勿用于非法行为上!!! 该程序仅用于学习用途,请勿用于非法行为上!!! 该程序仅用于学习用途,请勿用于非法行为上…...

从格灵深瞳中报稳定盈利,看AI公司的核心竞争力
2023年过半,人工智能产业话题不断。大模型和AIGC掀起热潮,让众多AI公司开始进入新一轮竞赛。但与此同时,不少AI公司依然处于亏损中,研发投入和商业产出难以实现正循环。如何形成健康的商业模式,仍是一大挑战。 AI公司…...

理解 Databend Cluster key 原理及使用
Databend Cluster Key 是指 Databend 可以按声明的 key 排序存储,主要用于用户对时间响应比较高,同时愿意为这个 cluster key 进行额排序操作的用户。 Databend 只支持一个 Cluster key,Cluster key中可以包含多列及表达式。 基本语法 -- 语…...

C++day3(类、this指针、类中的特殊成员函数)
一、Xmind整理: 二、上课笔记整理: 1.类的应用实例 #include <iostream> using namespace std;class Person { private:string name; public:int age;int high;void set_name(string n); //在类内声明函数void show(){cout << "na…...

Qt中的配置文件:实现个性化应用程序配置与保存加载
一、前言 在现代软件开发中,用户对于应用程序的个性化配置和设置变得越来越重要。为了满足用户需求并提供更好的用户体验,开发人员常常需要实现一种机制,以便在每次启动应用程序时能够记住用户上次的配置。这样用户就可以方便地恢复到他们熟悉的环境,无需重新进行所有设置…...

Navicat激活时出现rsa public key not find错误
Navicat激活时出现rsa public key not find错误 在激活时,先不打开应用,先用管理员身份打开注册机Navicat_Keygen_Patch_v5.6_By_DFoX.exe,Navicat v15——>MySql——>Simplified Chinese——>Patch,执行完这些步骤之后…...

FFmpeg5.0源码阅读——URLContext和URLProtocol
摘要:本文描述FFmpeg中URLContext和URLProtocal的实现。 关键字:URLContext、URLProtocal FFmpeg中URLProtocol是具体的协议的抽象,其中定义了对应协议的抽象,其中包含了具体协议的操作函数指针。而URLContext是对协议操作的抽…...

Qt的输出
目录 基本分类 C风格输出 C风格 可以抑制输出 方法一 方法二 在Qt中进行log输出, 一般不使用c中的printf, 也不是使用C中的cout, Qt框架提供了专门用于日志输出的类, 头文件名为 QDebug。 基本分类 qDebug:调试信息提示 qInfo :输出信息 qWarnin…...