提交 b1e7fee3 authored 作者: matian's avatar matian

h5页面开发

上级 e06aac96
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
"element-plus": "^2.2.21", "element-plus": "^2.2.21",
"pinia": "^2.0.24", "pinia": "^2.0.24",
"qrcode.vue": "^3.3.3", "qrcode.vue": "^3.3.3",
"query-string": "^7.1.1",
"querystring": "^0.2.1",
"swiper": "^8.4.4", "swiper": "^8.4.4",
"vue": "^3.2.45", "vue": "^3.2.45",
"vue-router": "^4.1.6" "vue-router": "^4.1.6"
...@@ -1281,6 +1283,14 @@ ...@@ -1281,6 +1283,14 @@
} }
} }
}, },
"node_modules/decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
"integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==",
"engines": {
"node": ">=0.10"
}
},
"node_modules/deep-is": { "node_modules/deep-is": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
...@@ -2237,6 +2247,14 @@ ...@@ -2237,6 +2247,14 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/filter-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
"integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/find-up": { "node_modules/find-up": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
...@@ -3562,6 +3580,32 @@ ...@@ -3562,6 +3580,32 @@
"node": ">=0.6" "node": ">=0.6"
} }
}, },
"node_modules/query-string": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.1.tgz",
"integrity": "sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==",
"dependencies": {
"decode-uri-component": "^0.2.0",
"filter-obj": "^1.1.0",
"split-on-first": "^1.0.0",
"strict-uri-encode": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/querystring": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
"integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==",
"deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
"engines": {
"node": ">=0.4.x"
}
},
"node_modules/queue-microtask": { "node_modules/queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
...@@ -3902,6 +3946,14 @@ ...@@ -3902,6 +3946,14 @@
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
}, },
"node_modules/split-on-first": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
"integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
"engines": {
"node": ">=6"
}
},
"node_modules/ssr-window": { "node_modules/ssr-window": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-4.0.2.tgz", "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-4.0.2.tgz",
...@@ -3938,6 +3990,14 @@ ...@@ -3938,6 +3990,14 @@
"node": ">=4.0.0" "node": ">=4.0.0"
} }
}, },
"node_modules/strict-uri-encode": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
"integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
"engines": {
"node": ">=4"
}
},
"node_modules/string_decoder": { "node_modules/string_decoder": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
...@@ -5554,6 +5614,11 @@ ...@@ -5554,6 +5614,11 @@
"ms": "2.1.2" "ms": "2.1.2"
} }
}, },
"decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
"integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og=="
},
"deep-is": { "deep-is": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
...@@ -6186,6 +6251,11 @@ ...@@ -6186,6 +6251,11 @@
"to-regex-range": "^5.0.1" "to-regex-range": "^5.0.1"
} }
}, },
"filter-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
"integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ=="
},
"find-up": { "find-up": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
...@@ -7209,6 +7279,22 @@ ...@@ -7209,6 +7279,22 @@
"side-channel": "^1.0.4" "side-channel": "^1.0.4"
} }
}, },
"query-string": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.1.tgz",
"integrity": "sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==",
"requires": {
"decode-uri-component": "^0.2.0",
"filter-obj": "^1.1.0",
"split-on-first": "^1.0.0",
"strict-uri-encode": "^2.0.0"
}
},
"querystring": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
"integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg=="
},
"queue-microtask": { "queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
...@@ -7448,6 +7534,11 @@ ...@@ -7448,6 +7534,11 @@
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
}, },
"split-on-first": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
"integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="
},
"ssr-window": { "ssr-window": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-4.0.2.tgz", "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-4.0.2.tgz",
...@@ -7478,6 +7569,11 @@ ...@@ -7478,6 +7569,11 @@
"integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==", "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==",
"dev": true "dev": true
}, },
"strict-uri-encode": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
"integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ=="
},
"string_decoder": { "string_decoder": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
"element-plus": "^2.2.21", "element-plus": "^2.2.21",
"pinia": "^2.0.24", "pinia": "^2.0.24",
"qrcode.vue": "^3.3.3", "qrcode.vue": "^3.3.3",
"query-string": "^7.1.1",
"querystring": "^0.2.1",
"swiper": "^8.4.4", "swiper": "^8.4.4",
"vue": "^3.2.45", "vue": "^3.2.45",
"vue-router": "^4.1.6" "vue-router": "^4.1.6"
......
...@@ -58,3 +58,13 @@ export function postNes(data: any) { ...@@ -58,3 +58,13 @@ export function postNes(data: any) {
headers: { 'Content-Type': 'multipart/form-data' } headers: { 'Content-Type': 'multipart/form-data' }
}) })
} }
/**
* 获取用户OpenId
* */
export function getOpenId(data?: any) {
return httpRequest.post('https://shop-show-pc.ezijing.com/api/usercenter/v1/wechat/get-openid', data, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
})
}
...@@ -50,7 +50,7 @@ onMounted(() => { ...@@ -50,7 +50,7 @@ onMounted(() => {
}) })
const handleGetOrderList = (id: any) => { const handleGetOrderList = (id: any) => {
getOrderList({ order_detail_id: id }).then(res => { getOrderList({ order_detail_id: id }).then((res) => {
payStatus.value = res.data[0].order_status payStatus.value = res.data[0].order_status
orderId.value = res.data[0].order_id orderId.value = res.data[0].order_id
if (payStatus.value === '4') { if (payStatus.value === '4') {
...@@ -78,7 +78,7 @@ const handleGetOrderList = (id: any) => { ...@@ -78,7 +78,7 @@ const handleGetOrderList = (id: any) => {
<div class="price_tit">支付金额:</div> <div class="price_tit">支付金额:</div>
<div class="price_con"> <div class="price_con">
<div class="con_icon">¥</div> <div class="con_icon">¥</div>
<div class="con_num">1999.00</div> <div class="con_num">{{ shopItem?.price }}</div>
</div> </div>
</div> </div>
<div class="line"></div> <div class="line"></div>
...@@ -93,8 +93,13 @@ const handleGetOrderList = (id: any) => { ...@@ -93,8 +93,13 @@ const handleGetOrderList = (id: any) => {
" "
class="con_style" class="con_style"
/> />
<span class="radio_tit">{{ payMethod === 1 ? '支付宝支付' : '微信支付' }}</span> <span class="radio_tit">{{
<img src="https://webapp-pub.ezijing.com/project_online/fi/icon_pay_checked.png" class="checked_img" /> payMethod === 1 ? '支付宝支付' : '微信支付'
}}</span>
<img
src="https://webapp-pub.ezijing.com/project_online/fi/icon_pay_checked.png"
class="checked_img"
/>
</div> </div>
</div> </div>
<div class="order_qaCode"> <div class="order_qaCode">
...@@ -102,8 +107,15 @@ const handleGetOrderList = (id: any) => { ...@@ -102,8 +107,15 @@ const handleGetOrderList = (id: any) => {
<div class="left_code"> <div class="left_code">
<qrcode-vue :value="qrCodeUrl" :size="197" level="H"></qrcode-vue> <qrcode-vue :value="qrCodeUrl" :size="197" level="H"></qrcode-vue>
</div> </div>
<div class="left_desc" :class="payMethod === 1 ? 'left_desc_ali' : 'left_desc_wechat'"> <div
{{ payMethod === 1 ? '请打开手机支付宝,扫一扫完成支付' : '请打开手机微信,扫一扫完成支付' }} class="left_desc"
:class="payMethod === 1 ? 'left_desc_ali' : 'left_desc_wechat'"
>
{{
payMethod === 1
? '请打开手机支付宝,扫一扫完成支付'
: '请打开手机微信,扫一扫完成支付'
}}
</div> </div>
</div> </div>
<img <img
......
<script setup lang="ts"> <script setup lang="ts">
import { useDevice } from "@/composables/useDevice"; import { useDevice } from '@/composables/useDevice'
const { mobile } = useDevice(); const { mobile } = useDevice()
const router = useRouter()
const router = useRouter();
const props = defineProps({ const props = defineProps({
payInfo: { payInfo: {
type: Object, type: Object
}, },
shopItem: { shopItem: {
type: Object, type: Object
}, }
}); })
function getDateTime(dayNum: any) {
const dateDay = new Date()
dateDay.setDate(dateDay.getDate() + dayNum) //获取dayNum天后的日期
console.log(dateDay)
const y = dateDay.getFullYear()
const m =
dateDay.getMonth() + 1 < 10
? '0' + (dateDay.getMonth() + 1)
: dateDay.getMonth() + 1 //获取当前月份的日期,不足10补0
const d = dateDay.getDate() < 10 ? '0' + dateDay.getDate() : dateDay.getDate() //获取当前几号,不足10补0
return y + '-' + m + '-' + d
}
const start_time = getDateTime(0)
const end_time = getDateTime(90)
const handleStudy = () => { const handleStudy = () => {
window.open("https://paa-learning.ezijing.com"); window.open('https://paa-learning.ezijing.com')
}; }
const handlePrev = () => { const handlePrev = () => {
router.push({ router.push({
path: `/shop/detail/${props.shopItem?.id}`, path: `/shop/detail/${props.shopItem?.id}`,
query: { query: {
payStatus: props.payInfo?.payStatus, payStatus: props.payInfo?.payStatus
}, }
}); })
}; }
</script> </script>
<template> <template>
...@@ -78,16 +91,22 @@ const handlePrev = () => { ...@@ -78,16 +91,22 @@ const handlePrev = () => {
/> />
<div class="course_dec"> <div class="course_dec">
<div class="info_title">{{ shopItem?.title }}</div> <div class="info_title">{{ shopItem?.title }}</div>
<div class="info_date">有效期: 2022-11-11 至 2022-11-11</div> <div class="info_date">有效期:{{ start_time }}{{ end_time }}</div>
</div> </div>
</div> </div>
<div class="order_main"> <div class="order_main">
<div class="order_num">商品订单:<span>GN390001234512345</span></div> <div class="order_num">
<div class="order_price">支付金额:<span>¥1999.00</span></div> 商品订单:<span>{{ payInfo?.orderId }}</span>
<div class="order_after_sales">若有疑问请与客服联系,我们将尽快为您提供服务</div> </div>
<div class="order_price">
支付金额:<span>{{ payInfo?.payPrice }}</span>
</div>
<div class="order_after_sales">
若有疑问请与客服联系,我们将尽快为您提供服务
</div>
</div> </div>
<div class="start_study"> <div class="start_study">
<div class="study_con" @click="handleStudy">开始学习</div> <div class="study_con" @click="handleStudy">开始学习</div>
</div> </div>
</div> </div>
</template> </template>
...@@ -153,7 +172,7 @@ const handlePrev = () => { ...@@ -153,7 +172,7 @@ const handlePrev = () => {
} }
} }
} }
.order_main{ .order_main {
width: 100%; width: 100%;
background: #fff; background: #fff;
border-radius: 0.12rem; border-radius: 0.12rem;
...@@ -162,35 +181,36 @@ const handlePrev = () => { ...@@ -162,35 +181,36 @@ const handlePrev = () => {
box-sizing: border-box; box-sizing: border-box;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap:0.36rem; gap: 0.36rem;
font-weight: 400; font-weight: 400;
.order_num,.order_price{ .order_num,
.order_price {
font-size: 0.24rem; font-size: 0.24rem;
color: #333; color: #333;
span{ span {
color: #999; color: #999;
} }
} }
.order_after_sales{ .order_after_sales {
font-size: 0.22rem; font-size: 0.22rem;
color: #999; color: #999;
} }
} }
.start_study{ .start_study {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
.study_con{ .study_con {
width: 6.10rem; width: 6.1rem;
height: 0.8rem; height: 0.8rem;
background: linear-gradient(102deg, #F2CA8C 0%, #E69B1C 100%); background: linear-gradient(102deg, #f2ca8c 0%, #e69b1c 100%);
opacity: 1; opacity: 1;
border-radius: 0.4rem; border-radius: 0.4rem;
text-align: center; text-align: center;
line-height: 0.8rem; line-height: 0.8rem;
color: #fff; color: #fff;
font-size: 0.28rem; font-size: 0.28rem;
} }
} }
} }
} }
......
...@@ -3,12 +3,13 @@ import Confirm from '../components/Confirm.vue' ...@@ -3,12 +3,13 @@ import Confirm from '../components/Confirm.vue'
import Order from '../components/Order.vue' import Order from '../components/Order.vue'
import PaySucess from '../components/PaySucess.vue' import PaySucess from '../components/PaySucess.vue'
import { useShopStore } from '@/stores/shop' import { useShopStore } from '@/stores/shop'
import { useDevice } from '@/composables/useDevice'
const { mobile } = useDevice()
const { shopItem } = useShopStore() const { shopItem } = useShopStore()
const status = ref('confirm') // confirm | order | success const status = ref('confirm') // confirm | order | success
const payMethod = ref(0) const payMethod = ref(0)
const payInfo = ref({}) const payInfo = ref({})
const handleSuccess = (data: any) => { const handleSuccess = (data: any) => {
console.log(data,'123')
payMethod.value = data.payMode payMethod.value = data.payMode
status.value = data.status status.value = data.status
} }
...@@ -16,13 +17,43 @@ const handleOrder = (data: any) => { ...@@ -16,13 +17,43 @@ const handleOrder = (data: any) => {
payInfo.value = data payInfo.value = data
status.value = data.status status.value = data.status
} }
const handleSuccessH5 = (data: any) => {
payInfo.value = data
status.value = data.status
}
</script> </script>
<template> <template>
<div class="pay_main"> <div class="pay_main" v-if="!mobile">
<Confirm :shopItem="shopItem" @success="handleSuccess" v-if="status === 'confirm'" /> <Confirm
<Order :shopItem="shopItem" :payMethod="payMethod" @update="handleOrder" v-if="status === 'order'" /> :shopItem="shopItem"
<PaySucess :shopItem="shopItem" :payInfo="payInfo" v-if="status === 'success'" /> @success="handleSuccess"
v-if="status === 'confirm'"
/>
<Order
:shopItem="shopItem"
:payMethod="payMethod"
@update="handleOrder"
v-if="status === 'order'"
/>
<PaySucess
:shopItem="shopItem"
:payInfo="payInfo"
v-if="status === 'success'"
/>
</div>
<div v-else>
<Confirm
:shopItem="shopItem"
@success="handleSuccessH5"
v-if="status === 'confirm'"
/>
<PaySucess
:shopItem="shopItem"
:payInfo="payInfo"
v-if="status === 'success'"
/>
</div> </div>
</template> </template>
......
import * as api from '@/api/base'
/**
* 获取微信openId
* */
export function getCode() {
const href = location.href.includes('?') ? `${location.href}&is_pay=true` : `${location.href}?is_pay=true`
const redirectURI = `https://pages.ezijing.com/given/auth.html?redirect_uri=${encodeURIComponent(href)}`
location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx451c01d40d090d7a&redirect_uri=${redirectURI}&response_type=code&scope=snsapi_base`
}
/**
* 获取微信openId
* */
export function getOpenId(code:any, callback:any) {
if (!code) {
return getCode()
}
api.getOpenId({ code, identity: 'ezijing' }).then((resp:any) => {
const openId = resp.data.openid
openId && localStorage.setItem('openId', openId)
callback && callback(openId)
})
}
/**
* 微信JSAPI支付
* */
export function wxJSPay(order:any, callback:any) {
if (!order.payment_more_info) {
alert('订单创建错误')
return
}
const payInfo = JSON.parse(order.payment_more_info)
WeixinJSBridge.invoke('getBrandWCPayRequest', payInfo, (resp:any) => {
callback && callback(resp)
})
}
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论