提交 43f5a810 authored 作者: 王鹏飞's avatar 王鹏飞

bug fixes

上级 1e9f9499
<script lang="ts" setup> <script lang="ts" setup>
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { Plus } from '@element-plus/icons-vue' import { Plus, Document, ZoomIn, Delete } from '@element-plus/icons-vue'
import type { UploadProps, UploadUserFile, UploadFile, UploadFiles, UploadInstance } from 'element-plus' import type { UploadProps, UploadUserFile, UploadFile, UploadFiles, UploadInstance } from 'element-plus'
import md5 from 'blueimp-md5' import md5 from 'blueimp-md5'
import axios from 'axios' import axios from 'axios'
...@@ -112,6 +112,13 @@ const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => { ...@@ -112,6 +112,13 @@ const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
const handlePreview: UploadProps['onPreview'] = uploadFile => { const handlePreview: UploadProps['onPreview'] = uploadFile => {
window.open(uploadFile.url) window.open(uploadFile.url)
} }
function onPreview() {
window.open(props.modelValue as string)
}
function onRemove() {
emit('update:modelValue', '')
}
</script> </script>
<template> <template>
...@@ -138,7 +145,19 @@ const handlePreview: UploadProps['onPreview'] = uploadFile => { ...@@ -138,7 +145,19 @@ const handlePreview: UploadProps['onPreview'] = uploadFile => {
</template> </template>
</template> </template>
<div class="avatar-uploader" v-else> <div class="avatar-uploader" v-else>
<el-image :src="(modelValue as string)" fit="contain" v-if="modelValue" /> <template v-if="modelValue">
<el-image :src="(modelValue as string)" fit="contain">
<template #error>
<div class="image-slot">
<el-icon><Document /></el-icon>
</div>
</template>
</el-image>
<div class="avatar-actions" @click.stop>
<el-icon @click="onPreview"><ZoomIn /></el-icon>
<el-icon @click="onRemove"><Delete /></el-icon>
</div>
</template>
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon> <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</div> </div>
</slot> </slot>
...@@ -166,6 +185,11 @@ const handlePreview: UploadProps['onPreview'] = uploadFile => { ...@@ -166,6 +185,11 @@ const handlePreview: UploadProps['onPreview'] = uploadFile => {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
&:hover {
.avatar-actions {
opacity: 1;
}
}
} }
.avatar-uploader:hover { .avatar-uploader:hover {
border-color: var(--el-color-primary); border-color: var(--el-color-primary);
...@@ -177,4 +201,36 @@ const handlePreview: UploadProps['onPreview'] = uploadFile => { ...@@ -177,4 +201,36 @@ const handlePreview: UploadProps['onPreview'] = uploadFile => {
height: 100%; height: 100%;
text-align: center; text-align: center;
} }
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
}
.avatar-actions {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
cursor: default;
display: inline-flex;
justify-content: center;
align-items: center;
color: #fff;
opacity: 0;
font-size: 20px;
background-color: var(--el-overlay-color-lighter);
transition: opacity var(--el-transition-duration);
.el-icon {
cursor: pointer;
}
.el-icon + .el-icon {
margin-left: 1em;
}
}
</style> </style>
...@@ -17,7 +17,8 @@ export interface RoleInfo { ...@@ -17,7 +17,8 @@ export interface RoleInfo {
created_at: string created_at: string
updated_at: string updated_at: string
levels: string[] levels: string[]
members: RoleMember[] list: RoleMember[]
total: number
} }
// 角色成员 // 角色成员
......
...@@ -18,7 +18,7 @@ const listOptions = $computed(() => { ...@@ -18,7 +18,7 @@ const listOptions = $computed(() => {
params: { role_id: route.params.id }, params: { role_id: route.params.id },
callback: (res: RoleInfo) => { callback: (res: RoleInfo) => {
roleInfo = res roleInfo = res
return { list: res.members } return { list: res.list, total: res.total }
} }
}, },
columns: [ columns: [
......
...@@ -21,7 +21,7 @@ const listOptions = $computed(() => { ...@@ -21,7 +21,7 @@ const listOptions = $computed(() => {
columns: [ columns: [
{ label: '名称', prop: 'name' }, { label: '名称', prop: 'name' },
{ label: '描述', prop: 'desc' }, { label: '描述', prop: 'desc' },
{ label: '包含用户数量', prop: 'user_count' }, { label: '包含用户数量', prop: 'total' },
{ label: '角色类型', prop: 'levels' }, { label: '角色类型', prop: 'levels' },
{ label: '更新时间', prop: 'updated_at' }, { label: '更新时间', prop: 'updated_at' },
{ label: '操作', slots: 'table-x', width: 100 } { label: '操作', slots: 'table-x', width: 100 }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论