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(`${config.baseUrl}/ai/generateStream`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${this.token}`,
'clientid': config.clientId,
'Content-Type': 'application/json'
},
redirect: 'follow',
body: JSON.stringify(apiMessages)
});
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 = '';
let buffer = ''; //
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
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;
if (line.startsWith('data:')) {
data = line.substring(5).trim();
}
console.log("data",data)
if (data === '[DONE]') {
//
if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
this.messages[this.currentAiMessageIndex].endStatus = true;
//
this.throttledScrollToBottom();
}
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);
}
}
// buffer
if (buffer) {
try {
let data = buffer;
if (buffer.startsWith('data:')) {
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);
}
}
}
return result;
} catch (error) {
console.error('调用DeepSeek流式API失败:', error);
// AI
if (this.messages.length > 0 && this.messages[this.messages.length - 1].content === '') {
this.messages.pop();
this.currentAiMessageIndex = -1;
}
throw error;
}
// try {
// // AI
// this.currentAiMessageIndex = this.messages.length;
// this.messages.push({
// role: 'assistant',
// content: '',
// renderedContent: '',
// time: this.formatTime(new Date()),
// endStatus: false
// });
const response = await fetch('https://api.siliconflow.cn/v1/chat/completions', { // const response = await fetch('https://api.siliconflow.cn/v1/chat/completions', {
method: 'POST', // method: 'POST',
headers: { // headers: {
'Authorization': `Bearer ${this.apiKey}`, // 'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json' // 'Content-Type': 'application/json'
}, // },
body: JSON.stringify({ // body: JSON.stringify({
model: 'deepseek-ai/DeepSeek-R1-Distill-Qwen-7B', // model: 'deepseek-ai/DeepSeek-R1-Distill-Qwen-7B',
messages: apiMessages, // messages: apiMessages,
stream: true, // stream: true,
max_tokens: 8192, // max_tokens: 8192,
stop: '', // stop: '',
temperature: 0.6, // temperature: 0.6,
top_p: 0.7, // top_p: 0.7,
top_k: 50, // top_k: 50,
frequency_penalty: 0 // 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 = '';
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() !== ''); // const lines = chunk.split('\n').filter(line => line.trim() !== '');
for (const line of lines) { // for (const line of lines) {
if (line.startsWith('data: ')) { // if (line.startsWith('data: ')) {
const data = line.substring(6).trim(); // const data = line.substring(6).trim();
if (data === '[DONE]') { // if (data === '[DONE]') {
// // //
if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) { // if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
this.messages[this.currentAiMessageIndex].endStatus = true; // this.messages[this.currentAiMessageIndex].endStatus = true;
// // //
this.throttledScrollToBottom(); // this.throttledScrollToBottom();
} // }
continue; // continue;
} // }
try { // try {
const parsed = JSON.parse(data); // const parsed = JSON.parse(data);
// parsedchoices // // parsedchoices
if (!parsed || !parsed.choices || !Array.isArray(parsed.choices) || parsed.choices.length === 0) { // if (!parsed || !parsed.choices || !Array.isArray(parsed.choices) || parsed.choices.length === 0) {
console.warn('无效的响应格式:', data); // console.warn(':', data);
continue; // continue;
} // }
// 访delta // // 访delta
const delta = parsed.choices[0].delta || {}; // const delta = parsed.choices[0].delta || {};
// // //
const content = delta.content; // const content = delta.content;
// reasoning_contentcontent // // reasoning_contentcontent
const reasoningContent = delta.reasoning_content || ''; // const reasoningContent = delta.reasoning_content || '';
// contentnullreasoningContent // // contentnullreasoningContent
const textToAdd = (content !== null && content !== undefined) ? content : reasoningContent; // const textToAdd = (content !== null && content !== undefined) ? content : reasoningContent;
if (textToAdd) { // if (textToAdd) {
result += textToAdd; // result += textToAdd;
// messages[currentAiMessageIndex] // // messages[currentAiMessageIndex]
if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) { // if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
this.messages[this.currentAiMessageIndex].content = result; // this.messages[this.currentAiMessageIndex].content = result;
this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result); // this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result);
// // //
this.throttledScrollToBottom(); // this.throttledScrollToBottom();
} // }
} // }
} catch (e) { // } catch (e) {
console.error('解析流数据失败:', e, line); // console.error(':', e, line);
} // }
} // }
} // }
} // }
return result; // return result;
} catch (error) { // } catch (error) {
console.error('调用DeepSeek流式API失败:', error); // console.error('DeepSeekAPI:', error);
// AI // // AI
if (this.messages.length > 0 && this.messages[this.messages.length - 1].content === '') { // if (this.messages.length > 0 && this.messages[this.messages.length - 1].content === '') {
this.messages.pop(); // this.messages.pop();
this.currentAiMessageIndex = -1; // this.currentAiMessageIndex = -1;
} // }
throw error; // 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,394 +1,556 @@
<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
});
}, },
getH5Code(){ handlePay() {
if(this.isWechat()) { //
// codecodecodecodeopenId // uni.showToast({
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' // title: '...',
console.log("跳转授权页面") // icon: 'none'
// redirect_uriurlcodeencodeURIComponent // })
// code // openid
// http://127.0.0.1/pages/views/profile/login/login?code=001BWV4J1lRzz00H4J1J1vRE4J1BWV4q&state=1 console.log("支付")
} if(this.openId){
}, this.$api.orderApi.addPayOrder({
getUrlCode(name){ orderId: this.orderInfo.id,
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1].replace(/\+/g, '%20')) || null //openid
}, channelExtra: JSON.stringify({'openid': this.openId}),
isWechat(){ wayCode: 'LKL_WX_JSAPI'
return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger"; }).then((res) => {
}, console.log("获取支付详情", res)
getOpenidAndUserinfo(code){ if (res.code == 200) {
console.log("code换openid") // this.orderInfo = res.data;
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, }).catch(() => {})
success: (res) => { // this.wxpay({
console.log('通过code获取openid和accessToken', res) // "appId": this.officialAccount.appid, //
// if(res.data.code === 200) { // "timeStamp": 'a1sd12as1d23sa1d231as2d1asd', //
// // token // "nonceStr": 'a1sd12as1d23sa1d231as2d1asd', //
// uni.setStorageSync('userInfo', res.data.result.userInfo) // "package": 'a1sd12as1d23sa1d231as2d1asd', //prepay_id
// uni.setStorageSync('token', res.data.result.token) // "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{
} }
}) }).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;
} }
} }
.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