基于Spring Boot的装饰工程管理系统毕设稳过秘籍!项目立项子系统从需求到测试全流程,新手也能抄作业✨
谁懂啊!去年做装饰工程管理系统毕设时,光立项项目表和客户表的关联就卡了3天——一开始没设外键,查某客户的立项项目时全是错乱数据,导师看了直接让我“重画E-R图”😫 后来踩遍坑才摸出一套能快速落地的流程,今天把需求分析、技术选型、功能实现到测试的全细节说透,宝子们再也不用熬夜改代码,轻松搞定毕设!
一、先搞懂“装饰工程要啥”!需求分析别瞎蒙
刚开始我直接跳过需求分析就写代码,结果做了半个月的“装修效果图展示”功能,导师一句“核心是项目立项与流程管理,不是效果图”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走80%弯路。
1. 核心用户&功能拆解(踩坑后总结版)
装饰工程管理系统(项目立项子系统)就三类核心用户:管理员、员工和客户(别加“监理角色”!我当初加了后,权限逻辑乱成一团,最后砍掉才轻松):
- 管理员端(必做功能):
- 立项项目管理:审核员工提交的立项项目、下载项目文件、更新审核状态(别漏“审核意见”字段!我当初没加,员工不知道项目为啥被驳回,全是投诉)
- 客户管理:新增客户信息、重置客户密码、查看客户关联项目(支持“模糊查询”,搜客户姓名尾号就能找到,我当初没加,查客户时翻半天)
- 装饰材料管理:维护材料信息、上传材料图片、设置材料单价(用下拉框选材料类型,比如“瓷砖/板材”,别让管理员手动输,效率更高)
- 合同报价管理:查看员工提交的合同、审核报价金额、下载合同附件(要支持“逻辑删除”,删合同用0/1标记,别真删数据,导师会夸你考虑周全)
- 员工端(核心功能):
- 新增立项项目:填写项目名称、选择关联客户、上传项目文件(别让员工填太多!只留“项目名称+类型+文件”,我当初加了“施工团队”,员工嫌麻烦根本不填)
- 预算报价管理:为立项项目添加预算、填写报价金额、提交审核(要关联立项项目表,确保项目存在才能报价,避免无效数据)
- 装修进度管理:上传项目进度图片、填写进度详情、更新进度状态(支持按“项目编号”筛选,方便员工跟进多个项目)
- 客户端(核心功能):
- 装修进度查看:查看自己项目的进度图片、进度详情(按“时间倒序”显示,最新进度放最前,我当初没设,客户查进度要翻到最后)
- 合同报价查看:查看关联项目的合同内容、报价金额、下载合同文件(用不同颜色标注“已审核”“待审核”,直观清晰)
- 材料计划查看:查看项目用到的装饰材料、采购数量、材料单价(让客户清楚费用构成,减少沟通成本)
2. 需求分析避坑指南(血泪教训!)
- 别光靠“想”!找2个同学模拟员工和客户提意见:比如有同学说“想快速找到自己提交的立项项目”,我才加了“员工专属项目列表”,比自己瞎加“施工日历”实用多了
- 一定要画用例图!用DrawIO画简单版就行,标清“管理员-审核立项项目”“员工-新增预算报价”,后期跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听了15分钟还没get到我的逻辑)
- 写“需求规格说明书”!不用太复杂,把“功能描述、约束条件”写清楚(比如“项目编号不能重复”“报价金额不能为0”),后期编码时对着做,不会跑偏
3. 可行性分析别敷衍!3点写清楚就能过
导师超爱问“你这系统可行吗”,别只说“我觉得可行”,要从3个角度写,显得专业:
- 技术可行性:Spring Boot、Java、MySQL都是课堂学过的,图书馆有《Spring Boot实战》《MySQL数据库应用》,遇到问题能查资料(别选Vue3!我当初想试试,结果环境配置卡了一周,最后换回JSP才顺利)
- 经济可行性:所有工具都是免费的!IDEA(社区版)、MySQL、Tomcat全是官网下载,不用花钱买版权,答辩时说“开发成本为0”,导师会觉得你会控制成本
- 操作可行性:界面用Bootstrap做,按钮布局跟装修公司常用系统类似,我找系里老师测试,她4分钟就学会了提交立项项目,导师直接认可
二、技术选型别跟风!这套组合稳到爆
刚开始我跟风用Spring Boot+Vue+Redis,结果“立项项目文件缓存”卡了5天——Redis的key-value存储逻辑不熟,文件总是加载失败😫 后来换成Spring Boot+JSP+MySQL+Tomcat9,新手友好度直接拉满,调试效率翻了倍!
1. 技术栈详细对比(附避坑提醒)
宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了4个核心工具的选择理由和坑点,直接抄:
| 技术工具 | 为啥选它 | 避坑提醒!(重点!) |
|---|---|---|
| Spring Boot | 比SSM配置简单,自带依赖管理,不用手动整合 | 别用3.x版本!2.7.x就行,3.x和JSP兼容性差,会报“视图解析器错误” |
| MySQL 8.0 | 占内存小,存储项目、客户数据足够用 | 安装时一定要设“utf8mb4”编码!我当初用默认编码,客户姓名含特殊符号时乱码,查了3小时才解决 |
| Tomcat 9.0 | 稳定!和Spring Boot、JSP适配性最好 | 别用Tomcat 10!会出现“Servlet API包名变更”问题,答辩时崩了就完了 |
| JSP+Bootstrap | 不用单独学前端框架,上手快 | Bootstrap用3.x版本!4.x版本栅格布局错乱,项目列表页会变成“竖排”,巨丑 |
2. 开发环境搭建(step by step 实操)
很多宝子卡在“环境配置”,其实跟着步骤来超简单,我当初就是这么搭的,一次成功:
- 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置环境变量时“JAVA_HOME”要填对,不然IDEA认不到
- 装IDEA(社区版):选“Community Edition”,免费且够用,自带Spring Boot插件,不用手动装
- 装MySQL 8.0:用Navicat管理数据库(可视化工具超方便,新建表时直接选字段类型,比命令行快10倍)
- 配置Spring Boot项目:在IDEA里选“Spring Initializr”,勾选“Spring Web”“MySQL Driver”“MyBatis Framework”,启动时看到“Started Application in XXX seconds”就是成功
3. 架构图一定要画!答辩加分项
用DrawIO画三层架构图(就像论文里的“图2.1 系统架构图”),标清“表现层-业务层-数据访问层”的交互逻辑:比如员工在浏览器提交立项项目→Controller接收请求→Service校验数据→Mapper操作MySQL存储项目信息。去年答辩时,评委特意夸这个图“逻辑清晰”,比光说“我用了Spring Boot”专业多了!
三、数据库设计:别让表关联坑了你
这部分是毕设的“核心骨架”,我当初把“立项项目表”和“装饰材料表”没做关联,查“某项目的材料计划”时要写3层嵌套SQL,调试到凌晨2点😫 后来按“实体-属性-关系”来设计,终于理清了。
1. 核心实体&属性(附ER图绘制技巧)
先确定系统里的“实体”(比如客户、立项项目、装饰材料),再想每个实体有啥“属性”,别漏关键字段!我整理了必做的8张表,直接照着画ER图:
- 客户表(kehu):id(主键)、username(账号,唯一)、password(密码,MD5加密!不然存明文,导师会说“不安全”)、kehu_name(姓名)、kehu_phone(手机号)、kehu_email(邮箱)
- 立项项目表(lixiangxiangmu):id(主键)、lixiangxiangmu_uuid_number(项目编号,唯一)、lixiangxiangmu_name(项目名称)、kehu_id(关联客户表)、yonghu_id(关联员工表)、lixiangxiangmu_file(项目文件路径)
- 员工表(yonghu):id(主键)、username(账号)、password(密码)、yonghu_name(姓名)、yonghu_phone(手机号)、yonghu_id_number(身份证号,唯一)
- 合同表(hetong):id(主键)、lixiangxiangmu_id(关联立项项目表)、hetong_name(合同名称)、hetong_file(合同文件路径)、hetong_text(合同详情)
- 合同报价表(hetongbaojia):id(主键)、hetong_id(关联合同表)、hetongbaojia_money(报价金额)、insert_time(添加时间)
- 装饰材料表(zhuangshicailiao):id(主键)、lixiangxiangmu_id(关联立项项目表)、zhuangshicailiao_name(材料名称)、zhuangshicailiao_money(单价)、zhuangshicailiao_number(采购数量)
- 装修进度表(zhuangxiujindu):id(主键)、lixiangxiangmu_id(关联立项项目表)、zhuangxiujindu_name(进度标题)、zhuangxiujindu_photo(进度图片路径)、zhuangxiujindu_text(进度详情)
- 管理员表(admin):id(主键)、username(账号)、password(密码)、role(角色)、addtime(新增时间)
画ER图用Visio或亿图,记住3个规则:
- 矩形代表“实体”(比如“客户”“立项项目”)
- 椭圆代表“属性”(比如客户的“姓名”“手机号”)
- 菱形代表“关系”(比如“员工-提交-立项项目”是一对多,一个员工能提交多个项目,一个项目只属于一个员工) 避坑提醒:别把“项目文件、进度图片”存数据库!我当初直接存文件二进制,数据库炸了,后来改成存“文件路径”(比如/static/files/lixiang1.pdf)才对。
2. 数据库物理设计(附建表SQL示例)
ER图画好后,要转成实际的数据库表,字段类型和约束别瞎设!比如“报价金额”要用DECIMAL(10,2),别用INT,不然没法存“12890.50元”;“项目编号”要设UNIQUE约束,避免重复。
给宝子们贴一段“立项项目表”的建表SQL,直接复制到Navicat就能用:
CREATE TABLE `lixiangxiangmu` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '项目ID',
`lixiangxiangmu_uuid_number` VARCHAR(200) DEFAULT NULL COMMENT '项目编号(唯一)',
`lixiangxiangmu_name` VARCHAR(200) NOT NULL COMMENT '项目名称',
`yonghu_id` INT DEFAULT NULL COMMENT '关联员工ID',
`kehu_id` INT DEFAULT NULL COMMENT '关联客户ID',
`lixiangxiangmu_types` INT DEFAULT NULL COMMENT '项目类型:1家装/2工装',
`lixiangxiangmu_file` VARCHAR(200) DEFAULT NULL COMMENT '项目文件路径',
`lixiangxiangmu_yesno_types` INT DEFAULT 0 COMMENT '审核状态:0待审核/1通过/2驳回',
`lixiangxiangmu_yesno_text` TEXT DEFAULT NULL COMMENT '审核意见',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `fk_yonghu` (`yonghu_id`), -- 外键关联员工表
KEY `fk_kehu` (`kehu_id`), -- 外键关联客户表
UNIQUE KEY `uk_uuid` (`lixiangxiangmu_uuid_number`) -- 项目编号唯一
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='立项项目表';
3. 表关联测试!别等编码才发现错
建完表一定要测试关联是否正常!比如在“立项项目表”插入一条数据(员工ID=1,客户ID=1),然后用JOIN查询:
SELECT y.yonghu_name, k.kehu_name, l.lixiangxiangmu_name, l.lixiangxiangmu_yesno_types
FROM lixiangxiangmu l
JOIN yonghu y ON l.yonghu_id = y.id
JOIN kehu k ON l.kehu_id = k.id
WHERE l.id = 1;
如果能查出“员工姓名+客户姓名+项目名+审核状态”,说明关联没问题;如果报错“Unknown column”,大概率是外键没设对,赶紧检查表结构。
四、功能实现:核心模块代码+页面设计
不用做所有功能!先搞定4个核心模块,答辩时足够出彩。每个模块我都附了代码片段和页面设计要点,宝子们直接套就行。
1. 员工端:新增立项项目模块(必做!)
这是员工最常用的功能,主要实现“填写项目信息、上传文件、提交审核”,重点说“项目文件上传”的逻辑——别漏了“文件格式校验”,我当初就是这里踩了大坑!
(1)核心代码片段(Spring Boot)
Controller层(处理项目提交请求):
@Controller
@RequestMapping("/employee/lixiang")
public class EmployeeLixiangController {
@Autowired
private LixiangxiangmuService lixiangService;
@Autowired
private KehuService kehuService;
// 新增立项项目
@PostMapping("/add")
public String addLixiang(Lixiangxiangmu lixiang,
@RequestParam("file") MultipartFile file,
HttpSession session, HttpServletRequest request) {
// 1. 获取当前登录员工
Yonghu employee = (Yonghu) session.getAttribute("loginEmployee");
if (employee == null) {
return "redirect:/employee/login"; // 未登录跳登录页
}
// 2. 校验客户是否存在
Kehu kehu = kehuService.getById(lixiang.getKehuId());
if (kehu == null) {
request.setAttribute("msg", "所选客户不存在!");
return "employee/lixiang/add";
}
// 3. 处理项目文件上传
if (!file.isEmpty()) {
// 校验文件格式(只允许PDF和DOC)
String originalFilename = file.getOriginalFilename();
if (!originalFilename.endsWith(".pdf") && !originalFilename.endsWith(".doc")) {
request.setAttribute("msg", "只支持PDF和DOC格式的文件!");
return "employee/lixiang/add";
}
try {
String filePath = request.getServletContext().getRealPath("/static/files/lixiang/");
String fileName = System.currentTimeMillis() + originalFilename;
File dest = new File(filePath + fileName);
file.transferTo(dest);
lixiang.setLixiangxiangmuFile("/static/files/lixiang/" + fileName); // 存路径
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("msg", "文件上传失败!");
return "employee/lixiang/add";
}
}
// 4. 设置项目信息
lixiang.setYonghuId(employee.getId()); // 关联员工
lixiang.setLixiangxiangmuUuidNumber(generateUuid()); // 生成唯一项目编号
lixiang.setLixiangxiangmuYesnoTypes(0); // 待审核
lixiang.setCreateTime(new Date());
// 5. 保存项目
lixiangService.save(lixiang);
request.setAttribute("msg", "立项项目提交成功,等待管理员审核!");
return "redirect:/employee/lixiang/list";
}
// 生成唯一项目编号(时间戳+随机数)
private String generateUuid() {
return "LX" + System.currentTimeMillis() + (int)(Math.random()*1000);
}
}
(2)页面设计要点(Bootstrap)
页面标题:员工-新增立项项目页面
(插入图片位置:此处放“新增立项项目页面截图”,需包含以下元素)
- 表单元素:
- 客户选择(下拉框,加载所有客户,必填)
- 项目名称(输入框,必填,提示“如:XX小区120㎡家装”)
- 项目类型(下拉框:家装/工装,必填)
- 项目文件(文件上传框,支持PDF/DOC,提示“上传项目方案”,必填)
- 项目备注(文本域,选填,提示“填写项目特殊要求”)
- 按钮:“提交项目”(绿色btn-success)和“重置”(灰色btn-default)
- 提示信息:红色字体显示“提交失败”,绿色显示“提交成功”
(3)避坑提醒
- 项目编号要唯一!用“前缀+时间戳+随机数”生成,避免重复:
private String generateUuid() { return "LX" + System.currentTimeMillis() + (int)(Math.random()*1000); } - 文件上传限制大小!在application.properties配置:
spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=20MB
2. 管理员端:立项项目审核模块(核心需求!)
管理员用系统就是为了“管控项目流程”,这个功能别搞复杂!流程要简单:查看项目→选择审核结果→填写意见→提交,我当初加了“二次审核”功能,代码量翻倍,其实“一次审核”更实用。
(1)核心代码片段
Service层(处理项目审核):
@Service
public class AdminLixiangService {
@Autowired
private LixiangxiangmuMapper lixiangMapper;
@Override
@Transactional // 事务管理,确保审核状态更新一致
public void auditLixiang(Integer id, Integer status, String opinion) {
// 1. 查询项目是否存在
Lixiangxiangmu lixiang = lixiangMapper.selectById(id);
if (lixiang == null) {
throw new RuntimeException("立项项目不存在!");
}
// 2. 防重复审核
if (lixiang.getLixiangxiangmuYesnoTypes() != 0) {
throw new RuntimeException("该项目已审核,无需重复操作!");
}
// 3. 更新审核状态和意见
lixiang.setLixiangxiangmuYesnoTypes(status); // 0待审核/1通过/2驳回
lixiang.setLixiangxiangmuYesnoText(opinion);
lixiangMapper.updateById(lixiang);
}
}
Controller层(接收审核请求):
@Controller
@RequestMapping("/admin/lixiang")
public class AdminLixiangController {
@Autowired
private AdminLixiangService adminLixiangService;
@PostMapping("/audit")
public String auditLixiang(Integer id, Integer status, String opinion, HttpServletRequest request) {
try {
adminLixiangService.auditLixiang(id, status, opinion);
request.setAttribute("msg", "项目审核完成!");
} catch (Exception e) {
request.setAttribute("msg", e.getMessage());
}
return "redirect:/admin/lixiang/list";
}
}
(2)页面设计要点
页面标题:管理员-立项项目审核页面
(插入图片位置:此处放“立项项目审核页面截图”,需包含以下元素)
- 项目列表表格:
- 列名:项目编号、项目名称、客户姓名、员工姓名、提交时间、审核状态、操作
- 状态显示:待审核(橙色)、已通过(绿色)、已驳回(红色)
- 操作:“查看详情”“下载文件”“审核”按钮
- 审核弹窗:点击“审核”按钮弹出,包含:
- 审核结果(单选框:通过/驳回,必填)
- 审核意见(文本域,必填,比如“通过:项目方案完整”“驳回:缺少预算明细”)
- 按钮:“确认审核”(绿色btn-success)和“取消”(灰色btn-default)
- 提示信息:红色字体显示“审核失败”,绿色显示“审核成功”
(3)避坑提醒
- 审核时要记录操作日志!方便后续追溯(需新增操作日志表):
// 审核后添加日志 Log log = new Log(); log.setAdminId(adminId); // 当前管理员ID log.setOperateContent("审核立项项目:" + lixiang.getLixiangxiangmuName()); log.setOperateTime(new Date()); logMapper.insert(log); - 支持“批量审核”!减少管理员操作次数:
@PostMapping("/batchAudit") public String batchAudit(@RequestParam List<Integer> ids, Integer status, String opinion) { for (Integer id : ids) { auditLixiang(id, status, opinion); } return "redirect:/admin/lixiang/list"; }
3. 客户端:装修进度查看模块(提升专业性)
客户用系统就是为了“实时了解装修进展”,这个功能能体现系统的“实用性”,答辩时多提一句,导师会觉得你考虑周全。
页面设计要点
页面标题:客户-装修进度查看页面
(插入图片位置:此处放“装修进度查看页面截图”,需包含以下元素)
- 筛选条件:按“项目名称”下拉筛选(客户可能有多个项目)
- 进度列表:
- 按“添加时间”倒序排列,显示进度标题、进度图片、进度详情、添加时间
- 进度图片:显示缩略图,点击可查看大图
- 进度详情:标红关键信息,比如“水电改造完成,等待验收”
- 空进度提示:无进度时显示“暂无装修进度,将持续更新”
4. 管理员端:装饰材料管理模块(答辩亮点!)
这个功能最能体现系统的“完整性”,导师超爱问!核心是“维护材料信息、关联立项项目”,别漏了“材料总价计算”,不然管理员算成本很麻烦。
页面设计要点
页面标题:管理员-装饰材料管理页面
(插入图片位置:此处放“装饰材料管理页面截图”,需包含以下元素)
- 筛选条件:按“项目名称”下拉筛选、按“材料名称”模糊查询
- 材料列表表格:
- 列名:项目名称、材料名称、材料类型、单价、采购数量、总价(单价×数量)、操作
- 总价:自动计算并显示,红色字体突出
- 操作:“修改”“删除”按钮
- 新增材料弹窗:包含“项目选择、材料名称、类型、单价、数量”等字段,提交后自动计算总价
五、测试别敷衍!这3步让答辩不翻车
很多宝子觉得“功能能跑就行”,结果答辩时评委一测试就出问题!我当初没测“项目文件格式错误”的情况,导致员工能上传EXCEL文件,导师说“不符合装饰工程规范”,当场扣了分😫 测试一定要针对性做!
1. 功能测试(必测3个模块)
别全测!重点测“核心功能”,我整理了测试用例表,直接填结果就行:
(1)立项项目审核测试(表1:立项项目审核测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 审核通过 | 选“待审核”项目→选“通过”→填“方案完整”→提交 | 项目状态变为“已通过”,显示绿色 | ||
| 审核驳回 | 选“待审核”项目→选“驳回”→填“缺预算”→提交 | 项目状态变为“已驳回”,显示红色 | ||
| 重复审核 | 选“已通过”项目→再次审核 | 提示“该项目已审核,无需重复操作!” |
(2)新增立项项目测试(表2:新增立项项目测试用例)
| 测试场景 | 输入数据 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 文件格式错误 | 客户选存在→项目名:XX家装→文件:EXCEL→提交 | 提示“只支持PDF和DOC格式的文件!” | ||
| 客户不存在 | 客户选不存在ID→项目名:XX工装→文件:PDF→提交 | 提示“所选客户不存在!” | ||
| 正常提交 | 客户选存在→项目名:XX家装→文件:PDF→提交 | 提示“提交成功,等待审核!”,列表显示该项目 |
(3)装修进度查看测试(表3:装修进度查看测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 筛选项目进度 | 选项目“XX家装”→点击查询 | 只显示“XX家装”的所有进度(倒序) | ||
| 无进度数据 | 选未添加进度的项目→查询 | 提示“暂无装修进度,将持续更新” | ||
| 查看进度图片 | 选有进度的项目→点击进度图片 | 弹出大图显示完整进度照片 |
2. 兼容性测试(容易忽略的点)
别只在自己电脑上测!答辩时评委可能用不同浏览器,我当初没测IE浏览器,结果材料列表总价显示错乱,赶紧改了CSS才好:
- 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
- 分辨率测试:1920×1080、1366×768(笔记本常用分辨率,别让页面出现横向滚动条)
3. 测试报告要写好!答辩加分
把测试结果整理成“测试报告”,包含“测试目的、测试范围、测试用例、测试结果、问题总结”,导师会觉得你“做事严谨”。比如:
- 问题总结:“IE浏览器下进度图片不显示,已通过添加CSS的display:block解决;未登录能访问员工后台,已加拦截器解决”
- 测试结论:“核心功能(立项项目审核、新增项目、进度查看)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用”
六、答辩准备:3个加分小技巧
毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给了“良好”:
- 演示流程要顺畅:提前录好演示视频(怕答辩时系统崩),演示时按“员工提交立项项目→管理员审核→客户查进度”的流程来,别跳步
- 重点讲“你解决了啥问题”:比如“一开始项目文件存数据库导致加载慢,后来改成存文件路径,访问速度提升80%”,比光说“我用了Spring Boot”更有亮点
- 准备常见问题:导师大概率会问“为什么选Spring Boot不选SSM”“如果项目量变大,怎么优化”,提前准备好答案,比如“Spring Boot配置简单,适合快速开发;项目量变大的话,会加Redis缓存常用项目信息,减少数据库压力”
最后:毕设通关的小私心
以上就是基于Spring Boot的装饰工程管理系统(项目立项子系统)从0到1的全流程避坑干货!其实毕设没那么难,关键是找对方法,别盲目跟风做复杂功能。
需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“装饰工程系统”,我私发你;要是卡在某个模块(比如项目审核、文件上传),也可以留言,我看到必回!
点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘