删除 More/t.php.bak

This commit is contained in:
2025-10-17 23:32:12 +08:00
committed by cssfw
parent 917d269c83
commit 1f5ac5e0ca
79 changed files with 13493 additions and 0 deletions

Binary file not shown.

Binary file not shown.

1058
Dashboard/app.css Normal file

File diff suppressed because it is too large Load Diff

1058
Dashboard/app.css.bak Normal file

File diff suppressed because it is too large Load Diff

93
Dashboard/app.js Normal file
View File

@@ -0,0 +1,93 @@
// app.js
const { createApp } = Vue;
const { ElButton, ElMessage, ElInput, ElCard, ElRow, ElForm, ElFormItem, ElDivider, ElLoading } = ElementPlus;
const app = createApp({
data() {
return {
userlogo: null,
UserInfo: null,
page: null,
purchases: null,
cart: null,
ld: true,
}
},
async mounted() {
// 生命周期钩子 - 挂载后
console.log('应用已挂载');
this.getinfo();
},
methods: {
go(link) {
Message.info('跳转中...');
window.location.href = link;
},
viewcart() {
this.ldo();
axios.get('/Main/GetGoods/')
.then(response => {
this.ldx();
this.cart = response.data;
this.cart_fid = Object.keys(this.cart)[0];
})
},
ldo() {
this.ld = true;
},
ldx() {
this.ld = false;
},
getinfo() {
this.ldo();
axios.get('/Main/GetInfo/')
.then(response => {
this.ldx();
Message.closeAll();
if (response.data.code === 200) {
this.UserInfo = response.data.msg;
this.page = "home";
if (response.data.msg.qq != null) {
this.userlogo = "https://q1.qlogo.cn/g?b=qq&nk="+response.data.msg.qq+"&s=640";
}
} else {
Message.warning('请先登陆');
// 1 秒后跳转到指定页面
setTimeout(function() {
window.location.href = "/Main/Login";
}, 2000); // 1000 毫秒 = 1 秒
}
})
},
getpurchases() {
this.ldo();
axios.get('/Main/GetProducts/')
.then(response => {
this.ldx();
if (response.data.code === 200) {
this.purchases = response.data.msg;
} else {
Message.warning('获取业务失败');
}
})
},
}
});
// 挂载到DOM元素
app.use(ElementPlus);
app.mount('#app');

91
Dashboard/app.js.bak Normal file
View File

@@ -0,0 +1,91 @@
// app.js
const { createApp } = Vue;
const { ElButton, ElMessage, ElInput, ElCard, ElRow, ElForm, ElFormItem, ElDivider, ElLoading } = ElementPlus;
const app = createApp({
data() {
return {
userlogo: null,
UserInfo: null,
page: null,
purchases: null,
cart: null,
ld: true,
}
},
async mounted() {
// 生命周期钩子 - 挂载后
console.log('应用已挂载');
this.getinfo();
},
methods: {
go(link) {
Message.info('跳转中...');
window.location.href = link;
},
viewcart() {
axios.get('/Main/GetGoods/')
.then(response => {
this.cart = response.data;
this.cart_fid = Object.keys(this.cart)[0];
})
},
ldo() {
this.ld = true;
},
ldx() {
this.ld = false;
},
getinfo() {
this.ldo();
axios.get('/Main/GetInfo/')
.then(response => {
this.ldx();
Message.closeAll();
if (response.data.code === 200) {
this.UserInfo = response.data.msg;
this.page = "home";
if (response.data.msg.qq != null) {
this.userlogo = "https://q1.qlogo.cn/g?b=qq&nk="+response.data.msg.qq+"&s=640";
}
} else {
Message.warning('请先登陆');
// 1 秒后跳转到指定页面
setTimeout(function() {
window.location.href = "/Main/Login";
}, 2000); // 1000 毫秒 = 1 秒
}
})
},
getpurchases() {
this.ldo();
axios.get('/Main/GetProducts/')
.then(response => {
this.ldx();
if (response.data.code === 200) {
this.purchases = response.data.msg;
} else {
Message.warning('获取业务失败');
}
})
},
}
});
// 挂载到DOM元素
app.use(ElementPlus);
app.mount('#app');

49
Dashboard/b.php Normal file
View File

@@ -0,0 +1,49 @@
<?php
header('Content-Type: application/json');
function fetchBingResults($query) {
$url = "https://www.bing.com/search?q=" . urlencode($query) . "&count=10";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
$html = curl_exec($ch);
curl_close($ch);
if (!$html) return [];
$dom = new DOMDocument();
@$dom->loadHTML($html);
$results = [];
$blocks = $dom->getElementsByTagName('div')->item(0)->getElementsByTagName('div');
foreach ($blocks as $block) {
$title = $block->getElementsByTagName('h2')->item(0)->textContent;
$link = $block->getElementsByTagName('a')->item(0)->getAttribute('href');
$description = $block->getElementsByTagName('p')->item(0)->textContent;
$results[] = [
'title' => trim($title),
'link' => trim($link),
'description' => trim($description),
'icon' => null // 网页版Bing不显示图标
];
}
return $results;
}
$searchTerm = isset($_GET['p']) ? $_GET['p'] : 'Kentucky';
$results = fetchBingResults($searchTerm);
$response = [
'results' => $results,
'total' => count($results),
'max_page' => 1
];
echo json_encode($response);
?>

49
Dashboard/bing.html Normal file
View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FuxSo</title>
<link rel="stylesheet" href="app.css" /> <!-- 移动到head内部 -->
</head>
<body class="container">
<div id="app">
<transition name="fade-blur">
<div v-if="s">
<div class="form-container min">
<h3 style="margin:0 0 16px;">Bing搜索</h3>
<label>关键字</label>
<input v-model="w" placeholder="请输入关键字"/>
<button @click="search">提交</button>
</div>
<div v-for="m in d" class="card min">
<div class="header">
<div class="icon-wrapper">
<img class="icon" :src="m.icon">
</div>
<div class="title-group">
<h2 class="title">{{ m.title }}</h2>
<a :href="m.link" class="status">
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
<circle cx="12" cy="12" r="10" />
</svg>
前往
</a>
</div>
</div>
<div class="detail-grid">
<div class="detail-item">
<span class="label">{{ m.description }}</span>
</div>
</div> <!-- 删除多余的闭合标签 -->
</div>
</transition>
</div>
<!-- 依赖库 -->
<script src="https://cdn.fss.fuxsto.cn/d/axios@1.7.9/dist/axios.min.js"></script>
<script src="https://cdn.fss.fuxsto.cn/d/vue@3.5.13/dist/vue.global.prod.js"></script>
<script src="msg.js"></script>
<script src="bing.js"></script>
</body>
</html>

53
Dashboard/bing.html.bak Normal file
View File

@@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FuxSo</title>
<link rel="stylesheet" href="app.css" /> <!-- 移动到head内部 -->
</head>
<body class="container">
<div id="app">
<transition name="fade-blur">
<div v-if="s">
<div class="form-container min">
<h3 style="margin:0 0 16px;">Bing搜索</h3>
<label>关键字</label>
<input v-model="w" placeholder="请输入关键字"/>
<button @click="search">提交</button>
</div>
<div v-for="m in d" class="card min">
<div class="header">
<div class="icon-wrapper">
<img class="icon" :src="m.icon">
</div>
<div class="title-group">
<h2 class="title">{{ m.title }}</h2>
<a :href="m.link" class="status">
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
<circle cx="12" cy="12" r="10" />
</svg>
前往
</a>
</div>
</div>
<div class="detail-grid">
<div class="detail-item">
<span class="label">{{ m.description }}</span>
</div>
</div> <!-- 删除多余的闭合标签 -->
</div>
</transition>
</div>
<!-- 依赖库 -->
<script src="https://cdn.fss.fuxsto.cn/d/ajax/libs/eruda/eruda.js"></script>
<script>
eruda.init();
</script>
<script src="https://cdn.fss.fuxsto.cn/d/axios@1.7.9/dist/axios.min.js"></script>
<script src="https://cdn.fss.fuxsto.cn/d/vue@3.5.13/dist/vue.global.prod.js"></script>
<script src="msg.js"></script>
<script src="bing.js"></script>
</body>
</html>

49
Dashboard/bing.js Normal file
View File

@@ -0,0 +1,49 @@
// app.js
const { createApp } = Vue;
const app = createApp({
data() {
return {
w: null,
p: null,
d: null,
s: true,
}
},
async mounted() {
// 生命周期钩子 - 挂载后
console.log('应用已挂载');
},
methods: {
search() {
Message.info('正在请求...', { duration: 5000000000000000 });
this.s = false;
axios.get('https://zk.aoidc.top/api/api.php?q='+this.w)
.then(response => {
Message.closeAll();
this.s = true;
if (response.data.results != null) {
this.d = response.data.results;
this.s = true;
Message.success('已载入~', { duration: 2000 });
console.log(this.d);
} else {
Message.warning('失败', { duration: 2000 });
}
})
},
}
});
// 挂载到DOM元素
app.mount('#app');

47
Dashboard/bing.js.bak Normal file
View File

@@ -0,0 +1,47 @@
// app.js
const { createApp } = Vue;
const app = createApp({
data() {
return {
w: null,
p: null,
d: null,
s: true,
}
},
async mounted() {
// 生命周期钩子 - 挂载后
console.log('应用已挂载');
},
methods: {
search() {
Message.info('正在请求...', { duration: 5000000000000000 });
this.s = false;
axios.get('https://zk.aoidc.top/api/api.php?q='+this.w)
.then(response => {
Message.closeAll();
this.s = true;
if (response.data.results != null) {
this.d = response.data.results;
this.s = true;
Message.success('已载入~', { duration: 2000 });
} else {
Message.warning('失败', { duration: 2000 });
}
})
},
}
});
// 挂载到DOM元素
app.mount('#app');

267
Dashboard/index.html Normal file
View File

@@ -0,0 +1,267 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fuxsto Host V5 - Dashboard</title>
<script src="https://cdn.fss.fuxsto.cn/d/ajax/libs/eruda/eruda.js"></script>
<script>eruda.init();</script>
<link rel="stylesheet" href="app.css">
<link rel="stylesheet" href="https://cdn.fss.fuxsto.cn/d/element-plus@2.9.4/dist/index.css" />
</head>
<body class="container">
<div id="app">
<transition name="ldo">
<div class="md" v-if="ld">
<div class="loader min"></div>
</div>
</transition>
<transition name="fade-blur">
<!-- 用户中心 -->
<div
class="min"
v-if="UserInfo && page == 'home'"
>
<!-- 用户卡片 -->
<div class="user-card">
<div class="user-card-header">
<div class="user-card-avatar">
<img
width="100%"
class="avatar-image"
:src="userlogo"
alt="头像"
>
</div>
<div class="user-card-info">
<div class="user-card-name">
{{ UserInfo.username }}
</div>
<div class="user-card-role">
{{ UserInfo.id }}
</div>
</div>
</div>
<div class="user-card-stats">
<div class="user-card-stat">
<div class="user-card-stat-value">
{{ UserInfo.balance }}
</div>
<div class="user-card-stat-label">
余额
</div>
</div>
<div class="user-card-stat">
<div class="user-card-stat-value">
{{ UserInfo.score }}
</div>
<div class="user-card-stat-label">
积分
</div>
</div>
<div class="user-card-stat">
<div class="user-card-stat-value">
{{ UserInfo.status }}
</div>
<div class="user-card-stat-label">
状态
</div>
</div>
</div>
</div>
<div class="quick-actions">
<button
@click="this.page = 'goods';this.viewcart()"
class="action-button">
<svg viewBox="0 0 24 24">
<path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</svg>
<span>创建业务</span>
</button>
<button
class="action-button"
@click="this.page = 'purchase';this.getpurchases()"
>
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/>
</svg>
<span>我的业务</span>
</button>
<button class="action-button">
<svg viewBox="0 0 24 24">
<path d="M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"/>
</svg>
<span>系统设置</span>
</button>
</div>
</div>
<div v-if="UserInfo && page !='home'">
<div class="min" style="display: grid; gap: 12px;">
<div style="display: flex; align-items: center; gap: 12px;">
<div style="background: rgba(41, 98, 255, 0.1); border-radius: 99px; padding: 0px;">
<button @click="page = 'home';getinfo()" class="button">
<div class="button-box">
<span class="button-elem">
<svg viewBox="0 0 46 40" xmlns="http://www.w3.org/2000/svg">
<path
d="M46 20.038c0-.7-.3-1.5-.8-2.1l-16-17c-1.1-1-3.2-1.4-4.4-.3-1.2 1.1-1.2 3.3 0 4.4l11.3 11.9H3c-1.7 0-3 1.3-3 3s1.3 3 3 3h33.1l-11.3 11.9c-1 1-1.2 3.3 0 4.4 1.2 1.1 3.3.8 4.4-.3l16-17c.5-.5.8-1.1.8-1.9z"
></path>
</svg>
</span>
<span class="button-elem">
<svg viewBox="0 0 46 40">
<path
d="M46 20.038c0-.7-.3-1.5-.8-2.1l-16-17c-1.1-1-3.2-1.4-4.4-.3-1.2 1.1-1.2 3.3 0 4.4l11.3 11.9H3c-1.7 0-3 1.3-3 3s1.3 3 3 3h33.1l-11.3 11.9c-1 1-1.2 3.3 0 4.4 1.2 1.1 3.3.8 4.4-.3l16-17c.5-.5.8-1.1.8-1.9z"
></path>
</svg>
</span>
</div>
</button>
</div>
<div>
<div>返回</div>
<div style="font-size: 12px; color: var(--mdui-text-secondary);">Go to home</div>
</div>
</div>
<br>
</div>
<!-- 业务页面 -->
<div v-if="page == 'purchase'">
<div
class="min"
v-if="purchases"
>
<div
v-for="m in purchases"
class="card"
>
<div class="header">
<div class="icon-wrapper">
<svg
class="icon"
viewBox="0 0 24 24"
fill="none"
>
<path
d="M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</div>
<div class="title-group">
<h2 class="title">
{{ m.name }}
</h2>
<div class="status">
<svg
width="12"
height="12"
viewBox="0 0 24 24"
fill="currentColor"
>
<circle cx="12" cy="12" r="10"/>
</svg>
{{ m.status }}
</div>
</div>
</div>
<div class="detail-grid">
<div class="detail-item">
<span class="label">业务ID</span>
<span class="value">
{{ m.purchase_id }}
</span>
</div>
<div class="detail-item">
<span class="label">到期时间</span>
<span class="value">
<svg
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
>
<circle cx="12" cy="12" r="10"/>
<path d="M12 6V12L16 14"/>
</svg>
{{ m.expiry_time }}
</span>
</div>
</div>
</div>
</div>
</div>
<!-- 产品页面 -->
<div class="min" v-if="page == 'goods' && cart">
{{ cart }}
</div>
</transition>
</div>
<!-- 依赖库 -->
<script src="https://cdn.fss.fuxsto.cn/d/axios@1.7.9/dist/axios.min.js"></script>
<script src="https://cdn.fss.fuxsto.cn/d/vue@3.5.13/dist/vue.global.prod.js"></script>
<script src="https://cdn.fss.fuxsto.cn/d/element-plus@2.9.4/dist/index.full.js"></script>
<script src="msg.js"></script>
<script src="app.js"></script>
</body>
</html>

267
Dashboard/index.html.bak Normal file
View File

@@ -0,0 +1,267 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fuxsto Host V5 - Dashboard</title>
<script src="https://cdn.fss.fuxsto.cn/d/ajax/libs/eruda/eruda.js"></script>
<script>eruda.init();</script>
<link rel="stylesheet" href="app.css">
<link rel="stylesheet" href="https://cdn.fss.fuxsto.cn/d/element-plus@2.9.4/dist/index.css" />
</head>
<body class="container">
<div id="app">
<transition name="ldo">
<div class="md min" v-if="ld">
<div class="loader"></div>
</div>
</transition>
<transition name="fade-blur">
<!-- 用户中心 -->
<div
class="min"
v-if="UserInfo && page == 'home'"
>
<!-- 用户卡片 -->
<div class="user-card">
<div class="user-card-header">
<div class="user-card-avatar">
<img
width="100%"
class="avatar-image"
:src="userlogo"
alt="头像"
>
</div>
<div class="user-card-info">
<div class="user-card-name">
{{ UserInfo.username }}
</div>
<div class="user-card-role">
{{ UserInfo.id }}
</div>
</div>
</div>
<div class="user-card-stats">
<div class="user-card-stat">
<div class="user-card-stat-value">
{{ UserInfo.balance }}
</div>
<div class="user-card-stat-label">
余额
</div>
</div>
<div class="user-card-stat">
<div class="user-card-stat-value">
{{ UserInfo.score }}
</div>
<div class="user-card-stat-label">
积分
</div>
</div>
<div class="user-card-stat">
<div class="user-card-stat-value">
{{ UserInfo.status }}
</div>
<div class="user-card-stat-label">
状态
</div>
</div>
</div>
</div>
<div class="quick-actions">
<button
@click="this.page = 'goods';this.viewcart()"
class="action-button">
<svg viewBox="0 0 24 24">
<path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</svg>
<span>创建业务</span>
</button>
<button
class="action-button"
@click="this.page = 'purchase';this.getpurchases()"
>
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/>
</svg>
<span>我的业务</span>
</button>
<button class="action-button">
<svg viewBox="0 0 24 24">
<path d="M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"/>
</svg>
<span>系统设置</span>
</button>
</div>
</div>
<div v-if="UserInfo && page !='home'">
<div class="min" style="display: grid; gap: 12px;">
<div style="display: flex; align-items: center; gap: 12px;">
<div style="background: rgba(41, 98, 255, 0.1); border-radius: 99px; padding: 0px;">
<button @click="page = 'home';getinfo()" class="button">
<div class="button-box">
<span class="button-elem">
<svg viewBox="0 0 46 40" xmlns="http://www.w3.org/2000/svg">
<path
d="M46 20.038c0-.7-.3-1.5-.8-2.1l-16-17c-1.1-1-3.2-1.4-4.4-.3-1.2 1.1-1.2 3.3 0 4.4l11.3 11.9H3c-1.7 0-3 1.3-3 3s1.3 3 3 3h33.1l-11.3 11.9c-1 1-1.2 3.3 0 4.4 1.2 1.1 3.3.8 4.4-.3l16-17c.5-.5.8-1.1.8-1.9z"
></path>
</svg>
</span>
<span class="button-elem">
<svg viewBox="0 0 46 40">
<path
d="M46 20.038c0-.7-.3-1.5-.8-2.1l-16-17c-1.1-1-3.2-1.4-4.4-.3-1.2 1.1-1.2 3.3 0 4.4l11.3 11.9H3c-1.7 0-3 1.3-3 3s1.3 3 3 3h33.1l-11.3 11.9c-1 1-1.2 3.3 0 4.4 1.2 1.1 3.3.8 4.4-.3l16-17c.5-.5.8-1.1.8-1.9z"
></path>
</svg>
</span>
</div>
</button>
</div>
<div>
<div>返回</div>
<div style="font-size: 12px; color: var(--mdui-text-secondary);">Go to home</div>
</div>
</div>
<br>
</div>
<!-- 业务页面 -->
<div v-if="page == 'purchase'">
<div
class="min"
v-if="purchases"
>
<div
v-for="m in purchases"
class="card"
>
<div class="header">
<div class="icon-wrapper">
<svg
class="icon"
viewBox="0 0 24 24"
fill="none"
>
<path
d="M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</div>
<div class="title-group">
<h2 class="title">
{{ m.name }}
</h2>
<div class="status">
<svg
width="12"
height="12"
viewBox="0 0 24 24"
fill="currentColor"
>
<circle cx="12" cy="12" r="10"/>
</svg>
{{ m.status }}
</div>
</div>
</div>
<div class="detail-grid">
<div class="detail-item">
<span class="label">业务ID</span>
<span class="value">
{{ m.purchase_id }}
</span>
</div>
<div class="detail-item">
<span class="label">到期时间</span>
<span class="value">
<svg
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
>
<circle cx="12" cy="12" r="10"/>
<path d="M12 6V12L16 14"/>
</svg>
{{ m.expiry_time }}
</span>
</div>
</div>
</div>
</div>
</div>
<!-- 产品页面 -->
<div class="min" v-if="page == 'goods' && cart">
{{ cart }}
</div>
</transition>
</div>
<!-- 依赖库 -->
<script src="https://cdn.fss.fuxsto.cn/d/axios@1.7.9/dist/axios.min.js"></script>
<script src="https://cdn.fss.fuxsto.cn/d/vue@3.5.13/dist/vue.global.prod.js"></script>
<script src="https://cdn.fss.fuxsto.cn/d/element-plus@2.9.4/dist/index.full.js"></script>
<script src="msg.js"></script>
<script src="app.js"></script>
</body>
</html>

235
Dashboard/msg.js Normal file
View File

@@ -0,0 +1,235 @@
// 终极消息系统 (保留所有优秀特性)
(() => {
// 完美图标系统
const icons = {
success: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="msg-svg"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15l-4-4 1.41-1.41L11 14.17l6.59-6.59L19 9l-8 8z"/></svg>',
error: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="msg-svg"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></svg>',
warning: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="msg-svg"><path fill="currentColor" d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/></svg>',
info: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="msg-svg"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>'
};
// 专业配置系统
const config = {
duration: 3000,
spacing: 10,
maxMessages: 10,
closable: false,
enterAnimation: 'msg-slideIn',
exitAnimation: 'msg-fadeOutUp'
};
// 完美样式系统
const style = document.createElement('style');
style.textContent = `
@keyframes msg-slideIn {
0% { opacity: 0; transform: translate(-50%, -20px);
filter: blur(5px); }
100% { opacity: 1; transform: translate(-50%, 0);
filter: blur(0px); }
}
@keyframes msg-fadeOutUp {
0% { opacity: 1; transform: translate(-50%, 0);
filter: blur(0px); }
100% { opacity: 0; transform: translate(-50%, -100px);
filter: blur(5px); }
}
.msg {
position: fixed;
left: 50%;
transform: translateX(-50%);
min-width: 300px;
max-width: 90vw;
padding: 14px 20px;
border-radius: 15px;
background: #fff;
display: flex;
align-items: center;
z-index: 9999;
opacity: 0;
transition: top 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
font-family: system-ui, sans-serif;
}
.msg-enter {
animation: ${config.enterAnimation} 0.5s forwards;
}
.msg-exit {
animation: ${config.exitAnimation} 0.5s forwards;
}
.msg-icon {
width: 24px;
height: 24px;
margin-right: 12px;
flex-shrink: 0;
animation: msg-content-in 0.4s ease-in-out 0.5s forwards;
}
.msg-content {
flex: 1;
font-size: 14px;
line-height: 1.5;
padding-right: 8px;
transition: all 0.5s;
animation: msg-content-in 0.4s ease-in-out 0.55s forwards;
}
@keyframes msg-content-in {
0% { opacity: 1;
filter: blur(0px); }
50% { opacity: 1;
filter: blur(2px); }
} 100% { opacity: 1;
filter: blur(0px); }
}
.msg-close {
cursor: pointer;
width: 24px;
height: 24px;
margin-left: 8px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 6px;
transition: all 0.5s;
color: rgba(0,0,0,0.5);
flex-shrink: 0;
animation: msg-content-in 0.4s ease-in-out 0.6s forwards;
}
.msg-close:hover {
background: rgba(0,0,0,0.08);
color: rgba(0,0,0,0.8);
}
/* 专业配色方案 */
.msg-success { color: #10B981; box-shadow: 0px 0px 4px rgba(16, 185, 129, 0.2);}
.msg-error { color: #EF4444; box-shadow: 0px 0px 4px rgba(239, 68, 68, 0.2);}
.msg-warning { color: #F59E0B; box-shadow: 0px 0px 4px rgba(245, 158, 11, 0.2);}
.msg-info { color: #3B82F6; box-shadow: 0px 0px 4px rgba(59, 130, 246, 0.2);}
`;
document.head.appendChild(style);
// 终极消息管理器
class MsgManager {
static instances = [];
static add(msg) {
if (this.instances.length >= config.maxMessages) {
this.instances[0].close();
}
this.instances.push(msg);
this.updateLayout();
}
static remove(msg) {
const index = this.instances.indexOf(msg);
if (index > -1) {
this.instances.splice(index, 1);
this.updateLayout(true);
}
}
static updateLayout(animate = false) {
let top = 20;
this.instances.forEach(instance => {
instance.element.style.transition = animate ? 'top 0.5s cubic-bezier(0.34, 1.56, 0.64, 1)' : 'none';
instance.element.style.top = `${top}px`;
top += instance.element.offsetHeight + config.spacing;
});
}
}
// 完美消息实例
class Msg {
constructor(type, content, options) {
this.type = type;
this.content = content;
this.options = { ...config, ...options };
this.element = this.createElement();
this.setupEvents();
this.show();
}
createElement() {
const el = document.createElement('div');
el.className = `msg msg-${this.type}`;
const closeBtn = this.options.closable
? '<div class="msg-close" role="button">×</div>'
: '';
el.innerHTML = `
<div class="msg-icon">${icons[this.type]}</div>
<div class="msg-content">${this.content}</div>
${closeBtn}
`;
return el;
}
setupEvents() {
if (this.options.closable) {
this.element.querySelector('.msg-close').addEventListener('click', () => this.close());
}
}
show() {
document.body.appendChild(this.element);
requestAnimationFrame(() => {
this.element.classList.add('msg-enter');
MsgManager.add(this);
});
this.autoCloseTimer = setTimeout(() => this.close(), this.options.duration);
}
close() {
clearTimeout(this.autoCloseTimer);
this.element.classList.remove('msg-enter');
this.element.classList.add('msg-exit');
setTimeout(() => {
this.element.remove();
MsgManager.remove(this);
}, 500);
}
}
// 终极API暴露
const Message = {
config(newConfig) {
Object.assign(config, newConfig);
},
success(content, options) {
return new Msg('success', content, options);
},
error(content, options) {
return new Msg('error', content, options);
},
warning(content, options) {
return new Msg('warning', content, options);
},
info(content, options) {
return new Msg('info', content, options);
},
closeAll() {
MsgManager.instances.slice().forEach(msg => msg.close());
}
};
window.Message = Message;
})();
// 完美调用示例
//Message.success('');
//Message.error('验证失败', { closable: true, duration: 5000 });

235
Dashboard/msg.js.bak Normal file
View File

@@ -0,0 +1,235 @@
// 终极消息系统 (保留所有优秀特性)
(() => {
// 完美图标系统
const icons = {
success: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="msg-svg"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15l-4-4 1.41-1.41L11 14.17l6.59-6.59L19 9l-8 8z"/></svg>',
error: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="msg-svg"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></svg>',
warning: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="msg-svg"><path fill="currentColor" d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/></svg>',
info: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="msg-svg"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>'
};
// 专业配置系统
const config = {
duration: 3000,
spacing: 10,
maxMessages: 10,
closable: false,
enterAnimation: 'msg-slideIn',
exitAnimation: 'msg-fadeOutUp'
};
// 完美样式系统
const style = document.createElement('style');
style.textContent = `
@keyframes msg-slideIn {
0% { opacity: 0; transform: translate(-50%, -20px);
filter: blur(5px); }
100% { opacity: 1; transform: translate(-50%, 0);
filter: blur(0px); }
}
@keyframes msg-fadeOutUp {
0% { opacity: 1; transform: translate(-50%, 0);
filter: blur(0px); }
100% { opacity: 0; transform: translate(-50%, -100px);
filter: blur(5px); }
}
.msg {
position: fixed;
left: 50%;
transform: translateX(-50%);
min-width: 300px;
max-width: 90vw;
padding: 14px 20px;
border-radius: 15px;
background: #fff;
display: flex;
align-items: center;
z-index: 9999;
opacity: 0;
transition: top 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
font-family: system-ui, sans-serif;
}
.msg-enter {
animation: ${config.enterAnimation} 0.5s forwards;
}
.msg-exit {
animation: ${config.exitAnimation} 0.5s forwards;
}
.msg-icon {
width: 24px;
height: 24px;
margin-right: 12px;
flex-shrink: 0;
animation: msg-content-in 0.4s ease-in-out 0.5s forwards;
}
.msg-content {
flex: 1;
font-size: 14px;
line-height: 1.5;
padding-right: 8px;
transition: all 0.5s;
animation: msg-content-in 0.4s ease-in-out 0.55s forwards;
}
@keyframes msg-content-in {
0% { opacity: 1;
filter: blur(0px); }
50% { opacity: 1;
filter: blur(2px); }
} 100% { opacity: 1;
filter: blur(0px); }
}
.msg-close {
cursor: pointer;
width: 24px;
height: 24px;
margin-left: 8px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 6px;
transition: all 0.5s;
color: rgba(0,0,0,0.5);
flex-shrink: 0;
animation: msg-content-in 0.4s ease-in-out 0.6s forwards;
}
.msg-close:hover {
background: rgba(0,0,0,0.08);
color: rgba(0,0,0,0.8);
}
/* 专业配色方案 */
.msg-success { color: #10B981; box-shadow: 0px 0px 4px rgba(16, 185, 129, 0.2);}
.msg-error { color: #EF4444; box-shadow: 0px 0px 4px rgba(239, 68, 68, 0.2);}
.msg-warning { color: #F59E0B; box-shadow: 0px 0px 4px rgba(245, 158, 11, 0.2);}
.msg-info { color: #3B82F6; box-shadow: 0px 0px 4px rgba(59, 130, 246, 0.2);}
`;
document.head.appendChild(style);
// 终极消息管理器
class MsgManager {
static instances = [];
static add(msg) {
if (this.instances.length >= config.maxMessages) {
this.instances[0].close();
}
this.instances.push(msg);
this.updateLayout();
}
static remove(msg) {
const index = this.instances.indexOf(msg);
if (index > -1) {
this.instances.splice(index, 1);
this.updateLayout(true);
}
}
static updateLayout(animate = false) {
let top = 20;
this.instances.forEach(instance => {
instance.element.style.transition = animate ? 'top 0.5s cubic-bezier(0.34, 1.56, 0.64, 1)' : 'none';
instance.element.style.top = `${top}px`;
top += instance.element.offsetHeight + config.spacing;
});
}
}
// 完美消息实例
class Msg {
constructor(type, content, options) {
this.type = type;
this.content = content;
this.options = { ...config, ...options };
this.element = this.createElement();
this.setupEvents();
this.show();
}
createElement() {
const el = document.createElement('div');
el.className = `msg msg-${this.type}`;
const closeBtn = this.options.closable
? '<div class="msg-close" role="button">×</div>'
: '';
el.innerHTML = `
<div class="msg-icon">${icons[this.type]}</div>
<div class="msg-content">${this.content}</div>
${closeBtn}
`;
return el;
}
setupEvents() {
if (this.options.closable) {
this.element.querySelector('.msg-close').addEventListener('click', () => this.close());
}
}
show() {
document.body.appendChild(this.element);
requestAnimationFrame(() => {
this.element.classList.add('msg-enter');
MsgManager.add(this);
});
this.autoCloseTimer = setTimeout(() => this.close(), this.options.duration);
}
close() {
clearTimeout(this.autoCloseTimer);
this.element.classList.remove('msg-enter');
this.element.classList.add('msg-exit');
setTimeout(() => {
this.element.remove();
MsgManager.remove(this);
}, 500);
}
}
// 终极API暴露
const Message = {
config(newConfig) {
Object.assign(config, newConfig);
},
success(content, options) {
return new Msg('success', content, options);
},
error(content, options) {
return new Msg('error', content, options);
},
warning(content, options) {
return new Msg('warning', content, options);
},
info(content, options) {
return new Msg('info', content, options);
},
closeAll() {
MsgManager.instances.slice().forEach(msg => msg.close());
}
};
window.Message = Message;
})();
// 完美调用示例
Message.success('支付成功!');
Message.error('验证失败', { closable: true, duration: 5000 });

984
Dashboard/t.html Normal file
View File

@@ -0,0 +1,984 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>移动端仪表盘</title>
<style>
:root {
--mdui-primary: #2962ff;
--mdui-surface: #ffffff;
--mdui-background: #f5f5f5;
--mdui-text-primary: rgba(0, 0, 0, 0.87);
--mdui-text-secondary: rgba(0, 0, 0, 0.6);
--mdui-shape-corner: 20px;
}
body {
margin: 0;
background: var(--mdui-background);
font-family: 'Segoe UI', system-ui;
color: var(--mdui-text-primary);
}
.container {
padding: 16px;
max-width: 500px;
margin: 0 auto;
}
.status-card {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 24px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
transition: transform 0.2s;
}
.status-card:hover {
transform: translateY(-2px);
}
.metric-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.metric-value {
font-size: 32px;
font-weight: 700;
color: var(--mdui-primary);
}
.metric-label {
color: var(--mdui-text-secondary);
font-size: 14px;
}
.quick-actions {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
margin: 24px 0;
}
.action-button {
background: var(--mdui-surface);
border: none;
border-radius: 16px;
padding: 16px;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
cursor: pointer;
transition: all 0.2s;
}
.action-button:hover {
background: #f0f4ff;
}
.action-button svg {
width: 24px;
height: 24px;
fill: var(--mdui-primary);
}
.chart-container {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin: 16px 0;
}
.progress-bar {
height: 8px;
background: #eeeeee;
border-radius: 4px;
overflow: hidden;
margin: 12px 0;
}
.progress-fill {
width: 65%;
height: 100%;
background: var(--mdui-primary);
border-radius: 4px;
transition: width 0.3s ease;
}
.nav-bottom {
position: fixed;
bottom: 0;
width: 100%;
background: var(--mdui-surface);
display: flex;
justify-content: space-around;
padding: 12px 0;
box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.05);
}
.nav-item {
display: flex;
flex-direction: column;
align-items: center;
color: var(--mdui-text-secondary);
padding: 8px;
border-radius: 12px;
transition: all 0.2s;
}
.nav-item.active {
color: var(--mdui-primary);
background: #e8efff;
}
.nav-item svg {
width: 20px;
height: 20px;
margin-bottom: 4px;
}
.user-card {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
transition: transform 0.2s;
}
.user-card:hover {
transform: translateY(-2px);
}
.user-card-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
}
.user-card-avatar {
width: 48px;
height: 48px;
border-radius: 50%;
background: #e8efff;
display: flex;
align-items: center;
justify-content: center;
}
.user-card-avatar svg {
width: 24px;
height: 24px;
fill: var(--mdui-primary);
}
.user-card-info {
flex: 1;
}
.user-card-name {
font-size: 18px;
font-weight: 600;
margin-bottom: 4px;
}
.user-card-role {
font-size: 14px;
color: var(--mdui-text-secondary);
}
.user-card-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
.user-card-stat {
text-align: center;
}
.user-card-stat-value {
font-size: 18px;
font-weight: 600;
color: var(--mdui-primary);
}
.user-card-stat-label {
font-size: 12px;
color: var(--mdui-text-secondary);
}
.user-info-card {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
transition: transform 0.2s;
}
.user-info-card:hover {
transform: translateY(-2px);
}
.user-info-card-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
}
.user-info-card-avatar {
width: 48px;
height: 48px;
border-radius: 50%;
background: #e8efff;
display: flex;
align-items: center;
justify-content: center;
}
.user-info-card-avatar svg {
width: 24px;
height: 24px;
fill: var(--mdui-primary);
}
.user-info-card-info {
flex: 1;
}
.user-info-card-name {
font-size: 18px;
font-weight: 600;
margin-bottom: 4px;
}
.user-info-card-role {
font-size: 14px;
color: var(--mdui-text-secondary);
}
.user-info-card-details {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12px;
}
.user-info-card-detail {
display: flex;
align-items: center;
gap: 8px;
}
.user-info-card-detail svg {
width: 18px;
height: 18px;
fill: var(--mdui-primary);
}
.user-info-card-detail-label {
font-size: 14px;
color: var(--mdui-text-secondary);
}
.user-info-card-detail-value {
font-size: 14px;
font-weight: 600;
}
.table-container {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.table-container table {
width: 100%;
border-collapse: collapse;
}
.table-container th,
.table-container td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #eeeeee;
}
.table-container th {
font-weight: 600;
color: var(--mdui-text-primary);
}
.table-container td {
color: var(--mdui-text-secondary);
}
.form-container {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.form-container label {
display: block;
font-size: 14px;
color: var(--mdui-text-secondary);
margin-bottom: 8px;
}
.form-container input,
.form-container select,
.form-container textarea {
width: 100%;
padding: 12px;
border: 1px solid #eeeeee;
border-radius: 8px;
font-size: 14px;
color: var(--mdui-text-primary);
margin-bottom: 16px;
transition: border-color 0.2s;
}
.form-container input:focus,
.form-container select:focus,
.form-container textarea:focus {
border-color: var(--mdui-primary);
outline: none;
}
.form-container button {
background: var(--mdui-primary);
color: white;
border: none;
border-radius: 8px;
padding: 12px 24px;
font-size: 14px;
cursor: pointer;
transition: background 0.2s;
}
.form-container button:hover {
background: #1e4dff;
}
.alert {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
display: flex;
align-items: center;
gap: 12px;
}
.alert svg {
width: 24px;
height: 24px;
fill: var(--mdui-primary);
}
.alert-success {
background: #e8f5e9;
}
.alert-success svg {
fill: #4caf50;
}
.alert-warning {
background: #fff3e0;
}
.alert-warning svg {
fill: #ff9800;
}
.alert-error {
background: #ffebee;
}
.alert-error svg {
fill: #f44336;
}
.alert-info {
background: #e3f2fd;
}
.alert-info svg {
fill: #2196f3;
}
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
justify-content: center;
align-items: center;
}
.modal-content {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 24px;
max-width: 400px;
width: 100%;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.modal-title {
font-size: 18px;
font-weight: 600;
}
.modal-close {
background: none;
border: none;
cursor: pointer;
padding: 8px;
}
.modal-close svg {
width: 24px;
height: 24px;
fill: var(--mdui-text-secondary);
}
.modal-body {
margin-bottom: 16px;
}
.modal-footer {
display: flex;
justify-content: flex-end;
gap: 8px;
}
.modal-footer button {
padding: 8px 16px;
border: none;
border-radius: 8px;
cursor: pointer;
transition: background 0.2s;
}
.modal-footer button.primary {
background: var(--mdui-primary);
color: white;
}
.modal-footer button.primary:hover {
background: #1e4dff;
}
.modal-footer button.secondary {
background: #eeeeee;
color: var(--mdui-text-primary);
}
.modal-footer button.secondary:hover {
background: #dddddd;
}
.pagination {
display: flex;
justify-content: center;
gap: 8px;
margin: 16px 0;
}
.pagination button {
background: var(--mdui-surface);
border: none;
border-radius: 8px;
padding: 8px 12px;
cursor: pointer;
transition: background 0.2s;
}
.pagination button.active {
background: var(--mdui-primary);
color: white;
}
.pagination button:hover {
background: #f0f4ff;
}
.tabs {
display: flex;
gap: 8px;
margin-bottom: 16px;
}
.tabs button {
background: var(--mdui-surface);
border: none;
border-radius: 8px;
padding: 8px 16px;
cursor: pointer;
transition: background 0.2s;
}
.tabs button.active {
background: var(--mdui-primary);
color: white;
}
.tabs button:hover {
background: #f0f4ff;
}
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-button {
background: var(--mdui-surface);
border: none;
border-radius: 8px;
padding: 8px 16px;
cursor: pointer;
transition: background 0.2s;
}
.dropdown-button:hover {
background: #f0f4ff;
}
.dropdown-content {
display: none;
position: absolute;
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
min-width: 160px;
z-index: 1;
}
.dropdown-content a {
display: block;
padding: 8px 16px;
text-decoration: none;
color: var(--mdui-text-primary);
transition: background 0.2s;
}
.dropdown-content a:hover {
background: #f0f4ff;
}
.dropdown:hover .dropdown-content {
display: block;
}
.timeline {
display: flex;
flex-direction: column;
gap: 16px;
}
.timeline-item {
display: flex;
align-items: flex-start;
gap: 12px;
}
.timeline-item-icon {
width: 24px;
height: 24px;
border-radius: 50%;
background: #e8efff;
display: flex;
align-items: center;
justify-content: center;
}
.timeline-item-icon svg {
width: 16px;
height: 16px;
fill: var(--mdui-primary);
}
.timeline-item-content {
flex: 1;
}
.timeline-item-title {
font-size: 14px;
font-weight: 600;
margin-bottom: 4px;
}
.timeline-item-description {
font-size: 12px;
color: var(--mdui-text-secondary);
}
.timeline-item-time {
font-size: 12px;
color: var(--mdui-text-secondary);
}
</style>
</head>
<body>
<div class="container">
<!-- 状态卡片 -->
<div class="status-card">
<div class="metric-header">
<div>
<div class="metric-value">85%</div>
<div class="metric-label">本月完成进度</div>
</div>
<svg viewBox="0 0 24 24" style="width: 40px; height: 40px; fill: var(--mdui-primary);">
<path d="M13 2.05v2.02c3.95.49 7 3.85 7 7.93 0 3.21-1.92 6.03-4.72 7.32l-1.43-1.43c2.13-1.1 3.65-3.29 3.65-5.89 0-3.31-2.69-6-6-6H15l-4 4 4 4h-2.07c-.5-2.84 1.7-5.38 4.5-5.9l1.03-1.03c-.91-.87-2.12-1.43-3.45-1.62V2.05zM12 19c-3.87 0-7-3.13-7-7 0-3.53 2.61-6.43 6-6.92V2.05C6.07 2.55 2 6.81 2 12c0 5.52 4.47 10 9.99 10 3.31 0 6.24-1.61 8.06-4.09l-1.6-1.6A7.925 7.925 0 0 1 12 19z"/>
</svg>
</div>
<div class="progress-bar">
<div class="progress-fill"></div>
</div>
</div>
<!-- 快速操作 -->
<div class="quick-actions">
<button class="action-button">
<svg viewBox="0 0 24 24">
<path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</svg>
<span>新建项目</span>
</button>
<button class="action-button">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/>
</svg>
<span>数据分析</span>
</button>
<button class="action-button">
<svg viewBox="0 0 24 24">
<path d="M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"/>
</svg>
<span>系统设置</span>
</button>
</div>
<!-- 数据图表 -->
<div class="chart-container">
<h3 style="margin:0 0 16px;">存储使用情况</h3>
<div style="display: flex; gap: 16px; align-items: center;">
<div style="flex:1;">
<div style="font-size: 12px; color: var(--mdui-text-secondary); margin-bottom: 8px;">
已用 15.2GB / 50GB
</div>
<div class="progress-bar">
<div class="progress-fill" style="width: 30%;"></div>
</div>
</div>
<svg viewBox="0 0 24 24" style="width: 24px; height:24px; fill: var(--mdui-primary);">
<path d="M8 17v-7.31l2.6 2.6L12 11l4-4 4 4 1.4-1.4-5.4-5.4L12 3 5.4 9.6 6.8 11 8 9.8v7.5z"/>
</svg>
</div>
</div>
<!-- 用户卡片 -->
<div class="user-card">
<div class="user-card-header">
<div class="user-card-avatar">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
</div>
<div class="user-card-info">
<div class="user-card-name">张三</div>
<div class="user-card-role">管理员</div>
</div>
</div>
<div class="user-card-stats">
<div class="user-card-stat">
<div class="user-card-stat-value">12</div>
<div class="user-card-stat-label">项目</div>
</div>
<div class="user-card-stat">
<div class="user-card-stat-value">45</div>
<div class="user-card-stat-label">任务</div>
</div>
<div class="user-card-stat">
<div class="user-card-stat-value">98%</div>
<div class="user-card-stat-label">完成率</div>
</div>
</div>
</div>
<!-- 用户信息卡片 -->
<div class="user-info-card">
<div class="user-info-card-header">
<div class="user-info-card-avatar">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
</div>
<div class="user-info-card-info">
<div class="user-info-card-name">李四</div>
<div class="user-info-card-role">开发者</div>
</div>
</div>
<div class="user-info-card-details">
<div class="user-info-card-detail">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
<div>
<div class="user-info-card-detail-label">邮箱</div>
<div class="user-info-card-detail-value">lisi@example.com</div>
</div>
</div>
<div class="user-info-card-detail">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
<div>
<div class="user-info-card-detail-label">电话</div>
<div class="user-info-card-detail-value">+86 123 4567 8901</div>
</div>
</div>
</div>
</div>
<!-- 表格 -->
<div class="table-container">
<h3 style="margin:0 0 16px;">用户列表</h3>
<table>
<thead>
<tr>
<th>姓名</th>
<th>角色</th>
<th>邮箱</th>
</tr>
</thead>
<tbody>
<tr>
<td>张三</td>
<td>管理员</td>
<td>zhangsan@example.com</td>
</tr>
<tr>
<td>李四</td>
<td>开发者</td>
<td>lisi@example.com</td>
</tr>
<tr>
<td>王五</td>
<td>设计师</td>
<td>wangwu@example.com</td>
</tr>
</tbody>
</table>
</div>
<!-- 表单 -->
<div class="form-container">
<h3 style="margin:0 0 16px;">用户注册</h3>
<form>
<label for="name">姓名</label>
<input type="text" id="name" placeholder="请输入姓名">
<label for="email">邮箱</label>
<input type="email" id="email" placeholder="请输入邮箱">
<label for="role">角色</label>
<select id="role">
<option value="admin">管理员</option>
<option value="developer">开发者</option>
<option value="designer">设计师</option>
</select>
<label for="bio">简介</label>
<textarea id="bio" rows="4" placeholder="请输入简介"></textarea>
<button type="submit">提交</button>
</form>
</div>
<!-- 提示信息 -->
<div class="alert alert-success">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>
</svg>
<div>操作成功!</div>
</div>
<div class="alert alert-warning">
<svg viewBox="0 0 24 24">
<path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/>
</svg>
<div>请注意,您的存储空间即将用完。</div>
</div>
<div class="alert alert-error">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/>
</svg>
<div>操作失败,请重试。</div>
</div>
<div class="alert alert-info">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>
</svg>
<div>这是一个信息提示。</div>
</div>
<!-- 模态框 -->
<div class="modal" id="modal">
<div class="modal-content">
<div class="modal-header">
<div class="modal-title">模态框标题</div>
<button class="modal-close" onclick="closeModal()">
<svg viewBox="0 0 24 24">
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
</svg>
</button>
</div>
<div class="modal-body">
<p>这是一个模态框的内容。</p>
</div>
<div class="modal-footer">
<button class="secondary" onclick="closeModal()">取消</button>
<button class="primary" onclick="closeModal()">确定</button>
</div>
</div>
</div>
<!-- 分页 -->
<div class="pagination">
<button class="active">1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
</div>
<!-- 标签页 -->
<div class="tabs">
<button class="active">标签1</button>
<button>标签2</button>
<button>标签3</button>
</div>
<!-- 下拉菜单 -->
<div class="dropdown">
<button class="dropdown-button">下拉菜单</button>
<div class="dropdown-content">
<a href="#">选项1</a>
<a href="#">选项2</a>
<a href="#">选项3</a>
</div>
</div>
<!-- 时间轴 -->
<div class="timeline">
<div class="timeline-item">
<div class="timeline-item-icon">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
</div>
<div class="timeline-item-content">
<div class="timeline-item-title">事件1</div>
<div class="timeline-item-description">这是事件1的描述。</div>
<div class="timeline-item-time">2023-10-01</div>
</div>
</div>
<div class="timeline-item">
<div class="timeline-item-icon">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
</div>
<div class="timeline-item-content">
<div class="timeline-item-title">事件2</div>
<div class="timeline-item-description">这是事件2的描述。</div>
<div class="timeline-item-time">2023-10-02</div>
</div>
</div>
</div>
<!-- 最近活动 -->
<div class="status-card">
<h3 style="margin:0 0 16px;">最近活动</h3>
<div style="display: grid; gap: 12px;">
<div style="display: flex; align-items: center; gap: 12px;">
<div style="background: #e8efff; border-radius: 50%; padding: 8px;">
<svg viewBox="0 0 24 24" style="width: 18px; height:18px; fill: var(--mdui-primary);">
<path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/>
</svg>
</div>
<div>
<div>新用户注册</div>
<div style="font-size: 12px; color: var(--mdui-text-secondary);">2分钟前</div>
</div>
</div>
<!-- 更多活动项... -->
</div>
</div>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
</div>
<!-- 底部导航 -->
<nav class="nav-bottom">
<div class="nav-item active">
<svg viewBox="0 0 24 24"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg>
首页
</div>
<div class="nav-item">
<svg viewBox="0 0 24 24"><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5s-3 1.34-3 3 1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg>
用户
</div>
<div class="nav-item">
<svg viewBox="0 0 24 24"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-8 12H8c-.55 0-1-.45-1-1s.45-1 1-1h3c.55 0 1 .45 1 1s-.45 1-1 1zm0-4H8c-.55 0-1-.45-1-1s.45-1 1-1h3c.55 0 1 .45 1 1s-.45 1-1 1zm0-4H8c-.55 0-1-.45-1-1s.45-1 1-1h3c.55 0 1 .45 1 1s-.45 1-1 1z"/></svg>
统计
</div>
</nav>
<script>
function openModal() {
document.getElementById('modal').style.display = 'flex';
}
function closeModal() {
document.getElementById('modal').style.display = 'none';
}
</script>
<script src="https://cdn.fss.fuxsto.cn/d/ajax/libs/eruda/eruda.js"></script>
<script>eruda.init();</script>
<script src="https://cdn.fss.fuxsto.cn/d/axios@1.7.9/dist/axios.min.js"></script>
<script src="https://cdn.fss.fuxsto.cn/d/vue@3.5.13/dist/vue.global.prod.js"></script>
<script src="msg.js"></script>
<script src="app.js"></script>
</body>
</html>

983
Dashboard/t.html.bak Normal file
View File

@@ -0,0 +1,983 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>移动端仪表盘</title>
<style>
:root {
--mdui-primary: #2962ff;
--mdui-surface: #ffffff;
--mdui-background: #f5f5f5;
--mdui-text-primary: rgba(0, 0, 0, 0.87);
--mdui-text-secondary: rgba(0, 0, 0, 0.6);
--mdui-shape-corner: 20px;
}
body {
margin: 0;
background: var(--mdui-background);
font-family: 'Segoe UI', system-ui;
color: var(--mdui-text-primary);
}
.container {
padding: 16px;
max-width: 500px;
margin: 0 auto;
}
.status-card {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 24px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
transition: transform 0.2s;
}
.status-card:hover {
transform: translateY(-2px);
}
.metric-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.metric-value {
font-size: 32px;
font-weight: 700;
color: var(--mdui-primary);
}
.metric-label {
color: var(--mdui-text-secondary);
font-size: 14px;
}
.quick-actions {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
margin: 24px 0;
}
.action-button {
background: var(--mdui-surface);
border: none;
border-radius: 16px;
padding: 16px;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
cursor: pointer;
transition: all 0.2s;
}
.action-button:hover {
background: #f0f4ff;
}
.action-button svg {
width: 24px;
height: 24px;
fill: var(--mdui-primary);
}
.chart-container {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin: 16px 0;
}
.progress-bar {
height: 8px;
background: #eeeeee;
border-radius: 4px;
overflow: hidden;
margin: 12px 0;
}
.progress-fill {
width: 65%;
height: 100%;
background: var(--mdui-primary);
border-radius: 4px;
transition: width 0.3s ease;
}
.nav-bottom {
position: fixed;
bottom: 0;
width: 100%;
background: var(--mdui-surface);
display: flex;
justify-content: space-around;
padding: 12px 0;
box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.05);
}
.nav-item {
display: flex;
flex-direction: column;
align-items: center;
color: var(--mdui-text-secondary);
padding: 8px;
border-radius: 12px;
transition: all 0.2s;
}
.nav-item.active {
color: var(--mdui-primary);
background: #e8efff;
}
.nav-item svg {
width: 20px;
height: 20px;
margin-bottom: 4px;
}
.user-card {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
transition: transform 0.2s;
}
.user-card:hover {
transform: translateY(-2px);
}
.user-card-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
}
.user-card-avatar {
width: 48px;
height: 48px;
border-radius: 50%;
background: #e8efff;
display: flex;
align-items: center;
justify-content: center;
}
.user-card-avatar svg {
width: 24px;
height: 24px;
fill: var(--mdui-primary);
}
.user-card-info {
flex: 1;
}
.user-card-name {
font-size: 18px;
font-weight: 600;
margin-bottom: 4px;
}
.user-card-role {
font-size: 14px;
color: var(--mdui-text-secondary);
}
.user-card-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
.user-card-stat {
text-align: center;
}
.user-card-stat-value {
font-size: 18px;
font-weight: 600;
color: var(--mdui-primary);
}
.user-card-stat-label {
font-size: 12px;
color: var(--mdui-text-secondary);
}
.user-info-card {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
transition: transform 0.2s;
}
.user-info-card:hover {
transform: translateY(-2px);
}
.user-info-card-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
}
.user-info-card-avatar {
width: 48px;
height: 48px;
border-radius: 50%;
background: #e8efff;
display: flex;
align-items: center;
justify-content: center;
}
.user-info-card-avatar svg {
width: 24px;
height: 24px;
fill: var(--mdui-primary);
}
.user-info-card-info {
flex: 1;
}
.user-info-card-name {
font-size: 18px;
font-weight: 600;
margin-bottom: 4px;
}
.user-info-card-role {
font-size: 14px;
color: var(--mdui-text-secondary);
}
.user-info-card-details {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12px;
}
.user-info-card-detail {
display: flex;
align-items: center;
gap: 8px;
}
.user-info-card-detail svg {
width: 18px;
height: 18px;
fill: var(--mdui-primary);
}
.user-info-card-detail-label {
font-size: 14px;
color: var(--mdui-text-secondary);
}
.user-info-card-detail-value {
font-size: 14px;
font-weight: 600;
}
.table-container {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.table-container table {
width: 100%;
border-collapse: collapse;
}
.table-container th,
.table-container td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #eeeeee;
}
.table-container th {
font-weight: 600;
color: var(--mdui-text-primary);
}
.table-container td {
color: var(--mdui-text-secondary);
}
.form-container {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.form-container label {
display: block;
font-size: 14px;
color: var(--mdui-text-secondary);
margin-bottom: 8px;
}
.form-container input,
.form-container select,
.form-container textarea {
width: 100%;
padding: 12px;
border: 1px solid #eeeeee;
border-radius: 8px;
font-size: 14px;
color: var(--mdui-text-primary);
margin-bottom: 16px;
transition: border-color 0.2s;
}
.form-container input:focus,
.form-container select:focus,
.form-container textarea:focus {
border-color: var(--mdui-primary);
outline: none;
}
.form-container button {
background: var(--mdui-primary);
color: white;
border: none;
border-radius: 8px;
padding: 12px 24px;
font-size: 14px;
cursor: pointer;
transition: background 0.2s;
}
.form-container button:hover {
background: #1e4dff;
}
.alert {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
display: flex;
align-items: center;
gap: 12px;
}
.alert svg {
width: 24px;
height: 24px;
fill: var(--mdui-primary);
}
.alert-success {
background: #e8f5e9;
}
.alert-success svg {
fill: #4caf50;
}
.alert-warning {
background: #fff3e0;
}
.alert-warning svg {
fill: #ff9800;
}
.alert-error {
background: #ffebee;
}
.alert-error svg {
fill: #f44336;
}
.alert-info {
background: #e3f2fd;
}
.alert-info svg {
fill: #2196f3;
}
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
justify-content: center;
align-items: center;
}
.modal-content {
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
padding: 24px;
max-width: 400px;
width: 100%;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.modal-title {
font-size: 18px;
font-weight: 600;
}
.modal-close {
background: none;
border: none;
cursor: pointer;
padding: 8px;
}
.modal-close svg {
width: 24px;
height: 24px;
fill: var(--mdui-text-secondary);
}
.modal-body {
margin-bottom: 16px;
}
.modal-footer {
display: flex;
justify-content: flex-end;
gap: 8px;
}
.modal-footer button {
padding: 8px 16px;
border: none;
border-radius: 8px;
cursor: pointer;
transition: background 0.2s;
}
.modal-footer button.primary {
background: var(--mdui-primary);
color: white;
}
.modal-footer button.primary:hover {
background: #1e4dff;
}
.modal-footer button.secondary {
background: #eeeeee;
color: var(--mdui-text-primary);
}
.modal-footer button.secondary:hover {
background: #dddddd;
}
.pagination {
display: flex;
justify-content: center;
gap: 8px;
margin: 16px 0;
}
.pagination button {
background: var(--mdui-surface);
border: none;
border-radius: 8px;
padding: 8px 12px;
cursor: pointer;
transition: background 0.2s;
}
.pagination button.active {
background: var(--mdui-primary);
color: white;
}
.pagination button:hover {
background: #f0f4ff;
}
.tabs {
display: flex;
gap: 8px;
margin-bottom: 16px;
}
.tabs button {
background: var(--mdui-surface);
border: none;
border-radius: 8px;
padding: 8px 16px;
cursor: pointer;
transition: background 0.2s;
}
.tabs button.active {
background: var(--mdui-primary);
color: white;
}
.tabs button:hover {
background: #f0f4ff;
}
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-button {
background: var(--mdui-surface);
border: none;
border-radius: 8px;
padding: 8px 16px;
cursor: pointer;
transition: background 0.2s;
}
.dropdown-button:hover {
background: #f0f4ff;
}
.dropdown-content {
display: none;
position: absolute;
background: var(--mdui-surface);
border-radius: var(--mdui-shape-corner);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
min-width: 160px;
z-index: 1;
}
.dropdown-content a {
display: block;
padding: 8px 16px;
text-decoration: none;
color: var(--mdui-text-primary);
transition: background 0.2s;
}
.dropdown-content a:hover {
background: #f0f4ff;
}
.dropdown:hover .dropdown-content {
display: block;
}
.timeline {
display: flex;
flex-direction: column;
gap: 16px;
}
.timeline-item {
display: flex;
align-items: flex-start;
gap: 12px;
}
.timeline-item-icon {
width: 24px;
height: 24px;
border-radius: 50%;
background: #e8efff;
display: flex;
align-items: center;
justify-content: center;
}
.timeline-item-icon svg {
width: 16px;
height: 16px;
fill: var(--mdui-primary);
}
.timeline-item-content {
flex: 1;
}
.timeline-item-title {
font-size: 14px;
font-weight: 600;
margin-bottom: 4px;
}
.timeline-item-description {
font-size: 12px;
color: var(--mdui-text-secondary);
}
.timeline-item-time {
font-size: 12px;
color: var(--mdui-text-secondary);
}
</style>
</head>
<body>
<div class="container">
<!-- 状态卡片 -->
<div class="status-card">
<div class="metric-header">
<div>
<div class="metric-value">85%</div>
<div class="metric-label">本月完成进度</div>
</div>
<svg viewBox="0 0 24 24" style="width: 40px; height: 40px; fill: var(--mdui-primary);">
<path d="M13 2.05v2.02c3.95.49 7 3.85 7 7.93 0 3.21-1.92 6.03-4.72 7.32l-1.43-1.43c2.13-1.1 3.65-3.29 3.65-5.89 0-3.31-2.69-6-6-6H15l-4 4 4 4h-2.07c-.5-2.84 1.7-5.38 4.5-5.9l1.03-1.03c-.91-.87-2.12-1.43-3.45-1.62V2.05zM12 19c-3.87 0-7-3.13-7-7 0-3.53 2.61-6.43 6-6.92V2.05C6.07 2.55 2 6.81 2 12c0 5.52 4.47 10 9.99 10 3.31 0 6.24-1.61 8.06-4.09l-1.6-1.6A7.925 7.925 0 0 1 12 19z"/>
</svg>
</div>
<div class="progress-bar">
<div class="progress-fill"></div>
</div>
</div>
<!-- 快速操作 -->
<div class="quick-actions">
<button class="action-button">
<svg viewBox="0 0 24 24">
<path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</svg>
<span>新建项目</span>
</button>
<button class="action-button">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/>
</svg>
<span>数据分析</span>
</button>
<button class="action-button">
<svg viewBox="0 0 24 24">
<path d="M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"/>
</svg>
<span>系统设置</span>
</button>
</div>
<!-- 数据图表 -->
<div class="chart-container">
<h3 style="margin:0 0 16px;">存储使用情况</h3>
<div style="display: flex; gap: 16px; align-items: center;">
<div style="flex:1;">
<div style="font-size: 12px; color: var(--mdui-text-secondary); margin-bottom: 8px;">
已用 15.2GB / 50GB
</div>
<div class="progress-bar">
<div class="progress-fill" style="width: 30%;"></div>
</div>
</div>
<svg viewBox="0 0 24 24" style="width: 24px; height:24px; fill: var(--mdui-primary);">
<path d="M8 17v-7.31l2.6 2.6L12 11l4-4 4 4 1.4-1.4-5.4-5.4L12 3 5.4 9.6 6.8 11 8 9.8v7.5z"/>
</svg>
</div>
</div>
<!-- 用户卡片 -->
<div class="user-card">
<div class="user-card-header">
<div class="user-card-avatar">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
</div>
<div class="user-card-info">
<div class="user-card-name">张三</div>
<div class="user-card-role">管理员</div>
</div>
</div>
<div class="user-card-stats">
<div class="user-card-stat">
<div class="user-card-stat-value">12</div>
<div class="user-card-stat-label">项目</div>
</div>
<div class="user-card-stat">
<div class="user-card-stat-value">45</div>
<div class="user-card-stat-label">任务</div>
</div>
<div class="user-card-stat">
<div class="user-card-stat-value">98%</div>
<div class="user-card-stat-label">完成率</div>
</div>
</div>
</div>
<!-- 用户信息卡片 -->
<div class="user-info-card">
<div class="user-info-card-header">
<div class="user-info-card-avatar">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
</div>
<div class="user-info-card-info">
<div class="user-info-card-name">李四</div>
<div class="user-info-card-role">开发者</div>
</div>
</div>
<div class="user-info-card-details">
<div class="user-info-card-detail">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
<div>
<div class="user-info-card-detail-label">邮箱</div>
<div class="user-info-card-detail-value">lisi@example.com</div>
</div>
</div>
<div class="user-info-card-detail">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
<div>
<div class="user-info-card-detail-label">电话</div>
<div class="user-info-card-detail-value">+86 123 4567 8901</div>
</div>
</div>
</div>
</div>
<!-- 表格 -->
<div class="table-container">
<h3 style="margin:0 0 16px;">用户列表</h3>
<table>
<thead>
<tr>
<th>姓名</th>
<th>角色</th>
<th>邮箱</th>
</tr>
</thead>
<tbody>
<tr>
<td>张三</td>
<td>管理员</td>
<td>zhangsan@example.com</td>
</tr>
<tr>
<td>李四</td>
<td>开发者</td>
<td>lisi@example.com</td>
</tr>
<tr>
<td>王五</td>
<td>设计师</td>
<td>wangwu@example.com</td>
</tr>
</tbody>
</table>
</div>
<!-- 表单 -->
<div class="form-container">
<h3 style="margin:0 0 16px;">用户注册</h3>
<form>
<label for="name">姓名</label>
<input type="text" id="name" placeholder="请输入姓名">
<label for="email">邮箱</label>
<input type="email" id="email" placeholder="请输入邮箱">
<label for="role">角色</label>
<select id="role">
<option value="admin">管理员</option>
<option value="developer">开发者</option>
<option value="designer">设计师</option>
</select>
<label for="bio">简介</label>
<textarea id="bio" rows="4" placeholder="请输入简介"></textarea>
<button type="submit">提交</button>
</form>
</div>
<!-- 提示信息 -->
<div class="alert alert-success">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>
</svg>
<div>操作成功!</div>
</div>
<div class="alert alert-warning">
<svg viewBox="0 0 24 24">
<path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/>
</svg>
<div>请注意,您的存储空间即将用完。</div>
</div>
<div class="alert alert-error">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/>
</svg>
<div>操作失败,请重试。</div>
</div>
<div class="alert alert-info">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>
</svg>
<div>这是一个信息提示。</div>
</div>
<!-- 模态框 -->
<div class="modal" id="modal">
<div class="modal-content">
<div class="modal-header">
<div class="modal-title">模态框标题</div>
<button class="modal-close" onclick="closeModal()">
<svg viewBox="0 0 24 24">
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
</svg>
</button>
</div>
<div class="modal-body">
<p>这是一个模态框的内容。</p>
</div>
<div class="modal-footer">
<button class="secondary" onclick="closeModal()">取消</button>
<button class="primary" onclick="closeModal()">确定</button>
</div>
</div>
</div>
<!-- 分页 -->
<div class="pagination">
<button class="active">1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
</div>
<!-- 标签页 -->
<div class="tabs">
<button class="active">标签1</button>
<button>标签2</button>
<button>标签3</button>
</div>
<!-- 下拉菜单 -->
<div class="dropdown">
<button class="dropdown-button">下拉菜单</button>
<div class="dropdown-content">
<a href="#">选项1</a>
<a href="#">选项2</a>
<a href="#">选项3</a>
</div>
</div>
<!-- 时间轴 -->
<div class="timeline">
<div class="timeline-item">
<div class="timeline-item-icon">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
</div>
<div class="timeline-item-content">
<div class="timeline-item-title">事件1</div>
<div class="timeline-item-description">这是事件1的描述。</div>
<div class="timeline-item-time">2023-10-01</div>
</div>
</div>
<div class="timeline-item">
<div class="timeline-item-icon">
<svg viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/>
</svg>
</div>
<div class="timeline-item-content">
<div class="timeline-item-title">事件2</div>
<div class="timeline-item-description">这是事件2的描述。</div>
<div class="timeline-item-time">2023-10-02</div>
</div>
</div>
</div>
<!-- 最近活动 -->
<div class="status-card">
<h3 style="margin:0 0 16px;">最近活动</h3>
<div style="display: grid; gap: 12px;">
<div style="display: flex; align-items: center; gap: 12px;">
<div style="background: #e8efff; border-radius: 50%; padding: 8px;">
<svg viewBox="0 0 24 24" style="width: 18px; height:18px; fill: var(--mdui-primary);">
<path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/>
</svg>
</div>
<div>
<div>新用户注册</div>
<div style="font-size: 12px; color: var(--mdui-text-secondary);">2分钟前</div>
</div>
</div>
<!-- 更多活动项... -->
</div>
</div>
</div>
<!-- 底部导航 -->
<nav class="nav-bottom">
<div class="nav-item active">
<svg viewBox="0 0 24 24"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg>
首页
</div>
<div class="nav-item">
<svg viewBox="0 0 24 24"><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5s-3 1.34-3 3 1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg>
用户
</div>
<div class="nav-item">
<svg viewBox="0 0 24 24"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-8 12H8c-.55 0-1-.45-1-1s.45-1 1-1h3c.55 0 1 .45 1 1s-.45 1-1 1zm0-4H8c-.55 0-1-.45-1-1s.45-1 1-1h3c.55 0 1 .45 1 1s-.45 1-1 1zm0-4H8c-.55 0-1-.45-1-1s.45-1 1-1h3c.55 0 1 .45 1 1s-.45 1-1 1z"/></svg>
统计
</div>
</nav>
<script>
function openModal() {
document.getElementById('modal').style.display = 'flex';
}
function closeModal() {
document.getElementById('modal').style.display = 'none';
}
</script>
<script src="https://cdn.fss.fuxsto.cn/d/ajax/libs/eruda/eruda.js"></script>
<script>eruda.init();</script>
<script src="https://cdn.fss.fuxsto.cn/d/axios@1.7.9/dist/axios.min.js"></script>
<script src="https://cdn.fss.fuxsto.cn/d/vue@3.5.13/dist/vue.global.prod.js"></script>
<script src="msg.js"></script>
<script src="app.js"></script>
</body>
</html>