猫妈狗爸伴宠师小程序前端代码
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.

620 lines
13 KiB

3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 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获取用户信息
4 days 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获取用户信息
4 days 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获取用户信息
4 days ago
3 months ago
3 months ago
3 months ago
3 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获取用户信息
4 days 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获取用户信息
4 days 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获取用户信息
4 days ago
3 months ago
3 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获取用户信息
4 days 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获取用户信息
4 days 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获取用户信息
4 days 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获取用户信息
4 days 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获取用户信息
4 days ago
3 months ago
3 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获取用户信息
4 days ago
3 months ago
  1. <template>
  2. <view>
  3. <view class="containers po-r">
  4. <image src="" mode="" class="mainBg"></image>
  5. <view class="w-100 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-ffb jiao" @click="jumpToBond">
  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" mode="widthFix"
  77. style="width: 150rpx;height: 150rpx;"></image>
  78. </view>
  79. </view>
  80. </view>
  81. <view class="li flex-rowl po-r">
  82. <view class="line po-a" style="height: 150rpx;">
  83. </view>
  84. <view class="num flex-rowc">
  85. 4
  86. </view>
  87. <view class="item">
  88. <view class="flex-between mb10">
  89. <view class="flex-rowl">
  90. <image class="img" src="@/static/images/ydd/end13.png" mode="widthFix"></image>
  91. <text class="size-30 color-000 fw700">服务工具准备</text>
  92. </view>
  93. <view class="size-22 flex-rowr" @click="openToolsInfoModal">
  94. <text>查看工具包</text>
  95. <up-icon name="arrow-down" color="#7F7F7F" size="17rpx"
  96. style="margin-left: 5rpx;"></up-icon>
  97. </view>
  98. </view>
  99. <!-- <view class="info color-777 size-22">
  100. <view class="flex-between">
  101. <text class="size-22">所在地区:</text>
  102. <view plain class="flex-rowr" @click="selectAddr">
  103. <text>{{ form.area ? form.area : '请选择' }}</text>
  104. <up-icon style="margin-left: 22rpx;" name="arrow-down" color="#7F7F7F"
  105. size="21rpx"></up-icon>
  106. </view>
  107. </view>
  108. </view> -->
  109. <view class="info color-777 size-22 mt20">
  110. <view class="flex-between">
  111. <text class="size-22">姓名:</text>
  112. <input v-model="form.name"
  113. type="text"
  114. placeholder="请输入姓名"
  115. :class="{ 'input-error': formErrors.name }"
  116. @input="clearFieldError('name')" />
  117. </view>
  118. </view>
  119. <view class="info color-777 size-22 mt20">
  120. <view class="flex-between">
  121. <text class="size-22">电话:</text>
  122. <input v-model="form.phone"
  123. type="text"
  124. placeholder="请输入手机号码"
  125. :class="{ 'input-error': formErrors.phone }"
  126. @input="clearFieldError('phone')" />
  127. </view>
  128. </view>
  129. <view class="info color-777 size-22 mt20">
  130. <view class="flex-between">
  131. <text class="size-22">地址:</text>
  132. <input v-model="form.address"
  133. type="text"
  134. placeholder="请输入收货地址"
  135. :class="{ 'input-error': formErrors.address }"
  136. @input="clearFieldError('address')" />
  137. </view>
  138. </view>
  139. </view>
  140. </view>
  141. </view>
  142. <view class="footer-btn" @click="onSave">
  143. <view class="btn">
  144. 提交审核
  145. </view>
  146. </view>
  147. </view>
  148. <up-modal :show="showToolsInfoModal" :showConfirmButton="false" :showCancelButton="false"
  149. :closeOnClickOverlay="true" @close="closeToolsInfoModal">
  150. <up-parse class="size-28" :content="configList.pet_tools.paramValueArea"></up-parse>
  151. </up-modal>
  152. </view>
  153. <button plain class="chat" open-type="contact">
  154. <image src="@/static/images/ydd/chat.png" mode="widthFix"></image>
  155. </button>
  156. </view>
  157. </template>
  158. <script setup>
  159. import {
  160. ref,
  161. reactive,
  162. computed
  163. } from "vue";
  164. import {
  165. onShow
  166. } from '@dcloudio/uni-app'
  167. import {
  168. useStore
  169. } from 'vuex'
  170. import {
  171. udpateUser,
  172. getUserOne
  173. } from '@/api/userTeacher'
  174. import { appletUsersTeacher } from '@/api/examination'
  175. import stepProgress from '../components/stepProgress.vue';
  176. const store = useStore()
  177. const configList = computed(() => {
  178. return store.getters.configList
  179. })
  180. const userId = computed(() => {
  181. return store.state.user.userInfo.userId
  182. })
  183. const id = ref()
  184. const form = reactive({
  185. name: null,
  186. idCard: null,
  187. area: null,
  188. latitude: null,
  189. longitude: null,
  190. address: null,
  191. phone: null,
  192. })
  193. // 添加错误状态管理
  194. const formErrors = reactive({
  195. name: false,
  196. phone: false,
  197. address: false
  198. })
  199. // 清除单个字段错误状态
  200. const clearFieldError = (field) => {
  201. formErrors[field] = false
  202. }
  203. const initData = async () => {
  204. console.log('--initData')
  205. try {
  206. const data = await getUserOne(userId.value)
  207. const {
  208. id: _id,
  209. name,
  210. idCard,
  211. } = data
  212. id.value = _id
  213. form.name = name
  214. form.idCard = idCard
  215. } catch (err) {
  216. console.log('--err', err)
  217. }
  218. }
  219. onShow(() => {
  220. initData()
  221. })
  222. const jumpToBond = () => {
  223. uni.navigateTo({
  224. url: "/otherPages/myOrdersManage/bond/index"
  225. })
  226. }
  227. const showToolsInfoModal = ref(false)
  228. const openToolsInfoModal = () => {
  229. showToolsInfoModal.value = true
  230. }
  231. const closeToolsInfoModal = () => {
  232. showToolsInfoModal.value = false
  233. }
  234. const setAddress = (res) => {
  235. //经纬度信息
  236. form.latitude = res.latitude
  237. form.longitude = res.longitude
  238. if (!res.address && res.name) { //用户直接选择城市的逻辑
  239. return form.area = res.name
  240. }
  241. if (res.address || res.name) {
  242. return form.area = res.address + res.name
  243. }
  244. form.area = '' //用户啥都没选就点击勾选
  245. }
  246. const selectAddr = () => {
  247. uni.chooseLocation({
  248. success: function(res) {
  249. setAddress(res)
  250. }
  251. })
  252. }
  253. const validateForm = () => {
  254. const { name, phone, address } = form
  255. let hasError = false
  256. // 重置错误状态
  257. Object.keys(formErrors).forEach(key => {
  258. formErrors[key] = false
  259. })
  260. // 必填字段验证
  261. if (!name || name.trim() === '') {
  262. formErrors.name = true
  263. hasError = true
  264. uni.showToast({
  265. title: '请输入姓名',
  266. icon: 'none'
  267. })
  268. return false
  269. }
  270. if (!phone || phone.trim() === '') {
  271. formErrors.phone = true
  272. hasError = true
  273. uni.showToast({
  274. title: '请输入电话号码',
  275. icon: 'none'
  276. })
  277. return false
  278. }
  279. if (!address || address.trim() === '') {
  280. formErrors.address = true
  281. hasError = true
  282. uni.showToast({
  283. title: '请输入收货地址',
  284. icon: 'none'
  285. })
  286. return false
  287. }
  288. // 姓名长度验证
  289. if (name.trim().length < 2 || name.trim().length > 10) {
  290. formErrors.name = true
  291. hasError = true
  292. uni.showToast({
  293. title: '姓名长度应在2-10个字符之间',
  294. icon: 'none'
  295. })
  296. return false
  297. }
  298. // 电话号码格式验证
  299. const phoneRegex = /^1[3-9]\d{9}$/
  300. if (!phoneRegex.test(phone.trim())) {
  301. formErrors.phone = true
  302. hasError = true
  303. uni.showToast({
  304. title: '请输入正确的手机号码',
  305. icon: 'none'
  306. })
  307. return false
  308. }
  309. // 地址长度验证
  310. if (address.trim().length < 5 || address.trim().length > 100) {
  311. formErrors.address = true
  312. hasError = true
  313. uni.showToast({
  314. title: '地址长度应在5-100个字符之间',
  315. icon: 'none'
  316. })
  317. return false
  318. }
  319. // 姓名格式验证(只允许中文、英文字母)
  320. const nameRegex = /^[\u4e00-\u9fa5a-zA-Z\s]+$/
  321. if (!nameRegex.test(name.trim())) {
  322. formErrors.name = true
  323. hasError = true
  324. uni.showToast({
  325. title: '姓名只能包含中文和英文字母',
  326. icon: 'none'
  327. })
  328. return false
  329. }
  330. return true
  331. }
  332. const onSave = async () => {
  333. try {
  334. // 先进行表单验证
  335. if (!validateForm()) {
  336. return
  337. }
  338. const {
  339. area,
  340. latitude,
  341. longitude,
  342. address,
  343. name,
  344. phone,
  345. } = form
  346. const data = {
  347. id: id.value,
  348. area,
  349. latitude,
  350. longitude,
  351. address: address.trim(),
  352. name: name.trim(),
  353. phone: phone.trim(),
  354. }
  355. await udpateUser(data)
  356. //成为伴宠师
  357. await appletUsersTeacher({
  358. userId : userId.value
  359. })
  360. store.dispatch('getUserInfo')
  361. uni.showToast({
  362. title: '提交成功!',
  363. icon: "none"
  364. })
  365. setTimeout(() => {
  366. uni.reLaunch({
  367. url: "/pages/workbenchManage/index"
  368. })
  369. }, 1000)
  370. } catch (err) {
  371. uni.showToast({
  372. title: '提交失败,请重试',
  373. icon: 'none'
  374. })
  375. console.error('提交失败:', err)
  376. }
  377. }
  378. </script>
  379. <style lang="scss" scoped>
  380. .chat {
  381. position: fixed;
  382. right: 20rpx;
  383. bottom: 400rpx;
  384. z-index: 9999;
  385. border: none;
  386. padding: 0;
  387. width: 97rpx;
  388. height: auto;
  389. image {
  390. width: 100%;
  391. }
  392. }
  393. .line {
  394. width: 3rpx;
  395. height: 100rpx;
  396. background-color: #BDBDBD;
  397. left: 25rpx;
  398. top: -50rpx;
  399. }
  400. .jiao {
  401. padding: 5px 20rpx;
  402. border-radius: 30rpx;
  403. background-color: #FFBF60;
  404. color: #fff;
  405. }
  406. .li {
  407. width: 710rpx;
  408. .num {
  409. width: 50rpx;
  410. height: 50rpx;
  411. border-radius: 50%;
  412. background-color: #FFBF60;
  413. color: #fff;
  414. font-weight: 700;
  415. font-size: 26rpx;
  416. margin-right: 20rpx;
  417. }
  418. }
  419. .item {
  420. padding: 26rpx 36rpx;
  421. border-radius: 24rpx;
  422. background-color: #fff;
  423. margin-bottom: 24rpx;
  424. width: 590rpx;
  425. .info {
  426. padding: 16rpx;
  427. background-color: #f3f3f3;
  428. border-radius: 16rpx;
  429. }
  430. }
  431. .img {
  432. width: 40rpx;
  433. height: 40rpx;
  434. margin-right: 8rpx;
  435. }
  436. .bt120 {
  437. margin-bottom: 120rpx;
  438. width: 716rpx;
  439. box-sizing: border-box;
  440. }
  441. .footer-btn {
  442. z-index: 9999;
  443. width: 100vw;
  444. height: 144rpx;
  445. background-color: #fff;
  446. display: flex;
  447. justify-content: center;
  448. position: fixed;
  449. bottom: 0;
  450. left: 0;
  451. align-items: center;
  452. .btn {
  453. font-size: 30rpx;
  454. color: #fff;
  455. display: flex;
  456. justify-content: center;
  457. align-items: center;
  458. width: 574rpx;
  459. height: 94rpx;
  460. border-radius: 94rpx;
  461. background-color: #FFBF60;
  462. }
  463. }
  464. .type {
  465. width: 190rpx;
  466. margin-bottom: 74rpx;
  467. }
  468. .form {
  469. padding: 40rpx 32rpx;
  470. box-sizing: border-box;
  471. width: 716rpx;
  472. }
  473. .title {
  474. &::before {
  475. content: "";
  476. display: block;
  477. width: 9rpx;
  478. height: 33rpx;
  479. background-color: #FFBF60;
  480. margin-right: 7rpx;
  481. }
  482. }
  483. .mb6 {
  484. margin-bottom: 6rpx;
  485. }
  486. .containers {
  487. .neir {
  488. padding: 47rpx 27rpx 36rpx 27rpx;
  489. border-radius: 16rpx;
  490. box-sizing: border-box;
  491. width: 716rpx;
  492. .steps {
  493. .line {
  494. width: 163rpx;
  495. height: 3rpx;
  496. background-color: #BDBDBD;
  497. margin-bottom: 30rpx;
  498. }
  499. .num {
  500. width: 50rpx;
  501. height: 50rpx;
  502. background-color: #FFBF60;
  503. border-radius: 50%;
  504. }
  505. }
  506. }
  507. .mainBg {
  508. width: 100vw;
  509. height: 442rpx;
  510. background-image: linear-gradient(to bottom, #FFBF60, #f5f5f5);
  511. }
  512. .content {
  513. top: 0;
  514. left: 0;
  515. padding: 16rpx;
  516. padding-bottom: 200rpx;
  517. .logo {
  518. width: 194rpx;
  519. height: 70rpx;
  520. }
  521. .renz {
  522. image {
  523. width: 26rpx;
  524. height: 26rpx;
  525. }
  526. }
  527. }
  528. }
  529. .highlight {
  530. color: #FFBF60;
  531. }
  532. // 添加输入框错误状态样式
  533. .input-error {
  534. border: 1px solid #ff4757 !important;
  535. background-color: #fff5f5 !important;
  536. color: #ff4757 !important;
  537. }
  538. .input-error::placeholder {
  539. color: #ff9999 !important;
  540. }
  541. </style>