Commit 0c3ce761 authored by 罗超's avatar 罗超

企業管理

parent 497f352c
{
"name": "pptist",
"version": "0.0.1",
"name": "travel_design",
"version": "2.0.1",
"private": true,
"scripts": {
"serve": "vue-cli-service serve --mode development",
......
......@@ -611,6 +611,14 @@ page {
.full-scroll .el-scrollbar__view{
height: 100% !important;
}
.inline-block{
display: inline-block!important;
}
.ppt-button{
font-size: 14px !important;
font-weight: bold !important;
font-family: 'pingfangr';
}
.primary-link-button{
padding: 0 12px;
height: 32px;
......@@ -627,7 +635,7 @@ page {
-o-border-radius: 8px;
}
.el-button{
font-size: 12px !important;
font-size: 12px;
}
.pointer{
cursor: pointer;
......@@ -635,7 +643,9 @@ page {
.wrap{
white-space: wrap;
}
.md-menu .el-menu-item{
.md-menu .el-menu-item,
.md-menu .el-sub-menu .el-menu-item,
.md-menu .el-sub-menu__title{
height: 40px;
margin-bottom: 5px;
line-height: 40px;
......@@ -645,13 +655,17 @@ page {
-ms-border-radius: 8px;
-o-border-radius: 8px;
}
.md-menu .el-menu-item.is-active{
.md-menu .el-menu-item.is-active,
.md-menu .el-sub-menu .el-menu-item.is-active,
.md-menu .el-sub-menu__title.is-active{
color: #000;
font-weight: bold;
background-color: #f1f2f4 !important;
border-color: #f1f2f4 !important;
}
.md-menu .el-menu-item:hover{
.md-menu .el-menu-item:hover,
.md-menu .el-sub-menu .el-menu-item:hover,
.md-menu .el-sub-menu__title:hover{
background-color: #f1f2f4 !important;
border-color: #f1f2f4 !important;
}
......
......@@ -13,9 +13,9 @@ export interface MemberRights{
}
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 ENT_USER_THEME:CustomerTheme = {name:'EN',bg:'linear-gradient(270deg, #DD9B38 0%, #E6B351 100%);',color:'#252860', desc:'会员版·企业'}
export const TME_USER_THEME:CustomerTheme = {name:'TME',bg:'linear-gradient(270deg, #DD9B38 0%, #E6B351 100%);',color:'#252860', desc:'会员版·模版'}
export const VIP_USER_THEME:CustomerTheme = {name:'EN',bg:'linear-gradient(270deg, #4165E2 0%, #5276F5 100%)',color:'#dd9b38', desc:'会员版·个人'}
export const ENT_USER_THEME:CustomerTheme = {name:'VIP',bg:'linear-gradient(270deg, #DD9B38 0%, #E6B351 100%)',color:'#252860', desc:'会员版·组织/企业'}
export const TME_USER_THEME:CustomerTheme = {name:'TME',bg:'linear-gradient(270deg, #DD9B38 0%, #E6B351 100%)',color:'#252860', desc:'会员版·模版'}
export const CustomerThemeConfig:CustomerTheme[] = [FREE_USER_THEME,VIP_USER_THEME,ENT_USER_THEME,TME_USER_THEME]
......
......@@ -135,7 +135,12 @@ import {
Protect,
Help,
World,
PageTemplate
PageTemplate,
ShareOne,
Peoples,
Dashboard,
Tag,
SettingOne
} from '@icon-park/vue-next'
export interface Icons {
......@@ -275,7 +280,12 @@ export const icons: Icons = {
IconProtect: Protect,
IconHelp:Help,
IconWorld:World,
IconPageTemplate:PageTemplate
IconPageTemplate:PageTemplate,
IconShareOne:ShareOne,
IconPeoples:Peoples,
IconDashBoard:Dashboard,
IconTag:Tag,
IconSettingOne:SettingOne
}
export default {
......
......@@ -165,6 +165,43 @@ const routes: RouteRecordRaw[] = [
title:'行程生成预览'
}
},
{
path: '/a',
component: () => import('@/views/TeamCenter/Layout.vue'),
meta:{
title:'团队/企业管理与设置中心'
},
children:[
{
path: '/a',
component: () => import('@/views/TeamCenter/Index.vue'),
meta:{
title:'团队/企业管理与设置中心'
}
},
{
path: '/a/u',
component: () => import('@/views/TeamCenter/Member.vue'),
meta:{
title:'成员管理'
}
},
{
path: '/a/order',
component: () => import('@/views/TeamCenter/Order.vue'),
meta:{
title:'我的订单/发票'
}
},
{
path: '/a/order/:id',
component: () => import('@/views/TeamCenter/OrderDetail.vue'),
meta:{
title:'订单详情'
}
},
]
},
{
path: '/u',
component: () => import('@/views/UserCenter/Layout.vue'),
......
......@@ -17,5 +17,9 @@ class OrgService{
let msg = {RB_Group_id: "0", RB_Branch_id: "-1", departmentId: "0", IsLeave: "0"}
return Api.Post("app_get_employeeInfo_v2",msg)
}
static async GetMembersAsync(params:any):Promise<HttpResponse>{
return Api.Post("travel_manager_members",params)
}
}
export default OrgService;
\ No newline at end of file
......@@ -9,52 +9,61 @@ export interface Menu{
}
export type MenuOwner = '*'|'F'|'V'|'A'|'E'|'M'
export interface MenuState {
// freeUser: Menu[],
// vipUser: Menu[],
// enterpriseUser: Menu[],
// enterpriseAdmin: Menu[]
userMenu:Menu[]
currentMenu: Menu|null
}
const menus:{menu:Menu,owner:MenuOwner}[] = [
{menu:{name:'账号一览',icon:'IconEarth',url:'/u'},owner:'*'},
{menu:{name:'订单/发票',icon:'IconCurrency',url:'/u/order'},owner:'*'},
{menu:{name:'账户设置',icon:'IconProtect',url:'/u/setting'},owner:'*'},
{menu:{name:'账号一览',icon:'IconEarth',url:'/u'},owner:'F'},
{menu:{name:'订单/发票',icon:'IconCurrency',url:'/u/order'},owner:'F'},
{menu:{name:'账户设置',icon:'IconProtect',url:'/u/setting'},owner:'F'},
{menu:{name:'字体',icon:'IconAddText',url:'/m'},owner:'M'},
{menu:{name:'国家',icon:'IconWorld',url:'/m/nation'},owner:'M'},
{menu:{name:'颜色',icon:'IconPlatte',url:'/m/colour'},owner:'M'},
{menu:{name:'模版管理',icon:'IconPageTemplate',url:'/m/TemplateManagement'},owner:'M'},
{menu:{name:'账号一览',icon:'IconEarth',url:'/a'},owner:'A'},
{menu:{name:'成员管理',icon:'IconPeoples',url:'/a/u'},owner:'A'},
{menu:{name:'数据统计',icon:'IconDashBoard',url:'/a/d'},owner:'A'},
{menu:{name:'水印设置',icon:'IconTag',url:'/a/w'},owner:'A'},
{menu:{name:'订单/发票',icon:'IconCurrency',url:'/a/order'},owner:'A'},
{
menu:{
name:'更多设置 ',
icon:'IconSettingOne',
url:'',
children:[
{name:'基本信息',icon:'',url:'/a/info'},
{name:'解散团队或企业',icon:'',url:'/a/close'}
]
},
owner:'A'
},
]
export const useMenuStore = defineStore('menu', {
state: (): MenuState => ({
// freeUser:[],
// vipUser:[],
// enterpriseAdmin:[],
// enterpriseUser:[],
userMenu:[],
currentMenu:null
}),
getters:{
getUserMenu:(state)=>{
if (!state.userMenu || state.userMenu.length==0) {
const userStore= useUserStore()
const userInfo = userStore.getUser
if (!state.userMenu || state.userMenu.length==0) {
let userPermissions:MenuOwner[] = ['F','*']
if(userInfo.it){
userPermissions.push('E')
}
if(userInfo.ia){
userPermissions.push('A')
}
if(userInfo.iv){
userPermissions.push('V')
}
if(userInfo.isTemplate){
userPermissions.push('M')
}
// if(userInfo.it){
// userPermissions.push('E')
// }
// if(userInfo.ia){
// userPermissions.push('A')
// }
// if(userInfo.iv){
// userPermissions.push('V')
// }
// if(userInfo.isTemplate){
// userPermissions.push('M')
// }
const findFreeMenu = menus.filter(x=>userPermissions.includes(x.owner))
if(findFreeMenu){
state.userMenu = findFreeMenu.map(x=>x.menu)
......@@ -64,8 +73,6 @@ export const useMenuStore = defineStore('menu', {
},
getTemplateMenu:(state)=>{
if (!state.userMenu || state.userMenu.length==0) {
const userStore= useUserStore()
const userInfo = userStore.getUser
let userPermissions:MenuOwner[] = ['M']
const findFreeMenu = menus.filter(x=>userPermissions.includes(x.owner))
......@@ -75,6 +82,15 @@ export const useMenuStore = defineStore('menu', {
}
return state.userMenu
},
getTeamMenu:(state)=>{
const userStore= useUserStore()
const userInfo = userStore.getUser
if(userInfo.it && userInfo.ia){
const finds = menus.filter(x=>x.owner=='A')
return finds.map(x=>x.menu)
}
return new Array<Menu>()
}
},
// actions:{
// setUserMenu()
......
......@@ -154,7 +154,7 @@
<el-icon><Plus /></el-icon>
<span>加入企业</span>
</el-menu-item>
<el-menu-item index="2" class="rounded" v-if="userInfo.it && userInfo.ia">
<el-menu-item index="2" class="rounded" v-if="userInfo.it && userInfo.ia" @click="redicetTo('/a')">
<el-icon><Setting /></el-icon>
<span>管理团队/企业</span>
</el-menu-item>
......@@ -162,6 +162,10 @@
<IconLogout size="18" style="margin-right: 8px" />
<span>退出团队/企业</span>
</el-menu-item>
<el-menu-item index="4" class="rounded" v-if="userInfo.it && userInfo.ia">
<IconShareOne size="18" style="margin-right: 8px" />
<span>邀请成员</span>
</el-menu-item>
</el-menu>
</div>
</el-popover>
......
......@@ -322,7 +322,7 @@ checkPositionHandler(props.position)
getDocumentData()
</script>
<style lang="scss">
.el-table .el-table__cell{
.sample-table .el-table .el-table__cell{
padding: 0;
}
.sample-table{
......
......@@ -690,7 +690,7 @@ import { useRouter } from 'vue-router';
setCurrentRow()
</script>
<style lang="scss">
.el-table .el-table__cell{
.sample-table .el-table .el-table__cell{
padding: 0;
}
.journeyAds-Input {
......
<template>
<div class="user-header rounded row items-center" :style="{ background: userTheme?.bg }">
<el-avatar :size="64" :src="userInfo.logo" shape="square"></el-avatar>
<div class="q-ml-lg text-white col">
<div class="" style="font-size: 20px;">{{ userInfo.company }}</div>
<div class="q-mt-sm" style="color: rgba(255,255,255,.5);">组织ID:{{ userInfo.cardno??'8023009875069650985' }}</div>
</div>
<div class="text-white">{{ userTheme?.desc }}</div>
<div :style="{'background':vipTheme.color}" v-if="userTheme?.name=='FREE'" class="text-white pingfangr q-ml-lg rounded cusor-pointer q-py-md q-px-lg no-select">升级为VIP</div>
<!-- <div :style="{'background':vipTheme.color}" v-if="1==2" class="text-white pingfangr q-ml-lg rounded cusor-pointer q-py-md q-px-lg no-select">续费VIP</div> -->
<div :style="{'background':enTheme.color}" v-if="userTheme?.name=='FREE'" class="text-white pingfangr q-ml-lg rounded cusor-pointer q-py-md q-px-lg no-select">升级为企业</div>
</div>
<div class="q-mt-xl">
<div class="user-label text-grey-8">我的权益</div>
<div class="row">
<el-card class="user-card q-mr-lg" shadow="never">
<div class="row items-center">
<div class="col">
<span class="title">行程设计</span>
<div class="text-small text-info q-mt-sm">会员可以无限制创建行程</div>
</div>
<el-button type="info" class="normal">开通会员</el-button>
</div>
<div style="font-size: 14px;" class="row items-center q-mt-lg">
<span class="text-grey-8">当前已创建:</span>
<span class="text-dark q-ml-md cursor-pointer">1个行程</span>
<IconRight :size="20"></IconRight>
<div class="col"></div>
<span class="text-grey-8">还可创建:</span>
<span class="text-dark q-ml-md">0个行程</span>
</div>
</el-card>
<el-card class="user-card" shadow="never">
<div class="row items-center">
<div class="col">
<span class="title">授权模板</span>
<div class="text-small text-info q-mt-sm">会员可以使用平台全部预设模板</div>
</div>
<!-- <el-button type="info" class="normal">开通会员</el-button> -->
</div>
<div style="font-size: 14px;" class="row items-center q-mt-lg">
<span class="text-grey-8">当前模板可用范围:</span>
<span class="text-dark q-ml-md cursor-pointer">免费模板</span>
</div>
</el-card>
</div>
</div>
<div class="q-mt-xl">
<div class="user-label text-grey-8">更多权益</div>
<div class="row">
<el-card class="user-card" shadow="never">
<div class="row items-center">
<div class="col">
<span class="title">存储空间</span>
<div class="text-small text-info q-mt-sm">会员可以使用平台全部预设模板</div>
</div>
<el-button type="info" class="normal">会员尊享10G空间</el-button>
</div>
<div style="font-size: 14px;" class="q-mt-xl">
<el-progress :percentage="50" />
</div>
</el-card>
<el-card class="user-card q-mx-lg" shadow="never">
<div class="row items-center">
<div class="col">
<span class="title">旅行资料库</span>
<div class="text-small text-info q-mt-sm">会员可以使用平台全部旅行资料库</div>
</div>
</div>
<div style="font-size: 14px;" class="q-mt-xl">
<div style="font-size: 14px;" class="row items-center q-mt-lg">
<span class="text-grey-8">当前资料库数据:</span>
<span class="text-dark q-ml-md cursor-pointer">10W+</span>
</div>
</div>
</el-card>
<el-card class="user-card col column flex-center cursor-pointer" shadow="never">
<div class="row items-center flex-center">
<div class="text-info" style="font-size: 13px;">查看更多会员特权 </div>
<IconRight :size="16" class="q-ml-md"></IconRight>
</div>
</el-card>
</div>
</div>
<div class="q-mt-xl">
<div class="user-label text-weight-bold" style="font-size: 16px;">快速管理</div>
<div class="q-mt-lg row">
<el-card class="enter-card col" shadow="never">
<div class="title">快速开票</div>
<div class="text-small q-mt-md q-mb-lg text-grey-8">开票入口及开票进度查询</div>
</el-card>
<el-card class="enter-card col q-mx-lg" shadow="never">
<div class="title">团队共享协作</div>
<div class="text-small q-mt-md q-mb-lg text-grey-8">与团队共享内容,文件规范存放,多人协同编辑</div>
</el-card>
<el-card class="enter-card col q-mx-lg" shadow="never">
<div class="title">团队成员管理</div>
<div class="text-small q-mt-md q-mb-lg text-grey-8">邀请团队成员,团队私有模板管理</div>
</el-card>
<el-card class="enter-card col q-mr-lg" shadow="never">
<div class="title">常见问题</div>
<div class="text-small q-mt-md q-mb-lg text-grey-8">帮助中心:查看常见问题及使用指南</div>
</el-card>
</div>
</div>
</template>
<script lang="ts" setup>
import { ENT_USER_THEME, VIP_USER_THEME } from "@/configs/customer";
import { useUserStore } from "@/store";
import { storeToRefs } from "pinia";
import { ref } from "vue";
const useUser = useUserStore()
const { userInfo } = storeToRefs(useUser)
const userTheme = useUser.getUserTheme
console.log(userTheme)
const vipTheme = VIP_USER_THEME
const enTheme = ENT_USER_THEME
</script>
<style scoped>
.user-header {
padding: 16px 24px;
position: relative;
font-size: 14px;
color:#FFF;
z-index: 1;
width:100%;
overflow: hidden;
}
.user-header::after {
position: absolute;
top: 0;
right: -48px;
bottom: -12px;
z-index: -1;
width: 100%;
background: url('https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713496804000_500.png') no-repeat right center / contain;
content: "";
transform: scale(2);
transform-origin: right center;
}
.user-label{
font-size: 12px;
margin-bottom: 8px;
}
.user-card {
width: 33%;
min-height: 112px;
}
.user-card .title,
.enter-card .title{
font-size: 15px;
font-weight: bold;
color: #000;
}
</style>
\ No newline at end of file
<template>
<div class="window-height column">
<div class="user-center-header row items-center">
<img src="https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1713237911000_1.png"
style="height: 24px" @click="forwardSpace" class="cusor-pointer" />
<div class="q-ml-lg text-weight-bold" style="font-size: 20px">
团队/企业管理
</div>
<div class="col"></div>
<UserCard :size="33"></UserCard>
</div>
<div class="col row">
<div class="user-center-menu column ">
<el-menu :default-active="activeIndex" class="no-border md-menu col" router>
<template v-for="(x,i) in menus" :key="i">
<el-sub-menu :index="i" v-if="x.children && x.children.length>0">
<template #title>
<component :is="x.icon" style="font-size: 20px;"></component>
<span class="q-ml-lg">{{ x.name }}</span>
</template>
<el-menu-item v-for="(sub,y) in x.children" :key="y" :index="`${i}_y`" :route="sub.url">{{ sub.name }}</el-menu-item>
</el-sub-menu>
<el-menu-item :index="i" :route="x.url" v-else>
<component :is="x.icon" style="font-size: 20px;"></component>
<span class="q-ml-lg">{{ x.name }}</span>
</el-menu-item>
</template>
</el-menu>
<el-button class="full-width pingfangr text-weight-bolder" @click="forwardSpace" style="font-size: 14px !important;" icon="arrow-left">返回工作台</el-button>
</div>
<el-scrollbar class="col full-height user-center-body full-scroll" wrap-style="overflow-x:unset;" view-style="padding-bottom:30px;">
<router-view />
</el-scrollbar>
</div>
</div>
</template>
<script lang="ts" setup>
import UserCard from "@/components/User/UserCard.vue";
import { useMenuStore } from "@/store";
import { ref, watch } from "vue";
import { useRouter } from "vue-router";
const router = useRouter()
const useMenu = useMenuStore();
const menus = ref(useMenu.getTeamMenu);
const activeIndex = ref(0)
const forwardSpace = () => router.push('/space')
if(menus.value.length==0){
router.push({
path:'/notfound'
})
}
watch(() => router.currentRoute.value.path, (toPath) => {
menus.value = useMenu.getTeamMenu
if(!menus.value) return
activeIndex.value = menus.value.findIndex(x=>x.url==router.currentRoute.value.path)
},{immediate: true,deep: true})
</script>
<style scoped>
.user-center-header {
padding: 0 40px 0 28px;
border-bottom: 1px solid #efefef;
height: 56px;
color: #000;
}
.user-center-menu {
width: 232px;
padding: 20px 0 20px 16px;
}
.user-center-body {
padding: 20px 40px 0px 40px;
}
</style>
<template>
<div class="full-height full-width column">
<div class="row items-center">
<div class="text-dark text-weight-bolder col">成员管理</div>
<el-button class="ppt-button" type="primary">邀请成员</el-button>
</div>
<div class="q-mt-lg row flex-between">
<el-select v-model="parameters.t" placeholder="用户角色" style="width:150px" size="default" @change="changeSearch">
<el-option :label="x.name" :value="x.id" v-for="x in userGroup" :key="x.id" />
</el-select>
<el-input v-model="parameters.k" placeholder="请输入用户名称/账号" @change="changeSearch" size="default" style="width:200px">
<template #suffix>
<IconSearch class="cusor-pointer"></IconSearch>
</template>
</el-input>
</div>
<div class="col q-mt-md">
<el-table class="dark-table" v-load-more="tableScrollHandler" :data="data" style="width: 100%" height="100%" v-loading="loading">
<el-table-column width="248">
<template #header>
<span style="padding-left: 42px;">企业成员 ({{ currentMember }}/{{ 500 }})</span>
</template>
<template #default="scope">
<div class="row items-center">
<el-avatar shape="square" :src="scope.row.photo.includes('http://')||scope.row.photo.includes('https://')?scope.row.photo:USER_DEFAULT_HEADER" :size="32"></el-avatar>
<span class="q-ml-md">
{{ scope.row.name }}
</span>
</div>
</template>
</el-table-column>
<el-table-column prop="account" label="账号" width="200" />
<el-table-column prop="mail" label="邮箱" />
<el-table-column prop="mobile" label="手机号" />
<el-table-column prop="" label="系统角色" width="180">
<template #default="scope">
<span v-if="scope.row.ic">超级管理员</span>
<el-popover :width="150" trigger="click" v-else>
<template #reference>
<div class="inline-block">
<div class="row items-center no-select cusor-pointer">
<span v-if="scope.row.isa">管理员</span>
<span v-else>成员</span>
<IconDown size="18" style="margin-left: 5px;"></IconDown>
</div>
</div>
</template>
<el-menu mode="vertical" class="no-border md-menu">
<el-menu-item index="1">设为管理员</el-menu-item>
<el-menu-item index="2">设为成员</el-menu-item>
</el-menu>
</el-popover>
</template>
</el-table-column>
<el-table-column prop="" label="操作" width="150">
<template #default="scope">
<el-button v-if="scope.row.ic" link type="primary" class="ppt-button">转让</el-button>
<el-button v-else link type="primary" class="ppt-button">移除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script lang="ts" setup>
import { ApiResult } from "@/configs/axios";
import { USER_DEFAULT_HEADER } from "@/configs/customer";
import OrgService from "@/services/OrgService";
import { ref } from "vue";
const userGroup = ref<{id:number,name:string}[]>([
{id:0,name:'全部角色'},
{id:1,name:'管理员'},
{id:2,name:'成员'},
])
const data = ref<any[]>([])
const loading = ref(false)
const pageCount = ref(0)
const currentMember= ref(0)
const parameters = ref<any>({
t:0,
k:'',
pageIndex:1,
pageSize:20
})
const getMembers = async ()=>{
if(loading.value) return
loading.value=true
//data.value = []
//currentMember.value = 0,
//pageCount.value = 0
const response = await OrgService.GetMembersAsync(parameters.value)
if(response.data.resultCode == ApiResult.SUCCESS && response.data.data.pageData){
data.value = data.value.concat(response.data.data.pageData)
currentMember.value = response.data.data.count
pageCount.value = response.data.data.pageCount
}
loading.value=false
}
const changeSearch = ()=>{
data.value = []
currentMember.value = 0
pageCount.value = 0
parameters.value.pageIndex=1
getMembers()
}
const tableScrollHandler = ()=>{
if(pageCount.value>parameters.value.pageIndex){
parameters.value.pageIndex++
getMembers()
}
}
getMembers()
</script>
<style>
.dark-table{
font-size: 14px;
color:#000;
}
.el-table.dark-table th.el-table__cell{
background: #f1f2f4;
border-color: #e8eaec;
color:#000;
}
</style>
\ No newline at end of file
<template>
<div class="">
<el-tabs v-model="activeName" @tab-click="tabsHandlerClick" class="no-border dark sticky-header">
<el-tab-pane label="全部订单" name="all"></el-tab-pane>
<el-tab-pane label="待支付" name="pay"></el-tab-pane>
<el-tab-pane label="已完成" name="finish"></el-tab-pane>
<el-tab-pane label="待开票" name="invoice"></el-tab-pane>
<el-tab-pane label="历史发票" name="invoiceHistory"></el-tab-pane>
<div class="order-bar rounded row">
<div class="item" style="width: 280px !important; min-width: 280px; text-align: left;">商品信息</div>
<div class="item col">时长</div>
<div class="item col" >单价</div>
<div class="item col">数量</div>
<div class="item none-width">
<div style="background-color: rgba(0,0,0,.08);width:1px">&nbsp;</div>
</div>
<div class="item col">实付款</div>
<div class="item col">订单状态</div>
<div class="item">操作</div>
</div>
</el-tabs>
<template v-if="orders && orders.length>0 && !loading">
<div class="order-body q-mt-lg" v-for="x in orders" :key="x.orderid">
<div class="order-item rounded">
<div class="title">
<span>{{ x.create }}</span>
<span class="q-ml-md">{{ x.ordernum }}</span>
</div>
<div class="bg-white rounded row items-center">
<div class="item row items-center" style="width: 280px !important; min-width: 280px; text-align: left;padding:24px;">
<img :src="x.cover" style="width:72px;" class="rounded" >
<div class="q-ml-lg">{{ x.pricetypename }}_{{ x.vipname }}</div>
</div>
<div class="item col">{{ x.productname }}</div>
<div class="item col">¥{{ x.price.toFixed(2) }}</div>
<div class="item col">{{ x.use }}席位</div>
<div class="item none-width">
<div style="background-color: rgba(0,0,0,.08);width:1px;height:72px;">&nbsp;</div>
</div>
<div class="item col">
<div class="text-weight-bold q-mb-sm" style="font-size: 16px">¥{{ x.price.toFixed(2) }}</div>
<!-- <div class="row items-center flex-end">
<span class="text-grey-8 q-mr-md">已优惠 ¥10.00</span>
<IconHelp :size="16" class="cursor-pointer"></IconHelp>
</div> -->
</div>
<div class="item col">
<div class="q-mb-sm" :class="{'text-waring':x.status==1,'text-grey-8':x.status==3}">{{ x.statusname }}</div>
<el-button link @click="forwardOrderDetail(x.orderid)">订单详情</el-button>
</div>
<div class="item column">
<el-button type="primary" v-if="x.status==2">发票</el-button>
<br />
<el-button type="default" v-if="x.status==2">售后</el-button>
<el-button type="warning" v-if="x.status==1">支付</el-button>
<br />
<el-button type="default" v-if="x.status==1">取消</el-button>
</div>
</div>
</div>
</div>
</template>
<div v-if="loading" style="height: 200px;margin-top: 100px;" v-loading="loading"></div>
<div v-if="(!orders || orders.length==0) && !loading">
<el-empty class="q-ma-xl" description="暂无数据" />
</div>
</div>
</template>
<script lang="ts" setup>
import { ApiResult } from "@/configs/axios";
import OrderService from "@/services/OrderService";
import { ref } from "vue";
import { useRouter } from "vue-router";
const activeName = ref<string>('all')
const parameters = ref({
pageIndex:1,
pageSize:15,
starttime:'',
endtime:'',
orderstatus:0
})
const orders = ref<any[]>()
const count = ref(0)
const loading = ref(false)
const router = useRouter()
const tabsHandlerClick = (e:any)=>{
console.log(e)
}
const getOrders = async ()=>{
if(loading.value)return
loading.value=true
const response = await OrderService.GetOrders(parameters.value)
if(response.data.resultCode == ApiResult.SUCCESS){
orders.value = response.data.data.pageData
count.value = response.data.data.pageCount
}
loading.value=false
}
const forwardOrderDetail = (id:string)=>{
router.push('/u/order/'+encodeURIComponent(id))
}
getOrders()
</script>
<style scoped>
.sticky-header{
position: sticky;
top: 0;
left: 0;
background: #FFF;
}
.order-bar{
background: #f6f7f9 !important;
}
.order-bar .item,
.order-body .order-item .item{
padding: 0 24px;
height: 42px;
line-height: 42px;
font-size: 14px;
color:gray;
text-align: right;
min-width: 108px;
}
.order-bar .item.none-width,
.order-body .order-item .item.none-width{
min-width: unset;
}
.order-body{
}
.order-body .order-item{
background: #f6f7f9;
border:1px solid rgba(0,0,0,.08);
font-size: 14px;
}
.order-body .order-item .title{
padding: 0 24px;
height: 45px;
line-height: 45px;
color:grey;
white-space: nowrap;
overflow: hidden;
}
.order-body .order-item .item{
height: auto;
line-height: 1;
color: #000;
white-space: nowrap;
overflow: hidden;
}
</style>
\ No newline at end of file
<template>
<div class="row items-center">
<IconLeft :size="18" class="q-mr-md cursor-pointer" @click="forwardOrder"></IconLeft>
<div class="text-weight-bold cursor-pointer" @click="forwardOrder">订单/发票</div>
</div>
<template v-if="order && !loading">
<div class="q-mt-xl q-pa-xl rounded bg-info">
<el-steps style="max-width: 100%;margin: 0 auto;" :active="3" align-center>
<el-step title="选择商品" description="" />
<el-step title="确认下单" description="" />
<el-step title="支付" description="" />
<el-step title="交易完成" description="" />
</el-steps>
<div class="q-mt-xl text-center text-weight-bold" style="font-size: 18px;">订单状态:待支付</div>
<div class="q-mt-md row items-center flex-center" style="font-size: 13px;">
<span>请在 </span>
<el-countdown title="" format="DD [天] HH:mm:ss" :value="countValue" value-style="font-size:13px;color:#f89c53;"
class="q-mx-md inline" />
<span> 内完成转账,超时订单自动取消</span>
</div>
<div class="row items-center flex-center q-mt-xl">
<el-button size="large">取消订单</el-button>
<el-button type="primary" size="large">去支付</el-button>
</div>
</div>
<div class="order-bar rounded row q-mt-xl">
<div class="item" style="width: 280px !important; min-width: 280px; text-align: left;">商品信息</div>
<div class="item col">时长</div>
<div class="item col">单价</div>
<div class="item col">数量</div>
<div class="item none-width">
<div style="background-color: rgba(0,0,0,.08);width:1px">&nbsp;</div>
</div>
<div class="item col">小计</div>
</div>
<div class="order-body q-mt-lg">
<div class="order-item rounded">
<div class="title">
<span>{{ order.create }}</span>
<span class="q-ml-md">{{ order.ordernum }}</span>
</div>
<div class="bg-white rounded row items-center">
<div class="item row items-center"
style="width: 280px !important; min-width: 280px; text-align: left;padding:24px;">
<img :src="order.cover" style="width:72px;" class="rounded">
<div class="q-ml-lg">{{ order.pricetypename }}_{{ order.vipname }}</div>
</div>
<div class="item col">{{ order.productname }}</div>
<div class="item col">¥{{ order.price.toFixed(2) }}</div>
<div class="item col">{{ order.use }}席位</div>
<div class="item none-width">
<div style="background-color: rgba(0,0,0,.08);width:1px;height:72px;">&nbsp;</div>
</div>
<div class="item col">
<div class="text-weight-bold q-mb-sm" style="font-size: 16px">¥{{ order.price.toFixed(2) }}</div>
</div>
</div>
</div>
</div>
<div class="q-mt-lg text-right">
<span style="font-size: 14px;">订单总金额:¥</span>
<span style="font-size: 18px" class="text-weight-bold text-dark">{{ order.price.toFixed(2) }}</span>
</div>
<div class="q-mt-lg text-right" v-if="order.status==2">
<span style="font-size: 14px;">实付总金额:¥</span>
<span style="font-size: 18px" class="text-weight-bold text-dark text-negative">{{ order.price.toFixed(2) }}</span>
</div>
</template>
<div v-if="loading" style="height: 200px;margin-top: 100px;" v-loading="loading"></div>
<div v-if="!order && !loading">
<el-empty class="q-ma-xl" description="暂无数据" />
</div>
</template>
<script lang="ts" setup>
import { ApiResult } from "@/configs/axios"
import OrderService from "@/services/OrderService"
import { ref } from "vue"
import { useRouter } from "vue-router"
const order = ref<any>()
const loading = ref(false)
const router = useRouter()
const countValue = ref(Date.now() + 1000 * 60 * 60 * 7)
const forwardOrder = (id: string) => {
router.push('/u/order')
}
const getOrder = async () => {
const orderid = router.currentRoute.value.params.id?.toString()
if (!orderid) return
loading.value = true
const response = await OrderService.GetOrder(orderid)
if (response.data.resultCode == ApiResult.SUCCESS) {
order.value = response.data.data
countValue.value = new Date(order.value.create.replaceAll('-','/')).getTime() + 1000 * 60 * 60 * 720
}
loading.value = false
}
getOrder()
</script>
<style scoped>
.order-bar {
background: #f6f7f9 !important;
}
.order-bar .item,
.order-body .order-item .item {
padding: 0 24px;
height: 42px;
line-height: 42px;
font-size: 14px;
color: gray;
text-align: right;
min-width: 108px;
}
.order-bar .item.none-width,
.order-body .order-item .item.none-width {
min-width: unset;
}
.order-body {}
.order-body .order-item {
background: #f6f7f9;
border: 1px solid rgba(0, 0, 0, .08);
font-size: 14px;
}
.order-body .order-item .title {
padding: 0 24px;
height: 45px;
line-height: 45px;
color: grey;
white-space: nowrap;
overflow: hidden;
}
.order-body .order-item .item {
height: auto;
line-height: 1;
color: #000;
white-space: nowrap;
overflow: hidden;
}
</style>
\ No newline at end of file
......@@ -39,7 +39,7 @@ module.exports = {
],
},
pwa: {
name: 'PPTist',
name: 'Travel Design',
themeColor: '#564bec', //#d14424
iconPaths: {
faviconSVG: null,
......
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