micro fixs, update database SQL file

This commit is contained in:
RockYang
2024-12-27 17:02:27 +08:00
parent 2ba3c52e6e
commit 488169683f
25 changed files with 1190 additions and 329 deletions

View File

@@ -3,20 +3,8 @@
<a class="file-upload-img" @click="fetchFiles(1)">
<i class="iconfont icon-attachment-st"></i>
</a>
<el-dialog
class="file-list-dialog"
v-model="show"
:close-on-click-modal="true"
:show-close="true"
:width="800"
title="文件管理"
>
<el-scrollbar
ref="scrollbarRef"
max-height="80vh"
style="height: 100%"
@scroll="onScroll"
>
<el-dialog class="file-list-dialog" v-model="show" :close-on-click-modal="true" :show-close="true" :width="800" title="文件管理">
<el-scrollbar ref="scrollbarRef" max-height="80vh" style="height: 100%" @scroll="onScroll">
<div class="file-list">
<el-row :gutter="20">
<el-col :span="3">
@@ -36,43 +24,18 @@
</el-col>
<el-col :span="3" v-for="file in fileData.items" :key="file.url">
<div class="grid-content">
<el-tooltip
class="box-item"
effect="dark"
:content="file.name"
placement="top"
>
<el-image
:src="file.url"
fit="cover"
v-if="isImage(file.ext)"
@click="insertURL(file)"
/>
<el-image
:src="GetFileIcon(file.ext)"
fit="cover"
v-else
@click="insertURL(file)"
/>
<el-tooltip class="box-item" effect="dark" :content="file.name" placement="top">
<el-image :src="file.url" fit="cover" v-if="isImage(file.ext)" @click="insertURL(file)" />
<el-image :src="GetFileIcon(file.ext)" fit="cover" v-else @click="insertURL(file)" />
</el-tooltip>
<div class="opt">
<el-button
type="danger"
size="small"
:icon="Delete"
@click="removeFile(file)"
circle
/>
<el-button type="danger" size="small" :icon="Delete" @click="removeFile(file)" circle />
</div>
</div>
</el-col>
</el-row>
<el-row
justify="center"
v-if="!fileData.isLastPage"
@click="fetchFiles(fileData.page)"
>
<el-row justify="center" v-if="!fileData.isLastPage" @click="fetchFiles(fileData.page)">
<el-link>加载更多</el-link>
</el-row>
</div>
@@ -88,9 +51,10 @@ import { httpGet, httpPost } from "@/utils/http";
import { Delete, Plus } from "@element-plus/icons-vue";
import { isImage, removeArrayItem } from "@/utils/libs";
import { GetFileIcon } from "@/store/system";
import { checkSession } from "@/store/cache";
import { useSharedStore } from "@/store/sharedata";
const props = defineProps({
userId: Number
userId: Number,
});
const emits = defineEmits(["selected"]);
const show = ref(false);
@@ -98,28 +62,37 @@ const scrollbarRef = ref(null);
const fileData = reactive({
items: [],
page: 1,
isLastPage: true
isLastPage: true,
});
const store = useSharedStore();
const fetchFiles = (pageNo) => {
if (pageNo === 1) show.value = true;
httpPost("/api/upload/list", { page: pageNo || 1, page_size: 30 })
.then((res) => {
const { items, page, total_page } = res.data;
checkSession()
.then(() => {
show.value = true;
httpPost("/api/upload/list", { page: pageNo || 1, page_size: 30 })
.then((res) => {
const { items, page, total_page } = res.data;
if (page === 1) {
fileData.items = items;
} else {
fileData.items = [...fileData.items, ...items];
}
if (page === 1) {
fileData.items = items;
} else {
fileData.items = [...fileData.items, ...items];
}
fileData.isLastPage = page === total_page;
fileData.isLastPage = page === total_page;
if (!fileData.isLastPage) {
fileData.page = page + 1;
}
if (!fileData.isLastPage) {
fileData.page = page + 1;
}
})
.catch((e) => {
showMessageError("获取文件列表失败:" + e.message);
});
})
.catch(() => {});
.catch(() => {
store.setShowLoginDialog(true);
});
};
// el-scrollbar 滚动回调

View File

@@ -1,5 +1,5 @@
<template>
<div class="login-dialog w-full p-8">
<div class="login-dialog w-full">
<div class="login-box" v-if="login">
<el-form :model="data" class="form">
<div class="block">
@@ -292,10 +292,10 @@ const submit = (verifyData) => {
// 登录操作
const submitLogin = () => {
if (data.value.username === "") {
if (!data.value.username) {
return ElMessage.error("请输入用户名");
}
if (data.value.password === "") {
if (!data.value.password) {
return ElMessage.error("请输入密码");
}
if (enableVerify.value) {

View File

@@ -1,66 +1,29 @@
<template>
<el-dialog
class="config-dialog"
v-model="showDialog"
:close-on-click-modal="true"
:before-close="close"
style="max-width: 600px"
title="账户信息"
>
<div class="user-info" id="user-info">
<el-form v-if="user.id" :model="user" label-width="150px">
<el-form-item label="账户">
<span>{{ user.username }}</span>
</el-form-item>
<el-form-item label="剩余算力">
<el-tag>{{ user['power'] }}</el-tag>
</el-form-item>
<el-form-item label="会员到期时间" v-if="user['expired_time'] > 0">
<el-tag type="danger">{{ dateFormat(user['expired_time']) }}</el-tag>
</el-form-item>
</el-form>
<el-dialog class="config-dialog" v-model="showDialog" :close-on-click-modal="true" :before-close="close" style="max-width: 400px" title="账户信息">
<div class="flex-center-col p-4 pt-0" id="user-info">
<user-profile @hide="close" />
</div>
</el-dialog>
</template>
<script setup>
import {computed, onMounted, ref} from "vue"
import {httpGet} from "@/utils/http";
import {ElMessage} from "element-plus";
import {dateFormat} from "@/utils/libs";
import { computed } from "vue";
import UserProfile from "@/components/UserProfile.vue";
// eslint-disable-next-line no-undef
const props = defineProps({
show: Boolean,
user: Object,
models: Array,
});
const showDialog = computed(() => {
return props.show
})
const user = ref({
username: '',
nickname: '',
avatar: '',
calls: 0,
tokens: 0,
})
onMounted(() => {
// 获取最新用户信息
httpGet('/api/user/profile').then(res => {
user.value = res.data
}).catch(e => {
ElMessage.error("获取用户信息失败:" + e.message)
});
})
return props.show;
});
// eslint-disable-next-line no-undef
const emits = defineEmits(['hide']);
const emits = defineEmits(["hide"]);
const close = function () {
emits('hide', false);
}
emits("hide", false);
};
</script>
<style lang="stylus">
@@ -68,23 +31,6 @@ const close = function () {
.el-dialog {
--el-dialog-width 90%;
max-width 800px;
.el-dialog__body {
overflow-y auto;
.user-info {
position relative;
.el-message {
position: absolute;
}
}
.tip {
color #c1c1c1
font-size 12px;
}
}
}
}
</style>
</style>

View File

@@ -1,20 +1,11 @@
<template>
<div class="user-info" id="user-info">
<el-form :model="user" label-width="100px">
<div class="user-info flex-center-col" id="user-info">
<el-form :model="user" label-width="80px" label-position="left">
<el-row>
<el-upload
class="avatar-uploader"
:auto-upload="true"
:show-file-list="false"
:http-request="afterRead"
accept=".png,.jpg,.jpeg,.bmp"
>
<el-avatar
v-if="user.avatar"
:src="user.avatar"
shape="circle"
:size="100"
/>
<el-upload class="avatar-uploader" :auto-upload="true" :show-file-list="false" :http-request="afterRead" accept=".png,.jpg,.jpeg,.bmp">
<el-tooltip content="点击上传头像" placement="top" v-if="user.avatar">
<el-avatar :src="user.avatar" shape="circle" :size="100" />
</el-tooltip>
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
@@ -26,22 +17,14 @@
<el-form-item label="账号">
<div class="flex">
<span>{{ user.username }}</span>
<el-tooltip
class="box-item"
content="您已经是 VIP 会员"
placement="right"
>
<span class="vip-icon"
><el-image
v-if="user.vip"
:src="vipImg"
style="height: 25px; margin-left: 10px"
/></span>
<el-tooltip class="box-item" content="您已经是 VIP 会员" placement="right">
<span class="vip-icon"><el-image v-if="user.vip" :src="vipImg" class="rounded-full ml-1 size-5" /></span>
</el-tooltip>
</div>
</el-form-item>
<el-form-item label="剩余算力">
<el-text type="warning">{{ user["power"] }}</el-text>
<el-tag type="info" size="small" class="ml-2 cursor-pointer" @click="gotoLog">算力日志</el-tag>
</el-form-item>
<el-form-item label="会员到期时间" v-if="user['expired_time'] > 0">
<el-tag type="danger">{{ dateFormat(user["expired_time"]) }}</el-tag>
@@ -62,17 +45,19 @@ import { Plus } from "@element-plus/icons-vue";
import Compressor from "compressorjs";
import { dateFormat } from "@/utils/libs";
import { checkSession } from "@/store/cache";
import { useRouter } from "vue-router";
const user = ref({
vip: false,
username: "演示数据",
nickname: "演示数据",
avatar: "/images/menu/member.png",
mobile: "演示数据",
power: 99999
power: 99999,
});
const vipImg = ref("/images/menu/member.png");
const vipImg = ref("/images/menu/member.png");
const router = useRouter();
const emits = defineEmits(["hide"]);
onMounted(() => {
checkSession()
.then(() => {
@@ -109,7 +94,7 @@ const afterRead = (file) => {
},
error(err) {
console.log(err.message);
}
},
});
};
@@ -122,11 +107,15 @@ const save = () => {
ElMessage.error("更新失败:" + e.message);
});
};
const gotoLog = () => {
router.push("/powerLog");
emits("hide", false);
};
</script>
<style lang="stylus" scoped>
.user-info {
padding 20px 0
.el-row {
justify-content center
@@ -139,7 +128,6 @@ const save = () => {
}
.opt-line {
padding-top 20px
.el-button {
width 100%

View File

@@ -1,7 +1,7 @@
<template>
<div :class="'sidebar ' + theme">
<a class="logo w-full flex items-center" href="/" target="_blank">
<img :src="logo" style="height: 36px" />
<img :src="logo" />
<span class="text" v-show="!sidebar.collapse">{{ title }}</span>
</a>
@@ -213,19 +213,17 @@ setMenuItems(items);
.logo {
display flex
background-color #324157
padding 6px 15px;
cursor pointer
background-color: #324157
.el-image {
width 36px;
img {
height 36px;
padding-top 5px;
border-radius 100%
.el-image__inner {
height 40px
}
background #fff
border 2px solid #754ff6
padding 2px
}
.text {