|
@@ -1,249 +1,296 @@
|
|
|
-
|
|
|
- <style>
|
|
|
- * {
|
|
|
- margin: 0;
|
|
|
- padding: 0;
|
|
|
- box-sizing: border-box;
|
|
|
- font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
|
|
|
- }
|
|
|
-
|
|
|
- :root {
|
|
|
- --primary: #1a56db;
|
|
|
- --secondary: #0e2a53;
|
|
|
- --accent: #f59e0b;
|
|
|
- --success: #10b981;
|
|
|
- --danger: #ef4444;
|
|
|
- --light: #f8fafc;
|
|
|
- --dark: #0f172a;
|
|
|
- --card-bg: rgba(255, 255, 255, 0.85);
|
|
|
- --glass: rgba(255, 255, 255, 0.1);
|
|
|
- --glass-border: rgba(255, 255, 255, 0.2);
|
|
|
- --shadow: 0 8px 32px rgba(31, 38, 135, 0.15);
|
|
|
- --nav-height: 65px;
|
|
|
- }
|
|
|
-
|
|
|
- body {
|
|
|
- background: linear-gradient(135deg, #0f172a, #1e293b);
|
|
|
- color: var(--light);
|
|
|
- min-height: 100vh;
|
|
|
- padding: 20px;
|
|
|
- position: relative;
|
|
|
- overflow-x: hidden;
|
|
|
- padding-bottom: calc(var(--nav-height) + 20px);
|
|
|
- }
|
|
|
-
|
|
|
- body::before {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 0;
|
|
|
- left: 0;
|
|
|
- right: 0;
|
|
|
- bottom: 0;
|
|
|
- background:
|
|
|
- radial-gradient(circle at 10% 20%, rgba(26, 86, 219, 0.15) 0%, transparent 30%),
|
|
|
- radial-gradient(circle at 90% 80%, rgba(245, 158, 11, 0.15) 0%, transparent 30%);
|
|
|
- z-index: -1;
|
|
|
- }
|
|
|
-
|
|
|
- .container {
|
|
|
- max-width: 100%;
|
|
|
- margin: 0 auto;
|
|
|
- padding: 10px;
|
|
|
- }
|
|
|
-
|
|
|
- .content {
|
|
|
- background: var(--glass);
|
|
|
- backdrop-filter: blur(10px);
|
|
|
- border-radius: 20px;
|
|
|
- border: 1px solid var(--glass-border);
|
|
|
- padding: 25px;
|
|
|
- box-shadow: var(--shadow);
|
|
|
- margin-bottom: 20px;
|
|
|
- color: #e2e8f0;
|
|
|
- line-height: 1.6;
|
|
|
- }
|
|
|
-
|
|
|
- h2 {
|
|
|
- font-size: 22px;
|
|
|
- margin-bottom: 15px;
|
|
|
- background: linear-gradient(to right, #fbcfe8, #c7d2fe);
|
|
|
- -webkit-background-clip: text;
|
|
|
- -webkit-text-fill-color: transparent;
|
|
|
- }
|
|
|
-
|
|
|
- .stats {
|
|
|
- display: flex;
|
|
|
- justify-content: space-around;
|
|
|
- margin: 25px 0;
|
|
|
- text-align: center;
|
|
|
- }
|
|
|
-
|
|
|
- .stat-item {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: center;
|
|
|
- }
|
|
|
-
|
|
|
- .stat-value {
|
|
|
- font-size: 24px;
|
|
|
- font-weight: 700;
|
|
|
- margin-bottom: 5px;
|
|
|
- }
|
|
|
-
|
|
|
- .stat-label {
|
|
|
- font-size: 14px;
|
|
|
- color: #94a3b8;
|
|
|
- }
|
|
|
-
|
|
|
- .indicator {
|
|
|
- position: absolute;
|
|
|
- top: -10px;
|
|
|
- width: 50px;
|
|
|
- height: 50px;
|
|
|
- background: linear-gradient(135deg, var(--primary), #3b82f6);
|
|
|
- border-radius: 50%;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- font-size: 24px;
|
|
|
- box-shadow: 0 4px 15px rgba(26, 86, 219, 0.4);
|
|
|
- transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
|
|
- color: white;
|
|
|
- z-index: -1;
|
|
|
- }
|
|
|
-
|
|
|
- .page-title {
|
|
|
- text-align: center;
|
|
|
- margin: 20px 0 30px;
|
|
|
- }
|
|
|
-
|
|
|
- .page-title h1 {
|
|
|
- font-size: 24px;
|
|
|
- font-weight: 700;
|
|
|
- background: linear-gradient(to right, #fde68a, #fcd34d);
|
|
|
- -webkit-background-clip: text;
|
|
|
- -webkit-text-fill-color: transparent;
|
|
|
- margin-bottom: 10px;
|
|
|
- }
|
|
|
+<!-- page-home.component.html -->
|
|
|
+<div class="container">
|
|
|
+ <header>
|
|
|
+ <div class="logo">
|
|
|
+ <div class="logo-icon">
|
|
|
+ <i class="fas fa-crown"></i>
|
|
|
+ </div>
|
|
|
+ <div class="logo-text">
|
|
|
+ <h1>九州管理</h1>
|
|
|
+ <p>智能AI权限管理系统</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="user-actions">
|
|
|
+ <button class="btn btn-outline">
|
|
|
+ <i class="fas fa-sync-alt"></i> 刷新数据
|
|
|
+ </button>
|
|
|
+ <button class="btn btn-primary" (click)="addSales()">
|
|
|
+ <i class="fas fa-plus"></i> 添加销售
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </header>
|
|
|
+
|
|
|
+ <div class="dashboard">
|
|
|
+ <div class="sidebar">
|
|
|
+ <div class="section-title">
|
|
|
+ <i class="fas fa-filter"></i>
|
|
|
+ <span>智能筛选</span>
|
|
|
+ </div>
|
|
|
+ <div class="filters">
|
|
|
+ <div class="filter-group">
|
|
|
+ <label>销售等级</label>
|
|
|
+ <div class="tag-filters">
|
|
|
+ <div class="tag tag-rookie active">实习销售</div>
|
|
|
+ <div class="tag tag-silver">白银销售</div>
|
|
|
+ <div class="tag tag-gold">黄金销售</div>
|
|
|
+ <div class="tag tag-platinum">铂金销售</div>
|
|
|
+ <div class="tag tag-diamond">钻石销售</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- .page-title p {
|
|
|
- color: #cbd5e1;
|
|
|
- font-size: 14px;
|
|
|
- }
|
|
|
+ <div class="filter-group">
|
|
|
+ <label>业绩范围</label>
|
|
|
+ <input type="range" min="0" max="100" value="50" class="slider">
|
|
|
+ </div>
|
|
|
|
|
|
- /* 动画效果 */
|
|
|
- @keyframes pulse {
|
|
|
- 0% { transform: scale(1); }
|
|
|
- 50% { transform: scale(1.05); }
|
|
|
- 100% { transform: scale(1); }
|
|
|
- }
|
|
|
+ <div class="filter-group">
|
|
|
+ <label>权限级别</label>
|
|
|
+ <select class="select">
|
|
|
+ <option>全部权限</option>
|
|
|
+ <option>基础权限</option>
|
|
|
+ <option>高级权限</option>
|
|
|
+ <option>管理员权限</option>
|
|
|
+ </select>
|
|
|
+ </div>
|
|
|
|
|
|
- .pulse {
|
|
|
- animation: pulse 2s infinite;
|
|
|
- }
|
|
|
+ <button class="btn btn-primary" style="margin-top: 15px;" (click)="aiRecommend()">
|
|
|
+ <i class="fas fa-robot"></i> AI智能推荐
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="stats-card">
|
|
|
+ <div class="section-title">
|
|
|
+ <i class="fas fa-chart-line"></i>
|
|
|
+ <span>团队统计</span>
|
|
|
+ </div>
|
|
|
|
|
|
- /* 响应式调整 */
|
|
|
- @media (max-width: 480px) {
|
|
|
- .content {
|
|
|
- padding: 15px;
|
|
|
- }
|
|
|
+ <div class="stat-item">
|
|
|
+ <div>团队成员</div>
|
|
|
+ <div class="stat-value">24人</div>
|
|
|
+ </div>
|
|
|
+ <div class="stat-item">
|
|
|
+ <div>平均业绩</div>
|
|
|
+ <div class="stat-value">¥86,540</div>
|
|
|
+ </div>
|
|
|
+ <div class="stat-item">
|
|
|
+ <div>本月成交率</div>
|
|
|
+ <div class="stat-value">72.5%</div>
|
|
|
+ </div>
|
|
|
+ <div class="stat-item">
|
|
|
+ <div>AI标签准确率</div>
|
|
|
+ <div class="stat-value">94.8%</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="main-content">
|
|
|
+ <div class="ai-header">
|
|
|
+ <div>
|
|
|
+ <div class="ai-title">AI智能权限管理系统</div>
|
|
|
+ <div class="ai-subtitle">基于深度学习的销售行为分析,<span class="ai-highlight">自动生成销售标签</span>,智能分配权限级别,动态优化团队结构,提升整体销售业绩</div>
|
|
|
+ </div>
|
|
|
+ <div class="ai-power">
|
|
|
+ <i class="fas fa-brain"></i>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="cards-container">
|
|
|
+ <!-- 使用 *ngFor 循环生成销售卡片 -->
|
|
|
+ <div class="card {{sales.level}}" *ngFor="let sales of sales" (click)="openPermissionModal(sales)">
|
|
|
+ <div class="card-header">
|
|
|
+ <div class="avatar">
|
|
|
+ <img [src]="sales.avatar" alt="销售头像">
|
|
|
+ </div>
|
|
|
+ <div class="user-info">
|
|
|
+ <h3>{{sales.name}}</h3>
|
|
|
+ <p>入职时间: {{sales.joinDate}}</p>
|
|
|
+ <span class="user-tag tag-{{sales.level}}">{{sales.levelName}}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="card-body">
|
|
|
+ <div class="stats">
|
|
|
+ <div class="stat">
|
|
|
+ <div class="stat-value">{{sales.performance}}</div>
|
|
|
+ <div class="stat-label">本月业绩</div>
|
|
|
+ </div>
|
|
|
+ <div class="stat">
|
|
|
+ <div class="stat-value">{{sales.successRate}}</div>
|
|
|
+ <div class="stat-label">成交率</div>
|
|
|
+ </div>
|
|
|
+ <div class="stat">
|
|
|
+ <div class="stat-value">{{sales.clients}}</div>
|
|
|
+ <div class="stat-label">客户数</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- .stats {
|
|
|
- flex-wrap: wrap;
|
|
|
- }
|
|
|
+ <div class="progress-container" *ngIf="sales.trainingProgress !== undefined">
|
|
|
+ <div class="progress-label">
|
|
|
+ <span>培训进度</span>
|
|
|
+ <span>{{sales.trainingProgress}}%</span>
|
|
|
+ </div>
|
|
|
+ <div class="progress-bar">
|
|
|
+ <div class="progress" [style.width.%]="sales.trainingProgress" [style.background]="getProgressColor(sales.level)"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- .stat-item {
|
|
|
- width: 50%;
|
|
|
- margin-bottom: 15px;
|
|
|
- }
|
|
|
+ <div class="progress-container" *ngIf="sales.satisfaction !== undefined">
|
|
|
+ <div class="progress-label">
|
|
|
+ <span>客户满意度</span>
|
|
|
+ <span>{{sales.satisfaction}}%</span>
|
|
|
+ </div>
|
|
|
+ <div class="progress-bar">
|
|
|
+ <div class="progress" [style.width.%]="sales.satisfaction" [style.background]="getProgressColor(sales.level)"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="progress-container" *ngIf="sales.vipClients !== undefined">
|
|
|
+ <div class="progress-label">
|
|
|
+ <span>大客户占比</span>
|
|
|
+ <span>{{sales.vipClients}}%</span>
|
|
|
+ </div>
|
|
|
+ <div class="progress-bar">
|
|
|
+ <div class="progress" [style.width.%]="sales.vipClients" [style.background]="getProgressColor(sales.level)"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="progress-container" *ngIf="sales.avgPrice !== undefined">
|
|
|
+ <div class="progress-label">
|
|
|
+ <span>客单价</span>
|
|
|
+ <span>¥11,711</span>
|
|
|
+ </div>
|
|
|
+ <div class="progress-bar">
|
|
|
+ <div class="progress" [style.width.%]="sales.avgPrice" [style.background]="getProgressColor(sales.level)"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="progress-container" *ngIf="sales.repurchaseRate !== undefined">
|
|
|
+ <div class="progress-label">
|
|
|
+ <span>复购率</span>
|
|
|
+ <span>{{sales.repurchaseRate}}%</span>
|
|
|
+ </div>
|
|
|
+ <div class="progress-bar">
|
|
|
+ <div class="progress" [style.width.%]="sales.repurchaseRate" [style.background]="getProgressColor(sales.level)"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- .nav-tab span {
|
|
|
- font-size: 11px;
|
|
|
+ <div class="progress-container">
|
|
|
+ <div class="progress-label">
|
|
|
+ <span>AI能力评估</span>
|
|
|
+ <span>{{sales.aiAssessment}}%</span>
|
|
|
+ </div>
|
|
|
+ <div class="progress-bar">
|
|
|
+ <div class="progress" [style.width.%]="sales.aiAssessment" [style.background]="getProgressColor(sales.level)"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="card-footer">
|
|
|
+ <button class="permission-btn btn-edit" (click)="openPermissionModal(sales); $event.stopPropagation()">
|
|
|
+ <i class="fas fa-user-cog"></i> 权限管理
|
|
|
+ </button>
|
|
|
+ <button class="permission-btn btn-details">
|
|
|
+ <i class="fas fa-chart-bar"></i> 业绩详情
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="chart-container">
|
|
|
+ <div class="chart-header">
|
|
|
+ <div class="chart-title">销售团队业绩分析</div>
|
|
|
+ <div class="chart-actions">
|
|
|
+ <button class="btn btn-outline">
|
|
|
+ <i class="fas fa-download"></i> 导出
|
|
|
+ </button>
|
|
|
+ <button class="btn btn-primary">
|
|
|
+ <i class="fas fa-sync-alt"></i> 更新
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="chart-wrapper">
|
|
|
+ @if(chartOptions){
|
|
|
+ <div echarts [options]="chartOptions" class="echarts-chart"></div>
|
|
|
}
|
|
|
- }
|
|
|
- </style>
|
|
|
-
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</div>
|
|
|
|
|
|
- <div class="container">
|
|
|
- <div class="page-title">
|
|
|
- <h1>九州管理平台</h1>
|
|
|
- <p>智能AI权限管理系统 - 移动端</p>
|
|
|
+<!-- AI权限管理面板 -->
|
|
|
+<div class="permission-modal" [class.active]="showModal" (click)="showModal && $event.target === $event.currentTarget && closeModal()">
|
|
|
+ <div class="modal-content" [class.active]="showModal">
|
|
|
+ <div class="modal-header">
|
|
|
+ <h2>{{currentSales.name}} - 权限管理</h2>
|
|
|
+ <button class="close-btn" (click)="closeModal()">×</button>
|
|
|
+ </div>
|
|
|
+ <div class="modal-body">
|
|
|
+ <div class="ai-recommendation">
|
|
|
+ <p [innerHTML]="getAiRecommendation(currentSales.level)"></p>
|
|
|
+ <button class="btn btn-primary">
|
|
|
+ <i class="fas fa-check"></i> 应用AI建议
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="permission-options">
|
|
|
+ <div class="permission-option">
|
|
|
+ <div class="permission-info">
|
|
|
+ <h3>客户数据访问</h3>
|
|
|
+ <p>允许查看和编辑客户信息</p>
|
|
|
+ </div>
|
|
|
+ <label class="switch">
|
|
|
+ <input type="checkbox" checked>
|
|
|
+ <span class="slider"></span>
|
|
|
+ </label>
|
|
|
</div>
|
|
|
|
|
|
- <div class="content">
|
|
|
- <h2>欢迎使用移动端管理平台</h2>
|
|
|
- <p>基于深度学习的销售行为分析,<span style="color: var(--accent); font-weight: 500;">自动生成销售标签</span>,智能分配权限级别,动态优化团队结构,提升整体销售业绩。</p>
|
|
|
-
|
|
|
- <div class="stats">
|
|
|
- <div class="stat-item">
|
|
|
- <div class="stat-value">24</div>
|
|
|
- <div class="stat-label">团队成员</div>
|
|
|
- </div>
|
|
|
- <div class="stat-item">
|
|
|
- <div class="stat-value">86,540</div>
|
|
|
- <div class="stat-label">平均业绩</div>
|
|
|
- </div>
|
|
|
- <div class="stat-item">
|
|
|
- <div class="stat-value">72.5%</div>
|
|
|
- <div class="stat-label">成交率</div>
|
|
|
- </div>
|
|
|
- <div class="stat-item">
|
|
|
- <div class="stat-value">94.8%</div>
|
|
|
- <div class="stat-label">AI准确率</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <p>使用底部导航栏在不同功能模块之间快速切换,随时随地管理您的销售团队和权限设置。</p>
|
|
|
+ <div class="permission-option">
|
|
|
+ <div class="permission-info">
|
|
|
+ <h3>报价修改权限</h3>
|
|
|
+ <p>允许修改套餐价格和优惠</p>
|
|
|
+ </div>
|
|
|
+ <label class="switch">
|
|
|
+ <input type="checkbox">
|
|
|
+ <span class="slider"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="permission-option">
|
|
|
+ <div class="permission-info">
|
|
|
+ <h3>AI陪练系统</h3>
|
|
|
+ <p>使用AI虚拟陪练功能</p>
|
|
|
+ </div>
|
|
|
+ <label class="switch">
|
|
|
+ <input type="checkbox" checked>
|
|
|
+ <span class="slider"></span>
|
|
|
+ </label>
|
|
|
</div>
|
|
|
|
|
|
- <div class="content">
|
|
|
- <h2>智能功能</h2>
|
|
|
- <p>• AI销售行为分析</p>
|
|
|
- <p>• 智能权限分配</p>
|
|
|
- <p>• 实时业绩追踪</p>
|
|
|
- <p>• 团队结构优化</p>
|
|
|
- <p>• 销售能力评估</p>
|
|
|
+ <div class="permission-option">
|
|
|
+ <div class="permission-info">
|
|
|
+ <h3>高级分析报告</h3>
|
|
|
+ <p>访问详细客户分析报告</p>
|
|
|
+ </div>
|
|
|
+ <label class="switch">
|
|
|
+ <input type="checkbox">
|
|
|
+ <span class="slider"></span>
|
|
|
+ </label>
|
|
|
</div>
|
|
|
+
|
|
|
+ <div class="permission-option">
|
|
|
+ <div class="permission-info">
|
|
|
+ <h3>跨区域客户</h3>
|
|
|
+ <p>访问和分配跨区域客户</p>
|
|
|
+ </div>
|
|
|
+ <label class="switch">
|
|
|
+ <input type="checkbox" checked>
|
|
|
+ <span class="slider"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
-
|
|
|
- <script>
|
|
|
- document.addEventListener('DOMContentLoaded', function() {
|
|
|
- const tabs = document.querySelectorAll('.nav-tab');
|
|
|
- const indicator = document.querySelector('.indicator');
|
|
|
-
|
|
|
- // 初始位置设置
|
|
|
- const activeTab = document.querySelector('.nav-tab.active');
|
|
|
- if (activeTab) {
|
|
|
- const tabRect = activeTab.getBoundingClientRect();
|
|
|
- const containerRect = activeTab.parentElement.getBoundingClientRect();
|
|
|
-
|
|
|
- const left = tabRect.left - containerRect.left + tabRect.width/2;
|
|
|
- indicator.style.left = `${left}px`;
|
|
|
- }
|
|
|
-
|
|
|
- // 添加点击事件
|
|
|
- tabs.forEach(tab => {
|
|
|
- tab.addEventListener('click', function(e) {
|
|
|
- // 移除所有active类
|
|
|
- tabs.forEach(t => t.classList.remove('active'));
|
|
|
-
|
|
|
- // 添加active类到当前标签
|
|
|
- this.classList.add('active');
|
|
|
-
|
|
|
- // 更新指示器位置
|
|
|
- const tabRect = this.getBoundingClientRect();
|
|
|
- const containerRect = this.parentElement.getBoundingClientRect();
|
|
|
-
|
|
|
- const left = tabRect.left - containerRect.left + tabRect.width/2;
|
|
|
- indicator.style.left = `${left}px`;
|
|
|
-
|
|
|
- // 添加动画效果
|
|
|
- indicator.classList.remove('pulse');
|
|
|
- void indicator.offsetWidth; // 触发重绘
|
|
|
- indicator.classList.add('pulse');
|
|
|
-
|
|
|
- });
|
|
|
- });
|
|
|
- });
|
|
|
- </script>
|
|
|
-
|
|
|
+ <div class="modal-footer">
|
|
|
+ <button class="btn btn-outline" (click)="closeModal()">取消</button>
|
|
|
+ <button class="btn btn-primary" (click)="saveSettings()">保存设置</button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</div>
|