Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
pptist
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
viitto
pptist
Commits
fbc04905
Commit
fbc04905
authored
May 17, 2024
by
罗超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完善部分功能
parent
2876044f
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
306 additions
and
58 deletions
+306
-58
common.css
src/assets/styles/common.css
+8
-3
UserCard.vue
src/components/User/UserCard.vue
+63
-31
index.vue
src/components/footer/index.vue
+1
-1
customer.ts
src/configs/customer.ts
+3
-3
OrgService.ts
src/services/OrgService.ts
+5
-0
UserService.ts
src/services/UserService.ts
+4
-0
menu.ts
src/store/menu.ts
+4
-2
user.ts
src/store/user.ts
+1
-0
Login.vue
src/views/Auth/Login.vue
+6
-1
Index.vue
src/views/Index.vue
+11
-5
Index.vue
src/views/Market/Index.vue
+3
-2
Dissolution.vue
src/views/TeamCenter/Dissolution.vue
+76
-2
Index.vue
src/views/TeamCenter/Index.vue
+0
-1
Layout.vue
src/views/TeamCenter/Layout.vue
+14
-4
Review.vue
src/views/components/Order/Review.vue
+10
-2
ExitTenant.vue
src/views/components/Team/ExitTenant.vue
+1
-1
FindTeam.vue
src/views/components/Team/FindTeam.vue
+96
-0
No files found.
src/assets/styles/common.css
View file @
fbc04905
...
@@ -418,7 +418,7 @@ page {
...
@@ -418,7 +418,7 @@ page {
background-color
:
#0b40fe
!important
;
background-color
:
#0b40fe
!important
;
}
}
.text-grey-8
{
.text-grey-8
{
color
:
grey
;
color
:
grey
!important
;
}
}
.no-select
{
.no-select
{
user-select
:
none
!important
;
user-select
:
none
!important
;
...
@@ -533,7 +533,7 @@ page {
...
@@ -533,7 +533,7 @@ page {
line-height
:
0
;
line-height
:
0
;
}
}
.text-weight-bold
{
.text-weight-bold
{
font-weight
:
bold
;
font-weight
:
bold
!important
;
}
}
.text-weight-bolder
{
.text-weight-bolder
{
font-weight
:
bolder
!important
;
font-weight
:
bolder
!important
;
...
@@ -754,7 +754,7 @@ page {
...
@@ -754,7 +754,7 @@ page {
-o-border-radius
:
8px
!important
;
-o-border-radius
:
8px
!important
;
}
}
.el-button--info
{
.el-button--info
{
color
:
#
000
!important
;
color
:
#
333
!important
;
background-color
:
#e8eaec
!important
;
background-color
:
#e8eaec
!important
;
border-color
:
#e8eaec
!important
;
border-color
:
#e8eaec
!important
;
}
}
...
@@ -763,6 +763,11 @@ page {
...
@@ -763,6 +763,11 @@ page {
background-color
:
#d9dcdf
!important
;
background-color
:
#d9dcdf
!important
;
border-color
:
#d9dcdf
!important
;
border-color
:
#d9dcdf
!important
;
}
}
.el-button--info.is-disabled
,
.el-button--info.is-disabled
:hover
{
color
:
grey
!important
;
}
.no-border
.el-tabs__nav-wrap
::after
{
.no-border
.el-tabs__nav-wrap
::after
{
display
:
none
!important
;
display
:
none
!important
;
}
}
...
...
src/components/User/UserCard.vue
View file @
fbc04905
...
@@ -13,39 +13,33 @@
...
@@ -13,39 +13,33 @@
></el-avatar>
></el-avatar>
<template
#
dropdown
>
<template
#
dropdown
>
<div
class=
"MarketfigurePopover shrink"
>
<div
class=
"MarketfigurePopover shrink"
>
<div
class=
"row"
>
<div
class=
"row items-center"
>
<!--
<div
class=
"MarketfigureMin pointer shrink"
>
<img
class=
"reactive"
src=
"../../assets/img/figure.png"
/>
</div>
-->
<el-avatar
<el-avatar
:size=
"4
0
"
:size=
"4
4
"
shape=
"square"
shape=
"square"
:src=
"userInfo.photo"
:src=
"userInfo.photo"
style=
"background-color: #e6ddf5; color: #7b35ef"
style=
"background-color: #e6ddf5; color: #7b35ef"
class=
"q-mr-lg cusor-pointer shrink"
class=
"q-mr-lg cusor-pointer shrink"
></el-avatar>
></el-avatar>
<div>
<div>
<div
class=
"row items-center MarketfigureName"
>
<div
class=
"row items-center"
>
<span>
{{
userInfo
.
nickname
}}
</span>
<span
class=
"text-weight-bolder"
style=
"font-size: 18px;"
>
{{
userInfo
.
nickname
}}
</span>
<img
src=
"../../assets/img/homeVip.png"
width=
"65"
height=
"16"
/>
</div>
<div
class=
"row MarketfigurePhon"
>
<span>
ID:123453789
</span>
<span>
电话:180****1613
</span>
</div>
</div>
<div
class=
"text-small text-info"
v-if=
"userInfo.it"
>
团队或企业:
{{
userInfo
.
company
}}
</div>
<div
class=
"text-small text-info"
v-else
>
个人用户
</div>
</div>
</div>
</div>
</div>
<div
class=
"MarketEquity"
>
<div
class=
"vip-box rounded row q-my-lg items-end"
:style=
"
{ background: userTheme?.bg }">
<div
class=
"MarketEquityNum"
>
<div
class=
"text-white col"
>
<span>
功能权益
</span>
<div
class=
"text-weight-bolder"
>
{{
userTheme
?.
desc
}}
</div>
<span>
5+
</span>
<div
class=
"col text-light q-mt-sm"
>
当前权益:
{{
(
userInfo
.
it
||
userInfo
.
iv
?
fr
.
length
:
4
)
}}
</div>
<div
class=
"col text-light q-mt-sm text-small"
v-if=
"userInfo.it || userInfo.iv"
>
有效期至:
{{
userInfo
.
expire
}}
</div>
</div>
</div>
<div
class=
"MarketEquityTime"
>
有效期至2024.07.03
</div>
<div
:style=
"
{'background':vipTheme.color}" @click="openOrderViewHandler(1)" v-if="!userInfo.iv
&&
!userInfo.it" class="text-white pingfangr q-ml-lg rounded cusor-pointer q-py-sm q-px-md no-select">升级专业版
</div>
<div
:style=
"
{'background':enTheme.color}" @click="openOrderViewHandler(0)" v-if="userInfo.iv
&&
!userInfo.it" class="text-white pingfangr q-ml-lg rounded cusor-pointer q-py-sm q-px-md no-select">升级企业
</div>
<div
v-if=
"userInfo.it && (userInfo.ia||userInfo.ic)"
@
click=
"openOrderViewHandler(0)"
style=
"background-color: #F1F2F4;"
class=
"text-dark text-bold pingfangr q-ml-lg rounded cusor-pointer q-px-md q-py-sm no-select"
>
立即续费
</div>
</div>
</div>
<div
class=
"MarketCapacity"
>
<div
class=
"MarketCapacity"
>
<div>
<div>
<el-progress
<el-progress
...
@@ -65,15 +59,15 @@
...
@@ -65,15 +59,15 @@
<div
class=
"MarketFootmark row items-center flex-between"
>
<div
class=
"MarketFootmark row items-center flex-between"
>
<div>
<div>
<span>
足迹
</span>
<span>
足迹
</span>
<b>
10
</b>
<b>
{{
sampleData
[
1
]
}}
</b>
</div>
</div>
<div>
<div>
<span>
收藏
</span>
<span>
收藏
</span>
<b>
10
</b>
<b>
{{
sampleData
[
2
]
}}
</b>
</div>
</div>
<div>
<div>
<span>
共享
</span>
<span>
行程/广告
</span>
<b>
10
</b>
<b>
{{
sampleData
[
0
]
}}
</b>
</div>
</div>
</div>
</div>
<div
class=
"TranLine"
></div>
<div
class=
"TranLine"
></div>
...
@@ -103,6 +97,7 @@
...
@@ -103,6 +97,7 @@
</div>
</div>
<!-- 创建设计 -->
<!-- 创建设计 -->
<temDesign
:addTem=
"addVisible"
@
close=
"addVisible=false"
/>
<temDesign
:addTem=
"addVisible"
@
close=
"addVisible=false"
/>
<OrderReview
v-if=
"orderVisible"
:show-person=
"isShowPerson"
:default-type=
"isShowPerson?1:2"
@
close=
"()=>orderVisible=false"
></OrderReview>
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
import
{
ref
}
from
"vue"
;
import
{
ref
}
from
"vue"
;
...
@@ -111,6 +106,11 @@ import { storeToRefs } from "pinia";
...
@@ -111,6 +106,11 @@ import { storeToRefs } from "pinia";
import
{
useRouter
}
from
"vue-router"
;
import
{
useRouter
}
from
"vue-router"
;
import
{
openNewBlank
}
from
"@/utils/common"
;
import
{
openNewBlank
}
from
"@/utils/common"
;
import
temDesign
from
"@/components/home/temDesign.vue"
;
import
temDesign
from
"@/components/home/temDesign.vue"
;
import
{
EntMemberRight
,
ENT_USER_THEME
,
FreeMemberRight
,
PersonMemberRight
,
VIP_USER_THEME
}
from
"@/configs/customer"
;
import
OrderReview
from
'@/views/components/Order/Review.vue'
import
UserServices
from
"@/services/UserService"
;
import
{
ApiResult
}
from
"@/configs/axios"
;
const
props
=
defineProps
({
const
props
=
defineProps
({
size
:
{
size
:
{
type
:
Number
,
type
:
Number
,
...
@@ -118,10 +118,17 @@ const props = defineProps({
...
@@ -118,10 +118,17 @@ const props = defineProps({
},
},
});
});
const
addVisible
=
ref
(
false
)
const
addVisible
=
ref
(
false
)
const
orderVisible
=
ref
(
false
)
const
forwardProduct
=
()
=>
router
.
push
(
'/p/show'
)
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
);
const
userTheme
=
useUser
.
getUserTheme
const
vipTheme
=
VIP_USER_THEME
const
enTheme
=
ENT_USER_THEME
const
fr
=
userInfo
.
value
.
it
?
EntMemberRight
:(
userInfo
.
value
.
iv
?
PersonMemberRight
:
FreeMemberRight
)
const
isShowPerson
=
ref
(
true
)
const
sampleData
=
ref
<
any
[]
>
([
0
,
0
,
0
])
const
format
=
(
percentage
:
number
)
=>
{
const
format
=
(
percentage
:
number
)
=>
{
return
percentage
==
100
?
''
:
``
return
percentage
==
100
?
''
:
``
}
}
...
@@ -144,14 +151,39 @@ const forward = (url:string|undefined)=>{
...
@@ -144,14 +151,39 @@ const forward = (url:string|undefined)=>{
const
loginOutHandler
=
()
=>
{
const
loginOutHandler
=
()
=>
{
useUser
.
setUserLoginOut
()
useUser
.
setUserLoginOut
()
}
}
const
openOrderViewHandler
=
(
t
:
number
)
=>
{
isShowPerson
.
value
=
t
==
1
orderVisible
.
value
=
true
}
const
getSampleHandler
=
async
()
=>
{
const
response
=
await
UserServices
.
GetTripSampleCountAsync
()
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
)
sampleData
.
value
=
response
.
data
.
data
else
sampleData
.
value
=
[
0
,
0
,
0
]
}
getSampleHandler
()
</
script
>
</
script
>
<
style
scoped
>
<
style
scoped
>
.MarketfigureName
{
.vip-box
{
font-family
:
PingFang
SC
;
padding
:
16px
;
font-weight
:
bold
;
position
:
relative
;
font-size
:
18px
;
font-size
:
14px
;
color
:
#000000
;
color
:
#FFF
;
margin-top
:
3px
;
z-index
:
1
;
width
:
100%
;
overflow
:
hidden
;
}
.vip-box
::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
;
}
}
.MarketfigureMin
img
{
.MarketfigureMin
img
{
margin-top
:
18px
;
margin-top
:
18px
;
...
...
src/components/footer/index.vue
View file @
fbc04905
...
@@ -14,7 +14,7 @@ import { onMounted, ref,provide } from 'vue';
...
@@ -14,7 +14,7 @@ import { onMounted, ref,provide } from 'vue';
<
style
scoped
>
<
style
scoped
>
.footer-from
{
.footer-from
{
width
:
100%
;
width
:
100%
;
position
:
fixed
;
/* position: fixed; */
height
:
10vh
;
height
:
10vh
;
left
:
0
;
left
:
0
;
right
:
0
;
right
:
0
;
...
...
src/configs/customer.ts
View file @
fbc04905
...
@@ -12,9 +12,9 @@ export interface MemberRights{
...
@@ -12,9 +12,9 @@ export interface MemberRights{
range
:(
'F'
|
'P'
|
'E'
)[]
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
:
'EN'
,
bg
:
'linear-gradient(270deg, #4165E2 0%, #5276F5 100%)'
,
color
:
'#dd9b38'
,
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
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
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
]
export
const
CustomerThemeConfig
:
CustomerTheme
[]
=
[
FREE_USER_THEME
,
VIP_USER_THEME
,
ENT_USER_THEME
,
TME_USER_THEME
]
...
...
src/services/OrgService.ts
View file @
fbc04905
...
@@ -31,5 +31,10 @@ class OrgService{
...
@@ -31,5 +31,10 @@ class OrgService{
const
msg
=
{
logo
,
name
}
const
msg
=
{
logo
,
name
}
return
Api
.
Post
(
"travel_set_tenant_info"
,
msg
)
return
Api
.
Post
(
"travel_set_tenant_info"
,
msg
)
}
}
static
async
DissTenantAsync
(
r
:
string
,
p
:
string
):
Promise
<
HttpResponse
>
{
const
msg
=
{
r
,
p
}
return
Api
.
Post
(
"travel_diss_tenant"
,
msg
)
}
}
}
export
default
OrgService
;
export
default
OrgService
;
\ No newline at end of file
src/services/UserService.ts
View file @
fbc04905
...
@@ -58,5 +58,9 @@ class UserServices{
...
@@ -58,5 +58,9 @@ class UserServices{
let
msg
=
{}
let
msg
=
{}
return
Api
.
Post
(
"travel_set_userexit_tenant"
,
msg
)
return
Api
.
Post
(
"travel_set_userexit_tenant"
,
msg
)
}
}
static
async
GetTripSampleCountAsync
():
Promise
<
HttpResponse
>
{
let
msg
=
{}
return
Api
.
Post
(
"travel_sample_count"
,
msg
)
}
}
}
export
default
UserServices
;
export
default
UserServices
;
\ No newline at end of file
src/store/menu.ts
View file @
fbc04905
...
@@ -26,7 +26,7 @@ const menus:{menu:Menu,owner:MenuOwner}[] = [
...
@@ -26,7 +26,7 @@ const menus:{menu:Menu,owner:MenuOwner}[] = [
{
menu
:{
name
:
'成员管理'
,
icon
:
'IconPeoples'
,
url
:
'/a/u'
},
owner
:
'A'
},
{
menu
:{
name
:
'成员管理'
,
icon
:
'IconPeoples'
,
url
:
'/a/u'
},
owner
:
'A'
},
{
menu
:{
name
:
'数据统计'
,
icon
:
'IconDashBoard'
,
url
:
'/a/d'
},
owner
:
'A'
},
{
menu
:{
name
:
'数据统计'
,
icon
:
'IconDashBoard'
,
url
:
'/a/d'
},
owner
:
'A'
},
{
menu
:{
name
:
'水印设置'
,
icon
:
'IconTag'
,
url
:
'/a/w'
},
owner
:
'A'
},
{
menu
:{
name
:
'水印设置'
,
icon
:
'IconTag'
,
url
:
'/a/w'
},
owner
:
'A'
},
{
menu
:{
name
:
'订单/发票'
,
icon
:
'IconCurrency'
,
url
:
'/a/order'
},
owner
:
'
A
'
},
{
menu
:{
name
:
'订单/发票'
,
icon
:
'IconCurrency'
,
url
:
'/a/order'
},
owner
:
'
E
'
},
{
{
menu
:{
menu
:{
name
:
'更多设置 '
,
name
:
'更多设置 '
,
...
@@ -84,8 +84,10 @@ export const useMenuStore = defineStore('menu', {
...
@@ -84,8 +84,10 @@ export const useMenuStore = defineStore('menu', {
getTeamMenu
:(
state
)
=>
{
getTeamMenu
:(
state
)
=>
{
const
userStore
=
useUserStore
()
const
userStore
=
useUserStore
()
const
userInfo
=
userStore
.
getUser
const
userInfo
=
userStore
.
getUser
let
userPermissions
:
MenuOwner
[]
=
[
'A'
]
if
(
userInfo
.
ic
)
userPermissions
.
push
(
'E'
)
if
(
userInfo
.
it
&&
(
userInfo
.
ia
||
userInfo
.
ic
)){
if
(
userInfo
.
it
&&
(
userInfo
.
ia
||
userInfo
.
ic
)){
const
finds
=
menus
.
filter
(
x
=>
x
.
owner
==
'A'
)
const
finds
=
menus
.
filter
(
x
=>
userPermissions
.
includes
(
x
.
owner
)
)
return
finds
.
map
(
x
=>
x
.
menu
)
return
finds
.
map
(
x
=>
x
.
menu
)
}
}
return
new
Array
<
Menu
>
()
return
new
Array
<
Menu
>
()
...
...
src/store/user.ts
View file @
fbc04905
...
@@ -62,6 +62,7 @@ export const useUserStore = defineStore('user', {
...
@@ -62,6 +62,7 @@ export const useUserStore = defineStore('user', {
d
.
expire
=
d
.
Expire
d
.
expire
=
d
.
Expire
d
.
ic
=
d
.
IsGroupCreate
d
.
ic
=
d
.
IsGroupCreate
d
.
id
=
d
.
DisplayId
d
.
id
=
d
.
DisplayId
d
.
iv
=
0
this
.
userInfo
=
d
this
.
userInfo
=
d
if
(
!
this
.
userInfo
.
photo
||
!
this
.
userInfo
.
photo
.
includes
(
'http://'
)
||
!
this
.
userInfo
.
photo
.
includes
(
'https://'
)){
if
(
!
this
.
userInfo
.
photo
||
!
this
.
userInfo
.
photo
.
includes
(
'http://'
)
||
!
this
.
userInfo
.
photo
.
includes
(
'https://'
)){
this
.
userInfo
.
photo
=
USER_DEFAULT_HEADER
this
.
userInfo
.
photo
=
USER_DEFAULT_HEADER
...
...
src/views/Auth/Login.vue
View file @
fbc04905
...
@@ -77,7 +77,12 @@
...
@@ -77,7 +77,12 @@
<div
class=
"text-info text-small"
>
你的创作空间
</div>
<div
class=
"text-info text-small"
>
你的创作空间
</div>
<div
class=
"q-py-xl flex-center items-center column"
>
<div
class=
"q-py-xl flex-center items-center column"
>
<el-avatar
:size=
"100"
shape=
"square"
class=
"bg-transparent"
:src=
"userInfo.photo"
></el-avatar>
<el-avatar
:size=
"100"
shape=
"square"
class=
"bg-transparent"
:src=
"userInfo.photo"
></el-avatar>
<div
class=
"q-mt-md text-weight-bold"
style=
"font-size: 18px;"
>
{{ userInfo.nickname }}
</div>
<div
class=
"row items-center flex-center q-mt-md "
>
<div
class=
"text-weight-bold"
style=
"font-size: 18px;"
>
{{ userInfo.nickname }}
</div>
<el-tag
type=
"primary"
class=
"q-ml-md"
v-if=
"userInfo.it"
>
企业专业版
</el-tag>
<el-tag
type=
"warning"
class=
"q-ml-md"
v-else-if=
"userInfo.iv"
>
个人专业版
</el-tag>
<el-tag
type=
"info"
class=
"q-ml-md"
v-else
>
个人免费版
</el-tag>
</div>
<div
class=
"q-mt-md text-small text-info"
>
{{ userInfo.company }}
</div>
<div
class=
"q-mt-md text-small text-info"
>
{{ userInfo.company }}
</div>
<div
class=
"q-mt-lg row items-center"
>
<div
class=
"q-mt-lg row items-center"
>
<el-button
@
click=
"loginOutHandler"
>
退出登录
</el-button>
<el-button
@
click=
"loginOutHandler"
>
退出登录
</el-button>
...
...
src/views/Index.vue
View file @
fbc04905
...
@@ -106,7 +106,7 @@
...
@@ -106,7 +106,7 @@
</span>
</span>
</div>
</div>
</el-tooltip>
</el-tooltip>
<el-tooltip
effect=
"dark"
content=
"模板管理中心"
placement=
"right"
>
<el-tooltip
effect=
"dark"
content=
"模板管理中心"
placement=
"right"
v-if=
"userInfo.isTemplate"
>
<div
class=
"left-button q-mt-md"
@
click=
"redicetTo('/m')"
>
<div
class=
"left-button q-mt-md"
@
click=
"redicetTo('/m')"
>
<IconStarOne
size=
"24"
theme=
"filled"
style=
"color:#564bec4d"
></IconStarOne>
<IconStarOne
size=
"24"
theme=
"filled"
style=
"color:#564bec4d"
></IconStarOne>
</div>
</div>
...
@@ -154,8 +154,8 @@
...
@@ -154,8 +154,8 @@
</div>
</div>
</div>
</div>
<el-divider
/>
<el-divider
/>
<el-menu
mode=
"vertical"
>
<el-menu
mode=
"vertical
no-select
"
>
<el-menu-item
index=
"1"
class=
"rounded"
v-if=
"!userInfo.it"
>
<el-menu-item
index=
"1"
class=
"rounded"
v-if=
"!userInfo.it"
@
click=
"()=>visibleFind=true"
>
<el-icon><Plus
/></el-icon>
<el-icon><Plus
/></el-icon>
<span>
加入企业
</span>
<span>
加入企业
</span>
</el-menu-item>
</el-menu-item>
...
@@ -176,7 +176,7 @@
...
@@ -176,7 +176,7 @@
</el-popover>
</el-popover>
</div>
</div>
<div
class=
"q-mx-md col bg-white right-box row"
>
<div
class=
"q-mx-md col bg-white right-box row"
>
<router-view
/>
<router-view
/>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -186,6 +186,7 @@
...
@@ -186,6 +186,7 @@
<invite-member
v-if=
"showAddMember"
:show-type=
"1"
@
close=
"()=>showAddMember=false"
></invite-member>
<invite-member
v-if=
"showAddMember"
:show-type=
"1"
@
close=
"()=>showAddMember=false"
></invite-member>
<join-enterprise></join-enterprise>
<join-enterprise></join-enterprise>
<exit-tenant
v-if=
"visibleExit"
@
close=
"()=>visibleExit=false"
></exit-tenant>
<exit-tenant
v-if=
"visibleExit"
@
close=
"()=>visibleExit=false"
></exit-tenant>
<find-team
v-if=
"visibleFind"
@
close=
"()=>visibleFind=false"
></find-team>
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
...
@@ -198,7 +199,7 @@ import { Plus, Setting } from "@element-plus/icons-vue";
...
@@ -198,7 +199,7 @@ import { Plus, Setting } from "@element-plus/icons-vue";
import
{
openNewBlank
}
from
"@/utils/common"
;
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
{
re
active
,
re
f
}
from
"vue"
;
import
OrderReview
from
'@/views/components/Order/Review.vue'
import
OrderReview
from
'@/views/components/Order/Review.vue'
import
{
ElLoading
}
from
"element-plus"
;
import
{
ElLoading
}
from
"element-plus"
;
import
OrderService
from
"@/services/OrderService"
;
import
OrderService
from
"@/services/OrderService"
;
...
@@ -206,6 +207,7 @@ import { ApiResult } from "@/configs/axios";
...
@@ -206,6 +207,7 @@ import { ApiResult } from "@/configs/axios";
import
InviteMember
from
"@/views/components/Team/InviteMember.vue"
;
import
InviteMember
from
"@/views/components/Team/InviteMember.vue"
;
import
JoinEnterprise
from
"@/views/components/Team/JoinEnterprise.vue"
;
import
JoinEnterprise
from
"@/views/components/Team/JoinEnterprise.vue"
;
import
ExitTenant
from
"@/views/components/Team/ExitTenant.vue"
;
import
ExitTenant
from
"@/views/components/Team/ExitTenant.vue"
;
import
FindTeam
from
"@/views/components/Team/FindTeam.vue"
;
const
{
userInfo
}
=
storeToRefs
(
useUserStore
());
const
{
userInfo
}
=
storeToRefs
(
useUserStore
());
...
@@ -216,7 +218,11 @@ const isWorkspace = ref(true)
...
@@ -216,7 +218,11 @@ const isWorkspace = ref(true)
const
activeOrderId
=
ref
(
''
)
const
activeOrderId
=
ref
(
''
)
const
showAddMember
=
ref
(
false
)
const
showAddMember
=
ref
(
false
)
const
visibleExit
=
ref
(
false
)
const
visibleExit
=
ref
(
false
)
const
visibleFind
=
ref
(
false
)
const
popoverRef
=
ref
()
const
popoverRef
=
ref
()
const
font
=
reactive
({
color
:
'rgba(0, 0, 0, .15)'
,
})
isWorkspace
.
value
=
!
router
.
currentRoute
.
value
.
path
.
includes
(
'/space/cp'
)
isWorkspace
.
value
=
!
router
.
currentRoute
.
value
.
path
.
includes
(
'/space/cp'
)
const
openMarketHandler
=
(
type
:
string
=
""
)
=>
{
const
openMarketHandler
=
(
type
:
string
=
""
)
=>
{
...
...
src/views/Market/Index.vue
View file @
fbc04905
...
@@ -212,8 +212,9 @@
...
@@ -212,8 +212,9 @@
<div
style=
"height:40px;"
class=
"q-mt-md no-bg"
background=
"transparent"
v-loading=
"loading"
element-loading-text=
"正在加载中"
></div>
<div
style=
"height:40px;"
class=
"q-mt-md no-bg"
background=
"transparent"
v-loading=
"loading"
element-loading-text=
"正在加载中"
></div>
</div>
</div>
</div>
</div>
<foote
v-if=
"(queryObj.pageCount == queryObj.pageIndex || queryObj.pageCount==0) && !loading"
></foote>
</div>
</div>
<foote></foote>
<!-- 行程、广告图详情 -->
<!-- 行程、广告图详情 -->
<temDetails
:DetaTem=
"DetailsVisible"
:Details=
"datas.TemDetails"
@
close=
"DetailsVisible=false"
/>
<temDetails
:DetaTem=
"DetailsVisible"
:Details=
"datas.TemDetails"
@
close=
"DetailsVisible=false"
/>
</template>
</template>
...
@@ -765,7 +766,7 @@ onMounted(()=>{
...
@@ -765,7 +766,7 @@ onMounted(()=>{
}
}
.Market-from
{
.Market-from
{
background
:
linear-gradient
(
0deg
,
#FFF
,
#E3ECFF
);
background
:
linear-gradient
(
0deg
,
#FFF
,
#E3ECFF
);
height
:
9
0vh
;
height
:
10
0vh
;
overflow
:
auto
;
overflow
:
auto
;
}
}
.marketTag
.el-check-tag.is-checked
,
.marketTag
.el-check-tag
{
.marketTag
.el-check-tag.is-checked
,
.marketTag
.el-check-tag
{
...
...
src/views/TeamCenter/Dissolution.vue
View file @
fbc04905
...
@@ -8,19 +8,93 @@
...
@@ -8,19 +8,93 @@
<div
class=
"q-mt-lg text-small text-info"
>
解散企业后,您将不可再进入该企业,企业内所有内容、成员将会被永久删除。该操作不可逆,请谨慎操作!
</div>
<div
class=
"q-mt-lg text-small text-info"
>
解散企业后,您将不可再进入该企业,企业内所有内容、成员将会被永久删除。该操作不可逆,请谨慎操作!
</div>
</div>
</div>
<div>
<div>
<el-button
type=
"danger"
class=
"ppt-button"
>
解散
</el-button>
<el-button
type=
"danger"
class=
"ppt-button"
@
click=
"dissTeamHandler"
>
解散
</el-button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<el-dialog
v-model=
"dissVisible"
title=
"确认解散企业"
style=
"width:480px;"
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
:show-close=
"false"
>
<main
class=
"f14 text-dark"
>
<div>
请确认已知晓以下解散企业的操作结果
</div>
<div><el-checkbox
v-model=
"checked[0]"
:disabled=
"loading"
label=
"将删除所有成员的作图记录"
size=
"large"
/></div>
<div><el-checkbox
v-model=
"checked[1]"
:disabled=
"loading"
label=
"将删除团队空间/企业资源库全部内容"
size=
"large"
/></div>
<div><el-checkbox
v-model=
"checked[2]"
:disabled=
"loading"
label=
"删除后内容无法找回"
size=
"large"
/></div>
<div><el-checkbox
v-model=
"checked[3]"
:disabled=
"loading"
label=
"解散后组织无法使用,不可恢复"
size=
"large"
/></div>
<div
class=
"q-mt-lg"
>
<div>
解散企业的原因
</div>
<el-select
v-model=
"selectedReason"
:disabled=
"loading"
placeholder=
"请选择解散企业的原因"
class=
"full-width q-my-md"
size=
"large"
>
<el-option
label=
"企业重复创建"
value=
"企业重复创建"
/>
<el-option
label=
"离职或工作变动,不需要使用"
value=
"离职或工作变动,不需要使用"
/>
<el-option
label=
"团队解散/公司停止运营"
value=
"团队解散/公司停止运营"
/>
<el-option
label=
"产品功能无法满足使用"
value=
"产品功能无法满足使用"
/>
<el-option
label=
"其他"
value=
"其他"
/>
</el-select>
<el-input
v-model=
"inputReason"
:disabled=
"loading"
v-if=
"selectedReason=='其他'"
class=
"full-width pingfangr"
size=
"large"
placeholder=
"请输入原因"
/>
</div>
<div
class=
"q-mt-lg"
>
<div>
超级管理员身份认证
</div>
<el-input
v-model=
"pass"
type=
"password"
class=
"full-width q-mt-md"
size=
"large"
:disabled=
"loading"
placeholder=
"请输入登录密码"
/>
</div>
<div
class=
"text-right q-mt-xl"
>
<el-button
type=
"info"
size=
"large"
class=
"ppt-button text-weight-bold"
:disabled=
"loading"
@
click=
"()=>dissVisible=false"
>
取消
</el-button>
<el-button
type=
"primary"
size=
"large"
class=
"ppt-button"
v-if=
"enabledSubmit"
:loading=
"loading"
@
click=
"dissTenantSubmit"
>
确认解散
</el-button>
<el-button
type=
"info"
size=
"large"
class=
"ppt-button text-weight-bold text-grey-8"
disabled
v-else
>
确认解散
</el-button>
</div>
</main>
</el-dialog>
</
template
>
</
template
>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
import
{
ApiResult
}
from
"@/configs/axios"
;
import
OrgService
from
"@/services/OrgService"
;
import
{
useUserStore
}
from
"@/store"
;
import
{
useUserStore
}
from
"@/store"
;
import
{
ElMessage
}
from
"element-plus"
;
import
{
storeToRefs
}
from
"pinia"
;
import
{
storeToRefs
}
from
"pinia"
;
import
{
computed
}
from
"vue"
;
import
{
ref
}
from
"vue"
;
const
dissVisible
=
ref
(
false
)
const
checked
=
ref
<
boolean
[]
>
([
false
,
false
,
false
,
false
])
const
selectedReason
=
ref
(
'企业重复创建'
)
const
inputReason
=
ref
(
''
)
const
pass
=
ref
(
''
)
const
loading
=
ref
(
false
)
const
enabledSubmit
=
computed
(()
=>
{
let
flag
=
!
checked
.
value
.
includes
(
false
)
if
(
flag
){
if
(
selectedReason
.
value
==
'其他'
){
flag
=
inputReason
.
value
!=
''
}
if
(
flag
)
flag
=
pass
.
value
!=
''
}
return
flag
})
const
dissTeamHandler
=
()
=>
{
dissVisible
.
value
=
true
checked
.
value
.
forEach
((
x
)
=>
{
x
=
false
})
}
const
dissTenantSubmit
=
async
()
=>
{
if
(
loading
.
value
||
!
enabledSubmit
.
value
)
return
loading
.
value
=
true
const
r
=
selectedReason
.
value
==
'其他'
?
inputReason
.
value
:
selectedReason
.
value
const
response
=
await
OrgService
.
DissTenantAsync
(
r
,
pass
.
value
)
const
{
userInfo
}
=
storeToRefs
(
useUserStore
())
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
){
ElMessage
.
success
(
'当前团队/企业已注销,账号即将退出'
)
setTimeout
(()
=>
{
useUserStore
().
setUserLoginOut
()
},
1000
);
}
else
{
ElMessage
.
error
(
response
.
data
.
message
)
}
loading
.
value
=
false
}
</
script
>
</
script
>
<
style
>
<
style
>
...
...
src/views/TeamCenter/Index.vue
View file @
fbc04905
...
@@ -117,7 +117,6 @@ import { useRouter } from "vue-router";
...
@@ -117,7 +117,6 @@ import { useRouter } from "vue-router";
const
useUser
=
useUserStore
()
const
useUser
=
useUserStore
()
const
{
userInfo
}
=
storeToRefs
(
useUser
)
const
{
userInfo
}
=
storeToRefs
(
useUser
)
const
userTheme
=
useUser
.
getUserTheme
const
userTheme
=
useUser
.
getUserTheme
console
.
log
(
userTheme
)
const
vipTheme
=
VIP_USER_THEME
const
vipTheme
=
VIP_USER_THEME
const
enTheme
=
ENT_USER_THEME
const
enTheme
=
ENT_USER_THEME
const
router
=
useRouter
()
const
router
=
useRouter
()
...
...
src/views/TeamCenter/Layout.vue
View file @
fbc04905
...
@@ -20,9 +20,9 @@
...
@@ -20,9 +20,9 @@
<component
:is=
"x.icon"
style=
"font-size: 20px;"
></component>
<component
:is=
"x.icon"
style=
"font-size: 20px;"
></component>
<span
class=
"q-ml-lg"
>
{{
x
.
name
}}
</span>
<span
class=
"q-ml-lg"
>
{{
x
.
name
}}
</span>
</
template
>
</
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-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-sub-menu>
<el-menu-item
:index=
"
i
"
:route=
"x.url"
v-else
>
<el-menu-item
:index=
"
`${i}`
"
:route=
"x.url"
v-else
>
<component
:is=
"x.icon"
style=
"font-size: 20px;"
></component>
<component
:is=
"x.icon"
style=
"font-size: 20px;"
></component>
<span
class=
"q-ml-lg"
>
{{ x.name }}
</span>
<span
class=
"q-ml-lg"
>
{{ x.name }}
</span>
</el-menu-item>
</el-menu-item>
...
@@ -46,7 +46,7 @@ import { useRouter } from "vue-router";
...
@@ -46,7 +46,7 @@ import { useRouter } from "vue-router";
const
router
=
useRouter
()
const
router
=
useRouter
()
const
useMenu
=
useMenuStore
();
const
useMenu
=
useMenuStore
();
const
menus
=
ref
(
useMenu
.
getTeamMenu
);
const
menus
=
ref
(
useMenu
.
getTeamMenu
);
const
activeIndex
=
ref
(
0
)
const
activeIndex
=
ref
(
'0'
)
const
forwardSpace
=
()
=>
router
.
push
(
'/space'
)
const
forwardSpace
=
()
=>
router
.
push
(
'/space'
)
if
(
menus
.
value
.
length
==
0
){
if
(
menus
.
value
.
length
==
0
){
...
@@ -58,7 +58,17 @@ if(menus.value.length==0){
...
@@ -58,7 +58,17 @@ if(menus.value.length==0){
watch
(()
=>
router
.
currentRoute
.
value
.
path
,
(
toPath
)
=>
{
watch
(()
=>
router
.
currentRoute
.
value
.
path
,
(
toPath
)
=>
{
menus
.
value
=
useMenu
.
getTeamMenu
menus
.
value
=
useMenu
.
getTeamMenu
if
(
!
menus
.
value
)
return
if
(
!
menus
.
value
)
return
activeIndex
.
value
=
menus
.
value
.
findIndex
(
x
=>
x
.
url
==
router
.
currentRoute
.
value
.
path
)
menus
.
value
.
forEach
((
x
,
i
)
=>
{
if
(
x
.
url
==
router
.
currentRoute
.
value
.
path
){
activeIndex
.
value
=
i
.
toString
()
}
else
if
(
x
.
children
&&
x
.
children
.
length
>
0
){
x
.
children
.
forEach
((
y
,
yi
)
=>
{
if
(
y
.
url
==
router
.
currentRoute
.
value
.
path
){
activeIndex
.
value
=
`
${
i
}
_
${
yi
}
`
}
})
}
})
},{
immediate
:
true
,
deep
:
true
})
},{
immediate
:
true
,
deep
:
true
})
</
script
>
</
script
>
...
...
src/views/components/Order/Review.vue
View file @
fbc04905
...
@@ -5,8 +5,8 @@
...
@@ -5,8 +5,8 @@
<IconClose
size=
"0.83vw"
></IconClose>
<IconClose
size=
"0.83vw"
></IconClose>
</div>
</div>
<div
class=
"tabs-version-box row"
>
<div
class=
"tabs-version-box row"
>
<div
class=
"item col"
:class=
"
{'active':activeVersion==1}" @click="changeVersionHandler(1)">个人版
</div>
<div
class=
"item col"
:class=
"
{'active':activeVersion==1}" @click="changeVersionHandler(1)"
v-if="showPerson"
>个人版
</div>
<div
class=
"item col"
:class=
"
{'active':activeVersion==2}" @click="changeVersionHandler(2)">企业版
</div>
<div
class=
"item col"
:class=
"
{'active':activeVersion==2}" @click="changeVersionHandler(2)"
v-if="showEnterprise"
>企业版
</div>
</div>
</div>
<div
class=
"pre-order row"
>
<div
class=
"pre-order row"
>
<div
class=
"item column"
>
<div
class=
"item column"
>
...
@@ -87,6 +87,14 @@ const props = defineProps({
...
@@ -87,6 +87,14 @@ const props = defineProps({
defaultType
:
{
defaultType
:
{
type
:
Number
,
type
:
Number
,
default
:
1
default
:
1
},
showPerson
:{
type
:
Boolean
,
default
:
true
},
showEnterprise
:{
type
:
Boolean
,
default
:
true
}
}
})
})
...
...
src/views/components/Team/ExitTenant.vue
View file @
fbc04905
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
</main>
</main>
<
template
#
footer
>
<
template
#
footer
>
<el-button
@
click=
"closed"
size=
"large"
class=
"ppt-button"
:disabled=
"loading"
>
我再想想
</el-button>
<el-button
@
click=
"closed"
size=
"large"
class=
"ppt-button"
:disabled=
"loading"
>
我再想想
</el-button>
<el-button
:type=
"removeTokenStr!='退出并清空'?'info':'primary'"
size=
"large"
@
click=
"exitEnterpriseHandler"
:loading=
"loading"
:disabled=
"removeTokenStr!='退出并清空' || loading"
class=
"ppt-button
text-grey-8
"
>
退出并清空
</el-button>
<el-button
:type=
"removeTokenStr!='退出并清空'?'info':'primary'"
size=
"large"
@
click=
"exitEnterpriseHandler"
:loading=
"loading"
:disabled=
"removeTokenStr!='退出并清空' || loading"
class=
"ppt-button"
>
退出并清空
</el-button>
</
template
>
</
template
>
</el-dialog>
</el-dialog>
</template>
</template>
...
...
src/views/components/Team/FindTeam.vue
0 → 100644
View file @
fbc04905
<
template
>
<el-dialog
v-model=
"show"
title=
"加入团队/企业"
style=
"width:450px;"
@
close=
"closed"
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
>
<main>
<el-input
v-model=
"code"
:disabled=
"loading"
@
change=
"queryCodeHandler"
class=
"text-dark full-width rounded"
style=
"font-family: pingfangr !important;"
size=
"large"
placeholder=
"请输入邀请码"
>
<template
#
suffix
>
<IconSearch
size=
"18"
class=
"cusor-pointer"
@
click=
"queryCodeHandler"
v-if=
"!loading"
></IconSearch>
<IconRefresh
size=
"18"
class=
"search-loading"
v-if=
"loading"
></IconRefresh>
</
template
>
</el-input>
<div
class=
"q-mt-sm text-small text-info q-mb-lg"
>
邀请码是邀请链接最后一个'/'后面的数字和字母
</div>
<div
class=
"no-select row items-center q-pa-lg rounded"
style=
"background-color: rgb(240, 246, 255);"
v-if=
"inviteInfo"
>
<el-avatar
:size=
"44"
:src=
"inviteInfo.logo"
shape=
"square"
></el-avatar>
<div
class=
"q-ml-md"
>
<div
class=
"text-dark text-weight-bold"
>
{{ inviteInfo.company }}
</div>
<div
class=
"text-grey-8 text-small q-mt-sm"
>
{{ inviteInfo.expire }}后失效
</div>
</div>
</div>
<el-alert
:title=
"errorMsg"
type=
"error"
:closable=
"false"
v-if=
"errorMsg!=''"
/>
<div
class=
"text-right q-mt-xl"
>
<el-button
type=
"info"
size=
"large"
class=
"ppt-button text-weight-bold"
:disabled=
"loading"
@
click=
"closed"
>
取消
</el-button>
<el-button
type=
"primary"
size=
"large"
class=
"ppt-button"
v-if=
"inviteInfo"
@
click=
"joinTenantHandler"
:loading=
"loading"
>
确认加入
</el-button>
<el-button
type=
"info"
size=
"large"
class=
"ppt-button text-weight-bold text-grey-8"
disabled
v-else
>
确认解散
</el-button>
</div>
</main>
</el-dialog>
</template>
<
script
lang=
"ts"
setup
>
import
{
ApiResult
}
from
"@/configs/axios"
import
UserServices
from
"@/services/UserService"
import
{
useUserStore
}
from
"@/store"
import
{
ElMessage
}
from
"element-plus"
import
{
ref
}
from
"vue"
const
props
=
defineProps
({})
const
emit
=
defineEmits
<
{
(
event
:
'close'
):
void
,
(
event
:
'apply'
):
void
}
>
()
const
useUser
=
useUserStore
()
const
show
=
ref
(
true
)
const
code
=
ref
(
''
)
const
loading
=
ref
(
false
)
const
inviteInfo
=
ref
()
const
errorMsg
=
ref
(
''
)
const
closed
=
()
=>
{
show
.
value
=
false
emit
(
'close'
)
}
const
queryCodeHandler
=
async
()
=>
{
if
(
loading
.
value
||
code
.
value
==
''
)
return
;
loading
.
value
=
true
inviteInfo
.
value
=
null
errorMsg
.
value
=
''
const
response
=
await
UserServices
.
ValidateInviteCodeAsync
(
code
.
value
)
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
)
{
inviteInfo
.
value
=
response
.
data
.
data
}
else
errorMsg
.
value
=
response
.
data
.
message
loading
.
value
=
false
}
const
joinTenantHandler
=
async
()
=>
{
if
(
!
inviteInfo
.
value
||
loading
.
value
)
return
loading
.
value
=
true
const
response
=
await
UserServices
.
JoinTeamByInviteCodeAsync
(
inviteInfo
.
value
.
code
)
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
){
useUser
.
setNewUserInfo
(
response
.
data
.
data
)
ElMessage
.
success
({
message
:
`成功加入了「
${
inviteInfo
.
value
.
company
}
」`
})
setTimeout
(()
=>
{
location
.
reload
()
},
1000
);
}
else
{
ElMessage
.
error
({
message
:
response
.
data
.
message
})
loading
.
value
=
false
}
}
</
script
>
<
style
scoped
>
.search-loading
{
animation
:
rotate
2s
linear
infinite
;
}
@keyframes
rotate
{
from
{
transform
:
rotate
(
0deg
);
}
to
{
transform
:
rotate
(
360deg
);
}
}
</
style
>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment