nameChange
This commit is contained in:
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"enabledPlugins": {
|
|
||||||
"modern-webapp@cb_teams_marketplace": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
.DS_Store
|
||||||
|
.codebuddy/
|
||||||
|
.workbuddy/
|
||||||
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# 2026-05-12 工作记录
|
|
||||||
|
|
||||||
## 主要变更:产品线分类 → 公司分类
|
|
||||||
|
|
||||||
### 用户需求
|
|
||||||
用户认为不需要按产品线(TalkingQ Pro / TalkingQ Lite)分类,而是要按**不同公司/客户**来分类。
|
|
||||||
|
|
||||||
### 修改内容
|
|
||||||
|
|
||||||
1. **index.html**
|
|
||||||
- 侧边栏:新增"客户公司"导航,支持展开子菜单(设备管理、OTA升级)
|
|
||||||
- Topbar:租户选择器改为公司选择器
|
|
||||||
- 新增公司数据模型和切换逻辑
|
|
||||||
|
|
||||||
2. **styles/main.css**
|
|
||||||
- 新增公司导航样式(company-selector、company-nav-item、company-submenu等)
|
|
||||||
- 新增公司信息提示样式(current-company-banner、all-companies-banner)
|
|
||||||
|
|
||||||
3. **scripts/device.js**(完全重写)
|
|
||||||
- 移除产品线分类,改用公司分类
|
|
||||||
- 设备数据增加 companyId 和 companyName 字段
|
|
||||||
- 支持按当前选中的公司过滤设备
|
|
||||||
|
|
||||||
4. **scripts/ota.js**(完全重写)
|
|
||||||
- 移除产品线分类,改用公司分类
|
|
||||||
- 每个公司有独立的固件版本列表
|
|
||||||
- OTA任务按公司分类显示
|
|
||||||
|
|
||||||
5. **scripts/rbac.js**(完全重写)
|
|
||||||
- 移除产品级权限配置,改用公司级权限配置
|
|
||||||
- Client 角色可分配到特定公司
|
|
||||||
- Admin/Worker 可访问全部公司数据
|
|
||||||
|
|
||||||
### 新数据结构
|
|
||||||
- **公司列表**:智慧星科技、未来玩具厂、童趣电子
|
|
||||||
- **权限层级**:Admin > Worker > Client(按公司隔离)
|
|
||||||
@@ -1,146 +0,0 @@
|
|||||||
# 2026-05-13 工作日志
|
|
||||||
|
|
||||||
## Bug修复
|
|
||||||
|
|
||||||
### 知识库列表页不显示问题
|
|
||||||
- **问题**:`getPaginedData` 拼写错误,应为 `getPaginatedData`,导致 JS 报错
|
|
||||||
- **修复**:scripts/knowledge-base.js 第103行
|
|
||||||
|
|
||||||
## 交互优化
|
|
||||||
|
|
||||||
### 全局 Tooltip 功能
|
|
||||||
- **样式优化**:更新 styles/main.css 中 [data-tooltip] 样式
|
|
||||||
- 添加阴影效果 `box-shadow: 0 2px 8px rgba(0,0,0,0.2)`
|
|
||||||
- 添加悬停动画 `transform: translateY(-2px)`
|
|
||||||
- 优化间距和圆角
|
|
||||||
- **应用范围**:更新以下页面的图标按钮为 `data-tooltip` 属性
|
|
||||||
- knowledge-base.js(列表页、返回按钮)
|
|
||||||
- agent-manage.js(应用卡片操作按钮)
|
|
||||||
- badcase.js(查看、标注、关闭按钮)
|
|
||||||
- prompt-manage.js(编辑、版本记录按钮)
|
|
||||||
- session.js(回放、标记按钮)
|
|
||||||
- privacy.js(复制、撤销按钮)
|
|
||||||
- kb-create.js(重试、删除、返回按钮)
|
|
||||||
- kb-detail.js(查看切片、Meta信息、更多操作按钮)
|
|
||||||
- agent-dev.js(编辑名称、语音输入、移除技能/插件按钮)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 知识库管理模块完善
|
|
||||||
|
|
||||||
### 完成内容
|
|
||||||
|
|
||||||
1. **CSS样式完善** (styles/main.css)
|
|
||||||
- 添加知识库列表页表格样式
|
|
||||||
- 添加批量操作栏、加载状态、空状态
|
|
||||||
- 添加知识库类型标签(文档搜索、数据查询、图片问答、音视频搜索)
|
|
||||||
- 添加文件状态徽章(已就绪、处理中、解析失败)
|
|
||||||
- 添加分页器样式
|
|
||||||
- 添加创建向导样式(步骤指示器、内容区、底部操作栏)
|
|
||||||
- 添加知识库类型卡片选择器
|
|
||||||
- 添加上传区域、文件列表、类目选择器
|
|
||||||
- 添加切片配置面板、范围滑块
|
|
||||||
- 添加详情页样式(头部信息、Tab切换、切片列表)
|
|
||||||
- 添加命中测试面板、历史记录
|
|
||||||
- 添加Tooltip样式、Switch开关、下拉菜单
|
|
||||||
|
|
||||||
2. **知识库列表页** (scripts/knowledge-base.js)
|
|
||||||
- 表格形式展示知识库列表
|
|
||||||
- 字段:名称、类型、数据量、状态、创建时间、更新时间、操作
|
|
||||||
- 支持排序、筛选、搜索、分页
|
|
||||||
- 支持批量选择和批量操作
|
|
||||||
- 支持查看详情、命中测试、编辑、删除
|
|
||||||
- 支持重建索引、导出
|
|
||||||
- 空状态、加载状态展示
|
|
||||||
- 添加知识库弹窗(列表+创建入口)
|
|
||||||
|
|
||||||
3. **创建知识库向导** (scripts/kb-create.js)
|
|
||||||
- 3步骤流程(基础信息→数据选择→索引设置)
|
|
||||||
- Step 1:知识库名称(必填)、描述、类型选择(带Tooltip)
|
|
||||||
- Step 2:数据连接器说明、3种数据来源(文件上传/选择类目/选择文件)
|
|
||||||
- 文件上传:拖拽上传、进度、状态、删除、重试
|
|
||||||
- 支持按知识库类型限制文件格式和大小
|
|
||||||
- 解析方式配置(继承目录/默认/自定义)
|
|
||||||
- 自动同步开关
|
|
||||||
- Step 3:6种切片方式(智能/按长度/按页/按标题/按正则/按符号)
|
|
||||||
- 各切片方式对应参数配置
|
|
||||||
- 高级参数折叠面板(向量模型、排序模型、排序模式、检索参数)
|
|
||||||
- 所有专业字段带Tooltip解释
|
|
||||||
- 支持保存草稿、离开确认
|
|
||||||
- 必填校验
|
|
||||||
|
|
||||||
4. **知识库详情页** (scripts/kb-detail.js)
|
|
||||||
- 返回按钮、面包屑导航
|
|
||||||
- 头部信息(名称、描述、类型、ID、数据量、更新时间、标签)
|
|
||||||
- 操作按钮(命中测试、编辑、更多菜单)
|
|
||||||
- Tab切换(文件管理、标签管理)
|
|
||||||
- 文件管理Tab:
|
|
||||||
- 文件统计卡片(总数、已解析、解析中、失败)
|
|
||||||
- 批量操作栏
|
|
||||||
- 完整文件列表(文件名、格式、大小、数据量、状态、所属类目、切片数、索引时间)
|
|
||||||
- 支持查看切片、Meta信息、重新解析、删除
|
|
||||||
- 解析失败显示错误原因
|
|
||||||
- 标签管理Tab:
|
|
||||||
- 标签列表(新增、删除)
|
|
||||||
- 批量操作
|
|
||||||
- 上传数据入口
|
|
||||||
- 命中测试弹窗:
|
|
||||||
- 测试参数配置
|
|
||||||
- 快捷问题标签
|
|
||||||
- 历史召回记录
|
|
||||||
|
|
||||||
### 技术要点
|
|
||||||
- 所有专业字段带Tooltip解释
|
|
||||||
- 支持返回上一级、取消操作、弹窗确认
|
|
||||||
- 保存草稿(localStorage)
|
|
||||||
- 离开页面二次确认
|
|
||||||
- 必填校验
|
|
||||||
- 空状态、加载状态、解析中状态、失败状态
|
|
||||||
- 企业级SaaS风格,简洁现代
|
|
||||||
|
|
||||||
## 知识库管理前端更新完成
|
|
||||||
|
|
||||||
### 已更新的文件
|
|
||||||
1. `styles/main.css` - 完整的企业级样式系统
|
|
||||||
2. `scripts/knowledge-base.js` - 知识库列表页
|
|
||||||
3. `scripts/kb-create.js` - 创建知识库Step Form向导
|
|
||||||
4. `scripts/kb-detail.js` - 知识库详情页
|
|
||||||
5. `index.html` - 添加暗黑模式切换功能
|
|
||||||
|
|
||||||
### 实现的功能
|
|
||||||
|
|
||||||
**知识库列表页 (knowledge-base.js)**
|
|
||||||
- 知识库筛选、搜索、分页、排序
|
|
||||||
- 批量操作(批量删除、批量导出)
|
|
||||||
- 添加知识库弹窗(类型筛选、状态筛选、搜索)
|
|
||||||
- Skeleton加载状态
|
|
||||||
- Empty空状态
|
|
||||||
|
|
||||||
**创建知识库向导 (kb-create.js)**
|
|
||||||
- Step 1: 基础信息(名称、描述、类型选择)
|
|
||||||
- Step 2: 数据选择(文件上传、类目选择、文件选择)
|
|
||||||
- Step 3: 索引设置(切片方式、检索参数)
|
|
||||||
- 草稿自动保存/恢复
|
|
||||||
- 必填校验
|
|
||||||
- 离开确认弹窗
|
|
||||||
- API接口预留
|
|
||||||
|
|
||||||
**知识库详情页 (kb-detail.js)**
|
|
||||||
- Tab切换(文件管理、标签管理、切片管理、统计信息)
|
|
||||||
- 文件列表(状态流转、批量操作)
|
|
||||||
- 切片编辑(内容编辑、历史版本、回滚)
|
|
||||||
- 命中测试(快捷问题、历史记录)
|
|
||||||
- 统计信息(切片统计、格式分布、Metadata统计)
|
|
||||||
- API接口预留
|
|
||||||
|
|
||||||
**全局功能**
|
|
||||||
- 暗黑模式切换(支持localStorage持久化)
|
|
||||||
- Modal弹窗增强(支持size和confirmClass参数)
|
|
||||||
- Tooltip统一小问号样式
|
|
||||||
- 二次确认弹窗
|
|
||||||
- Loading/Empty/Error/Skeleton状态
|
|
||||||
|
|
||||||
### API预留
|
|
||||||
所有后端接口已在代码中注释说明,包含:
|
|
||||||
- GET/POST/DELETE/PUT 各操作的API路径
|
|
||||||
- Request和Response字段规范
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# 2026-05-14 工作记录
|
|
||||||
|
|
||||||
## 修复登录页面CSS样式缺失
|
|
||||||
|
|
||||||
**问题**:登录页面(login page)使用了大量CSS类名(.login-center-wrapper, .login-form-card, .role-selector, .role-option 等),但 main.css 中完全没有这些类的定义,导致登录页看起来像裸 HTML,所有元素堆在左上角。
|
|
||||||
|
|
||||||
**修复**:在 styles/main.css 末尾添加了完整的登录页样式(约200行),包括:
|
|
||||||
- 登录页整体布局(居中、渐变背景)
|
|
||||||
- 品牌区域样式(TalkingQ logo、标语)
|
|
||||||
- 登录卡片(白色卡片、圆角、阴影)
|
|
||||||
- 角色选择器(三列角色卡片,选中状态高亮)
|
|
||||||
- 表单输入框(带图标、密码切换按钮)
|
|
||||||
- 记住登录状态复选框
|
|
||||||
- 登录按钮(全宽、大号)
|
|
||||||
- 页脚链接
|
|
||||||
- 移动端响应式适配
|
|
||||||
|
|
||||||
**根因**:之前开发时只写了登录页的 HTML/JS 结构,忘记写对应的 CSS 样式。类似问题已在智能体开发页面(agent-dev.js)出现过一次,这次是登录页面。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 修复侧边栏公司导航CSS样式缺失
|
|
||||||
|
|
||||||
**问题**:侧边栏"设备管理"区域的公司列表(.company-nav-item, .company-badge, .company-submenu, .submenu-item)完全没有CSS定义,导致公司名称、设备数量角标、设备管理/OTA升级子菜单都是纯文本堆叠,没有布局、没有图标、没有交互样式。
|
|
||||||
|
|
||||||
**修复**:在 styles/main.css 登录页样式之后添加了完整的公司导航样式,包括:
|
|
||||||
- 公司项(company-nav-item):flex布局、hover效果、active选中高亮(绿色背景)
|
|
||||||
- 设备数量角标(company-badge):圆角标签、active时绿色背景
|
|
||||||
- 子菜单(company-submenu):默认隐藏、展开时显示
|
|
||||||
- 子菜单项(submenu-item):设备管理/OTA升级链接样式
|
|
||||||
- 图标尺寸和颜色适配深色侧边栏
|
|
||||||
|
|
||||||
**根因**:与登录页问题相同——HTML/JS结构写了,CSS未同步。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 调整侧边栏公司导航交互和颜色
|
|
||||||
|
|
||||||
**问题**:
|
|
||||||
1. 未选中的公司项字体颜色太暗(var(--text-sidebar) 是半透明灰色),用户希望直接显示白色
|
|
||||||
2. 子菜单默认隐藏,需要点击才展开,用户希望直接显示
|
|
||||||
|
|
||||||
**修复**:
|
|
||||||
- CSS:将 company-nav-item 默认颜色从 var(--text-sidebar) 改为 #fff(白色)
|
|
||||||
- CSS:将 company-badge 默认颜色和背景调亮
|
|
||||||
- CSS:将 company-submenu 默认 display 从 none 改为 flex(始终展开)
|
|
||||||
- CSS:调整 submenu-item 颜色为 rgba(255,255,255,0.7),hover 变白
|
|
||||||
- JS:移除点击公司项时切换子菜单展开/收起的逻辑,只保留选中状态切换
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 调整侧边栏公司导航为手风琴模式
|
|
||||||
|
|
||||||
**问题**:用户反馈不需要全部展开,希望点到哪个公司哪个展开(手风琴效果)。
|
|
||||||
|
|
||||||
**修复**:
|
|
||||||
- CSS:将 company-submenu 默认 display 改回 none(收起状态)
|
|
||||||
- JS:恢复点击公司项时切换子菜单展开/收起的逻辑
|
|
||||||
- JS:添加手风琴效果——展开一个公司时自动收起其他已展开的公司
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# 2026-05-15 工作记录
|
|
||||||
|
|
||||||
## 重写三角色权限控制 + 登录页角色改名
|
|
||||||
|
|
||||||
**改动列表**:
|
|
||||||
|
|
||||||
1. **登录页角色卡片**:
|
|
||||||
- 工人 → 员工(图标换为 users,data-role 保持 worker)
|
|
||||||
- 去掉三个角色的权限描述文字(.role-desc)
|
|
||||||
|
|
||||||
2. **登录后跳转**:三个角色统一跳转 dashboard(之前 client 跳 agent-manage,worker 跳 session)
|
|
||||||
|
|
||||||
3. **权限重新分配**(`__updateSidebarForRole`完全重写):
|
|
||||||
- **管理员**:全部内容可见
|
|
||||||
- **员工(worker)**:仪表盘 + 设备管理 + 应用配置 + 会话分析 + 系统管理(隐私保护+系统设置,权限管理隐藏)
|
|
||||||
- **客户(client)**:仪表盘 + 会话分析(仅会话详情) + 设备管理(仅设备管理,无OTA),顶部公司选择器隐藏
|
|
||||||
|
|
||||||
4. **客户特殊处理**:
|
|
||||||
- `initCompanyNav` 增加 role 参数
|
|
||||||
- 客户只看自己公司(mock: company_a),无"全部公司"选项
|
|
||||||
- 客户的设备管理子菜单不显示 OTA 升级
|
|
||||||
- 顶部 company-selector 隐藏
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# MEMORY.md - TalkingQ平台 长期记忆
|
|
||||||
|
|
||||||
## 项目信息
|
|
||||||
- **项目名**: TalkingQ AI玩具运营与数据洞察平台
|
|
||||||
- **类型**: B端运营后台,纯前端(留后端接口)
|
|
||||||
- **技术栈**: HTML + CSS + Vanilla JS + Chart.js + Lucide Icons
|
|
||||||
- **品牌色**: #52c41a(绿色,来自商标)、深色侧边栏 #141414
|
|
||||||
|
|
||||||
## 项目结构
|
|
||||||
- 单页应用,index.html 入口
|
|
||||||
- styles/main.css 全局样式(约4500行)
|
|
||||||
- scripts/api.js 所有API接口定义(mock实现)
|
|
||||||
- 各页面模块单独js文件
|
|
||||||
|
|
||||||
## 已实现功能
|
|
||||||
数据仪表盘、智能体开发(ASR/TTS/RAG/语言)、智能体管理、Prompt管理、
|
|
||||||
设备管理、OTA升级、会话详情、Bad Case管理、RBAC权限、PII隐私保护、系统设置
|
|
||||||
|
|
||||||
## 用户偏好
|
|
||||||
- 颜色风格跟商标一致(绿色为主)
|
|
||||||
- 全前端实现,留接口供未来后端接入
|
|
||||||
- 智能体开发需要ASR、TTS、RAG挂载、语言选择功能
|
|
||||||
|
|
||||||
## 重要修复记录
|
|
||||||
### 2026-05-14 - UI 样式缺失修复
|
|
||||||
- **问题**: agent-dev.js 中使用的 CSS 类(如 `.agent-config-layout`, `.module-panel`, `.chat-test-panel`, `.skill-grid` 等)在 main.css 中完全缺失
|
|
||||||
- **修复**: 在 main.css 末尾添加了约950行缺失的样式定义,包括:
|
|
||||||
- 应用配置页面布局(agent-config-layout, agent-config-left/right)
|
|
||||||
- 模块标签和面板样式(module-tabs, module-tab, module-panel)
|
|
||||||
- 配置行和子区块样式(config-row, config-subsection)
|
|
||||||
- 场景模板网格(scene-template-grid, scene-item)
|
|
||||||
- 技能网格(skill-grid, skill-item)
|
|
||||||
- 对话测试面板(chat-test-panel, chat-messages, chat-bubble)
|
|
||||||
- 统计卡片(stat-card, stat-value, stat-icon)
|
|
||||||
- 其他缺失组件样式(tooltip-box, device-status, firmware-version 等)
|
|
||||||
97
test.html
97
test.html
@@ -1,97 +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>TalkingQ - Test</title>
|
|
||||||
<style>
|
|
||||||
body { font-family: sans-serif; padding: 20px; background: #f5f5f5; }
|
|
||||||
.login-wrapper { display: flex; width: 100%; height: 100vh; overflow: hidden; }
|
|
||||||
.login-container { width: 460px; padding: 60px 50px; background: #fff; display: flex; flex-direction: column; justify-content: center; }
|
|
||||||
.login-bg { flex: 1; background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%); display: flex; align-items: center; justify-content: center; color: #fff; }
|
|
||||||
.login-title { font-size: 28px; font-weight: 700; margin-bottom: 8px; }
|
|
||||||
.login-subtitle { font-size: 14px; color: #666; margin-bottom: 40px; }
|
|
||||||
.form-group { margin-bottom: 18px; }
|
|
||||||
.form-label { display: block; font-size: 13px; font-weight: 500; margin-bottom: 6px; }
|
|
||||||
.form-control { width: 100%; padding: 10px 12px; border: 1px solid #d9d9d9; border-radius: 6px; font-size: 14px; }
|
|
||||||
.btn-primary { width: 100%; padding: 12px; background: #52c41a; color: #fff; border: none; border-radius: 6px; font-size: 15px; cursor: pointer; }
|
|
||||||
.btn-primary:hover { background: #389e0d; }
|
|
||||||
.error-box { background: #fff2f0; border: 1px solid #ffccc7; padding: 20px; border-radius: 8px; margin-bottom: 20px; color: #ff4d4f; }
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="error-container"></div>
|
|
||||||
<div id="app"></div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
// Simple test to check for errors
|
|
||||||
window.onerror = function(msg, url, line, col, error) {
|
|
||||||
document.getElementById('error-container').innerHTML = '<div class="error-box"><strong>JS Error:</strong><br>' + msg + '<br><small>Line: ' + line + '</small></div>';
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script src="scripts/api.js"></script>
|
|
||||||
<script>
|
|
||||||
console.log('API loaded');
|
|
||||||
</script>
|
|
||||||
<script src="scripts/login.js"></script>
|
|
||||||
<script>
|
|
||||||
console.log('Login loaded');
|
|
||||||
</script>
|
|
||||||
<script src="scripts/app.js"></script>
|
|
||||||
<script>
|
|
||||||
console.log('App loaded, registering pages...');
|
|
||||||
|
|
||||||
// Check if registerPage exists
|
|
||||||
if (typeof registerPage !== 'function') {
|
|
||||||
document.getElementById('error-container').innerHTML += '<div class="error-box">ERROR: registerPage function not found!</div>';
|
|
||||||
} else {
|
|
||||||
console.log('registerPage exists');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if login page renderer exists
|
|
||||||
console.log('Checking pageRenderers:', typeof pageRenderers);
|
|
||||||
|
|
||||||
// Init
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
console.log('DOMContentLoaded fired');
|
|
||||||
|
|
||||||
// Show login directly
|
|
||||||
const app = document.getElementById('app');
|
|
||||||
app.innerHTML = `
|
|
||||||
<div class="login-wrapper">
|
|
||||||
<div class="login-container">
|
|
||||||
<div class="login-header">
|
|
||||||
<h1 class="login-title">欢迎回来</h1>
|
|
||||||
<p class="login-subtitle">AI 玩具智能运营平台</p>
|
|
||||||
</div>
|
|
||||||
<form id="testLoginForm">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="form-label">用户名 / 邮箱</label>
|
|
||||||
<input type="text" class="form-control" id="testUsername" placeholder="请输入用户名或邮箱">
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="form-label">密码</label>
|
|
||||||
<input type="password" class="form-control" id="testPassword" placeholder="请输入密码">
|
|
||||||
</div>
|
|
||||||
<button type="submit" class="btn-primary">登 录</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="login-bg">
|
|
||||||
<h2>智能运营,尽在掌控</h2>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
`;
|
|
||||||
|
|
||||||
document.getElementById('testLoginForm').addEventListener('submit', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
var username = document.getElementById('testUsername').value;
|
|
||||||
var password = document.getElementById('testPassword').value;
|
|
||||||
console.log('Login attempt:', username);
|
|
||||||
alert('登录功能测试中...');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
Reference in New Issue
Block a user