文件位置调整
|
|
@ -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>
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 568 B |
|
|
@ -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 |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
|
@ -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 |
|
|
@ -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>
|
|
||||||
|
|
@ -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;
|
|
||||||
|
Before Width: | Height: | Size: 568 B |
|
|
@ -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 |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
|
@ -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 |
|
|
@ -3,199 +3,49 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>大数集市商户端</title>
|
<title>信息管理系统</title>
|
||||||
<link rel="stylesheet" href="./css/styles.css">
|
<link rel="stylesheet" href="styles.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="min-h-screen bg-gray-50">
|
<div class="container">
|
||||||
<!-- Header -->
|
<!-- 左侧菜单栏 -->
|
||||||
<header class="bg-green-700 text-white px-4 py-3 flex items-center justify-between">
|
<div class="sidebar">
|
||||||
<div class="flex items-center gap-4">
|
<div class="logo">
|
||||||
<h1 class="text-lg font-medium">大数集市商户端</h1>
|
<h2>管理系统</h2>
|
||||||
</div>
|
</div>
|
||||||
|
<nav class="menu">
|
||||||
<div class="flex items-center gap-2">
|
<div class="menu-item">
|
||||||
<button class="text-white hover:bg-green-600 p-2 rounded-md transition-colors">
|
<div class="menu-title" onclick="toggleSubmenu('member-submenu')">
|
||||||
<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>
|
<span>会员管理</span>
|
||||||
|
<span class="arrow">▼</span>
|
||||||
</div>
|
</div>
|
||||||
<svg class="h-3 w-3 transition-transform" id="member-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<div class="submenu" id="member-submenu">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9 6 6 6-6" />
|
<div class="submenu-item" onclick="openTab('等级设置', 'level-settings')">等级设置</div>
|
||||||
</svg>
|
<div class="submenu-item" onclick="openTab('会员查看', 'member-view')">会员查看</div>
|
||||||
</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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
</aside>
|
</div>
|
||||||
|
|
||||||
<!-- Main Content -->
|
<!-- 中央内容区域 -->
|
||||||
<main class="flex-1 p-6">
|
<div class="main-content">
|
||||||
<!-- Default Content -->
|
<!-- Tab栏 -->
|
||||||
<div id="default-content" class="bg-white rounded-lg shadow-sm border border-gray-200 h-96">
|
<div class="tab-bar">
|
||||||
<div class="flex items-center justify-center h-full text-gray-500">
|
<div class="tab active" id="home-tab">
|
||||||
<div class="text-center">
|
<span>首页</span>
|
||||||
<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>
|
|
||||||
</main>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="./js/main.js"></script>
|
<!-- 内容展示区域 -->
|
||||||
|
<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>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
// 优惠券营销工具管理页面的JavaScript逻辑
|
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
console.log('优惠券营销工具管理页面初始化完成');
|
|
||||||
// 这里可以添加优惠券管理相关的功能
|
|
||||||
});
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
// 数据中心页面的JavaScript逻辑
|
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
console.log('数据中心页面初始化完成');
|
|
||||||
// 这里可以添加数据中心相关的功能
|
|
||||||
});
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -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>
|
|
||||||
|
|
@ -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>
|
|
||||||
|
|
@ -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>
|
|
||||||
|
|
@ -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>
|
|
||||||
|
|
@ -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>
|
|
||||||