文件位置调整

This commit is contained in:
linbin 2025-08-01 21:34:39 +08:00
parent efc51486d5
commit d7aafd537b
47 changed files with 35 additions and 7266 deletions

View File

@ -1,51 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>信息管理系统</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<!-- 左侧菜单栏 -->
<div class="sidebar">
<div class="logo">
<h2>管理系统</h2>
</div>
<nav class="menu">
<div class="menu-item">
<div class="menu-title" onclick="toggleSubmenu('member-submenu')">
<span>会员管理</span>
<span class="arrow"></span>
</div>
<div class="submenu" id="member-submenu">
<div class="submenu-item" onclick="openTab('等级设置', 'level-settings')">等级设置</div>
<div class="submenu-item" onclick="openTab('会员查看', 'member-view')">会员查看</div>
</div>
</div>
</nav>
</div>
<!-- 中央内容区域 -->
<div class="main-content">
<!-- Tab栏 -->
<div class="tab-bar">
<div class="tab active" id="home-tab">
<span>首页</span>
</div>
</div>
<!-- 内容展示区域 -->
<div class="content-area">
<div class="tab-content active" id="home-content">
<h1>欢迎使用信息管理系统</h1>
<p>请从左侧菜单选择功能模块</p>
</div>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,116 +0,0 @@
# 大数集市商户端 Demo
这是一个纯HTML版本的中文商户后台管理系统演示项目基于原始的Next.js项目转换而来。
## 项目结构
```
demo/
├── index.html # 主页面文件
├── css/
│ └── styles.css # 样式文件
├── js/
│ └── main.js # JavaScript交互逻辑
├── images/ # 静态资源文件
│ ├── placeholder.svg
│ ├── placeholder.png
│ └── ...
└── README.md # 说明文档
```
## 功能特性
### ✅ 已实现功能
1. **完整的页面布局**
- 绿色主题的顶部导航栏
- 左侧折叠式菜单
- 右侧主内容区域
2. **交互功能**
- 菜单展开/收起动画
- 页面内容切换(如等级设置页面)
- 开关按钮的切换效果
- 搜索菜单功能
3. **响应式设计**
- 支持桌面端和移动端布局
- 自适应屏幕大小
4. **用户体验**
- 平滑的动画过渡效果
- 键盘快捷键支持ESC回首页Ctrl+F搜索
- 通知提示系统
### 🎯 主要页面
- **首页**: 默认欢迎页面
- **等级设置**: 会员等级管理表格,包含开关切换功能
### 🔧 菜单项
- 首页
- 运营管理(可展开)
- 数据中心
- 优惠券营销工具管理
- 预售营销工具管理
- 会员管理(可展开,包含等级设置等子菜单)
- 钱包管理(可展开)
- 运费管理(可展开)
## 使用方法
1. **直接打开**
```bash
# 在浏览器中打开
open index.html
# 或者
double-click index.html
```
2. **本地服务器运行**(推荐)
```bash
# 使用Python
python -m http.server 8000
# 或使用Node.js
npx serve .
# 然后访问 http://localhost:8000
```
## 技术实现
- **HTML5**: 语义化标签结构
- **CSS3**: 基于Tailwind CSS的样式系统包含自定义动画
- **JavaScript ES6+**: 原生JS实现所有交互功能
- **响应式设计**: 适配不同设备屏幕
## 浏览器兼容性
- Chrome 60+
- Firefox 55+
- Safari 12+
- Edge 79+
## 快捷键
- `ESC`: 返回首页
- `Ctrl+F`: 聚焦搜索框
## 定制说明
如需修改样式或功能,可以编辑以下文件:
- `css/styles.css`: 修改样式
- `js/main.js`: 修改交互逻辑
- `index.html`: 修改页面结构
## 注意事项
1. 这是一个静态演示版本,所有数据都是模拟数据
2. 开关切换、按钮点击等操作只有视觉反馈,不会实际提交数据
3. 为了演示效果,保留了完整的交互逻辑和动画效果
## 原项目信息
- 原技术栈: Next.js + React + Tailwind CSS + shadcn/ui
- 转换时间: 2025年
- 转换方式: 手动转换为纯HTML/CSS/JS

View File

@ -1,638 +0,0 @@
/* Reset and Base Styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
line-height: 1.5;
color: #111827;
background-color: #f9fafb;
}
/* Utility Classes */
.min-h-screen {
min-height: 100vh;
}
.bg-gray-50 {
background-color: #f9fafb;
}
.bg-green-700 {
background-color: #15803d;
}
.bg-green-600 {
background-color: #16a34a;
}
.bg-white {
background-color: #ffffff;
}
.bg-gray-100 {
background-color: #f3f4f6;
}
.bg-gray-200 {
background-color: #e5e7eb;
}
.bg-gray-300 {
background-color: #d1d5db;
}
.text-white {
color: #ffffff;
}
.text-gray-500 {
color: #6b7280;
}
.text-gray-600 {
color: #4b5563;
}
.text-gray-700 {
color: #374151;
}
.text-gray-900 {
color: #111827;
}
.text-blue-500 {
color: #3b82f6;
}
.text-green-600 {
color: #16a34a;
}
.text-green-900 {
color: #14532d;
}
.px-4 {
padding-left: 1rem;
padding-right: 1rem;
}
.py-3 {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
}
.py-2 {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
.py-2\.5 {
padding-top: 0.625rem;
padding-bottom: 0.625rem;
}
.py-4 {
padding-top: 1rem;
padding-bottom: 1rem;
}
.py-6 {
padding-top: 1.5rem;
padding-bottom: 1.5rem;
}
.px-3 {
padding-left: 0.75rem;
padding-right: 0.75rem;
}
.px-6 {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
.p-2 {
padding: 0.5rem;
}
.p-3 {
padding: 0.75rem;
}
.p-6 {
padding: 1.5rem;
}
.flex {
display: flex;
}
.items-center {
align-items: center;
}
.justify-between {
justify-content: space-between;
}
.justify-center {
justify-content: center;
}
.gap-2 {
gap: 0.5rem;
}
.gap-3 {
gap: 0.75rem;
}
.gap-4 {
gap: 1rem;
}
.text-lg {
font-size: 1.125rem;
line-height: 1.75rem;
}
.text-sm {
font-size: 0.875rem;
line-height: 1.25rem;
}
.text-xs {
font-size: 0.75rem;
line-height: 1rem;
}
.font-medium {
font-weight: 500;
}
.h-4 {
height: 1rem;
}
.w-4 {
width: 1rem;
}
.h-3 {
height: 0.75rem;
}
.w-3 {
width: 0.75rem;
}
.h-8 {
height: 2rem;
}
.w-8 {
width: 2rem;
}
.h-16 {
height: 4rem;
}
.w-16 {
width: 4rem;
}
.h-96 {
height: 24rem;
}
.h-full {
height: 100%;
}
.w-full {
width: 100%;
}
.w-48 {
width: 12rem;
}
.w-11 {
width: 2.75rem;
}
.h-6 {
height: 1.5rem;
}
.h-5 {
height: 1.25rem;
}
.w-5 {
width: 1.25rem;
}
.rounded-md {
border-radius: 0.375rem;
}
.rounded-lg {
border-radius: 0.5rem;
}
.rounded-full {
border-radius: 9999px;
}
.border {
border-width: 1px;
}
.border-r {
border-right-width: 1px;
}
.border-b {
border-bottom-width: 1px;
}
.border-l-2 {
border-left-width: 2px;
}
.border-gray-200 {
border-color: #e5e7eb;
}
.border-gray-100 {
border-color: #f3f4f6;
}
.border-gray-300 {
border-color: #d1d5db;
}
.border-green-500 {
border-color: #22c55e;
}
.shadow-sm {
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.cursor-pointer {
cursor: pointer;
}
.select-none {
user-select: none;
}
.space-y-1 > * + * {
margin-top: 0.25rem;
}
.flex-1 {
flex: 1 1 0%;
}
.transition-transform {
transition-property: transform;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.transition-colors {
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.rotate-180 {
transform: rotate(180deg);
}
.ml-4 {
margin-left: 1rem;
}
.mt-2 {
margin-top: 0.5rem;
}
.mb-4 {
margin-bottom: 1rem;
}
.mx-auto {
margin-left: auto;
margin-right: auto;
}
.text-center {
text-align: center;
}
.text-left {
text-align: left;
}
.uppercase {
text-transform: uppercase;
}
.tracking-wider {
letter-spacing: 0.05em;
}
.whitespace-nowrap {
white-space: nowrap;
}
.overflow-x-auto {
overflow-x: auto;
}
.divide-y > * + * {
border-top-width: 1px;
}
.divide-gray-200 > * + * {
border-color: #e5e7eb;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.peer:checked ~ .peer-checked\:bg-green-600 {
background-color: #16a34a;
}
.peer-checked\:after\:translate-x-full {
content: '';
}
.peer:checked ~ .peer-checked\:after\:translate-x-full::after {
transform: translateX(100%);
}
.peer-checked\:after\:border-white::after {
border-color: #ffffff;
}
.after\:content-\[\'\'\]::after {
content: '';
}
.after\:absolute::after {
position: absolute;
}
.after\:top-\[2px\]::after {
top: 2px;
}
.after\:left-\[2px\]::after {
left: 2px;
}
.after\:bg-white::after {
background-color: #ffffff;
}
.after\:border-gray-300::after {
border-color: #d1d5db;
}
.after\:border::after {
border-width: 1px;
}
.after\:rounded-full::after {
border-radius: 9999px;
}
.after\:h-5::after {
height: 1.25rem;
}
.after\:w-5::after {
width: 1.25rem;
}
.after\:transition-all::after {
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.peer-focus\:outline-none:focus ~ .peer-focus\:outline-none {
outline: 2px solid transparent;
outline-offset: 2px;
}
.peer-focus\:ring-4:focus ~ .peer-focus\:ring-4 {
box-shadow: 0 0 0 4px;
}
.peer-focus\:ring-green-300:focus ~ .peer-focus\:ring-green-300 {
box-shadow: 0 0 0 4px rgba(134, 239, 172, 0.5);
}
.min-h-\[calc\(100vh-60px\)\] {
min-height: calc(100vh - 60px);
}
.relative {
position: relative;
}
.inline-flex {
display: inline-flex;
}
.absolute {
position: absolute;
}
.top-\[2px\] {
top: 2px;
}
.left-\[2px\] {
left: 2px;
}
.hidden {
display: none;
}
/* Hover Effects */
.hover\:bg-gray-50:hover {
background-color: #f9fafb;
}
.hover\:bg-gray-100:hover {
background-color: #f3f4f6;
}
.hover\:bg-green-600:hover {
background-color: #16a34a;
}
.hover\:text-green-900:hover {
color: #14532d;
}
/* Focus Effects */
.focus\:border-green-500:focus {
border-color: #22c55e;
}
.focus\:outline-none:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
/* Custom Toggle Switch Styles */
.toggle-switch {
position: relative;
display: inline-block;
width: 44px;
height: 24px;
}
.toggle-switch input {
opacity: 0;
width: 0;
height: 0;
}
.toggle-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #e5e7eb;
transition: .4s;
border-radius: 24px;
}
.toggle-slider:before {
position: absolute;
content: "";
height: 20px;
width: 20px;
left: 2px;
top: 2px;
background-color: white;
transition: .4s;
border-radius: 50%;
border: 1px solid #d1d5db;
}
input:checked + .toggle-slider {
background-color: #16a34a;
}
input:focus + .toggle-slider {
box-shadow: 0 0 0 4px rgba(134, 239, 172, 0.3);
}
input:checked + .toggle-slider:before {
transform: translateX(20px);
border-color: white;
}
/* Table Styles */
table {
border-collapse: collapse;
}
thead th {
background-color: #f9fafb;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 0.75rem;
color: #6b7280;
padding: 0.75rem 1.5rem;
text-align: left;
}
tbody td {
padding: 1rem 1.5rem;
border-top: 1px solid #e5e7eb;
font-size: 0.875rem;
}
tbody tr:hover {
background-color: #f9fafb;
}
/* Button Styles */
button {
border: none;
background: none;
cursor: pointer;
font-family: inherit;
}
/* Input Styles */
input[type="text"] {
border: 1px solid #e5e7eb;
border-radius: 0.375rem;
padding: 0.5rem 0.75rem;
font-size: 0.875rem;
width: 100%;
transition: border-color 0.15s ease;
}
input[type="text"]:focus {
outline: none;
border-color: #22c55e;
}
/* Animation */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.fade-in {
animation: fadeIn 0.3s ease-in;
}
/* Responsive */
@media (max-width: 768px) {
.w-48 {
width: 100%;
}
.flex {
flex-direction: column;
}
.min-h-\[calc\(100vh-60px\)\] {
min-height: auto;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 568 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="215" height="48" fill="none"><path fill="#000" d="M57.588 9.6h6L73.828 38h-5.2l-2.36-6.88h-11.36L52.548 38h-5.2l10.24-28.4Zm7.16 17.16-4.16-12.16-4.16 12.16h8.32Zm23.694-2.24c-.186-1.307-.706-2.32-1.56-3.04-.853-.72-1.866-1.08-3.04-1.08-1.68 0-2.986.613-3.92 1.84-.906 1.227-1.36 2.947-1.36 5.16s.454 3.933 1.36 5.16c.934 1.227 2.24 1.84 3.92 1.84 1.254 0 2.307-.373 3.16-1.12.854-.773 1.387-1.867 1.6-3.28l5.12.24c-.186 1.68-.733 3.147-1.64 4.4-.906 1.227-2.08 2.173-3.52 2.84-1.413.667-2.986 1-4.72 1-2.08 0-3.906-.453-5.48-1.36-1.546-.907-2.76-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84 0-2.24.427-4.187 1.28-5.84.88-1.68 2.094-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.68 0 3.227.32 4.64.96 1.414.64 2.56 1.56 3.44 2.76.907 1.2 1.454 2.6 1.64 4.2l-5.12.28Zm11.486-7.72.12 3.4c.534-1.227 1.307-2.173 2.32-2.84 1.04-.693 2.267-1.04 3.68-1.04 1.494 0 2.76.387 3.8 1.16 1.067.747 1.827 1.813 2.28 3.2.507-1.44 1.294-2.52 2.36-3.24 1.094-.747 2.414-1.12 3.96-1.12 1.414 0 2.64.307 3.68.92s1.84 1.52 2.4 2.72c.56 1.2.84 2.667.84 4.4V38h-4.96V25.92c0-1.813-.293-3.187-.88-4.12-.56-.96-1.413-1.44-2.56-1.44-.906 0-1.68.213-2.32.64-.64.427-1.133 1.053-1.48 1.88-.32.827-.48 1.84-.48 3.04V38h-4.56V25.92c0-1.2-.133-2.213-.4-3.04-.24-.827-.626-1.453-1.16-1.88-.506-.427-1.133-.64-1.88-.64-.906 0-1.68.227-2.32.68-.64.427-1.133 1.053-1.48 1.88-.32.827-.48 1.827-.48 3V38h-4.96V16.8h4.48Zm26.723 10.6c0-2.24.427-4.187 1.28-5.84.854-1.68 2.067-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.84 0 3.494.413 4.96 1.24 1.467.827 2.64 2.08 3.52 3.76.88 1.653 1.347 3.693 1.4 6.12v1.32h-15.08c.107 1.813.614 3.227 1.52 4.24.907.987 2.134 1.48 3.68 1.48.987 0 1.88-.253 2.68-.76a4.803 4.803 0 0 0 1.84-2.2l5.08.36c-.64 2.027-1.84 3.64-3.6 4.84-1.733 1.173-3.733 1.76-6 1.76-2.08 0-3.906-.453-5.48-1.36-1.573-.907-2.786-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84Zm15.16-2.04c-.213-1.733-.76-3.013-1.64-3.84-.853-.827-1.893-1.24-3.12-1.24-1.44 0-2.6.453-3.48 1.36-.88.88-1.44 2.12-1.68 3.72h9.92ZM163.139 9.6V38h-5.04V9.6h5.04Zm8.322 7.2.24 5.88-.64-.36c.32-2.053 1.094-3.56 2.32-4.52 1.254-.987 2.787-1.48 4.6-1.48 2.32 0 4.107.733 5.36 2.2 1.254 1.44 1.88 3.387 1.88 5.84V38h-4.96V25.92c0-1.253-.12-2.28-.36-3.08-.24-.8-.64-1.413-1.2-1.84-.533-.427-1.253-.64-2.16-.64-1.44 0-2.573.48-3.4 1.44-.8.933-1.2 2.307-1.2 4.12V38h-4.96V16.8h4.48Zm30.003 7.72c-.186-1.307-.706-2.32-1.56-3.04-.853-.72-1.866-1.08-3.04-1.08-1.68 0-2.986.613-3.92 1.84-.906 1.227-1.36 2.947-1.36 5.16s.454 3.933 1.36 5.16c.934 1.227 2.24 1.84 3.92 1.84 1.254 0 2.307-.373 3.16-1.12.854-.773 1.387-1.867 1.6-3.28l5.12.24c-.186 1.68-.733 3.147-1.64 4.4-.906 1.227-2.08 2.173-3.52 2.84-1.413.667-2.986 1-4.72 1-2.08 0-3.906-.453-5.48-1.36-1.546-.907-2.76-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84 0-2.24.427-4.187 1.28-5.84.88-1.68 2.094-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.68 0 3.227.32 4.64.96 1.414.64 2.56 1.56 3.44 2.76.907 1.2 1.454 2.6 1.64 4.2l-5.12.28Zm11.443 8.16V38h-5.6v-5.32h5.6Z"/><path fill="#171717" fill-rule="evenodd" d="m7.839 40.783 16.03-28.054L20 6 0 40.783h7.839Zm8.214 0H40L27.99 19.894l-4.02 7.032 3.976 6.914H20.02l-3.967 6.943Z" clip-rule="evenodd"/></svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1200" fill="none"><rect width="1200" height="1200" fill="#EAEAEA" rx="3"/><g opacity=".5"><g opacity=".5"><path fill="#FAFAFA" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/></g><path stroke="url(#a)" stroke-width="2.418" d="M0-1.209h553.581" transform="scale(1 -1) rotate(45 1163.11 91.165)"/><path stroke="url(#b)" stroke-width="2.418" d="M404.846 598.671h391.726"/><path stroke="url(#c)" stroke-width="2.418" d="M599.5 795.742V404.017"/><path stroke="url(#d)" stroke-width="2.418" d="m795.717 796.597-391.441-391.44"/><path fill="#fff" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/><g clip-path="url(#e)"><path fill="#666" fill-rule="evenodd" d="M616.426 586.58h-31.434v16.176l3.553-3.554.531-.531h9.068l.074-.074 8.463-8.463h2.565l7.18 7.181V586.58Zm-15.715 14.654 3.698 3.699 1.283 1.282-2.565 2.565-1.282-1.283-5.2-5.199h-6.066l-5.514 5.514-.073.073v2.876a2.418 2.418 0 0 0 2.418 2.418h26.598a2.418 2.418 0 0 0 2.418-2.418v-8.317l-8.463-8.463-7.181 7.181-.071.072Zm-19.347 5.442v4.085a6.045 6.045 0 0 0 6.046 6.045h26.598a6.044 6.044 0 0 0 6.045-6.045v-7.108l1.356-1.355-1.282-1.283-.074-.073v-17.989h-38.689v23.43l-.146.146.146.147Z" clip-rule="evenodd"/></g><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/></g><defs><linearGradient id="a" x1="554.061" x2="-.48" y1=".083" y2=".087" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="b" x1="796.912" x2="404.507" y1="599.963" y2="599.965" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="c" x1="600.792" x2="600.794" y1="403.677" y2="796.082" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="404.85" x2="796.972" y1="403.903" y2="796.02" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><clipPath id="e"><path fill="#fff" d="M581.364 580.535h38.689v38.689h-38.689z"/></clipPath></defs></svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -1,305 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>大数集市商户端</title>
<link rel="stylesheet" href="./css/styles.css">
</head>
<body>
<div class="min-h-screen bg-gray-50">
<!-- Header -->
<header class="bg-green-700 text-white px-4 py-3 flex items-center justify-between">
<div class="flex items-center gap-4">
<h1 class="text-lg font-medium">大数集市商户端</h1>
</div>
<div class="flex items-center gap-2">
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<div class="h-8 w-8 rounded-full bg-green-600 text-white flex items-center justify-center text-xs">
用户
</div>
</div>
</header>
<div class="flex">
<!-- Sidebar -->
<aside class="w-48 bg-white border-r border-gray-200 min-h-[calc(100vh-60px)]">
<!-- Search -->
<div class="p-3 border-b border-gray-100">
<input type="text" placeholder="快速搜索菜单" class="w-full text-sm border border-gray-200 rounded-md px-3 py-2 focus:border-green-500 focus:outline-none">
</div>
<!-- Navigation Menu -->
<nav class="py-2">
<div class="space-y-1">
<!-- Home -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-blue-500 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9,22 9,12 15,12 15,22" />
</svg>
<span>首页</span>
</div>
<!-- Operations Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('operations')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 13h8V3H3v10zm0 8h8V16H3v5zm10-8h8V3h-8v10zm0 8h8V16h-8v5z" />
</svg>
<span>运营管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="operations-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Data Center -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<ellipse cx="12" cy="5" rx="9" ry="3" />
<path d="m3 5 9 9 9-9" />
<path d="m3 12 9 9 9-9" />
<path d="m3 5v14c0 3 4 6 9 6s9-3 9-6V5" />
</svg>
<span>数据中心</span>
</div>
<!-- Coupon Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" />
</svg>
<span>优惠券营销工具管理</span>
</div>
<!-- Pre-sale Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 20V10M6 16l6-6 6 6" />
</svg>
<span>预售营销工具管理</span>
</div>
<!-- Member Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('member')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="m22 21-3-3m0 0a8 8 0 1 1-11.31-11.31 8 8 0 0 1 11.31 11.31z" />
</svg>
<span>会员管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="member-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
<div class="bg-gray-50 border-l-2 border-green-500 ml-4 hidden" id="member-submenu">
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer" onclick="showLevelSettings()">
<span>等级设置</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>会员查看</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分任务</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分商品</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分订单</span>
</div>
</div>
</div>
<!-- Wallet Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('wallet')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12V5a4 4 0 0 1 4-4h6a4 4 0 0 1 4 4v7" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 20h18M3 20a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h18a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H3z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20v-6" />
</svg>
<span>钱包管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="wallet-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Shipping Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('shipping')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 18V6a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v11a1 1 0 0 0 1 1h2" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 18H9" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14" />
<circle cx="17" cy="18" r="2" />
<circle cx="7" cy="18" r="2" />
</svg>
<span>运费管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="shipping-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
</div>
</nav>
</aside>
<!-- Main Content -->
<main class="flex-1 p-6">
<!-- Default Content -->
<div id="default-content" class="bg-white rounded-lg shadow-sm border border-gray-200 h-96">
<div class="flex items-center justify-center h-full text-gray-500">
<div class="text-center">
<svg class="h-16 w-16 mx-auto mb-4 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
</svg>
<p class="text-lg">欢迎使用大数集市商户端</p>
<p class="text-sm mt-2">请从左侧菜单选择功能</p>
</div>
</div>
</div>
<!-- Level Settings Content -->
<div id="level-settings-content" class="bg-white rounded-lg shadow-sm border border-gray-200 hidden">
<div class="p-6 border-b border-gray-200">
<h2 class="text-lg font-medium text-gray-900">等级设置</h2>
</div>
<div class="overflow-x-auto">
<table class="w-full">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
店铺名称
</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
是否启用会员
</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
会员等级
</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
操作
</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">时尚服装店</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" checked onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2, lv3, lv4</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium">
设置等级明细
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">数码电子城</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2, lv3</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium">
设置等级明细
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">美食餐厅</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" checked onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2, lv3, lv4</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium">
设置等级明细
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">家居生活馆</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium">
设置等级明细
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">运动健身店</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" checked onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2, lv3, lv4</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium">
设置等级明细
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</main>
</div>
</div>
<script src="./js/main.js"></script>
</body>
</html>

View File

@ -1,259 +0,0 @@
// 全局状态管理
let currentExpandedMenus = [];
let currentSelectedMenuItem = '';
// DOM 加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
console.log('大数集市商户端初始化完成');
// 初始化菜单状态
initializeMenus();
// 初始化开关状态
initializeSwitches();
// 添加搜索功能
initializeSearch();
});
// 菜单展开/收起功能
function toggleMenu(menuId) {
const arrow = document.getElementById(menuId + '-arrow');
const submenu = document.getElementById(menuId + '-submenu');
if (currentExpandedMenus.includes(menuId)) {
// 收起菜单
currentExpandedMenus = currentExpandedMenus.filter(id => id !== menuId);
if (arrow) {
arrow.classList.remove('rotate-180');
}
if (submenu) {
submenu.classList.add('hidden');
}
} else {
// 展开菜单
currentExpandedMenus.push(menuId);
if (arrow) {
arrow.classList.add('rotate-180');
}
if (submenu) {
submenu.classList.remove('hidden');
submenu.classList.add('fade-in');
}
}
console.log('菜单状态更新:', menuId, currentExpandedMenus);
}
// 显示等级设置页面
function showLevelSettings() {
// 隐藏默认内容
const defaultContent = document.getElementById('default-content');
const levelSettingsContent = document.getElementById('level-settings-content');
if (defaultContent) {
defaultContent.classList.add('hidden');
}
if (levelSettingsContent) {
levelSettingsContent.classList.remove('hidden');
levelSettingsContent.classList.add('fade-in');
}
currentSelectedMenuItem = 'level-settings';
console.log('切换到等级设置页面');
}
// 显示默认页面
function showDefaultContent() {
const defaultContent = document.getElementById('default-content');
const levelSettingsContent = document.getElementById('level-settings-content');
if (levelSettingsContent) {
levelSettingsContent.classList.add('hidden');
}
if (defaultContent) {
defaultContent.classList.remove('hidden');
defaultContent.classList.add('fade-in');
}
currentSelectedMenuItem = '';
console.log('切换到默认页面');
}
// 开关切换功能
function toggleSwitch(switchElement) {
const isChecked = switchElement.checked;
console.log('开关状态:', isChecked);
// 添加视觉反馈
const slider = switchElement.nextElementSibling;
if (slider) {
if (isChecked) {
slider.style.backgroundColor = '#16a34a';
} else {
slider.style.backgroundColor = '#e5e7eb';
}
}
}
// 初始化菜单状态
function initializeMenus() {
// 会员管理菜单默认展开
toggleMenu('member');
// 添加首页点击事件
const homeMenuItem = document.querySelector('[onclick*="首页"]');
if (homeMenuItem) {
homeMenuItem.addEventListener('click', showDefaultContent);
}
console.log('菜单初始化完成');
}
// 初始化开关状态
function initializeSwitches() {
const switches = document.querySelectorAll('input[type="checkbox"]');
switches.forEach(switchElement => {
// 为已选中的开关设置正确的样式
if (switchElement.checked) {
const slider = switchElement.nextElementSibling;
if (slider) {
slider.style.backgroundColor = '#16a34a';
}
}
});
console.log('开关初始化完成,共', switches.length, '个开关');
}
// 搜索功能
function initializeSearch() {
const searchInput = document.querySelector('input[placeholder*="搜索"]');
if (searchInput) {
searchInput.addEventListener('input', function(e) {
const searchTerm = e.target.value.toLowerCase();
filterMenuItems(searchTerm);
});
}
}
// 过滤菜单项
function filterMenuItems(searchTerm) {
const menuItems = document.querySelectorAll('nav div');
menuItems.forEach(item => {
const text = item.textContent.toLowerCase();
if (text.includes(searchTerm) || searchTerm === '') {
item.style.display = '';
} else {
item.style.display = 'none';
}
});
console.log('搜索筛选:', searchTerm);
}
// 添加一些实用的辅助函数
function showNotification(message, type = 'info') {
console.log('通知:', message, '类型:', type);
// 创建通知元素
const notification = document.createElement('div');
notification.className = `notification ${type}`;
notification.textContent = message;
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
padding: 12px 20px;
border-radius: 6px;
color: white;
font-size: 14px;
z-index: 1000;
transition: all 0.3s ease;
`;
// 根据类型设置颜色
switch(type) {
case 'success':
notification.style.backgroundColor = '#16a34a';
break;
case 'error':
notification.style.backgroundColor = '#dc2626';
break;
case 'warning':
notification.style.backgroundColor = '#d97706';
break;
default:
notification.style.backgroundColor = '#3b82f6';
}
document.body.appendChild(notification);
// 3秒后自动消失
setTimeout(() => {
notification.style.opacity = '0';
setTimeout(() => {
document.body.removeChild(notification);
}, 300);
}, 3000);
}
// 等级明细设置功能
function showLevelDetail(shopName) {
showNotification(`正在设置 ${shopName} 的等级明细`, 'info');
console.log('设置等级明细:', shopName);
}
// 添加表格行的点击事件
document.addEventListener('DOMContentLoaded', function() {
const levelDetailButtons = document.querySelectorAll('button');
levelDetailButtons.forEach(button => {
if (button.textContent.includes('设置等级明细')) {
button.addEventListener('click', function() {
const row = this.closest('tr');
const shopName = row.querySelector('td').textContent;
showLevelDetail(shopName);
});
}
});
});
// 键盘快捷键支持
document.addEventListener('keydown', function(e) {
// ESC键回到首页
if (e.key === 'Escape') {
showDefaultContent();
}
// Ctrl+F 聚焦搜索框
if (e.ctrlKey && e.key === 'f') {
e.preventDefault();
const searchInput = document.querySelector('input[placeholder*="搜索"]');
if (searchInput) {
searchInput.focus();
}
}
});
// 窗口大小变化时的响应式处理
window.addEventListener('resize', function() {
const sidebar = document.querySelector('aside');
if (window.innerWidth < 768 && sidebar) {
console.log('切换到移动端布局');
// 可以在这里添加移动端特定的逻辑
}
});
// 导出一些全局函数供HTML调用
window.toggleMenu = toggleMenu;
window.showLevelSettings = showLevelSettings;
window.showDefaultContent = showDefaultContent;
window.toggleSwitch = toggleSwitch;
window.showLevelDetail = showLevelDetail;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 568 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="215" height="48" fill="none"><path fill="#000" d="M57.588 9.6h6L73.828 38h-5.2l-2.36-6.88h-11.36L52.548 38h-5.2l10.24-28.4Zm7.16 17.16-4.16-12.16-4.16 12.16h8.32Zm23.694-2.24c-.186-1.307-.706-2.32-1.56-3.04-.853-.72-1.866-1.08-3.04-1.08-1.68 0-2.986.613-3.92 1.84-.906 1.227-1.36 2.947-1.36 5.16s.454 3.933 1.36 5.16c.934 1.227 2.24 1.84 3.92 1.84 1.254 0 2.307-.373 3.16-1.12.854-.773 1.387-1.867 1.6-3.28l5.12.24c-.186 1.68-.733 3.147-1.64 4.4-.906 1.227-2.08 2.173-3.52 2.84-1.413.667-2.986 1-4.72 1-2.08 0-3.906-.453-5.48-1.36-1.546-.907-2.76-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84 0-2.24.427-4.187 1.28-5.84.88-1.68 2.094-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.68 0 3.227.32 4.64.96 1.414.64 2.56 1.56 3.44 2.76.907 1.2 1.454 2.6 1.64 4.2l-5.12.28Zm11.486-7.72.12 3.4c.534-1.227 1.307-2.173 2.32-2.84 1.04-.693 2.267-1.04 3.68-1.04 1.494 0 2.76.387 3.8 1.16 1.067.747 1.827 1.813 2.28 3.2.507-1.44 1.294-2.52 2.36-3.24 1.094-.747 2.414-1.12 3.96-1.12 1.414 0 2.64.307 3.68.92s1.84 1.52 2.4 2.72c.56 1.2.84 2.667.84 4.4V38h-4.96V25.92c0-1.813-.293-3.187-.88-4.12-.56-.96-1.413-1.44-2.56-1.44-.906 0-1.68.213-2.32.64-.64.427-1.133 1.053-1.48 1.88-.32.827-.48 1.84-.48 3.04V38h-4.56V25.92c0-1.2-.133-2.213-.4-3.04-.24-.827-.626-1.453-1.16-1.88-.506-.427-1.133-.64-1.88-.64-.906 0-1.68.227-2.32.68-.64.427-1.133 1.053-1.48 1.88-.32.827-.48 1.827-.48 3V38h-4.96V16.8h4.48Zm26.723 10.6c0-2.24.427-4.187 1.28-5.84.854-1.68 2.067-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.84 0 3.494.413 4.96 1.24 1.467.827 2.64 2.08 3.52 3.76.88 1.653 1.347 3.693 1.4 6.12v1.32h-15.08c.107 1.813.614 3.227 1.52 4.24.907.987 2.134 1.48 3.68 1.48.987 0 1.88-.253 2.68-.76a4.803 4.803 0 0 0 1.84-2.2l5.08.36c-.64 2.027-1.84 3.64-3.6 4.84-1.733 1.173-3.733 1.76-6 1.76-2.08 0-3.906-.453-5.48-1.36-1.573-.907-2.786-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84Zm15.16-2.04c-.213-1.733-.76-3.013-1.64-3.84-.853-.827-1.893-1.24-3.12-1.24-1.44 0-2.6.453-3.48 1.36-.88.88-1.44 2.12-1.68 3.72h9.92ZM163.139 9.6V38h-5.04V9.6h5.04Zm8.322 7.2.24 5.88-.64-.36c.32-2.053 1.094-3.56 2.32-4.52 1.254-.987 2.787-1.48 4.6-1.48 2.32 0 4.107.733 5.36 2.2 1.254 1.44 1.88 3.387 1.88 5.84V38h-4.96V25.92c0-1.253-.12-2.28-.36-3.08-.24-.8-.64-1.413-1.2-1.84-.533-.427-1.253-.64-2.16-.64-1.44 0-2.573.48-3.4 1.44-.8.933-1.2 2.307-1.2 4.12V38h-4.96V16.8h4.48Zm30.003 7.72c-.186-1.307-.706-2.32-1.56-3.04-.853-.72-1.866-1.08-3.04-1.08-1.68 0-2.986.613-3.92 1.84-.906 1.227-1.36 2.947-1.36 5.16s.454 3.933 1.36 5.16c.934 1.227 2.24 1.84 3.92 1.84 1.254 0 2.307-.373 3.16-1.12.854-.773 1.387-1.867 1.6-3.28l5.12.24c-.186 1.68-.733 3.147-1.64 4.4-.906 1.227-2.08 2.173-3.52 2.84-1.413.667-2.986 1-4.72 1-2.08 0-3.906-.453-5.48-1.36-1.546-.907-2.76-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84 0-2.24.427-4.187 1.28-5.84.88-1.68 2.094-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.68 0 3.227.32 4.64.96 1.414.64 2.56 1.56 3.44 2.76.907 1.2 1.454 2.6 1.64 4.2l-5.12.28Zm11.443 8.16V38h-5.6v-5.32h5.6Z"/><path fill="#171717" fill-rule="evenodd" d="m7.839 40.783 16.03-28.054L20 6 0 40.783h7.839Zm8.214 0H40L27.99 19.894l-4.02 7.032 3.976 6.914H20.02l-3.967 6.943Z" clip-rule="evenodd"/></svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1200" fill="none"><rect width="1200" height="1200" fill="#EAEAEA" rx="3"/><g opacity=".5"><g opacity=".5"><path fill="#FAFAFA" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/></g><path stroke="url(#a)" stroke-width="2.418" d="M0-1.209h553.581" transform="scale(1 -1) rotate(45 1163.11 91.165)"/><path stroke="url(#b)" stroke-width="2.418" d="M404.846 598.671h391.726"/><path stroke="url(#c)" stroke-width="2.418" d="M599.5 795.742V404.017"/><path stroke="url(#d)" stroke-width="2.418" d="m795.717 796.597-391.441-391.44"/><path fill="#fff" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/><g clip-path="url(#e)"><path fill="#666" fill-rule="evenodd" d="M616.426 586.58h-31.434v16.176l3.553-3.554.531-.531h9.068l.074-.074 8.463-8.463h2.565l7.18 7.181V586.58Zm-15.715 14.654 3.698 3.699 1.283 1.282-2.565 2.565-1.282-1.283-5.2-5.199h-6.066l-5.514 5.514-.073.073v2.876a2.418 2.418 0 0 0 2.418 2.418h26.598a2.418 2.418 0 0 0 2.418-2.418v-8.317l-8.463-8.463-7.181 7.181-.071.072Zm-19.347 5.442v4.085a6.045 6.045 0 0 0 6.046 6.045h26.598a6.044 6.044 0 0 0 6.045-6.045v-7.108l1.356-1.355-1.282-1.283-.074-.073v-17.989h-38.689v23.43l-.146.146.146.147Z" clip-rule="evenodd"/></g><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/></g><defs><linearGradient id="a" x1="554.061" x2="-.48" y1=".083" y2=".087" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="b" x1="796.912" x2="404.507" y1="599.963" y2="599.965" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="c" x1="600.792" x2="600.794" y1="403.677" y2="796.082" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="404.85" x2="796.972" y1="403.903" y2="796.02" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><clipPath id="e"><path fill="#fff" d="M581.364 580.535h38.689v38.689h-38.689z"/></clipPath></defs></svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -3,199 +3,49 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>大数集市商户端</title>
<link rel="stylesheet" href="./css/styles.css">
<title>信息管理系统</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="min-h-screen bg-gray-50">
<!-- Header -->
<header class="bg-green-700 text-white px-4 py-3 flex items-center justify-between">
<div class="flex items-center gap-4">
<h1 class="text-lg font-medium">大数集市商户端</h1>
<div class="container">
<!-- 左侧菜单栏 -->
<div class="sidebar">
<div class="logo">
<h2>管理系统</h2>
</div>
<div class="flex items-center gap-2">
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<div class="h-8 w-8 rounded-full bg-green-600 text-white flex items-center justify-center text-xs">
用户
</div>
</div>
</header>
<div class="flex">
<!-- Sidebar -->
<aside class="w-48 bg-white border-r border-gray-200 min-h-[calc(100vh-60px)]">
<!-- Search -->
<div class="p-3 border-b border-gray-100">
<input type="text" placeholder="快速搜索菜单" class="w-full text-sm border border-gray-200 rounded-md px-3 py-2 focus:border-green-500 focus:outline-none">
</div>
<!-- Navigation Menu -->
<nav class="py-2">
<div class="space-y-1">
<!-- Home -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-blue-500 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9,22 9,12 15,12 15,22" />
</svg>
<span>首页</span>
</div>
<!-- Operations Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('operations')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 13h8V3H3v10zm0 8h8V16H3v5zm10-8h8V3h-8v10zm0 8h8V16h-8v5z" />
</svg>
<span>运营管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="operations-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Data Center -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="window.location.href='pages/data-center.html'">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<ellipse cx="12" cy="5" rx="9" ry="3" />
<path d="m3 5 9 9 9-9" />
<path d="m3 12 9 9 9-9" />
<path d="m3 5v14c0 3 4 6 9 6s9-3 9-6V5" />
</svg>
<span>数据中心</span>
</div>
<!-- Coupon Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="window.location.href='pages/coupon-marketing.html'">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" />
</svg>
<span>优惠券营销工具管理</span>
</div>
<!-- Pre-sale Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 20V10M6 16l6-6 6 6" />
</svg>
<span>预售营销工具管理</span>
</div>
<!-- Member Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('member')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="m22 21-3-3m0 0a8 8 0 1 1-11.31-11.31 8 8 0 0 1 11.31 11.31z" />
</svg>
<span>会员管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="member-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
<div class="bg-gray-50 border-l-2 border-green-500 ml-4 hidden" id="member-submenu">
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer" onclick="window.location.href='pages/member/level-settings.html'">
<span>等级设置</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>会员查看</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分任务</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分商品</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分订单</span>
</div>
</div>
</div>
<!-- Wallet Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('wallet')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12V5a4 4 0 0 1 4-4h6a4 4 0 0 1 4 4v7" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 20h18M3 20a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h18a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H3z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20v-6" />
</svg>
<span>钱包管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="wallet-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Shipping Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('shipping')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 18V6a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v11a1 1 0 0 0 1 1h2" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 18H9" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14" />
<circle cx="17" cy="18" r="2" />
<circle cx="7" cy="18" r="2" />
</svg>
<span>运费管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="shipping-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<nav class="menu">
<div class="menu-item">
<div class="menu-title" onclick="toggleSubmenu('member-submenu')">
<span>会员管理</span>
<span class="arrow"></span>
</div>
</nav>
</aside>
<!-- Main Content -->
<main class="flex-1 p-6">
<!-- Default Content -->
<div id="default-content" class="bg-white rounded-lg shadow-sm border border-gray-200 h-96">
<div class="flex items-center justify-center h-full text-gray-500">
<div class="text-center">
<svg class="h-16 w-16 mx-auto mb-4 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
</svg>
<p class="text-lg">欢迎使用大数集市商户端</p>
<p class="text-sm mt-2">请从左侧菜单选择功能</p>
</div>
<div class="submenu" id="member-submenu">
<div class="submenu-item" onclick="openTab('等级设置', 'level-settings')">等级设置</div>
<div class="submenu-item" onclick="openTab('会员查看', 'member-view')">会员查看</div>
</div>
</div>
</main>
</nav>
</div>
<!-- 中央内容区域 -->
<div class="main-content">
<!-- Tab栏 -->
<div class="tab-bar">
<div class="tab active" id="home-tab">
<span>首页</span>
</div>
</div>
<!-- 内容展示区域 -->
<div class="content-area">
<div class="tab-content active" id="home-content">
<h1>欢迎使用信息管理系统</h1>
<p>请从左侧菜单选择功能模块</p>
</div>
</div>
</div>
</div>
<script src="./js/main.js"></script>
<script src="script.js"></script>
</body>
</html>

View File

@ -1,99 +0,0 @@
// 通用工具函数和组件
// 显示通知
function showNotification(message, type = 'info') {
console.log('通知:', message, '类型:', type);
// 创建通知元素
const notification = document.createElement('div');
notification.className = `notification ${type}`;
notification.textContent = message;
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
padding: 12px 20px;
border-radius: 6px;
color: white;
font-size: 14px;
z-index: 1000;
transition: all 0.3s ease;
`;
// 根据类型设置颜色
switch(type) {
case 'success':
notification.style.backgroundColor = '#16a34a';
break;
case 'error':
notification.style.backgroundColor = '#dc2626';
break;
case 'warning':
notification.style.backgroundColor = '#d97706';
break;
default:
notification.style.backgroundColor = '#3b82f6';
}
document.body.appendChild(notification);
// 3秒后自动消失
setTimeout(() => {
notification.style.opacity = '0';
setTimeout(() => {
if (notification.parentNode) {
document.body.removeChild(notification);
}
}, 300);
}, 3000);
}
// 开关切换功能
function toggleSwitch(switchElement) {
const isChecked = switchElement.checked;
console.log('开关状态:', isChecked);
// 添加视觉反馈
const slider = switchElement.nextElementSibling;
if (slider) {
if (isChecked) {
slider.style.backgroundColor = '#16a34a';
} else {
slider.style.backgroundColor = '#e5e7eb';
}
}
}
// 初始化开关状态
function initializeSwitches() {
const switches = document.querySelectorAll('input[type="checkbox"]');
switches.forEach(switchElement => {
// 为已选中的开关设置正确的样式
if (switchElement.checked) {
const slider = switchElement.nextElementSibling;
if (slider) {
slider.style.backgroundColor = '#16a34a';
}
}
});
console.log('开关初始化完成,共', switches.length, '个开关');
}
// 键盘快捷键支持
document.addEventListener('keydown', function(e) {
// ESC键回到首页
if (e.key === 'Escape') {
window.location.href = '../index.html';
}
});
// DOM 加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
console.log('页面初始化完成');
initializeSwitches();
});
// 导出全局函数
window.showNotification = showNotification;
window.toggleSwitch = toggleSwitch;

View File

@ -1,192 +0,0 @@
// 主页面的JavaScript逻辑 - 简化版
// 全局状态管理
let currentExpandedMenus = [];
// DOM 加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
console.log('大数集市商户端主页面初始化完成');
// 初始化菜单状态
initializeMenus();
// 初始化开关状态
initializeSwitches();
// 添加搜索功能
initializeSearch();
});
// 菜单展开/收起功能
function toggleMenu(menuId) {
const arrow = document.getElementById(menuId + '-arrow');
const submenu = document.getElementById(menuId + '-submenu');
if (currentExpandedMenus.includes(menuId)) {
// 收起菜单
currentExpandedMenus = currentExpandedMenus.filter(id => id !== menuId);
if (arrow) {
arrow.classList.remove('rotate-180');
}
if (submenu) {
submenu.classList.add('hidden');
}
} else {
// 展开菜单
currentExpandedMenus.push(menuId);
if (arrow) {
arrow.classList.add('rotate-180');
}
if (submenu) {
submenu.classList.remove('hidden');
submenu.classList.add('fade-in');
}
}
console.log('菜单状态更新:', menuId, currentExpandedMenus);
}
// 开关切换功能
function toggleSwitch(switchElement) {
const isChecked = switchElement.checked;
console.log('开关状态:', isChecked);
// 添加视觉反馈
const slider = switchElement.nextElementSibling;
if (slider) {
if (isChecked) {
slider.style.backgroundColor = '#16a34a';
} else {
slider.style.backgroundColor = '#e5e7eb';
}
}
}
// 初始化菜单状态
function initializeMenus() {
// 会员管理菜单默认展开
toggleMenu('member');
console.log('菜单初始化完成');
}
// 初始化开关状态
function initializeSwitches() {
const switches = document.querySelectorAll('input[type="checkbox"]');
switches.forEach(switchElement => {
// 为已选中的开关设置正确的样式
if (switchElement.checked) {
const slider = switchElement.nextElementSibling;
if (slider) {
slider.style.backgroundColor = '#16a34a';
}
}
});
console.log('开关初始化完成,共', switches.length, '个开关');
}
// 搜索功能
function initializeSearch() {
const searchInput = document.querySelector('input[placeholder*="搜索"]');
if (searchInput) {
searchInput.addEventListener('input', function(e) {
const searchTerm = e.target.value.toLowerCase();
filterMenuItems(searchTerm);
});
}
}
// 过滤菜单项
function filterMenuItems(searchTerm) {
const menuItems = document.querySelectorAll('nav div');
menuItems.forEach(item => {
const text = item.textContent.toLowerCase();
if (text.includes(searchTerm) || searchTerm === '') {
item.style.display = '';
} else {
item.style.display = 'none';
}
});
console.log('搜索筛选:', searchTerm);
}
// 显示通知
function showNotification(message, type = 'info') {
console.log('通知:', message, '类型:', type);
// 创建通知元素
const notification = document.createElement('div');
notification.className = `notification ${type}`;
notification.textContent = message;
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
padding: 12px 20px;
border-radius: 6px;
color: white;
font-size: 14px;
z-index: 1000;
transition: all 0.3s ease;
`;
// 根据类型设置颜色
switch(type) {
case 'success':
notification.style.backgroundColor = '#16a34a';
break;
case 'error':
notification.style.backgroundColor = '#dc2626';
break;
case 'warning':
notification.style.backgroundColor = '#d97706';
break;
default:
notification.style.backgroundColor = '#3b82f6';
}
document.body.appendChild(notification);
// 3秒后自动消失
setTimeout(() => {
notification.style.opacity = '0';
setTimeout(() => {
if (notification.parentNode) {
document.body.removeChild(notification);
}
}, 300);
}, 3000);
}
// 键盘快捷键支持
document.addEventListener('keydown', function(e) {
// Ctrl+F 聚焦搜索框
if (e.ctrlKey && e.key === 'f') {
e.preventDefault();
const searchInput = document.querySelector('input[placeholder*="搜索"]');
if (searchInput) {
searchInput.focus();
}
}
});
// 窗口大小变化时的响应式处理
window.addEventListener('resize', function() {
const sidebar = document.querySelector('aside');
if (window.innerWidth < 768 && sidebar) {
console.log('切换到移动端布局');
// 可以在这里添加移动端特定的逻辑
}
});
// 导出全局函数
window.toggleMenu = toggleMenu;
window.toggleSwitch = toggleSwitch;
window.showNotification = showNotification;

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +0,0 @@
// 优惠券营销工具管理页面的JavaScript逻辑
document.addEventListener('DOMContentLoaded', function() {
console.log('优惠券营销工具管理页面初始化完成');
// 这里可以添加优惠券管理相关的功能
});

View File

@ -1,6 +0,0 @@
// 数据中心页面的JavaScript逻辑
document.addEventListener('DOMContentLoaded', function() {
console.log('数据中心页面初始化完成');
// 这里可以添加数据中心相关的功能
});

View File

@ -1,57 +0,0 @@
// 等级明细页面的JavaScript逻辑
let currentShopName = '';
// 获取URL参数
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
const regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
const results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
}
// 页面初始化
document.addEventListener('DOMContentLoaded', function() {
currentShopName = getUrlParameter('shop');
if (currentShopName) {
document.getElementById('page-title').textContent = `${currentShopName} - 等级设置明细`;
loadLevelData();
}
});
// 加载等级数据
function loadLevelData() {
// 模拟等级数据
const mockLevels = [
{ name: 'LV1', growth: 100, members: 1250, benefits: '9.5折优惠' },
{ name: 'LV2', growth: 500, members: 850, benefits: '9折优惠, 积分双倍' },
{ name: 'LV3', growth: 1200, members: 450, benefits: '8.5折优惠, 积分双倍, 生日优惠券' },
{ name: 'LV4', growth: 2500, members: 180, benefits: '8折优惠, 积分三倍, 生日优惠券, 专属客服' }
];
const tableBody = document.getElementById('level-table-body');
tableBody.innerHTML = mockLevels.map(level => `
<tr>
<td class="px-4 py-3 text-sm text-gray-900">${level.name}</td>
<td class="px-4 py-3 text-sm text-gray-900">${level.growth}</td>
<td class="px-4 py-3 text-sm text-gray-900">${level.members}</td>
<td class="px-4 py-3 text-sm text-gray-900">${level.benefits}</td>
</tr>
`).join('');
}
// 打开等级编辑页面
function openLevelEdit() {
const encodedShopName = encodeURIComponent(currentShopName);
window.location.href = `level-edit.html?shop=${encodedShopName}`;
}
// 提交等级明细
function submitLevelDetail() {
showNotification(`${currentShopName} 等级明细已提交`, 'success');
console.log('提交等级明细:', currentShopName);
}
// 导出函数
window.openLevelEdit = openLevelEdit;
window.submitLevelDetail = submitLevelDetail;

View File

@ -1,323 +0,0 @@
// 等级编辑页面的JavaScript逻辑
let currentShopName = '';
let currentLevels = [];
// 获取URL参数
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
const regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
const results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
}
// 页面初始化
document.addEventListener('DOMContentLoaded', function() {
currentShopName = getUrlParameter('shop');
if (currentShopName) {
document.getElementById('page-title').textContent = `${currentShopName} - 等级编辑`;
loadLevelEditData();
}
});
// 加载等级编辑数据
function loadLevelEditData() {
// 模拟等级编辑数据
currentLevels = [
{
level: 'LV1',
name: '铜牌会员',
growthMin: 0,
growthMax: 100,
memberDiscount: true,
discountRate: 5,
pointExchange: false,
birthdayCoupon: false,
birthdayDoublePoints: false
},
{
level: 'LV2',
name: '银牌会员',
growthMin: 101,
growthMax: 500,
memberDiscount: true,
discountRate: 10,
pointExchange: true,
birthdayCoupon: true,
birthdayDoublePoints: true
},
{
level: 'LV3',
name: '金牌会员',
growthMin: 501,
growthMax: 1200,
memberDiscount: true,
discountRate: 15,
pointExchange: true,
birthdayCoupon: true,
birthdayDoublePoints: true
},
{
level: 'LV4',
name: '钻石会员',
growthMin: 1201,
growthMax: 9999,
memberDiscount: true,
discountRate: 20,
pointExchange: true,
birthdayCoupon: true,
birthdayDoublePoints: true
}
];
renderLevelEditTable();
}
// 渲染等级编辑表格
function renderLevelEditTable() {
const tableBody = document.getElementById('level-edit-table-body');
tableBody.innerHTML = currentLevels.map((level, index) => `
<tr>
<td class="px-3 py-3 text-sm text-gray-900">${level.level}</td>
<td class="px-3 py-3">
<input type="text" value="${level.name}" class="w-full text-sm border border-gray-300 rounded px-2 py-1 focus:border-green-500 focus:outline-none" id="levelName_${index}">
</td>
<td class="px-3 py-3">
<div class="flex items-center gap-1">
<input type="number" value="${level.growthMin}" class="w-16 text-sm border border-gray-300 rounded px-2 py-1 focus:border-green-500 focus:outline-none" id="growthMin_${index}">
<span class="text-gray-500">-</span>
<input type="number" value="${level.growthMax}" class="w-16 text-sm border border-gray-300 rounded px-2 py-1 focus:border-green-500 focus:outline-none" id="growthMax_${index}">
</div>
</td>
<td class="px-3 py-3">
<input type="checkbox" ${level.memberDiscount ? 'checked' : ''} id="memberDiscount_${index}" onchange="toggleDiscountRate(${index})">
</td>
<td class="px-3 py-3">
<input type="number" value="${level.discountRate}" class="w-16 text-sm border border-gray-300 rounded px-2 py-1 focus:border-green-500 focus:outline-none ${!level.memberDiscount ? 'bg-gray-100' : ''}" id="discountRate_${index}" ${!level.memberDiscount ? 'disabled' : ''}>
</td>
<td class="px-3 py-3">
<input type="checkbox" ${level.pointExchange ? 'checked' : ''} id="pointExchange_${index}">
</td>
<td class="px-3 py-3">
<input type="checkbox" ${level.birthdayCoupon ? 'checked' : ''} id="birthdayCoupon_${index}" onchange="toggleCouponButton(${index})">
</td>
<td class="px-3 py-3">
<button class="px-3 py-1 text-xs text-green-600 border border-green-600 rounded hover:bg-green-50 transition-colors ${!level.birthdayCoupon ? 'hidden' : ''}" id="addCouponBtn_${index}" onclick="addBirthdayCoupon(${index})">
添加优惠券
</button>
</td>
<td class="px-3 py-3">
<input type="checkbox" ${level.birthdayDoublePoints ? 'checked' : ''} id="birthdayDoublePoints_${index}">
</td>
<td class="px-3 py-3">
<div class="flex gap-2">
${index === currentLevels.length - 1 ? `
<button class="px-2 py-1 text-xs bg-green-600 text-white rounded hover:bg-green-700" onclick="addNewLevel()">
添加
</button>
` : ''}
<button class="px-2 py-1 text-xs bg-red-600 text-white rounded hover:bg-red-700" onclick="deleteLevel(${index})">
删除
</button>
</div>
</td>
</tr>
`).join('');
}
// 切换折扣率输入框状态
function toggleDiscountRate(index) {
const checkbox = document.getElementById(`memberDiscount_${index}`);
const discountInput = document.getElementById(`discountRate_${index}`);
if (checkbox && discountInput) {
if (checkbox.checked) {
discountInput.disabled = false;
discountInput.classList.remove('bg-gray-100');
} else {
discountInput.disabled = true;
discountInput.classList.add('bg-gray-100');
}
}
}
// 切换优惠券按钮显示
function toggleCouponButton(index) {
const checkbox = document.getElementById(`birthdayCoupon_${index}`);
const addButton = document.getElementById(`addCouponBtn_${index}`);
if (checkbox && addButton) {
if (checkbox.checked) {
addButton.classList.remove('hidden');
} else {
addButton.classList.add('hidden');
}
}
}
// 添加生日优惠券
function addBirthdayCoupon(index) {
// 显示弹窗
const modal = document.getElementById('coupon-modal');
if (modal) {
modal.classList.remove('hidden');
resetCouponForm();
console.log('显示添加生日优惠券弹窗,等级索引:', index);
}
}
// 关闭优惠券弹窗
function closeCouponModal(event) {
// 如果点击的是弹窗背景,则关闭弹窗
if (event && event.target !== event.currentTarget) {
return;
}
const modal = document.getElementById('coupon-modal');
if (modal) {
modal.classList.add('hidden');
console.log('关闭优惠券弹窗');
}
}
// 重置优惠券表单
function resetCouponForm() {
const form = document.getElementById('coupon-form');
if (form) {
// 重置为默认值
document.getElementById('coupon-name').value = '生日优惠券';
document.getElementById('coupon-threshold').value = '10';
document.getElementById('coupon-discount').value = '1';
document.getElementById('coupon-validity').value = '1';
}
}
// 调整门槛金额
function adjustThreshold(delta) {
const input = document.getElementById('coupon-threshold');
if (input) {
const currentValue = parseInt(input.value) || 0;
const newValue = Math.max(0, currentValue + delta);
input.value = newValue;
}
}
// 调整减免金额
function adjustDiscount(delta) {
const input = document.getElementById('coupon-discount');
if (input) {
const currentValue = parseInt(input.value) || 0;
const newValue = Math.max(0, currentValue + delta);
input.value = newValue;
}
}
// 提交优惠券
function submitCoupon() {
const form = document.getElementById('coupon-form');
if (!form) return;
// 获取表单数据
const couponData = {
name: document.getElementById('coupon-name').value,
threshold: document.getElementById('coupon-threshold').value,
discount: document.getElementById('coupon-discount').value,
validity: document.getElementById('coupon-validity').value
};
// 验证表单
if (!couponData.name.trim()) {
showNotification('请输入优惠券名称', 'error');
return;
}
if (!couponData.threshold || couponData.threshold < 0) {
showNotification('请输入有效的门槛金额', 'error');
return;
}
if (!couponData.discount || couponData.discount < 0) {
showNotification('请输入有效的减免金额', 'error');
return;
}
if (parseInt(couponData.discount) >= parseInt(couponData.threshold)) {
showNotification('减免金额不能大于或等于门槛金额', 'error');
return;
}
// 提交成功
console.log('提交优惠券数据:', couponData);
showNotification(`成功添加优惠券:${couponData.name}`, 'success');
// 关闭弹窗
closeCouponModal();
}
// 删除等级行
function deleteLevel(index) {
if (currentLevels.length <= 1) {
showNotification('至少需要保留一个等级', 'warning');
return;
}
currentLevels.splice(index, 1);
// 重新编号等级
currentLevels.forEach((level, i) => {
level.level = `LV${i + 1}`;
});
renderLevelEditTable();
showNotification(`删除等级 ${index + 1}`, 'success');
console.log('删除等级:', index);
}
// 添加新等级
function addNewLevel() {
const newLevelNum = currentLevels.length + 1;
const lastLevel = currentLevels[currentLevels.length - 1];
const newLevel = {
level: `LV${newLevelNum}`,
name: `${getLevelName(newLevelNum)}会员`,
growthMin: lastLevel.growthMax + 1,
growthMax: lastLevel.growthMax + 1000,
memberDiscount: true,
discountRate: Math.min(lastLevel.discountRate + 5, 50),
pointExchange: true,
birthdayCoupon: true,
birthdayDoublePoints: true
};
currentLevels.push(newLevel);
renderLevelEditTable();
showNotification(`添加新等级 LV${newLevelNum}`, 'success');
console.log('添加新等级:', newLevel);
}
// 获取等级名称
function getLevelName(levelNum) {
const names = ['铜牌', '银牌', '金牌', '钻石', '黑钻', '至尊', '王者', '传奇'];
return names[levelNum - 1] || `LV${levelNum}`;
}
// 提交等级编辑
function submitLevelEdit() {
showNotification(`${currentShopName} 等级编辑已提交`, 'success');
console.log('提交等级编辑:', currentShopName);
}
// 导出函数
window.toggleDiscountRate = toggleDiscountRate;
window.toggleCouponButton = toggleCouponButton;
window.addBirthdayCoupon = addBirthdayCoupon;
window.closeCouponModal = closeCouponModal;
window.resetCouponForm = resetCouponForm;
window.adjustThreshold = adjustThreshold;
window.adjustDiscount = adjustDiscount;
window.addCouponThreshold = addCouponThreshold;
window.submitCoupon = submitCoupon;
window.deleteLevel = deleteLevel;
window.addNewLevel = addNewLevel;
window.submitLevelEdit = submitLevelEdit;

View File

@ -1,308 +0,0 @@
// 等级设置页面的Tab系统JavaScript逻辑
// 初始化页面
document.addEventListener('DOMContentLoaded', function() {
initializeSidebar();
initializeSidebarSearch();
// 默认打开等级设置Tab
openLevelSettingsTab();
});
// 打开等级设置Tab从member-tabs.js调用
function openLevelSettingsTab() {
if (typeof memberTabManager !== 'undefined') {
memberTabManager.showDefaultContent();
// 创建等级设置tab
const content = generateLevelSettingsContent();
memberTabManager.createTab('level-settings', '等级设置', content, false);
}
}
// 生成等级设置表格内容
function generateLevelSettingsContent() {
return `
<div class="p-6">
<div class="flex items-center justify-between mb-6">
<h2 class="text-lg font-medium text-gray-900">等级设置</h2>
</div>
<!-- 摊位名称筛选器 -->
<div class="mb-6 flex items-center gap-4">
<div class="flex-1 max-w-md">
<label class="block text-sm font-medium text-gray-700 mb-2">摊位名称</label>
<div class="relative">
<button id="stall-dropdown-btn" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-green-500 bg-white text-left flex items-center justify-between" onclick="toggleStallDropdown()">
<span id="dropdown-text">请选择摊位名称...</span>
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
<div id="stall-dropdown-list" class="absolute z-10 w-full mt-1 bg-white border border-gray-300 rounded-md shadow-lg hidden">
<label class="flex items-center px-3 py-2 hover:bg-gray-50 cursor-pointer">
<input type="checkbox" value="时尚服装店" class="mr-2" onchange="updateSelectedStalls()">
时尚服装店
</label>
<label class="flex items-center px-3 py-2 hover:bg-gray-50 cursor-pointer">
<input type="checkbox" value="数码电子城" class="mr-2" onchange="updateSelectedStalls()">
数码电子城
</label>
<label class="flex items-center px-3 py-2 hover:bg-gray-50 cursor-pointer">
<input type="checkbox" value="美食餐厅" class="mr-2" onchange="updateSelectedStalls()">
美食餐厅
</label>
<label class="flex items-center px-3 py-2 hover:bg-gray-50 cursor-pointer">
<input type="checkbox" value="家居生活馆" class="mr-2" onchange="updateSelectedStalls()">
家居生活馆
</label>
<label class="flex items-center px-3 py-2 hover:bg-gray-50 cursor-pointer">
<input type="checkbox" value="运动健身店" class="mr-2" onchange="updateSelectedStalls()">
运动健身店
</label>
</div>
<div id="selected-stalls" class="mt-2 flex flex-wrap gap-2"></div>
</div>
</div>
<div class="mt-7 flex gap-3">
<button id="query-btn" class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700 transition-colors" onclick="filterStallTable()">
查询
</button>
<button id="batch-edit-btn" class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors" onclick="openBatchLevelEditTab()">
批量会员等级编辑
</button>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
摊位名称
</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
是否启用会员
</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
会员等级
</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
操作
</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">时尚服装店</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" checked onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2, lv3, lv4</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium" onclick="openLevelDetailTab('时尚服装店')">
设置等级明细
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">数码电子城</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2, lv3</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium" onclick="openLevelDetailTab('数码电子城')">
设置等级明细
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">美食餐厅</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" checked onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2, lv3, lv4</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium" onclick="openLevelDetailTab('美食餐厅')">
设置等级明细
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">家居生活馆</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium" onclick="openLevelDetailTab('家居生活馆')">
设置等级明细
</button>
</td>
</tr>
<tr>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">运动健身店</td>
<td class="px-6 py-4 whitespace-nowrap">
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer" checked onchange="toggleSwitch(this)">
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-green-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
</label>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">lv1, lv2, lv3, lv4</td>
<td class="px-6 py-4 whitespace-nowrap">
<button class="text-green-600 hover:text-green-900 text-sm font-medium" onclick="openLevelDetailTab('运动健身店')">
设置等级明细
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
`;
}
// 摊位筛选相关功能
let selectedStalls = [];
let dropdownOpen = false;
function toggleStallDropdown() {
const dropdown = document.getElementById('stall-dropdown-list');
const button = document.getElementById('stall-dropdown-btn');
if (dropdown && button) {
dropdownOpen = !dropdownOpen;
if (dropdownOpen) {
dropdown.classList.remove('hidden');
// 添加点击外部关闭功能
setTimeout(() => {
document.addEventListener('click', closeDropdownOnClickOutside);
}, 0);
} else {
dropdown.classList.add('hidden');
document.removeEventListener('click', closeDropdownOnClickOutside);
}
}
}
function closeDropdownOnClickOutside(event) {
const dropdown = document.getElementById('stall-dropdown-list');
const button = document.getElementById('stall-dropdown-btn');
if (dropdown && button && !dropdown.contains(event.target) && !button.contains(event.target)) {
dropdown.classList.add('hidden');
dropdownOpen = false;
document.removeEventListener('click', closeDropdownOnClickOutside);
}
}
function updateSelectedStalls() {
const checkboxes = document.querySelectorAll('#stall-dropdown-list input[type="checkbox"]');
selectedStalls = [];
checkboxes.forEach(checkbox => {
if (checkbox.checked) {
selectedStalls.push(checkbox.value);
}
});
updateDropdownText();
updateSelectedStallsDisplay();
}
function updateDropdownText() {
const dropdownText = document.getElementById('dropdown-text');
if (dropdownText) {
if (selectedStalls.length === 0) {
dropdownText.textContent = '请选择摊位名称...';
} else if (selectedStalls.length === 1) {
dropdownText.textContent = selectedStalls[0];
} else {
dropdownText.textContent = `已选择 ${selectedStalls.length} 个摊位`;
}
}
}
function updateSelectedStallsDisplay() {
const selectedDiv = document.getElementById('selected-stalls');
if (!selectedDiv) return;
selectedDiv.innerHTML = '';
selectedStalls.forEach(stall => {
const tag = document.createElement('span');
tag.className = 'inline-flex items-center px-2 py-1 rounded-md text-xs font-medium bg-green-100 text-green-800';
tag.innerHTML = `
${stall}
<button type="button" class="ml-1 inline-flex items-center justify-center w-4 h-4 rounded-full hover:bg-green-200" onclick="removeSelectedStall('${stall}')">
<svg class="w-2 h-2" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
</svg>
</button>
`;
selectedDiv.appendChild(tag);
});
}
function removeSelectedStall(stallName) {
selectedStalls = selectedStalls.filter(stall => stall !== stallName);
// 更新checkbox状态
const checkboxes = document.querySelectorAll('#stall-dropdown-list input[type="checkbox"]');
checkboxes.forEach(checkbox => {
if (checkbox.value === stallName) {
checkbox.checked = false;
}
});
updateDropdownText();
updateSelectedStallsDisplay();
}
function filterStallTable() {
const tableRows = document.querySelectorAll('#tab-content-area tbody tr');
if (selectedStalls.length === 0) {
// 如果没有选择任何摊位,显示所有行
tableRows.forEach(row => {
row.style.display = '';
});
showNotification('已显示所有摊位', 'info');
} else {
// 根据选择的摊位筛选表格行
let visibleCount = 0;
tableRows.forEach(row => {
const stallNameCell = row.querySelector('td:first-child');
if (stallNameCell) {
const stallName = stallNameCell.textContent.trim();
if (selectedStalls.includes(stallName)) {
row.style.display = '';
visibleCount++;
} else {
row.style.display = 'none';
}
}
});
showNotification(`已筛选显示 ${visibleCount} 个摊位`, 'success');
}
}
// 导出函数
window.openLevelSettingsTab = openLevelSettingsTab;
window.generateLevelSettingsContent = generateLevelSettingsContent;
window.openBatchLevelEditTab = openBatchLevelEditTab;
window.toggleStallDropdown = toggleStallDropdown;
window.updateSelectedStalls = updateSelectedStalls;
window.removeSelectedStall = removeSelectedStall;
window.filterStallTable = filterStallTable;

View File

@ -1,179 +0,0 @@
// 通用侧边栏组件的JavaScript逻辑
// 全局状态管理
let currentExpandedMenus = [];
// 获取当前页面路径信息
function getCurrentPageInfo() {
const path = window.location.pathname;
const filename = path.split('/').pop();
// 根据文件名判断当前页面
if (filename === 'index.html' || path.endsWith('/')) {
return { section: 'home', page: 'home' };
} else if (filename === 'data-center.html') {
return { section: 'data-center', page: 'data-center' };
} else if (filename === 'coupon-marketing.html') {
return { section: 'coupon-marketing', page: 'coupon-marketing' };
} else if (path.includes('/member/')) {
if (filename === 'level-settings.html') {
return { section: 'member', page: 'level-settings' };
} else if (filename === 'level-detail.html') {
return { section: 'member', page: 'level-detail' };
} else if (filename === 'level-edit.html') {
return { section: 'member', page: 'level-edit' };
}
return { section: 'member', page: 'unknown' };
}
return { section: 'unknown', page: 'unknown' };
}
// 菜单展开/收起功能
function toggleMenu(menuId) {
const arrow = document.getElementById(menuId + '-arrow');
const submenu = document.getElementById(menuId + '-submenu');
if (currentExpandedMenus.includes(menuId)) {
// 收起菜单
currentExpandedMenus = currentExpandedMenus.filter(id => id !== menuId);
if (arrow) {
arrow.classList.remove('rotate-180');
}
if (submenu) {
submenu.classList.add('hidden');
}
} else {
// 展开菜单
currentExpandedMenus.push(menuId);
if (arrow) {
arrow.classList.add('rotate-180');
}
if (submenu) {
submenu.classList.remove('hidden');
submenu.classList.add('fade-in');
}
}
console.log('菜单状态更新:', menuId, currentExpandedMenus);
}
// 初始化菜单状态
function initializeSidebar() {
const currentPage = getCurrentPageInfo();
// 根据当前页面设置菜单状态
if (currentPage.section === 'member') {
// 会员管理菜单默认展开
if (!currentExpandedMenus.includes('member')) {
toggleMenu('member');
}
// 设置当前页面高亮
highlightCurrentMenu(currentPage);
} else if (currentPage.section === 'home') {
// 主页高亮
highlightCurrentMenu(currentPage);
// 会员管理菜单默认展开
if (!currentExpandedMenus.includes('member')) {
toggleMenu('member');
}
} else {
// 其他页面高亮对应菜单
highlightCurrentMenu(currentPage);
}
console.log('侧边栏初始化完成,当前页面:', currentPage);
}
// 高亮当前菜单项
function highlightCurrentMenu(pageInfo) {
// 清除所有高亮状态
document.querySelectorAll('.menu-item').forEach(item => {
item.classList.remove('text-blue-500');
item.classList.add('text-gray-700');
});
// 根据页面信息高亮对应菜单
let targetElement = null;
if (pageInfo.section === 'home') {
targetElement = document.querySelector('[data-menu="home"]');
} else if (pageInfo.section === 'data-center') {
targetElement = document.querySelector('[data-menu="data-center"]');
} else if (pageInfo.section === 'coupon-marketing') {
targetElement = document.querySelector('[data-menu="coupon-marketing"]');
} else if (pageInfo.section === 'member') {
if (pageInfo.page === 'level-settings' || pageInfo.page === 'level-detail' || pageInfo.page === 'level-edit') {
targetElement = document.querySelector('[data-menu="level-settings"]');
}
}
if (targetElement) {
targetElement.classList.remove('text-gray-700', 'text-gray-600');
targetElement.classList.add('text-blue-500');
}
}
// 搜索功能
function initializeSidebarSearch() {
const searchInput = document.querySelector('input[placeholder*="搜索"]');
if (searchInput) {
searchInput.addEventListener('input', function(e) {
const searchTerm = e.target.value.toLowerCase();
filterMenuItems(searchTerm);
});
}
}
// 过滤菜单项
function filterMenuItems(searchTerm) {
const menuItems = document.querySelectorAll('nav div');
menuItems.forEach(item => {
const text = item.textContent.toLowerCase();
if (text.includes(searchTerm) || searchTerm === '') {
item.style.display = '';
} else {
item.style.display = 'none';
}
});
console.log('搜索筛选:', searchTerm);
}
// 页面跳转函数
function navigateToPage(url) {
window.location.href = url;
}
// 获取相对路径
function getRelativePath(targetPath) {
const currentPath = window.location.pathname;
const currentDir = currentPath.substring(0, currentPath.lastIndexOf('/'));
// 判断当前是否在子目录中
if (currentDir.includes('/pages')) {
if (currentDir.includes('/member')) {
// 在 member 子目录中
return targetPath.startsWith('../../') ? targetPath : '../../' + targetPath;
} else {
// 在 pages 目录中
return targetPath.startsWith('../') ? targetPath : '../' + targetPath;
}
}
// 在根目录中
return targetPath;
}
// 导出函数
window.toggleMenu = toggleMenu;
window.initializeSidebar = initializeSidebar;
window.initializeSidebarSearch = initializeSidebarSearch;
window.navigateToPage = navigateToPage;
window.getRelativePath = getRelativePath;

View File

@ -1,213 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>大数集市商户端 - 优惠券营销工具管理</title>
<link rel="stylesheet" href="../css/styles.css">
</head>
<body>
<div class="min-h-screen bg-gray-50">
<!-- Header -->
<header class="bg-green-700 text-white px-4 py-3 flex items-center justify-between">
<div class="flex items-center gap-4">
<button onclick="window.location.href='../index.html'" class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<h1 class="text-lg font-medium">大数集市商户端</h1>
</div>
<div class="flex items-center gap-2">
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<div class="h-8 w-8 rounded-full bg-green-600 text-white flex items-center justify-center text-xs">
用户
</div>
</div>
</header>
<div class="flex">
<!-- Sidebar -->
<aside class="w-48 bg-white border-r border-gray-200 min-h-[calc(100vh-60px)]">
<!-- Search -->
<div class="p-3 border-b border-gray-100">
<input type="text" placeholder="快速搜索菜单" class="w-full text-sm border border-gray-200 rounded-md px-3 py-2 focus:border-green-500 focus:outline-none">
</div>
<!-- Navigation Menu -->
<nav class="py-2">
<div class="space-y-1">
<!-- Home -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="home" onclick="navigateToPage(getRelativePath('index.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9,22 9,12 15,12 15,22" />
</svg>
<span>首页</span>
</div>
<!-- Operations Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('operations')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 13h8V3H3v10zm0 8h8V16H3v5zm10-8h8V3h-8v10zm0 8h8V16h-8v5z" />
</svg>
<span>运营管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="operations-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Data Center -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="data-center" onclick="navigateToPage(getRelativePath('pages/data-center.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<ellipse cx="12" cy="5" rx="9" ry="3" />
<path d="m3 5 9 9 9-9" />
<path d="m3 12 9 9 9-9" />
<path d="m3 5v14c0 3 4 6 9 6s9-3 9-6V5" />
</svg>
<span>数据中心</span>
</div>
<!-- Coupon Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="coupon-marketing" onclick="navigateToPage(getRelativePath('pages/coupon-marketing.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" />
</svg>
<span>优惠券营销工具管理</span>
</div>
<!-- Pre-sale Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 20V10M6 16l6-6 6 6" />
</svg>
<span>预售营销工具管理</span>
</div>
<!-- Member Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('member')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="m22 21-3-3m0 0a8 8 0 1 1-11.31-11.31 8 8 0 0 1 11.31 11.31z" />
</svg>
<span>会员管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="member-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
<div class="bg-gray-50 border-l-2 border-green-500 ml-4 hidden" id="member-submenu">
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer menu-item" data-menu="level-settings" onclick="navigateToPage(getRelativePath('pages/member/level-settings.html'))">
<span>等级设置</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>会员查看</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分任务</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分商品</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分订单</span>
</div>
</div>
</div>
<!-- Wallet Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('wallet')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12V5a4 4 0 0 1 4-4h6a4 4 0 0 1 4 4v7" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 20h18M3 20a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h18a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H3z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20v-6" />
</svg>
<span>钱包管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="wallet-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Shipping Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('shipping')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 18V6a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v11a1 1 0 0 0 1 1h2" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 18H9" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14" />
<circle cx="17" cy="18" r="2" />
<circle cx="7" cy="18" r="2" />
</svg>
<span>运费管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="shipping-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
</div>
</nav>
</aside>
<!-- Main Content -->
<main class="flex-1 p-6">
<div class="bg-white rounded-lg shadow-sm border border-gray-200 h-96">
<div class="flex items-center justify-center h-full text-gray-500">
<div class="text-center">
<svg class="h-16 w-16 mx-auto mb-4 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" />
</svg>
<p class="text-lg">优惠券营销工具管理</p>
<p class="text-sm mt-2">优惠券管理功能开发中...</p>
</div>
</div>
</div>
</main>
</div>
</div>
<script src="../js/common.js"></script>
<script src="../js/sidebar.js"></script>
<script src="../js/pages/coupon-marketing.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initializeSidebar();
initializeSidebarSearch();
});
</script>
</body>
</html>

View File

@ -1,216 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>大数集市商户端 - 数据中心</title>
<link rel="stylesheet" href="../css/styles.css">
</head>
<body>
<div class="min-h-screen bg-gray-50">
<!-- Header -->
<header class="bg-green-700 text-white px-4 py-3 flex items-center justify-between">
<div class="flex items-center gap-4">
<button onclick="window.location.href='../index.html'" class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<h1 class="text-lg font-medium">大数集市商户端</h1>
</div>
<div class="flex items-center gap-2">
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<div class="h-8 w-8 rounded-full bg-green-600 text-white flex items-center justify-center text-xs">
用户
</div>
</div>
</header>
<div class="flex">
<!-- Sidebar -->
<aside class="w-48 bg-white border-r border-gray-200 min-h-[calc(100vh-60px)]">
<!-- Search -->
<div class="p-3 border-b border-gray-100">
<input type="text" placeholder="快速搜索菜单" class="w-full text-sm border border-gray-200 rounded-md px-3 py-2 focus:border-green-500 focus:outline-none">
</div>
<!-- Navigation Menu -->
<nav class="py-2">
<div class="space-y-1">
<!-- Home -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="home" onclick="navigateToPage(getRelativePath('index.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9,22 9,12 15,12 15,22" />
</svg>
<span>首页</span>
</div>
<!-- Operations Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('operations')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 13h8V3H3v10zm0 8h8V16H3v5zm10-8h8V3h-8v10zm0 8h8V16h-8v5z" />
</svg>
<span>运营管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="operations-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Data Center -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="data-center" onclick="navigateToPage(getRelativePath('pages/data-center.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<ellipse cx="12" cy="5" rx="9" ry="3" />
<path d="m3 5 9 9 9-9" />
<path d="m3 12 9 9 9-9" />
<path d="m3 5v14c0 3 4 6 9 6s9-3 9-6V5" />
</svg>
<span>数据中心</span>
</div>
<!-- Coupon Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="coupon-marketing" onclick="navigateToPage(getRelativePath('pages/coupon-marketing.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" />
</svg>
<span>优惠券营销工具管理</span>
</div>
<!-- Pre-sale Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 20V10M6 16l6-6 6 6" />
</svg>
<span>预售营销工具管理</span>
</div>
<!-- Member Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('member')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="m22 21-3-3m0 0a8 8 0 1 1-11.31-11.31 8 8 0 0 1 11.31 11.31z" />
</svg>
<span>会员管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="member-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
<div class="bg-gray-50 border-l-2 border-green-500 ml-4 hidden" id="member-submenu">
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer menu-item" data-menu="level-settings" onclick="navigateToPage(getRelativePath('pages/member/level-settings.html'))">
<span>等级设置</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>会员查看</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分任务</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分商品</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分订单</span>
</div>
</div>
</div>
<!-- Wallet Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('wallet')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12V5a4 4 0 0 1 4-4h6a4 4 0 0 1 4 4v7" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 20h18M3 20a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h18a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H3z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20v-6" />
</svg>
<span>钱包管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="wallet-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Shipping Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('shipping')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 18V6a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v11a1 1 0 0 0 1 1h2" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 18H9" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14" />
<circle cx="17" cy="18" r="2" />
<circle cx="7" cy="18" r="2" />
</svg>
<span>运费管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="shipping-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
</div>
</nav>
</aside>
<!-- Main Content -->
<main class="flex-1 p-6">
<div class="bg-white rounded-lg shadow-sm border border-gray-200 h-96">
<div class="flex items-center justify-center h-full text-gray-500">
<div class="text-center">
<svg class="h-16 w-16 mx-auto mb-4 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<ellipse cx="12" cy="5" rx="9" ry="3" />
<path d="m3 5 9 9 9-9" />
<path d="m3 12 9 9 9-9" />
<path d="m3 5v14c0 3 4 6 9 6s9-3 9-6V5" />
</svg>
<p class="text-lg">数据中心</p>
<p class="text-sm mt-2">数据分析功能开发中...</p>
</div>
</div>
</div>
</main>
</div>
</div>
<script src="../js/common.js"></script>
<script src="../js/sidebar.js"></script>
<script src="../js/pages/data-center.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initializeSidebar();
initializeSidebarSearch();
});
</script>
</body>
</html>

View File

@ -1,231 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>大数集市商户端 - 等级明细</title>
<link rel="stylesheet" href="../../css/styles.css">
</head>
<body>
<div class="min-h-screen bg-gray-50">
<!-- Header -->
<header class="bg-green-700 text-white px-4 py-3 flex items-center justify-between">
<div class="flex items-center gap-4">
<button onclick="history.back()" class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<h1 class="text-lg font-medium">大数集市商户端</h1>
</div>
<div class="flex items-center gap-2">
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<div class="h-8 w-8 rounded-full bg-green-600 text-white flex items-center justify-center text-xs">
用户
</div>
</div>
</header>
<div class="flex">
<!-- Sidebar -->
<aside class="w-48 bg-white border-r border-gray-200 min-h-[calc(100vh-60px)]">
<!-- Search -->
<div class="p-3 border-b border-gray-100">
<input type="text" placeholder="快速搜索菜单" class="w-full text-sm border border-gray-200 rounded-md px-3 py-2 focus:border-green-500 focus:outline-none">
</div>
<!-- Navigation Menu -->
<nav class="py-2">
<div class="space-y-1">
<!-- Home -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="home" onclick="navigateToPage(getRelativePath('index.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9,22 9,12 15,12 15,22" />
</svg>
<span>首页</span>
</div>
<!-- Operations Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('operations')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 13h8V3H3v10zm0 8h8V16H3v5zm10-8h8V3h-8v10zm0 8h8V16h-8v5z" />
</svg>
<span>运营管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="operations-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Data Center -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="data-center" onclick="navigateToPage(getRelativePath('pages/data-center.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<ellipse cx="12" cy="5" rx="9" ry="3" />
<path d="m3 5 9 9 9-9" />
<path d="m3 12 9 9 9-9" />
<path d="m3 5v14c0 3 4 6 9 6s9-3 9-6V5" />
</svg>
<span>数据中心</span>
</div>
<!-- Coupon Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="coupon-marketing" onclick="navigateToPage(getRelativePath('pages/coupon-marketing.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" />
</svg>
<span>优惠券营销工具管理</span>
</div>
<!-- Pre-sale Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 20V10M6 16l6-6 6 6" />
</svg>
<span>预售营销工具管理</span>
</div>
<!-- Member Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('member')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="m22 21-3-3m0 0a8 8 0 1 1-11.31-11.31 8 8 0 0 1 11.31 11.31z" />
</svg>
<span>会员管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="member-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
<div class="bg-gray-50 border-l-2 border-green-500 ml-4 hidden" id="member-submenu">
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer menu-item" data-menu="level-settings" onclick="navigateToPage('level-settings.html')">
<span>等级设置</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>会员查看</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分任务</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分商品</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分订单</span>
</div>
</div>
</div>
<!-- Wallet Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('wallet')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12V5a4 4 0 0 1 4-4h6a4 4 0 0 1 4 4v7" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 20h18M3 20a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h18a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H3z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20v-6" />
</svg>
<span>钱包管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="wallet-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Shipping Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('shipping')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 18V6a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v11a1 1 0 0 0 1 1h2" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 18H9" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14" />
<circle cx="17" cy="18" r="2" />
<circle cx="7" cy="18" r="2" />
</svg>
<span>运费管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="shipping-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
</div>
</nav>
</aside>
<!-- Main Content -->
<main class="flex-1 p-6">
<div class="bg-white rounded-lg shadow-sm border border-gray-200">
<div class="flex items-center justify-between p-6 border-b border-gray-200">
<h2 class="text-lg font-medium text-gray-900" id="page-title">等级设置明细</h2>
<div class="flex gap-3">
<button class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700 transition-colors" onclick="openLevelEdit()">
等级编辑
</button>
<button class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700 transition-colors" onclick="submitLevelDetail()">
提交
</button>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full border border-gray-200 rounded-lg">
<thead class="bg-gray-50">
<tr>
<th class="px-4 py-3 text-left text-sm font-medium text-gray-900 border-b">等级名称</th>
<th class="px-4 py-3 text-left text-sm font-medium text-gray-900 border-b">所需成长值</th>
<th class="px-4 py-3 text-left text-sm font-medium text-gray-900 border-b">会员人数</th>
<th class="px-4 py-3 text-left text-sm font-medium text-gray-900 border-b">会员权益</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200" id="level-table-body">
<!-- 数据将通过JavaScript动态加载 -->
</tbody>
</table>
</div>
</div>
</main>
</div>
</div>
<script src="../../js/common.js"></script>
<script src="../../js/sidebar.js"></script>
<script src="../../js/pages/level-detail.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initializeSidebar();
initializeSidebarSearch();
});
</script>
</body>
</html>

View File

@ -1,336 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>大数集市商户端 - 等级编辑</title>
<link rel="stylesheet" href="../../css/styles.css">
</head>
<body>
<div class="min-h-screen bg-gray-50">
<!-- Header -->
<header class="bg-green-700 text-white px-4 py-3 flex items-center justify-between">
<div class="flex items-center gap-4">
<button onclick="history.back()" class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<h1 class="text-lg font-medium">大数集市商户端</h1>
</div>
<div class="flex items-center gap-2">
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<div class="h-8 w-8 rounded-full bg-green-600 text-white flex items-center justify-center text-xs">
用户
</div>
</div>
</header>
<div class="flex">
<!-- Sidebar -->
<aside class="w-48 bg-white border-r border-gray-200 min-h-[calc(100vh-60px)]">
<!-- Search -->
<div class="p-3 border-b border-gray-100">
<input type="text" placeholder="快速搜索菜单" class="w-full text-sm border border-gray-200 rounded-md px-3 py-2 focus:border-green-500 focus:outline-none">
</div>
<!-- Navigation Menu -->
<nav class="py-2">
<div class="space-y-1">
<!-- Home -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="home" onclick="navigateToPage(getRelativePath('index.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9,22 9,12 15,12 15,22" />
</svg>
<span>首页</span>
</div>
<!-- Operations Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('operations')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 13h8V3H3v10zm0 8h8V16H3v5zm10-8h8V3h-8v10zm0 8h8V16h-8v5z" />
</svg>
<span>运营管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="operations-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Data Center -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="data-center" onclick="navigateToPage(getRelativePath('pages/data-center.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<ellipse cx="12" cy="5" rx="9" ry="3" />
<path d="m3 5 9 9 9-9" />
<path d="m3 12 9 9 9-9" />
<path d="m3 5v14c0 3 4 6 9 6s9-3 9-6V5" />
</svg>
<span>数据中心</span>
</div>
<!-- Coupon Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="coupon-marketing" onclick="navigateToPage(getRelativePath('pages/coupon-marketing.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" />
</svg>
<span>优惠券营销工具管理</span>
</div>
<!-- Pre-sale Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 20V10M6 16l6-6 6 6" />
</svg>
<span>预售营销工具管理</span>
</div>
<!-- Member Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('member')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="m22 21-3-3m0 0a8 8 0 1 1-11.31-11.31 8 8 0 0 1 11.31 11.31z" />
</svg>
<span>会员管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="member-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
<div class="bg-gray-50 border-l-2 border-green-500 ml-4 hidden" id="member-submenu">
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer menu-item" data-menu="level-settings" onclick="navigateToPage('level-settings.html')">
<span>等级设置</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>会员查看</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分任务</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分商品</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分订单</span>
</div>
</div>
</div>
<!-- Wallet Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('wallet')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12V5a4 4 0 0 1 4-4h6a4 4 0 0 1 4 4v7" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 20h18M3 20a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h18a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H3z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20v-6" />
</svg>
<span>钱包管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="wallet-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Shipping Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('shipping')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 18V6a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v11a1 1 0 0 0 1 1h2" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 18H9" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14" />
<circle cx="17" cy="18" r="2" />
<circle cx="7" cy="18" r="2" />
</svg>
<span>运费箢理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="shipping-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
</div>
</nav>
</aside>
<!-- Main Content -->
<main class="flex-1 p-6">
<div class="bg-white rounded-lg shadow-sm border border-gray-200">
<div class="flex items-center justify-between p-6 border-b border-gray-200">
<h2 class="text-lg font-medium text-gray-900" id="page-title">等级编辑</h2>
<div class="flex gap-3">
<button class="px-4 py-2 bg-gray-500 text-white rounded-md hover:bg-gray-600 transition-colors" onclick="history.back()">
关闭
</button>
<button class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700 transition-colors" onclick="submitLevelEdit()">
提交
</button>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full border border-gray-200 rounded-lg">
<thead class="bg-gray-50">
<tr>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">等级</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">等级名称</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">成长值范围</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">开启会员折扣</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">折扣率(%)</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">开启积分兑换</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">开启生日优惠券</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">生日优惠券操作</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">开启生日双倍积分</th>
<th class="px-3 py-3 text-left text-xs font-medium text-gray-900 border-b">操作</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200" id="level-edit-table-body">
<!-- 数据将通过JavaScript动态加载 -->
</tbody>
</table>
</div>
</div>
</main>
</div>
</div>
<!-- 添加优惠券弹窗 -->
<div id="coupon-modal" class="fixed inset-0 bg-black bg-opacity-50 hidden z-50 flex items-center justify-center" onclick="closeCouponModal(event)">
<div class="bg-white rounded-lg w-96 max-w-md mx-4 modal-content" onclick="event.stopPropagation()">
<div class="flex items-center justify-between p-4 border-b border-gray-200">
<h3 class="text-lg font-medium text-gray-900">添加优惠券</h3>
<button onclick="closeCouponModal()" class="text-gray-400 hover:text-gray-600">
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
<form id="coupon-form" class="p-4 space-y-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
<span class="text-red-500">*</span> 优惠券名称
</label>
<input type="text" id="coupon-name" value="生日优惠券"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-green-500"
placeholder="请输入优惠券名称" required>
</div>
<div class="flex gap-4">
<div class="flex-1">
<label class="block text-sm font-medium text-gray-700 mb-1">
<span class="text-red-500">*</span> 优惠券门槛金额
</label>
<div class="flex items-center">
<input type="number" id="coupon-threshold" value="10" min="0"
class="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-green-500"
required>
<div class="flex flex-col ml-2">
<button type="button" onclick="adjustThreshold(1)" class="px-2 py-1 text-xs bg-gray-100 hover:bg-gray-200 border border-gray-300 rounded-t">
<svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7" />
</svg>
</button>
<button type="button" onclick="adjustThreshold(-1)" class="px-2 py-1 text-xs bg-gray-100 hover:bg-gray-200 border border-gray-300 rounded-b border-t-0">
<svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
</div>
</div>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
<span class="text-red-500">*</span> 优惠券减免金额
</label>
<div class="flex items-center">
<input type="number" id="coupon-discount" value="1" min="0"
class="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-green-500"
required>
<div class="flex flex-col ml-2">
<button type="button" onclick="adjustDiscount(1)" class="px-2 py-1 text-xs bg-gray-100 hover:bg-gray-200 border border-gray-300 rounded-t">
<svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7" />
</svg>
</button>
<button type="button" onclick="adjustDiscount(-1)" class="px-2 py-1 text-xs bg-gray-100 hover:bg-gray-200 border border-gray-300 rounded-b border-t-0">
<svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
</div>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
<span class="text-red-500">*</span> 优惠券有效时间
</label>
<select id="coupon-validity"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-green-500"
required>
<option value="1">1</option>
<option value="7">7天</option>
<option value="30">30天</option>
<option value="90">90天</option>
<option value="365">1年</option>
</select>
</div>
</form>
<div class="flex justify-end gap-3 p-4 border-t border-gray-200">
<button onclick="closeCouponModal()"
class="px-4 py-2 text-gray-700 bg-gray-100 rounded-md hover:bg-gray-200 transition-colors">
取消
</button>
<button onclick="submitCoupon()"
class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors">
确认添加
</button>
</div>
</div>
</div>
<script src="../../js/common.js"></script>
<script src="../../js/sidebar.js"></script>
<script src="../../js/pages/level-edit.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
initializeSidebar();
initializeSidebarSearch();
});
</script>
</body>
</html>

View File

@ -1,310 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>大数集市商户端 - 等级设置</title>
<link rel="stylesheet" href="../../css/styles.css">
</head>
<body>
<div class="min-h-screen bg-gray-50">
<!-- Header -->
<header class="bg-green-700 text-white px-4 py-3 flex items-center justify-between">
<div class="flex items-center gap-4">
<button onclick="window.location.href='../../index.html'" class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<h1 class="text-lg font-medium">大数集市商户端</h1>
</div>
<div class="flex items-center gap-2">
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</button>
<div class="h-8 w-8 rounded-full bg-green-600 text-white flex items-center justify-center text-xs">
用户
</div>
</div>
</header>
<div class="flex">
<!-- Sidebar -->
<aside class="w-48 bg-white border-r border-gray-200 min-h-[calc(100vh-60px)]">
<!-- Search -->
<div class="p-3 border-b border-gray-100">
<input type="text" placeholder="快速搜索菜单" class="w-full text-sm border border-gray-200 rounded-md px-3 py-2 focus:border-green-500 focus:outline-none">
</div>
<!-- Navigation Menu -->
<nav class="py-2">
<div class="space-y-1">
<!-- Home -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="home" onclick="navigateToPage(getRelativePath('index.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9,22 9,12 15,12 15,22" />
</svg>
<span>首页</span>
</div>
<!-- Operations Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('operations')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 13h8V3H3v10zm0 8h8V16H3v5zm10-8h8V3h-8v10zm0 8h8V16h-8v5z" />
</svg>
<span>运营管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="operations-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Data Center -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="data-center" onclick="navigateToPage(getRelativePath('pages/data-center.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<ellipse cx="12" cy="5" rx="9" ry="3" />
<path d="m3 5 9 9 9-9" />
<path d="m3 12 9 9 9-9" />
<path d="m3 5v14c0 3 4 6 9 6s9-3 9-6V5" />
</svg>
<span>数据中心</span>
</div>
<!-- Coupon Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer menu-item" data-menu="coupon-marketing" onclick="navigateToPage(getRelativePath('pages/coupon-marketing.html'))">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" />
</svg>
<span>优惠券营销工具管理</span>
</div>
<!-- Pre-sale Marketing Tool Management -->
<div class="flex items-center gap-3 px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 20V10M6 16l6-6 6 6" />
</svg>
<span>预售营销工具管理</span>
</div>
<!-- Member Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('member')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="m22 21-3-3m0 0a8 8 0 1 1-11.31-11.31 8 8 0 0 1 11.31 11.31z" />
</svg>
<span>会员管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="member-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
<div class="bg-gray-50 border-l-2 border-green-500 ml-4 hidden" id="member-submenu">
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer menu-item" data-menu="level-settings" onclick="openLevelSettingsTab()">
<span>等级设置</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer" onclick="openMemberListTab()">
<span>会员查看</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分任务</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分商品</span>
</div>
<div class="flex items-center gap-3 px-6 py-2 text-sm text-gray-600 hover:bg-gray-100 cursor-pointer">
<span>积分订单</span>
</div>
</div>
</div>
<!-- Wallet Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('wallet')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12V5a4 4 0 0 1 4-4h6a4 4 0 0 1 4 4v7" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 20h18M3 20a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h18a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H3z" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20v-6" />
</svg>
<span>钱包管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="wallet-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
<!-- Shipping Management -->
<div>
<div class="flex items-center justify-between px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer" onclick="toggleMenu('shipping')">
<div class="flex items-center gap-3">
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 18V6a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v11a1 1 0 0 0 1 1h2" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 18H9" />
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14" />
<circle cx="17" cy="18" r="2" />
<circle cx="7" cy="18" r="2" />
</svg>
<span>运费管理</span>
</div>
<svg class="h-3 w-3 transition-transform" id="shipping-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
</svg>
</div>
</div>
</div>
</nav>
</aside>
<!-- Main Content -->
<main class="flex-1 p-6">
<!-- Tab Container -->
<div id="tab-container" class="bg-white rounded-lg shadow-sm border border-gray-200">
<!-- Tab Navigation -->
<div class="border-b border-gray-200">
<div class="flex items-center space-x-0" id="tab-nav">
<!-- Tabs will be dynamically added here -->
</div>
</div>
<!-- Tab Content -->
<div id="tab-content-area">
<!-- Tab contents will be dynamically added here -->
</div>
</div>
</main>
</div>
</div>
<!-- 添加优惠券弹窗 -->
<div id="coupon-modal" class="fixed inset-0 bg-black bg-opacity-50 hidden z-50 flex items-center justify-center" onclick="closeCouponModal(event)">
<div class="bg-white rounded-lg w-96 max-w-md mx-4 modal-content" onclick="event.stopPropagation()">
<div class="flex items-center justify-between p-4 border-b border-gray-200">
<h3 class="text-lg font-medium text-gray-900">添加优惠券</h3>
<button onclick="closeCouponModal()" class="text-gray-400 hover:text-gray-600">
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
<form id="coupon-form" class="p-4 space-y-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
<span class="text-red-500">*</span> 优惠券名称
</label>
<input type="text" id="coupon-name" value="生日优惠券"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-green-500"
placeholder="请输入优惠券名称" required>
</div>
<div class="flex gap-4">
<div class="flex-1">
<label class="block text-sm font-medium text-gray-700 mb-1">
<span class="text-red-500">*</span> 优惠券门槛金额
</label>
<div class="flex items-center">
<input type="number" id="coupon-threshold" value="10" min="0"
class="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-green-500"
required>
<div class="flex flex-col ml-2">
<button type="button" onclick="adjustThreshold(1)" class="px-2 py-1 text-xs bg-gray-100 hover:bg-gray-200 border border-gray-300 rounded-t">
<svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7" />
</svg>
</button>
<button type="button" onclick="adjustThreshold(-1)" class="px-2 py-1 text-xs bg-gray-100 hover:bg-gray-200 border border-gray-300 rounded-b border-t-0">
<svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
</div>
</div>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
<span class="text-red-500">*</span> 优惠券减免金额
</label>
<div class="flex items-center">
<input type="number" id="coupon-discount" value="1" min="0"
class="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-green-500"
required>
<div class="flex flex-col ml-2">
<button type="button" onclick="adjustDiscount(1)" class="px-2 py-1 text-xs bg-gray-100 hover:bg-gray-200 border border-gray-300 rounded-t">
<svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7" />
</svg>
</button>
<button type="button" onclick="adjustDiscount(-1)" class="px-2 py-1 text-xs bg-gray-100 hover:bg-gray-200 border border-gray-300 rounded-b border-t-0">
<svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
</div>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
<span class="text-red-500">*</span> 优惠券有效时间
</label>
<select id="coupon-validity"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-green-500"
required>
<option value="1">1</option>
<option value="7">7天</option>
<option value="30">30天</option>
<option value="90">90天</option>
<option value="365">1年</option>
</select>
</div>
</form>
<div class="flex justify-end gap-3 p-4 border-t border-gray-200">
<button onclick="closeCouponModal()"
class="px-4 py-2 text-gray-700 bg-gray-100 rounded-md hover:bg-gray-200 transition-colors">
取消
</button>
<button onclick="submitCoupon()"
class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors">
确认添加
</button>
</div>
</div>
</div>
<script src="../../js/common.js"></script>
<script src="../../js/sidebar.js"></script>
<script src="../../js/member-tabs.js"></script>
<script src="../../js/pages/level-settings.js"></script>
</body>
</html>