feat(order): 优化订单流程

- 新增获取微信openid和生成支付订单的API接口
- 修改登录逻辑,保存公众号appid
- 优化AiDrama页面,接入新的AI生成接口
- 屏蔽商品tabbar
- 完善素材编辑页面,增加修改意见展示
This commit is contained in:
fhysy 2025-03-20 17:41:33 +08:00
parent 7946d4995d
commit c45996fdd8
12 changed files with 887 additions and 599 deletions

View File

@ -9,6 +9,7 @@
export default { export default {
onLaunch: function() { onLaunch: function() {
console.log('App Launch'); console.log('App Launch');
// #ifdef MP-WEIXIN
const updateManager = uni.getUpdateManager(); const updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(function (res) { updateManager.onCheckForUpdate(function (res) {
@ -33,6 +34,7 @@
updateManager.onUpdateFailed(function (res) { updateManager.onUpdateFailed(function (res) {
// //
}); });
// #endif
}, },
onShow: function() { onShow: function() {
console.log('App Show'); console.log('App Show');

View File

@ -1,51 +1,14 @@
export default{ export default{
cdnImgUrl:'http://static.drgyen.com/app/hc-app-power/images', cdnImgUrl:'http://static.drgyen.com/app/hc-app-power/images',
// 正式 // 正式
// baseUrl: 'https://ny-core.dieruen-iot.com', // baseUrl: 'https://platform-core.059000.xyz',
// imgUrl: 'https://ny-core.dieruen-iot.com', // imgUrl: 'https://platform-core.059000.xyz',
// wsUrl: 'wss://ny-core.dieruen-iot.com', // wsUrl: 'wss://ny-core.dieruen-iot.com',
// 弃用
// iotOsBaseUrl:"https://iot.gkiiot.com/prod-api",
// 德润正式
// baseUrl: 'https://digital-core.dieruen-iot.com',
// imgUrl: 'https://digital-core.dieruen-iot.com',
// wsUrl: 'wss://digital-core.dieruen-iot.com',
// 谷云正式
// baseUrl: 'https://digital-core.drgyen.com',
// imgUrl: 'https://digital-core.drgyen.com',
// wsUrl: 'wss://digital-core.drgyen.com',
// 商城本地测试环境 // 商城本地测试环境
baseUrl: 'http://192.168.1.17:8080', baseUrl: 'http://192.168.1.17:8080',
imgUrl: 'http://192.168.1.17:8080', imgUrl: 'http://192.168.1.17:8080',
wsUrl: 'wss://digital-core.drgyen.com', wsUrl: 'wss://digital-core.drgyen.com',
// 长城
// baseUrl: 'https://zhny.snc.cn/prod-api/',
// imgUrl: 'https://zhny.snc.cn/prod-api/',
// wsUrl: 'wss://zhny.snc.cn/prod-api/',
// 线下
// baseUrl: 'http://192.168.1.17:8899',
// imgUrl: 'http://192.168.1.17:8899',
// wsUrl: 'ws://192.168.1.17:8899',
// iotOsBaseUrl:"http://192.168.18.139:8080",
// 本地
// baseUrl: 'http://192.168.18.134:9988/dev-api',
// imgUrl: 'http://192.168.18.134:9988/dev-api',
// iotOsBaseUrl:"http://iot.gkiiot.com:8080",
// #ifdef MP-WEIXIN
// mqttUrl:'wx://iot.gkiiot.com:8083/mqtt',
// mqttUrl:'wxs://iot.gkiiot.com/mqtt-ws/mqtt',
// mqttUrl:'wx://192.168.18.139:8083/mqtt',
// mqttUrl:'wx://iot.gkiiot.com:8083/mqtt',
//#endif
// #ifndef MP-WEIXIN
// mqttUrl:'ws://iot.gkiiot.com:8083/mqtt',
// mqttUrl:'ws://192.168.18.139:8083/mqtt',
// mqttUrl:'wx://iot.gkiiot.com:8083/mqtt',
// #endif
// 客户端id // 客户端id
clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e', clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e',
} }

View File

@ -166,4 +166,26 @@ export default {
}) })
}) })
}, },
// 获取openid
getWxOpenid(data){
return new Promise((resolve, reject) => {
request.get('/wx/offiaccount/getAccessToken',data)
.then((res) =>{
resolve(res);
}).catch(err =>{
reject(err);
})
})
},
// 生成支付订单
addPayOrder(data){
return new Promise((resolve, reject) => {
request.post('/mall/order/pay',data)
.then((res) =>{
resolve(res);
}).catch(err =>{
reject(err);
})
})
},
} }

View File

@ -122,17 +122,22 @@
"h5" : { "h5" : {
"devServer" : { "devServer" : {
"https" : false, "https" : false,
"port" : 8055, "port" : 8055
"disableHostCheck" : true // Host false
}, },
"disableHostCheck" : true, // Host false
"router" : { "router" : {
"mode" : "hash", "mode" : "hash"
"base" : ""
}, },
"base" : "",
// "base" : "/app/",
"optimization" : { "optimization" : {
"treeShaking" : { "treeShaking" : {
"enable" : false "enable" : true
} }
} }
} }
} }
// "port" : 8055
// "disableHostCheck" : true, // Host false
// "base" : "/app/"

View File

@ -1,20 +1 @@
{ {}
"name": "hc-zhyd-app",
"version": "1.0.0",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"flyio": "^0.6.14",
"mqtt": "^3.0.0"
},
"repository": {
"type": "git",
"url": "https://e.coding.net/fengsl/zhihuiyongdian/hc-app-power.git"
},
"description": ""
}

View File

@ -120,12 +120,14 @@
"text": "消息", "text": "消息",
"iconPath": "static/images/toolbar/new.png", "iconPath": "static/images/toolbar/new.png",
"selectedIconPath": "static/images/toolbar/new-active.png" "selectedIconPath": "static/images/toolbar/new-active.png"
}, { },
"pagePath": "pages/tabBar/product", // {
"text": "商品", // "pagePath": "pages/tabBar/product",
"iconPath": "static/images/toolbar/product.png", // "text": "商品",
"selectedIconPath": "static/images/toolbar/product-active.png" // "iconPath": "static/images/toolbar/product.png",
}, { // "selectedIconPath": "static/images/toolbar/product-active.png"
// },
{
"pagePath": "pages/tabBar/order", "pagePath": "pages/tabBar/order",
"text": "订单", "text": "订单",
"iconPath": "static/images/toolbar/order.png", "iconPath": "static/images/toolbar/order.png",

View File

@ -124,6 +124,7 @@
smsLoading:false, smsLoading:false,
loading:false, loading:false,
icpLicense:'', icpLicense:'',
homePage:"/pages/tabBar/order"
} }
}, },
computed: { computed: {
@ -161,7 +162,7 @@
console.log("userToken", userToken) console.log("userToken", userToken)
if (userToken) { if (userToken) {
uni.switchTab({ uni.switchTab({
url: "../tabBar/product" url: this.homePage
}) })
} else { } else {
// this.getCode(); // this.getCode();
@ -368,7 +369,7 @@
smsCode: this.form.smsCode, smsCode: this.form.smsCode,
}, },
header: { header: {
UserType: this.usetTypeValue == "普通用户" ? "PERSONAL" : "TENANT", // UserType: this.usetTypeValue == "" ? "PERSONAL" : "TENANT",
}, },
success: (res) => { success: (res) => {
console.log(res); console.log(res);
@ -379,29 +380,29 @@
}) })
this.$store.dispatch('setLogin', res.data.token); this.$store.dispatch('setLogin', res.data.token);
uni.setStorage({ uni.setStorage({
key: 'userType', key: 'appIdPublic',
data: this.usetTypeValue, data: this.appConfig.appIdPublic,
}).then(res => {
return uni.setStorage({
key: 'tenantId',
data: this.form.tenantId,
})
}).then(res => { }).then(res => {
return uni.setStorage({ return uni.setStorage({
key: 'phonenumber', key: 'phonenumber',
data: this.form.phonenumber, data: this.form.phonenumber,
}) })
}).then(res => {
return uni.setStorage({
key: 'smsCode',
data: this.form.smsCode,
})
}).then(res => { }).then(res => {
setTimeout(() => { setTimeout(() => {
if (this.usetTypeValue == "普通用户") { // if (this.usetTypeValue == "") {
uni.reLaunch({ // uni.reLaunch({
url: "../oneselfUser/index" // url: "../oneselfUser/index"
}) // })
} else { // } else {
uni.switchTab({ uni.switchTab({
url: "../tabBar/product" url: this.homePage
}) })
} // }
}, 1000) }, 1000)
}) })
} else { } else {
@ -440,8 +441,13 @@
}) })
this.$store.dispatch('setLogin', res.data.data.access_token); this.$store.dispatch('setLogin', res.data.data.access_token);
uni.setStorage({ uni.setStorage({
key: 'userType', key: 'appIdPublic',
data: this.usetTypeValue, data: this.appConfig.appIdPublic,
}).then(res => {
return uni.setStorage({
key: 'tenantId',
data: this.form.tenantId,
})
}).then(res => { }).then(res => {
return uni.setStorage({ return uni.setStorage({
key: 'phonenumber', key: 'phonenumber',
@ -449,15 +455,16 @@
}) })
}).then(res => { }).then(res => {
setTimeout(() => { setTimeout(() => {
if (this.usetTypeValue == "普通用户") { // if (this.usetTypeValue == "") {
uni.reLaunch({ // uni.reLaunch({
url: "../oneselfUser/index" // url: "../oneselfUser/index"
}) // })
} else { // } else {
console.log("this.homePage",this.homePage)
uni.switchTab({ uni.switchTab({
url: "../tabBar/product" url: this.homePage
}) })
} // }
}, 1000) }, 1000)
}) })
} else { } else {

View File

@ -127,6 +127,7 @@
isTenant: true, isTenant: true,
appIdMini:'', appIdMini:'',
icpLicense:'', icpLicense:'',
homePage:"/pages/tabBar/order"
} }
}, },
computed: { computed: {
@ -159,20 +160,20 @@
if(e.mode == '1'){ //mode:1 if(e.mode == '1'){ //mode:1
this.form.username = e.user || ''; this.form.username = e.user || '';
this.form.password = e.pwd || ''; this.form.password = e.pwd || '';
this.autoLogin() // this.autoLogin()
}else{ }else{
userToken = uni.getStorageSync('userToken'); userToken = uni.getStorageSync('userToken');
console.log("userToken", userToken) console.log("userToken", userToken)
if (userToken) { if (userToken) {
uni.switchTab({ uni.switchTab({
url: "../tabBar/product" url: this.homePage
}) })
} else { } else {
// this.getCodeImageFn(); // this.getCodeImageFn();
} }
} }
this.usetTypeValue = e.userType == "user" ? "普通用户" : "企业用户"; // this.usetTypeValue = e.userType == "user" ? "" : "";
}, },
onShow() { onShow() {
@ -339,11 +340,11 @@
url: '/pages/tabBar/my/userPolicy' url: '/pages/tabBar/my/userPolicy'
}) })
}, },
goForgotPasswordFn() { // goForgotPasswordFn() {
uni.navigateTo({ // uni.navigateTo({
url: `./forgotPassword?userType=${this.usetTypeValue=="普通用户"?"user":"company"}` // url: `./forgotPassword?userType=${this.usetTypeValue==""?"user":"company"}`
}) // })
}, // },
// //
getCodeImageFn() { getCodeImageFn() {
this.$get("/captchaImage").then((res) => { this.$get("/captchaImage").then((res) => {
@ -361,7 +362,7 @@
password: this.form.password, password: this.form.password,
}, },
header: { header: {
UserType: this.usetTypeValue == "普通用户" ? "PERSONAL" : "TENANT", // UserType: this.usetTypeValue == "" ? "PERSONAL" : "TENANT",
}, },
success: (res) => { success: (res) => {
console.log(res); console.log(res);
@ -372,8 +373,8 @@
}) })
this.$store.dispatch('setLogin', res.data.token); this.$store.dispatch('setLogin', res.data.token);
uni.setStorage({ uni.setStorage({
key: 'userType', key: 'appIdPublic',
data: this.usetTypeValue, data: this.appConfig.appIdPublic,
}).then(res => { }).then(res => {
return uni.setStorage({ return uni.setStorage({
key: 'username', key: 'username',
@ -386,15 +387,15 @@
}) })
}).then(res => { }).then(res => {
setTimeout(() => { setTimeout(() => {
if (this.usetTypeValue == "普通用户") { // if (this.usetTypeValue == "") {
uni.reLaunch({ // uni.reLaunch({
url: "../oneselfUser/index" // url: "../oneselfUser/index"
}) // })
} else { // } else {
uni.switchTab({ uni.switchTab({
url: "../tabBar/product" url: this.homePage
}) })
} // }
}, 1000) }, 1000)
}) })
} else { } else {
@ -425,6 +426,7 @@
}, },
success: (res) => { success: (res) => {
console.log(res); console.log(res);
if (res.data.code == 200 && res.data.data.access_token) { if (res.data.code == 200 && res.data.data.access_token) {
this.$refs.uToast.show({ this.$refs.uToast.show({
title: '登录成功', title: '登录成功',
@ -432,8 +434,13 @@
}) })
this.$store.dispatch('setLogin', res.data.data.access_token); this.$store.dispatch('setLogin', res.data.data.access_token);
uni.setStorage({ uni.setStorage({
key: 'tenantId', key: 'appIdPublic',
data: this.form.tenantId, data: this.appConfig.appIdPublic,
}).then(res => {
return uni.setStorage({
key: 'tenantId',
data: this.form.tenantId,
})
}).then(res => { }).then(res => {
return uni.setStorage({ return uni.setStorage({
key: 'username', key: 'username',
@ -445,16 +452,17 @@
data: this.form.password, data: this.form.password,
}) })
}).then(res => { }).then(res => {
setTimeout(() => { setTimeout(() => {
if (this.usetTypeValue == "普通用户") { // if (this.usetTypeValue == "") {
uni.reLaunch({ // uni.reLaunch({
url: "../oneselfUser/index" // url: "../oneselfUser/index"
}) // })
} else { // } else {
uni.switchTab({ uni.switchTab({
url: "../tabBar/product" url: this.homePage
}) })
} // }
}, 1000) }, 1000)
}) })
} else { } else {

View File

@ -87,6 +87,7 @@
<script> <script>
import { renderMarkdown } from './markdown.js'; import { renderMarkdown } from './markdown.js';
import config from "@/common/api/config.js"
export default { export default {
data() { data() {
@ -118,13 +119,14 @@ export default {
// //
needScrollToBottom: true, needScrollToBottom: true,
// //
scrollTimer: null scrollTimer: null,
token:''
}; };
}, },
onLoad(options) { onLoad(options) {
// URL // URL
this.orderId = options.orderId || ''; this.orderId = options.orderId || '';
this.token = uni.getStorageSync('userToken');
// H5 // H5
// #ifdef H5 // #ifdef H5
this.isH5 = true; this.isH5 = true;
@ -242,115 +244,230 @@ export default {
// 使fetch APIH5 // 使fetch APIH5
async fetchStreamResponse(apiMessages) { async fetchStreamResponse(apiMessages) {
try { try {
// AI // AI
this.currentAiMessageIndex = this.messages.length; this.currentAiMessageIndex = this.messages.length;
this.messages.push({ this.messages.push({
role: 'assistant', role: 'assistant',
content: '', content: '',
renderedContent: '', renderedContent: '',
time: this.formatTime(new Date()), time: this.formatTime(new Date()),
endStatus: false endStatus: false
}); });
const response = await fetch('https://api.siliconflow.cn/v1/chat/completions', { const response = await fetch(`${config.baseUrl}/ai/generateStream`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Authorization': `Bearer ${this.apiKey}`, 'Authorization': `Bearer ${this.token}`,
'Content-Type': 'application/json' 'clientid': config.clientId,
}, 'Content-Type': 'application/json'
body: JSON.stringify({ },
model: 'deepseek-ai/DeepSeek-R1-Distill-Qwen-7B', redirect: 'follow',
messages: apiMessages, body: JSON.stringify(apiMessages)
stream: true, });
max_tokens: 8192,
stop: '',
temperature: 0.6,
top_p: 0.7,
top_k: 50,
frequency_penalty: 0
})
});
if (!response.ok) { if (!response.ok) {
throw new Error(`API请求失败: ${response.status}`); throw new Error(`API请求失败: ${response.status}`);
} }
if (!response.body) { if (!response.body) {
throw new Error('响应体为空'); throw new Error('响应体为空');
} }
const reader = response.body.getReader(); const reader = response.body.getReader();
const decoder = new TextDecoder(); const decoder = new TextDecoder();
let result = ''; let result = '';
let buffer = ''; //
while (true) { while (true) {
const { done, value } = await reader.read(); const { done, value } = await reader.read();
if (done) break; if (done) break;
const chunk = decoder.decode(value); const chunk = decoder.decode(value);
const lines = chunk.split('\n').filter(line => line.trim() !== ''); buffer += chunk; // chunkbuffer
console.log("buffer",buffer)
// ,buffer
const lines = buffer.split('\n');
buffer = lines.pop() || ''; // buffer,
console.log("lines",lines)
for (const line of lines.filter(l => l.trim())) {
// debugger
console.log('处理行:', line);
let data = line;
for (const line of lines) { if (line.startsWith('data:')) {
if (line.startsWith('data: ')) { data = line.substring(5).trim();
const data = line.substring(6).trim(); }
if (data === '[DONE]') { console.log("data",data)
// if (data === '[DONE]') {
if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) { //
this.messages[this.currentAiMessageIndex].endStatus = true; if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
// this.messages[this.currentAiMessageIndex].endStatus = true;
this.throttledScrollToBottom(); //
} this.throttledScrollToBottom();
continue; }
} continue;
}
// debugger
try {
result += data;
console.log("result",result)
if (this.messages && this.currentAiMessageIndex < this.messages.length) {
this.messages[this.currentAiMessageIndex].content = result;
this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result);
console.log("messages1",this.messages)
//
this.throttledScrollToBottom();
} else {
console.warn('无法更新消息,索引无效:', aiMessageIndex);
}
} catch (e) {
console.error('解析流数据失败:', e, line);
}
}
try { // buffer
const parsed = JSON.parse(data); if (buffer) {
// parsedchoices try {
if (!parsed || !parsed.choices || !Array.isArray(parsed.choices) || parsed.choices.length === 0) { let data = buffer;
console.warn('无效的响应格式:', data); if (buffer.startsWith('data:')) {
continue; data = buffer.substring(5).trim();
} }
if (data && data !== '[DONE]') {
result += data;
this.messages[this.currentAiMessageIndex].content = result;
this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result);
this.throttledScrollToBottom();
}
} catch (e) {
console.error('处理剩余数据失败:', e, buffer);
}
}
// 访delta }
const delta = parsed.choices[0].delta || {};
// return result;
const content = delta.content; } catch (error) {
// reasoning_contentcontent console.error('调用DeepSeek流式API失败:', error);
const reasoningContent = delta.reasoning_content || ''; // AI
if (this.messages.length > 0 && this.messages[this.messages.length - 1].content === '') {
this.messages.pop();
this.currentAiMessageIndex = -1;
}
throw error;
}
// contentnullreasoningContent
const textToAdd = (content !== null && content !== undefined) ? content : reasoningContent;
if (textToAdd) {
result += textToAdd;
// messages[currentAiMessageIndex]
if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
this.messages[this.currentAiMessageIndex].content = result;
this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result);
// // try {
this.throttledScrollToBottom(); // // AI
} // this.currentAiMessageIndex = this.messages.length;
} // this.messages.push({
} catch (e) { // role: 'assistant',
console.error('解析流数据失败:', e, line); // content: '',
} // renderedContent: '',
} // time: this.formatTime(new Date()),
} // endStatus: false
} // });
return result; // const response = await fetch('https://api.siliconflow.cn/v1/chat/completions', {
} catch (error) { // method: 'POST',
console.error('调用DeepSeek流式API失败:', error); // headers: {
// AI // 'Authorization': `Bearer ${this.apiKey}`,
if (this.messages.length > 0 && this.messages[this.messages.length - 1].content === '') { // 'Content-Type': 'application/json'
this.messages.pop(); // },
this.currentAiMessageIndex = -1; // body: JSON.stringify({
} // model: 'deepseek-ai/DeepSeek-R1-Distill-Qwen-7B',
throw error; // messages: apiMessages,
} // stream: true,
// max_tokens: 8192,
// stop: '',
// temperature: 0.6,
// top_p: 0.7,
// top_k: 50,
// frequency_penalty: 0
// })
// });
// if (!response.ok) {
// throw new Error(`API: ${response.status}`);
// }
// if (!response.body) {
// throw new Error('');
// }
// const reader = response.body.getReader();
// const decoder = new TextDecoder();
// let result = '';
// while (true) {
// const { done, value } = await reader.read();
// if (done) break;
// const chunk = decoder.decode(value);
// const lines = chunk.split('\n').filter(line => line.trim() !== '');
// for (const line of lines) {
// if (line.startsWith('data: ')) {
// const data = line.substring(6).trim();
// if (data === '[DONE]') {
// //
// if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
// this.messages[this.currentAiMessageIndex].endStatus = true;
// //
// this.throttledScrollToBottom();
// }
// continue;
// }
// try {
// const parsed = JSON.parse(data);
// // parsedchoices
// if (!parsed || !parsed.choices || !Array.isArray(parsed.choices) || parsed.choices.length === 0) {
// console.warn(':', data);
// continue;
// }
// // 访delta
// const delta = parsed.choices[0].delta || {};
// //
// const content = delta.content;
// // reasoning_contentcontent
// const reasoningContent = delta.reasoning_content || '';
// // contentnullreasoningContent
// const textToAdd = (content !== null && content !== undefined) ? content : reasoningContent;
// if (textToAdd) {
// result += textToAdd;
// // messages[currentAiMessageIndex]
// if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
// this.messages[this.currentAiMessageIndex].content = result;
// this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result);
// //
// this.throttledScrollToBottom();
// }
// }
// } catch (e) {
// console.error(':', e, line);
// }
// }
// }
// }
// return result;
// } catch (error) {
// console.error('DeepSeekAPI:', error);
// // AI
// if (this.messages.length > 0 && this.messages[this.messages.length - 1].content === '') {
// this.messages.pop();
// this.currentAiMessageIndex = -1;
// }
// throw error;
// }
}, },
// 使H5 // 使H5

View File

@ -9,6 +9,15 @@
</view> </view>
</view> </view>
<view class="form-item" v-if="commitState === 'back'">
<text class="form-label">修改意见</text>
<template>
<view class="comment-box">
{{ comment }}
</view>
</template>
</view>
<view class="form-item"> <view class="form-item">
<text class="form-label">剧本 <text class="form-hint">视频的剧本</text> </text> <text class="form-label">剧本 <text class="form-hint">视频的剧本</text> </text>
<!-- 文本输入 --> <!-- 文本输入 -->
@ -92,6 +101,7 @@
orderItemId: "", orderItemId: "",
// //
commitState:'add', commitState:'add',
comment:'',
materialfrom:{ materialfrom:{
id: undefined, id: undefined,
dictId: undefined, dictId: undefined,
@ -159,26 +169,17 @@
}); });
}, },
async getProductDetail(){ async getProductDetail(){
// let res = await this.$api.orderApi.getMallclientOrderProductList({ orderId: this.orderId, productId: this.productId })
let res = await this.$api.orderApi.getOrderMaterialList({ orderItemId: this.orderItemId }) let res = await this.$api.orderApi.getOrderMaterialList({ orderItemId: this.orderItemId })
console.log("res",res)
// this.materialfrom.productSn = res.rows[0].productSn;
// this.commitState = res.rows[0].commitState;
// if (this.commitState === 0) {
// this.getMaterialDictList();
// } else {
// this.getMaterialList();
// }
if(res.rows.length!=0){ if(res.rows.length!=0){
this.materialfrom.flowId = res.rows[0].id; this.materialfrom.flowId = res.rows[0].id;
this.commitState = res.rows[0].status; this.commitState = res.rows[0].status;
this.comment = res.rows[0].comment || '';
this.scriptContent = res.rows[0].script || '';
this.materialTemplateList = res.rows[0].materialItems || []; this.materialTemplateList = res.rows[0].materialItems || [];
res.rows[0].materialItems.forEach(async (item,index)=>{ res.rows[0].materialItems.forEach(async (item,index)=>{
if(item.attrType !== 0 && item.attrValue !== ''){ if(item.attrType !== 0 && item.attrValue !== ''){
let {fileUrl,fileName} = await this.getFileDetail(item.attrValue); let {fileUrl,fileName} = await this.getFileDetail(item.attrValue);
console.log("fileUrl,fileName",fileUrl,fileName) console.log("fileUrl,fileName",fileUrl,fileName)
// this.materialTemplateList[index].fileUrl = fileUrl;
// this.materialTemplateList[index].fileName = fileName;
this.$nextTick(()=>{ this.$nextTick(()=>{
this.$set(this.materialTemplateList[index],'fileUrl',fileUrl) this.$set(this.materialTemplateList[index],'fileUrl',fileUrl)
this.$set(this.materialTemplateList[index],'fileName',fileName) this.$set(this.materialTemplateList[index],'fileName',fileName)
@ -440,13 +441,21 @@
orderId: this.orderId, orderId: this.orderId,
productId: this.productId, productId: this.productId,
orderItemId: this.orderItemId, orderItemId: this.orderItemId,
materialItems: this.materialTemplateList materialItems: this.materialTemplateList,
script: this.scriptContent
}); });
this.buttonLoading = false; this.buttonLoading = false;
this.materialfrom.flowId = res.data.id; this.materialfrom.flowId = res.data.id;
this.getProductDetail(); this.getProductDetail();
}else{ }else{
res = await this.$api.orderApi.mallMaterialUpdateBatch(this.materialTemplateList); res = await this.$api.orderApi.EditOrderMaterial({
orderId: this.orderId,
productId: this.productId,
orderItemId: this.orderItemId,
materialItems: this.materialTemplateList,
script: this.scriptContent,
id: this.materialfrom.flowId
});
this.buttonLoading = false; this.buttonLoading = false;
} }
@ -514,6 +523,15 @@
align-items: center; align-items: center;
} }
} }
.comment-box{
background-color: rgb(254,242,242);
border: 1px solid rgb(254,226,226);
border-radius: 0.5rem;
padding: 1rem;
width: 100%;
color: red;
font-size: 36rpx;
}
.form-item { .form-item {
margin-bottom: 20rpx; margin-bottom: 20rpx;
@ -527,9 +545,9 @@
margin-bottom: 10rpx; margin-bottom: 10rpx;
font-weight: bold; font-weight: bold;
.form-hint{ .form-hint{
font-size: 22rpx; font-size: 20rpx;
color: #666; color: #999;
margin-left: 10rpx; margin-left: 6rpx;
} }
} }

View File

@ -1,289 +1,451 @@
<template> <template>
<view class="container"> <view class="container">
<!-- 订单信息 --> <!-- 订单信息 -->
<view class="info-card"> <view class="info-card">
<view class="info-item"> <view class="info-item">
<text class="label">订单编号</text> <text class="label">订单编号</text>
<text class="value">{{ orderInfo.orderSn }}</text> <text class="value">{{ orderInfo.orderSn }}</text>
</view> </view>
<view class="info-item"> <view class="info-item">
<text class="label">创建时间</text> <text class="label">创建时间</text>
<text class="value">{{ orderInfo.createTime }}</text> <text class="value">{{ orderInfo.createTime }}</text>
</view> </view>
<view class="info-item"> <view class="info-item">
<text class="label">客户姓名</text> <text class="label">客户姓名</text>
<text class="value">{{ orderInfo.memberName }}</text> <text class="value">{{ orderInfo.memberName }}</text>
</view> </view>
<view class="info-item"> <view class="info-item">
<text class="label">客户手机</text> <text class="label">客户手机</text>
<text class="value">{{ orderInfo.memberPhone }}</text> <text class="value">{{ orderInfo.memberPhone }}</text>
</view> </view>
</view> </view>
<!-- 商品信息 --> <!-- 商品信息 -->
<view class="info-card"> <view class="info-card">
<view class="card-title">商品信息</view> <view class="card-title">商品信息</view>
<view class=""> <view class="">
<view v-for="(item, index) in orderInfo.orderItems" :key="index" class="product-item"> <view v-for="(item, index) in orderInfo.orderItems" :key="index" class="product-item">
<image :src="item.productPic" mode="aspectFill" class="product-image" @click="lookPic(item.productPic)"></image> <image :src="item.productPic" mode="aspectFill" class="product-image" @click="lookPic(item.productPic)">
<view class="product-info"> </image>
<text class="product-name">{{ item.productName }}</text> <view class="product-info">
<view class="product-bottom"> <text class="product-name">{{ item.productName }}</text>
<text class="product-quantity">x{{ item.productQuantity }}</text> <view class="product-bottom">
<text class="product-price">¥{{ (item.productPrice / 100).toFixed(2) }}</text> <text class="product-quantity">x{{ item.productQuantity }}</text>
</view> <text class="product-price">¥{{ (item.productPrice / 100).toFixed(2) }}</text>
</view> </view>
</view> </view>
</view> </view>
<!-- 订单金额信息 -->
<view class="amount-info">
<view class="amount-item">
<text>总金额</text>
<text class="price">¥{{ (orderInfo.totalAmount / 100).toFixed(2) }}</text>
</view>
<view class="amount-item">
<text>已付额</text>
<text class="price paid">¥{{ orderInfo.payAmount ? (orderInfo.payAmount / 100).toFixed(2) : '0.00' }}</text>
</view>
<view class="amount-item">
<text>支付方式</text>
<view class="payment-method">
<!-- <u-icon name="weixin-fill" color="#07c160" size="28"></u-icon> -->
<text>{{getDictName('mall_pay_type',orderInfo.payType,'dictLabel')}}</text>
</view>
</view>
</view>
</view>
<!-- 订单其他信息 -->
<view class="info-card">
<view class="info-item">
<text class="label">订单来源</text>
<view class="value source">
<u-icon name="shopping-mall" size="24"></u-icon>
<text>{{getDictName('mall_source_type',orderInfo.sourceType,'dictLabel')}}</text>
</view>
</view>
<view class="info-item">
<text class="label">订单状态</text>
<text class="value status" :class="['dict-item',getDictName('mall_order_status',orderInfo.orderStatus,'listClass')]">{{getDictName('mall_order_status',orderInfo.orderStatus,'dictLabel')}}</text>
</view>
<view class="info-item">
<text class="label">订单备注</text>
<text class="value">{{ orderInfo.orderNote || '无' }}</text>
</view>
</view>
<!-- 底部购买按钮 -->
<view class="btn-box">
<u-button type="primary" style="width: 680rpx;" :loading="buttonLoading" @click="handlePay">去支付</u-button>
</view> </view>
</view>
<!-- 订单金额信息 -->
<view class="amount-info">
<view class="amount-item">
<text>总金额</text>
<text class="price">¥{{ (orderInfo.totalAmount / 100).toFixed(2) }}</text>
</view>
<view class="amount-item">
<text>已付额</text>
<text class="price paid">¥{{ orderInfo.payAmount ? (orderInfo.payAmount / 100).toFixed(2) : '0.00' }}</text>
</view>
<view class="amount-item">
<text>支付方式</text>
<view class="payment-method">
<!-- <u-icon name="weixin-fill" color="#07c160" size="28"></u-icon> -->
<text>{{getDictName('mall_pay_type',orderInfo.payType,'dictLabel')}}</text>
</view>
</view>
</view>
</view>
<!-- 订单其他信息 -->
<view class="info-card">
<view class="info-item">
<text class="label">订单来源</text>
<view class="value source">
<u-icon name="shopping-mall" size="24"></u-icon>
<text>{{getDictName('mall_source_type',orderInfo.sourceType,'dictLabel')}}</text>
</view>
</view>
<view class="info-item">
<text class="label">订单状态</text>
<text class="value status"
:class="['dict-item',getDictName('mall_order_status',orderInfo.orderStatus,'listClass')]">{{getDictName('mall_order_status',orderInfo.orderStatus,'dictLabel')}}</text>
</view>
<view class="info-item">
<text class="label">订单备注</text>
<text class="value">{{ orderInfo.orderNote || '无' }}</text>
</view>
</view>
<!-- 底部购买按钮 -->
<view class="btn-box">
<u-button type="primary" style="width: 680rpx;" :loading="buttonLoading" @click="handlePay">去支付</u-button>
</view>
<u-toast ref="uToast" />
</view>
</template> </template>
<script> <script>
export default { // import WeixinJSBridge from '../../utils/jweixin-1.6.0.js';
data() { var jweixin = require('jweixin-module');
return { export default {
orderId:'', data() {
orderInfo:{ return {
"billContent": null, orderId: '',
"billHeader": null, orderInfo: {
"billReceiverEmail": null, "billContent": null,
"billReceiverPhone": null, "billHeader": null,
"billType": 0, "billReceiverEmail": null,
"confirmStatus": 0, "billReceiverPhone": null,
"createBy": "", "billType": 0,
"createTime": "", "confirmStatus": 0,
"deliveryTime": null, "createBy": "",
"finishTime": null, "createTime": "",
"freightAmount": null, "deliveryTime": null,
"id": "", "finishTime": null,
"memberName": "", "freightAmount": null,
"memberPhone": "", "id": "",
"memberUsername": "", "memberName": "",
"orderItems": [], "memberPhone": "",
"orderNote": null, "memberUsername": "",
"orderSn": "", "orderItems": [],
"orderStatus": 0, "orderNote": null,
"orderType": 0, "orderSn": "",
"payAmount": null, "orderStatus": 0,
"payTime": null, "orderType": 0,
"payType": 0, "payAmount": null,
"receiverCity": null, "payTime": null,
"receiverDetailAddress": null, "payType": 0,
"receiverName": null, "receiverCity": null,
"receiverPhone": null, "receiverDetailAddress": null,
"receiverPostCode": null, "receiverName": null,
"receiverProvince": null, "receiverPhone": null,
"receiverRegion": null, "receiverPostCode": null,
"sourceType": 0, "receiverProvince": null,
"totalAmount": 0, "receiverRegion": null,
"updateBy": "", "sourceType": 0,
"updateTime": "" "totalAmount": 0,
}, "updateBy": "",
mall_order_status:[], "updateTime": ""
mall_source_type:[], },
mall_pay_type:[], mall_order_status: [],
buttonLoading:false, mall_source_type: [],
officialAccount:{ mall_pay_type: [],
appid:'', buttonLoading: false,
appsecret:'ca307cfb6c94e8ac015e26cfd717a91c', officialAccount: {
}, appid: '',
code:'', appsecret: 'ca307cfb6c94e8ac015e26cfd717a91c',
openId:'', },
} code: '',
}, openId: '',
onLoad(option) {
this.officialAccount.appid = this.$store.state.app.appConfig.appIdPublic;
this.getDictDataList('mall_order_status');
this.getDictDataList('mall_source_type');
this.getDictDataList('mall_pay_type');
console.log("option",option)
this.orderId = option.id;
this.getOrderDetail(option.id);
let res = uni.getStorageSync('openid');
if (res.length == 2) {
this.openid = res[1].data;
}else{
// #ifdef H5
let code = this.getUrlCode('code')
if(code || this.code){
this.code = code;
this.getOpenidAndUserinfo(code)
}else{
console.log("当前网址",window.location.href)
this.getH5Code()
} }
// #endif
}
},
methods:{
//
getOrderDetail(id){
this.$api.orderApi.getOrderDetail(id).then((res)=>{
console.log("获取订单详情",res)
if(res.code == 200){
this.orderInfo = res.data;
}
}).catch(()=>{
})
},
getDictDataList(type){
this.$api.getDictList(type).then((res)=>{
if(res.code===200){
this[type] = res.data || [];
}
})
}, },
getDictName(list,value,key){ onLoad(option) {
let name = '' let appIdPublic = uni.getStorageSync('appIdPublic');
if(this[list]){ console.log("this.$store.state.app.appConfig.appIdPublic",this.$store.state.app.appConfig.appIdPublic)
this[list].forEach((item)=>{ this.officialAccount.appid = appIdPublic || '';
if(item.dictValue == value){ this.getDictDataList('mall_order_status');
name = item[key]; this.getDictDataList('mall_source_type');
this.getDictDataList('mall_pay_type');
console.log("option", option)
this.orderId = option.id;
this.getOrderDetail(option.id);
let res = uni.getStorageSync('openId');
if (res) {
this.openId = res;
} else {
// #ifdef H5
let code = this.getUrlCode('code')
if (code || this.code) {
this.code = code;
this.getOpenidAndUserinfo(code)
// // URLcode
// const url = window.location.href;
// const newUrl = url.split('?')[0]; //
// history.replaceState({}, '', newUrl+'');
} else {
console.log("当前网址", window.location.href)
this.getH5Code()
}
// #endif
}
},
methods: {
//
getOrderDetail(id) {
this.$api.orderApi.getOrderDetail(id).then((res) => {
console.log("获取订单详情", res)
if (res.code == 200) {
this.orderInfo = res.data;
}
}).catch(() => {})
},
getDictDataList(type) {
this.$api.getDictList(type).then((res) => {
if (res.code === 200) {
this[type] = res.data || [];
} }
}) })
return name; },
} getDictName(list, value, key) {
}, let name = ''
lookPic(url){ if (this[list]) {
uni.previewImage({ this[list].forEach((item) => {
current: '', // http if (item.dictValue == value) {
urls: [url] // http name = item[key];
}); }
}, })
handlePay() { return name;
// }
uni.showToast({ },
title: '正在开发中...', lookPic(url) {
icon: 'none' uni.previewImage({
}) current: '', // http
// openid urls: [url] // http
});
},
handlePay() {
//
// uni.showToast({
// title: '...',
// icon: 'none'
// })
// openid
console.log("支付")
if(this.openId){
this.$api.orderApi.addPayOrder({
orderId: this.orderInfo.id,
//openid
channelExtra: JSON.stringify({'openid': this.openId}),
wayCode: 'LKL_WX_JSAPI'
}).then((res) => {
console.log("获取支付详情", res)
if (res.code == 200) {
// this.orderInfo = res.data;
}
}).catch(() => {})
// this.wxpay({
// "appId": this.officialAccount.appid, //
// "timeStamp": 'a1sd12as1d23sa1d231as2d1asd', //
// "nonceStr": 'a1sd12as1d23sa1d231as2d1asd', //
// "package": 'a1sd12as1d23sa1d231as2d1asd', //prepay_id
// "signType": 'a1sd12as1d23sa1d231as2d1asd', //RSA
// "paySign": 'a1sd12as1d23sa1d231as2d1asd', //
// "signature": 'a1sd12as1d23sa1d231as2d1asd' //
// })
}else{
this.clearUrlCode()
this.getH5Code()
this.$refs.uToast.show({
title: '获取支付信息失败,请重试',
type: 'error',
})
}
},
clearUrlCode(){
// URLcode
const url = window.location.href;
const newUrl = url.split('?')[0]; //
history.replaceState({}, '', newUrl+'/pages/order/detail?id='+this.orderId);
},
getH5Code() {
if (this.isWechat()) {
// codecodecodecodeopenId
window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + this.officialAccount
.appid + '&redirect_uri=' + encodeURIComponent(window.location.href) +
'&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'
console.log("跳转授权页面",'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + this.officialAccount
.appid + '&redirect_uri=' + encodeURIComponent(window.location.href) +
'&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect')
// redirect_uriurlcodeencodeURIComponent
// code
// http://127.0.0.1/pages/views/profile/login/login?code=001BWV4J1lRzz00H4J1J1vRE4J1BWV4q&state=1
}
},
getUrlCode(name) {
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [,
''])[1].replace(/\+/g, '%20')) || null
},
isWechat() {
return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger";
},
getOpenidAndUserinfo(code) {
console.log("code换openid")
this.$api.orderApi.getWxOpenid({
code: code
}).then((res) => {
console.log("获取openid", res)
if (res.code == 200) {
if(res.data.openid){
this.openId = res.data.openid;
uni.setStorageSync('openId', res.data.openid)
this.clearUrlCode();
}else{
this.clearUrlCode();
this.getUrlCode();
}
// 1
// 2
}else{
},
getH5Code(){
if(this.isWechat()) {
// codecodecodecodeopenId
window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+this.officialAccount.appid+'&redirect_uri=' + encodeURIComponent(window.location.href) + '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'
console.log("跳转授权页面")
// redirect_uriurlcodeencodeURIComponent
// code
// http://127.0.0.1/pages/views/profile/login/login?code=001BWV4J1lRzz00H4J1J1vRE4J1BWV4q&state=1
}
},
getUrlCode(name){
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1].replace(/\+/g, '%20')) || null
},
isWechat(){
return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger";
},
getOpenidAndUserinfo(code){
console.log("code换openid")
uni.request({
url: 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='+this.officialAccount.appid+'&secret='+this.officialAccount.secret +'&grant_type=authorization_code&code='+code,
success: (res) => {
console.log('通过code获取openid和accessToken', res)
// if(res.data.code === 200) {
// // token
// uni.setStorageSync('userInfo', res.data.result.userInfo)
// uni.setStorageSync('token', res.data.result.token)
// }
} }
}) }).catch(() => {
}
}
}
})
// uni.request({
// url: 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='+this.officialAccount.appid+'&secret='+this.officialAccount.secret +'&grant_type=authorization_code&code='+code,
// success: (res) => {
// console.log('codeopenidaccessToken', res)
// // if(res.data.code === 200) {
// // // token
// // uni.setStorageSync('userInfo', res.data.result.userInfo)
// // uni.setStorageSync('token', res.data.result.token)
// // }
// }
// })
},
wxpay(data) {
// if (typeof WeixinJSBridge == "undefined") {
// if (document.addEventListener) {
// document.addEventListener('WeixinJSBridgeReady', this.onBridgeReady(data), false);
// } else if (document.attachEvent) {
// document.attachEvent('WeixinJSBridgeReady', this.onBridgeReady(data));
// document.attachEvent('onWeixinJSBridgeReady', this.onBridgeReady(data));
// }
// } else {
// this.onBridgeReady(data);
// }
jweixin.config({
debug: false, // ,apialertpclogpc
appId: data.appId, //
timestamp: data.timestamp, //
nonceStr: data.nonceStr, //
signature: data.signature, //
jsApiList: ['chooseWXPay'], // JS
})
this.onBridgeReady(data);
},
onBridgeReady(data) {
// jweixin.ready(()=>{
// // configreadyconfigconfigreadyready
// jweixin.chooseWXPay({
// timestamp: data.timeStamp,
// package: data.package,
// nonceStr: data.nonceStr,
// signType: data.signType,
// paySign: data.paySign,
// success: (res) => {
// if (res.errMsg == "chooseWXPay:ok") {
// console.log('')
// } else {
// console.log('')}
// },
// fail: (res) => {
// console.log('')
// }
// });
// });
jweixin.invoke(
'getBrandWCPayRequest', {
//
"appId": data.appId, //
"timeStamp": data.timeStamp, //
"nonceStr": data.nonceStr, //
"package": data.package, //prepay_id
"signType": data.signType, //RSA
"paySign": data.paySign //
},
(res)=>{
//
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 使,
//res.err_msgok
this.$refs.uToast.show({
title: '支付成功',
type: 'success',
})
}
//
if (res.err_msg == "get_brand_wcpay_request:cancel") {
this.$refs.uToast.show({
title: '用户取消',
type: 'error',
})
}
//
if (res.err_msg == "get_brand_wcpay_request:fail") {
this.$refs.uToast.show({
title: '支付失败',
type: 'error',
})
}
/**
* 其它
* 1请检查预支付会话标识prepay_id是否已失效
* 2请求的appid与下单接口的appid是否一致
* */
if (res.err_msg == "调用支付JSAPI缺少参数total_fee") {
this.$refs.uToast.show({
title: '缺少参数',
type: 'error',
})
}
});
}
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.container { .container {
min-height: 100vh; min-height: 100vh;
background-color: #f5f5f5; background-color: #f5f5f5;
padding: 20rpx; padding: 20rpx;
padding-bottom: 120rpx; padding-bottom: 120rpx;
} }
.info-card { .info-card {
background-color: #fff; background-color: #fff;
border-radius: 12rpx; border-radius: 12rpx;
padding: 30rpx; padding: 30rpx;
margin-bottom: 20rpx; margin-bottom: 20rpx;
} }
.info-item { .info-item {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 20rpx; margin-bottom: 20rpx;
&:last-child { &:last-child {
margin-bottom: 0; margin-bottom: 0;
} }
.label { .label {
color: #666; color: #666;
font-size: 28rpx; font-size: 28rpx;
} }
.value { .value {
color: #333; color: #333;
font-size: 28rpx; font-size: 28rpx;
} }
} }
.card-title {
font-size: 30rpx;
font-weight: 500;
margin-bottom: 20rpx;
}
.card-title {
font-size: 30rpx;
font-weight: 500;
margin-bottom: 20rpx;
}
.product-item { .product-item {
display: flex; display: flex;
padding: 20rpx 0; padding: 20rpx 0;
border-bottom: 1rpx solid #eee; border-bottom: 1rpx solid #eee;
&:last-child { &:last-child {
border-bottom: none; border-bottom: none;
@ -291,104 +453,104 @@ export default {
} }
.product-image { .product-image {
width: 160rpx; width: 160rpx;
height: 160rpx; height: 160rpx;
border-radius: 8rpx; border-radius: 8rpx;
margin-right: 20rpx; margin-right: 20rpx;
} }
.product-info { .product-info {
flex: 1; flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.product-name {
font-size: 28rpx;
color: #333;
}
.product-bottom {
display: flex;
justify-content: space-between;
align-items: center;
}
.product-quantity {
font-size: 26rpx;
color: #666;
}
.product-price {
font-size: 32rpx;
color: #333;
font-weight: 500;
}
.amount-info {
margin-top: 30rpx;
padding-top: 30rpx;
border-top: 1rpx solid #eee;
}
.amount-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
font-size: 28rpx;
&:last-child {
margin-bottom: 0;
}
.price {
font-weight: 500;
&.paid {
color: #19be6b;
}
}
}
.payment-method {
display: flex;
align-items: center;
gap: 10rpx;
color: #333;
}
.source {
display: flex;
align-items: center;
gap: 10rpx;
}
.status {
color: #19be6b;
}
.btn-box {
display: flex;
justify-content: space-around;
align-items: center;
height: 120rpx;
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
z-index: 999;
button{
width: 680rpx;
height: 85rpx;
border-radius: 10rpx;
display: flex; display: flex;
justify-content: center; flex-direction: column;
justify-content: space-between;
}
.product-name {
font-size: 28rpx;
color: #333;
}
.product-bottom {
display: flex;
justify-content: space-between;
align-items: center; align-items: center;
} }
}
</style>
.product-quantity {
font-size: 26rpx;
color: #666;
}
.product-price {
font-size: 32rpx;
color: #333;
font-weight: 500;
}
.amount-info {
margin-top: 30rpx;
padding-top: 30rpx;
border-top: 1rpx solid #eee;
}
.amount-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
font-size: 28rpx;
&:last-child {
margin-bottom: 0;
}
.price {
font-weight: 500;
&.paid {
color: #19be6b;
}
}
}
.payment-method {
display: flex;
align-items: center;
gap: 10rpx;
color: #333;
}
.source {
display: flex;
align-items: center;
gap: 10rpx;
}
.status {
color: #19be6b;
}
.btn-box {
display: flex;
justify-content: space-around;
align-items: center;
height: 120rpx;
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
z-index: 999;
button {
width: 680rpx;
height: 85rpx;
border-radius: 10rpx;
display: flex;
justify-content: center;
align-items: center;
}
}
</style>

1
utils/jweixin-1.6.0.js Normal file

File diff suppressed because one or more lines are too long