Huanyi 3 săptămâni în urmă
părinte
comite
5eeda36b91
99 a modificat fișierele cu 1091 adăugiri și 1320 ștergeri
  1. 76 20
      .idea/workspace.xml
  2. 0 13
      api/archieves/changeLog/index.js
  3. 0 27
      api/archieves/pet/index.js
  4. 0 25
      api/auth.js
  5. 0 406
      api/fulfiller.js
  6. 0 100
      api/fulfiller/log/index.js
  7. 0 30
      api/order/subOrder/index.js
  8. 0 6
      api/service.js
  9. 0 15
      api/service/list/index.js
  10. 0 16
      api/system/dict/index.js
  11. 99 99
      components/custom-tabbar/index.vue
  12. 5 2
      manifest.json
  13. 6 0
      pages.json
  14. 2 2
      pages/home/index.vue
  15. 89 23
      pages/home/logic.js
  16. 1 1
      pages/home/work-status.vue
  17. 21 5
      pages/login/logic.js
  18. 3 2
      pages/login/login.vue
  19. 4 3
      pages/mine/index.vue
  20. 3 1
      pages/mine/level/index.vue
  21. 2 1
      pages/mine/logic.js
  22. 3 2
      pages/mine/order-stats.vue
  23. 1 1
      pages/mine/points/detail.vue
  24. 1 1
      pages/mine/points/index.vue
  25. 1 1
      pages/mine/rewards-all.vue
  26. 1 1
      pages/mine/rewards.vue
  27. 33 9
      pages/mine/settings/about/index.vue
  28. 2 1
      pages/mine/settings/auth/edit.vue
  29. 1 1
      pages/mine/settings/auth/index.vue
  30. 77 9
      pages/mine/settings/index.vue
  31. 1 1
      pages/mine/settings/profile/edit-name.vue
  32. 37 2
      pages/mine/settings/profile/index.vue
  33. 1 1
      pages/mine/settings/security/change-password.vue
  34. 1 1
      pages/mine/settings/security/change-phone.vue
  35. 1 1
      pages/mine/settings/security/index.vue
  36. 1 1
      pages/mine/wallet/bill.vue
  37. 1 1
      pages/mine/wallet/index.vue
  38. 3 2
      pages/orders/anomaly.vue
  39. 57 17
      pages/orders/detail-logic.js
  40. 2 2
      pages/orders/index.vue
  41. 53 16
      pages/orders/logic.js
  42. 1 1
      pages/recruit/auth_logic.js
  43. 3 2
      pages/recruit/form.vue
  44. 22 6
      pages/recruit/logic.js
  45. 1 1
      pages/recruit/qualifications_logic.js
  46. 21 3
      pages/recruit/success_logic.js
  47. BIN
      unpackage/cache/apk/__UNI__76F5C47_cm.apk
  48. 1 1
      unpackage/cache/apk/apkurl
  49. 0 0
      unpackage/cache/apk/cmManifestCache.json
  50. 0 1
      unpackage/cache/wgt/__UNI__76F5C47/app-config-service.js
  51. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/app-service.js
  52. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/manifest.json
  53. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/home/index.css
  54. 0 1
      unpackage/cache/wgt/__UNI__76F5C47/pages/home/work-status.css
  55. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/login/login.css
  56. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/index.css
  57. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/level/index.css
  58. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/order-stats.css
  59. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/points/detail.css
  60. 0 1
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/rewards-all.css
  61. 1 1
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/about/index.css
  62. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/auth/edit.css
  63. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/wallet/bill.css
  64. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/orders/anomaly.css
  65. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/orders/index.css
  66. 0 1
      unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/auth.css
  67. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/form.css
  68. 0 1
      unpackage/dist/build/app-plus/app-config-service.js
  69. 0 0
      unpackage/dist/build/app-plus/app-service.js
  70. 3 1
      unpackage/dist/build/app-plus/manifest.json
  71. 0 0
      unpackage/dist/build/app-plus/pages/home/index.css
  72. 0 1
      unpackage/dist/build/app-plus/pages/home/work-status.css
  73. 0 0
      unpackage/dist/build/app-plus/pages/login/login.css
  74. 0 0
      unpackage/dist/build/app-plus/pages/mine/index.css
  75. 0 0
      unpackage/dist/build/app-plus/pages/mine/level/index.css
  76. 0 0
      unpackage/dist/build/app-plus/pages/mine/order-stats.css
  77. 0 0
      unpackage/dist/build/app-plus/pages/mine/points/detail.css
  78. 0 1
      unpackage/dist/build/app-plus/pages/mine/rewards-all.css
  79. 1 1
      unpackage/dist/build/app-plus/pages/mine/settings/about/index.css
  80. 0 0
      unpackage/dist/build/app-plus/pages/mine/settings/auth/edit.css
  81. 0 0
      unpackage/dist/build/app-plus/pages/mine/wallet/bill.css
  82. 0 0
      unpackage/dist/build/app-plus/pages/orders/anomaly.css
  83. 0 0
      unpackage/dist/build/app-plus/pages/orders/index.css
  84. 0 1
      unpackage/dist/build/app-plus/pages/recruit/auth.css
  85. 0 0
      unpackage/dist/build/app-plus/pages/recruit/form.css
  86. 0 0
      unpackage/dist/dev/app-plus/app-config-service.js
  87. 332 285
      unpackage/dist/dev/app-plus/app-service.js
  88. 2 0
      unpackage/dist/dev/app-plus/manifest.json
  89. 30 30
      unpackage/dist/dev/app-plus/pages/home/index.css
  90. 9 9
      unpackage/dist/dev/app-plus/pages/login/login.css
  91. 30 30
      unpackage/dist/dev/app-plus/pages/mine/index.css
  92. 2 2
      unpackage/dist/dev/app-plus/pages/mine/settings/about/index.css
  93. 30 30
      unpackage/dist/dev/app-plus/pages/orders/index.css
  94. 9 9
      unpackage/dist/dev/app-plus/pages/recruit/form.css
  95. BIN
      unpackage/release/apk/__UNI__76F5C47__20260316202839.apk
  96. BIN
      unpackage/release/apk/__UNI__76F5C47__20260317093308.apk
  97. 3 3
      utils/config.js
  98. 1 0
      utils/request.js
  99. 0 29
      walkthrough.md

+ 76 - 20
.idea/workspace.xml

@@ -4,7 +4,51 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="e5f5f697-2bd4-4205-922a-fb106cdbbdf5" name="Changes" comment="优化" />
+    <list default="true" id="e5f5f697-2bd4-4205-922a-fb106cdbbdf5" name="Changes" comment="修复bug">
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/api/fulfiller.js" beforeDir="false" afterPath="$PROJECT_DIR$/api/fulfiller.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/components/custom-tabbar/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/components/custom-tabbar/index.vue" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/manifest.json" beforeDir="false" afterPath="$PROJECT_DIR$/manifest.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/apk/__UNI__76F5C47_cm.apk" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/apk/__UNI__76F5C47_cm.apk" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/apk/apkurl" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/apk/apkurl" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/apk/cmManifestCache.json" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/apk/cmManifestCache.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/app-config-service.js" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/app-config-service.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/app-service.js" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/app-service.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/manifest.json" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/manifest.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/home/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/home/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/home/work-status.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/home/work-status.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/login/login.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/login/login.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/level/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/level/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/order-stats.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/order-stats.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/points/detail.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/points/detail.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/rewards-all.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/rewards-all.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/wallet/bill.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/mine/wallet/bill.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/orders/anomaly.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/orders/anomaly.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/orders/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/orders/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/auth.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/auth.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/form.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/form.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/app-config-service.js" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/app-config-service.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/app-service.js" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/app-service.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/manifest.json" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/manifest.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/home/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/home/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/home/work-status.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/home/work-status.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/login/login.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/login/login.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/level/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/level/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/order-stats.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/order-stats.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/points/detail.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/points/detail.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/rewards-all.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/rewards-all.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/wallet/bill.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/mine/wallet/bill.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/orders/anomaly.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/orders/anomaly.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/orders/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/orders/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/recruit/auth.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/recruit/auth.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/recruit/form.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/build/app-plus/pages/recruit/form.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/release/apk/__UNI__76F5C47__20260316202839.apk" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/release/apk/__UNI__76F5C47__20260317093308.apk" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/utils/config.js" beforeDir="false" afterPath="$PROJECT_DIR$/utils/config.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/utils/request.js" beforeDir="false" afterPath="$PROJECT_DIR$/utils/request.js" afterDir="false" />
+    </list>
     <list id="6ae23f6a-53fe-4817-a1d7-106bcf184c18" name="New changelist" comment="不想提交的文件" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -42,24 +86,25 @@
     <option name="showLibraryContents" value="true" />
     <option name="showMembers" value="true" />
   </component>
-  <component name="PropertiesComponent">{
-  &quot;keyToString&quot;: {
-    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
-    &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
-    &quot;RunOnceActivity.typescript.service.memoryLimit.init&quot;: &quot;true&quot;,
-    &quot;git-widget-placeholder&quot;: &quot;dev/shenliang&quot;,
-    &quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
-    &quot;last_opened_file_path&quot;: &quot;D:/windsurfProject/petSystem/pet-system-fulfiller-app&quot;,
-    &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
-    &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
-    &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
-    &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
-    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
-    &quot;settings.editor.selected.configurable&quot;: &quot;MavenSettings&quot;,
-    &quot;ts.external.directory.path&quot;: &quot;D:\\Idea\\IntelliJ IDEA 2024.3.5\\plugins\\javascript-plugin\\jsLanguageServicesImpl\\external&quot;,
-    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
+  <component name="PropertiesComponent"><![CDATA[{
+  "keyToString": {
+    "RunOnceActivity.ShowReadmeOnStart": "true",
+    "RunOnceActivity.git.unshallow": "true",
+    "RunOnceActivity.typescript.service.memoryLimit.init": "true",
+    "git-widget-placeholder": "dev/shenliang",
+    "javascript.preferred.runtime.type.id": "node",
+    "kotlin-language-version-configured": "true",
+    "last_opened_file_path": "D:/windsurfProject/petSystem/pet-system-fulfiller-app",
+    "node.js.detected.package.eslint": "true",
+    "node.js.detected.package.tslint": "true",
+    "node.js.selected.package.eslint": "(autodetect)",
+    "node.js.selected.package.tslint": "(autodetect)",
+    "nodejs_package_manager_path": "npm",
+    "settings.editor.selected.configurable": "MavenSettings",
+    "ts.external.directory.path": "D:\\Code\\WebStorm 2025.2\\plugins\\javascript-plugin\\jsLanguageServicesImpl\\external",
+    "vue.rearranger.settings.migration": "true"
   }
-}</component>
+}]]></component>
   <component name="SharedIndexes">
     <attachedChunks>
       <set>
@@ -87,6 +132,8 @@
       <workItem from="1773334157405" duration="23000" />
       <workItem from="1773772227895" duration="40000" />
       <workItem from="1773942353014" duration="21000" />
+      <workItem from="1774012995939" duration="18000" />
+      <workItem from="1774229878524" duration="4279000" />
     </task>
     <task id="LOCAL-00001" summary="1.完成app端履约者入驻相关功能开发&#10;2.完成app端履约者登录功能开发&#10;3.完成履约者个人中心功能开发">
       <option name="closed" value="true" />
@@ -168,7 +215,15 @@
       <option name="project" value="LOCAL" />
       <updated>1773942371940</updated>
     </task>
-    <option name="localTasksCounter" value="11" />
+    <task id="LOCAL-00011" summary="修复bug">
+      <option name="closed" value="true" />
+      <created>1774013009505</created>
+      <option name="number" value="00011" />
+      <option name="presentableId" value="LOCAL-00011" />
+      <option name="project" value="LOCAL" />
+      <updated>1774013009505</updated>
+    </task>
+    <option name="localTasksCounter" value="12" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -187,6 +242,7 @@
     <MESSAGE value="整改基本完成" />
     <MESSAGE value="改造登录;完善功能" />
     <MESSAGE value="优化" />
-    <option name="LAST_COMMIT_MESSAGE" value="优化" />
+    <MESSAGE value="修复bug" />
+    <option name="LAST_COMMIT_MESSAGE" value="修复bug" />
   </component>
 </project>

+ 0 - 13
api/archieves/changeLog/index.js

@@ -1,13 +0,0 @@
-import request from '@/utils/request'
-
-/**
- * 获取变更日志列表(备注日志)
- * @param {Object} params - { targetId, targetType }
- */
-export function listChangeLog(params) {
-  return request({
-    url: '/archieves/changeLog/listAll',
-    method: 'GET',
-    data: params
-  })
-}

+ 0 - 27
api/archieves/pet/index.js

@@ -1,27 +0,0 @@
-/**
- * 宠物档案 API
- * @author steelwei
- */
-import request from '@/utils/request'
-
-/**
- * 获取宠物档案详情
- * @param {number} id 宠物ID
- */
-export function getPetDetail(id) {
-    return request({
-        url: `/archieves/pet/${id}`,
-        method: 'GET'
-    })
-}
-/**
- * 提交宠物备注
- * @param {Object} data - { petId, content }
- */
-export function submitPetRemark(data) {
-    return request({
-        url: '/archieves/pet/remark',
-        method: 'POST',
-        data
-    })
-}

+ 0 - 25
api/auth.js

@@ -16,8 +16,6 @@ export function loginByPassword(username, password) {
     method: 'POST',
     needToken: false,
     data: {
-      // tenantId: TENANT_ID,
-      // platformId: PLATFORM_ID,
       userSource: 1,
       username,
       password,
@@ -49,19 +47,6 @@ export function loginBySms(phonenumber, smsCode) {
   })
 }
 
-/**
- * 发送短信验证码
- * @param {string} phonenumber - 手机号
- */
-export function sendSmsCode(phonenumber) {
-  return request({
-    url: '/resource/sms/code',
-    method: 'GET',
-    needToken: false,
-    data: { phonenumber }
-  })
-}
-
 /**
  * 退出登录
  */
@@ -71,13 +56,3 @@ export function logout() {
     method: 'POST'
   })
 }
-
-/**
- * 获取当前登录履约者信息
- */
-export function getUserInfo() {
-  return request({
-    url: '/fulfiller/fulfiller/my',
-    method: 'GET'
-  })
-}

+ 0 - 406
api/fulfiller.js

@@ -1,406 +0,0 @@
-/**
- * 履约者业务 API
- * @author steelwei
- */
-import request from '@/utils/request'
-import { BASE_URL, CLIENT_ID, PLATFORM_CODE } from '@/utils/config'
-
-/**
- * 获取当前履约者个人档案
- */
-export function getMyProfile() {
-  return request({
-    url: '/fulfiller/fulfiller/my',
-    method: 'GET'
-  })
-}
-
-/**
- * 提交入驻申请(招募表单)
- * @param {Object} data - 申请数据
- */
-export function submitAudit(data) {
-  return request({
-    url: '/fulfiller/app/audit/submit',
-    method: 'POST',
-    needToken: false,
-    data
-  })
-}
-
-/**
- * 获取服务项目列表(动态获取服务类型)
- * @author steelwei
- */
-export function getServiceTypes() {
-  return request({
-    url: '/fulfiller/app/service/list',
-    method: 'GET',
-    needToken: false
-  })
-}
-
-/**
- * 查询子级区域/站点列表(级联选择器用)
- * @param {number} parentId - 父级ID,0或不传查顶级
- */
-export function getAreaChildren(parentId = 0) {
-  return request({
-    url: '/fulfiller/app/area/children',
-    method: 'GET',
-    needToken: false,
-    data: { parentId }
-  })
-}
-
-/**
- * 上传文件(图片等)
- * @param {string} filePath - 本地文件路径
- * @returns {Promise} - { url, fileName, ossId }
- */
-export function uploadFile(filePath) {
-  return new Promise((resolve, reject) => {
-    const token = uni.getStorageSync('fulfiller_token')
-    uni.uploadFile({
-      url: BASE_URL + '/fulfiller/app/upload',
-      filePath: filePath,
-      name: 'file',
-      header: {
-        'clientid': CLIENT_ID,
-        'X-Platform-Code': PLATFORM_CODE,
-        'Authorization': token ? `Bearer ${token}` : ''
-      },
-      success: (res) => {
-        try {
-          const data = JSON.parse(res.data)
-          if (data.code === 200) {
-            resolve(data)
-          } else {
-            uni.showToast({ title: data.msg || '上传失败', icon: 'none' })
-            reject(data)
-          }
-        } catch (e) {
-          reject(e)
-        }
-      },
-      fail: (err) => {
-        uni.showToast({ title: '上传失败', icon: 'none' })
-        reject(err)
-      }
-    })
-  })
-}
-
-/**
- * 查询我的审核状态
- */
-export function getMyAuditStatus() {
-  return request({
-    url: '/fulfiller/audit/my',
-    method: 'GET'
-  })
-}
-
-/**
- * 获取我的积分日志
- */
-export function getMyPointsLog(params) {
-  return request({
-    url: '/fulfiller/log/points',
-    method: 'GET',
-    data: params
-  })
-}
-
-/**
- * 获取我的余额日志
- */
-export function getMyBalanceLog(params) {
-  return request({
-    url: '/fulfiller/log/balance',
-    method: 'GET',
-    data: params
-  })
-}
-
-/**
- * 获取我的奖惩记录
- */
-export function getMyRewardLog(params) {
-  return request({
-    url: '/fulfiller/log/reward',
-    method: 'GET',
-    data: params
-  })
-}
-
-/**
- * 修改头像
- * @param {string} avatar - 头像ossId
- * @author steelwei
- */
-export function updateAvatar(avatar) {
-  return request({
-    url: '/fulfiller/fulfiller/my/avatar',
-    method: 'PUT',
-    data: { avatar }
-  })
-}
-
-/**
- * 修改真实姓名
- * @param {string} name - 真实姓名
- * @author steelwei
- */
-export function updateName(name) {
-  return request({
-    url: '/fulfiller/fulfiller/my/name',
-    method: 'PUT',
-    data: { name }
-  })
-}
-
-/**
- * 修改工作状态
- * @param {string} status - 工作状态 (resting:休息, busy:接单中)
- * @author steelwei
- */
-export function updateStatus(status) {
-  return request({
-    url: '/fulfiller/fulfiller/my/status',
-    method: 'PUT',
-    data: { status }
-  })
-}
-
-/**
- * 修改工作城市/站点
- * @param {Object} data - 包含 cityCode cityName stationId 等
- * @author steelwei
- */
-export function updateCity(data) {
-  return request({
-    url: '/fulfiller/fulfiller/my/city',
-    method: 'PUT',
-    data
-  })
-}
-
-/**
- * 获取认证信息
- * @author steelwei
- */
-export function getAuthInfo() {
-  return request({
-    url: '/fulfiller/fulfiller/my/auth',
-    method: 'GET'
-  })
-}
-
-/**
- * 修改手机号
- * @param {string} phone - 新手机号
- * @param {string} code - 验证码
- * @author steelwei
- */
-export function updatePhone(phone, code) {
-  return request({
-    url: '/fulfiller/fulfiller/my/phone',
-    method: 'PUT',
-    data: { phone, code }
-  })
-}
-
-/**
- * 修改密码
- * @param {string} oldPassword - 旧密码
- * @param {string} newPassword - 新密码
- * @author steelwei
- */
-export function updatePassword(oldPassword, newPassword) {
-  return request({
-    url: '/fulfiller/fulfiller/my/password',
-    method: 'PUT',
-    data: { oldPassword, newPassword }
-  })
-}
-
-/**
- * 注销账号
- * @author steelwei
- */
-export function deleteAccount() {
-  return request({
-    url: '/fulfiller/fulfiller/my/account',
-    method: 'DELETE'
-  })
-}
-
-/**
- * 更新认证信息
- * @param {Object} data - 认证数据
- * @author steelwei
- */
-export function updateAuthInfo(data) {
-  return request({
-    url: '/fulfiller/fulfiller/my/auth',
-    method: 'POST',
-    data
-  })
-}
-
-/**
- * 获取待接单列表
- * @param {Object} params - { service, minPrice, maxPrice, pageNum, pageSize }
- */
-export function getPendingOrders(params) {
-  return request({
-    url: '/order/subOrder/listPendingAccept',
-    method: 'GET',
-    data: params
-  })
-}
-
-/**
- * 接单
- * @param {number} orderId - 订单ID
- */
-export function acceptOrder(orderId) {
-  return request({
-    url: '/order/subOrder/accept',
-    method: 'PUT',
-    data: { orderId }
-  })
-}
-
-/**
- * 获取订单统计数据
- */
-export function getOrderCount() {
-  return request({
-    url: '/order/subOrder/count',
-    method: 'GET'
-  })
-}
-
-/**
- * 获取订单统计数据(含奖励、惩罚、拒单等合计)
- */
-export function getOrderStats() {
-  return request({
-    url: '/order/subOrderLog/count',
-    method: 'GET'
-  })
-}
-
-/**
- * 分页获取统计页面的订单列表
- * @param {Object} params - { status, pageNum, pageSize }
- */
-export function getStatisticOrders(params) {
-  return request({
-    url: '/order/subOrder/listOnStatistic',
-    method: 'GET',
-    data: params
-  })
-}
-
-/**
- * 获取我的订单列表
- * @param {Object} params - { status, content, service, startServiceTime, endServiceTime }
- */
-export function getMyOrders(params) {
-  return request({
-    url: '/order/subOrder/listOnMyOrder',
-    method: 'GET',
-    data: params
-  })
-}
-
-/**
- * 获取订单详情
- * @param {number} id - 订单ID
- */
-export function getOrderInfo(id) {
-  return request({
-    url: `/order/subOrder/getInfo?id=${id}`,
-    method: 'GET'
-  })
-}
-
-/**
- * 获取订单日志列表
- * @param {string} orderId - 订单ID
- */
-export function getOrderLogs(orderId) {
-  return request({
-    url: `/order/subOrderLog/list?orderId=${orderId}`,
-    method: 'GET'
-  })
-}
-
-/**
- * 订单打卡
- * @param {Object} data - { orderId, photos, content, step, title, startFlag, endFlag }
- */
-export function clockIn(data) {
-  return request({
-    url: '/order/subOrder/clockIn',
-    method: 'PUT',
-    data
-  })
-}
-
-/**
- * 异常上报
- * @param {Object} data - { orderId, photos, type, content }
- */
-export function uploadAnamaly(data) {
-  return request({
-    url: '/fulfiller/anamaly/upload',
-    method: 'POST',
-    data
-  })
-}
-
-/**
- * 获取订单异常记录列表
- * @param {number} orderId - 订单ID
- */
-export function getAnomalyList(orderId) {
-  return request({
-    url: `/fulfiller/anamaly/listOnOrder?orderId=${orderId}`,
-    method: 'GET'
-  })
-}
-/**
- * 提交宠护小结
- * @param {Object} data - { orderId, content }
- */
-export function submitNursingSummary(data) {
-  return request({
-    url: '/order/subOrder/nursingSummary',
-    method: 'PUT',
-    data
-  })
-}
-
-/**
- * 获取所有等级配置列表
- */
-export function listAllLevelConfigs() {
-  return request({
-    url: '/fulfiller/levelConfig/listAll',
-    method: 'GET'
-  })
-}
-
-/**
- * 获取所有等级权益列表
- */
-export function listAllLevelRights() {
-  return request({
-    url: '/fulfiller/levelRights/listAll',
-    method: 'GET'
-  })
-}

+ 0 - 100
api/fulfiller/log/index.js

@@ -1,100 +0,0 @@
-import request from '@/utils/request';
-
-/**
- * 获取APP端余额及变动记录
- * @returns {Promise}
- */
-export function getBalanceOnApp() {
-    return request({
-        url: '/fulfiller/log/balanceOnApp',
-        method: 'GET'
-    });
-}
-
-/**
- * 分页获取APP端变动记录列表
- * @param {Object} data 
- * @returns {Promise}
- */
-export function pageBalanceOnApp(data) {
-    return request({
-        url: '/fulfiller/log/pageBalanceOnApp',
-        method: 'GET',
-        data
-    });
-}
-
-/**
- * 根据年月获取APP端变动记录列表
- * @param {Object} data 
- * @returns {Promise}
- */
-export function listBalanceOnApp(data) {
-    return request({
-        url: '/fulfiller/log/listBalanceOnApp',
-        method: 'GET',
-        data
-    });
-}
-
-/**
- * 获取APP端当前积分
- * @returns {Promise}
- */
-export function pointsOnApp() {
-    return request({
-        url: '/fulfiller/log/pointsOnApp',
-        method: 'GET'
-    });
-}
-
-/**
- * 分页获取APP端积分变动记录列表
- * @param {Object} data 
- * @returns {Promise}
- */
-export function pagePointsOnApp(data) {
-    return request({
-        url: '/fulfiller/log/pagePointsOnApp',
-        method: 'GET',
-        data
-    });
-}
-
-/**
- * 根据年月获取APP端积分变动记录列表
- * @param {Object} data 
- * @returns {Promise}
- */
-export function listPointsOnApp(data) {
-    return request({
-        url: '/fulfiller/log/listPointsOnApp',
-        method: 'GET',
-        data
-    });
-}
-/**
- * 获取APP端奖惩统计值
- * @param {Object} data 
- * @returns {Promise}
- */
-export function countOnAppReward(data) {
-    return request({
-        url: '/fulfiller/log/countOnAppReward',
-        method: 'GET',
-        data
-    });
-}
-
-/**
- * 获取APP端奖惩列表数据
- * @param {Object} data 
- * @returns {Promise}
- */
-export function listOnAppReward(data) {
-    return request({
-        url: '/fulfiller/log/listOnAppReward',
-        method: 'GET',
-        data
-    });
-}

+ 0 - 30
api/order/subOrder/index.js

@@ -1,30 +0,0 @@
-import request from '@/utils/request';
-
-/**
- * 取消订单
- * @param {Object} data - 请求参数
- * @param {number} data.orderId - 订单ID
- * @author antigravity
- */
-export function cancelOrderApi(data) {
-    return request({
-        url: '/order/subOrder/cancel',
-        method: 'PUT',
-        data
-    });
-}
-
-/**
- * 拒绝接单
- * @param {Object} data - 请求参数
- * @param {number} data.orderId - 订单ID
- * @param {string} data.rejectReason - 拒绝理由
- * @author antigravity
- */
-export function rejectOrderApi(data) {
-    return request({
-        url: '/order/subOrder/reject',
-        method: 'PUT',
-        data
-    });
-}

+ 0 - 6
api/service.js

@@ -1,6 +0,0 @@
-/**
- * 服务类型 API
- * @author steelwei
- */
-import request from '@/utils/request'
-

+ 0 - 15
api/service/list/index.js

@@ -1,15 +0,0 @@
-/**
- * 服务列表相关的 API
- */
-import request from '@/utils/request'
-
-/**
- * 获取所有服务类型列表
- * @returns {Promise} 响应数据
- */
-export function listAllService() {
-    return request({
-        url: '/service/list/listAll',
-        method: 'GET'
-    })
-}

+ 0 - 16
api/system/dict/index.js

@@ -1,16 +0,0 @@
-/**
- * 系统字典 API
- * @author steelwei
- */
-import request from '@/utils/request'
-
-/**
- * 根据字典类型获取字典数据
- * @param {string} dictType 字典类型
- */
-export function getDictDataByType(dictType) {
-    return request({
-        url: `/system/dict/data/type/${dictType}`,
-        method: 'GET'
-    })
-}

+ 99 - 99
components/custom-tabbar/index.vue

@@ -1,115 +1,115 @@
-<template>
-  <view class="custom-tabbar">
-    <view class="tabbar-border"></view>
-    <view class="tabbar-list">
-      <view
-        class="tabbar-item"
-        v-for="(item, index) in list"
-        :key="index"
-        @click="switchTab(item.pagePath)"
-      >
-        <image
-          class="tabbar-icon"
-          :src="currentPath === item.pagePath ? item.selectedIconPath : item.iconPath"
-        ></image>
+  <template>
+    <view class="custom-tabbar">
+      <view class="tabbar-border"></view>
+      <view class="tabbar-list">
         <view
-          class="tabbar-text"
-          :class="{'tabbar-text-active': currentPath === item.pagePath}"
+          class="tabbar-item"
+          v-for="(item, index) in list"
+          :key="index"
+          @click="switchTab(item.pagePath)"
         >
-          {{ item.text }}
+          <image
+            class="tabbar-icon"
+            :src="currentPath === item.pagePath ? item.selectedIconPath : item.iconPath"
+          ></image>
+          <view
+            class="tabbar-text"
+            :class="{'tabbar-text-active': currentPath === item.pagePath}"
+          >
+            {{ item.text }}
+          </view>
         </view>
       </view>
     </view>
-  </view>
-</template>
+  </template>
 
-<script setup>
-import { ref } from 'vue';
+  <script setup>
+  import { ref } from 'vue';
 
-const props = defineProps({
-  currentPath: {
-    type: String,
-    required: true
-  }
-});
+  const props = defineProps({
+    currentPath: {
+      type: String,
+      required: true
+    }
+  });
 
-const list = ref([
-  {
-    pagePath: "pages/home/index",
-    text: "任务中心",
-    iconPath: "/static/tabbar/home.svg",
-    selectedIconPath: "/static/tabbar/home-active.svg"
-  },
-  {
-    pagePath: "pages/orders/index",
-    text: "我的订单",
-    iconPath: "/static/tabbar/order.svg",
-    selectedIconPath: "/static/tabbar/order-active.svg"
-  },
-  {
-    pagePath: "pages/mine/index",
-    text: "我的",
-    iconPath: "/static/tabbar/mine.svg",
-    selectedIconPath: "/static/tabbar/mine-active.svg"
-  }
-]);
+  const list = ref([
+    {
+      pagePath: "pages/home/index",
+      text: "任务中心",
+      iconPath: "/static/tabbar/home.svg",
+      selectedIconPath: "/static/tabbar/home-active.svg"
+    },
+    {
+      pagePath: "pages/orders/index",
+      text: "我的订单",
+      iconPath: "/static/tabbar/order.svg",
+      selectedIconPath: "/static/tabbar/order-active.svg"
+    },
+    {
+      pagePath: "pages/mine/index",
+      text: "我的",
+      iconPath: "/static/tabbar/mine.svg",
+      selectedIconPath: "/static/tabbar/mine-active.svg"
+    }
+  ]);
 
-const switchTab = (path) => {
-  if (props.currentPath === path) return;
-  uni.switchTab({
-    url: '/' + path
-  });
-};
-</script>
+  const switchTab = (path) => {
+    if (props.currentPath === path) return;
+    uni.switchTab({
+      url: '/' + path
+    });
+  };
+  </script>
 
-<style scoped>
-.custom-tabbar {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  height: 50px;
-  background-color: #ffffff;
-  display: flex;
-  flex-direction: column;
-  z-index: 999;
-  padding-bottom: env(safe-area-inset-bottom);
-}
+  <style scoped>
+  .custom-tabbar {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 50px;
+    background-color: #ffffff;
+    display: flex;
+    flex-direction: column;
+    z-index: 999;
+    padding-bottom: env(safe-area-inset-bottom);
+  }
 
-.tabbar-border {
-  height: 1px;
-  background-color: rgba(0, 0, 0, 0.1);
-  transform: scaleY(0.5);
-}
+  .tabbar-border {
+    height: 1px;
+    background-color: rgba(0, 0, 0, 0.1);
+    transform: scaleY(0.5);
+  }
 
-.tabbar-list {
-  display: flex;
-  flex: 1;
-  align-items: center;
-  justify-content: space-around;
-}
+  .tabbar-list {
+    display: flex;
+    flex: 1;
+    align-items: center;
+    justify-content: space-around;
+  }
 
-.tabbar-item {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  height: 100%;
-  flex: 1;
-}
+  .tabbar-item {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+    flex: 1;
+  }
 
-.tabbar-icon {
-  width: 24px;
-  height: 24px;
-  margin-bottom: 2px;
-}
+  .tabbar-icon {
+    width: 24px;
+    height: 24px;
+    margin-bottom: 2px;
+  }
 
-.tabbar-text {
-  font-size: 10px;
-  color: #999999;
-}
+  .tabbar-text {
+    font-size: 10px;
+    color: #999999;
+  }
 
-.tabbar-text-active {
-  color: #FF5722;
-}
-</style>
+  .tabbar-text-active {
+    color: #FF5722;
+  }
+  </style>

+ 5 - 2
manifest.json

@@ -18,7 +18,8 @@
         },
         /* 模块配置 */
         "modules" : {
-            "Camera" : {}
+            "Camera" : {},
+            "VideoPlayer" : {}
         },
         /* 应用发布信息 */
         "distribute" : {
@@ -47,7 +48,9 @@
                 "dSYMs" : false
             },
             /* SDK配置 */
-            "sdkConfigs" : {},
+            "sdkConfigs" : {
+                "geolocation" : {}
+            },
             "icons" : {
                 "android" : {
                     "hdpi" : "unpackage/res/icons/72x72.png",

+ 6 - 0
pages.json

@@ -244,6 +244,12 @@
 			"style": {
 				"navigationStyle": "custom"
 			}
+		},
+		{
+			"path": "pages/mine/settings/about/agreement-detail",
+			"style": {
+				"navigationStyle": "custom"
+			}
 		}
 	],
 	"globalStyle": {

+ 2 - 2
pages/home/index.vue

@@ -150,7 +150,7 @@
                         <view class="route-info">
                             <template v-if="item.type === 1">
                                 <view class="route-item" @click.stop="openNavigation(item, 'start')">
-                                    <view class="icon-circle start"></view>
+                                    <view class="icon-circle start"></view>
                                     <view class="route-line-vertical"></view>
                                     <view class="address-box">
                                         <text class="addr-title">{{ item.startLocation }}</text>
@@ -160,7 +160,7 @@
                                 </view>
 
                                 <view class="route-item" @click.stop="openNavigation(item, 'end')">
-                                    <view class="icon-circle end"></view>
+                                    <view class="icon-circle end"></view>
                                     <view class="address-box">
                                         <text class="addr-title">{{ item.endLocation }}</text>
                                         <text class="addr-desc">{{ item.endAddress }}</text>

+ 89 - 23
pages/home/logic.js

@@ -1,7 +1,7 @@
-import { getMyProfile, getPendingOrders, acceptOrder, getOrderCount } from '@/api/fulfiller'
-import { listAllService } from '@/api/service/list/index'
-
-import { rejectOrderApi } from '@/api/order/subOrder/index.js'
+import { getMyProfile } from '@/api/fulfiller/fulfiller'
+import { getPendingOrders, acceptOrder, getOrderCount, rejectOrderApi } from '@/api/order/subOrder'
+import { listAllService } from '@/api/service/list'
+import { getAreaStationList } from '@/api/system/areaStation'
 import { isLoggedIn } from '@/utils/auth'
 import customTabbar from '@/components/custom-tabbar/index.vue'
 
@@ -100,12 +100,41 @@ export default {
             try {
                 const res = await getMyProfile()
                 const data = res.data || null
-                this.profile = data
-                // 以服务器返回的状态为准进行更新
-                if (data && data.status) {
-                    this.workStatus = data.status;
-                    uni.setStorageSync('workStatus', data.status);
+                
+                if (data) {
+                    // 以服务器返回的状态为准进行更新
+                    if (data.status) {
+                        this.workStatus = data.status;
+                        uni.setStorageSync('workStatus', data.status);
+                    }
+
+                    // 需求:头部的接单城市使用站点往上找到城市,而非直接显示站点
+                    if (data.stationId) {
+                        try {
+                            const stationRes = await getAreaStationList();
+                            const list = stationRes.data || [];
+                            const currentStation = list.find(i => i.id === data.stationId);
+                            if (currentStation) {
+                                // 向上溯源:直到找到 parentId 为 0 的节点(即顶层城市)
+                                let node = currentStation;
+                                while (node && node.parentId !== 0) {
+                                    let parent = list.find(i => i.id === node.parentId);
+                                    if (parent) {
+                                        node = parent;
+                                    } else {
+                                        break;
+                                    }
+                                }
+                                // 将溯源到的节点名称作为显示城市
+                                data.cityName = node.name;
+                            }
+                        } catch (e) {
+                            console.error('溯源城市失败:', e);
+                        }
+                    }
                 }
+                
+                this.profile = data
             } catch (err) {
                 console.error('获取个人信息失败:', err)
             } finally {
@@ -234,20 +263,51 @@ export default {
         chooseMap(mapType) {
             let item = this.navTargetItem;
             let pointType = this.navTargetPointType;
-            let name = pointType === 'start' ? item.startLocation : item.endLocation;
-            let address = pointType === 'start' ? item.startAddress : item.endAddress;
+            // 起 -> fromAddress ; 终 -> toAddress
+            let name = pointType === 'start' ? (item.fromAddress || '起点') : (item.toAddress || '终点');
+            let address = pointType === 'start' ? (item.fromAddress || '起点地址') : (item.toAddress || '终点地址');
+            let latitude = pointType === 'start' ? Number(item.fromLat) : Number(item.toLat);
+            let longitude = pointType === 'start' ? Number(item.fromLng) : Number(item.toLng);
 
             this.showNavModal = false;
 
-            uni.openLocation({
-                latitude: 30.52, // Mock lat
-                longitude: 114.31, // Mock lng
-                name: name || '目的地',
-                address: address || '默认地址',
-                success: function () {
-                    console.log('打开导航成功: ' + mapType);
-                }
-            });
+            // 统一定义打开地图的函数
+            const navigateTo = (lat, lng, addrName, addrDesc) => {
+                uni.openLocation({
+                    latitude: lat,
+                    longitude: lng,
+                    name: addrName,
+                    address: addrDesc || '无法获取详细地址',
+                    success: function () {
+                        console.log('打开导航成功: ' + mapType);
+                    },
+                    fail: function (err) {
+                        console.error('打开导航失败:', err);
+                        uni.showToast({ title: '打开地图失败', icon: 'none' });
+                    }
+                });
+            };
+
+            // 如果有目标经纬度,直接打开
+            if (latitude && longitude && !isNaN(latitude) && !isNaN(longitude)) {
+                navigateTo(latitude, longitude, name, address);
+            } else {
+                // 如果没有经纬度,按照需求:使用自己当前的经纬度,然后搜索 fromAddress 或者 toAddress
+                uni.showLoading({ title: '获取当前位置...', mask: true });
+                uni.getLocation({
+                    type: 'gcj02',
+                    success: (res) => {
+                        uni.hideLoading();
+                        // 使用用户当前经纬度作为锚点打开地图,展示目标地址信息
+                        navigateTo(res.latitude, res.longitude, name, address);
+                    },
+                    fail: (err) => {
+                        uni.hideLoading();
+                        console.error('获取地理位置失败:', err);
+                        uni.showToast({ title: '无法获取当前位置信息', icon: 'none' });
+                    }
+                });
+            }
         },
         selectService(type) {
             this.tempFilter.service = type;
@@ -334,11 +394,17 @@ export default {
                 petRemark: '',
                 petTags: [],
                 petLogs: [],
-                startLocation: isRoundTrip ? item.fromAddress : '',
-                startAddress: isRoundTrip ? item.fromAddress : '',
+                startLocation: item.fromAddress || '暂无起点',
+                startAddress: item.fromAddress || '',
+                fromAddress: item.fromAddress || '',
+                fromLat: item.fromLat,
+                fromLng: item.fromLng,
                 startDistance: '0km',
                 endLocation: (item.customerName || item.contact || '') + ' ' + (item.customerPhone || ''),
-                endAddress: item.toAddress,
+                endAddress: item.toAddress || '',
+                toAddress: item.toAddress || '',
+                toLat: item.toLat,
+                toLng: item.toLng,
                 endDistance: '0km',
                 serviceContent: '',
                 remark: item.remark || ''

+ 1 - 1
pages/home/work-status.vue

@@ -34,7 +34,7 @@
 </template>
 
 <script>
-import { updateStatus, getMyProfile } from '@/api/fulfiller'
+import { updateStatus, getMyProfile } from '@/api/fulfiller/fulfiller'
 
 export default {
     data() {

+ 21 - 5
pages/login/logic.js

@@ -1,4 +1,6 @@
-import { loginByPassword, loginBySms, sendSmsCode } from '@/api/auth'
+import { loginByPassword, loginBySms } from '@/api/auth'
+import { sendSmsCode } from '@/api/resource/sms'
+import { getAgreement } from '@/api/system/agreement'
 import { setToken } from '@/utils/auth'
 import { startGpsTimer } from '@/utils/gps'
 
@@ -14,7 +16,8 @@ export default {
             countDown: 0,
             timer: null,
             showAgreementModal: false,
-            currentAgreementId: '', // 当前显示的协议ID
+            agreementTitle: '',    // 协议标题
+            agreementContent: '',  // 协议内容
             loginLoading: false
         }
     },
@@ -23,9 +26,22 @@ export default {
          * 显示协议弹窗
          * @param {Number} id 协议ID (1: 用户服务协议, 2: 隐私政策)
          */
-        showAgreement(id) {
-            this.currentAgreementId = id;
-            this.showAgreementModal = true;
+        async showAgreement(id) {
+            try {
+                uni.showLoading({ title: '加载中...' });
+                const res = await getAgreement(id);
+                if (res.code === 200 && res.data) {
+                    this.agreementTitle = res.data.title;
+                    this.agreementContent = res.data.content;
+                    this.showAgreementModal = true;
+                } else {
+                    uni.showToast({ title: res.msg || '获取协议失败', icon: 'none' });
+                }
+            } catch (err) {
+                console.error('获取协议详情失败:', err);
+            } finally {
+                uni.hideLoading();
+            }
         },
         /* async getVerifyCode() {
             if (this.currentTab === 1) return;

+ 3 - 2
pages/login/login.vue

@@ -138,7 +138,8 @@
       <!-- 协议弹窗 公共组件 -->
       <agreement 
         :visible="showAgreementModal" 
-        :agreement-id="currentAgreementId"
+        :title="agreementTitle"
+        :content="agreementContent"
         @close="showAgreementModal = false"
       >
       </agreement>
@@ -149,7 +150,7 @@
 <script>
 // 使用脚本文件
 import logic from './logic.js';
-import Agreement from '@/src/components/agreement/index.vue';
+import Agreement from '@/components/agreement/index.vue';
 
 export default {
     ...logic,

+ 4 - 3
pages/mine/index.vue

@@ -108,17 +108,18 @@
                 <text class="menu-text">我的奖惩</text>
                 <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
             </view>
-            <view class="menu-item" @click="openServicePopup">
+            <!-- <view class="menu-item" @click="openServicePopup">
                 <image class="menu-icon" src="/static/icons/headset_linear.svg"></image>
                 <text class="menu-text">联系客服</text>
                 <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
-            </view>
+            </view> -->
         </view>
 
         <!-- 退出登录 -->
         <!-- 退出登录 -->
+        <!-- <view class="logout-btn" @click="logout">退出登录</view>
+        <view class="dev-tip">本APP部分功能开发当中,请只进行修改个人信息、修改设置、完成订单流程操作</view> -->
         <view class="logout-btn" @click="logout">退出登录</view>
-        <view class="dev-tip">本APP部分功能开发当中,请只进行修改个人信息、修改设置、完成订单流程操作</view>
 
 
         <!-- 联系客服弹窗 -->

+ 3 - 1
pages/mine/level/index.vue

@@ -90,7 +90,9 @@
 </template>
 
 <script>
-import { getMyProfile, listAllLevelConfigs, listAllLevelRights } from '@/api/fulfiller'
+import { getMyProfile } from '@/api/fulfiller/fulfiller'
+import { listAllLevelConfigs } from '@/api/fulfiller/levelConfig'
+import { listAllLevelRights } from '@/api/fulfiller/levelRights'
 
 export default {
     data() {

+ 2 - 1
pages/mine/logic.js

@@ -1,5 +1,6 @@
 import { logout as logoutApi } from '@/api/auth'
-import { getMyProfile, listAllLevelConfigs } from '@/api/fulfiller'
+import { getMyProfile } from '@/api/fulfiller/fulfiller'
+import { listAllLevelConfigs } from '@/api/fulfiller/levelConfig'
 import { clearAuth, isLoggedIn } from '@/utils/auth'
 import customTabbar from '@/components/custom-tabbar/index.vue'
 

+ 3 - 2
pages/mine/order-stats.vue

@@ -118,8 +118,9 @@
 </template>
 
 <script>
-import { getOrderStats, getStatisticOrders } from '@/api/fulfiller';
-import { listAllService } from '@/api/service/list/index';
+import { getOrderStats } from '@/api/order/subOrderLog';
+import { getStatisticOrders } from '@/api/order/subOrder';
+import { listAllService } from '@/api/service/list';
 
 
 export default {

+ 1 - 1
pages/mine/points/detail.vue

@@ -80,7 +80,7 @@
 </template>
 
 <script>
-import { listPointsOnApp } from '@/api/fulfiller/log/index.js';
+import { listPointsOnApp } from '@/api/fulfiller/log';
 
 import fulfillerEnum from '@/enums/fulfiller.json';
 

+ 1 - 1
pages/mine/points/index.vue

@@ -77,7 +77,7 @@
 </template>
 
 <script>
-import { pointsOnApp, pagePointsOnApp } from '@/api/fulfiller/log/index.js';
+import { pointsOnApp, pagePointsOnApp } from '@/api/fulfiller/log';
 
 import fulfillerEnum from '@/enums/fulfiller.json';
 

+ 1 - 1
pages/mine/rewards-all.vue

@@ -62,7 +62,7 @@
 </template>
 
 <script>
-import { listOnAppReward } from '@/api/fulfiller/log/index.js';
+import { listOnAppReward } from '@/api/fulfiller/log';
 import fulfillerEnum from '@/enums/fulfiller.json';
 
 const bizTypeMap = fulfillerEnum.FlfRewardBizType;

+ 1 - 1
pages/mine/rewards.vue

@@ -125,7 +125,7 @@
 </template>
 
 <script>
-import { countOnAppReward, listOnAppReward } from '@/api/fulfiller/log/index.js';
+import { countOnAppReward, listOnAppReward } from '@/api/fulfiller/log';
 import fulfillerEnum from '@/enums/fulfiller.json';
 
 const bizTypeMap = fulfillerEnum.FlfRewardBizType;

+ 33 - 9
pages/mine/settings/about/index.vue

@@ -12,26 +12,26 @@
 
         <view class="logo-area">
             <image class="app-logo" src="/static/logo.png" mode="aspectFit"></image>
-            <text class="app-name">履约者APP</text>
-            <text class="app-version">Version 2.0.6</text>
+            <text class="app-name">履约者</text>
+            <text class="app-version">Version {{ version }}</text>
         </view>
 
         <view class="group-card">
-            <view class="list-item">
+            <view class="list-item" @click="goToDetail(1)">
                 <text class="item-title">服务协议</text>
                 <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
             </view>
-            <view class="list-item">
+            <view class="list-item" @click="goToDetail(2)">
                 <text class="item-title">隐私政策</text>
                 <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
             </view>
-            <view class="list-item no-border">
+            <!-- <view class="list-item no-border" @click="checkUpdate">
                 <text class="item-title">版本更新</text>
                 <view class="item-right">
                     <view class="badge-yellow">1</view>
                     <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
                 </view>
-            </view>
+            </view> -->
         </view>
         
     </view>
@@ -40,13 +40,37 @@
 <script>
 export default {
     data() {
-        return {}
+        return {
+            version: '2.0.6'
+        }
+    },
+    onLoad() {
+        this.getAppVersion();
     },
     methods: {
         navBack() {
              uni.navigateBack({
                 delta: 1
             });
+        },
+        goToDetail(id) {
+            uni.navigateTo({
+                url: `/pages/mine/settings/about/agreement-detail?id=${id}`
+            });
+        },
+        checkUpdate() {
+            uni.showToast({ title: '已是最新版本', icon: 'none' });
+        },
+        getAppVersion() {
+            // #ifdef APP-PLUS
+            plus.runtime.getProperty(plus.runtime.appid, (widgetInfo) => {
+                this.version = widgetInfo.version || '2.0.6';
+            });
+            // #endif
+            // #ifndef APP-PLUS
+            const systemInfo = uni.getSystemInfoSync();
+            this.version = systemInfo.appVersion || '2.0.6';
+            // #endif
         }
     }
 }
@@ -70,7 +94,7 @@ page {
     justify-content: space-between;
     padding-left: 30rpx;
     padding-right: 30rpx;
-    box-sizing: border-box;
+    box-sizing: content-box;
     z-index: 100;
 }
 .header-placeholder {
@@ -98,7 +122,7 @@ page {
     flex-direction: column;
     align-items: center;
     justify-content: center;
-    padding: 60rpx 0;
+    padding: 100rpx 0 60rpx;
 }
 .app-logo {
     width: 160rpx;

+ 2 - 1
pages/mine/settings/auth/edit.vue

@@ -103,7 +103,8 @@
 </template>
 
 <script>
-import { getAuthInfo, uploadFile, updateAuthInfo, getServiceTypes } from '@/api/fulfiller'
+import { getAuthInfo, updateAuthInfo } from '@/api/fulfiller/fulfiller'
+import { uploadFile, getServiceTypes } from '@/api/fulfiller/app'
 
 export default {
   data() {

+ 1 - 1
pages/mine/settings/auth/index.vue

@@ -86,7 +86,7 @@
 </template>
 
 <script>
-import { getAuthInfo } from '@/api/fulfiller'
+import { getAuthInfo } from '@/api/fulfiller/fulfiller'
 
 export default {
     data() {

+ 77 - 9
pages/mine/settings/index.vue

@@ -20,13 +20,13 @@
                 <text class="item-title">认证信息</text>
                 <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
             </view>
-            <view class="list-item" @click="navTo('bank')">
+            <!-- <view class="list-item" @click="navTo('bank')">
                 <text class="item-title">银行卡信息</text>
                 <view class="item-right">
                     <view class="tag-status">已完善</view>
                     <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
                 </view>
-            </view>
+            </view> -->
             <view class="list-item no-border" @click="navTo('security')">
                 <text class="item-title">账号与安全</text>
                 <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
@@ -35,31 +35,31 @@
 
         <!-- 应用设置组 -->
         <view class="group-card">
-            <view class="list-item" @click="navTo('push')">
+            <!-- <view class="list-item" @click="navTo('push')">
                 <text class="item-title">推送通知</text>
                 <view class="item-right">
                     <text class="item-value">部分开启</text>
                     <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
                 </view>
-            </view>
+            </view> -->
             <view class="list-item">
                 <view class="item-row-left">
                     <text class="item-title">位置上报</text>
                     <text class="item-subtitle">每隔20分钟自动上报位置</text>
                 </view>
-                <switch checked color="#FF5722" style="transform:scale(0.8)"/>
+                <switch :checked="isGpsEnabled" color="#FF5722" style="transform:scale(0.8)" @change="onGpsSwitchChange"/>
             </view>
             <view class="list-item" @click="clearCache">
                 <text class="item-title">清理缓存</text>
                 <view class="item-right">
-                    <text class="item-value">105.14MB</text>
+                    <text class="item-value">{{ cacheSize }}</text>
                     <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
                 </view>
             </view>
             <view class="list-item no-border" @click="navTo('about')">
                 <text class="item-title">关于我们</text>
                  <view class="item-right">
-                    <text class="item-value">v2.0.6</text>
+                    <text class="item-value">v{{ version }}</text>
                     <image class="arrow-icon" src="/static/icons/chevron_right.svg"></image>
                 </view>
             </view>
@@ -69,9 +69,19 @@
 </template>
 
 <script>
+import { startGpsTimer, stopGpsTimer } from '@/utils/gps'
 export default {
     data() {
-        return {}
+        return {
+            version: '2.0.6',
+            cacheSize: '0B',
+            // 明确默认状态为开启:获取不到缓存即为 true,以此确保默认值为开启。
+            isGpsEnabled: uni.getStorageSync('GPS_REPORT_ENABLED') !== false
+        }
+    },
+    onLoad() {
+        this.getAppVersion();
+        this.getCacheSize();
     },
     methods: {
         navBack() {
@@ -107,7 +117,65 @@ export default {
             uni.navigateTo({ url });
         },
         clearCache() {
-            uni.showToast({ title: '缓存已清理', icon: 'none' });
+            uni.showModal({
+                title: '清理缓存',
+                content: '确定要清理应用缓存吗?',
+                success: (res) => {
+                    if (res.confirm) {
+                        try {
+                            // 排除 token 等关键数据的清理方案,取决于实际需求。通常清除所有 Storage
+                            // 为了安全起见只同步清理所有,或者根据业务决定
+                            const token = uni.getStorageSync('Authorization_token') // 假设 token 名
+                            const gpsToggle = uni.getStorageSync('GPS_REPORT_ENABLED')
+
+                            uni.clearStorageSync();
+
+                            // 恢复关键数据以便不用退出重新登录
+                            if (token) uni.setStorageSync('Authorization_token', token)
+                            uni.setStorageSync('GPS_REPORT_ENABLED', gpsToggle)
+
+                            uni.showToast({ title: '清理完成', icon: 'success' });
+                            this.getCacheSize();
+                        } catch (err) {
+                            console.error('清理缓存失败:', err);
+                        }
+                    }
+                }
+            });
+        },
+        getCacheSize() {
+            try {
+                const res = uni.getStorageInfoSync();
+                const kb = res.currentSize;
+                if (kb < 1024) {
+                    this.cacheSize = kb + 'KB';
+                } else {
+                    this.cacheSize = (kb / 1024).toFixed(2) + 'MB';
+                }
+            } catch (err) {
+                this.cacheSize = '0B';
+            }
+        },
+        getAppVersion() {
+            // #ifdef APP-PLUS
+            plus.runtime.getProperty(plus.runtime.appid, (widgetInfo) => {
+                this.version = widgetInfo.version || '2.0.6';
+            });
+            // #endif
+            // #ifndef APP-PLUS
+            const systemInfo = uni.getSystemInfoSync();
+            this.version = systemInfo.appVersion || '2.0.6';
+            // #endif
+        },
+        onGpsSwitchChange(e) {
+            const val = e.detail.value;
+            this.isGpsEnabled = val;
+            uni.setStorageSync('GPS_REPORT_ENABLED', val);
+            if (val) {
+                startGpsTimer();
+            } else {
+                stopGpsTimer();
+            }
         }
     }
 }

+ 1 - 1
pages/mine/settings/profile/edit-name.vue

@@ -37,7 +37,7 @@
 
 <script>
 // 引入 API @author steelwei
-import { updateName } from '@/api/fulfiller'
+import { updateName } from '@/api/fulfiller/fulfiller'
 
 export default {
     data() {

+ 37 - 2
pages/mine/settings/profile/index.vue

@@ -112,7 +112,8 @@
 
 <script>
 // 引入 API @author steelwei
-import { getMyProfile, updateAvatar, updateName, updateStatus, updateCity, uploadFile } from '@/api/fulfiller'
+import { getMyProfile, updateAvatar, updateName, updateStatus, updateCity } from '@/api/fulfiller/fulfiller'
+import { uploadFile } from '@/api/fulfiller/app'
 import { getAreaStationList } from '@/api/system/areaStation'
 
 export default {
@@ -162,8 +163,18 @@ export default {
                         city: data.cityName || '',
                         avatar: data.avatarUrl || '/static/touxiang.png',
                         stationName: data.stationName || '',
-                        stationFullName: data.cityName && data.stationName ? `${data.cityName}/${data.stationName}` : (data.stationName || '未分配站点')
+                        stationFullName: '加载中...'
                     };
+                    
+                    // 异步查找完整路径
+                    if (data.stationId) {
+                        if (this.fullTree.length === 0) {
+                            await this.loadAreaStationTree();
+                        }
+                        this.userInfo.stationFullName = this.findStationFullName(data.stationId, this.fullTree) || data.stationName || '未分配站点';
+                    } else {
+                        this.userInfo.stationFullName = '未分配站点';
+                    }
                 } else {
                     uni.showToast({ title: res.msg || '加载失败', icon: 'none' });
                 }
@@ -185,6 +196,30 @@ export default {
             return statusMap[status] || status;
         },
         
+        // 查找站点完整路径 (城市/区域/站点) @author steelwei
+        findStationFullName(stationId, tree) {
+            if (!stationId || !tree || tree.length === 0) return '';
+            
+            let path = [];
+            const dfs = (nodes, targetId, currentPath) => {
+                for (let node of nodes) {
+                    if (node.id === targetId) {
+                        path = [...currentPath, node.name];
+                        return true;
+                    }
+                    if (node.children && node.children.length > 0) {
+                        if (dfs(node.children, targetId, [...currentPath, node.name])) {
+                            return true;
+                        }
+                    }
+                }
+                return false;
+            };
+            
+            dfs(tree, stationId, []);
+            return path.join('/');
+        },
+        
         navBack() {
             uni.navigateBack({ delta: 1 });
         },

+ 1 - 1
pages/mine/settings/security/change-password.vue

@@ -51,7 +51,7 @@
 
 <script>
 // 引入 API @author steelwei
-import { updatePassword } from '@/api/fulfiller'
+import { updatePassword } from '@/api/fulfiller/fulfiller'
 
 export default {
     data() {

+ 1 - 1
pages/mine/settings/security/change-phone.vue

@@ -54,7 +54,7 @@
 
 <script>
 // 引入 API @author steelwei
-import { updatePhone } from '@/api/fulfiller'
+import { updatePhone } from '@/api/fulfiller/fulfiller'
 
 export default {
     data() {

+ 1 - 1
pages/mine/settings/security/index.vue

@@ -39,7 +39,7 @@
 </template>
 
 <script>
-import { getMyProfile, deleteAccount } from '@/api/fulfiller'
+import { getMyProfile, deleteAccount } from '@/api/fulfiller/fulfiller'
 
 export default {
     data() {

+ 1 - 1
pages/mine/wallet/bill.vue

@@ -80,7 +80,7 @@
 </template>
 
 <script>
-import { listBalanceOnApp } from '@/api/fulfiller/log/index.js';
+import { listBalanceOnApp } from '@/api/fulfiller/log';
 
 import fulfillerEnum from '@/enums/fulfiller.json';
 

+ 1 - 1
pages/mine/wallet/index.vue

@@ -88,7 +88,7 @@
 </template>
 
 <script>
-import { getBalanceOnApp, pageBalanceOnApp } from '@/api/fulfiller/log/index.js';
+import { getBalanceOnApp, pageBalanceOnApp } from '@/api/fulfiller/log';
 
 import fulfillerEnum from '@/enums/fulfiller.json';
 

+ 3 - 2
pages/orders/anomaly.vue

@@ -87,8 +87,9 @@
 </template>
 
 <script>
-import { getDictDataByType } from '@/api/system/dict/index'
-import { uploadFile, uploadAnamaly } from '@/api/fulfiller'
+import { getDictDataByType } from '@/api/system/dict'
+import { uploadFile } from '@/api/fulfiller/app'
+import { uploadAnamaly } from '@/api/fulfiller/anamaly'
 
 export default {
     data() {

+ 57 - 17
pages/orders/detail-logic.js

@@ -1,12 +1,15 @@
-import { getOrderInfo, getOrderLogs, uploadFile, clockIn, getAnomalyList, submitNursingSummary } from '@/api/fulfiller'
-import { listAllService } from '@/api/service/list/index'
+import { getOrderInfo, clockIn, submitNursingSummary } from '@/api/order/subOrder'
+import { getOrderLogs } from '@/api/order/subOrderLog'
+import { uploadFile } from '@/api/fulfiller/app'
+import { getAnomalyList } from '@/api/fulfiller/anamaly'
+import { listAllService } from '@/api/service/list'
 
 
 
 
-import { getDictDataByType } from '@/api/system/dict/index'
-import { getPetDetail, submitPetRemark as apiSubmitPetRemark } from '@/api/archieves/pet/index'
-import { listChangeLog } from '@/api/archieves/changeLog/index'
+import { getDictDataByType } from '@/api/system/dict'
+import { getPetDetail, submitPetRemark as apiSubmitPetRemark } from '@/api/archieves/pet'
+import { listChangeLog } from '@/api/archieves/changeLog'
 
 export default {
     data() {
@@ -290,10 +293,16 @@ export default {
                 petName: order.petName || order.contact || '',
                 petBreed: order.breed || '',
                 serviceTag: order.groupPurchasePackageName || '',
-                startLocation: order.fromAddress || '',
+                startLocation: order.fromAddress || '暂无起点',
                 startAddress: order.fromAddress || '',
+                fromAddress: order.fromAddress || '',
+                fromLat: order.fromLat,
+                fromLng: order.fromLng,
                 endLocation: (order.contact || '') + ' ' + (order.contactPhoneNumber || ''),
                 endAddress: order.toAddress || '',
+                toAddress: order.toAddress || '',
+                toLat: order.toLat,
+                toLng: order.toLng,
                 customerPhone: order.contactPhoneNumber || '',
                 ownerName: order.contact || '', // 宠主姓名(默认使用客户姓名)
                 serviceContent: '',
@@ -510,20 +519,51 @@ export default {
         },
         chooseMap(mapType) {
             let pointType = this.navTargetPointType;
-            let name = pointType === 'start' ? this.orderDetail.startLocation : this.orderDetail.endLocation;
-            let address = pointType === 'start' ? this.orderDetail.startAddress : this.orderDetail.endAddress;
+            // 起 -> fromAddress ; 终 -> toAddress
+            let name = pointType === 'start' ? (this.orderDetail.fromAddress || '起点') : (this.orderDetail.toAddress || '终点');
+            let address = pointType === 'start' ? (this.orderDetail.fromAddress || '起点地址') : (this.orderDetail.toAddress || '终点地址');
+            let latitude = pointType === 'start' ? Number(this.orderDetail.fromLat) : Number(this.orderDetail.toLat);
+            let longitude = pointType === 'start' ? Number(this.orderDetail.fromLng) : Number(this.orderDetail.toLng);
 
             this.showNavModal = false;
 
-            uni.openLocation({
-                latitude: 30.52, // Mock lat
-                longitude: 114.31, // Mock lng
-                name: name || '目的地',
-                address: address || '默认地址',
-                success: function () {
-                    console.log('打开导航成功: ' + mapType);
-                }
-            });
+            // 统一定义打开地图的函数
+            const navigateTo = (lat, lng, addrName, addrDesc) => {
+                uni.openLocation({
+                    latitude: lat,
+                    longitude: lng,
+                    name: addrName,
+                    address: addrDesc || '无法获取详细地址',
+                    success: function () {
+                        console.log('打开导航成功: ' + mapType);
+                    },
+                    fail: function (err) {
+                        console.error('打开导航失败:', err);
+                        uni.showToast({ title: '打开地图失败', icon: 'none' });
+                    }
+                });
+            };
+
+            // 如果有目标经纬度,直接打开
+            if (latitude && longitude && !isNaN(latitude) && !isNaN(longitude)) {
+                navigateTo(latitude, longitude, name, address);
+            } else {
+                // 如果没有经纬度,按照需求:使用自己当前的经纬度,然后搜索 fromAddress 或者 toAddress
+                uni.showLoading({ title: '获取当前位置...', mask: true });
+                uni.getLocation({
+                    type: 'gcj02',
+                    success: (res) => {
+                        uni.hideLoading();
+                        // 使用用户当前经纬度作为锚点打开地图,展示目标地址信息
+                        navigateTo(res.latitude, res.longitude, name, address);
+                    },
+                    fail: (err) => {
+                        uni.hideLoading();
+                        console.error('获取地理位置失败:', err);
+                        uni.showToast({ title: '无法获取当前位置信息', icon: 'none' });
+                    }
+                });
+            }
         },
         openUploadModal() {
             this.modalMediaList = [];

+ 2 - 2
pages/orders/index.vue

@@ -106,7 +106,7 @@
                     <view class="route-info">
                         <template v-if="item.type === 1">
                             <view class="route-item" @click.stop="openNavigation(item, 'start')">
-                                <view class="icon-circle start"></view>
+                                <view class="icon-circle start"></view>
                                 <view class="route-line-vertical"></view>
                                 <view class="address-box">
                                     <text class="addr-title">{{ item.startLocation }}</text>
@@ -116,7 +116,7 @@
                             </view>
 
                             <view class="route-item" @click.stop="openNavigation(item, 'end')">
-                                <view class="icon-circle end"></view>
+                                <view class="icon-circle end"></view>
                                 <view class="address-box">
                                     <text class="addr-title">{{ item.endLocation }}</text>
                                     <text class="addr-desc">{{ item.endAddress }}</text>

+ 53 - 16
pages/orders/logic.js

@@ -1,7 +1,5 @@
-import { getMyOrders } from '@/api/fulfiller'
-import { listAllService } from '@/api/service/list/index'
-
-import { cancelOrderApi } from '@/api/order/subOrder/index.js'
+import { getMyOrders, cancelOrderApi } from '@/api/order/subOrder'
+import { listAllService } from '@/api/service/list'
 import customTabbar from '@/components/custom-tabbar/index.vue'
 
 export default {
@@ -137,11 +135,17 @@ export default {
                 petAvatarUrl: order.petAvatarUrl || '',
                 petName: order.petName || '',
                 petBreed: order.breed || '',
-                startLocation: order.fromAddress || '',
+                startLocation: order.fromAddress || '暂无起点',
                 startAddress: order.fromAddress || '',
+                fromAddress: order.fromAddress || '',
+                fromLat: order.fromLat,
+                fromLng: order.fromLng,
                 startDistance: '0km',
                 endLocation: (order.customerName || '') + ' ' + (order.customerPhone || ''),
                 endAddress: order.toAddress || '',
+                toAddress: order.toAddress || '',
+                toLat: order.toLat,
+                toLng: order.toLng,
                 customerPhone: order.customerPhone || '',
                 endDistance: '0km',
                 serviceContent: order.remark || '',
@@ -198,18 +202,51 @@ export default {
         chooseMap(mapType) {
             let item = this.navTargetItem;
             let pointType = this.navTargetPointType;
-            let name = pointType === 'start' ? item.startLocation : item.endLocation;
-            let address = pointType === 'start' ? item.startAddress : item.endAddress;
+            // 起 -> fromAddress ; 终 -> toAddress
+            let name = pointType === 'start' ? (item.fromAddress || '起点') : (item.toAddress || '终点');
+            let address = pointType === 'start' ? (item.fromAddress || '起点地址') : (item.toAddress || '终点地址');
+            let latitude = pointType === 'start' ? Number(item.fromLat) : Number(item.toLat);
+            let longitude = pointType === 'start' ? Number(item.fromLng) : Number(item.toLng);
+
             this.showNavModal = false;
-            uni.openLocation({
-                latitude: 30.52,
-                longitude: 114.31,
-                name: name || '目的地',
-                address: address || '默认地址',
-                success: function () {
-                    console.log('打开导航成功: ' + mapType);
-                }
-            });
+
+            // 统一定义打开地图的函数
+            const navigateTo = (lat, lng, addrName, addrDesc) => {
+                uni.openLocation({
+                    latitude: lat,
+                    longitude: lng,
+                    name: addrName,
+                    address: addrDesc || '无法获取详细地址',
+                    success: function () {
+                        console.log('打开导航成功: ' + mapType);
+                    },
+                    fail: function (err) {
+                        console.error('打开导航失败:', err);
+                        uni.showToast({ title: '打开地图失败', icon: 'none' });
+                    }
+                });
+            };
+
+            // 如果有目标经纬度,直接打开
+            if (latitude && longitude && !isNaN(latitude) && !isNaN(longitude)) {
+                navigateTo(latitude, longitude, name, address);
+            } else {
+                // 如果没有经纬度,按照需求:使用自己当前的经纬度,然后搜索 fromAddress 或者 toAddress
+                uni.showLoading({ title: '获取当前位置...', mask: true });
+                uni.getLocation({
+                    type: 'gcj02',
+                    success: (res) => {
+                        uni.hideLoading();
+                        // 使用用户当前经纬度作为锚点打开地图,展示目标地址信息
+                        navigateTo(res.latitude, res.longitude, name, address);
+                    },
+                    fail: (err) => {
+                        uni.hideLoading();
+                        console.error('获取地理位置失败:', err);
+                        uni.showToast({ title: '无法获取当前位置信息', icon: 'none' });
+                    }
+                });
+            }
         },
         toggleCallMenu(item) {
             if (this.activeCallItem === item) {

+ 1 - 1
pages/recruit/auth_logic.js

@@ -1,4 +1,4 @@
-import { uploadFile } from '@/api/fulfiller'
+import { uploadFile } from '@/api/fulfiller/app'
 
 export default {
     data() {

+ 3 - 2
pages/recruit/form.vue

@@ -245,7 +245,8 @@
     <!-- 协议弹窗 公共组件 -->
     <agreement 
         :visible="showPrivacy" 
-        :agreement-id="currentAgreementId"
+        :title="agreementTitle"
+        :content="agreementContent"
         @close="showPrivacy = false"
     >
     </agreement>
@@ -255,7 +256,7 @@
 
 <script>// 使用脚本文件
 import logic from './logic.js';
-import Agreement from '@/src/components/agreement/index.vue';
+import Agreement from '@/components/agreement/index.vue';
 
 export default {
     ...logic,

+ 22 - 6
pages/recruit/logic.js

@@ -1,6 +1,7 @@
-import { sendSmsCode } from '@/api/auth'
-import { getAreaChildren } from '@/api/fulfiller'
-import { listAllService } from '@/api/service/list/index'
+import { sendSmsCode } from '@/api/resource/sms'
+import { getAreaChildren } from '@/api/fulfiller/app'
+import { listAllService } from '@/api/service/list'
+import { getAgreement } from '@/api/system/agreement'
 
 
 
@@ -50,6 +51,8 @@ export default {
 
             // 协议弹窗
             showPrivacy: false,
+            agreementTitle: '',    // 协议标题
+            agreementContent: '',  // 协议内容
             currentAgreementId: '' // 当前协议ID
         }
     },
@@ -278,9 +281,22 @@ export default {
             this.closeStationPicker();
         },
 
-        openPrivacy() {
-            this.currentAgreementId = 3; // 履约者说明
-            this.showPrivacy = true;
+        async openPrivacy() {
+            try {
+                uni.showLoading({ title: '加载中...' });
+                const res = await getAgreement(3); // 3-履约者说明
+                if (res.code === 200 && res.data) {
+                    this.agreementTitle = res.data.title;
+                    this.agreementContent = res.data.content;
+                    this.showPrivacy = true;
+                } else {
+                    uni.showToast({ title: res.msg || '获取协议失败', icon: 'none' });
+                }
+            } catch (err) {
+                console.error('获取协议详情失败:', err);
+            } finally {
+                uni.hideLoading();
+            }
         },
 
         goToAuth() {

+ 1 - 1
pages/recruit/qualifications_logic.js

@@ -1,4 +1,4 @@
-import { submitAudit, uploadFile } from '@/api/fulfiller'
+import { submitAudit, uploadFile } from '@/api/fulfiller/app'
 
 export default {
     data() {

+ 21 - 3
pages/recruit/success_logic.js

@@ -1,13 +1,31 @@
 export default {
     data() {
         return {
-            station: '民治街道第一站',
-            name: '张三哥',
-            phone: '+8613612345678'
+            station: '',
+            name: '',
+            phone: ''
         }
     },
+    onShow() {
+        this.loadSuccessData();
+    },
     methods: {
+        loadSuccessData() {
+            try {
+                const stored = uni.getStorageSync('recruit_form_data');
+                if (stored) {
+                    const data = JSON.parse(stored);
+                    this.station = data.station || '未设置';
+                    this.name = data.name || '未设置';
+                    this.phone = data.mobile || '未设置';
+                }
+            } catch (e) {
+                console.error('加载成功页数据失败', e);
+            }
+        },
         goHome() {
+            // 清理缓存的数据
+            uni.removeStorageSync('recruit_form_data');
             // 返回首页或登录页
             uni.reLaunch({
                 url: '/pages/login/login'

BIN
unpackage/cache/apk/__UNI__76F5C47_cm.apk


+ 1 - 1
unpackage/cache/apk/apkurl

@@ -1 +1 @@
-https://app.liuyingyong.cn/build/download/40be4780-21a1-11f1-92e9-1f84edcba3f1
+https://app.liuyingyong.cn/build/download/8de56ef0-2683-11f1-91c0-d16aab915886

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/apk/cmManifestCache.json


Fișier diff suprimat deoarece este prea mare
+ 0 - 1
unpackage/cache/wgt/__UNI__76F5C47/app-config-service.js


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/app-service.js


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/manifest.json


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/home/index.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 1
unpackage/cache/wgt/__UNI__76F5C47/pages/home/work-status.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/login/login.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/index.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/level/index.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/order-stats.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/points/detail.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 1
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/rewards-all.css


+ 1 - 1
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/about/index.css

@@ -1 +1 @@
-body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:border-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:1rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.logo-area{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:1.875rem 0}.app-logo{width:5rem;height:5rem;border-radius:.9375rem;margin-bottom:.625rem}.app-name{font-size:1.125rem;font-weight:700;color:#333;margin-bottom:.3125rem}.app-version{font-size:.875rem;color:#999}.group-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem}.list-item{display:flex;justify-content:space-between;align-items:center;height:3.125rem;border-bottom:1px solid #F5F5F5}.list-item.no-border{border-bottom:none}.item-title{font-size:.875rem;color:#333}.item-right{display:flex;align-items:center}.arrow-icon{width:.875rem;height:.875rem;opacity:.5;margin-left:.3125rem}.badge-yellow{width:1.125rem;height:1.125rem;background-color:#ffc107;color:#fff;font-size:.75rem;line-height:1.125rem;text-align:center;border-radius:.1875rem}
+body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:content-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:1rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.logo-area{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3.125rem 0 1.875rem}.app-logo{width:5rem;height:5rem;border-radius:.9375rem;margin-bottom:.625rem}.app-name{font-size:1.125rem;font-weight:700;color:#333;margin-bottom:.3125rem}.app-version{font-size:.875rem;color:#999}.group-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem}.list-item{display:flex;justify-content:space-between;align-items:center;height:3.125rem;border-bottom:1px solid #F5F5F5}.list-item.no-border{border-bottom:none}.item-title{font-size:.875rem;color:#333}.item-right{display:flex;align-items:center}.arrow-icon{width:.875rem;height:.875rem;opacity:.5;margin-left:.3125rem}.badge-yellow{width:1.125rem;height:1.125rem;background-color:#ffc107;color:#fff;font-size:.75rem;line-height:1.125rem;text-align:center;border-radius:.1875rem}

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/auth/edit.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/wallet/bill.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/orders/anomaly.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/orders/index.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 1
unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/auth.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/form.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 1
unpackage/dist/build/app-plus/app-config-service.js


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/app-service.js


+ 3 - 1
unpackage/dist/build/app-plus/manifest.json

@@ -18,6 +18,7 @@
   },
   "permissions": {
     "Camera": {},
+    "VideoPlayer": {},
     "UniNView": {
       "description": "UniNView原生渲染"
     }
@@ -97,6 +98,7 @@
         "dSYMs": false
       },
       "plugins": {
+        "geolocation": {},
         "audio": {
           "mp3": {
             "description": "Android平台录音支持MP3格式文件"
@@ -122,7 +124,7 @@
     "uni-app": {
       "control": "uni-v3",
       "vueVersion": "3",
-      "compilerVersion": "5.03",
+      "compilerVersion": "5.04",
       "nvueCompiler": "uni-app",
       "renderer": "auto",
       "nvue": {

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/home/index.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 1
unpackage/dist/build/app-plus/pages/home/work-status.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/login/login.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/mine/index.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/mine/level/index.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/mine/order-stats.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/mine/points/detail.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 1
unpackage/dist/build/app-plus/pages/mine/rewards-all.css


+ 1 - 1
unpackage/dist/build/app-plus/pages/mine/settings/about/index.css

@@ -1 +1 @@
-body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:border-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:1rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.logo-area{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:1.875rem 0}.app-logo{width:5rem;height:5rem;border-radius:.9375rem;margin-bottom:.625rem}.app-name{font-size:1.125rem;font-weight:700;color:#333;margin-bottom:.3125rem}.app-version{font-size:.875rem;color:#999}.group-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem}.list-item{display:flex;justify-content:space-between;align-items:center;height:3.125rem;border-bottom:1px solid #F5F5F5}.list-item.no-border{border-bottom:none}.item-title{font-size:.875rem;color:#333}.item-right{display:flex;align-items:center}.arrow-icon{width:.875rem;height:.875rem;opacity:.5;margin-left:.3125rem}.badge-yellow{width:1.125rem;height:1.125rem;background-color:#ffc107;color:#fff;font-size:.75rem;line-height:1.125rem;text-align:center;border-radius:.1875rem}
+body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:content-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:1rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.logo-area{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3.125rem 0 1.875rem}.app-logo{width:5rem;height:5rem;border-radius:.9375rem;margin-bottom:.625rem}.app-name{font-size:1.125rem;font-weight:700;color:#333;margin-bottom:.3125rem}.app-version{font-size:.875rem;color:#999}.group-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem}.list-item{display:flex;justify-content:space-between;align-items:center;height:3.125rem;border-bottom:1px solid #F5F5F5}.list-item.no-border{border-bottom:none}.item-title{font-size:.875rem;color:#333}.item-right{display:flex;align-items:center}.arrow-icon{width:.875rem;height:.875rem;opacity:.5;margin-left:.3125rem}.badge-yellow{width:1.125rem;height:1.125rem;background-color:#ffc107;color:#fff;font-size:.75rem;line-height:1.125rem;text-align:center;border-radius:.1875rem}

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/mine/settings/auth/edit.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/mine/wallet/bill.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/orders/anomaly.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/orders/index.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 1
unpackage/dist/build/app-plus/pages/recruit/auth.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/build/app-plus/pages/recruit/form.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
unpackage/dist/dev/app-plus/app-config-service.js


Fișier diff suprimat deoarece este prea mare
+ 332 - 285
unpackage/dist/dev/app-plus/app-service.js


+ 2 - 0
unpackage/dist/dev/app-plus/manifest.json

@@ -18,6 +18,7 @@
   },
   "permissions": {
     "Camera": {},
+    "VideoPlayer": {},
     "UniNView": {
       "description": "UniNView原生渲染"
     }
@@ -97,6 +98,7 @@
         "dSYMs": false
       },
       "plugins": {
+        "geolocation": {},
         "audio": {
           "mp3": {
             "description": "Android平台录音支持MP3格式文件"

+ 30 - 30
unpackage/dist/dev/app-plus/pages/home/index.css

@@ -1,48 +1,48 @@
 
 .custom-tabbar[data-v-52454e90] {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  height: 50px;
-  background-color: #ffffff;
-  display: flex;
-  flex-direction: column;
-  z-index: 999;
-  padding-bottom: env(safe-area-inset-bottom);
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 50px;
+    background-color: #ffffff;
+    display: flex;
+    flex-direction: column;
+    z-index: 999;
+    padding-bottom: env(safe-area-inset-bottom);
 }
 .tabbar-border[data-v-52454e90] {
-  height: 1px;
-  background-color: rgba(0, 0, 0, 0.1);
-  transform: scaleY(0.5);
+    height: 1px;
+    background-color: rgba(0, 0, 0, 0.1);
+    transform: scaleY(0.5);
 }
 .tabbar-list[data-v-52454e90] {
-  display: flex;
-  flex: 1;
-  align-items: center;
-  justify-content: space-around;
+    display: flex;
+    flex: 1;
+    align-items: center;
+    justify-content: space-around;
 }
 .tabbar-item[data-v-52454e90] {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  height: 100%;
-  flex: 1;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+    flex: 1;
 }
 .tabbar-icon[data-v-52454e90] {
-  width: 24px;
-  height: 24px;
-  margin-bottom: 2px;
+    width: 24px;
+    height: 24px;
+    margin-bottom: 2px;
 }
 .tabbar-text[data-v-52454e90] {
-  font-size: 10px;
-  color: #999999;
+    font-size: 10px;
+    color: #999999;
 }
 .tabbar-text-active[data-v-52454e90] {
-  color: #FF5722;
+    color: #FF5722;
 }
-
+  
 /* Global Box Sizing Fix */
 uni-view,
 uni-text,

+ 9 - 9
unpackage/dist/dev/app-plus/pages/login/login.css

@@ -1,5 +1,5 @@
 
-.agreement-mask[data-v-fe2c2596] {
+.agreement-mask[data-v-c8509778] {
   position: fixed;
   top: 0;
   left: 0;
@@ -11,7 +11,7 @@
   align-items: center;
   justify-content: center;
 }
-.agreement-container[data-v-fe2c2596] {
+.agreement-container[data-v-c8509778] {
   width: 18.75rem;
   max-height: 80vh;
   background-color: #ffffff;
@@ -19,19 +19,19 @@
   display: flex;
   flex-direction: column;
   overflow: hidden;
-  animation: fadeIn-fe2c2596 0.3s ease;
+  animation: fadeIn-c8509778 0.3s ease;
 }
-.agreement-header[data-v-fe2c2596] {
+.agreement-header[data-v-c8509778] {
   padding: 0.9375rem;
   text-align: center;
   border-bottom: 0.0625rem solid #f5f5f5;
 }
-.agreement-title[data-v-fe2c2596] {
+.agreement-title[data-v-c8509778] {
   font-size: 1rem;
   font-weight: bold;
   color: #333333;
 }
-.agreement-body[data-v-fe2c2596] {
+.agreement-body[data-v-c8509778] {
   flex: 1;
   padding: 0.9375rem;
   font-size: 0.875rem;
@@ -39,11 +39,11 @@
   color: #666666;
   max-height: 50vh;
 }
-.agreement-footer[data-v-fe2c2596] {
+.agreement-footer[data-v-c8509778] {
   padding: 0.9375rem;
   border-top: 0.0625rem solid #f5f5f5;
 }
-.confirm-btn[data-v-fe2c2596] {
+.confirm-btn[data-v-c8509778] {
   width: 100%;
   height: 2.5rem;
   line-height: 2.5rem;
@@ -52,7 +52,7 @@
   border-radius: 1.25rem;
   font-size: 0.875rem;
 }
-@keyframes fadeIn-fe2c2596 {
+@keyframes fadeIn-c8509778 {
 from {
     opacity: 0;
     transform: scale(0.9);

+ 30 - 30
unpackage/dist/dev/app-plus/pages/mine/index.css

@@ -1,48 +1,48 @@
 
 .custom-tabbar[data-v-52454e90] {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  height: 50px;
-  background-color: #ffffff;
-  display: flex;
-  flex-direction: column;
-  z-index: 999;
-  padding-bottom: env(safe-area-inset-bottom);
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 50px;
+    background-color: #ffffff;
+    display: flex;
+    flex-direction: column;
+    z-index: 999;
+    padding-bottom: env(safe-area-inset-bottom);
 }
 .tabbar-border[data-v-52454e90] {
-  height: 1px;
-  background-color: rgba(0, 0, 0, 0.1);
-  transform: scaleY(0.5);
+    height: 1px;
+    background-color: rgba(0, 0, 0, 0.1);
+    transform: scaleY(0.5);
 }
 .tabbar-list[data-v-52454e90] {
-  display: flex;
-  flex: 1;
-  align-items: center;
-  justify-content: space-around;
+    display: flex;
+    flex: 1;
+    align-items: center;
+    justify-content: space-around;
 }
 .tabbar-item[data-v-52454e90] {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  height: 100%;
-  flex: 1;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+    flex: 1;
 }
 .tabbar-icon[data-v-52454e90] {
-  width: 24px;
-  height: 24px;
-  margin-bottom: 2px;
+    width: 24px;
+    height: 24px;
+    margin-bottom: 2px;
 }
 .tabbar-text[data-v-52454e90] {
-  font-size: 10px;
-  color: #999999;
+    font-size: 10px;
+    color: #999999;
 }
 .tabbar-text-active[data-v-52454e90] {
-  color: #FF5722;
+    color: #FF5722;
 }
-
+  
 /* 页面背景 */
 body {
     background-color: #F8F8F8;

+ 2 - 2
unpackage/dist/dev/app-plus/pages/mine/settings/about/index.css

@@ -16,7 +16,7 @@ body {
     justify-content: space-between;
     padding-left: 0.9375rem;
     padding-right: 0.9375rem;
-    box-sizing: border-box;
+    box-sizing: content-box;
     z-index: 100;
 }
 .header-placeholder {
@@ -42,7 +42,7 @@ body {
     flex-direction: column;
     align-items: center;
     justify-content: center;
-    padding: 1.875rem 0;
+    padding: 3.125rem 0 1.875rem;
 }
 .app-logo {
     width: 5rem;

+ 30 - 30
unpackage/dist/dev/app-plus/pages/orders/index.css

@@ -1,48 +1,48 @@
 
 .custom-tabbar[data-v-52454e90] {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  height: 50px;
-  background-color: #ffffff;
-  display: flex;
-  flex-direction: column;
-  z-index: 999;
-  padding-bottom: env(safe-area-inset-bottom);
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 50px;
+    background-color: #ffffff;
+    display: flex;
+    flex-direction: column;
+    z-index: 999;
+    padding-bottom: env(safe-area-inset-bottom);
 }
 .tabbar-border[data-v-52454e90] {
-  height: 1px;
-  background-color: rgba(0, 0, 0, 0.1);
-  transform: scaleY(0.5);
+    height: 1px;
+    background-color: rgba(0, 0, 0, 0.1);
+    transform: scaleY(0.5);
 }
 .tabbar-list[data-v-52454e90] {
-  display: flex;
-  flex: 1;
-  align-items: center;
-  justify-content: space-around;
+    display: flex;
+    flex: 1;
+    align-items: center;
+    justify-content: space-around;
 }
 .tabbar-item[data-v-52454e90] {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  height: 100%;
-  flex: 1;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+    flex: 1;
 }
 .tabbar-icon[data-v-52454e90] {
-  width: 24px;
-  height: 24px;
-  margin-bottom: 2px;
+    width: 24px;
+    height: 24px;
+    margin-bottom: 2px;
 }
 .tabbar-text[data-v-52454e90] {
-  font-size: 10px;
-  color: #999999;
+    font-size: 10px;
+    color: #999999;
 }
 .tabbar-text-active[data-v-52454e90] {
-  color: #FF5722;
+    color: #FF5722;
 }
-
+  
 body {
     background-color: #F8F8F8;
 }

+ 9 - 9
unpackage/dist/dev/app-plus/pages/recruit/form.css

@@ -1,5 +1,5 @@
 
-.agreement-mask[data-v-fe2c2596] {
+.agreement-mask[data-v-c8509778] {
   position: fixed;
   top: 0;
   left: 0;
@@ -11,7 +11,7 @@
   align-items: center;
   justify-content: center;
 }
-.agreement-container[data-v-fe2c2596] {
+.agreement-container[data-v-c8509778] {
   width: 18.75rem;
   max-height: 80vh;
   background-color: #ffffff;
@@ -19,19 +19,19 @@
   display: flex;
   flex-direction: column;
   overflow: hidden;
-  animation: fadeIn-fe2c2596 0.3s ease;
+  animation: fadeIn-c8509778 0.3s ease;
 }
-.agreement-header[data-v-fe2c2596] {
+.agreement-header[data-v-c8509778] {
   padding: 0.9375rem;
   text-align: center;
   border-bottom: 0.0625rem solid #f5f5f5;
 }
-.agreement-title[data-v-fe2c2596] {
+.agreement-title[data-v-c8509778] {
   font-size: 1rem;
   font-weight: bold;
   color: #333333;
 }
-.agreement-body[data-v-fe2c2596] {
+.agreement-body[data-v-c8509778] {
   flex: 1;
   padding: 0.9375rem;
   font-size: 0.875rem;
@@ -39,11 +39,11 @@
   color: #666666;
   max-height: 50vh;
 }
-.agreement-footer[data-v-fe2c2596] {
+.agreement-footer[data-v-c8509778] {
   padding: 0.9375rem;
   border-top: 0.0625rem solid #f5f5f5;
 }
-.confirm-btn[data-v-fe2c2596] {
+.confirm-btn[data-v-c8509778] {
   width: 100%;
   height: 2.5rem;
   line-height: 2.5rem;
@@ -52,7 +52,7 @@
   border-radius: 1.25rem;
   font-size: 0.875rem;
 }
-@keyframes fadeIn-fe2c2596 {
+@keyframes fadeIn-c8509778 {
 from {
     opacity: 0;
     transform: scale(0.9);

BIN
unpackage/release/apk/__UNI__76F5C47__20260316202839.apk


BIN
unpackage/release/apk/__UNI__76F5C47__20260317093308.apk


+ 3 - 3
utils/config.js

@@ -4,9 +4,9 @@
  */
 
 // API 基础地址(开发环境)
- export const BASE_URL = 'http://192.168.1.118:8080'
-// export const BASE_URL = 'http://8.136.194.143/api'
-// export const BASE_URL = 'http://192.168.0.103:8080'
+// export const BASE_URL = 'http://192.168.1.118:8080'
+export const BASE_URL = 'http://www.hoomeng.pet/api'
+// export const BASE_URL = 'http://192.168.0.102:8080'
 
 // 履约者App客户端ID(需要在 sys_client 表中配置)
 export const CLIENT_ID = 'fe63fea7be31b0200b496d08bc6b517d'

+ 1 - 0
utils/request.js

@@ -46,6 +46,7 @@ export default function request(options = {}) {
       method: method.toUpperCase(),
       data,
       header: headers,
+	  timeout: 600000,
       success: (res) => {
         console.log(res)
         const statusCode = res.statusCode

+ 0 - 29
walkthrough.md

@@ -1,29 +0,0 @@
-# 履约者招募功能开发演示
-
-目前已完成履约者招募的全流程开发,包含以下核心页面:
-
-## 1. 招募落地页 (`pages/recruit/landing`)
-- 展示招募权益,入口按钮。
-- **UI**: 橙色背景,白色悬浮卡片。
-
-## 2. 申请填写页 (`pages/recruit/form`)
-- 填写基本信息、服务类型、工作城市(级联选择)、服务站点。
-- **UI**: 表单列表,底部协议与悬浮按钮。
-
-## 3. 实名认证页 (`pages/recruit/auth`)
-- **功能**: 上传身份证正反面,填写身份信息。
-- **UI**: 参照设计图还原,包含自定义上传样式。
-
-## 4. 资质完善页 (`pages/recruit/qualifications`)
-- **功能**: 根据上一步选择的服务类型(如宠物接送、洗护等),动态展示对应的资质上传入口。
-- **UI**: 卡片式列表,支持图片预览与删除。
-
-## 5. 报名成功页 (`pages/recruit/success`)
-- **功能**: 展示报名成功状态及关键信息。
-- **UI**: 绿色成功图标,卡片展示站点、姓名、电话。
-
----
-
-### 下一步建议
-- 联调后端接口,替换 Mock 数据。
-- 完善图片上传的实际后端逻辑(目前仅为前端临时路径)。

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff