Parcourir la source

商品 兑换业务对接完毕 等待登录与查询用户信息接口

dedsudiyu il y a 1 semaine
Parent
commit
5b25f8e813
6 fichiers modifiés avec 81 ajouts et 39 suppressions
  1. 21 23
      api/index.js
  2. 3 1
      api/request/config.js
  3. 22 2
      api/request/request.js
  4. 27 7
      pages/commodityInfo.vue
  5. 7 6
      pages/home.vue
  6. 1 0
      pages/login.vue

+ 21 - 23
api/index.js

@@ -1,10 +1,7 @@
 import { apiResquest,apiResquestForm,apiResquestJsonList,apiResquestFormVideo,apiResquestTimer } from '@/api/request/request.js'
 
-
-//【调试总开关】:设为 true 使用假数据,设为 false 调用真实接口
+//mock开关
 const USE_MOCK = true; 
-
-// 模拟后端返回的 Promise 结构(让前端调用时和真实接口完全一样)
 const mockResponse = (data) => {
   return new Promise((resolve) => {
     setTimeout(() => {
@@ -16,7 +13,7 @@ const mockResponse = (data) => {
 				},
 				statusCode: 200
       });
-    }, 500); // 模拟 500毫秒 的网络延迟,让 loading 效果也能调试到
+    }, 500);
   });
 };
 
@@ -26,6 +23,7 @@ export const login = (data) => {
     return mockResponse({
 			token:'123456',
 			phone:'13333333333',
+			userId:'123',
 		});
   }
   return apiResquest({
@@ -54,32 +52,32 @@ export const getUserInfo = (data) => {
 
 // 获取商品信息
 export const getCommodityInfo = (data) => {
-  if (USE_MOCK) {
-    return mockResponse({
-      name:'康师傅红烧牛肉面',
-			price:'500',
-    });
-  }
+  // if (USE_MOCK) {
+  //   return mockResponse({
+  //     name:'康师傅红烧牛肉面',
+		// 	price:'500',
+  //   });
+  // }
 
   return apiResquest({
-    url: `/demo/demo/demo2`,
-    method: 'GET',
-    data: data,
+    url: `/sale/points/record/getProductDetail`,
+    method: 'POST',
+    data: { ...data }
   })
 };
 
 // 兑换商品
 export const exchangeGoods = (data) => {
-  if (USE_MOCK) {
-		const randomBit = Math.round(Math.random());
-    return mockResponse({
-      state:randomBit,
-    });
-  }
+  // if (USE_MOCK) {
+		// const randomBit = Math.round(Math.random());
+  //   return mockResponse({
+  //     state:randomBit,
+  //   });
+  // }
 
   return apiResquest({
-    url: `/demo/demo/demo2`,
-    method: 'GET',
-    data: data,
+    url: `/sale/points/record/exchangePoints`,
+    method: 'POST',
+    data: { ...data }
   })
 };

+ 3 - 1
api/request/config.js

@@ -1,5 +1,7 @@
 const config = {
-	base_url: 'https://192.168.166.11/api', //安科院
+	base_url: 'http://192.168.1.55:8080', //安科院
+	APP_ID: "app_20260603181947",
+	APP_SECRET: "sk_a7f3e9d2c8b5014f6a2e9d7c3b8a5f1e",
 }
 export {
 	config

+ 22 - 2
api/request/request.js

@@ -4,9 +4,13 @@ import {
 import {
 	tansParams
 } from "./util.js";
-
+import {
+	hex_md5
+} from '@/utils/md5.js';
 export const apiResquest = (prams) => {
 	return new Promise((resolve, reject) => {
+		const timestamp = Date.now().toString();
+		const sign = generateSign(config.APP_ID, config.APP_SECRET, timestamp, prams.data);
 		let url = config.base_url + prams.url;
 		uni.showLoading({
 			title: '加载中',
@@ -28,7 +32,9 @@ export const apiResquest = (prams) => {
 			method: prams.method,
 			header: {
 				'content-type': 'application/json;charset=utf-8',
-				'Authorization': uni.getStorageSync('token')
+				// 'Authorization': uni.getStorageSync('token'),
+				'timestamp': timestamp,
+				'sign': sign
 			},
 			success: (res) => {
 				// 成功
@@ -459,3 +465,17 @@ export function loginTimeout(params) {
 		}
 	}, 2000);
 }
+// ========== 前端签名工具 ==========
+function generateSign(appId, appSecret, timestamp, params) {
+    const sortedKeys = Object.keys(params).sort();
+    let signStr = `appId=${appId}&timestamp=${timestamp}`;
+    sortedKeys.forEach((key) => {
+        const value = params[key];
+        if (value !== null && value !== undefined && value !== '') {
+            signStr += `&${key}=${value}`;
+        }
+    });
+    signStr += `&appSecret=${appSecret}`;
+    // MD5 加密,转大写
+    return hex_md5(signStr).toUpperCase();
+}

+ 27 - 7
pages/commodityInfo.vue

@@ -9,6 +9,9 @@
 				<view class="product-price">
 					<text class="price-value">{{ commodityData.price?commodityData.price+' 积分':'' }}</text>
 				</view>
+				<view class="product-slotNo">
+					<text class="price-value">货道 {{ commodityData.slotNo }}</text>
+				</view>
 			</view>
 			<view class="flex-null-2"></view>
 			<view class="clickButton" @click="clickButton()">立即兑换</view>
@@ -18,6 +21,7 @@
 			<img class="remind-img" v-if="state==1" src="@/static/icon_kcxq_cg.png">
 			<img class="remind-img" v-if="state!=1" src="@/static/icon_kcxq_sb.png">
 			<view class="commodity-message">{{state==1?'兑换成功':'兑换失败'}}</view>
+			<view class="commodity-message">正在出货 请稍作等待</view>
 			<view class="flex-null-2"></view>
 			<view class="clickButton" @click="bottomButton()">{{state==1?'返回':'重试'}}</view>
 			<view class="flex-null-1"></view>
@@ -85,8 +89,11 @@
 		methods: {
 			async getCommodityInfo() {
 				let obj = {
+					mid:this.mid,
+					sid:this.sid,
+					pid:this.pid,
+					pri:this.pri,
 					token: uni.getStorageSync('token'),
-					phone: uni.getStorageSync('phone'),
 				}
 				const {
 					data
@@ -94,6 +101,10 @@
 				if (data.code == 200) {
 					this.$set(this, 'commodityData', data.data);
 					this.$set(this, 'pageType', 1);
+				}else{
+					setTimeout(() => {
+						uni.navigateBack();
+					}, 2000);
 				}
 			},
 			clickButton() {
@@ -125,18 +136,18 @@
 			},
 			async exchangeGoods() {
 				let obj = {
+					mid:this.mid,
+					sid:this.sid,
+					pid:this.pid,
+					pri:this.pri,
 					token: uni.getStorageSync('token'),
-					phone: uni.getStorageSync('phone'),
-					mid: this.mid,
-					sid: this.sid,
-					pid: this.pid,
-					pri: this.pri,
+					uid:uni.getStorageSync('userId')
 				}
 				const {
 					data
 				} = await exchangeGoods(obj)
 				if (data.code == 200) {
-					this.$set(this, 'state', data.data.state);
+					this.$set(this, 'state', 1);
 					this.$set(this, 'pageType', 2);
 				}
 			},
@@ -197,6 +208,15 @@
 					margin-bottom: 30rpx;
 				}
 
+				.product-slotNo {
+					margin-top:40rpx;
+					font-size: 48rpx;
+					font-weight: 700;
+					color: #0183FA;
+					text-shadow: 0 2rpx 4rpx rgba(231, 76, 60, 0.2);
+					animation: pulse 2s infinite alternate;
+				}
+
 				.product-price {
 					font-size: 56rpx;
 					font-weight: 700;

+ 7 - 6
pages/home.vue

@@ -57,14 +57,15 @@
 				}
 			},
 			scanCode() {
-				uni.navigateTo({
-					url: "/pages/scanCodePage",
-				});
-				// let result = 'http://192.168.166.11/api/exam/points/record/exchangeMachineService?mid=2603220061&sid=6&pid=6&pri=100.00';
 				// uni.navigateTo({
-				// 	url: '/pages/commodityInfo?q=' +
-				// 		encodeURIComponent(JSON.stringify(result))
+				// 	url: "/pages/scanCodePage",
 				// });
+				let result = 'http://192.168.166.11?mid=202504161656&sid=12&pid=1&pri=1';
+				// let result = 'http://192.168.166.11?mid=20250416165612&sid=12&pid=1&pri=1';
+				uni.navigateTo({
+					url: '/pages/commodityInfo?q=' +
+						encodeURIComponent(JSON.stringify(result))
+				});
 			}
 		}
 	}

+ 1 - 0
pages/login.vue

@@ -80,6 +80,7 @@
 				if (data.code == 200) {
 					uni.setStorageSync('token', data.data.token);
 					uni.setStorageSync('phone', data.data.phone);
+					uni.setStorageSync('userId', data.data.userId);
 					uni.redirectTo({
 						url: '/pages/home',
 					});