重构 个人信息视图

This commit is contained in:
sakuya 2022-05-29 18:28:43 +08:00
parent bb66890e66
commit 0296c3feb0
9 changed files with 356 additions and 193 deletions

View File

@ -50,7 +50,7 @@
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="uc">个人设置</el-dropdown-item>
<el-dropdown-item command="uc">帐号信息</el-dropdown-item>
<el-dropdown-item command="clearCache">清除缓存</el-dropdown-item>
<el-dropdown-item divided command="outLogin">退出登录</el-dropdown-item>
</el-dropdown-menu>

View File

@ -1,14 +1,13 @@
/* USERCENTER */
.user-info {padding:20px 40px;}
.user-info-top {text-align: center;}
.user-info-top h2 {margin-top:10px;font-size: 24px;}
.user-info-top p {color: #999;margin-top:5px;}
.user-info-top button {margin-top:10px;}
.user-info-main {padding:20px 0;}
.user-info-main li {list-style-type:none;line-height: 2;font-size: 14px;}
.user-info-main li i {margin-right: 10px;}
.user-info-bottom {border-top: 1px solid #e6e6e6;}
.user-info-bottom h2 {font-size: 14px;margin:15px 0;}
.page-user {
.user-info-top {text-align: center;}
.user-info-top h2 {font-size: 18px;margin-top: 5px;}
.user-info-top p {margin: 8px 0 10px 0;}
.menu {background: none;}
.menu .el-menu-item {font-size: 12px;--el-menu-item-height:50px;}
.menu .el-menu-item-group {border-top: 1px solid var(--el-border-color-light);}
.menu .el-menu-item-group:first-child {border: 0;}
}
/*static-table*/
.static-table {border-collapse: collapse;width: 100%;font-size: 14px;margin-bottom: 45px;line-height: 1.5em;}

View File

@ -1,190 +1,108 @@
<template>
<el-main>
<el-row :gutter="15">
<el-col :lg="8">
<el-card shadow="never">
<div class="user-info">
<div class="user-info-top">
<el-avatar :size="80" src="img/avatar.jpg"></el-avatar>
<h2>{{ form.name||'-' }}</h2>
<p>{{ form.about||'无签名' }}</p>
<el-button type="primary" round icon="el-icon-collection-tag" size="large">Administrator</el-button>
</div>
<div class="user-info-main">
<ul>
<li><label><el-icon><el-icon-user /></el-icon></label><span>81883387@qq.com</span></li>
<li><label><el-icon><el-icon-present /></el-icon></label><span>1988-05-07</span></li>
<li><label><el-icon><el-icon-male /></el-icon></label><span></span></li>
<li><label><el-icon><el-icon-location /></el-icon></label><span>//</span></li>
<li><label><el-icon><el-icon-office-building /></el-icon></label><span>///</span></li>
<li><label><el-icon><el-icon-coin /></el-icon></label><span></span></li>
</ul>
</div>
<div class="user-info-bottom">
<h2>当前账号权限</h2>
<el-space wrap>
<el-tag v-auth="'user.add'">user.add</el-tag>
<el-tag v-auth="'user.edit'">user.edit</el-tag>
<el-tag v-if="$AUTH('user.delete')">user.delete</el-tag>
<el-tag v-if="$AUTH('list.add')">list.add</el-tag>
<el-tag v-if="$AUTH('list.edit')">list.edit</el-tag>
<el-tag v-if="$AUTH('list.delete')">list.delete</el-tag>
</el-space>
</div>
<el-container class="page-user">
<el-aside style="width: 240px;">
<el-container>
<el-header style="height: auto;display: block;">
<div class="user-info-top">
<el-avatar :size="70" src="img/avatar.jpg"></el-avatar>
<h2>{{ user.userName }}</h2>
<p><el-tag effect="dark" round size="large">{{ user.role }}</el-tag></p>
</div>
</el-card>
</el-col>
<el-col :lg="16">
<el-card shadow="never">
<el-tabs tab-position="top">
<el-tab-pane :label="$t('user.dynamic')">
<el-timeline style="margin-top:20px;padding-left:10px;">
<el-timeline-item v-for="(activity, index) in activities" :key="index" :timestamp="activity.timestamp" placement="top">
<div class="activity-item">
<el-avatar class="avatar" :size="24" src="img/avatar.jpg"></el-avatar>
<label>{{activity.operate}}</label><el-tag v-if="activity.mod">{{activity.mod}}</el-tag>{{activity.describe}}
</div>
</el-timeline-item>
</el-timeline>
</el-tab-pane>
<el-tab-pane :label="$t('user.info')">
<el-form ref="form" :model="form" label-width="80px" style="width: 460px;margin-top:20px;">
<el-form-item label="账号">
<el-input v-model="form.user" disabled></el-input>
<div class="el-form-item-msg">账号信息用于登录系统不允许修改</div>
</el-form-item>
<el-form-item label="姓名">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="性别">
<el-select v-model="form.sex" placeholder="请选择">
<el-option label="保密" value="0"></el-option>
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="个性签名">
<el-input v-model="form.about" type="textarea"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary">保存</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane :label="$t('user.settings')">
<el-form ref="form" :model="form" label-width="120px" style="margin-top:20px;">
<el-form-item :label="$t('user.nightmode')">
<el-switch v-model="config.dark" inline-prompt active-icon="el-icon-moon" inactive-icon="el-icon-sunny"></el-switch>
<div class="el-form-item-msg">{{ $t('user.nightmode_msg') }}</div>
</el-form-item>
<el-form-item label="主题颜色">
<el-color-picker v-model="config.colorPrimary" :predefine="colorList">></el-color-picker>
</el-form-item>
<el-form-item :label="$t('user.language')">
<el-select v-model="config.lang">
<el-option label="简体中文" value="zh-cn"></el-option>
<el-option label="English" value="en"></el-option>
<el-option label="日本語" value="ja"></el-option>
</el-select>
<div class="el-form-item-msg">{{ $t('user.language_msg') }}</div>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
</el-row>
</el-main>
</el-header>
<el-main class="nopadding">
<el-menu class="menu" :default-active="page">
<el-menu-item-group v-for="group in menu" :key="group.groupName" :title="group.groupName">
<el-menu-item v-for="item in group.list" :key="item.component" :index="item.component" @click="openPage">
<el-icon v-if="item.icon"><component :is="item.icon"/></el-icon>
<template #title>
<span>{{item.title}}</span>
</template>
</el-menu-item>
</el-menu-item-group>
</el-menu>
</el-main>
</el-container>
</el-aside>
<el-main>
<Suspense>
<template #default>
<component :is="page"/>
</template>
<template #fallback>
<el-skeleton :rows="3" />
</template>
</Suspense>
</el-main>
</el-container>
</template>
<script>
import colorTool from '@/utils/color'
import { defineAsyncComponent } from 'vue'
export default {
name: 'userCenter',
components: {
account: defineAsyncComponent(() => import('./user/account')),
seting: defineAsyncComponent(() => import('./user/seting')),
pushSettings: defineAsyncComponent(() => import('./user/pushSettings')),
space: defineAsyncComponent(() => import('./user/space')),
logs: defineAsyncComponent(() => import('./user/logs')),
upToEnterprise: defineAsyncComponent(() => import('./user/upToEnterprise'))
},
data() {
return {
activities: [
menu: [
{
operate: '更改了',
mod: '系统配置',
describe: 'systemName 为 SCUI',
type: 'edit',
timestamp: '刚刚'
groupName: "基本设置",
list: [
{
icon: "el-icon-postcard",
title: "账号信息",
component: "account"
},
{
icon: "el-icon-operation",
title: "个人设置",
component: "seting"
},
{
icon: "el-icon-bell",
title: "通知设置",
component: "pushSettings"
}
]
},
{
operate: '删除了',
mod: '用户',
describe: 'USER',
type: 'del',
timestamp: '5分钟前'
groupName: "数据管理",
list: [
{
icon: "el-icon-coin",
title: "存储空间信息",
component: "space"
},
{
icon: "el-icon-clock",
title: "操作日志",
component: "logs"
}
]
},
{
operate: '禁用了',
mod: '用户',
describe: 'USER',
type: 'del',
timestamp: '5分钟前'
},
{
operate: '创建了',
mod: '用户',
describe: 'USER',
type: 'add',
timestamp: '5分钟前'
},
{
operate: '审核了',
mod: '用户',
describe: 'lolowan 为 通过',
type: 'add',
timestamp: '10分钟前'
},
{
operate: '登录',
mod: '',
describe: '成功',
type: 'do',
timestamp: '1小时前'
},
groupName: "账号升级",
list: [
{
icon: "el-icon-office-building",
title: "升级为企业账号",
component: "upToEnterprise"
}
]
}
],
form: {
user: "81883387@qq.com",
name: "Sakuya",
sex: "1",
about: "正所谓富贵险中求"
user: {
userName: "Sakuya",
role: "超级管理员",
},
colorList: ['#409EFF', '#009688', '#536dfe', '#ff5c93', '#c62f2f', '#fd726d'],
config: {
lang: this.$TOOL.data.get('APP_LANG') || this.$CONFIG.LANG,
dark: this.$TOOL.data.get('APP_DARK') || false,
colorPrimary: this.$TOOL.data.get('APP_COLOR') || this.$CONFIG.COLOR || '#409EFF'
}
}
},
watch:{
'config.dark'(val){
if(val){
document.documentElement.classList.add("dark")
this.$TOOL.data.set("APP_DARK", val)
}else{
document.documentElement.classList.remove("dark")
this.$TOOL.data.remove("APP_DARK")
}
},
'config.lang'(val){
this.$i18n.locale = val
this.$TOOL.data.set("APP_LANG", val);
},
'config.colorPrimary'(val){
document.documentElement.style.setProperty('--el-color-primary', val);
for (let i = 1; i <= 9; i++) {
document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, colorTool.lighten(val,i/10));
}
for (let i = 1; i <= 9; i++) {
document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, colorTool.darken(val,i/10));
}
this.$TOOL.data.set("APP_COLOR", val);
page: "account"
}
},
// from
@ -202,18 +120,9 @@
})
},
methods: {
openPage(item){
this.page = item.index
}
}
}
</script>
<style scoped>
.el-card {margin-bottom:15px;}
.activity-item {font-size: 13px;color: #999;display: flex;align-items: center;}
.activity-item label {color: #333;margin-right:10px;}
.activity-item .el-avatar {margin-right:10px;}
.activity-item .el-tag {margin-right:10px;}
[data-theme='dark'] .user-info-bottom {border-color: var(--el-border-color-base);}
[data-theme='dark'] .activity-item label {color: #999;}
</style>

View File

@ -0,0 +1,46 @@
<template>
<el-alert title="异步组件动态加载使用了正处于试验阶段的<Suspense>组件, 其API和使用方式可能会改变. <Suspense> is an experimental feature and its API will likely change." type="warning" show-icon style="margin-bottom: 15px;"/>
<el-card shadow="never" header="个人信息">
<el-form ref="form" :model="form" label-width="120px" style="margin-top:20px;">
<el-form-item label="账号">
<el-input v-model="form.user" disabled></el-input>
<div class="el-form-item-msg">账号信息用于登录系统不允许修改</div>
</el-form-item>
<el-form-item label="姓名">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="性别">
<el-select v-model="form.sex" placeholder="请选择">
<el-option label="保密" value="0"></el-option>
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="个性签名">
<el-input v-model="form.about" type="textarea"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary">保存</el-button>
</el-form-item>
</el-form>
</el-card>
</template>
<script>
export default {
data() {
return {
form: {
user: "administrator@scuiadmin.com",
name: "Sakuya",
sex: "0",
about: "正所谓富贵险中求"
}
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,40 @@
<template>
<el-card shadow="never" header="近7天操作记录">
<scTable ref="table" :data="data" height="auto" paginationLayout="total, prev, pager, next" hideDo>
<sc-table-column label="序号" type="index"></sc-table-column>
<sc-table-column label="业务名称" prop="title" min-width="240"></sc-table-column>
<sc-table-column label="IP" prop="ip" width="150"></sc-table-column>
<sc-table-column label="结果" prop="code" width="150">
<el-tag type="success">成功</el-tag>
</sc-table-column>
<sc-table-column label="操作时间" prop="time" width="150"></sc-table-column>
</scTable>
</el-card>
</template>
<script>
export default {
data() {
return {
data: [
{
title: "修改用户 lolowan",
ip: "211.187.11.18",
code: "成功",
time: "2022-10-10 08:41:17"
},
{
title: "用户登录",
ip: "211.187.11.18",
code: "成功",
time: "2022-10-10 08:21:51"
}
]
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,30 @@
<template>
<el-card shadow="never" header="事务待办">
<el-form ref="form" label-width="180px" label-position="left" style="margin-top:20px;">
<el-form-item label="有新的待办">
<el-checkbox v-model="form.new">短信推送</el-checkbox>
<el-checkbox v-model="form.new_wx">微信推送</el-checkbox>
</el-form-item>
<el-form-item label="待办有效时剩24小时">
<el-checkbox v-model="form.timeout">短信推送</el-checkbox>
<el-checkbox v-model="form.timeout_wx">微信推送</el-checkbox>
</el-form-item>
</el-form>
</el-card>
</template>
<script>
export default {
data() {
return {
form: {
new: true,
timeout: true
}
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,66 @@
<template>
<el-card shadow="never" header="语言主题">
<el-form ref="form" label-width="120px" style="margin-top:20px;">
<el-form-item :label="$t('user.nightmode')">
<el-switch v-model="config.dark" inline-prompt active-icon="el-icon-moon" inactive-icon="el-icon-sunny"></el-switch>
<div class="el-form-item-msg">{{ $t('user.nightmode_msg') }}</div>
</el-form-item>
<el-form-item label="主题颜色">
<el-color-picker v-model="config.colorPrimary" :predefine="colorList">></el-color-picker>
</el-form-item>
<el-form-item :label="$t('user.language')">
<el-select v-model="config.lang">
<el-option label="简体中文" value="zh-cn"></el-option>
<el-option label="English" value="en"></el-option>
<el-option label="日本語" value="ja"></el-option>
</el-select>
<div class="el-form-item-msg">{{ $t('user.language_msg') }}</div>
</el-form-item>
</el-form>
</el-card>
</template>
<script>
import colorTool from '@/utils/color'
export default {
data() {
return {
colorList: ['#409EFF', '#009688', '#536dfe', '#ff5c93', '#c62f2f', '#fd726d'],
config: {
lang: this.$TOOL.data.get('APP_LANG') || this.$CONFIG.LANG,
dark: this.$TOOL.data.get('APP_DARK') || false,
colorPrimary: this.$TOOL.data.get('APP_COLOR') || this.$CONFIG.COLOR || '#409EFF'
}
}
},
watch:{
'config.dark'(val){
if(val){
document.documentElement.classList.add("dark")
this.$TOOL.data.set("APP_DARK", val)
}else{
document.documentElement.classList.remove("dark")
this.$TOOL.data.remove("APP_DARK")
}
},
'config.lang'(val){
this.$i18n.locale = val
this.$TOOL.data.set("APP_LANG", val);
},
'config.colorPrimary'(val){
document.documentElement.style.setProperty('--el-color-primary', val);
for (let i = 1; i <= 9; i++) {
document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, colorTool.lighten(val,i/10));
}
for (let i = 1; i <= 9; i++) {
document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, colorTool.darken(val,i/10));
}
this.$TOOL.data.set("APP_COLOR", val);
}
},
}
</script>
<style>
</style>

View File

@ -0,0 +1,55 @@
<template>
<el-card shadow="never" header="当前已用量">
<el-progress :text-inside="true" :stroke-width="20" :color="color" :percentage="value" :format="format"/>
<el-row :gutter="15" style="margin-top: 20px;">
<el-col :lg="6">
<el-card shadow="never">
<sc-statistic title="文档" value="7.41" suffix="GB" groupSeparator></sc-statistic>
</el-card>
</el-col>
<el-col :lg="6">
<el-card shadow="never">
<sc-statistic title="图片" value="12.90" suffix="GB" groupSeparator></sc-statistic>
</el-card>
</el-col>
<el-col :lg="6">
<el-card shadow="never">
<sc-statistic title="视音频" value="68.79" suffix="MB" groupSeparator></sc-statistic>
</el-card>
</el-col>
<el-col :lg="6">
<el-card shadow="never">
<sc-statistic title="其他" value="17.58" suffix="GB" groupSeparator></sc-statistic>
</el-card>
</el-col>
</el-row>
</el-card>
</template>
<script>
import scStatistic from '@/components/scStatistic';
export default {
components: {
scStatistic
},
data() {
return {
value: 39.58,
color: [
{ color: '#67C23A', percentage: 40 },
{ color: '#E6A23C', percentage: 60 },
{ color: '#F56C6C', percentage: 80 },
]
}
},
methods: {
format(percentage){
return percentage + "G"
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,18 @@
<template>
<el-empty image="img/404.png" :image-size="280" description="当前账号未满足开通企业账号权限">
<el-button type="primary" size="large" round disabled>立即升级为企业账号</el-button>
</el-empty>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style>
</style>