10 changed files with 1941 additions and 0 deletions
-
324src/views/order/addUsersIndex.vue
-
84src/views/order/components/orderSkeleton.vue
-
284src/views/order/createOrder.vue
-
297src/views/order/enterprise.vue
-
164src/views/order/flagShip.vue
-
367src/views/order/index.scss
-
207src/views/order/index.vue
-
15src/views/order/list.vue
-
65src/views/order/paySuccess.vue
-
134src/views/order/renewIndex.vue
@ -0,0 +1,324 @@ |
|||||
|
<template> |
||||
|
<div class="full_continer"> |
||||
|
<div class="banner"> |
||||
|
<p>购买流程: 1.选择模块 》2.确认订单 》 3.支付 》 4.完成</p> |
||||
|
</div> |
||||
|
|
||||
|
<div class="flux_continer"> |
||||
|
<div class="content"> |
||||
|
<div class="top_desc"> |
||||
|
<h2>升级所有已购买产品可用人数</h2> |
||||
|
<p>团队名: {{userInfo.branchName?userInfo.branchName:userInfo.branchId}}</p> |
||||
|
</div> |
||||
|
<div class="version_all"> |
||||
|
<div class="enterprise"> |
||||
|
<div class="buy_count"> |
||||
|
<h2> |
||||
|
购买总人数 |
||||
|
<span>(10人起购) 当前企业已有<font color="red">{{branchUsersCpd.maxUsers}}</font>个账户可用 </span> |
||||
|
</h2> |
||||
|
|
||||
|
<div class="buy_count_items"> |
||||
|
<el-input type="number" style="width:30%;" v-model="data.ousers" :min="10" @change="formOusersChange"></el-input> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="buy_count"> |
||||
|
<h2> |
||||
|
产品明细 |
||||
|
<span> 增加人数将自动分配人员额度给企业已购买的产品,涉及的产品明细如下 </span> |
||||
|
</h2> |
||||
|
|
||||
|
<div class="buy_count_items"> |
||||
|
<el-table |
||||
|
size="larget" |
||||
|
border |
||||
|
:data="orders.modules" |
||||
|
style="width: 100%" > |
||||
|
<!-- |
||||
|
<el-table-column |
||||
|
prop="name" |
||||
|
label="产品类型" |
||||
|
> |
||||
|
<template slot-scope="scope"> |
||||
|
<span style="margin-left: 10px">{{ scope.row.mcate == '1' ? '智慧协同办公系统' : |
||||
|
scope.row.mcate == '2' ? '项目管理' : '商城'}}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
--> |
||||
|
<el-table-column |
||||
|
prop="name" |
||||
|
label="产品名称" min-width="150" |
||||
|
> |
||||
|
<template slot-scope="scope"> |
||||
|
<div class="avatar-container"> |
||||
|
<div class="avatar-wrapper"> |
||||
|
<img v-if=" scope.row.logoUrl" class="user-avatar" :src="scope.row.logoUrl"> |
||||
|
<span class="username"> {{scope.row.name}}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
prop="ousers" |
||||
|
label="可使用人数" |
||||
|
min-width="120"> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
prop="musers" |
||||
|
label="计价人数" |
||||
|
min-width="120"> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
prop="orginFee" |
||||
|
label="原价" |
||||
|
min-width="120"> |
||||
|
<template slot-scope="scope"> |
||||
|
¥{{scope.row.orginFee}} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
prop="finalFee" |
||||
|
label="折扣价" |
||||
|
min-width="120"> |
||||
|
<template slot-scope="scope"> |
||||
|
¥{{scope.row.finalFee}} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="pay_way"> |
||||
|
<h2>支付方式</h2> |
||||
|
<div class="pay_way_items"> |
||||
|
<div class="oItem" @click="selectPayWay(item)" v-for="(item, index) in payWayOptions" :key="index"> |
||||
|
<img :src="item.icon"> |
||||
|
<span>{{item.label}}</span> |
||||
|
<i v-if="item.isChecked" class="select el-icon-success"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
<el-input size="larget" style="width:30%;" v-model="data.phone" class="phone" placeholder="输入手机号"></el-input> |
||||
|
</div> |
||||
|
|
||||
|
<div class="pay_allAmount"> |
||||
|
<h2>订单总额</h2> |
||||
|
<p class="allAmount">¥<b>{{orders.order?orders.order.ofinalFee:''}}</b>/{{data.label}}</p> |
||||
|
<el-checkbox v-model="data.checked">同意</el-checkbox> <a style="font-size: 14px;color: #409EFF">《服务协议》</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<el-button :loading="load.add" @click="createOrder" size="larget" class="submit" type="primary"> |
||||
|
提交 |
||||
|
</el-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<el-dialog |
||||
|
title="微信支付" |
||||
|
:visible.sync="weixinPayVisible" |
||||
|
:show-close="false" |
||||
|
@close="closeDialog" |
||||
|
width="350px" |
||||
|
> |
||||
|
<qriously :value="codeUrl" :size="300" /> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
|
||||
|
import {getAllMenuModule, getBuyMenuModule} from '@/api/mdp/sys/modules' |
||||
|
import {modulesOfIcon} from "../layout/ModulesMenu/modulesOfIcon.js"; |
||||
|
import {createAddUsersOrder,calcAddUsersOrder} from '@/api/mdp/sys/order'; |
||||
|
|
||||
|
import aliPayImg from '@/assets/image/module/alipay.png'; |
||||
|
import weixinPayImg from '@/assets/image/module/weixin.png'; |
||||
|
|
||||
|
import { mapGetters } from 'vuex' |
||||
|
import {aliPay, weixinPay, checkWxPayStatus} from '@/api/mdp/pay/pay' |
||||
|
|
||||
|
export default { |
||||
|
components: { }, |
||||
|
|
||||
|
computed: { |
||||
|
...mapGetters([ 'userInfo' ]), |
||||
|
|
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
payWayOptions: [ |
||||
|
{ |
||||
|
label: '支付宝', |
||||
|
val: '2', |
||||
|
icon: aliPayImg, |
||||
|
isChecked: true |
||||
|
}, |
||||
|
{ |
||||
|
label: '微信', |
||||
|
val: '1', |
||||
|
icon: weixinPayImg, |
||||
|
isChecked: false |
||||
|
} |
||||
|
], |
||||
|
load:{add:false,calc:false,list:false}, |
||||
|
orders:{ |
||||
|
modules: null, |
||||
|
order:null, |
||||
|
}, |
||||
|
data:{ |
||||
|
phone:'', |
||||
|
name:'', |
||||
|
ousers:10, |
||||
|
payType:'1', |
||||
|
checked:true,//是否同意协议 |
||||
|
}, |
||||
|
|
||||
|
branchUsersCpd:{istatus:'1',maxUsers:50,ilvlId:'2',ilvlName:'黄金会员'}, |
||||
|
weixinPayVisible: false, |
||||
|
codeUrl: "" |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
|
||||
|
formOusersChange(val){ |
||||
|
this.calcOrder(); |
||||
|
}, |
||||
|
calcOrder:function() { |
||||
|
if(!this.data.ousers){ |
||||
|
return; |
||||
|
} |
||||
|
var params={ousers:this.data.ousers} |
||||
|
calcAddUsersOrder(params).then(res=>{ |
||||
|
this.orders.order=res.data.data |
||||
|
var modules=res.data.modules |
||||
|
var defIcon=modulesOfIcon[0] |
||||
|
modules.forEach(i=>{ |
||||
|
var e=modulesOfIcon.find(k=>k.id==i.moduleId) |
||||
|
if(e && e.id){ |
||||
|
i.logoUrl = e.logoUrl; |
||||
|
}else{ |
||||
|
i.logoUrl=defIcon.logoUrl |
||||
|
} |
||||
|
}) |
||||
|
this.orders.modules=modules |
||||
|
}) |
||||
|
}, |
||||
|
selectPayWay(item) { |
||||
|
this.data.payType = item.val; |
||||
|
this.payWayOptions.forEach(element => { |
||||
|
element.isChecked = false; |
||||
|
if(item.val == element.val) { |
||||
|
element.isChecked = true; |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
createOrder() { |
||||
|
//来源 |
||||
|
this.data.osource = "1"; |
||||
|
//订单类型 |
||||
|
this.data.otype = "1"; |
||||
|
//备注 |
||||
|
this.data.remark = ""; |
||||
|
this.data.name = "模块开通订单" |
||||
|
this.load.add = true; |
||||
|
createAddUsersOrder(this.data).then(res => { |
||||
|
if(res.data.tips.isOk){ |
||||
|
//获取订单号 |
||||
|
let orderId = res.data.data.id; |
||||
|
if(this.data.payType == '2') { |
||||
|
this.toAliPay(orderId); |
||||
|
return; |
||||
|
} |
||||
|
if(this.data.payType == '1') { |
||||
|
this.toWeixinPay(orderId); |
||||
|
return; |
||||
|
} |
||||
|
}else{ |
||||
|
this.$notify.error(res.data.tips.msg); |
||||
|
} |
||||
|
}).catch(err => { |
||||
|
this.$notify.error(err.msg); |
||||
|
}).finally(() => { |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
toAliPay(orderId) { |
||||
|
let params = { |
||||
|
id: orderId, |
||||
|
otype: 1, |
||||
|
returnUrl: `${window.location.protocol+"//"+window.location.host}/${process.env.CONTEXT}/${process.env.VERSION}/#/my/order/paySuccess` |
||||
|
} |
||||
|
aliPay(params).then(res => { |
||||
|
if(res.data.tips.isOk) { |
||||
|
const div = document.createElement("divform"); |
||||
|
div.innerHTML = res.data.data.htmlStr; |
||||
|
document.body.appendChild(div); |
||||
|
document.forms[0].submit(); |
||||
|
}else { |
||||
|
this.$notify.error(res.data.tips.msg); |
||||
|
} |
||||
|
}).finally(() => { |
||||
|
setTimeout(() => { |
||||
|
this.load.add = false; |
||||
|
}, 2000); |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
toWeixinPay(orderId) { |
||||
|
let params = { |
||||
|
id: orderId, |
||||
|
otype: 1, |
||||
|
returnUrl: "" |
||||
|
} |
||||
|
weixinPay(params).then(res => { |
||||
|
if(res.data.tips.isOk) { |
||||
|
this.codeUrl = res.data.data.codeUrl; |
||||
|
this.weixinPayVisible = true; |
||||
|
this.timer = setInterval(() => { |
||||
|
this.queryOrderStatus(orderId) |
||||
|
}, 3000) |
||||
|
}else { |
||||
|
this.$notify.error(res.data.tips.msg); |
||||
|
} |
||||
|
}).finally(() => { |
||||
|
setTimeout(() => { |
||||
|
this.load.add = false; |
||||
|
}, 2000); |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
//查询订单支付状态 |
||||
|
queryOrderStatus(orderId) { |
||||
|
console.log("查询订单"); |
||||
|
checkWxPayStatus({'orderId': orderId, "otype": "1"}).then(res => { |
||||
|
if(res.data.tips.isOk) { |
||||
|
this.$router.push({path:'/my/order/paySuccess', query:{total_amount: this.data.amount, out_trade_no: orderId}}); |
||||
|
clearInterval(this.timer); |
||||
|
}else { |
||||
|
} |
||||
|
}).finally(() => { |
||||
|
|
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
closeDialog() { |
||||
|
clearInterval(this.timer); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
mounted(){ |
||||
|
this.calcOrder(); |
||||
|
getBranchInterestsDetail().then(res=>{ |
||||
|
this.branchUsersCpd=res.data.data |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
@import './index.scss'; |
||||
|
</style> |
||||
@ -0,0 +1,84 @@ |
|||||
|
<template> |
||||
|
<el-skeleton style="width: 100%; margin-top: 20px;" animated > |
||||
|
<template slot="template"> |
||||
|
<div> |
||||
|
<el-skeleton-item variant="h1" style="width: 10%" /> |
||||
|
</div> |
||||
|
<el-skeleton-item variant="p" style="width: 20%; margin-top: 20px;" /> |
||||
|
<div style="margin-top: 20px;"> |
||||
|
<el-skeleton-item variant="h1" style="width: 10%" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="display: flex; margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="image" style="width: 220px; height: 110px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="image" style="width: 240px; height: 110px;" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="h1" style="width: 10%" /> |
||||
|
<el-skeleton-item variant="span" style="width: 10%; margin: 0 30px;" /> |
||||
|
<el-skeleton-item variant="span" style="width: 10%; margin-right: 30px;" /> |
||||
|
<el-skeleton-item variant="span" style="width: 10%" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="display: flex; margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="image" style="width: 180px; height: 200px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="image" style="width: 180px; height: 200px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="image" style="width: 180px; height: 200px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="image" style="width: 180px; height: 200px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="image" style="width: 180px; height: 200px; margin-right: 20px;" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="h1" style="width: 10%" /> |
||||
|
<el-skeleton-item variant="span" style="width: 10%; margin: 0 30px;" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="text " style="width: 200px; height: 120px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="text " style="width: 200px; height: 120px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="text " style="width: 200px; height: 120px; margin-right: 20px;" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="text " style="width: 200px; height: 120px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="text " style="width: 200px; height: 120px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="text " style="width: 200px; height: 120px; margin-right: 20px;" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="display: flex; margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="image" style="width: 180px; height: 200px; margin-right: 20px;" /> |
||||
|
<el-skeleton-item variant="image" style="width: 180px; height: 200px; margin-right: 20px;" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="h1" style="width: 32%" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="h1" style="width: 10%" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="text" style="width: 50px;" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="margin-top: 30px;"> |
||||
|
<el-skeleton-item variant="text" style="width: 100px;" /> |
||||
|
</div> |
||||
|
|
||||
|
<el-skeleton-item style="margin-top: 30px; width: 100px;" variant="button" /> |
||||
|
|
||||
|
</template> |
||||
|
</el-skeleton> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
|
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
|
||||
|
</style> |
||||
@ -0,0 +1,284 @@ |
|||||
|
<template> |
||||
|
<div class="full_continer"> |
||||
|
<div class="banner"> |
||||
|
<p>购买流程: 1.选择模块 》 <span style="color:red;">2.确认订单 》</span> 3.支付 》 4.完成</p> |
||||
|
</div> |
||||
|
<div class="flux_continer"> |
||||
|
<div class="content"> |
||||
|
<div class="order_detail"> |
||||
|
<h2>订单详情</h2> |
||||
|
<div class="order_box"> |
||||
|
<div class="content"> |
||||
|
<div class="middle"> |
||||
|
<div class="desc"> |
||||
|
<el-descriptions size="larget" :column="3"> |
||||
|
<el-descriptions-item label="购买版本">企业版 ( {{data.ousers}} 人 )</el-descriptions-item> |
||||
|
<el-descriptions-item label="企业">{{data.order && data.order.obranchName?data.order.obranchName: ''}}</el-descriptions-item> |
||||
|
<!-- <el-descriptions-item label="手机号码">18826103122</el-descriptions-item> --> |
||||
|
<el-descriptions-item label="支付方式">{{data.payType == '2' ? '支付宝' : '微信'}}</el-descriptions-item> |
||||
|
</el-descriptions> |
||||
|
</div> |
||||
|
<div class="table"> |
||||
|
<el-table |
||||
|
size="larget" |
||||
|
border |
||||
|
:data="data.modules" |
||||
|
style="width: 100%" |
||||
|
height="250"> |
||||
|
<!-- |
||||
|
<el-table-column |
||||
|
prop="name" |
||||
|
label="产品类型" |
||||
|
> |
||||
|
<template slot-scope="scope"> |
||||
|
<span style="margin-left: 10px">{{ scope.row.mcate == '1' ? '智慧协同办公系统' : |
||||
|
scope.row.mcate == '2' ? '项目管理' : '商城'}}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
--> |
||||
|
<el-table-column |
||||
|
prop="name" |
||||
|
label="产品名称" min-width="150" |
||||
|
> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
prop="ousers" |
||||
|
label="可用人数" |
||||
|
min-width="120"> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
prop="musers" |
||||
|
label="计价人数" |
||||
|
min-width="120"> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
prop="orginFee" |
||||
|
label="原价" |
||||
|
min-width="120"> |
||||
|
<template slot-scope="scope"> |
||||
|
¥{{scope.row.orginFee}} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
prop="finalFee" |
||||
|
label="折扣价" |
||||
|
min-width="120"> |
||||
|
<template slot-scope="scope"> |
||||
|
¥{{scope.row.finalFee}} |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="bottom"> |
||||
|
<span class="allAmount"> |
||||
|
总金额: <b>{{data.order?data.order.ofinalFee:''}}¥</b> |
||||
|
</span> |
||||
|
<el-button size="larget" @click="returnPage">上一步</el-button> |
||||
|
<el-button size="larget" type="primary" :loading="load.add" @click="createOrder">确认支付</el-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<el-dialog |
||||
|
title="微信支付" |
||||
|
:visible.sync="weixinPayVisible" |
||||
|
:show-close="false" |
||||
|
@close="closeDialog" |
||||
|
width="350px" |
||||
|
> |
||||
|
<qriously :value="codeUrl" :size="300" /> |
||||
|
|
||||
|
|
||||
|
</el-dialog> |
||||
|
|
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
|
||||
|
import { mapGetters } from 'vuex'; |
||||
|
import {createOrder} from '@/api/mdp/sys/order' |
||||
|
import {aliPay, weixinPay, checkWxPayStatus} from '@/api/mdp/pay/pay' |
||||
|
|
||||
|
export default { |
||||
|
|
||||
|
|
||||
|
computed: { |
||||
|
...mapGetters([ |
||||
|
'userInfo' |
||||
|
]), |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
data: {}, |
||||
|
load:{add:false,}, |
||||
|
weixinPayVisible: false, |
||||
|
codeUrl: "" |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
returnPage() { |
||||
|
this.$router.back(); |
||||
|
}, |
||||
|
|
||||
|
createOrder() { |
||||
|
//来源 |
||||
|
this.data.osource = "1"; |
||||
|
//订单类型 |
||||
|
this.data.otype = "1"; |
||||
|
//备注 |
||||
|
this.data.remark = ""; |
||||
|
this.data.name = "模块开通订单" |
||||
|
this.load.add = true; |
||||
|
var params={...this.data} |
||||
|
params.order=null |
||||
|
params.modules=null |
||||
|
|
||||
|
createOrder(params).then(res => { |
||||
|
if(res.data.tips.isOk){ |
||||
|
//获取订单号 |
||||
|
let orderId = res.data.data.id; |
||||
|
if(this.data.payType == '2') { |
||||
|
this.toAliPay(orderId); |
||||
|
return; |
||||
|
} |
||||
|
if(this.data.payType == '1') { |
||||
|
this.toWeixinPay(orderId); |
||||
|
return; |
||||
|
} |
||||
|
}else{ |
||||
|
this.$notify.error(res.data.tips.msg); |
||||
|
} |
||||
|
}).catch(err => { |
||||
|
this.$notify.error(err.msg); |
||||
|
}).finally(() => { |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
toAliPay(orderId) { |
||||
|
let params = { |
||||
|
id: orderId, |
||||
|
otype: 1, |
||||
|
returnUrl: `${window.location.protocol+"//"+window.location.host}/${process.env.CONTEXT}/${process.env.VERSION}/#/my/order/paySuccess` |
||||
|
} |
||||
|
aliPay(params).then(res => { |
||||
|
if(res.data.tips.isOk) { |
||||
|
const div = document.createElement("divform"); |
||||
|
div.innerHTML = res.data.data.htmlStr; |
||||
|
document.body.appendChild(div); |
||||
|
document.forms[0].submit(); |
||||
|
}else { |
||||
|
this.$notify.error(res.data.tips.msg); |
||||
|
} |
||||
|
}).finally(() => { |
||||
|
setTimeout(() => { |
||||
|
this.load.add = false; |
||||
|
}, 2000); |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
toWeixinPay(orderId) { |
||||
|
let params = { |
||||
|
id: orderId, |
||||
|
otype: 1, |
||||
|
returnUrl: "" |
||||
|
} |
||||
|
weixinPay(params).then(res => { |
||||
|
if(res.data.tips.isOk) { |
||||
|
this.codeUrl = res.data.data.codeUrl; |
||||
|
this.weixinPayVisible = true; |
||||
|
this.timer = setInterval(() => { |
||||
|
this.queryOrderStatus(orderId) |
||||
|
}, 3000) |
||||
|
}else { |
||||
|
this.$notify.error(res.data.tips.msg); |
||||
|
} |
||||
|
}).finally(() => { |
||||
|
setTimeout(() => { |
||||
|
this.load.add = false; |
||||
|
}, 2000); |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
//查询订单支付状态 |
||||
|
queryOrderStatus(orderId) { |
||||
|
console.log("查询订单"); |
||||
|
checkWxPayStatus({'orderId': orderId, "otype": "1"}).then(res => { |
||||
|
if(res.data.tips.isOk) { |
||||
|
this.$router.push({path:'/my/order/paySuccess', query:{total_amount: this.data.amount, out_trade_no: orderId}}); |
||||
|
clearInterval(this.timer); |
||||
|
}else { |
||||
|
} |
||||
|
}).finally(() => { |
||||
|
|
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
closeDialog() { |
||||
|
clearInterval(this.timer); |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
created() { |
||||
|
let data = JSON.parse(window.localStorage.getItem("BUY_MODULES")); |
||||
|
this.data = data; |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
@import './index.scss'; |
||||
|
.order_detail { |
||||
|
margin-top: 30px; |
||||
|
.order_box { |
||||
|
margin-top: 30px; |
||||
|
width: 100%; |
||||
|
max-height: 500px; |
||||
|
border: 1px solid #E3E4E6; |
||||
|
.content { |
||||
|
.header { |
||||
|
height: 60px; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
padding-left: 20px; |
||||
|
border-bottom: 2px solid #F4F5F8; |
||||
|
} |
||||
|
.middle { |
||||
|
.desc { |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
flex-wrap: wrap; |
||||
|
span { |
||||
|
margin-right: 60px; |
||||
|
margin-bottom: 20px; |
||||
|
color: #606060; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
.bottom { |
||||
|
padding: 20px; |
||||
|
display: flex; |
||||
|
justify-content: flex-end; |
||||
|
align-items: center; |
||||
|
.allAmount { |
||||
|
margin-right: 40px; |
||||
|
b { |
||||
|
font-size: 24px; |
||||
|
color: #FA5A55; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
</style> |
||||
@ -0,0 +1,297 @@ |
|||||
|
<template> |
||||
|
<div class="enterprise"> |
||||
|
<div class="sys_type"> |
||||
|
<div class="sys_desc"> |
||||
|
<h2>选择产品</h2> |
||||
|
<div class="selectItem"> |
||||
|
<div class="item" :class="{active: active == 'xmgl' }" @click="active = 'xmgl'"> |
||||
|
<span>项目管理系统</span> |
||||
|
</div> |
||||
|
<div class="item" :class="{active: active == 'oa' }" @click="active = 'oa'"> |
||||
|
<span>智慧协同办公系统</span> |
||||
|
</div> |
||||
|
<div class="item" :class="{active: active == 'mall' }" @click="active = 'mall'"> |
||||
|
<span>电商定制系统</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="sys_modules" v-if="this.modules != null"> |
||||
|
<div v-for="(item, index) in modules[active]" :key="index"> |
||||
|
<div v-if="ooper==='2' && item.billMode!=='0' && item.isBuy" class="module"> |
||||
|
<div class="head" :class="{active: item.isChecked == true}" @click="selectItem(item, index)"> |
||||
|
<div class="module_top"> |
||||
|
<img :src="item.logoUrl" alt=""> |
||||
|
<span>{{item.name}}</span> |
||||
|
</div> |
||||
|
<div v-if="item.isBuy" class="module_bottom"> |
||||
|
<i v-if="item.isChecked" class="selected el-icon-success"></i> |
||||
|
<span> <font color="red"> 待续费 </font> <font title="到期" style="font-size:10px;"> {{formatDate(item.endTime)}} </font></span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div v-else-if="ooper!=='2' && item.billMode!=='0' " class="module"> |
||||
|
<div class="head" :class="{active: item.isChecked == true}" @click="selectItem(item, index)"> |
||||
|
<div class="module_top"> |
||||
|
<img :src="item.logoUrl" alt=""> |
||||
|
<span>{{item.name}}</span> |
||||
|
</div> |
||||
|
<div v-if=" item.billMode==='0'" class="module_bottom"> |
||||
|
<span> <font color="red">免费 </font> <font color="blue">已开通</font></span> |
||||
|
</div> |
||||
|
<div v-else-if="item.isBuy" class="module_bottom"> |
||||
|
<span> <font color="blue">已开通</font></span> |
||||
|
</div> |
||||
|
<div v-else class="module_bottom" > |
||||
|
<i v-if="item.isChecked" class="selected el-icon-success"></i> |
||||
|
<span> <font color="red">待开通</font></span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="buy_count"> |
||||
|
<h2> |
||||
|
购买总人数 |
||||
|
<span>(10人起购,请按企业(团队)总人数填写,企业(团队)总人数代表了企业在唛盟平台可开立免费账户的总个数)</span> |
||||
|
</h2> |
||||
|
|
||||
|
<div class="buy_count_items"> |
||||
|
<el-input-number v-if="branchUsersCpd.ilvlId>1" v-model="form.ousers" :min="branchUsersCpd.maxUsers" @change="formOusersChange"></el-input-number> |
||||
|
|
||||
|
<el-input-number v-else v-model="form.ousers" :min="10" @change="formOusersChange"></el-input-number> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="buy_date"> |
||||
|
<h2>期限选择</h2> |
||||
|
<div class="buy_date_items"> |
||||
|
<div class="oItem" @click="selectBuyDate(item)" v-for="(item, index) in odaysOptions" :key="index"> |
||||
|
<div class="header"> |
||||
|
{{item.label}} |
||||
|
<i v-if="item.isChecked" class="select el-icon-success"></i> |
||||
|
</div> |
||||
|
<div class="bottom"> |
||||
|
<img v-if="item.isHot" src="@/assets/image/module/hot.png" alt=""> |
||||
|
<p>¥{{item.price}}/人天</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="pay_way"> |
||||
|
<h2>支付方式</h2> |
||||
|
<div class="pay_way_items"> |
||||
|
<div class="oItem" @click="selectPayWay(item)" v-for="(item, index) in payWayOptions" :key="index"> |
||||
|
<img :src="item.icon"> |
||||
|
<span>{{item.label}}</span> |
||||
|
<i v-if="item.isChecked" class="select el-icon-success"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
<el-input size="larget" v-model="form.phone" class="phone" placeholder="输入手机号"></el-input> |
||||
|
</div> |
||||
|
|
||||
|
<div class="pay_allAmount"> |
||||
|
<h2>订单总额</h2> |
||||
|
<p class="allAmount">¥<b>{{orders.order?orders.order.ofinalFee:''}}</b>/{{form.label}}</p> |
||||
|
<el-checkbox v-model="form.checked">同意</el-checkbox> <a style="font-size: 14px;color: #409EFF">《服务协议》</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
|
||||
|
import { mapGetters } from 'vuex'; |
||||
|
import {getAllMenuModule, getBuyMenuModule} from '@/api/mdp/sys/modules' |
||||
|
import {calcOrder} from '@/api/mdp/sys/order' |
||||
|
|
||||
|
import aliPay from '@/assets/image/module/alipay.png'; |
||||
|
import weixinPay from '@/assets/image/module/weixin.png' |
||||
|
import Decimal from "decimal.js" // 具体文件中引入 |
||||
|
import getDecimal from '@/utils/decimalUtil.js' |
||||
|
|
||||
|
export default { |
||||
|
props: ['modules', 'ooper'], |
||||
|
data() { |
||||
|
return { |
||||
|
menuLoading: false, |
||||
|
active: "xmgl", |
||||
|
payWayOptions: [ |
||||
|
{ |
||||
|
label: '支付宝', |
||||
|
val: '2', |
||||
|
icon: aliPay, |
||||
|
isChecked: true |
||||
|
}, |
||||
|
{ |
||||
|
label: '微信', |
||||
|
val: '1', |
||||
|
icon: weixinPay, |
||||
|
isChecked: false |
||||
|
} |
||||
|
], |
||||
|
odaysOptions: [ |
||||
|
{ |
||||
|
label: '1年', |
||||
|
val: '360', |
||||
|
isHot: true, |
||||
|
isChecked: true, |
||||
|
price: '2' |
||||
|
}, |
||||
|
{ |
||||
|
label: '6个月', |
||||
|
val: '180', |
||||
|
isHot: false, |
||||
|
isChecked: false, |
||||
|
price: '2' |
||||
|
}, |
||||
|
{ |
||||
|
label: '3个月', |
||||
|
val: '90', |
||||
|
isHot: false, |
||||
|
isChecked: false, |
||||
|
price: '2' |
||||
|
}, |
||||
|
], |
||||
|
form: { |
||||
|
moduleIds:[], |
||||
|
payType: '1', |
||||
|
odays: '360', |
||||
|
label:'1年', |
||||
|
ousers:10, |
||||
|
phone: '', |
||||
|
checked: false, |
||||
|
}, |
||||
|
orders:{order:{ofinalFee:0},modules:[]}, |
||||
|
branchUsersCpd:{istatus:'1',maxUsers:50,ilvlId:'2',ilvlName:'黄金会员'} |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
computed: { |
||||
|
...mapGetters([ |
||||
|
'userInfo' |
||||
|
]), |
||||
|
}, |
||||
|
|
||||
|
watch: { |
||||
|
|
||||
|
'form.ousers':function(val,oldValue){ |
||||
|
this.calcOrder(); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
formatDate(dateStr){ |
||||
|
if(dateStr){ |
||||
|
return dateStr.substring(0,10) |
||||
|
}else{ |
||||
|
return ''; |
||||
|
} |
||||
|
}, |
||||
|
formOusersChange(val){ |
||||
|
if(this.branchUsersCpd && this.branchUsersCpd.istatus=='1'){ |
||||
|
if(val<=this.branchUsersCpd.maxUsers){ |
||||
|
this.form.ousers=this.branchUsersCpd.maxUsers |
||||
|
this.$notify({position:"bottom-left",message:"您当前已拥有创建"+this.branchUsersCpd.maxUsers+"个账户资格,企业总人数不能低于"+this.branchUsersCpd.maxUsers,type:"warning"}) |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
calcOrder:function() { |
||||
|
if(!this.form.moduleIds || this.form.moduleIds.length==0){ |
||||
|
if(this.orders && this.orders.order){ |
||||
|
this.orders={order:{ofinalFee:0},moduleIds:[]} |
||||
|
} |
||||
|
return; |
||||
|
} |
||||
|
this.form.ooper=this.ooper; |
||||
|
calcOrder(this.form).then(res=>{ |
||||
|
var tips = res.data.tips; |
||||
|
if(tips.isOk){ |
||||
|
this.orders.order=res.data.data |
||||
|
this.orders.modules=res.data.modules |
||||
|
this.odaysOptions.forEach(i=>{ |
||||
|
i.price=parseInt(this.orders.order.ofinalFee/this.form.ousers/this.form.odays ) |
||||
|
}) |
||||
|
}else{ |
||||
|
this.$notify({position:"bottom-left",message:tips.msg,type:"error"}) |
||||
|
} |
||||
|
|
||||
|
}) |
||||
|
}, |
||||
|
selectItem(item) { |
||||
|
|
||||
|
if(this.ooper!='2' && item.isBuy){ |
||||
|
this.$notify({position:"bottom-left",message:"【"+item.name+"】已购买,如需调整,请进入【我的订单->加购】 处理",type:"warning"}) |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if( item.billMode==='0'){ |
||||
|
this.$notify({position:"bottom-left",message:"【"+item.name+"】为免费开通,无须下单。",type:"warning"}) |
||||
|
return false; |
||||
|
} |
||||
|
item.isChecked=!item.isChecked; |
||||
|
if(item.isChecked==false){ |
||||
|
this.form.moduleIds=this.form.moduleIds.filter(i=>i!=item.id) |
||||
|
}else if(item.isChecked==true && !this.form.moduleIds.some(i=>i==item.id)){ |
||||
|
this.form.moduleIds.push(item.id) |
||||
|
} |
||||
|
this.calcOrder(); |
||||
|
}, |
||||
|
|
||||
|
selectPayWay(item) { |
||||
|
this.form.payType = item.val; |
||||
|
this.payWayOptions.forEach(element => { |
||||
|
element.isChecked = false; |
||||
|
if(item.val == element.val) { |
||||
|
element.isChecked = true; |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
selectBuyDate(item) { |
||||
|
this.form.odays = item.val; |
||||
|
this.odaysOptions.forEach(element => { |
||||
|
element.isChecked = false; |
||||
|
if(item.val == element.val) { |
||||
|
element.isChecked = true; |
||||
|
} |
||||
|
}); |
||||
|
this.form.odays=item.val |
||||
|
this.form.label=item.label |
||||
|
this.calcOrder(); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
getData() { |
||||
|
let obj = { |
||||
|
...this.orders, |
||||
|
...this.form, |
||||
|
opper:this.ooper, |
||||
|
} |
||||
|
return obj; |
||||
|
}, |
||||
|
}, |
||||
|
|
||||
|
mounted() { |
||||
|
this.form.phone = this.userInfo.phoneno; |
||||
|
this.$mdp.getBranchInterestsDetail().then(res=>{ |
||||
|
Object.assign(this.branchUsersCpd,res.data.data); |
||||
|
if(this.branchUsersCpd.branchId && this.branchUsersCpd.istatus=='1'){ |
||||
|
this.form.ousers=this.branchUsersCpd.maxUsers |
||||
|
//this.calcOrder(); |
||||
|
} |
||||
|
|
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
@import './index.scss'; |
||||
|
</style> |
||||
@ -0,0 +1,164 @@ |
|||||
|
<template> |
||||
|
<div class="flagShip"> |
||||
|
<h2>购买信息</h2> |
||||
|
<span class="desc">填写你的联系方式,我们产品顾问将会尽快联系你。</span> |
||||
|
<el-form class="form" label-position="left" ref="form" :model="form" :rules="rules" label-width="80px"> |
||||
|
<el-form-item label="联系人" prop="contacts"> |
||||
|
<el-input class="inp" v-model="form.contacts"></el-input> |
||||
|
</el-form-item> |
||||
|
|
||||
|
<el-form-item label="联系电话" prop="phone"> |
||||
|
<el-input class="inp" v-model="form.phone"></el-input> |
||||
|
</el-form-item> |
||||
|
|
||||
|
<el-form-item label="使用人数"> |
||||
|
<el-select class="inp" v-model="form.usePeoples" placeholder="使用人数"> |
||||
|
<el-option |
||||
|
v-for="item in usePeopleOptions" |
||||
|
:key="item.value" |
||||
|
:label="item.label" |
||||
|
:value="item.value"> |
||||
|
</el-option> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
|
||||
|
<el-form-item label="服务需求"> |
||||
|
<el-select class="inp" multiple v-model="form.needs" placeholder="服务需求"> |
||||
|
<el-option |
||||
|
v-for="item in needOptions" |
||||
|
:key="item.value" |
||||
|
:label="item.label" |
||||
|
:value="item.value"> |
||||
|
</el-option> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<span>想要我们提供哪些服务(可多选)</span> |
||||
|
</el-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
data() { |
||||
|
// 自定义验证 |
||||
|
const validPhone = (rule, value, callback) => { |
||||
|
const reg = /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\d{8}$/ |
||||
|
if (!value) { |
||||
|
callback(new Error('请输入电话号码')) |
||||
|
} else if (!reg.test(value)) { //判断用户输入的值是否符合规则 |
||||
|
callback(new Error('请输入正确的11位手机号码')) |
||||
|
} else { |
||||
|
callback() |
||||
|
} |
||||
|
} |
||||
|
return { |
||||
|
usePeopleOptions: [ |
||||
|
{ |
||||
|
label: '51-100', |
||||
|
value: '51-100' |
||||
|
}, |
||||
|
{ |
||||
|
label: '101-500', |
||||
|
value: '101-500' |
||||
|
}, |
||||
|
{ |
||||
|
label: '501-1000', |
||||
|
value: '501-1000' |
||||
|
}, |
||||
|
{ |
||||
|
label: '1000以上', |
||||
|
value: '1000以上' |
||||
|
} |
||||
|
], |
||||
|
needOptions: [ |
||||
|
{ |
||||
|
label: '预约演示', |
||||
|
value: '预约演示' |
||||
|
}, |
||||
|
{ |
||||
|
label: '产品报价', |
||||
|
value: '产品报价' |
||||
|
}, |
||||
|
{ |
||||
|
label: '部署方式', |
||||
|
value: '部署方式' |
||||
|
}, |
||||
|
{ |
||||
|
label: '新增功能', |
||||
|
value: '新增功能' |
||||
|
}, |
||||
|
{ |
||||
|
label: '其它', |
||||
|
value: '其它' |
||||
|
} |
||||
|
], |
||||
|
form: { |
||||
|
phone: '', |
||||
|
contacts: '', |
||||
|
usePeoples: '', |
||||
|
needs: [], |
||||
|
}, |
||||
|
rules: { |
||||
|
contacts: [ |
||||
|
{ required: true, message: '请输入联系人', trigger: 'blur' }, |
||||
|
], |
||||
|
phone: [ |
||||
|
{ required: true, trigger: 'blur', validator: validPhone } |
||||
|
], |
||||
|
usePeoples: [ |
||||
|
{ required: true, message: '请选择使用人数', trigger: 'blur' }, |
||||
|
], |
||||
|
needs: [ |
||||
|
{ required: true, message: '请选择服务需求', trigger: 'blur' }, |
||||
|
], |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
getData() { |
||||
|
//验证表单 |
||||
|
return new Promise((resolve, reject) => { |
||||
|
this.$refs['form'].validate((valid) => { |
||||
|
if (valid) { |
||||
|
resolve(this.form); |
||||
|
} else { |
||||
|
reject(new Error('前检查表单项是否填写正确')) |
||||
|
} |
||||
|
}); |
||||
|
}) |
||||
|
}, |
||||
|
clearForm() { |
||||
|
this.form.phone = ""; |
||||
|
this.form.contacts = ""; |
||||
|
this.form.usePeoples = ""; |
||||
|
this.form.needs = []; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.flagShip { |
||||
|
margin-top: 30px; |
||||
|
h2 { |
||||
|
margin-bottom: 20px; |
||||
|
} |
||||
|
.desc { |
||||
|
color: #7D7D7D; |
||||
|
} |
||||
|
.form { |
||||
|
margin-top: 40px; |
||||
|
.inp { |
||||
|
width: 280px; |
||||
|
} |
||||
|
|
||||
|
span { |
||||
|
margin-left: 78px; |
||||
|
color: #7D7D7D; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,367 @@ |
|||||
|
.full_continer { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
.banner { |
||||
|
margin-top: 35px; |
||||
|
height: 32px; |
||||
|
text-align: center; |
||||
|
border-bottom: 32px solid; |
||||
|
border-image: -webkit-linear-gradient(-180deg, rgba(255,255,255,0.00) 0%,#D8E0F5 40%, rgba(255,255,255,0.00) 99%) 2 2 2 2; |
||||
|
p { |
||||
|
line-height: 32px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
h2 { |
||||
|
font-size: 28px; |
||||
|
font-family: PingFang SC; |
||||
|
font-weight: bold; |
||||
|
color: #303030; |
||||
|
} |
||||
|
|
||||
|
.flux_continer { |
||||
|
width: 80%; |
||||
|
height: 100%; |
||||
|
margin: 0 auto; |
||||
|
.content { |
||||
|
.top_desc { |
||||
|
h2 { |
||||
|
margin-top: 60px; |
||||
|
} |
||||
|
p { |
||||
|
margin-top: 34px; |
||||
|
color: #7D7D7D; |
||||
|
font-size: 20px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.version { |
||||
|
margin-top: 38px; |
||||
|
.version_item { |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
.oItem:nth-child(2) { |
||||
|
background-color: #F8F6F4; |
||||
|
} |
||||
|
.oItem { |
||||
|
position: relative; |
||||
|
margin-top: 24px; |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
width: 220px; |
||||
|
height: 110px; |
||||
|
margin-right: 20px; |
||||
|
border-radius: 5px; |
||||
|
background-color: #F4F5F8; |
||||
|
cursor: pointer; |
||||
|
img { |
||||
|
width: 110px; |
||||
|
height: 110px; |
||||
|
} |
||||
|
.desc { |
||||
|
margin-left: 8px; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
font-size: 16px; |
||||
|
p:nth-child(2) { |
||||
|
margin-top: 8px; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
.select { |
||||
|
font-size: 30px; |
||||
|
position: absolute; |
||||
|
right: 5px; |
||||
|
top: 2px; |
||||
|
color: #409EFF; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.submit { |
||||
|
margin-top: 35px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
.enterprise { |
||||
|
.sys_type { |
||||
|
margin-top: 52px; |
||||
|
.sys_desc { |
||||
|
display: flex; |
||||
|
height: 46px; |
||||
|
width: 100%; |
||||
|
h2 { |
||||
|
margin-right: 44px; |
||||
|
line-height: 46px; |
||||
|
} |
||||
|
.selectItem { |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
.item { |
||||
|
display: flex; |
||||
|
margin-right: 60px; |
||||
|
height: 46px; |
||||
|
align-items: center; |
||||
|
cursor: pointer; |
||||
|
font-size: 18px; |
||||
|
} |
||||
|
.active { |
||||
|
font-size: 22px; |
||||
|
color: rgb(116, 155, 242); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
.sys_modules { |
||||
|
margin-top: 30px; |
||||
|
display: flex; |
||||
|
flex-wrap: wrap; |
||||
|
.active { |
||||
|
border: 2px solid rgb(116, 155, 242) !important; |
||||
|
} |
||||
|
.module { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
background: #FFFFFF; |
||||
|
margin-right: 30px; |
||||
|
margin-top:30px; |
||||
|
.head { |
||||
|
width: 180px; |
||||
|
height: 200px; |
||||
|
border: 1px solid #E3E4E6; |
||||
|
border-radius: 8px; |
||||
|
position: relative; |
||||
|
cursor: pointer; |
||||
|
.module_top { |
||||
|
display: flex; |
||||
|
height: 170px; |
||||
|
flex-direction: column; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
text-align: center; |
||||
|
img { |
||||
|
width: 90px; |
||||
|
height: 90px; |
||||
|
margin-top: 20px; |
||||
|
} |
||||
|
span { |
||||
|
color: #606060; |
||||
|
margin-top: 20px; |
||||
|
font-size: 18px; |
||||
|
} |
||||
|
} |
||||
|
.module_bottom { |
||||
|
.selected { |
||||
|
font-size: 30px; |
||||
|
position: absolute; |
||||
|
right: 10px; |
||||
|
top:5px; |
||||
|
color: #409EFF; |
||||
|
} |
||||
|
span{ |
||||
|
font-size: 14px; |
||||
|
position: absolute; |
||||
|
left: 10px; |
||||
|
top: 5px; |
||||
|
color: #409EFF; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.footer { |
||||
|
margin-bottom: 20px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
||||
|
.buy_count { |
||||
|
margin-top: 32px; |
||||
|
h2 { |
||||
|
span { |
||||
|
font-size: 18px; |
||||
|
margin-left: 5px; |
||||
|
color: #C7C7C7; |
||||
|
} |
||||
|
} |
||||
|
.buy_count_items { |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
margin-top: 30px; |
||||
|
.oItem { |
||||
|
margin-right: 30px; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
width: 200px; |
||||
|
height: 120px; |
||||
|
border: 2px solid #E3E4E6; |
||||
|
justify-content: center; |
||||
|
border-radius: 6px; |
||||
|
.item_header { |
||||
|
height: 40px; |
||||
|
width: 100%; |
||||
|
text-align: center; |
||||
|
line-height: 30px; |
||||
|
color: #606060; |
||||
|
border-bottom: 2px solid #E3E4E6; |
||||
|
} |
||||
|
.item_bottom { |
||||
|
width: 100%; |
||||
|
text-align: center; |
||||
|
line-height: 60px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.buy_date { |
||||
|
margin-top: 50px; |
||||
|
h2 { |
||||
|
margin-bottom: 30px; |
||||
|
} |
||||
|
.buy_date_items { |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
.oItem { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
width: 200px; |
||||
|
height: 144px; |
||||
|
border-radius: 8px; |
||||
|
margin-right: 30px; |
||||
|
border: 2px solid #E3E4E6; |
||||
|
cursor: pointer; |
||||
|
.header { |
||||
|
position: relative; |
||||
|
height: 44px; |
||||
|
width: 100%; |
||||
|
text-align: center; |
||||
|
line-height: 44px; |
||||
|
color: #424141; |
||||
|
border-bottom: 2px solid #E3E4E6; |
||||
|
.select { |
||||
|
font-size: 30px; |
||||
|
position: absolute; |
||||
|
right: 10px; |
||||
|
top: 5px; |
||||
|
color: #409EFF; |
||||
|
} |
||||
|
} |
||||
|
.bottom { |
||||
|
height: 100px; |
||||
|
width: 100%; |
||||
|
position: relative; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
img { |
||||
|
width: 113px; |
||||
|
height: 40px; |
||||
|
} |
||||
|
p { |
||||
|
margin-top: 12px; |
||||
|
} |
||||
|
.normal { |
||||
|
margin-top: 57px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.pay_way { |
||||
|
margin-top: 50px; |
||||
|
h2 { |
||||
|
margin-bottom: 20px; |
||||
|
} |
||||
|
.pay_way_items { |
||||
|
display: flex; |
||||
|
.oItem { |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
align-items: center; |
||||
|
width: 200px; |
||||
|
height: 80px; |
||||
|
margin-right: 30px; |
||||
|
border: 2px solid #E3E4E6; |
||||
|
border-radius: 8px; |
||||
|
margin-top: 5px; |
||||
|
position: relative; |
||||
|
cursor: pointer; |
||||
|
img { |
||||
|
width: 50px; |
||||
|
height: 50px; |
||||
|
margin: 13px 18px 13px 40px; |
||||
|
} |
||||
|
.select { |
||||
|
font-size: 30px; |
||||
|
position: absolute; |
||||
|
right: 5px; |
||||
|
top: 5px; |
||||
|
color: #409EFF; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.phone { |
||||
|
margin-top: 10px !important; |
||||
|
width: 440px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.pay_allAmount { |
||||
|
margin-top: 30px; |
||||
|
h2 { |
||||
|
margin-bottom: 20px; |
||||
|
} |
||||
|
.allAmount { |
||||
|
font-size: 22px; |
||||
|
font-weight: bold; |
||||
|
color: #FA5A55; |
||||
|
margin-bottom: 20px; |
||||
|
b { |
||||
|
font-size: 38px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.avatar-container { |
||||
|
height: 50px; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
.avatar-wrapper { |
||||
|
cursor: pointer; |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
align-items: center; |
||||
|
.user-avatar { |
||||
|
height: 34px; |
||||
|
width: 34px; |
||||
|
border-radius: 50%; |
||||
|
margin-right: 12px; |
||||
|
} |
||||
|
.username{ |
||||
|
color: #7D7D7D; |
||||
|
font-size: 18px; |
||||
|
margin-right: 2px; |
||||
|
} |
||||
|
.el-icon-caret-bottom { |
||||
|
font-size: 22px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,207 @@ |
|||||
|
<template> |
||||
|
<div class="full_continer"> |
||||
|
<div class="banner"> |
||||
|
<p>购买流程: 1.选择模块 》2.确认订单 》 3.支付 》 4.完成</p> |
||||
|
</div> |
||||
|
|
||||
|
<div class="flux_continer"> |
||||
|
|
||||
|
<orderSkeleton v-if="menuLoading" /> |
||||
|
|
||||
|
<div class="content" v-else> |
||||
|
<div class="top_desc"> |
||||
|
<h2>购买订单</h2> |
||||
|
<p>团队名: {{userInfo.branchName?userInfo.branchName:userInfo.branchId}}</p> |
||||
|
</div> |
||||
|
|
||||
|
<div class="version"> |
||||
|
<h2>选择版本</h2> |
||||
|
<div class="version_item"> |
||||
|
<div @click="selectVersion(item)" class="oItem" v-for="(item, index) in version" :key="index"> |
||||
|
<img :src='item.img'> |
||||
|
<div class="desc"> |
||||
|
<p>{{item.name}}</p> |
||||
|
<p>{{item.desc}}</p> |
||||
|
</div> |
||||
|
<i v-if="item.isChecked" class="select el-icon-success"></i> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="version_all"> |
||||
|
<flag-ship ref="flagship" v-if="currentSelectVersion == '旗舰版'"></flag-ship> |
||||
|
<enterprise ref="enterprise" :modules="modules" v-if="currentSelectVersion == '企业版'" :ooper="'1'"></enterprise> |
||||
|
</div> |
||||
|
|
||||
|
<el-button :loading="submitLoading" @click="submitOrder" size="larget" class="submit" type="primary"> |
||||
|
{{currentSelectVersion == '企业版' ? '提交订单' : '提交信息'}} |
||||
|
</el-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
|
||||
|
//图标 |
||||
|
import EnterpriseVersionIcon from '@/assets/image/module/mo_enterprise.png' |
||||
|
import FlagShipIcon from '@/assets/image/module/mo_flagship.png' |
||||
|
//组件 |
||||
|
import FlagShip from './flagShip' |
||||
|
import Enterprise from './enterprise' |
||||
|
import orderSkeleton from './components/orderSkeleton' |
||||
|
import {getAllMenuModule, getBuyMenuModule} from '@/api/mdp/sys/modules' |
||||
|
import {modulesOfIcon} from "../layout/ModulesMenu/modulesOfIcon.js"; |
||||
|
import {createFlagShipOrder} from '@/api/mdp/sys/order'; |
||||
|
|
||||
|
import { mapGetters } from 'vuex' |
||||
|
|
||||
|
export default { |
||||
|
components: {FlagShip, Enterprise, orderSkeleton}, |
||||
|
|
||||
|
computed: { |
||||
|
...mapGetters([ 'userInfo' ]), |
||||
|
|
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
version: [ |
||||
|
{ |
||||
|
name: '企业版', |
||||
|
desc: '(10人起购)', |
||||
|
isChecked: true, |
||||
|
img: EnterpriseVersionIcon |
||||
|
}, |
||||
|
{ |
||||
|
name: '旗舰版', |
||||
|
desc: '(50人起购)', |
||||
|
isChecked: false, |
||||
|
img: FlagShipIcon |
||||
|
} |
||||
|
], |
||||
|
currentSelectVersion: '企业版', |
||||
|
menuLoading: false, |
||||
|
modules: null, |
||||
|
submitLoading: false, |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
selectVersion(item) { |
||||
|
this.currentSelectVersion = item.name; |
||||
|
this.version.forEach(element => { |
||||
|
element.isChecked = false; |
||||
|
if(item.name == element.name) { |
||||
|
element.isChecked = true; |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
submitOrder() { |
||||
|
//验证参数 |
||||
|
if(this.currentSelectVersion == "企业版") { |
||||
|
let data = this.$refs.enterprise.getData(); |
||||
|
//验证手机号是否填写 |
||||
|
if(data.phone == "" || data.phone == null || data.phone == undefined) { |
||||
|
this.$notify({ |
||||
|
message: '请输入手机号', |
||||
|
type: 'warning' |
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
//验证是否同意服务协议 |
||||
|
if(!data.checked) { |
||||
|
this.$notify({ |
||||
|
message: '请先同意服务协议', |
||||
|
type: 'warning' |
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
//保存购买模块信息到本地 |
||||
|
if(data.moduleIds.length <= 0) { |
||||
|
this.$notify({ |
||||
|
message: '请选择要购买的模块', |
||||
|
type: 'warning' |
||||
|
}); |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
window.localStorage.setItem("BUY_MODULES", JSON.stringify(data)) |
||||
|
this.$router.push('/my/order/create') |
||||
|
}else { |
||||
|
let flagData = this.$refs.flagship.getData(); |
||||
|
flagData.then((res) => { |
||||
|
//创建订单 |
||||
|
res.needs = JSON.stringify(res.needs); |
||||
|
this.submitLoading = true; |
||||
|
createFlagShipOrder(res).then(res => { |
||||
|
if(res.data.tips.isOk){ |
||||
|
this.$notify.success("信息已提交,稍后我们将会联系您"); |
||||
|
this.$refs.flagship.clearForm(); |
||||
|
}else{ |
||||
|
this.$notify.error(res.data.tips.msg); |
||||
|
} |
||||
|
}).catch(err => { |
||||
|
this.$notify.error(err.msg); |
||||
|
}).finally(() => { |
||||
|
this.submitLoading = false; |
||||
|
}) |
||||
|
}).catch(err => { |
||||
|
|
||||
|
}) |
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
//获取所有模块 |
||||
|
getAllModules() { |
||||
|
this.menuLoading = true |
||||
|
getAllMenuModule({}).then(res => { |
||||
|
let tempData = res.data.data; |
||||
|
tempData.forEach(i=>{ |
||||
|
i.isChecked=false |
||||
|
i.musers=10 |
||||
|
i.isBuy=false |
||||
|
i.endTime='' |
||||
|
}) |
||||
|
getBuyMenuModule({}).then(res2 => { |
||||
|
let branchModules = res2.data.data; |
||||
|
tempData.forEach(k => { |
||||
|
branchModules.forEach(element => { |
||||
|
if(k.id == element.moduleId && element.status=='1') { |
||||
|
k.isBuy = true; |
||||
|
k.musers=element.musers |
||||
|
k.endTime=element.endTime |
||||
|
} |
||||
|
}); |
||||
|
modulesOfIcon.forEach(element => { |
||||
|
if(k.id == element.id) { |
||||
|
k.logoUrl = element.logoUrl; |
||||
|
} |
||||
|
}); |
||||
|
}) |
||||
|
let xmMenus = tempData.filter(res => {return res.mcate == '2'}) |
||||
|
let oaMunus = tempData.filter(res => {return res.mcate == '1'}) |
||||
|
let mallMenus = tempData.filter(res => {return res.mcate == '3'}) |
||||
|
this.modules = { |
||||
|
"xmgl": xmMenus, |
||||
|
"oa" : oaMunus, |
||||
|
"mall": mallMenus |
||||
|
} |
||||
|
}) |
||||
|
}).finally(() => this.menuLoading = false) |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
mounted(){ |
||||
|
this.getAllModules(); |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
@import './index.scss'; |
||||
|
</style> |
||||
@ -0,0 +1,15 @@ |
|||||
|
<template> |
||||
|
<div> |
||||
|
订单列表 |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
|
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style> |
||||
|
|
||||
|
</style> |
||||
@ -0,0 +1,65 @@ |
|||||
|
<template> |
||||
|
<div class="result"> |
||||
|
<el-result icon="success"> |
||||
|
<template slot="title"> |
||||
|
<p style="font-size: 24px;">恭喜您,支付成功!</p> |
||||
|
</template> |
||||
|
<template class="subTitle" slot="subTitle"> |
||||
|
<p style="margin-bottom: 6px;font-size: 16px;">您已成功支付¥ {{params.total_amount}} 元</p> |
||||
|
<p style="margin-bottom: 6px;font-size: 16px;">订单号:{{params.out_trade_no}} (查看订单)</p> |
||||
|
</template> |
||||
|
<template slot="extra"> |
||||
|
<el-button type="primary" size="larget" @click="goBuyAgain()">继续购买</el-button> |
||||
|
<el-button size="larget" @click="returnHome()">返回首页</el-button> |
||||
|
</template> |
||||
|
</el-result> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
params: {}, |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
created() { |
||||
|
const href = window.location.href; |
||||
|
this.params = this.urlParamsHash(href); |
||||
|
console.log(this.params, "params"); |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
returnHome() { |
||||
|
this.$router.push({path:'/dashboard'}) |
||||
|
}, |
||||
|
|
||||
|
goBuyAgain() { |
||||
|
this.$router.push({path:'/my/order/index'}) |
||||
|
}, |
||||
|
|
||||
|
urlParamsHash(url) { |
||||
|
var params = {} |
||||
|
var h |
||||
|
var hash = url.slice(url.indexOf('?') + 1).split('&') |
||||
|
for(var i = 0; i < hash.length; i++) { |
||||
|
h = hash[i].split('=') |
||||
|
params[h[0]] = h[1] |
||||
|
} |
||||
|
return params; |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.result { |
||||
|
height: 600px; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
</style> |
||||
@ -0,0 +1,134 @@ |
|||||
|
<template> |
||||
|
<div class="full_continer"> |
||||
|
<div class="banner"> |
||||
|
<p>购买流程: 1.选择模块 》2.确认订单 》 3.支付 》 4.完成</p> |
||||
|
</div> |
||||
|
|
||||
|
<div class="flux_continer"> |
||||
|
|
||||
|
<orderSkeleton v-if="menuLoading" /> |
||||
|
|
||||
|
<div class="content" v-else> |
||||
|
<div class="top_desc"> |
||||
|
<h2>续费订单</h2> |
||||
|
<p>团队名: {{userInfo.branchName?userInfo.branchName:userInfo.branchId}}</p> |
||||
|
</div> |
||||
|
<div class="version_all"> |
||||
|
<enterprise ref="enterprise" :modules="modules" :ooper="'2'"></enterprise> |
||||
|
</div> |
||||
|
<el-button :loading="submitLoading" @click="submitOrder" size="larget" class="submit" type="primary"> |
||||
|
提交订单 |
||||
|
</el-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
//组件 |
||||
|
import Enterprise from './enterprise' |
||||
|
import orderSkeleton from './components/orderSkeleton' |
||||
|
import {getAllMenuModule, getBuyMenuModule} from '@/api/mdp/sys/modules' |
||||
|
import {modulesOfIcon} from "../layout/ModulesMenu/modulesOfIcon.js"; |
||||
|
|
||||
|
import { mapGetters } from 'vuex' |
||||
|
|
||||
|
export default { |
||||
|
components: {Enterprise, orderSkeleton}, |
||||
|
|
||||
|
computed: { |
||||
|
...mapGetters([ 'userInfo' ]), |
||||
|
|
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
menuLoading: false, |
||||
|
modules: null, |
||||
|
submitLoading: false, |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
submitOrder() { |
||||
|
let data = this.$refs.enterprise.getData(); |
||||
|
//验证手机号是否填写 |
||||
|
if(data.phone == "" || data.phone == null || data.phone == undefined) { |
||||
|
this.$notify({ |
||||
|
message: '请输入手机号', |
||||
|
type: 'warning' |
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
//验证是否同意服务协议 |
||||
|
if(!data.checked) { |
||||
|
this.$notify({ |
||||
|
message: '请先同意服务协议', |
||||
|
type: 'warning' |
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
//保存购买模块信息到本地 |
||||
|
if(data.moduleIds.length <= 0) { |
||||
|
this.$notify({ |
||||
|
message: '请选择要购买的模块', |
||||
|
type: 'warning' |
||||
|
}); |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
window.localStorage.setItem("BUY_MODULES", JSON.stringify(data)) |
||||
|
this.$router.push('/my/order/create') |
||||
|
}, |
||||
|
|
||||
|
//获取所有模块 |
||||
|
getAllModules() { |
||||
|
this.menuLoading = true |
||||
|
getAllMenuModule({}).then(res => { |
||||
|
let tempData = res.data.data; |
||||
|
tempData.forEach(i=>{ |
||||
|
i.isChecked=false |
||||
|
i.musers=10 |
||||
|
i.isBuy=false |
||||
|
i.endTime='' |
||||
|
}) |
||||
|
getBuyMenuModule({}).then(res2 => { |
||||
|
let branchModules = res2.data.data; |
||||
|
tempData.forEach(k => { |
||||
|
branchModules.forEach(element => { |
||||
|
if(k.id == element.moduleId && element.status=='1') { |
||||
|
k.isBuy = true; |
||||
|
k.musers=element.musers |
||||
|
k.endTime=element.endTime |
||||
|
} |
||||
|
}); |
||||
|
modulesOfIcon.forEach(element => { |
||||
|
if(k.id == element.id) { |
||||
|
k.logoUrl = element.logoUrl; |
||||
|
} |
||||
|
}); |
||||
|
}) |
||||
|
let xmMenus = tempData.filter(res => {return res.mcate == '2'}) |
||||
|
let oaMunus = tempData.filter(res => {return res.mcate == '1'}) |
||||
|
let mallMenus = tempData.filter(res => {return res.mcate == '3'}) |
||||
|
this.modules = { |
||||
|
"xmgl": xmMenus, |
||||
|
"oa" : oaMunus, |
||||
|
"mall": mallMenus |
||||
|
} |
||||
|
}) |
||||
|
}).finally(() => this.menuLoading = false) |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
mounted(){ |
||||
|
this.getAllModules(); |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
@import './index.scss'; |
||||
|
</style> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue