chore: 🔨 合并冲突解决
This commit is contained in:
@@ -42,11 +42,7 @@
|
||||
|
||||
<el-table-column label="存储引擎" align="center" prop="engine" />
|
||||
|
||||
<el-table-column
|
||||
label="排序规则"
|
||||
align="center"
|
||||
prop="tableCollation"
|
||||
/>
|
||||
<el-table-column label="排序规则" align="center" prop="tableCollation" />
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" />
|
||||
|
||||
<el-table-column fixed="right" label="操作" width="200">
|
||||
@@ -115,10 +111,7 @@
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="业务名" prop="businessName">
|
||||
<el-input
|
||||
v-model="genConfigFormData.businessName"
|
||||
placeholder="用户"
|
||||
/>
|
||||
<el-input v-model="genConfigFormData.businessName" placeholder="用户" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@@ -126,18 +119,12 @@
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="包名" prop="packageName">
|
||||
<el-input
|
||||
v-model="genConfigFormData.packageName"
|
||||
placeholder="com.youlai.boot"
|
||||
/>
|
||||
<el-input v-model="genConfigFormData.packageName" placeholder="com.youlai.boot" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="模块名" prop="moduleName">
|
||||
<el-input
|
||||
v-model="genConfigFormData.moduleName"
|
||||
placeholder="system"
|
||||
/>
|
||||
<el-input v-model="genConfigFormData.moduleName" placeholder="system" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@@ -145,18 +132,12 @@
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="实体名" prop="entityName">
|
||||
<el-input
|
||||
v-model="genConfigFormData.entityName"
|
||||
placeholder="User"
|
||||
/>
|
||||
<el-input v-model="genConfigFormData.entityName" placeholder="User" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="作者">
|
||||
<el-input
|
||||
v-model="genConfigFormData.author"
|
||||
placeholder="youlai"
|
||||
/>
|
||||
<el-input v-model="genConfigFormData.author" placeholder="youlai" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@@ -256,11 +237,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<el-checkbox
|
||||
v-model="scope.row.isShowInQuery"
|
||||
:true-value="1"
|
||||
:false-value="0"
|
||||
/>
|
||||
<el-checkbox v-model="scope.row.isShowInQuery" :true-value="1" :false-value="0" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
@@ -277,11 +254,7 @@
|
||||
</template>
|
||||
|
||||
<template #default="scope">
|
||||
<el-checkbox
|
||||
v-model="scope.row.isShowInList"
|
||||
:true-value="1"
|
||||
:false-value="0"
|
||||
/>
|
||||
<el-checkbox v-model="scope.row.isShowInList" :true-value="1" :false-value="0" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
@@ -298,11 +271,7 @@
|
||||
</template>
|
||||
|
||||
<template #default="scope">
|
||||
<el-checkbox
|
||||
v-model="scope.row.isShowInForm"
|
||||
:true-value="1"
|
||||
:false-value="0"
|
||||
/>
|
||||
<el-checkbox v-model="scope.row.isShowInForm" :true-value="1" :false-value="0" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
@@ -339,10 +308,7 @@
|
||||
<el-table-column label="表单类型" min-width="120">
|
||||
<template #default="scope">
|
||||
<el-select
|
||||
v-if="
|
||||
scope.row.isShowInQuery === 1 ||
|
||||
scope.row.isShowInForm === 1
|
||||
"
|
||||
v-if="scope.row.isShowInQuery === 1 || scope.row.isShowInForm === 1"
|
||||
v-model="scope.row.formType"
|
||||
placeholder="请选择"
|
||||
>
|
||||
@@ -562,9 +528,7 @@ const initSort = () => {
|
||||
if (sortFlag.value) {
|
||||
return;
|
||||
}
|
||||
const table = document.querySelector(
|
||||
".elTableCustom .el-table__body-wrapper tbody"
|
||||
);
|
||||
const table = document.querySelector(".elTableCustom .el-table__body-wrapper tbody");
|
||||
sortFlag.value = Sortable.create(<HTMLElement>table, {
|
||||
group: "shared",
|
||||
animation: 150,
|
||||
@@ -622,13 +586,7 @@ function handleNextClick() {
|
||||
//这里需要校验基础配置
|
||||
const { tableName, packageName, businessName, moduleName, entityName } =
|
||||
genConfigFormData.value;
|
||||
if (
|
||||
!tableName ||
|
||||
!packageName ||
|
||||
!businessName ||
|
||||
!moduleName ||
|
||||
!entityName
|
||||
) {
|
||||
if (!tableName || !packageName || !businessName || !moduleName || !entityName) {
|
||||
ElMessage.error("表名、业务名、包名、模块名、实体名不能为空");
|
||||
return;
|
||||
}
|
||||
@@ -755,9 +713,7 @@ const toggleCheckAll = (key: FieldConfigKey, value: boolean) => {
|
||||
|
||||
const checkAllSelected = (key: keyof FieldConfig, isCheckAllRef: any) => {
|
||||
const fieldConfigs = genConfigFormData.value?.fieldConfigs || [];
|
||||
isCheckAllRef.value = fieldConfigs.every(
|
||||
(row: FieldConfig) => row[key] === 1
|
||||
);
|
||||
isCheckAllRef.value = fieldConfigs.every((row: FieldConfig) => row[key] === 1);
|
||||
};
|
||||
|
||||
/** 获取生成预览 */
|
||||
@@ -787,9 +743,7 @@ function handlePreview(tableName: string) {
|
||||
* @param data - 数据数组
|
||||
* @returns 树形结构根节点
|
||||
*/
|
||||
function buildTree(
|
||||
data: { path: string; fileName: string; content: string }[]
|
||||
): TreeNode {
|
||||
function buildTree(data: { path: string; fileName: string; content: string }[]): TreeNode {
|
||||
// 动态获取根节点
|
||||
const root: TreeNode = { label: "前后端代码", children: [] };
|
||||
|
||||
@@ -804,11 +758,10 @@ function buildTree(
|
||||
"java",
|
||||
genConfigFormData.value.backendAppName,
|
||||
genConfigFormData.value.frontendAppName,
|
||||
(
|
||||
genConfigFormData.value.packageName +
|
||||
"." +
|
||||
genConfigFormData.value.moduleName
|
||||
).replace(/\./g, separator),
|
||||
(genConfigFormData.value.packageName + "." + genConfigFormData.value.moduleName).replace(
|
||||
/\./g,
|
||||
separator
|
||||
),
|
||||
];
|
||||
|
||||
// 检查路径中的特殊部分并合并它们
|
||||
|
||||
@@ -16,11 +16,7 @@
|
||||
</el-tooltip>
|
||||
</div>
|
||||
|
||||
<el-radio-group
|
||||
v-model="dataRange"
|
||||
size="small"
|
||||
@change="handleDateRangeChange"
|
||||
>
|
||||
<el-radio-group v-model="dataRange" size="small" @change="handleDateRangeChange">
|
||||
<el-radio-button label="近7天" :value="1" />
|
||||
<el-radio-button label="近30天" :value="2" />
|
||||
</el-radio-group>
|
||||
@@ -209,9 +205,7 @@ const handleResize = () => {
|
||||
};
|
||||
/** 初始化图表 */
|
||||
onMounted(() => {
|
||||
chart.value = markRaw(
|
||||
echarts.init(document.getElementById(props.id) as HTMLDivElement)
|
||||
);
|
||||
chart.value = markRaw(echarts.init(document.getElementById(props.id) as HTMLDivElement));
|
||||
loadData();
|
||||
|
||||
window.addEventListener("resize", handleResize);
|
||||
|
||||
@@ -12,20 +12,14 @@
|
||||
/>
|
||||
<div>
|
||||
<p>{{ greetings }}</p>
|
||||
<p class="text-sm text-gray">
|
||||
今日天气晴朗,气温在15℃至25℃之间,东南风。
|
||||
</p>
|
||||
<p class="text-sm text-gray">今日天气晴朗,气温在15℃至25℃之间,东南风。</p>
|
||||
</div>
|
||||
</div>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6" :xs="24">
|
||||
<div class="flex h-full items-center justify-around">
|
||||
<el-statistic
|
||||
v-for="item in statisticData"
|
||||
:key="item.key"
|
||||
:value="item.value"
|
||||
>
|
||||
<el-statistic v-for="item in statisticData" :key="item.key" :value="item.value">
|
||||
<template #title>
|
||||
<div class="flex items-center">
|
||||
<svg-icon :icon-class="item.iconClass" size="20px" />
|
||||
@@ -45,9 +39,7 @@
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<div class="flex-x-between">
|
||||
<span class="text-[var(--el-text-color-secondary)]">
|
||||
在线用户
|
||||
</span>
|
||||
<span class="text-[var(--el-text-color-secondary)]">在线用户</span>
|
||||
<el-tag type="success" size="small">-</el-tag>
|
||||
</div>
|
||||
</template>
|
||||
@@ -56,41 +48,27 @@
|
||||
<span class="text-lg">{{ onlineUserCount }}</span>
|
||||
<svg-icon icon-class="user" size="2em" />
|
||||
</div>
|
||||
<div
|
||||
class="flex-x-between mt-2 text-sm text-[var(--el-text-color-secondary)]"
|
||||
>
|
||||
<div class="flex-x-between mt-2 text-sm text-[var(--el-text-color-secondary)]">
|
||||
<span>总用户数</span>
|
||||
<span>5</span>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
|
||||
<el-col
|
||||
v-for="(item, index) in visitStatsList"
|
||||
:key="index"
|
||||
:xs="24"
|
||||
:sm="12"
|
||||
:lg="6"
|
||||
>
|
||||
<el-col v-for="(item, index) in visitStatsList" :key="index" :xs="24" :sm="12" :lg="6">
|
||||
<el-skeleton :loading="visitStatsLoading" :rows="5" animated>
|
||||
<template #template>
|
||||
<el-card>
|
||||
<template #header>
|
||||
<div>
|
||||
<el-skeleton-item variant="h3" style="width: 40%" />
|
||||
<el-skeleton-item
|
||||
variant="rect"
|
||||
style="float: right; width: 1em; height: 1em"
|
||||
/>
|
||||
<el-skeleton-item variant="rect" style="float: right; width: 1em; height: 1em" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div class="flex-x-between">
|
||||
<el-skeleton-item variant="text" style="width: 30%" />
|
||||
<el-skeleton-item
|
||||
variant="circle"
|
||||
style="width: 2em; height: 2em"
|
||||
/>
|
||||
<el-skeleton-item variant="circle" style="width: 2em; height: 2em" />
|
||||
</div>
|
||||
<div class="mt-5 flex-x-between">
|
||||
<el-skeleton-item variant="text" style="width: 50%" />
|
||||
@@ -114,13 +92,7 @@
|
||||
<div class="flex-x-between mt-2">
|
||||
<div class="flex-y-center">
|
||||
<span class="text-lg">{{ item.todayCount }}</span>
|
||||
<span
|
||||
:class="[
|
||||
'text-xs',
|
||||
'ml-2',
|
||||
getGrowthRateClass(item.growthRate),
|
||||
]"
|
||||
>
|
||||
<span :class="['text-xs', 'ml-2', getGrowthRateClass(item.growthRate)]">
|
||||
<el-icon>
|
||||
<Top v-if="item.growthRate > 0" />
|
||||
<Bottom v-else-if="item.growthRate < 0" />
|
||||
@@ -131,9 +103,7 @@
|
||||
<svg-icon :icon-class="item.icon" size="2em" />
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="flex-x-between mt-2 text-sm text-[var(--el-text-color-secondary)]"
|
||||
>
|
||||
<div class="flex-x-between mt-2 text-sm text-[var(--el-text-color-secondary)]">
|
||||
<span>总{{ item.title }}</span>
|
||||
<span>{{ item.totalCount }}</span>
|
||||
</div>
|
||||
@@ -161,11 +131,7 @@
|
||||
</template>
|
||||
|
||||
<el-scrollbar height="400px">
|
||||
<div
|
||||
v-for="(item, index) in notices"
|
||||
:key="index"
|
||||
class="flex-y-center py-3"
|
||||
>
|
||||
<div v-for="(item, index) in notices" :key="index" class="flex-y-center py-3">
|
||||
<DictLabel v-model="item.type" code="notice_type" size="small" />
|
||||
<el-text
|
||||
truncated
|
||||
@@ -263,11 +229,7 @@ const loadVisitStatsData = async () => {
|
||||
const list: VisitStatsVO[] = await StatsAPI.getVisitStats();
|
||||
|
||||
if (list) {
|
||||
const tagTypes: ("primary" | "success" | "warning")[] = [
|
||||
"primary",
|
||||
"success",
|
||||
"warning",
|
||||
];
|
||||
const tagTypes: ("primary" | "success" | "warning")[] = ["primary", "success", "warning"];
|
||||
const transformedList: VisitStats[] = list.map((item, index) => ({
|
||||
title: item.title,
|
||||
icon: getVisitStatsIcon(item.type),
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
<!-- 接口文档 -->
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<iframe
|
||||
src="http://vapi.youlai.tech/doc.html"
|
||||
width="100%"
|
||||
height="100%"
|
||||
frameborder="0"
|
||||
/>
|
||||
<iframe src="http://vapi.youlai.tech/doc.html" width="100%" height="100%" frameborder="0" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -15,8 +15,7 @@ const contentConfig: IContentConfig = {
|
||||
{
|
||||
id: 1,
|
||||
username: "tom",
|
||||
avatar:
|
||||
"https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif",
|
||||
avatar: "https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif",
|
||||
percent: 99,
|
||||
price: 10,
|
||||
url: "https://www.baidu.com",
|
||||
@@ -30,8 +29,7 @@ const contentConfig: IContentConfig = {
|
||||
{
|
||||
id: 2,
|
||||
username: "jerry",
|
||||
avatar:
|
||||
"https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif",
|
||||
avatar: "https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif",
|
||||
percent: 88,
|
||||
price: 999,
|
||||
url: "https://www.google.com",
|
||||
|
||||
@@ -8,9 +8,7 @@
|
||||
>
|
||||
示例源码 请点击>>>>
|
||||
</el-link>
|
||||
<el-button type="primary" plain round size="small" @click="isA = !isA">
|
||||
切换示例
|
||||
</el-button>
|
||||
<el-button type="primary" plain round size="small" @click="isA = !isA">切换示例</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 列表 -->
|
||||
@@ -146,14 +144,10 @@ function handleOperatClick(data: IOperatData) {
|
||||
console.log(data);
|
||||
// 重置密码
|
||||
if (data.name === "reset_pwd") {
|
||||
ElMessageBox.prompt(
|
||||
"请输入用户「" + data.row.username + "」的新密码",
|
||||
"重置密码",
|
||||
{
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
}
|
||||
).then(({ value }) => {
|
||||
ElMessageBox.prompt("请输入用户「" + data.row.username + "」的新密码", "重置密码", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
}).then(({ value }) => {
|
||||
if (!value || value.length < 6) {
|
||||
ElMessage.warning("密码至少需要6位字符,请重新输入");
|
||||
return false;
|
||||
|
||||
@@ -5,11 +5,7 @@
|
||||
<div class="grid">
|
||||
<div v-for="item of svg_icons" :key="item">
|
||||
<copy-button :text="generateIconCode(item)">
|
||||
<el-tooltip
|
||||
effect="dark"
|
||||
:content="generateIconCode(item)"
|
||||
placement="top"
|
||||
>
|
||||
<el-tooltip effect="dark" :content="generateIconCode(item)" placement="top">
|
||||
<div class="icon-item">
|
||||
<svg-icon :icon-class="item" />
|
||||
<span>{{ item }}</span>
|
||||
@@ -23,11 +19,7 @@
|
||||
<div class="grid">
|
||||
<div v-for="(icon, name) of icons" :key="name">
|
||||
<copy-button :text="generateElementIconCode(name)">
|
||||
<el-tooltip
|
||||
effect="dark"
|
||||
:content="generateElementIconCode(name)"
|
||||
placement="top"
|
||||
>
|
||||
<el-tooltip effect="dark" :content="generateElementIconCode(name)" placement="top">
|
||||
<div class="icon-item">
|
||||
<el-icon :size="20">
|
||||
<component :is="icon" />
|
||||
|
||||
@@ -36,11 +36,7 @@ const text = computed(() => {
|
||||
>
|
||||
示例源码 请点击>>>>
|
||||
</el-link>
|
||||
<table-select
|
||||
:text="text"
|
||||
:select-config="selectConfig"
|
||||
@confirm-click="handleConfirm"
|
||||
>
|
||||
<table-select :text="text" :select-config="selectConfig" @confirm-click="handleConfirm">
|
||||
<template #status="scope">
|
||||
<el-tag :type="scope.row[scope.prop] == 1 ? 'success' : 'info'">
|
||||
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
||||
|
||||
@@ -15,9 +15,6 @@ const value = ref("初始内容");
|
||||
>
|
||||
示例源码 请点击>>>>
|
||||
</el-link>
|
||||
<editor
|
||||
v-model="value"
|
||||
style="z-index: 99999; height: calc(100vh - 180px)"
|
||||
/>
|
||||
<editor v-model="value" style="z-index: 99999; height: calc(100vh - 180px)" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -22,19 +22,13 @@
|
||||
>
|
||||
连接
|
||||
</el-button>
|
||||
<el-button
|
||||
type="danger"
|
||||
:disabled="!isConnected"
|
||||
@click="disconnectWebSocket"
|
||||
>
|
||||
<el-button type="danger" :disabled="!isConnected" @click="disconnectWebSocket">
|
||||
断开
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="8" class="text-right">
|
||||
连接状态:
|
||||
<el-tag v-if="isConnected" class="ml-2" type="success">
|
||||
已连接
|
||||
</el-tag>
|
||||
<el-tag v-if="isConnected" class="ml-2" type="success">已连接</el-tag>
|
||||
<el-tag v-else class="ml-2" type="info">已断开</el-tag>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@@ -60,9 +54,7 @@
|
||||
<el-input v-model="receiver" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="sendToUser">
|
||||
发送点对点消息
|
||||
</el-button>
|
||||
<el-button type="primary" @click="sendToUser">发送点对点消息</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
@@ -78,17 +70,14 @@
|
||||
'tip-message': message.type === 'tip',
|
||||
message: message.type !== 'tip',
|
||||
'message--sent': message.sender === userStore.userInfo.username,
|
||||
'message--received':
|
||||
message.sender !== userStore.userInfo.username,
|
||||
'message--received': message.sender !== userStore.userInfo.username,
|
||||
}"
|
||||
>
|
||||
<div v-if="message.type != 'tip'" class="message-content">
|
||||
<div
|
||||
:class="{
|
||||
'message-sender':
|
||||
message.sender === userStore.userInfo.username,
|
||||
'message-receiver':
|
||||
message.sender !== userStore.userInfo.username,
|
||||
'message-sender': message.sender === userStore.userInfo.username,
|
||||
'message-receiver': message.sender !== userStore.userInfo.username,
|
||||
}"
|
||||
>
|
||||
{{ message.sender }}
|
||||
@@ -124,16 +113,10 @@ interface MessageType {
|
||||
|
||||
const messages = ref<MessageType[]>([]);
|
||||
|
||||
const topicMessage = ref(
|
||||
"亲爱的大冤种们,由于一只史诗级的BUG,系统版本已经被迫回退到了0.0.1。"
|
||||
); // 广播消息
|
||||
const topicMessage = ref("亲爱的大冤种们,由于一只史诗级的BUG,系统版本已经被迫回退到了0.0.1。"); // 广播消息
|
||||
|
||||
const queneMessage = ref(
|
||||
"hi , " +
|
||||
receiver.value +
|
||||
" , 我是" +
|
||||
userStore.userInfo.username +
|
||||
" , 想和你交个朋友 ! "
|
||||
"hi , " + receiver.value + " , 我是" + userStore.userInfo.username + " , 想和你交个朋友 ! "
|
||||
);
|
||||
|
||||
let stompClient: Client;
|
||||
|
||||
@@ -8,8 +8,7 @@ defineOptions({
|
||||
|
||||
const state = reactive({
|
||||
errGif: new URL("../../assets/images/401.gif", import.meta.url).href,
|
||||
ewizardClap:
|
||||
"https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646",
|
||||
ewizardClap: "https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646",
|
||||
dialogVisible: false,
|
||||
});
|
||||
|
||||
@@ -24,9 +23,7 @@ function back() {
|
||||
|
||||
<template>
|
||||
<div class="page-container">
|
||||
<el-button icon="el-icon-arrow-left" class="pan-back-btn" @click="back">
|
||||
返回
|
||||
</el-button>
|
||||
<el-button icon="el-icon-arrow-left" class="pan-back-btn" @click="back">返回</el-button>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<h1 class="text-jumbo text-ginormous">Oops!</h1>
|
||||
@@ -49,12 +46,7 @@ function back() {
|
||||
</ul>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<img
|
||||
:src="errGif"
|
||||
width="313"
|
||||
height="428"
|
||||
alt="Girl has dropped her ice cream."
|
||||
/>
|
||||
<img :src="errGif" width="313" height="428" alt="Girl has dropped her ice cream." />
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-dialog v-model="dialogVisible" title="随便看">
|
||||
|
||||
@@ -16,44 +16,22 @@ function back() {
|
||||
<div class="page-container">
|
||||
<div class="pic-404">
|
||||
<img class="pic-404__parent" src="@/assets/images/404.png" alt="404" />
|
||||
<img
|
||||
class="pic-404__child left"
|
||||
src="@/assets/images/404_cloud.png"
|
||||
alt="404"
|
||||
/>
|
||||
<img
|
||||
class="pic-404__child mid"
|
||||
src="@/assets/images/404_cloud.png"
|
||||
alt="404"
|
||||
/>
|
||||
<img
|
||||
class="pic-404__child right"
|
||||
src="@/assets/images/404_cloud.png"
|
||||
alt="404"
|
||||
/>
|
||||
<img class="pic-404__child left" src="@/assets/images/404_cloud.png" alt="404" />
|
||||
<img class="pic-404__child mid" src="@/assets/images/404_cloud.png" alt="404" />
|
||||
<img class="pic-404__child right" src="@/assets/images/404_cloud.png" alt="404" />
|
||||
</div>
|
||||
<div class="bullshit">
|
||||
<div class="bullshit__oops">OOPS!</div>
|
||||
<div class="bullshit__info">
|
||||
All rights reserved
|
||||
<a
|
||||
style="color: #20a0ff"
|
||||
href="https://wallstreetcn.com"
|
||||
target="_blank"
|
||||
>
|
||||
wallstreetcn
|
||||
</a>
|
||||
</div>
|
||||
<div class="bullshit__headline">
|
||||
The webmaster said that you can not enter this page...
|
||||
<a style="color: #20a0ff" href="https://wallstreetcn.com" target="_blank">wallstreetcn</a>
|
||||
</div>
|
||||
<div class="bullshit__headline">The webmaster said that you can not enter this page...</div>
|
||||
<div class="bullshit__info">
|
||||
Please check that the URL you entered is correct, or click the button
|
||||
below to return to the homepage.
|
||||
Please check that the URL you entered is correct, or click the button below to return to the
|
||||
homepage.
|
||||
</div>
|
||||
<a href="#" class="bullshit__return-home" @click.prevent="back">
|
||||
Back to home
|
||||
</a>
|
||||
<a href="#" class="bullshit__return-home" @click.prevent="back">Back to home</a>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -38,19 +38,13 @@
|
||||
</el-tag>
|
||||
</el-dropdown-item>
|
||||
|
||||
<el-dropdown-item
|
||||
@click="setLoginCredentials('root', '123456')"
|
||||
>
|
||||
<el-dropdown-item @click="setLoginCredentials('root', '123456')">
|
||||
超级管理员:root/123456
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item
|
||||
@click="setLoginCredentials('admin', '123456')"
|
||||
>
|
||||
<el-dropdown-item @click="setLoginCredentials('admin', '123456')">
|
||||
系统管理员:admin/123456
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item
|
||||
@click="setLoginCredentials('test', '123456')"
|
||||
>
|
||||
<el-dropdown-item @click="setLoginCredentials('test', '123456')">
|
||||
测试小游客:test/123456
|
||||
</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
@@ -76,11 +70,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<!-- 密码 -->
|
||||
<el-tooltip
|
||||
:visible="isCapslock"
|
||||
:content="$t('login.capsLock')"
|
||||
placement="right"
|
||||
>
|
||||
<el-tooltip :visible="isCapslock" :content="$t('login.capsLock')" placement="right">
|
||||
<el-form-item prop="password">
|
||||
<div class="input-wrapper">
|
||||
<el-icon class="mx-2">
|
||||
@@ -114,11 +104,7 @@
|
||||
@keyup.enter="handleLoginSubmit"
|
||||
/>
|
||||
|
||||
<el-image
|
||||
:src="captchaBase64"
|
||||
class="captcha-img"
|
||||
@click="getCaptcha"
|
||||
/>
|
||||
<el-image :src="captchaBase64" class="captcha-img" @click="getCaptcha" />
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
@@ -161,11 +147,7 @@
|
||||
<div class="login-footer">
|
||||
<el-text size="small">
|
||||
Copyright © 2021 - 2024 youlai.tech All Rights Reserved.
|
||||
<el-link
|
||||
:underline="false"
|
||||
href="http://beian.miit.gov.cn/"
|
||||
target="_blank"
|
||||
>
|
||||
<el-link :underline="false" href="http://beian.miit.gov.cn/" target="_blank">
|
||||
皖ICP备20006496号-2
|
||||
</el-link>
|
||||
</el-text>
|
||||
@@ -200,9 +182,7 @@ const isCapslock = ref(false); // 是否大写锁定
|
||||
const captchaBase64 = ref(); // 验证码图片Base64字符串
|
||||
|
||||
const logo = ref(new URL("../../assets/logo.png", import.meta.url).href);
|
||||
const loginImage = ref(
|
||||
new URL("../../assets/images/login-image.svg", import.meta.url).href
|
||||
);
|
||||
const loginImage = ref(new URL("../../assets/images/login-image.svg", import.meta.url).href);
|
||||
|
||||
const loginData = ref<LoginData>({
|
||||
username: "admin",
|
||||
@@ -300,8 +280,7 @@ function parseRedirect(): {
|
||||
|
||||
// 主题切换
|
||||
const toggleTheme = () => {
|
||||
const newTheme =
|
||||
settingsStore.theme === ThemeEnum.DARK ? ThemeEnum.LIGHT : ThemeEnum.DARK;
|
||||
const newTheme = settingsStore.theme === ThemeEnum.DARK ? ThemeEnum.LIGHT : ThemeEnum.DARK;
|
||||
settingsStore.changeTheme(newTheme);
|
||||
};
|
||||
|
||||
@@ -332,8 +311,7 @@ onMounted(() => {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
background: url("@/assets/images/login-background-light.jpg") no-repeat center
|
||||
right;
|
||||
background: url("@/assets/images/login-background-light.jpg") no-repeat center right;
|
||||
|
||||
.login-header {
|
||||
position: absolute;
|
||||
@@ -471,8 +449,7 @@ onMounted(() => {
|
||||
|
||||
html.dark {
|
||||
.login {
|
||||
background: url("@/assets/images/login-background-dark.jpg") no-repeat
|
||||
center right;
|
||||
background: url("@/assets/images/login-background-dark.jpg") no-repeat center right;
|
||||
|
||||
.login-content {
|
||||
background: transparent;
|
||||
|
||||
@@ -16,12 +16,7 @@
|
||||
size="small"
|
||||
@click="triggerFileUpload"
|
||||
/>
|
||||
<input
|
||||
ref="fileInput"
|
||||
type="file"
|
||||
style="display: none"
|
||||
@change="handleFileChange"
|
||||
/>
|
||||
<input ref="fileInput" type="file" style="display: none" @change="handleFileChange" />
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
{{ userProfile.nickname }}
|
||||
@@ -41,10 +36,7 @@
|
||||
用户名
|
||||
</template>
|
||||
{{ userProfile.username }}
|
||||
<el-icon
|
||||
v-if="userProfile.gender === 1"
|
||||
class="align-middle color-blue"
|
||||
>
|
||||
<el-icon v-if="userProfile.gender === 1" class="align-middle color-blue">
|
||||
<Male />
|
||||
</el-icon>
|
||||
<el-icon v-else class="align-middle color-pink">
|
||||
@@ -117,9 +109,7 @@
|
||||
<div class="mt-5">
|
||||
<div class="font-bold">绑定手机</div>
|
||||
<div class="text-14px mt-2">
|
||||
<span v-if="userProfile.mobile">
|
||||
已绑定手机号:{{ userProfile.mobile }}
|
||||
</span>
|
||||
<span v-if="userProfile.mobile">已绑定手机号:{{ userProfile.mobile }}</span>
|
||||
<span v-else>未绑定手机</span>
|
||||
<el-button
|
||||
v-if="userProfile.mobile"
|
||||
@@ -147,9 +137,7 @@
|
||||
<div class="mt-5">
|
||||
<div class="font-bold">绑定邮箱</div>
|
||||
<div class="text-14px mt-2">
|
||||
<span v-if="userProfile.email">
|
||||
已绑定邮箱:{{ userProfile.email }}
|
||||
</span>
|
||||
<span v-if="userProfile.email">已绑定邮箱:{{ userProfile.email }}</span>
|
||||
<span v-else>未绑定邮箱</span>
|
||||
<el-button
|
||||
v-if="userProfile.email"
|
||||
@@ -203,25 +191,13 @@
|
||||
:label-width="100"
|
||||
>
|
||||
<el-form-item label="原密码" prop="oldPassword">
|
||||
<el-input
|
||||
v-model="passwordChangeForm.oldPassword"
|
||||
type="password"
|
||||
show-password
|
||||
/>
|
||||
<el-input v-model="passwordChangeForm.oldPassword" type="password" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item label="新密码" prop="newPassword">
|
||||
<el-input
|
||||
v-model="passwordChangeForm.newPassword"
|
||||
type="password"
|
||||
show-password
|
||||
/>
|
||||
<el-input v-model="passwordChangeForm.newPassword" type="password" show-password />
|
||||
</el-form-item>
|
||||
<el-form-item label="确认密码" prop="confirmPassword">
|
||||
<el-input
|
||||
v-model="passwordChangeForm.confirmPassword"
|
||||
type="password"
|
||||
show-password
|
||||
/>
|
||||
<el-input v-model="passwordChangeForm.confirmPassword" type="password" show-password />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<!-- 绑定手机 -->
|
||||
@@ -243,11 +219,7 @@
|
||||
:disabled="mobileCountdown > 0"
|
||||
@click="handleSendVerificationCode('MOBILE')"
|
||||
>
|
||||
{{
|
||||
mobileCountdown > 0
|
||||
? `${mobileCountdown}s后重新发送`
|
||||
: "发送验证码"
|
||||
}}
|
||||
{{ mobileCountdown > 0 ? `${mobileCountdown}s后重新发送` : "发送验证码" }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
@@ -273,11 +245,7 @@
|
||||
:disabled="emailCountdown > 0"
|
||||
@click="handleSendVerificationCode('EMAIL')"
|
||||
>
|
||||
{{
|
||||
emailCountdown > 0
|
||||
? `${emailCountdown}s后重新发送`
|
||||
: "发送验证码"
|
||||
}}
|
||||
{{ emailCountdown > 0 ? `${emailCountdown}s后重新发送` : "发送验证码" }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
@@ -336,9 +304,7 @@ const emailTimer = ref<NodeJS.Timeout | null>(null);
|
||||
const passwordChangeRules = {
|
||||
oldPassword: [{ required: true, message: "请输入原密码", trigger: "blur" }],
|
||||
newPassword: [{ required: true, message: "请输入新密码", trigger: "blur" }],
|
||||
confirmPassword: [
|
||||
{ required: true, message: "请再次输入新密码", trigger: "blur" },
|
||||
],
|
||||
confirmPassword: [{ required: true, message: "请再次输入新密码", trigger: "blur" }],
|
||||
};
|
||||
|
||||
// 手机号校验规则
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
v-hasPerm="['sys:dept:add']"
|
||||
type="success"
|
||||
icon="plus"
|
||||
@click="handleOpenDialog(0, undefined)"
|
||||
@click="handleOpenDialog()"
|
||||
>
|
||||
新增
|
||||
</el-button>
|
||||
|
||||
@@ -32,12 +32,8 @@
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="发布状态:">
|
||||
<el-tag v-if="notice.publishStatus == 0" type="info">未发布</el-tag>
|
||||
<el-tag v-else-if="notice.publishStatus == 1" type="success">
|
||||
已发布
|
||||
</el-tag>
|
||||
<el-tag v-else-if="notice.publishStatus == -1" type="warning">
|
||||
已撤回
|
||||
</el-tag>
|
||||
<el-tag v-else-if="notice.publishStatus == 1" type="success">已发布</el-tag>
|
||||
<el-tag v-else-if="notice.publishStatus == -1" type="warning">已撤回</el-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="发布人:">
|
||||
{{ notice.publisherName }}
|
||||
|
||||
@@ -95,9 +95,7 @@ const handleFileExceed = () => {
|
||||
const handleDownloadTemplate = () => {
|
||||
UserAPI.downloadTemplate().then((response: any) => {
|
||||
const fileData = response.data;
|
||||
const fileName = decodeURI(
|
||||
response.headers["content-disposition"].split(";")[1].split("=")[1]
|
||||
);
|
||||
const fileName = decodeURI(response.headers["content-disposition"].split(";")[1].split("=")[1]);
|
||||
const fileType =
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user