删除 More/t.php.bak
This commit is contained in:
BIN
Dashboard/MaterialIcons-Regular.woff
Normal file
BIN
Dashboard/MaterialIcons-Regular.woff
Normal file
Binary file not shown.
BIN
Dashboard/MaterialIcons-Regular.woff2
Normal file
BIN
Dashboard/MaterialIcons-Regular.woff2
Normal file
Binary file not shown.
1058
Dashboard/app.css
Normal file
1058
Dashboard/app.css
Normal file
File diff suppressed because it is too large
Load Diff
1058
Dashboard/app.css.bak
Normal file
1058
Dashboard/app.css.bak
Normal file
File diff suppressed because it is too large
Load Diff
93
Dashboard/app.js
Normal file
93
Dashboard/app.js
Normal 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
91
Dashboard/app.js.bak
Normal 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
49
Dashboard/b.php
Normal 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
49
Dashboard/bing.html
Normal 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
53
Dashboard/bing.html.bak
Normal 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
49
Dashboard/bing.js
Normal 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
47
Dashboard/bing.js.bak
Normal 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
267
Dashboard/index.html
Normal 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
267
Dashboard/index.html.bak
Normal 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
235
Dashboard/msg.js
Normal 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
235
Dashboard/msg.js.bak
Normal 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
984
Dashboard/t.html
Normal 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
983
Dashboard/t.html.bak
Normal 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>
|
||||
Reference in New Issue
Block a user