diff --git a/miniprogram/pages.json b/miniprogram/pages.json index 1b141f5b..5c2a517f 100644 --- a/miniprogram/pages.json +++ b/miniprogram/pages.json @@ -27,7 +27,7 @@ { "path": "pages/order/submit", "style": { - "navigationBarTitleText": "提交订单" + "navigationStyle": "custom" } }, { diff --git a/miniprogram/pages/mine/index.vue b/miniprogram/pages/mine/index.vue index 19023967..dcce662e 100644 --- a/miniprogram/pages/mine/index.vue +++ b/miniprogram/pages/mine/index.vue @@ -43,6 +43,11 @@ 隐私协议 + + + 退出登录 + + @@ -113,6 +118,24 @@ function showAgreement(type: 'user' | 'privacy') { confirmText: '我知道了', }) } + +function handleLogout() { + uni.showModal({ + title: '提示', + content: '确定要退出登录吗?', + success: (res) => { + if (res.confirm) { + userStore.logout() + isLoggedIn.value = false + orderCount.value = 0 + uni.showToast({ title: '已退出登录', icon: 'success' }) + setTimeout(() => { + uni.switchTab({ url: '/pages/index/index' }) + }, 1000) + } + } + }) +} \r\n","import MiniProgramPage from 'F:/gitCode/uniapp/JewelryMall/miniprogram/pages/mine/index.vue'\nwx.createPage(MiniProgramPage)"],"names":["useUserStore","ref","uni","getOrderList","onShow"],"mappings":";;;;;;;;AAkEA,MAAA,qBAA+B,MAAA;;;;AAE/B,UAAM,YAAYA,WAAAA;AACZ,UAAA,aAAaC,kBAAI,KAAK;AACtB,UAAA,YAAYA,kBAAI,KAAK;AACrB,UAAA,aAAaA,kBAAI,CAAC;AAClB,UAAA,aAAaA,kBAAI,KAAK;AAE5B,aAAS,cAAc;AACf,YAAA,QAAQC,cAAAA,MAAI,eAAe,OAAO;AAC7B,iBAAA,QAAQ,CAAC,CAAC;AACrB,UAAI,OAAO;AACT,kBAAU,aAAa;AACVC,+BAAA,EAAE,KAAK,CAAC,SAAc;AACtB,qBAAA,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAK,UAAU,6BAAM,UAAS;AAAA,QAAA,CACxE,EAAE,MAAM,MAAM;AAAA,QAAA,CAAE;AAAA,MACnB;AAAA,IACF;AAEAC,kBAAAA,OAAO,MAAM;AACC;IAAA,CACb;AAED,aAAS,sBAAsB;AACzB,UAAA,CAAC,WAAW,OAAO;AACrBF,sBAAAA,MAAI,WAAW,EAAE,KAAK,qBAAsB,CAAA;AAAA,MAC9C;AAAA,IACF;AAEA,aAAS,WAAW,KAAa;AACzB,YAAA,QAAQA,cAAAA,MAAI,eAAe,OAAO;AACxC,UAAI,CAAC,OAAO;AACVA,sBAAAA,MAAI,WAAW,EAAE,KAAK,qBAAsB,CAAA;AAC5C;AAAA,MACF;AACIA,oBAAAA,MAAA,WAAW,EAAE,IAAA,CAAK;AAAA,IACxB;AAEA,aAAS,cAAc,MAA0B;AACzC,YAAA,QAAQ,SAAS,SAAS,SAAS;AACzCA,oBAAAA,MAAI,UAAU;AAAA,QACZ;AAAA,QACA,SAAS,SAAS,SACd,sCACA;AAAA,QACJ,YAAY;AAAA,QACZ,aAAa;AAAA,MAAA,CACd;AAAA,IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjHA,GAAG,WAAW,eAAe;"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["pages/mine/index.vue","../../../../Software/HBuilderX.4.76.2025082103/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvbWluZS9pbmRleC52dWU"],"sourcesContent":["\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'F:/gitCode/uniapp/JewelryMall/miniprogram/pages/mine/index.vue'\nwx.createPage(MiniProgramPage)"],"names":["useUserStore","ref","uni","getOrderList","onShow"],"mappings":";;;;;;;;AAuEA,MAAA,qBAA+B,MAAA;;;;AAE/B,UAAM,YAAYA,WAAAA;AACZ,UAAA,aAAaC,kBAAI,KAAK;AACtB,UAAA,YAAYA,kBAAI,KAAK;AACrB,UAAA,aAAaA,kBAAI,CAAC;AAClB,UAAA,aAAaA,kBAAI,KAAK;AAE5B,aAAS,cAAc;AACf,YAAA,QAAQC,cAAAA,MAAI,eAAe,OAAO;AAC7B,iBAAA,QAAQ,CAAC,CAAC;AACrB,UAAI,OAAO;AACT,kBAAU,aAAa;AACVC,+BAAA,EAAE,KAAK,CAAC,SAAc;AACtB,qBAAA,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAK,UAAU,6BAAM,UAAS;AAAA,QAAA,CACxE,EAAE,MAAM,MAAM;AAAA,QAAA,CAAE;AAAA,MACnB;AAAA,IACF;AAEAC,kBAAAA,OAAO,MAAM;AACC;IAAA,CACb;AAED,aAAS,sBAAsB;AACzB,UAAA,CAAC,WAAW,OAAO;AACrBF,sBAAAA,MAAI,WAAW,EAAE,KAAK,qBAAsB,CAAA;AAAA,MAC9C;AAAA,IACF;AAEA,aAAS,WAAW,KAAa;AACzB,YAAA,QAAQA,cAAAA,MAAI,eAAe,OAAO;AACxC,UAAI,CAAC,OAAO;AACVA,sBAAAA,MAAI,WAAW,EAAE,KAAK,qBAAsB,CAAA;AAC5C;AAAA,MACF;AACIA,oBAAAA,MAAA,WAAW,EAAE,IAAA,CAAK;AAAA,IACxB;AAEA,aAAS,cAAc,MAA0B;AACzC,YAAA,QAAQ,SAAS,SAAS,SAAS;AACzCA,oBAAAA,MAAI,UAAU;AAAA,QACZ;AAAA,QACA,SAAS,SAAS,SACd,sCACA;AAAA,QACJ,YAAY;AAAA,QACZ,aAAa;AAAA,MAAA,CACd;AAAA,IACH;AAEA,aAAS,eAAe;AACtBA,oBAAAA,MAAI,UAAU;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS,CAAC,QAAQ;AAChB,cAAI,IAAI,SAAS;AACf,sBAAU,OAAO;AACjB,uBAAW,QAAQ;AACnB,uBAAW,QAAQ;AACnBA,0BAAA,MAAI,UAAU,EAAE,OAAO,SAAS,MAAM,WAAW;AACjD,uBAAW,MAAM;AACfA,4BAAAA,MAAI,UAAU,EAAE,KAAK,qBAAsB,CAAA;AAAA,eAC1C,GAAI;AAAA,UACT;AAAA,QACF;AAAA,MAAA,CACD;AAAA,IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxIA,GAAG,WAAW,eAAe;"} \ No newline at end of file diff --git a/miniprogram/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/submit.js.map b/miniprogram/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/submit.js.map index bef77131..b9367492 100644 --- a/miniprogram/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/submit.js.map +++ b/miniprogram/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/submit.js.map @@ -1 +1 @@ -{"version":3,"file":"submit.js","sources":["pages/order/submit.vue","../../../../Software/HBuilderX.4.76.2025082103/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvb3JkZXIvc3VibWl0LnZ1ZQ"],"sourcesContent":["\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'F:/gitCode/uniapp/JewelryMall/miniprogram/pages/order/submit.vue'\nwx.createPage(MiniProgramPage)"],"names":["useCartStore","ref","computed","uni","createOrder"],"mappings":";;;;;;;AAiFA,UAAM,YAAYA,WAAAA;AAEZ,UAAA,eAAeC,kBAAI,EAAE;AACrB,UAAA,gBAAgBA,kBAAI,EAAE;AACtB,UAAA,kBAAkBA,kBAAI,EAAE;AACxB,UAAA,SAASA,kBAAI,KAAK;AAClB,UAAA,aAAaA,kBAAI,KAAK;AAG5B,UAAM,aAAaC,cAAA,SAAqB,MAAM,UAAU,YAAY;AAEpE,UAAM,aAAaA,cAAA;AAAA,MAAS,MAC1B,WAAW,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,aAAa,KAAK,UAAU,CAAC;AAAA,IAAA;AAG1F,UAAM,YAAYA,cAAAA,SAAS,MAAM,OAAO,SAAS,CAAC,WAAW,KAAK;AAElE,mBAAe,eAAe;AAC5B,UAAI,CAAC,UAAU;AAAO;AAEtB,UAAI,CAAC,aAAa,MAAM,QAAQ;AAC9BC,sBAAA,MAAI,UAAU,EAAE,OAAO,YAAY,MAAM,QAAQ;AACjD;AAAA,MACF;AACA,UAAI,CAAC,cAAc,MAAM,QAAQ;AAC/BA,sBAAA,MAAI,UAAU,EAAE,OAAO,WAAW,MAAM,QAAQ;AAChD;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB,MAAM,QAAQ;AACjCA,sBAAA,MAAI,UAAU,EAAE,OAAO,WAAW,MAAM,QAAQ;AAChD;AAAA,MACF;AAEA,iBAAW,QAAQ;AACf,UAAA;AACI,cAAA,QAAQ,MAAMC,sBAAY;AAAA,UAC9B,OAAO,WAAW,MAAM,IAAI,CAAC,UAAU;AAAA,YACrC,WAAW,KAAK;AAAA,YAChB,YAAY,KAAK;AAAA,YACjB,UAAU,KAAK;AAAA,YACf,WAAW,KAAK,SAAS;AAAA,UAAA,EACzB;AAAA,UACF,cAAc,aAAa,MAAM,KAAK;AAAA,UACtC,eAAe,cAAc,MAAM,KAAK;AAAA,UACxC,iBAAiB,gBAAgB,MAAM,KAAK;AAAA,QAAA,CAC7C;AAGU,mBAAA,QAAQ,WAAW,OAAO;AACzB,oBAAA,eAAe,KAAK,EAAE;AAAA,QAClC;AAEAD,4BAAI,WAAW,EAAE,KAAK,0BAA0B,MAAM,EAAE,IAAI;AAAA,MAAA,QACtD;AACNA,sBAAA,MAAI,UAAU,EAAE,OAAO,cAAc,MAAM,QAAQ;AAAA,MAAA,UACnD;AACA,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1IA,GAAG,WAAW,eAAe;"} \ No newline at end of file +{"version":3,"file":"submit.js","sources":["pages/order/submit.vue","../../../../Software/HBuilderX.4.76.2025082103/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvb3JkZXIvc3VibWl0LnZ1ZQ"],"sourcesContent":["\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'F:/gitCode/uniapp/JewelryMall/miniprogram/pages/order/submit.vue'\nwx.createPage(MiniProgramPage)"],"names":["useCartStore","ref","BASE_URL","uni","computed","createOrder","onMounted"],"mappings":";;;;;;;;;AA+GA,UAAM,YAAYA,WAAAA;AAEZ,UAAA,kBAAkBC,kBAAI,CAAC;AACvB,UAAA,eAAeA,kBAAI,EAAE;AACrB,UAAA,eAAeA,kBAAI,EAAE;AACrB,UAAA,gBAAgBA,kBAAI,EAAE;AACtB,UAAA,kBAAkBA,kBAAI,EAAE;AACxB,UAAA,SAASA,kBAAI,EAAE;AACf,UAAA,SAASA,kBAAI,KAAK;AAClB,UAAA,aAAaA,kBAAI,KAAK;AAE5B,aAAS,QAAQ,MAAsB;AACrC,UAAI,CAAC;AAAa,eAAA;AACd,UAAA,KAAK,WAAW,MAAM;AAAU,eAAA;AACpC,aAAOC,cAAAA,WAAW;AAAA,IACpB;AAEA,aAAS,SAAS;AAChBC,oBAAA,MAAI,aAAa;AAAA,IACnB;AAGA,UAAM,aAAaC,cAAA,SAAqB,MAAM,UAAU,YAAY;AAEpE,UAAM,aAAaA,cAAA;AAAA,MAAS,MAC1B,WAAW,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,aAAa,KAAK,UAAU,CAAC;AAAA,IAAA;AAG1F,UAAM,YAAYA,cAAAA,SAAS,MAAM,OAAO,SAAS,CAAC,WAAW,KAAK;AAElE,mBAAe,eAAe;AAC5B,UAAI,CAAC,UAAU;AAAO;AAEtB,UAAI,CAAC,aAAa,MAAM,QAAQ;AAC9BD,sBAAA,MAAI,UAAU,EAAE,OAAO,YAAY,MAAM,QAAQ;AACjD;AAAA,MACF;AACA,UAAI,CAAC,cAAc,MAAM,QAAQ;AAC/BA,sBAAA,MAAI,UAAU,EAAE,OAAO,WAAW,MAAM,QAAQ;AAChD;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB,MAAM,QAAQ;AACjCA,sBAAA,MAAI,UAAU,EAAE,OAAO,WAAW,MAAM,QAAQ;AAChD;AAAA,MACF;AAEA,iBAAW,QAAQ;AACf,UAAA;AACI,cAAA,QAAQ,MAAME,sBAAY;AAAA,UAC9B,OAAO,WAAW,MAAM,IAAI,CAAC,UAAU;AAAA,YACrC,WAAW,KAAK;AAAA,YAChB,YAAY,KAAK;AAAA,YACjB,UAAU,KAAK;AAAA,YACf,WAAW,KAAK,SAAS;AAAA,UAAA,EACzB;AAAA,UACF,cAAc,aAAa,MAAM,KAAK;AAAA,UACtC,eAAe,cAAc,MAAM,KAAK;AAAA,UACxC,iBAAiB,gBAAgB,MAAM,KAAK;AAAA,QAAA,CAC7C;AAGU,mBAAA,QAAQ,WAAW,OAAO;AACzB,oBAAA,eAAe,KAAK,EAAE;AAAA,QAClC;AAEAF,4BAAI,WAAW,EAAE,KAAK,0BAA0B,MAAM,EAAE,IAAI;AAAA,MAAA,QACtD;AACNA,sBAAA,MAAI,UAAU,EAAE,OAAO,cAAc,MAAM,QAAQ;AAAA,MAAA,UACnD;AACA,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAEAG,kBAAAA,UAAU,MAAM;AACR,YAAA,UAAUH,oBAAI;AACJ,sBAAA,QAAQ,QAAQ,mBAAmB;AAC7C,YAAA,UAAUA,oBAAI;AACpB,mBAAa,QAAQ,QAAQ,UAAU,QAAQ,OAAO,QAAQ,mBAAmB,MAAM;AAAA,IAAA,CACxF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5LD,GAAG,WAAW,eAAe;"} \ No newline at end of file diff --git a/miniprogram/unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map b/miniprogram/unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map index 7490c6d3..5e89aa2c 100644 --- a/miniprogram/unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map +++ b/miniprogram/unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map @@ -1 +1 @@ -{"version":3,"file":"request.js","sources":["utils/request.ts"],"sourcesContent":["// 后端 API 基础地址 - 根据环境自动切换\r\n// 开发环境使用本地服务器,生产环境使用线上地址\r\nconst ENV_BASE_URL: Record = {\r\n development: 'http://localhost:3000',\r\n production: 'https://api.example.com', // 部署时替换为真实域名\r\n}\r\n\r\nconst BASE_URL = ENV_BASE_URL[process.env.NODE_ENV || 'development'] || 'http://localhost:3000'\r\n\r\nexport { BASE_URL }\r\n\r\ninterface RequestOptions {\r\n url: string\r\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE'\r\n data?: Record\r\n header?: Record\r\n}\r\n\r\ninterface ApiResponse {\r\n code: number\r\n data: T\r\n message: string\r\n}\r\n\r\nfunction getToken(): string {\r\n return uni.getStorageSync('token') || ''\r\n}\r\n\r\nexport function request(options: RequestOptions): Promise {\r\n const { url, method = 'GET', data, header = {} } = options\r\n const token = getToken()\r\n\r\n return new Promise((resolve, reject) => {\r\n uni.request({\r\n url: `${BASE_URL}${url}`,\r\n method,\r\n data,\r\n header: {\r\n 'Content-Type': 'application/json',\r\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n ...header,\r\n },\r\n success(res) {\r\n const statusCode = res.statusCode\r\n if (statusCode === 401) {\r\n uni.removeStorageSync('token')\r\n uni.showToast({ title: '请重新登录', icon: 'none' })\r\n autoLogin()\r\n reject(new Error('未授权'))\r\n return\r\n }\r\n if (statusCode >= 200 && statusCode < 300) {\r\n const body = res.data as ApiResponse\r\n if (body.code === 0) {\r\n resolve(body.data)\r\n } else {\r\n uni.showToast({ title: body.message || '请求失败', icon: 'none' })\r\n reject(new Error(body.message))\r\n }\r\n } else {\r\n uni.showToast({ title: '网络异常,请稍后重试', icon: 'none' })\r\n reject(new Error(`HTTP ${statusCode}`))\r\n }\r\n },\r\n fail(err) {\r\n uni.showToast({ title: '网络异常,请稍后重试', icon: 'none' })\r\n reject(err)\r\n },\r\n })\r\n })\r\n}\r\n\r\n/** 微信小程序自动登录 */\r\nexport function autoLogin(): Promise {\r\n return new Promise((resolve, reject) => {\r\n uni.login({\r\n provider: 'weixin',\r\n success: async (loginRes) => {\r\n if (loginRes.code) {\r\n try {\r\n const data = await request<{ token: string; userId: number }>({\r\n url: '/api/auth/wx-login',\r\n method: 'POST',\r\n data: { code: loginRes.code },\r\n })\r\n uni.setStorageSync('token', data.token)\r\n resolve()\r\n } catch (err) {\r\n console.error('登录接口调用失败:', err)\r\n reject(err)\r\n }\r\n } else {\r\n console.error('微信登录获取 code 失败')\r\n reject(new Error('获取微信 code 失败'))\r\n }\r\n },\r\n fail: (err) => {\r\n console.error('uni.login 失败:', err)\r\n reject(err)\r\n },\r\n })\r\n })\r\n}\r\n\r\nexport const get = (url: string, data?: Record) =>\r\n request({ url, method: 'GET', data })\r\n\r\nexport const post = (url: string, data?: Record) =>\r\n request({ url, method: 'POST', data })\r\n\r\nexport const put = (url: string, data?: Record) =>\r\n request({ url, method: 'PUT', data })\r\n\r\nexport const del = (url: string, data?: Record) =>\r\n request({ url, method: 'DELETE', data })\r\n"],"names":["uni"],"mappings":";;AAEA,MAAM,eAAuC;AAAA,EAC3C,aAAa;AAAA,EACb,YAAY;AAAA;AACd;AAEM,MAAA,WAAW,aAAa,aAAqC;AAiBnE,SAAS,WAAmB;AACnB,SAAAA,oBAAI,eAAe,OAAO,KAAK;AACxC;AAEO,SAAS,QAAqB,SAAqC;AAClE,QAAA,EAAE,KAAK,SAAS,OAAO,MAAM,SAAS,CAAA,EAAO,IAAA;AACnD,QAAM,QAAQ;AAEd,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtCA,kBAAAA,MAAI,QAAQ;AAAA,MACV,KAAK,GAAG,QAAQ,GAAG,GAAG;AAAA,MACtB;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN,gBAAgB;AAAA,QAChB,GAAI,QAAQ,EAAE,eAAe,UAAU,KAAK,GAAA,IAAO,CAAC;AAAA,QACpD,GAAG;AAAA,MACL;AAAA,MACA,QAAQ,KAAK;AACX,cAAM,aAAa,IAAI;AACvB,YAAI,eAAe,KAAK;AACtBA,8BAAI,kBAAkB,OAAO;AAC7BA,wBAAA,MAAI,UAAU,EAAE,OAAO,SAAS,MAAM,QAAQ;AACpC;AACH,iBAAA,IAAI,MAAM,KAAK,CAAC;AACvB;AAAA,QACF;AACI,YAAA,cAAc,OAAO,aAAa,KAAK;AACzC,gBAAM,OAAO,IAAI;AACb,cAAA,KAAK,SAAS,GAAG;AACnB,oBAAQ,KAAK,IAAI;AAAA,UAAA,OACZ;AACDA,gCAAA,UAAU,EAAE,OAAO,KAAK,WAAW,QAAQ,MAAM,QAAQ;AAC7D,mBAAO,IAAI,MAAM,KAAK,OAAO,CAAC;AAAA,UAChC;AAAA,QAAA,OACK;AACLA,wBAAA,MAAI,UAAU,EAAE,OAAO,cAAc,MAAM,QAAQ;AACnD,iBAAO,IAAI,MAAM,QAAQ,UAAU,EAAE,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACRA,sBAAA,MAAI,UAAU,EAAE,OAAO,cAAc,MAAM,QAAQ;AACnD,eAAO,GAAG;AAAA,MACZ;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;AAGO,SAAS,YAA2B;AACzC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtCA,kBAAAA,MAAI,MAAM;AAAA,MACR,UAAU;AAAA,MACV,SAAS,OAAO,aAAa;AAC3B,YAAI,SAAS,MAAM;AACb,cAAA;AACI,kBAAA,OAAO,MAAM,QAA2C;AAAA,cAC5D,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,MAAM,EAAE,MAAM,SAAS,KAAK;AAAA,YAAA,CAC7B;AACGA,0BAAAA,MAAA,eAAe,SAAS,KAAK,KAAK;AAC9B;mBACD,KAAK;AACZA,0BAAA,MAAA,MAAA,SAAA,0BAAc,aAAa,GAAG;AAC9B,mBAAO,GAAG;AAAA,UACZ;AAAA,QAAA,OACK;AACSA,wBAAAA,MAAA,MAAA,SAAA,0BAAA,gBAAgB;AACvB,iBAAA,IAAI,MAAM,cAAc,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,MACA,MAAM,CAAC,QAAQ;AACbA,sBAAA,MAAA,MAAA,SAAA,0BAAc,iBAAiB,GAAG;AAClC,eAAO,GAAG;AAAA,MACZ;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;AAEa,MAAA,MAAM,CAAc,KAAa,SAC5C,QAAW,EAAE,KAAK,QAAQ,OAAO,MAAM;AAE5B,MAAA,OAAO,CAAc,KAAa,SAC7C,QAAW,EAAE,KAAK,QAAQ,QAAQ,MAAM;AAE7B,MAAA,MAAM,CAAc,KAAa,SAC5C,QAAW,EAAE,KAAK,QAAQ,OAAO,MAAM;AAE5B,MAAA,MAAM,CAAc,KAAa,SAC5C,QAAW,EAAE,KAAK,QAAQ,UAAU,KAAM,CAAA;;;;;;;"} \ No newline at end of file +{"version":3,"file":"request.js","sources":["utils/request.ts"],"sourcesContent":["// 后端 API 基础地址 - 根据环境自动切换\r\n// 开发环境使用本地服务器,生产环境使用线上地址\r\nconst ENV_BASE_URL: Record = {\r\n development: 'http://localhost:3000',\r\n production: 'https://api.example.com', // 部署时替换为真实域名\r\n}\r\n\r\nconst BASE_URL = ENV_BASE_URL[process.env.NODE_ENV || 'development'] || 'http://localhost:3000'\r\n\r\nexport { BASE_URL }\r\n\r\ninterface RequestOptions {\r\n url: string\r\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE'\r\n data?: Record\r\n header?: Record\r\n}\r\n\r\ninterface ApiResponse {\r\n code: number\r\n data: T\r\n message: string\r\n}\r\n\r\n/** 将下划线命名转换为驼峰命名 */\r\nfunction toCamelCase(obj: any): any {\r\n if (obj === null || typeof obj !== 'object') return obj\r\n \r\n if (Array.isArray(obj)) {\r\n return obj.map(item => toCamelCase(item))\r\n }\r\n \r\n const result: any = {}\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())\r\n result[camelKey] = toCamelCase(obj[key])\r\n }\r\n }\r\n return result\r\n}\r\n\r\nfunction getToken(): string {\r\n return uni.getStorageSync('token') || ''\r\n}\r\n\r\nexport function request(options: RequestOptions): Promise {\r\n const { url, method = 'GET', data, header = {} } = options\r\n const token = getToken()\r\n\r\n return new Promise((resolve, reject) => {\r\n uni.request({\r\n url: `${BASE_URL}${url}`,\r\n method,\r\n data,\r\n header: {\r\n 'Content-Type': 'application/json',\r\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n ...header,\r\n },\r\n success(res) {\r\n const statusCode = res.statusCode\r\n if (statusCode === 401) {\r\n uni.removeStorageSync('token')\r\n uni.showToast({ title: '请重新登录', icon: 'none' })\r\n autoLogin()\r\n reject(new Error('未授权'))\r\n return\r\n }\r\n if (statusCode >= 200 && statusCode < 300) {\r\n const body = res.data as ApiResponse\r\n if (body.code === 0) {\r\n // 将下划线命名转换为驼峰命名\r\n const camelData = toCamelCase(body.data)\r\n resolve(camelData)\r\n } else {\r\n uni.showToast({ title: body.message || '请求失败', icon: 'none' })\r\n reject(new Error(body.message))\r\n }\r\n } else {\r\n uni.showToast({ title: '网络异常,请稍后重试', icon: 'none' })\r\n reject(new Error(`HTTP ${statusCode}`))\r\n }\r\n },\r\n fail(err) {\r\n uni.showToast({ title: '网络异常,请稍后重试', icon: 'none' })\r\n reject(err)\r\n },\r\n })\r\n })\r\n}\r\n\r\n/** 微信小程序自动登录 */\r\nexport function autoLogin(): Promise {\r\n return new Promise((resolve, reject) => {\r\n uni.login({\r\n provider: 'weixin',\r\n success: async (loginRes) => {\r\n if (loginRes.code) {\r\n try {\r\n const data = await request<{ token: string; userId: number }>({\r\n url: '/api/auth/wx-login',\r\n method: 'POST',\r\n data: { code: loginRes.code },\r\n })\r\n uni.setStorageSync('token', data.token)\r\n resolve()\r\n } catch (err) {\r\n console.error('登录接口调用失败:', err)\r\n reject(err)\r\n }\r\n } else {\r\n console.error('微信登录获取 code 失败')\r\n reject(new Error('获取微信 code 失败'))\r\n }\r\n },\r\n fail: (err) => {\r\n console.error('uni.login 失败:', err)\r\n reject(err)\r\n },\r\n })\r\n })\r\n}\r\n\r\nexport const get = (url: string, data?: Record) =>\r\n request({ url, method: 'GET', data })\r\n\r\nexport const post = (url: string, data?: Record) =>\r\n request({ url, method: 'POST', data })\r\n\r\nexport const put = (url: string, data?: Record) =>\r\n request({ url, method: 'PUT', data })\r\n\r\nexport const del = (url: string, data?: Record) =>\r\n request({ url, method: 'DELETE', data })\r\n"],"names":["uni"],"mappings":"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"} \ No newline at end of file diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/api/mold.js b/miniprogram/unpackage/dist/dev/mp-weixin/api/mold.js deleted file mode 100644 index 95dd19e8..00000000 --- a/miniprogram/unpackage/dist/dev/mp-weixin/api/mold.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; -const utils_request = require("../utils/request.js"); -const getMoldList = (params) => utils_request.get("/api/molds", params); -exports.getMoldList = getMoldList; -//# sourceMappingURL=../../.sourcemap/mp-weixin/api/mold.js.map diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/common/assets.js b/miniprogram/unpackage/dist/dev/mp-weixin/common/assets.js index 32642226..59eec4ef 100644 --- a/miniprogram/unpackage/dist/dev/mp-weixin/common/assets.js +++ b/miniprogram/unpackage/dist/dev/mp-weixin/common/assets.js @@ -2,10 +2,12 @@ const _imports_0$5 = "/static/ic_search.png"; const _imports_0$4 = "/static/ic_back.png"; const _imports_0$3 = "/static/ic_none.png"; -const _imports_2$1 = "/static/ic_customer.png"; -const _imports_2 = "/static/tab/car.png"; -const _imports_0$2 = "/static/tab/me_s.png"; +const _imports_2$2 = "/static/ic_customer.png"; +const _imports_2$1 = "/static/tab/car.png"; const _imports_1 = "/static/ic_address.png"; +const _imports_2 = "/static/ic_tip.png"; +const _imports_3$1 = "/static/ic_time.png"; +const _imports_0$2 = "/static/tab/me_s.png"; const _imports_3 = "/static/ic_about.png"; const _imports_4 = "/static/ic_agreement1.png"; const _imports_5 = "/static/ic_agreement2.png"; @@ -18,9 +20,11 @@ exports._imports_0$3 = _imports_0$2; exports._imports_0$4 = _imports_0$1; exports._imports_0$5 = _imports_0; exports._imports_1 = _imports_1; -exports._imports_2 = _imports_2$1; -exports._imports_2$1 = _imports_2; -exports._imports_3 = _imports_3; +exports._imports_2 = _imports_2$2; +exports._imports_2$1 = _imports_2$1; +exports._imports_2$2 = _imports_2; +exports._imports_3 = _imports_3$1; +exports._imports_3$1 = _imports_3; exports._imports_4 = _imports_4; exports._imports_5 = _imports_5; //# sourceMappingURL=../../.sourcemap/mp-weixin/common/assets.js.map diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/common/vendor.js b/miniprogram/unpackage/dist/dev/mp-weixin/common/vendor.js index 0ed5cb0a..77dfd7c5 100644 --- a/miniprogram/unpackage/dist/dev/mp-weixin/common/vendor.js +++ b/miniprogram/unpackage/dist/dev/mp-weixin/common/vendor.js @@ -7041,7 +7041,7 @@ function isConsoleWritable() { function initRuntimeSocketService() { const hosts = "172.31.144.1,192.168.21.7,192.168.195.32,127.0.0.1"; const port = "8090"; - const id = "mp-weixin_930-_N"; + const id = "mp-weixin_tvZruD"; const lazy = typeof swan !== "undefined"; let restoreError = lazy ? () => { } : initOnError(); diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/pages/mine/index.js b/miniprogram/unpackage/dist/dev/mp-weixin/pages/mine/index.js index 332bffa8..386b47fa 100644 --- a/miniprogram/unpackage/dist/dev/mp-weixin/pages/mine/index.js +++ b/miniprogram/unpackage/dist/dev/mp-weixin/pages/mine/index.js @@ -51,6 +51,23 @@ const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({ confirmText: "我知道了" }); } + function handleLogout() { + common_vendor.index.showModal({ + title: "提示", + content: "确定要退出登录吗?", + success: (res) => { + if (res.confirm) { + userStore.logout(); + isLoggedIn.value = false; + orderCount.value = 0; + common_vendor.index.showToast({ title: "已退出登录", icon: "success" }); + setTimeout(() => { + common_vendor.index.switchTab({ url: "/pages/index/index" }); + }, 1e3); + } + } + }); + } return (_ctx, _cache) => { var _a, _b; return common_vendor.e({ @@ -64,25 +81,30 @@ const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({ h: common_vendor.o(($event) => navigateTo("/pages/address/index")), i: common_assets._imports_2, j: common_vendor.o(($event) => showQrCode.value = true), - k: common_assets._imports_3, + k: common_assets._imports_3$1, l: common_vendor.o(($event) => showAbout.value = true), m: common_assets._imports_4, n: common_vendor.o(($event) => showAgreement("user")), o: common_assets._imports_5, p: common_vendor.o(($event) => showAgreement("privacy")), - q: showQrCode.value + q: isLoggedIn.value + }, isLoggedIn.value ? { + r: common_assets._imports_3$1, + s: common_vendor.o(handleLogout) + } : {}, { + t: showQrCode.value }, showQrCode.value ? { - r: common_vendor.o(($event) => showQrCode.value = false), - s: common_vendor.p({ + v: common_vendor.o(($event) => showQrCode.value = false), + w: common_vendor.p({ mode: "qrcode" }) } : {}, { - t: showAbout.value + x: showAbout.value }, showAbout.value ? { - v: common_vendor.o(($event) => showAbout.value = false), - w: common_vendor.o(() => { + y: common_vendor.o(($event) => showAbout.value = false), + z: common_vendor.o(() => { }), - x: common_vendor.o(($event) => showAbout.value = false) + A: common_vendor.o(($event) => showAbout.value = false) } : {}); }; } diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/pages/mine/index.wxml b/miniprogram/unpackage/dist/dev/mp-weixin/pages/mine/index.wxml index f0efcc34..14bc24df 100644 --- a/miniprogram/unpackage/dist/dev/mp-weixin/pages/mine/index.wxml +++ b/miniprogram/unpackage/dist/dev/mp-weixin/pages/mine/index.wxml @@ -1 +1 @@ -{{b}}我的订单 {{e}}收货地址联系客服关于我们用户协议隐私协议关于我们珠宝商城 —— 专注珠宝零售,为您提供优质珠宝商品和贴心服务。关闭 \ No newline at end of file +{{b}}我的订单 {{e}}收货地址联系客服关于我们用户协议隐私协议退出登录关于我们珠宝商城 —— 专注珠宝零售,为您提供优质珠宝商品和贴心服务。关闭 \ No newline at end of file diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.js b/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.js index 0df95dd6..675f75a1 100644 --- a/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.js +++ b/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.js @@ -1,16 +1,31 @@ "use strict"; const common_vendor = require("../../common/vendor.js"); +const common_assets = require("../../common/assets.js"); const store_cart = require("../../store/cart.js"); const api_order = require("../../api/order.js"); +const utils_request = require("../../utils/request.js"); const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({ __name: "submit", setup(__props) { const cartStore = store_cart.useCartStore(); + const statusBarHeight = common_vendor.ref(0); + const navBarHeight = common_vendor.ref(44); const receiverName = common_vendor.ref(""); const receiverPhone = common_vendor.ref(""); const receiverAddress = common_vendor.ref(""); + const remark = common_vendor.ref(""); const agreed = common_vendor.ref(false); const submitting = common_vendor.ref(false); + function fullUrl(path) { + if (!path) + return ""; + if (path.startsWith("http")) + return path; + return utils_request.BASE_URL + path; + } + function goBack() { + common_vendor.index.navigateBack(); + } const orderItems = common_vendor.computed(() => cartStore.checkedItems); const totalPrice = common_vendor.computed( () => orderItems.value.reduce((sum, item) => sum + item.specData.totalPrice * item.quantity, 0) @@ -54,33 +69,51 @@ const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({ submitting.value = false; } } + common_vendor.onMounted(() => { + const sysInfo = common_vendor.index.getSystemInfoSync(); + statusBarHeight.value = sysInfo.statusBarHeight || 0; + const menuBtn = common_vendor.index.getMenuButtonBoundingClientRect(); + navBarHeight.value = menuBtn.height + (menuBtn.top - (sysInfo.statusBarHeight || 0)) * 2; + }); return (_ctx, _cache) => { - return common_vendor.e({ - a: receiverName.value, - b: common_vendor.o(($event) => receiverName.value = $event.detail.value), - c: receiverPhone.value, - d: common_vendor.o(($event) => receiverPhone.value = $event.detail.value), - e: receiverAddress.value, - f: common_vendor.o(($event) => receiverAddress.value = $event.detail.value), - g: common_vendor.f(orderItems.value, (item, k0, i0) => { + return { + a: common_assets._imports_0$2, + b: common_vendor.o(goBack), + c: navBarHeight.value + "px", + d: statusBarHeight.value + "px", + e: statusBarHeight.value + navBarHeight.value + "px", + f: common_assets._imports_1, + g: common_assets._imports_2$2, + h: receiverName.value, + i: common_vendor.o(($event) => receiverName.value = $event.detail.value), + j: receiverPhone.value, + k: common_vendor.o(($event) => receiverPhone.value = $event.detail.value), + l: receiverAddress.value, + m: common_vendor.o(($event) => receiverAddress.value = $event.detail.value), + n: remark.value, + o: common_vendor.o(($event) => remark.value = $event.detail.value), + p: common_assets._imports_3, + q: common_vendor.f(orderItems.value, (item, k0, i0) => { + var _a; return { - a: item.product.bannerImages[0] || "", + a: fullUrl(item.product.thumb || ((_a = item.product.bannerImages) == null ? void 0 : _a[0]) || ""), b: common_vendor.t(item.product.name), - c: common_vendor.t(item.specData.modelName), - d: common_vendor.t(item.specData.fineness), - e: common_vendor.t(item.specData.totalPrice), - f: common_vendor.t(item.quantity), - g: item.id + c: common_vendor.t(item.specData.modelName || "B2022"), + d: common_vendor.t(item.specData.fineness || "2606"), + e: common_vendor.t(item.specData.fineness || "30"), + f: common_vendor.t(item.specData.mainStone || "13.00#"), + g: common_vendor.t(item.specData.ringSize || "13.00#"), + h: common_vendor.t(item.specData.goldTotalWeight || "236"), + i: common_vendor.t(item.specData.totalPrice), + j: item.id }; }), - h: common_vendor.t(totalPrice.value), - i: agreed.value - }, agreed.value ? {} : {}, { - j: agreed.value ? 1 : "", - k: common_vendor.o(($event) => agreed.value = !agreed.value), - l: !canSubmit.value ? 1 : "", - m: common_vendor.o(handleSubmit) - }); + r: agreed.value ? "/static/ic_check_s.png" : "/static/ic_check.png", + s: common_vendor.o(($event) => agreed.value = !agreed.value), + t: common_vendor.t(totalPrice.value), + v: !canSubmit.value ? 1 : "", + w: common_vendor.o(handleSubmit) + }; }; } }); diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.json b/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.json index a31f0f9e..ced5b279 100644 --- a/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.json +++ b/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.json @@ -1,4 +1,4 @@ { - "navigationBarTitleText": "提交订单", + "navigationStyle": "custom", "usingComponents": {} } \ No newline at end of file diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.wxml b/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.wxml index d788709a..16906f5a 100644 --- a/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.wxml +++ b/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.wxml @@ -1 +1 @@ -公司地址广东省深圳市罗湖区水贝珠宝交易中心收货信息收货人联系电话收货地址温馨提示:订单确认后,预计3-7个工作日内发货,具体以客服通知为准。商品列表{{item.b}}{{item.c}} {{item.d}}¥{{item.e}}x{{item.f}}合计:¥{{h}}我已知晓贵重物品售出后不支持退换 提交订单 \ No newline at end of file +订单提交公司地址叶生珠宝-空托之城广东省深圳市罗湖区水贝2路贝丽花园21栋108#生珠宝15920028399联系电话:空托之城 叶生15920028399您的信息请留下您的联系方式姓名电话地址备注发货时间上班时间9:30-20:30分,下单15分钟即可出货。镶嵌主石每天18:00前,正常情况当天出货。{{item.b}}款号:{{item.c}}商品型号:{{item.d}}成色:{{item.e}}主石:{{item.f}}手寸:{{item.g}}金料总重:{{item.h}}¥{{item.i}}元因珠宝产品属于贵重物品,一旦出货,产品无质量问题不支持退换!合计:¥{{t}} 开始下单 \ No newline at end of file diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.wxss b/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.wxss index 285bc3ed..4896f1c0 100644 --- a/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.wxss +++ b/miniprogram/unpackage/dist/dev/mp-weixin/pages/order/submit.wxss @@ -4,135 +4,226 @@ background: #f5f5f5; padding-bottom: 140rpx; } -.section.data-v-c3fa8b8a { + +/* 导航栏 */ +.navbar.data-v-c3fa8b8a { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 100; + background: linear-gradient(135deg, #FFCFDE 0%, #FFA6C4 100%); +} +.navbar__content.data-v-c3fa8b8a { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 24rpx; +} +.navbar__back.data-v-c3fa8b8a { + padding: 10rpx; +} +.navbar__back-icon.data-v-c3fa8b8a { + width: 40rpx; + height: 40rpx; +} +.navbar__title.data-v-c3fa8b8a { + font-size: 34rpx; + font-weight: 600; + color: #000; +} +.navbar__placeholder.data-v-c3fa8b8a { + width: 60rpx; +} + +/* 公司地址 */ +.address-section.data-v-c3fa8b8a { background: #fff; - margin-bottom: 16rpx; + margin: 16rpx 24rpx; padding: 24rpx; + border-radius: 16rpx; } -.section__title.data-v-c3fa8b8a { - font-size: 30rpx; - font-weight: bold; - color: #333; +.address-section__header.data-v-c3fa8b8a { + display: flex; + align-items: center; margin-bottom: 16rpx; } -.section__content.data-v-c3fa8b8a { - font-size: 26rpx; - color: #666; +.address-section__icon.data-v-c3fa8b8a { + width: 32rpx; + height: 32rpx; + margin-right: 8rpx; } -.company-address.data-v-c3fa8b8a { - font-size: 26rpx; +.address-section__title.data-v-c3fa8b8a { + font-size: 28rpx; + color: #e91e63; + font-weight: 600; +} +.address-section__content.data-v-c3fa8b8a { + display: flex; + flex-direction: column; + gap: 8rpx; +} +.address-section__name.data-v-c3fa8b8a { + font-size: 28rpx; + color: #333; + font-weight: 600; +} +.address-section__detail.data-v-c3fa8b8a, +.address-section__phone.data-v-c3fa8b8a, +.address-section__contact.data-v-c3fa8b8a { + font-size: 24rpx; color: #666; + line-height: 36rpx; +} + +/* 您的信息 */ +.info-section.data-v-c3fa8b8a { + background: #fff; + margin: 0 24rpx 16rpx; + padding: 24rpx; + border-radius: 16rpx; +} +.info-section__header.data-v-c3fa8b8a { + display: flex; + align-items: center; + margin-bottom: 20rpx; +} +.info-section__icon.data-v-c3fa8b8a { + width: 32rpx; + height: 32rpx; + margin-right: 8rpx; +} +.info-section__title.data-v-c3fa8b8a { + font-size: 28rpx; + color: #e91e63; + font-weight: 600; + margin-right: 12rpx; +} +.info-section__subtitle.data-v-c3fa8b8a { + font-size: 24rpx; + color: #999; } .form-item.data-v-c3fa8b8a { display: flex; align-items: center; - padding: 16rpx 0; + padding: 20rpx 0; border-bottom: 1rpx solid #f0f0f0; } +.form-item.data-v-c3fa8b8a:last-child { + border-bottom: none; +} .form-item__label.data-v-c3fa8b8a { - font-size: 28rpx; + font-size: 26rpx; color: #333; - width: 160rpx; + width: 100rpx; flex-shrink: 0; } +.form-item__label.required.data-v-c3fa8b8a::before { + content: '*'; + color: #e91e63; + margin-right: 4rpx; +} .form-item__input.data-v-c3fa8b8a { flex: 1; - font-size: 28rpx; + font-size: 26rpx; color: #333; } -.notice-section.data-v-c3fa8b8a { - background: #fffbe6; + +/* 发货时间 */ +.delivery-section.data-v-c3fa8b8a { + background: #fff; + margin: 0 24rpx 16rpx; + padding: 24rpx; + border-radius: 16rpx; } -.notice-text.data-v-c3fa8b8a { - font-size: 24rpx; - color: #faad14; -} -.order-item.data-v-c3fa8b8a { +.delivery-section__header.data-v-c3fa8b8a { display: flex; - padding: 16rpx 0; - border-bottom: 1rpx solid #f0f0f0; + align-items: center; + margin-bottom: 12rpx; } -.order-item__img.data-v-c3fa8b8a { +.delivery-section__icon.data-v-c3fa8b8a { + width: 32rpx; + height: 32rpx; + margin-right: 8rpx; +} +.delivery-section__title.data-v-c3fa8b8a { + font-size: 28rpx; + color: #e91e63; + font-weight: 600; +} +.delivery-section__content.data-v-c3fa8b8a { + font-size: 24rpx; + color: #e91e63; + line-height: 36rpx; +} + +/* 商品列表 */ +.product-section.data-v-c3fa8b8a { + background: #fff; + margin: 0 24rpx 16rpx; + padding: 24rpx; + border-radius: 16rpx; +} +.product-item.data-v-c3fa8b8a { + display: flex; + gap: 20rpx; +} +.product-item__img.data-v-c3fa8b8a { width: 160rpx; height: 160rpx; - border-radius: 8rpx; + border-radius: 12rpx; flex-shrink: 0; background: #f5f5f5; } -.order-item__info.data-v-c3fa8b8a { +.product-item__info.data-v-c3fa8b8a { flex: 1; - margin-left: 20rpx; display: flex; flex-direction: column; - justify-content: space-between; } -.order-item__name.data-v-c3fa8b8a { +.product-item__name.data-v-c3fa8b8a { font-size: 28rpx; color: #333; + font-weight: 600; + margin-bottom: 8rpx; } -.order-item__spec.data-v-c3fa8b8a { - font-size: 24rpx; - color: #999; - margin-top: 8rpx; +.product-item__specs.data-v-c3fa8b8a { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 8rpx; + margin-bottom: 12rpx; } -.order-item__bottom.data-v-c3fa8b8a { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 8rpx; -} -.order-item__price.data-v-c3fa8b8a { - font-size: 28rpx; - color: #e4393c; - font-weight: bold; -} -.order-item__qty.data-v-c3fa8b8a { - font-size: 24rpx; - color: #999; -} -.total-bar.data-v-c3fa8b8a { - background: #fff; - padding: 24rpx; - display: flex; - justify-content: flex-end; - align-items: center; - font-size: 28rpx; - color: #333; - margin-bottom: 16rpx; -} -.total-bar__price.data-v-c3fa8b8a { - font-size: 36rpx; - color: #e4393c; - font-weight: bold; - margin-left: 8rpx; -} -.agreement.data-v-c3fa8b8a { - background: #fff; - padding: 24rpx; - display: flex; - align-items: center; - margin-bottom: 16rpx; -} -.agreement__checkbox.data-v-c3fa8b8a { - width: 40rpx; - height: 40rpx; - border: 2rpx solid #ddd; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - margin-right: 16rpx; - font-size: 24rpx; - color: #fff; -} -.agreement__checkbox--checked.data-v-c3fa8b8a { - background: #e4393c; - border-color: #e4393c; -} -.agreement__text.data-v-c3fa8b8a { - font-size: 26rpx; +.product-item__spec.data-v-c3fa8b8a { + font-size: 22rpx; color: #666; } +.product-item__price.data-v-c3fa8b8a { + font-size: 30rpx; + color: #e91e63; + font-weight: 700; +} + +/* 协议 */ +.agreement.data-v-c3fa8b8a { + background: #fffbe6; + margin: 0 24rpx 16rpx; + padding: 20rpx 24rpx; + border-radius: 16rpx; + display: flex; + align-items: center; +} +.agreement__checkbox.data-v-c3fa8b8a { + width: 32rpx; + height: 32rpx; + margin-right: 12rpx; + flex-shrink: 0; +} +.agreement__text.data-v-c3fa8b8a { + font-size: 24rpx; + color: #333; + line-height: 36rpx; +} + +/* 底部提交栏 */ .submit-bar.data-v-c3fa8b8a { position: fixed; bottom: 0; @@ -141,16 +232,32 @@ background: #fff; padding: 16rpx 24rpx; box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05); + display: flex; + align-items: center; + justify-content: space-between; } -.submit-btn.data-v-c3fa8b8a { - background: #e4393c; +.submit-bar__left.data-v-c3fa8b8a { + display: flex; + align-items: baseline; +} +.submit-bar__label.data-v-c3fa8b8a { + font-size: 26rpx; + color: #333; +} +.submit-bar__price.data-v-c3fa8b8a { + font-size: 36rpx; + color: #e91e63; + font-weight: 700; +} +.submit-bar__btn.data-v-c3fa8b8a { + background: linear-gradient(135deg, #FF6D9B, #FF4081); color: #fff; - text-align: center; - padding: 20rpx 0; + padding: 20rpx 60rpx; border-radius: 44rpx; - font-size: 30rpx; + font-size: 28rpx; + font-weight: 600; } -.submit-btn--disabled.data-v-c3fa8b8a { +.submit-bar__btn--disabled.data-v-c3fa8b8a { background: #ccc; pointer-events: none; } diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/static/ic_time.png b/miniprogram/unpackage/dist/dev/mp-weixin/static/ic_time.png new file mode 100644 index 00000000..51f038c0 Binary files /dev/null and b/miniprogram/unpackage/dist/dev/mp-weixin/static/ic_time.png differ diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/static/ic_tip.png b/miniprogram/unpackage/dist/dev/mp-weixin/static/ic_tip.png new file mode 100644 index 00000000..1c1bbb02 Binary files /dev/null and b/miniprogram/unpackage/dist/dev/mp-weixin/static/ic_tip.png differ diff --git a/miniprogram/unpackage/dist/dev/mp-weixin/utils/request.js b/miniprogram/unpackage/dist/dev/mp-weixin/utils/request.js index da3e16fd..41278b53 100644 --- a/miniprogram/unpackage/dist/dev/mp-weixin/utils/request.js +++ b/miniprogram/unpackage/dist/dev/mp-weixin/utils/request.js @@ -6,6 +6,21 @@ const ENV_BASE_URL = { // 部署时替换为真实域名 }; const BASE_URL = ENV_BASE_URL["development"]; +function toCamelCase(obj) { + if (obj === null || typeof obj !== "object") + return obj; + if (Array.isArray(obj)) { + return obj.map((item) => toCamelCase(item)); + } + const result = {}; + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase()); + result[camelKey] = toCamelCase(obj[key]); + } + } + return result; +} function getToken() { return common_vendor.index.getStorageSync("token") || ""; } @@ -34,7 +49,8 @@ function request(options) { if (statusCode >= 200 && statusCode < 300) { const body = res.data; if (body.code === 0) { - resolve(body.data); + const camelData = toCamelCase(body.data); + resolve(camelData); } else { common_vendor.index.showToast({ title: body.message || "请求失败", icon: "none" }); reject(new Error(body.message)); @@ -66,16 +82,16 @@ function autoLogin() { common_vendor.index.setStorageSync("token", data.token); resolve(); } catch (err) { - common_vendor.index.__f__("error", "at utils/request.ts:89", "登录接口调用失败:", err); + common_vendor.index.__f__("error", "at utils/request.ts:109", "登录接口调用失败:", err); reject(err); } } else { - common_vendor.index.__f__("error", "at utils/request.ts:93", "微信登录获取 code 失败"); + common_vendor.index.__f__("error", "at utils/request.ts:113", "微信登录获取 code 失败"); reject(new Error("获取微信 code 失败")); } }, fail: (err) => { - common_vendor.index.__f__("error", "at utils/request.ts:98", "uni.login 失败:", err); + common_vendor.index.__f__("error", "at utils/request.ts:118", "uni.login 失败:", err); reject(err); } }); diff --git a/miniprogram/utils/request.ts b/miniprogram/utils/request.ts index e366f7e7..89dea954 100644 --- a/miniprogram/utils/request.ts +++ b/miniprogram/utils/request.ts @@ -22,6 +22,24 @@ interface ApiResponse { message: string } +/** 将下划线命名转换为驼峰命名 */ +function toCamelCase(obj: any): any { + if (obj === null || typeof obj !== 'object') return obj + + if (Array.isArray(obj)) { + return obj.map(item => toCamelCase(item)) + } + + const result: any = {} + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase()) + result[camelKey] = toCamelCase(obj[key]) + } + } + return result +} + function getToken(): string { return uni.getStorageSync('token') || '' } @@ -52,7 +70,9 @@ export function request(options: RequestOptions): Promise { if (statusCode >= 200 && statusCode < 300) { const body = res.data as ApiResponse if (body.code === 0) { - resolve(body.data) + // 将下划线命名转换为驼峰命名 + const camelData = toCamelCase(body.data) + resolve(camelData) } else { uni.showToast({ title: body.message || '请求失败', icon: 'none' }) reject(new Error(body.message)) diff --git a/server/src/controllers/order.ts b/server/src/controllers/order.ts index 52b73665..0c3628a0 100644 --- a/server/src/controllers/order.ts +++ b/server/src/controllers/order.ts @@ -85,13 +85,65 @@ export async function createOrder(req: AuthRequest, res: Response): Promise { try { - const [rows] = await pool.execute( - `SELECT id, order_no, status, total_price, created_at, updated_at + const [orderRows] = await pool.execute( + `SELECT id, order_no, status, total_price, receiver_name, receiver_phone, receiver_address, created_at, updated_at FROM orders WHERE user_id = ? ORDER BY created_at DESC`, [req.userId] ) - res.json({ code: 0, data: rows }) + + // 为每个订单获取商品信息 + const ordersWithItems = await Promise.all( + orderRows.map(async (order) => { + const [itemRows] = await pool.execute( + `SELECT oi.id, oi.product_id, oi.spec_data_id, oi.quantity, oi.unit_price, + p.name as product_name, p.thumb, p.banner_images, + sd.model_name, sd.fineness, sd.main_stone, sd.ring_size + FROM order_items oi + JOIN products p ON oi.product_id = p.id + JOIN spec_data sd ON oi.spec_data_id = sd.id + WHERE oi.order_id = ?`, + [order.id] + ) + + // 格式化商品数据 + const items = itemRows.map((item) => ({ + id: item.id, + productId: item.product_id, + specDataId: item.spec_data_id, + quantity: item.quantity, + unitPrice: item.unit_price, + product: { + name: item.product_name, + thumb: item.thumb, + bannerImages: item.banner_images ? JSON.parse(item.banner_images) : [], + }, + specData: { + modelName: item.model_name, + fineness: item.fineness, + mainStone: item.main_stone, + ringSize: item.ring_size, + }, + })) + + // 转换为驼峰格式 + return { + id: order.id, + orderNo: order.order_no, + userId: order.user_id, + status: order.status, + totalPrice: order.total_price, + receiverName: order.receiver_name, + receiverPhone: order.receiver_phone, + receiverAddress: order.receiver_address, + createdAt: order.created_at, + updatedAt: order.updated_at, + items, + } + }) + ) + + res.json({ code: 0, data: ordersWithItems }) } catch (err) { console.error('getOrders error:', err) res.status(500).json({ code: 500, message: '获取订单列表失败' }) @@ -117,6 +169,8 @@ export async function getOrderDetail(req: AuthRequest, res: Response): Promise( `SELECT oi.id, oi.product_id, oi.spec_data_id, oi.quantity, oi.unit_price, p.name as product_name, p.banner_images, @@ -128,7 +182,45 @@ export async function getOrderDetail(req: AuthRequest, res: Response): Promise ({ + id: item.id, + productId: item.product_id, + specDataId: item.spec_data_id, + quantity: item.quantity, + unitPrice: item.unit_price, + product: { + name: item.product_name, + bannerImages: item.banner_images ? JSON.parse(item.banner_images) : [], + }, + specData: { + modelName: item.model_name, + fineness: item.fineness, + mainStone: item.main_stone, + ringSize: item.ring_size, + }, + })) + + // 转换为驼峰格式 + const orderDetail = { + id: order.id, + orderNo: order.order_no, + userId: order.user_id, + status: order.status, + totalPrice: order.total_price, + receiverName: order.receiver_name, + receiverPhone: order.receiver_phone, + receiverAddress: order.receiver_address, + paymentTime: order.payment_time, + paymentProof: order.payment_proof, + shippingCompany: order.shipping_company, + shippingNo: order.shipping_no, + createdAt: order.created_at, + updatedAt: order.updated_at, + items, + } + + res.json({ code: 0, data: orderDetail }) } catch (err) { console.error('getOrderDetail error:', err) res.status(500).json({ code: 500, message: '获取订单详情失败' })