目录
数据库设计流程
三张表
测试
接口设计
部门管理接口文档
1. 查询所有部门
2. 新增部门
⭕3. 根据ID查询部门
4. 修改部门
5. 删除部门
(部门分页条件查询)
错误响应示例
接口设计规范
服务端开发
接口开发
数据库设计流程
- 01 明确业务需求
-
- 依据:页面原型+需求文档
- 目标:确定数据主体/表
- 02 确定数据关联
-
- 关联类型:一对一、一对多、多对多
- 03 确定字段详情
-
- 包括字段、类型、约束
- 04 构建表结构
-
- 目标:建库建表
表结构 参考:
三张表
- 部门表
- 员工表
- 员工详细信息表
- dept(部门表)
-
- 字段:部门 ID、名称、创建/更新时间
- 数据示例:学工部、教研部、咨询部等
- emp(员工表)
-
- 字段:员工 ID、账号、密码、姓名、性别、手机号、职位、薪资等
- 职位类型:班主任、讲师、学生管理员、教研管理员、咨询师
- emp_expr(员工履历表)
-
- 字段:履历 ID、员工 ID、起止时间、公司名称、职位
建表
CREATE DATABASE `klxf`;
USE `klxf`;CREATE TABLE `dept` (`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID, 主键',`name` varchar(10) NOT NULL COMMENT '部门名称',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='部门表';CREATE TABLE `emp` (`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID,主键',`username` varchar(20) NOT NULL COMMENT '用户名',`password` varchar(50) DEFAULT '123456' COMMENT '密码',`name` varchar(10) NOT NULL COMMENT '姓名',`gender` tinyint unsigned NOT NULL COMMENT '性别, 1:男, 2:女',`phone` char(11) NOT NULL COMMENT '手机号码',`job` tinyint unsigned DEFAULT NULL COMMENT '职位, 1 班主任, 2 讲师 , 3 学工主管, 4 教研主管, 5 辅导员',`salary` int unsigned DEFAULT NULL COMMENT '薪资',`image` varchar(300) DEFAULT NULL COMMENT '头像',`entry_date` date DEFAULT NULL COMMENT '入职日期',`dept_id` int unsigned DEFAULT NULL COMMENT '部门ID',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`),UNIQUE KEY `phone` (`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工表';CREATE TABLE `emp_expr` (`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID, 主键',`emp_id` int unsigned DEFAULT NULL COMMENT '员工ID',`begin` date DEFAULT NULL COMMENT '开始时间',`end` date DEFAULT NULL COMMENT '结束时间',`company` varchar(50) DEFAULT NULL COMMENT '公司名称',`job` varchar(50) DEFAULT NULL COMMENT '职位',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='工作经历';
借助 AI 生成测试数据:
INSERT INTO `dept` (`name`, `create_time`, `update_time`) VALUES
('教务处', NOW(), NOW()),
('财务部', NOW(), NOW()),
('招生办', NOW(), NOW()),
('后勤部', NOW(), NOW()),
('技术部', NOW(), NOW()),
('市场部', NOW(), NOW()),
('研发中心', NOW(), NOW()),
('国际部', NOW(), NOW()),
('培训部', NOW(), NOW()),
('质量部', NOW(), NOW()),
('法务部', NOW(), NOW()),
('公关部', NOW(), NOW()),
('审计部', NOW(), NOW()),
('战略部', NOW(), NOW()),
('校友会', NOW(), NOW());INSERT INTO `emp` (`username`, `password`, `name`, `gender`, `phone`, `job`, `salary`, `entry_date`, `dept_id`, `create_time`, `update_time`) VALUES
('zhangsan', '123456', '张三', 1, '13800138001', 2, 15000, '2020-03-15', 1, NOW(), NOW()),
('lisi', '123456', '李思', 2, '13900239002', 1, 8000, '2021-06-20', 2, NOW(), NOW()),
('wangwu', '123456', '王武', 1, '13600336003', 3, 12000, '2019-11-05', 3, NOW(), NOW()),
('zhaoliu', '123456', '赵柳', 2, '13500445004', 4, 18000, '2022-08-12', 4, NOW(), NOW()),
('sunqi', '123456', '孙琦', 1, '13700557005', 5, 9500, '2023-01-30', 5, NOW(), NOW()),
('zhouba', '123456', '周巴', 1, '13300663006', 2, 16000, '2020-09-18', 6, NOW(), NOW()),
('wujiu', '123456', '吴玖', 2, '13200772007', 1, 8500, '2021-04-22', 7, NOW(), NOW()),
('zhengshi', '123456', '郑石', 1, '13100881008', 3, 13000, '2018-07-14', 8, NOW(), NOW()),
('fengshisan', '123456', '冯十三', 2, '15900999009', 4, 20000, '2022-05-09', 9, NOW(), NOW()),
('cheneryi', '123456', '陈二一', 1, '15801010010', 5, 10000, '2023-03-01', 10, NOW(), NOW()),
('huxiaoxiao', '123456', '胡笑笑', 2, '15701111011', 2, 14500, '2020-12-25', 11, NOW(), NOW()),
('linmengmeng', '123456', '林萌萌', 2, '15601212012', 1, 7800, '2021-08-07', 12, NOW(), NOW()),
('maweiwei', '123456', '马威威', 1, '15501313013', 3, 12500, '2019-02-28', 13, NOW(), NOW()),
('huangdaye', '123456', '黄大业', 1, '15301414014', 4, 19000, '2022-10-11', 14, NOW(), NOW()),
('caoxiaoyu', '123456', '曹小雨', 2, '15201515015', 5, 8800, '2023-06-19', 15, NOW(), NOW());INSERT INTO `emp_expr` (`emp_id`, `begin`, `end`, `company`, `job`) VALUES
(1, '2018-03-01', '2020-02-28', '腾讯科技', 'Java开发工程师'),
(2, '2019-05-10', '2021-04-15', '阿里巴巴', '班主任'),
(3, '2017-08-20', '2019-07-25', '字节跳动', '学生管理专员'),
(4, '2020-11-01', '2022-10-31', '华为技术', '教研主管'),
(5, '2021-02-14', '2023-01-30', '百度网络', '辅导员'),
(6, '2016-09-05', '2018-08-10', '京东集团', '前端讲师'),
(7, '2020-07-22', '2022-06-18', '美团点评', '班主任'),
(8, '2018-04-12', '2020-03-20', '滴滴出行', '学工主管'),
(9, '2019-10-05', '2021-09-15', '小米科技', '教研总监'),
(10, '2022-01-08', '2023-12-01', '拼多多', '职业规划师'),
(11, '2017-12-15', '2019-11-30', '网易云音乐', '全栈讲师'),
(12, '2021-03-10', '2023-02-28', '携程旅行', '班主任'),
(13, '2019-06-20', '2021-05-25', '新浪微博', '学生事务经理'),
(14, '2020-08-01', '2022-07-31', '快手科技', '课程研发主管'),
(15, '2022-04-18', '2024-03-15', 'B站', '心理咨询师');
测试
datagrip
测试表结构
测试数据
接口设计
(AI 辅助)
根据部门管理需求及 RESTful 设计规范编写,以部门管理的接口文档为例
部门管理接口文档
1. 查询所有部门
基本信息
请求路径:/depts
请求方式:GET
接口描述:获取所有部门列表(按最后更新时间倒序排列)
请求参数
无
响应数据
{"code": 1,"msg": "success","data": [{"id": 1,"name": "学工部","createTime": "2023-09-25T09:47:40","updateTime": "2024-08-24T16:54:35"},{"id": 2,"name": "教研部","createTime": "2023-09-25T09:47:40","updateTime": "2024-08-09T15:17:04"}]
}
2. 新增部门
- 基本信息
请求路径:/depts
请求方式:POST
接口描述:创建新部门
请求参数(JSON Body)
参数名 | 类型 | 是否必须 | 示例 | 备注 |
name | string | 是 | 招生办 | 部门名称(2-10位) |
请求示例
{"name": "招生办"
}
响应数据
{"code": 1,"msg": "success","data": null
}
⭕3. 根据ID查询部门
- 基本信息
请求路径:/depts/{id}
请求方式:GET
接口描述:通过部门ID获取详细信息
请求参数(路径参数)
参数名 | 类型 | 是否必须 | 示例 | 备注 |
id | int | 是 | 1 | 部门ID |
请求示例
GET /depts/1
响应数据
{"code": 1,"msg": "success","data": {"id": 1,"name": "学工部","createTime": "2023-09-25T09:47:40","updateTime": "2024-08-24T16:54:35"}
}
4. 修改部门
基本信息
请求路径:/depts
请求方式:PUT
接口描述:更新部门信息
请求参数(JSON Body)
参数名 | 类型 | 是否必须 | 示例 | 备注 |
id | int | 是 | 1 | 部门ID |
name | string | 是 | 学生工作部 | 部门名称(2-10位) |
请求示例
{"id": 1,"name": "学生工作部"
}
响应数据
{"code": 1,"msg": "success","data": null
}
5. 删除部门
基本信息
请求路径:/depts/{id}
请求方式:DELETE
接口描述:根据ID删除部门
请求参数(路径参数)
参数名 | 类型 | 是否必须 | 示例 | 备注 |
id | int | 是 | 3 | 部门ID(关联员工时不可删除) |
请求示例
DELETE /depts/3
响应数据
{"code": 1,"msg": "success","data": null
}
(部门分页条件查询)
基本信息
请求路径:/depts
请求方式:GET
接口描述:根据名称模糊查询部门并分页
请求参数
参数名 | 类型 | 是否必须 | 示例 | 备注 |
name | string | 否 | 教研 | 部门名称模糊查询 |
page | int | 是 | 1 | 页码(默认1) |
pageSize | int | 是 | 10 | 每页条数(默认10) |
请求示例
GET /depts?name=教&page=1&pageSize=5
响应数据
{"code": 1,"msg": "success","data": {"total": 8,"rows": [{"id": 2,"name": "教研部","createTime": "2023-09-25T09:47:40","updateTime": "2024-08-09T15:17:04"}]}
}
错误响应示例
{"code": 0,"msg": "部门名称已存在","data": null
}
接口设计规范
- URL规范
-
- 资源使用复数名词:
/depts
- 层级资源:
/depts/{id}/employees
(如需子资源)
- 资源使用复数名词:
- HTTP方法
方法 | 用途 |
GET | 查询 |
POST | 新增 |
PUT | 全量更新 |
DELETE | 删除 |
- 状态码
状态码 | 说明 |
200 | 成功 |
400 | 参数错误 |
404 | 资源不存在 |
409 | 数据冲突 |
500 | 服务器内部错误 |
服务端开发
(SpringBoot+MyBatis)
借助 cursor 生成框架后,对 springboot 进行一下测试:
浏览器查看:
接口开发
- 部门管理
- 员工管理
- 文件上传
- 登录认证
(AI 辅助)项目特点:
- 使用 Lombok 简化实体类的编写
- 统一的返回结果封装(Result类)
- 采用 RESTful 风格的 API 设计
- 使用 MyBatis 进行数据库操作
- 实现基础的 CRUD 功能
再次启动:
下一步:借助 Apifox 来进行 接口测试,下篇文章见~