Commit a07a27cd authored by zhengke's avatar zhengke

no message

parents 7c19f5e6 e9c84db3
...@@ -75,6 +75,9 @@ page { ...@@ -75,6 +75,9 @@ page {
line-height: 1.375rem; line-height: 1.375rem;
letter-spacing: 0.00714em; letter-spacing: 0.00714em;
} }
.text-success{
color: #20af6e !important;
}
/* ::-webkit-scrollbar { /* ::-webkit-scrollbar {
display: none; display: none;
width: 0 !important; width: 0 !important;
......
<template> <template>
<div class="items-center row"> <div class="items-center row">
<img src="https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713433759000_282.png"
style="height: 33px" @click="forwardProduct" class="cusor-pointer"/>
<div class="primary-link-button q-ml-lg cusor-pointer no-select">创建设计</div>
<el-dropdown trigger="click"> <el-dropdown trigger="click">
<el-avatar <el-avatar
:size="size" :size="size"
...@@ -108,10 +111,10 @@ import { openNewBlank } from "@/utils/common"; ...@@ -108,10 +111,10 @@ import { openNewBlank } from "@/utils/common";
const props = defineProps({ const props = defineProps({
size: { size: {
type: Number, type: Number,
default: 40, default: 33,
}, },
}); });
const forwardProduct = () => router.push('/p/show')
const router = useRouter() const router = useRouter()
const useUser = useUserStore(); const useUser = useUserStore();
const { userInfo } = storeToRefs(useUser); const { userInfo } = storeToRefs(useUser);
......
...@@ -5,6 +5,12 @@ export interface CustomerTheme{ ...@@ -5,6 +5,12 @@ export interface CustomerTheme{
color:string, color:string,
desc:string desc:string
} }
export interface MemberRights{
name:string,
value:string,
sub?:string,
range:('F'|'P'|'E')[]
}
export const FREE_USER_THEME:CustomerTheme = {name:'FREE',bg:'linear-gradient(270deg, #94A3C0 0%, #99A3B8 100%)',color:'#94a3c0', desc:'免费版·个人'} export const FREE_USER_THEME:CustomerTheme = {name:'FREE',bg:'linear-gradient(270deg, #94A3C0 0%, #99A3B8 100%)',color:'#94a3c0', desc:'免费版·个人'}
export const VIP_USER_THEME:CustomerTheme = {name:'VIP',bg:'linear-gradient(270deg, #4165E2 0%, #5276F5 100%)',color:'#dd9b38', desc:'会员版·个人'} export const VIP_USER_THEME:CustomerTheme = {name:'VIP',bg:'linear-gradient(270deg, #4165E2 0%, #5276F5 100%)',color:'#dd9b38', desc:'会员版·个人'}
...@@ -13,4 +19,32 @@ export const TME_USER_THEME:CustomerTheme = {name:'TME',bg:'linear-gradient(270d ...@@ -13,4 +19,32 @@ export const TME_USER_THEME:CustomerTheme = {name:'TME',bg:'linear-gradient(270d
export const CustomerThemeConfig:CustomerTheme[] = [FREE_USER_THEME,VIP_USER_THEME,ENT_USER_THEME,TME_USER_THEME] export const CustomerThemeConfig:CustomerTheme[] = [FREE_USER_THEME,VIP_USER_THEME,ENT_USER_THEME,TME_USER_THEME]
export const USER_DEFAULT_HEADER = 'https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713839840000_239.png' export const USER_DEFAULT_HEADER = 'https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713839840000_239.png'
\ No newline at end of file
const ALL_MEMBER_RIGHTS:MemberRights[]=[
{name:'创建行程数量',value:'1',sub:'(无法上传自有模板)',range:['F']},
{name:'云盘空间',value:'100MB',range:['F']},
{name:'POI图库',value:'10次',range:['F']},
{name:'PDF水印',value:'系统标识',range:['F']},
{name:'图片水印',value:'系统标识',range:['F']},
{name:'VIP模板',value:'no',range:['F']},
{name:'创建行程数量',value:'无限制',range:['E','P']},
{name:'云盘空间',value:'10GB',range:['P']},
{name:'企业共享空间',value:'500GB',range:['E']},
{name:'POI图库',value:'无限制',range:['E','P']},
{name:'PDF水印',value:'可去除',range:['E','P']},
{name:'图片水印',value:'可去除',range:['E','P']},
{name:'VIP模板',value:'yes',range:['E','P']},
{name:'历史版本记录',value:'yes',range:['E','P']},
{name:'POI资料卡',value:'yes',range:['E','P']},
{name:'行程快速构建工具',value:'yes',range:['E','P']},
{name:'地图插件',value:'yes',range:['E','P']},
{name:'自动报价工具',value:'yes',range:['E','P']},
{name:'私有模板管理',value:'yes',range:['E','P']},
{name:'文件找回',value:'yes',range:['E','P']},
{name:'内部共享行程',value:'yes',range:['E']}
]
export const FreeMemberRight = ALL_MEMBER_RIGHTS.filter(x=>x.range.includes('F'))
export const PersonMemberRight = ALL_MEMBER_RIGHTS.filter(x=>x.range.includes('P'))
export const EntMemberRight = ALL_MEMBER_RIGHTS.filter(x=>x.range.includes('E'))
\ No newline at end of file
...@@ -239,6 +239,13 @@ const routes: RouteRecordRaw[] = [ ...@@ -239,6 +239,13 @@ const routes: RouteRecordRaw[] = [
}, },
] ]
}, },
{
path: '/p/show',
component: () => import('@/views/Product/Show.vue'),
meta:{
title:'产品介绍'
}
},
{ {
path: '/:catchAll(.*)*', path: '/:catchAll(.*)*',
component: () => import('@/views/ErrorNotFound.vue'), component: () => import('@/views/ErrorNotFound.vue'),
......
...@@ -17,5 +17,15 @@ class OrderService{ ...@@ -17,5 +17,15 @@ class OrderService{
let msg = {orderid} let msg = {orderid}
return Api.Post("ppt_GetPPTOrderDetails",msg) return Api.Post("ppt_GetPPTOrderDetails",msg)
} }
static async CreateTempOrderPaymentAsync(parameters:any):Promise<HttpResponse>{
let msg = parameters
return Api.Post("ppt_SetPPTTemplateOrder",msg)
}
static async GetOrderPayStatusAsync(no:any):Promise<HttpResponse>{
let msg = {no}
return Api.Post("ppt_order_pay_status",msg)
}
} }
export default OrderService; export default OrderService;
\ No newline at end of file
...@@ -41,7 +41,7 @@ export const useMenuStore = defineStore('menu', { ...@@ -41,7 +41,7 @@ export const useMenuStore = defineStore('menu', {
if (!state.userMenu || state.userMenu.length==0) { if (!state.userMenu || state.userMenu.length==0) {
const userStore= useUserStore() const userStore= useUserStore()
const userInfo = userStore.getUser const userInfo = userStore.getUser
let userPermissions:MenuOwner[] = ['M'] let userPermissions:MenuOwner[] = ['F','*']
if(userInfo.it){ if(userInfo.it){
userPermissions.push('E') userPermissions.push('E')
...@@ -52,6 +52,9 @@ export const useMenuStore = defineStore('menu', { ...@@ -52,6 +52,9 @@ export const useMenuStore = defineStore('menu', {
if(userInfo.iv){ if(userInfo.iv){
userPermissions.push('V') userPermissions.push('V')
} }
if(userInfo.isTemplate){
userPermissions.push('M')
}
const findFreeMenu = menus.filter(x=>userPermissions.includes(x.owner)) const findFreeMenu = menus.filter(x=>userPermissions.includes(x.owner))
if(findFreeMenu){ if(findFreeMenu){
state.userMenu = findFreeMenu.map(x=>x.menu) state.userMenu = findFreeMenu.map(x=>x.menu)
......
...@@ -140,7 +140,7 @@ ...@@ -140,7 +140,7 @@
<template v-if="!userInfo.it"> <template v-if="!userInfo.it">
<div class="row items-center"> <div class="row items-center">
<div class="text-info text-small col">未加入任何企业</div> <div class="text-info text-small col">未加入任何企业</div>
<el-button type="primary" @click="redicetTo('/space/cp')" link icon="officeBuilding">立即创建企业</el-button> <el-button type="primary" @click="()=>orderVisible=true" link icon="officeBuilding">立即创建企业</el-button>
</div> </div>
<el-divider /> <el-divider />
<el-menu mode="vertical"> <el-menu mode="vertical">
...@@ -148,7 +148,7 @@ ...@@ -148,7 +148,7 @@
<el-icon><Plus /></el-icon> <el-icon><Plus /></el-icon>
<span>加入企业</span> <span>加入企业</span>
</el-menu-item> </el-menu-item>
<el-menu-item index="2"> <el-menu-item index="2" v-if="userInfo.it && userInfo.ia">
<el-icon><Setting /></el-icon> <el-icon><Setting /></el-icon>
<span>设置</span> <span>设置</span>
</el-menu-item> </el-menu-item>
...@@ -163,6 +163,7 @@ ...@@ -163,6 +163,7 @@
</div> </div>
</div> </div>
</div> </div>
<OrderReview v-if="orderVisible" :default-type="2" @close="()=>orderVisible=false"></OrderReview>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
...@@ -175,9 +176,11 @@ import { openNewBlank } from "@/utils/common"; ...@@ -175,9 +176,11 @@ import { openNewBlank } from "@/utils/common";
import { useSellTemplateStore } from "@/store"; import { useSellTemplateStore } from "@/store";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { ref } from "vue"; import { ref } from "vue";
import OrderReview from '@/views/components/Order/Review.vue'
const { userInfo } = storeToRefs(useUserStore()); const { userInfo } = storeToRefs(useUserStore());
const sellStore = useSellTemplateStore() const sellStore = useSellTemplateStore()
const orderVisible = ref(false)
const router = useRouter() const router = useRouter()
const isWorkspace = ref(true) const isWorkspace = ref(true)
isWorkspace.value = !router.currentRoute.value.path.includes('/space/cp') isWorkspace.value = !router.currentRoute.value.path.includes('/space/cp')
......
<template>
<div class="product column">
<div class=" bg-info row items-center" style="padding:10px 24px;">
<img src="https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713237911000_1.png"
style="height: 24px" class="cusor-pointer" @click="forwardSpace" />
<div class="col"></div>
<!-- <div class="primary-link-button q-ml-lg cusor-pointer">创建设计</div> -->
<UserCard :size="33"></UserCard>
</div>
<div class="col full-width">
<el-scrollbar class="full-width full-height">
<div class="title text-center">全新Travel Design 一站式协同行程设计平台</div>
<div class="row flex-center">
<div class="item">
<div class="top-box">
<div class="text-weight-bold" style="font-size: 1.25vw">免费版</div>
<div class="tag default">免费试用1个月</div>
<div class="text-weight-bolder text-dark" style="font-size: 2.39583vw;">
<span>¥0</span>
<span class="text-info text-small text-light q-ml-md">/人/年</span>
</div>
<div class="button">注册生效</div>
</div>
<div class="bottom-box">
<div class="content-item" v-for="(x,i) in free" :key="i">
<span>{{ x.name }}</span>
<span v-if="x.value=='no'"><IconClose :size="16" class="text-negative"></IconClose> </span>
<span v-else-if="x.value=='yes'"><IconCheck :size="16" class="text-success" /></span>
<span v-else><span class="text-grey-8" v-if="x.sub">{{ x.sub }}</span>{{ x.value }}</span>
</div>
</div>
</div>
<div class="item dark">
<div class="top-box" style="background: #3556F9;">
<div class="text-weight-bold" style="font-size: 1.25vw">个人专业版</div>
<div class="tag">可季度·半年·1年·2年</div>
<div class="text-weight-bolder" style="font-size: 2.39583vw;">
<span>¥49.9</span>
<span class="text-small text-light q-ml-md">/月起</span>
</div>
<div class="button opcatiy" @click="openOrderView(1)">立即购买</div>
</div>
<div class="bottom-box">
<div class="bottom-box">
<div class="content-item" v-for="(x,i) in person" :key="i">
<span>{{ x.name }}</span>
<span v-if="x.value=='no'"><IconClose :size="16" class="text-negative"></IconClose> </span>
<span v-if="x.value=='yes'"><IconCheck :size="16" class="text-success" /></span>
<span v-else><span class="text-grey-8" v-if="x.sub">{{ x.sub }}</span>{{ x.value }}</span>
</div>
</div>
</div>
</div>
<div class="item dark">
<div class="top-box" style="background: #581BDA;">
<div class="text-weight-bold" style="font-size: 1.25vw">企业/团队专业版</div>
<div class="tag">1年起购</div>
<div class="text-weight-bolder" style="font-size: 2.39583vw;">
<span>¥2999</span>
<span class="text-small text-light q-ml-md">/ 年起</span>
</div>
<div class="button opcatiy" @click="openOrderView(2)">立即购买</div>
</div>
<div class="bottom-box">
<div class="bottom-box">
<div class="content-item" v-for="(x,i) in ent" :key="i">
<span>{{ x.name }}</span>
<span v-if="x.value=='no'"><IconClose :size="16" class="text-negative"></IconClose> </span>
<span v-if="x.value=='yes'"><IconCheck :size="16" class="text-success" /></span>
<span v-else><span class="text-grey-8" v-if="x.sub">{{ x.sub }}</span>{{ x.value }}</span>
</div>
</div>
</div>
</div>
</div>
</el-scrollbar>
</div>
</div>
<OrderReview v-if="orderVisible" :default-type="showType" @close="()=>orderVisible=false"></OrderReview>
</template>
<script lang="ts" setup>
import { EntMemberRight, FreeMemberRight, PersonMemberRight } from '@/configs/customer'
import OrderReview from '@/views/components/Order/Review.vue'
import { ref } from 'vue'
import { useRouter } from 'vue-router'
const free = FreeMemberRight
const person = PersonMemberRight
const ent = EntMemberRight
const showType = ref(1)
const orderVisible = ref(false)
const router = useRouter()
const openOrderView = (t:number)=>{
showType.value=t
orderVisible.value=true
}
const forwardSpace = ()=> router.push('/space')
</script>
<style scoped>
.product {
width: 100vw;
height: 100vh;
background: url('https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713929308000_541.png');
background-size: 100% 100%;
background-repeat: no-repeat;
}
.product .title{
font-weight: 800;
font-size: 2.0833vw;
color: #000000;
margin-top: 5.20833vw;
line-height: 1;
margin-bottom:4.323vw;
}
.product .item{
width: 21.1979vw;
box-shadow: 0px 0px 1.09375vw 0px rgba(140,171,241,0.27);
border-radius: 8px;
margin-right: 3.64583vw;
background: linear-gradient(0deg, #FFFFFF, #F3F7FF);
margin-bottom: 50px;
}
.product .item.dark{
color:#FFF;
background: linear-gradient(0deg, #F8FAFF, #E6EEFF);
box-shadow: 0px 0px 1.09375vw 0px rgba(140,171,241,0.27);
}
.product .item .bottom-box{
padding: 1.71875vw;
/* padding-top: 0; */
}
.product .item .top-box{
background: #FFFFFF;
border-radius: 8px;
padding: 1.71875vw;
box-shadow: 0px 0px 1.09375vw 0px rgba(140,171,241,0.27);
}
.product .item *{
line-height: 1;
}
.product .item:last-child{
margin-right: 0;
}
.product .item .tag{
padding:0 0.78125vw;
height: 1.5625vw;
font-size: 0.7291vw;
line-height: 1.5625vw;
background: #8CABF145;
color:#FFF;
margin-top: 0.7291vw;
margin-bottom: 2.9166vw;
display: inline-block;
border-radius: 0px 8px 8px 8px;
}
.product .item .tag.default{
background: #f6f7f9;
color: #000000;
}
.product .item .button{
height: 2.0833vw;
line-height: 2.0833vw;
background: #f6f7f9;
border-radius: 8px;
border: 1px solid #f6f7f9;
font-weight: 400;
font-size: 0.729166vw;
color: grey;
margin-top: 2.34375vw;
/* margin-bottom: 3.64583vw; */
cursor:not-allowed;
text-align: center;
user-select: none;
}
.product .item .button.opcatiy{
background: rgba(0,0,0,.1);
border: 1px solid rgba(255,255,255,.5);
color:#FFF;
cursor: pointer;
}
.product .item .content-item{
display: flex;
flex-direction: row;
justify-content: space-between;
font-size: 0.7291666vw;
margin-bottom: 1.0vw;
color: #000000;
}
.product .item .content-item:last-child{
margin: 0;
}
</style>
\ No newline at end of file
...@@ -7,9 +7,10 @@ ...@@ -7,9 +7,10 @@
模版管理与设置 模版管理与设置
</div> </div>
<div class="col"></div> <div class="col"></div>
<img src="https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713433759000_282.png" <!-- <img src="https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713433759000_282.png"
style="height: 33px" /> style="height: 33px" />
<div class="primary-link-button q-ml-lg cusor-pointer" @click="addVisible=true">创建设计</div> <div class="primary-link-button q-ml-lg" @click="addVisible=true">创建设计</div> -->
<UserCard :size="33"></UserCard> <UserCard :size="33"></UserCard>
</div> </div>
<div class="col row"> <div class="col row">
......
...@@ -2,14 +2,12 @@ ...@@ -2,14 +2,12 @@
<div class="window-height column"> <div class="window-height column">
<div class="user-center-header row items-center"> <div class="user-center-header row items-center">
<img src="https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713237911000_1.png" <img src="https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713237911000_1.png"
style="height: 24px" /> style="height: 24px" @click="forwardSpace" class="cusor-pointer" />
<div class="q-ml-lg text-weight-bold" style="font-size: 20px"> <div class="q-ml-lg text-weight-bold" style="font-size: 20px">
管理与设置 管理与设置
</div> </div>
<div class="col"></div> <div class="col"></div>
<img src="https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713433759000_282.png"
style="height: 33px" />
<div class="primary-link-button q-ml-lg">创建设计</div>
<UserCard :size="33"></UserCard> <UserCard :size="33"></UserCard>
</div> </div>
<div class="col row"> <div class="col row">
...@@ -42,6 +40,7 @@ const activeIndex = ref(0) ...@@ -42,6 +40,7 @@ const activeIndex = ref(0)
const forwardSpace = () => router.push('/space') const forwardSpace = () => router.push('/space')
watch(() => router.currentRoute.value.path, (toPath) => { watch(() => router.currentRoute.value.path, (toPath) => {
menus.value = useMenu.getUserMenu menus.value = useMenu.getUserMenu
if(!menus.value) return if(!menus.value) return
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment