Преглед изворни кода

扫码打开小程序 手机号 桌号等修改

sunshibo пре 1 месец
родитељ
комит
a6e3aac9f3

+ 40 - 1
App.vue

@@ -1,12 +1,51 @@
 <script>
 import initConfig from '@/initConfig.js';
+// #ifdef MP-WEIXIN
+import { SCAN_QR_CACHE } from '@/settings/enums.js';
+// #endif
+
+/** 从 scene 或 query 中解析:二维码 s=店铺id,t=桌号id */
+function parseSceneToStoreTable(sceneStr) {
+	const trim = (v) => (v == null ? '' : String(v).trim());
+	let storeId = '';
+	let tableId = '';
+	if (!sceneStr) return { storeId, tableId };
+	const str = trim(sceneStr);
+	try {
+		const parts = str.split('&');
+		parts.forEach((pair) => {
+			const [k, v] = pair.split('=').map((s) => (s ? decodeURIComponent(String(s).trim()) : ''));
+			if (k === 's' || k === 'storeId' || k === 'store_id') storeId = trim(v);
+			if (k === 't' || k === 'tableId' || k === 'table_id' || k === 'tableid') tableId = trim(v);
+		});
+	} catch (err) {
+		console.warn('parseSceneToStoreTable', err);
+	}
+	return { storeId, tableId };
+}
 
 export default {
 	onLaunch: function (e) {
 		// 只有小程序执行
 		// #ifdef MP-WEIXIN
 		initConfig();
-			// getCdnUrl();
+		// 通过二维码编译/扫码进入:将二维码携带的信息缓存(query.scene 为小程序码参数,query.q 为普通链接二维码)
+		try {
+			const sceneEnc = e?.query?.scene;
+			const qEnc = e?.query?.q;
+			const scene = sceneEnc != null && sceneEnc !== '' ? decodeURIComponent(String(sceneEnc)) : '';
+			const q = qEnc != null && qEnc !== '' ? decodeURIComponent(String(qEnc)) : '';
+			const rawFromQR = scene || q || '';
+			if (rawFromQR) {
+				const { storeId, tableId } = parseSceneToStoreTable(rawFromQR);
+				const payload = { raw: rawFromQR, storeId, tableId };
+				uni.setStorageSync(SCAN_QR_CACHE, JSON.stringify(payload));
+				if (storeId) uni.setStorageSync('currentStoreId', storeId);
+				if (tableId) uni.setStorageSync('currentTableId', tableId);
+			}
+		} catch (err) {
+			console.warn('缓存二维码启动参数失败', err);
+		}
 		// #endif
 	},
 	onShow: function (res) {

+ 5 - 4
pages/components/LoginModal.vue

@@ -90,17 +90,18 @@ const handleGetPhoneNumber = async (e) => {
   }
 
   try {
-    // 先获取微信登录code
+    const phoneCode = e.detail?.code || "";
+    // 登录接口:传 code、phoneCode;手机号明文传递(不加密),有缓存则一并传 phone)
     uni.login({
       success: async (loginRes) => {
         try {
-          // 调用快速登录接口
           const res = await DiningUserWechatLogin({
-            code: loginRes.code
+            code: loginRes.code,
+            phoneCode: phoneCode || undefined,
+            phone: userStore.getPhone || undefined  // 明文传递,有缓存则传
           });
 
           if (res && res.token) {
-            // 登录成功,更新用户信息
             userStore.login(res);
             getOpen.value = false;
             emit('success', res);

+ 2 - 1
pages/numberOfDiners/index.vue

@@ -57,7 +57,8 @@ const handleLoginCancel = () => {
 
 const toOrderFood = () => {
   uni.setStorageSync('currentDiners', currentDiners.value);
-  const tableid = 1;
+  // 桌号来自二维码缓存(App 启动时 s=店铺id t=桌号id 已写入 currentTableId)
+  const tableid = uni.getStorageSync('currentTableId') || '';
   const dinersVal = currentDiners.value;
   if (tableid) uni.setStorageSync('currentTableId', String(tableid));
 

+ 21 - 3
pages/orderFood/index.vue

@@ -1,7 +1,7 @@
 <template>
   <!-- 点餐页 -->
   <view class="content">
-    <view class="top-info">桌号:{{ tableId || '—' }} &nbsp;&nbsp;就餐人数:{{ currentDiners }}人</view>
+    <view class="top-info">桌号:{{ displayTableNumber }} &nbsp;&nbsp;就餐人数:{{ currentDiners }}人</view>
     <!-- 搜索 -->
     <input type="text" placeholder="请输入菜品名称" class="search-input" />
 
@@ -54,8 +54,17 @@ import { go } from "@/utils/utils.js";
 import { DiningOrderFood, GetStoreCategories, GetStoreCuisines, getOrderSseConfig, GetOrderCart, PostOrderCartAdd, PostOrderCartUpdate, PostOrderCartClear } from "@/api/dining.js";
 import { createSSEConnection } from "@/utils/sse.js";
 
-const tableId = ref(''); // 桌号,来自上一页 url 参数 tableid
+const tableId = ref(''); // 桌号ID,来自上一页 url 参数 tableid,用于接口入参
+const tableNumber = ref(''); // 桌号展示,来自 dining/page-info 接口返回的 tableNumber
+const tableNumberFetched = ref(false); // 是否已请求过桌号(避免未返回前用 tableId 展示导致闪一下 43)
 const currentDiners = ref(uni.getStorageSync('currentDiners') || '');
+
+// 桌号展示:优先用接口返回的 tableNumber,未请求完前不显示 tableId,避免闪 43 再变 2
+const displayTableNumber = computed(() => {
+  if (tableNumber.value) return tableNumber.value;
+  if (tableNumberFetched.value && tableId.value) return tableId.value;
+  return '—';
+});
 let sseRequestTask = null; // 订单 SSE 连接(封装后兼容小程序),页面卸载时需 abort()
 const currentCategoryIndex = ref(0);
 const couponModalOpen = ref(false);
@@ -504,11 +513,13 @@ const handleOrderClick = () => {
     totalAmount: displayTotalAmount.value,
     totalQuantity: displayTotalQuantity.value,
     tableId: tableId.value,
+    tableNumber: tableNumber.value,
     diners: currentDiners.value
   };
   uni.setStorageSync('placeOrderCart', JSON.stringify(cartPayload));
   const query = [];
   if (tableId.value) query.push(`tableId=${encodeURIComponent(tableId.value)}`);
+  if (tableNumber.value) query.push(`tableNumber=${encodeURIComponent(tableNumber.value)}`);
   if (currentDiners.value) query.push(`diners=${encodeURIComponent(currentDiners.value)}`);
   go(query.length ? `/pages/placeOrder/index?${query.join('&')}` : '/pages/placeOrder/index');
 };
@@ -569,8 +580,12 @@ onLoad(async (options) => {
       });
       console.log('点餐页接口返回:', res);
 
+      const data = res?.data ?? res ?? {};
+      tableNumber.value = data?.tableNumber ?? data?.tableNo ?? '';
+      tableNumberFetched.value = true;
+
       // 成功后调接口获取菜品种类(storeId 取自点餐页接口返回,若无则需从别处获取)
-      const storeId = res?.storeId ?? res?.data?.storeId ?? '';
+      const storeId = res?.storeId ?? data?.storeId ?? '';
       if (storeId) uni.setStorageSync('currentStoreId', storeId);
       if (storeId) {
         try {
@@ -600,7 +615,10 @@ onLoad(async (options) => {
       }
     } catch (e) {
       console.error('点餐页接口失败:', e);
+      tableNumberFetched.value = true;
     }
+  } else {
+    tableNumberFetched.value = true;
   }
 });
 

+ 2 - 0
pages/orderInfo/index.vue

@@ -273,6 +273,7 @@ const handleCheckout = (order) => {
   const orderId = order?.id ?? order?.orderId ?? '';
   const orderNo = order?.orderNo ?? order?.orderNumber ?? orderId ?? '';
   const tableId = order?.tableId ?? order?.tableNumber ?? '';
+  const tableNumber = order?.tableNumber ?? order?.tableNo ?? '';
   const diners = order?.dinerCount ?? order?.diners ?? '';
   const totalAmount = order?.totalPrice ?? order?.payAmount ?? 0;
   const remark = (order?.remark ?? '').trim().slice(0, 30);
@@ -280,6 +281,7 @@ const handleCheckout = (order) => {
   if (orderId !== '') q.push(`orderId=${encodeURIComponent(String(orderId))}`);
   if (orderNo !== '') q.push(`orderNo=${encodeURIComponent(String(orderNo))}`);
   if (tableId !== '' && tableId != null) q.push(`tableId=${encodeURIComponent(String(tableId))}`);
+  if (tableNumber !== '') q.push(`tableNumber=${encodeURIComponent(String(tableNumber))}`);
   if (diners !== '' && diners != null) q.push(`diners=${encodeURIComponent(String(diners))}`);
   if (totalAmount != null && totalAmount !== '') q.push(`totalAmount=${encodeURIComponent(String(totalAmount))}`);
   if (remark !== '') q.push(`remark=${encodeURIComponent(remark)}`);

+ 2 - 0
pages/orderInfo/orderDetail.vue

@@ -206,6 +206,7 @@ const handleConfirmPay = () => {
   const orderId = detailOrderId.value || '';
   const orderNo = orderDetail.value?.orderNo ?? '';
   const tableId = orderDetail.value?.tableId || orderDetail.value?.tableNo || '';
+  const tableNumber = orderDetail.value?.tableNo ?? orderDetail.value?.tableNumber ?? '';
   const diners = orderDetail.value?.dinerCount ?? '';
   const totalAmount = priceDetail.value?.total ?? '';
   const remark = (orderDetail.value?.remark ?? '').trim().slice(0, 30);
@@ -213,6 +214,7 @@ const handleConfirmPay = () => {
   if (orderId !== '') q.push(`orderId=${encodeURIComponent(String(orderId))}`);
   if (orderNo !== '') q.push(`orderNo=${encodeURIComponent(String(orderNo))}`);
   if (tableId !== '') q.push(`tableId=${encodeURIComponent(String(tableId))}`);
+  if (tableNumber !== '') q.push(`tableNumber=${encodeURIComponent(String(tableNumber))}`);
   if (diners !== '') q.push(`diners=${encodeURIComponent(String(diners))}`);
   if (totalAmount !== '' && totalAmount != null) q.push(`totalAmount=${encodeURIComponent(String(totalAmount))}`);
   if (remark !== '') q.push(`remark=${encodeURIComponent(remark)}`);

+ 6 - 2
pages/placeOrder/index.vue

@@ -10,7 +10,7 @@
       <view class="card-content">
         <view class="info-item">
           <view class="info-item-label">就餐桌号</view>
-          <view class="info-item-value">{{ orderInfo.tableId || '—' }}</view>
+          <view class="info-item-value">{{ orderInfo.tableNumber || orderInfo.tableId || '—' }}</view>
         </view>
         <view class="info-item">
           <view class="info-item-label">用餐人数</view>
@@ -121,7 +121,8 @@ const payOrderId = ref('');
 // 订单信息(从购物车带过来或 URL 参数)
 const orderInfo = ref({
   orderNo: '',
-  tableId: '',
+  tableId: '',      // 桌号ID,接口入参用
+  tableNumber: '',  // 桌号展示(如 2),优先显示
   diners: '',
   contactPhone: '',
   remark: '',
@@ -202,6 +203,7 @@ const handleConfirmOrder = async () => {
       orderId: orderId ?? undefined,
       orderNo: orderNo ?? undefined,
       tableId: orderInfo.value.tableId,
+      tableNumber: orderInfo.value.tableNumber,
       diners: orderInfo.value.diners,
       totalAmount: total,
       remark: (orderInfo.value.remark ?? '').trim().slice(0, 30)
@@ -286,6 +288,7 @@ onLoad((options) => {
   if (options?.orderId != null && options?.orderId !== '') payOrderId.value = options.orderId;
   if (options?.orderNo != null && options?.orderNo !== '') orderInfo.value.orderNo = options.orderNo;
   if (options?.tableId) orderInfo.value.tableId = options.tableId;
+  if (options?.tableNumber != null && options?.tableNumber !== '') orderInfo.value.tableNumber = options.tableNumber;
   if (options?.diners) orderInfo.value.diners = options.diners;
   if (options?.remark != null && options?.remark !== '') orderInfo.value.remark = decodeURIComponent(options.remark);
   if (options?.totalAmount != null && options?.totalAmount !== '') {
@@ -301,6 +304,7 @@ onLoad((options) => {
       const list = Array.isArray(data.list) ? data.list : [];
       foodList.value = list.map(normalizeCartItem).filter((item) => (item.quantity || 0) > 0);
       if (data.tableId != null) orderInfo.value.tableId = data.tableId;
+      if (data.tableNumber != null) orderInfo.value.tableNumber = data.tableNumber;
       if (data.diners != null) orderInfo.value.diners = data.diners;
       if (data.remark != null) orderInfo.value.remark = data.remark;
       const total = Number(data.totalAmount) || 0;

+ 3 - 0
pages/result/index.vue

@@ -34,6 +34,7 @@ const handleGoSettle = () => {
   let orderId = '';
   let orderNo = '';
   let tableId = '';
+  let tableNumber = '';
   let diners = '';
   let totalAmount = '';
   let remark = '';
@@ -44,6 +45,7 @@ const handleGoSettle = () => {
       orderId = data?.orderId ?? resultOrderId.value ?? '';
       orderNo = data?.orderNo ?? '';
       tableId = data?.tableId ?? '';
+      tableNumber = data?.tableNumber ?? '';
       diners = data?.diners ?? '';
       totalAmount = data?.totalAmount != null ? String(data.totalAmount) : '';
       remark = (data?.remark ?? '').trim().slice(0, 30);
@@ -56,6 +58,7 @@ const handleGoSettle = () => {
   if (orderId !== '') q.push(`orderId=${encodeURIComponent(String(orderId))}`);
   if (orderNo !== '') q.push(`orderNo=${encodeURIComponent(String(orderNo))}`);
   if (tableId !== '') q.push(`tableId=${encodeURIComponent(tableId)}`);
+  if (tableNumber !== '') q.push(`tableNumber=${encodeURIComponent(tableNumber)}`);
   if (diners !== '') q.push(`diners=${encodeURIComponent(diners)}`);
   if (totalAmount !== '') q.push(`totalAmount=${encodeURIComponent(totalAmount)}`);
   if (remark !== '') q.push(`remark=${encodeURIComponent(remark)}`);

+ 1 - 1
project.config.json

@@ -31,5 +31,5 @@
   },
   "appid": "wxc9598c736783dfa9",
   "editorSetting": {},
-  "libVersion": "3.14.0"
+  "libVersion": "3.14.2"
 }

+ 4 - 3
project.private.config.json

@@ -1,8 +1,8 @@
 {
-  "libVersion": "3.14.0",
+  "libVersion": "3.14.2",
   "projectname": "WechatApp",
   "setting": {
-    "urlCheck": true,
+    "urlCheck": false,
     "coverView": true,
     "lazyloadPlaceholderEnable": false,
     "skylineRenderEnable": false,
@@ -16,6 +16,7 @@
     "showES6CompileOption": false,
     "checkInvalidKey": true,
     "ignoreDevUnusedFiles": true,
-    "bigPackageSizeSupport": false
+    "bigPackageSizeSupport": false,
+    "useApiHostProcess": true
   }
 }

+ 5 - 0
settings/enums.js

@@ -3,6 +3,8 @@ export const CDN_CACHE_KEY = "https://alien-volume.oss-cn-beijing.aliyuncs.com/"
 
 // 储存用户信息
 export const USER_INFO = "USER_INFO"
+// 用户微信授权手机号(登录成功后缓存)
+export const USER_PHONE = "USER_PHONE"
 
 // 储存token
 export const TOKEN = "TOKEN"
@@ -11,4 +13,7 @@ export const OPEN_ID = "OPEN_ID"
 // 登录成功后重定向地址
 export const REDIRECT_KEY = "REDIRECT"
 
+// 扫码点餐:从二维码获取的信息缓存(raw 原始内容、storeId、tableId)
+export const SCAN_QR_CACHE = "SCAN_QR_CACHE"
+
 

+ 1 - 1
settings/siteSetting.js

@@ -5,7 +5,7 @@ export const DEFAULT_CDN_URL = 'https://alien-volume.oss-cn-beijing.aliyuncs.com
 export const UPLOAD = 'https://alien-volume.oss-cn-beijing.aliyuncs.com/';
 
 // 请求地址  development 开发 | production 正式
-export const BASE_API_URL = process.env.NODE_ENV === 'development' ? 'http://192.168.1.91:8000/aliendining' : 'http://192.168.1.91:8000/aliendining';
+export const BASE_API_URL = process.env.NODE_ENV === 'development' ? 'http://192.168.10.84:30014' : 'http://192.168.1.91:8000';
 
 /** 文件上传 请求地址 */
 export const UPLOAD_URL = 'https://api.xxxxxx.cn/File/UploadImg';

+ 10 - 4
store/user.js

@@ -1,5 +1,5 @@
 import { defineStore } from "pinia";
-import { USER_INFO, TOKEN, OPEN_ID, REDIRECT_KEY } from "@/settings/enums.js";
+import { USER_INFO, TOKEN, OPEN_ID, REDIRECT_KEY, USER_PHONE } from "@/settings/enums.js";
 
 export const useUserStore = defineStore({
   id: "app-user",
@@ -17,7 +17,11 @@ export const useUserStore = defineStore({
       return this.token || uni.getStorageSync(TOKEN) || "";
     },
     getOpenId() {
-      return this.openId || uni.getStorageSync(USER_INFO).openId || "";
+      return this.openId || uni.getStorageSync(USER_INFO)?.openId || "";
+    },
+    getPhone() {
+      const info = this.userInfo || uni.getStorageSync(USER_INFO) || {};
+      return info.phone ?? info.mobile ?? info.contactPhone ?? uni.getStorageSync(USER_PHONE) ?? "";
     },
   },
   actions: {
@@ -26,13 +30,15 @@ export const useUserStore = defineStore({
       this.userInfo = e;
       uni.setStorageSync(USER_INFO, e);
     },
-    // 登录
+    // 登录(含微信授权手机号时一并缓存)
     login(e) {
       this.userInfo = e;
       this.token = e.token;
       this.siteId = e.siteId;
       uni.setStorageSync(TOKEN, e.token);
       uni.setStorageSync(USER_INFO, e);
+      const phone = e.phone ?? e.mobile ?? e.contactPhone ?? "";
+      if (phone) uni.setStorageSync(USER_PHONE, phone);
       setTimeout(() => {
         uni.showToast({
           title: "登录成功",
@@ -63,7 +69,7 @@ export const useUserStore = defineStore({
         ...option,
       };
       try {
-        const keys = [USER_INFO, TOKEN];
+        const keys = [USER_INFO, TOKEN, USER_PHONE];
         await Promise.all(keys.map((key) => uni.removeStorageSync(key))).then(
           () => {
             this.userInfo = null;