猫妈狗爸伴宠师小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

650 lines
13 KiB

4 months ago
2 weeks ago
4 months ago
4 months ago
4 months ago
2 weeks ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
2 weeks ago
4 months ago
4 months ago
4 months ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
4 months ago
4 months ago
4 months ago
2 weeks ago
4 months ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
4 months ago
4 months ago
2 weeks ago
2 weeks ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
4 months ago
2 weeks ago
4 months ago
2 weeks ago
4 months ago
fix(订单管理): 修复宠物档案跳转缺少订单ID的问题 修复订单详情页跳转宠物档案页面时未传递orderId参数的问题 ``` ```msg refactor(认证考试): 重构考试答案提交逻辑 将单个题目提交改为批量提交,优化考试流程: 1. 基础考试和培训考试都改为最后统一提交答案 2. 添加加载状态提示 3. 使用Promise.all处理并发请求 ``` ```msg fix(认证考试): 修复考试完成状态判断逻辑 修改answeBaseIsFinish和answeTrainIsFinish接口的返回判断逻辑,从检查code改为检查data字段 ``` ```msg feat(认证考试): 新增重新考试和成为伴宠师接口 1. 添加retakeExam和appletUsersTeacher接口 2. 在错误详情页添加重新考试功能 3. 在考试完成页添加成为伴宠师功能 ``` ```msg style(时间轴组件): 优化操作按钮布局 1. 添加按钮间距(gap) 2. 使用flex:1使按钮等宽 3. 根据状态显示不同按钮文本 4. 添加serviceBtn属性控制档案按钮显示 ``` ```msg refactor(订单弹窗): 重构服务档案弹窗组件 1. 使用timelineService组件替代原有实现 2. 简化数据结构处理 3. 添加状态判断逻辑 4. 优化弹窗标题和样式 ``` ```msg fix(表单验证): 添加认证考试结束页表单验证 1. 添加姓名、电话、地址的必填验证 2. 添加格式验证(电话格式、姓名格式) 3. 添加长度验证 4. 添加错误状态样式 5. 优化错误提示体验 ``` ```msg refactor(工作台): 重构伴宠师申请流程 1. 优化申请条件判断逻辑 2. 添加用户状态检查 3. 完善考试状态跳转逻辑 4. 统一使用store获取用户信息
1 month ago
4 months ago
  1. <template>
  2. <view>
  3. <view class="containers po-r">
  4. <image src="" mode="" class="mainBg"></image>
  5. <view class="po-a content">
  6. <stepProgress :step="3"></stepProgress>
  7. <view class="step mt24">
  8. <view class="li flex-rowl">
  9. <view class="num flex-rowc">
  10. 1
  11. </view>
  12. <view class="item">
  13. <view class="flex-between mb10">
  14. <view class="flex-rowl">
  15. <image class="img" src="@/static/images/ydd/end12.png" mode=""></image>
  16. <text class="size-30 color-000 fw700">实名认证</text>
  17. </view>
  18. <view class="size-22 color-ffb">
  19. 已完成
  20. </view>
  21. </view>
  22. <view class="info">
  23. <!-- todo: 实名认证 -->
  24. <view class="size-22 color-777">
  25. {{ `真实姓名:${form.name}` }}
  26. </view>
  27. <view class="size-22 color-777">
  28. {{ `身份证号码:${form.idCard}` }}
  29. </view>
  30. </view>
  31. </view>
  32. </view>
  33. <view class="li flex-rowl po-r">
  34. <view class="line po-a">
  35. </view>
  36. <view class="num flex-rowc">
  37. 2
  38. </view>
  39. <view class="item">
  40. <view class="flex-between mb10">
  41. <view class="flex-rowl">
  42. <image class="img" src="@/static/images/ydd/end13.png" mode="widthFix"></image>
  43. <text class="size-30 color-000 fw700">履约保证金缴纳</text>
  44. </view>
  45. <view class="size-22 color-999 jiao-disabled">
  46. 暂未开放
  47. </view>
  48. <!-- todo -->
  49. <!-- <view class="size-22 highlight">
  50. 已完成
  51. </view> -->
  52. </view>
  53. <view class="info color-777 size-22">
  54. 请缴纳履约保证金保证金注销时可申请退还
  55. </view>
  56. </view>
  57. </view>
  58. <view class="li flex-rowl po-r">
  59. <view class="line po-a" style="height: 150rpx;">
  60. </view>
  61. <view class="num flex-rowc">
  62. 3
  63. </view>
  64. <view class="item">
  65. <view class="flex-between mb10">
  66. <view class="flex-rowl">
  67. <image class="img" src="@/static/images/ydd/end1(4).png" mode="widthFix"></image>
  68. <text class="size-30 color-000 fw700">添加客服微信</text>
  69. </view>
  70. <view class="size-22 highlight">
  71. 请自行添加
  72. </view>
  73. </view>
  74. <view class="info color-777 size-22 flex-rowl">
  75. <text class="size-22 color-777">微信二维码</text>
  76. <image :src="configList.wx_image.paramValueImage"
  77. @click="previewQRCode"
  78. mode="widthFix"
  79. style="width: 150rpx;height: 150rpx;cursor: pointer;"></image>
  80. </view>
  81. </view>
  82. </view>
  83. <view class="li flex-rowl po-r">
  84. <view class="line po-a" style="height: 150rpx;">
  85. </view>
  86. <view class="num flex-rowc">
  87. 4
  88. </view>
  89. <view class="item">
  90. <view class="flex-between mb10">
  91. <view class="flex-rowl">
  92. <image class="img" src="@/static/images/ydd/end13.png" mode="widthFix"></image>
  93. <text class="size-30 color-000 fw700">服务工具准备</text>
  94. </view>
  95. <view class="size-22 flex-rowr" @click="openToolsInfoModal">
  96. <text>查看工具包</text>
  97. <up-icon name="arrow-down" color="#7F7F7F" size="17rpx"
  98. style="margin-left: 5rpx;"></up-icon>
  99. </view>
  100. </view>
  101. <!-- <view class="info color-777 size-22">
  102. <view class="flex-between">
  103. <text class="size-22">所在地区:</text>
  104. <view plain class="flex-rowr" @click="selectAddr">
  105. <text>{{ form.area ? form.area : '请选择' }}</text>
  106. <up-icon style="margin-left: 22rpx;" name="arrow-down" color="#7F7F7F"
  107. size="21rpx"></up-icon>
  108. </view>
  109. </view>
  110. </view> -->
  111. <view class="info color-777 size-22 mt20">
  112. <view class="flex-between">
  113. <text class="size-22">姓名:</text>
  114. <input v-model="form.name"
  115. type="text"
  116. placeholder="请输入姓名"
  117. :class="{ 'input-error': formErrors.name }"
  118. @input="clearFieldError('name')" />
  119. </view>
  120. </view>
  121. <view class="info color-777 size-22 mt20">
  122. <view class="flex-between">
  123. <text class="size-22">电话:</text>
  124. <input v-model="form.phone"
  125. type="text"
  126. placeholder="请输入手机号码"
  127. :class="{ 'input-error': formErrors.phone }"
  128. @input="clearFieldError('phone')" />
  129. </view>
  130. </view>
  131. <view class="info color-777 size-22 mt20">
  132. <view class="flex-between">
  133. <text class="size-22">地址:</text>
  134. <input v-model="form.address"
  135. type="text"
  136. placeholder="请输入收货地址"
  137. :class="{ 'input-error': formErrors.address }"
  138. @input="clearFieldError('address')" />
  139. </view>
  140. </view>
  141. </view>
  142. </view>
  143. </view>
  144. <view class="footer-btn" @click="onSave">
  145. <view class="btn">
  146. 提交审核
  147. </view>
  148. </view>
  149. </view>
  150. <up-modal :show="showToolsInfoModal" :showConfirmButton="false" :showCancelButton="false"
  151. :closeOnClickOverlay="true" @close="closeToolsInfoModal">
  152. <up-parse class="size-28" :content="configList.pet_tools.paramValueArea"></up-parse>
  153. </up-modal>
  154. </view>
  155. <!-- 使用全局客服组件 -->
  156. <CustomerService />
  157. </view>
  158. </template>
  159. <script setup>
  160. import {
  161. ref,
  162. reactive,
  163. computed
  164. } from "vue";
  165. import {
  166. onShow
  167. } from '@dcloudio/uni-app'
  168. import {
  169. useStore
  170. } from 'vuex'
  171. import {
  172. udpateUser,
  173. getUserOne
  174. } from '@/api/userTeacher'
  175. import { appletUsersTeacher } from '@/api/examination'
  176. import stepProgress from '../components/stepProgress.vue';
  177. const store = useStore()
  178. const configList = computed(() => {
  179. return store.getters.configList
  180. })
  181. const userId = computed(() => {
  182. return store.state.user.userInfo.userId
  183. })
  184. const id = ref()
  185. const form = reactive({
  186. name: null,
  187. idCard: null,
  188. area: null,
  189. latitude: null,
  190. longitude: null,
  191. address: null,
  192. phone: null,
  193. })
  194. // 添加错误状态管理
  195. const formErrors = reactive({
  196. name: false,
  197. phone: false,
  198. address: false
  199. })
  200. // 清除单个字段错误状态
  201. const clearFieldError = (field) => {
  202. formErrors[field] = false
  203. }
  204. const initData = async () => {
  205. console.log('--initData')
  206. try {
  207. const data = await getUserOne(userId.value)
  208. const {
  209. id: _id,
  210. name,
  211. idCard,
  212. } = data
  213. id.value = _id
  214. form.name = name
  215. form.idCard = idCard
  216. } catch (err) {
  217. console.log('--err', err)
  218. }
  219. }
  220. onShow(() => {
  221. initData()
  222. })
  223. // jumpToBond函数已移除,因为去缴费按钮已改为暂未开放状态
  224. const showToolsInfoModal = ref(false)
  225. const openToolsInfoModal = () => {
  226. showToolsInfoModal.value = true
  227. }
  228. const closeToolsInfoModal = () => {
  229. showToolsInfoModal.value = false
  230. }
  231. // 预览客服二维码
  232. const previewQRCode = () => {
  233. if (configList.value.wx_image && configList.value.wx_image.paramValueImage) {
  234. uni.previewImage({
  235. urls: [configList.value.wx_image.paramValueImage],
  236. current: 0,
  237. longPressActions: {
  238. itemList: ['保存图片'],
  239. success: function(data) {
  240. if (data.tapIndex === 0) {
  241. // 保存图片到相册
  242. uni.saveImageToPhotosAlbum({
  243. filePath: configList.value.wx_image.paramValueImage,
  244. success: function() {
  245. uni.showToast({
  246. title: '保存成功',
  247. icon: 'success'
  248. })
  249. },
  250. fail: function() {
  251. uni.showToast({
  252. title: '保存失败',
  253. icon: 'none'
  254. })
  255. }
  256. })
  257. }
  258. }
  259. }
  260. })
  261. } else {
  262. uni.showToast({
  263. title: '二维码图片加载失败',
  264. icon: 'none'
  265. })
  266. }
  267. }
  268. const setAddress = (res) => {
  269. //经纬度信息
  270. form.latitude = res.latitude
  271. form.longitude = res.longitude
  272. if (!res.address && res.name) { //用户直接选择城市的逻辑
  273. return form.area = res.name
  274. }
  275. if (res.address || res.name) {
  276. return form.area = res.address + res.name
  277. }
  278. form.area = '' //用户啥都没选就点击勾选
  279. }
  280. const selectAddr = () => {
  281. uni.chooseLocation({
  282. success: function(res) {
  283. setAddress(res)
  284. }
  285. })
  286. }
  287. const validateForm = () => {
  288. const { name, phone, address } = form
  289. let hasError = false
  290. // 重置错误状态
  291. Object.keys(formErrors).forEach(key => {
  292. formErrors[key] = false
  293. })
  294. // 必填字段验证
  295. if (!name || name.trim() === '') {
  296. formErrors.name = true
  297. hasError = true
  298. uni.showToast({
  299. title: '请输入姓名',
  300. icon: 'none'
  301. })
  302. return false
  303. }
  304. if (!phone || phone.trim() === '') {
  305. formErrors.phone = true
  306. hasError = true
  307. uni.showToast({
  308. title: '请输入电话号码',
  309. icon: 'none'
  310. })
  311. return false
  312. }
  313. if (!address || address.trim() === '') {
  314. formErrors.address = true
  315. hasError = true
  316. uni.showToast({
  317. title: '请输入收货地址',
  318. icon: 'none'
  319. })
  320. return false
  321. }
  322. // 姓名长度验证
  323. if (name.trim().length < 2 || name.trim().length > 10) {
  324. formErrors.name = true
  325. hasError = true
  326. uni.showToast({
  327. title: '姓名长度应在2-10个字符之间',
  328. icon: 'none'
  329. })
  330. return false
  331. }
  332. // 电话号码格式验证
  333. const phoneRegex = /^1[3-9]\d{9}$/
  334. if (!phoneRegex.test(phone.trim())) {
  335. formErrors.phone = true
  336. hasError = true
  337. uni.showToast({
  338. title: '请输入正确的手机号码',
  339. icon: 'none'
  340. })
  341. return false
  342. }
  343. // 地址长度验证
  344. if (address.trim().length < 5 || address.trim().length > 100) {
  345. formErrors.address = true
  346. hasError = true
  347. uni.showToast({
  348. title: '地址长度应在5-100个字符之间',
  349. icon: 'none'
  350. })
  351. return false
  352. }
  353. // 姓名格式验证(只允许中文、英文字母)
  354. const nameRegex = /^[\u4e00-\u9fa5a-zA-Z\s]+$/
  355. if (!nameRegex.test(name.trim())) {
  356. formErrors.name = true
  357. hasError = true
  358. uni.showToast({
  359. title: '姓名只能包含中文和英文字母',
  360. icon: 'none'
  361. })
  362. return false
  363. }
  364. return true
  365. }
  366. const onSave = async () => {
  367. try {
  368. // 先进行表单验证
  369. if (!validateForm()) {
  370. return
  371. }
  372. const {
  373. area,
  374. latitude,
  375. longitude,
  376. address,
  377. name,
  378. phone,
  379. } = form
  380. const data = {
  381. id: id.value,
  382. area,
  383. latitude,
  384. longitude,
  385. address: address.trim(),
  386. name: name.trim(),
  387. phone: phone.trim(),
  388. }
  389. await udpateUser(data)
  390. //成为伴宠师
  391. await appletUsersTeacher({
  392. userId : userId.value
  393. })
  394. store.dispatch('getUserInfo')
  395. uni.showToast({
  396. title: '提交成功!',
  397. icon: "none"
  398. })
  399. setTimeout(() => {
  400. uni.reLaunch({
  401. url: "/pages/workbenchManage/index"
  402. })
  403. }, 1000)
  404. } catch (err) {
  405. uni.showToast({
  406. title: '提交失败,请重试',
  407. icon: 'none'
  408. })
  409. console.error('提交失败:', err)
  410. }
  411. }
  412. </script>
  413. <style lang="scss" scoped>
  414. // 原客服按钮样式已移动到全局组件中
  415. .line {
  416. width: 3rpx;
  417. height: 100rpx;
  418. background-color: #BDBDBD;
  419. left: 25rpx;
  420. top: -50rpx;
  421. }
  422. .jiao {
  423. padding: 5px 20rpx;
  424. border-radius: 30rpx;
  425. background-color: #FFBF60;
  426. color: #fff;
  427. }
  428. .jiao-disabled {
  429. padding: 5px 20rpx;
  430. border-radius: 30rpx;
  431. background-color: #CCCCCC;
  432. color: #999999;
  433. cursor: not-allowed;
  434. }
  435. .li {
  436. width: 710rpx;
  437. .num {
  438. width: 50rpx;
  439. height: 50rpx;
  440. border-radius: 50%;
  441. background-color: #FFBF60;
  442. color: #fff;
  443. font-weight: 700;
  444. font-size: 26rpx;
  445. margin-right: 20rpx;
  446. }
  447. }
  448. .item {
  449. padding: 26rpx 36rpx;
  450. border-radius: 24rpx;
  451. background-color: #fff;
  452. margin-bottom: 24rpx;
  453. width: 590rpx;
  454. .info {
  455. padding: 16rpx;
  456. background-color: #f3f3f3;
  457. border-radius: 16rpx;
  458. }
  459. }
  460. .img {
  461. width: 40rpx;
  462. height: 40rpx;
  463. margin-right: 8rpx;
  464. }
  465. .bt120 {
  466. margin-bottom: 120rpx;
  467. width: 716rpx;
  468. box-sizing: border-box;
  469. }
  470. .footer-btn {
  471. z-index: 9999;
  472. width: 100vw;
  473. height: 144rpx;
  474. background-color: #fff;
  475. display: flex;
  476. justify-content: center;
  477. position: fixed;
  478. bottom: 0;
  479. left: 0;
  480. align-items: center;
  481. .btn {
  482. font-size: 30rpx;
  483. color: #fff;
  484. display: flex;
  485. justify-content: center;
  486. align-items: center;
  487. width: 574rpx;
  488. height: 94rpx;
  489. border-radius: 94rpx;
  490. background-color: #FFBF60;
  491. }
  492. }
  493. .type {
  494. width: 190rpx;
  495. margin-bottom: 74rpx;
  496. }
  497. .form {
  498. padding: 40rpx 32rpx;
  499. box-sizing: border-box;
  500. width: 716rpx;
  501. }
  502. .title {
  503. &::before {
  504. content: "";
  505. display: block;
  506. width: 9rpx;
  507. height: 33rpx;
  508. background-color: #FFBF60;
  509. margin-right: 7rpx;
  510. }
  511. }
  512. .mb6 {
  513. margin-bottom: 6rpx;
  514. }
  515. .containers {
  516. .neir {
  517. padding: 47rpx 27rpx 36rpx 27rpx;
  518. border-radius: 16rpx;
  519. box-sizing: border-box;
  520. width: 716rpx;
  521. .steps {
  522. .line {
  523. width: 163rpx;
  524. height: 3rpx;
  525. background-color: #BDBDBD;
  526. margin-bottom: 30rpx;
  527. }
  528. .num {
  529. width: 50rpx;
  530. height: 50rpx;
  531. background-color: #FFBF60;
  532. border-radius: 50%;
  533. }
  534. }
  535. }
  536. .mainBg {
  537. width: 100vw;
  538. height: 442rpx;
  539. background-image: linear-gradient(to bottom, #FFBF60, #f5f5f5);
  540. }
  541. .content {
  542. top: 0;
  543. left: 0;
  544. padding: 16rpx;
  545. padding-bottom: 200rpx;
  546. .logo {
  547. width: 194rpx;
  548. height: 70rpx;
  549. }
  550. .renz {
  551. image {
  552. width: 26rpx;
  553. height: 26rpx;
  554. }
  555. }
  556. }
  557. }
  558. .highlight {
  559. color: #FFBF60;
  560. }
  561. // 添加输入框错误状态样式
  562. .input-error {
  563. border: 1px solid #ff4757 !important;
  564. background-color: #fff5f5 !important;
  565. color: #ff4757 !important;
  566. }
  567. .input-error::placeholder {
  568. color: #ff9999 !important;
  569. }
  570. </style>