Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
26 KiB
26 KiB
📡 BC-M09-002 · DEV-012 Awen · 消息通知中心界面·环节1·前端交互功能
广播编号:BC-M09-002-AW
下发时间:2026-03-04 23:40
执行者:DEV-012 Awen
电脑:Windows 10
前置条件:BC-M09-001 环节0项目初始化已完成 ✅
引导通道:🧠 知秋壳子
模块:M09 消息通知中心界面
环节:环节1 · 前端交互功能(JavaScript:标签筛选 + 点击展开 + 标记已读)
💙 知秋的话
Awen~ 通知中心的页面已经做好了,看起来很酷对吧?🎉
现在我们让它**“活”起来**!加上 JavaScript 交互功能:
- 🏷️ 点击标签筛选通知(只看系统/任务/消息)
- 👆 点击通知卡片展开详情
- ✅ 点击未读圆点标记已读
- 📌 「全部已读」按钮一键清除未读
这个环节也是复制粘贴,一共 6步,跟着来就行!💪
📸 截图方法
按键盘上的 Print Screen(PrtSc)键截全屏,或者用 Win + Shift + S 截取选定区域,然后发给冰朔。
📋 步骤一:更新HTML,添加通知详情区域 + 引入JS文件
按 Win + R,输入 powershell,按回车打开PowerShell。
复制粘贴下面整段命令,按回车:
@"
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HoloLake · 消息通知中心</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="app-container">
<!-- 顶部标题栏 -->
<div class="header">
<h1>🔔 通知中心</h1>
<div class="header-actions">
<span class="unread-badge" id="unreadBadge">3条未读</span>
<button class="clear-btn" id="clearAllBtn">全部已读</button>
</div>
</div>
<!-- 分类标签栏 -->
<div class="tab-bar">
<button class="tab active" data-category="all">全部</button>
<button class="tab" data-category="system">🖥️ 系统</button>
<button class="tab" data-category="task">📋 任务</button>
<button class="tab" data-category="message">💬 消息</button>
</div>
<!-- 通知列表 -->
<div class="notification-list" id="notifList">
<!-- 通知1:未读·系统 -->
<div class="notification-card unread" data-category="system">
<div class="notif-icon system">🖥️</div>
<div class="notif-content">
<div class="notif-header">
<span class="notif-title">系统更新通知</span>
<span class="notif-time">5分钟前</span>
</div>
<p class="notif-summary">HoloLake v0.4.0 已发布,新增智能路由优化与多人格体协作调度功能。</p>
<div class="notif-detail">
<p>更新内容:</p>
<ul>
<li>智能路由优化:多人格体任务自动调度</li>
<li>SYSLOG解析引擎升级:支持结构化回执</li>
<li>开发者画像库上线:动态跟踪每位协作者成长</li>
</ul>
<p>请更新后重启应用。</p>
</div>
<span class="notif-tag tag-system">系统</span>
</div>
<div class="unread-dot"></div>
</div>
<!-- 通知2:未读·任务 -->
<div class="notification-card unread" data-category="task">
<div class="notif-icon task">📋</div>
<div class="notif-content">
<div class="notif-header">
<span class="notif-title">新任务已分配</span>
<span class="notif-time">12分钟前</span>
</div>
<p class="notif-summary">M09 消息通知中心界面·环节1·前端交互功能 已分配给你,请尽快开始。</p>
<div class="notif-detail">
<p>任务详情:</p>
<ul>
<li>模块:M09 消息通知中心界面</li>
<li>环节:环节1 前端交互功能</li>
<li>目标:添加JavaScript交互(标签筛选+展开详情+标记已读)</li>
<li>预计时间:15-20分钟</li>
</ul>
</div>
<span class="notif-tag tag-task">任务</span>
</div>
<div class="unread-dot"></div>
</div>
<!-- 通知3:未读·消息 -->
<div class="notification-card unread" data-category="message">
<div class="notif-icon message">💬</div>
<div class="notif-content">
<div class="notif-header">
<span class="notif-title">知秋发来一条消息</span>
<span class="notif-time">30分钟前</span>
</div>
<p class="notif-summary">“Awen~ 环节0一次通过!你的通知中心页面做得真好看 ✨ 现在我们让它活起来!”</p>
<div class="notif-detail">
<p>完整消息:</p>
<p>“Awen~ 环节0一次通过!你的通知中心页面做得真好看 ✨ 现在我们给它加上交互功能,让每个按钮都能点,每条通知都能展开。做完以后,这个页面就跟真正的App一样了!加油💪”</p>
</div>
<span class="notif-tag tag-message">消息</span>
</div>
<div class="unread-dot"></div>
</div>
<!-- 通知4:已读·系统 -->
<div class="notification-card" data-category="system">
<div class="notif-icon system">🖥️</div>
<div class="notif-content">
<div class="notif-header">
<span class="notif-title">DevLog部署完成</span>
<span class="notif-time">1小时前</span>
</div>
<p class="notif-summary">本地日志系统 HoloLake-DevLog 已成功部署到 C:\HoloLake-DevLog,所有检查项通过。</p>
<div class="notif-detail">
<p>部署详情:</p>
<ul>
<li>路径:C:\HoloLake-DevLog</li>
<li>状态:hololake_status = OK</li>
<li>导出:hololake_export = OK</li>
<li>已记录命令数:1</li>
</ul>
</div>
<span class="notif-tag tag-system">系统</span>
</div>
</div>
<!-- 通知5:已读·系统 -->
<div class="notification-card" data-category="system">
<div class="notif-icon system">🖥️</div>
<div class="notif-content">
<div class="notif-header">
<span class="notif-title">新成员加入团队</span>
<span class="notif-time">2小时前</span>
</div>
<p class="notif-summary">DEV-012 Awen 已加入光湖开发团队,成为第12位协作者。欢迎!🎉</p>
<div class="notif-detail">
<p>成员信息:</p>
<ul>
<li>编号:DEV-012</li>
<li>姓名:Awen</li>
<li>系统:Windows 10</li>
<li>当前任务:M09 消息通知中心界面</li>
</ul>
</div>
<span class="notif-tag tag-system">系统</span>
</div>
</div>
<!-- 通知6:已读·任务 -->
<div class="notification-card" data-category="task">
<div class="notif-icon task">📋</div>
<div class="notif-content">
<div class="notif-header">
<span class="notif-title">BC-000 任务已完成</span>
<span class="notif-time">3小时前</span>
</div>
<p class="notif-summary">恭喜!BC-000 DevLog部署任务已标记为 completed,执行节奏评价:稳。</p>
<div class="notif-detail">
<p>任务回顾:</p>
<ul>
<li>任务:BC-000 DevLog部署</li>
<li>状态:✅ completed</li>
<li>节奏:稳</li>
<li>下一步:M09 消息通知中心界面</li>
</ul>
</div>
<span class="notif-tag tag-task">任务</span>
</div>
</div>
</div>
<!-- 底部状态栏 -->
<div class="footer">
<span id="footerStats">共 6 条通知 · 3 条未读</span>
<span class="footer-brand">HoloLake · 光湖系统</span>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
"@ | Out-File -FilePath "C:\HoloLake-Notification\index.html" -Encoding UTF8
Write-Host "✅ HTML已更新!添加了通知详情区域 + JS引用" -ForegroundColor Green
📸 截图发给冰朔!
📋 步骤二:更新CSS,添加详情展开动画样式
复制粘贴下面整段命令,按回车:
@"
/* HoloLake · 消息通知中心 · 深色科技风 + 交互动画 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
background: #0a1628;
color: #e0e6ed;
min-height: 100vh;
}
.app-container {
max-width: 520px;
margin: 0 auto;
padding: 0 16px;
}
/* ========== 顶部标题栏 ========== */
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 24px 0 16px;
border-bottom: 1px solid rgba(255,255,255,0.08);
}
.header h1 {
font-size: 22px;
font-weight: 700;
color: #e0e6ed;
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
}
.unread-badge {
background: rgba(244, 67, 54, 0.15);
color: #ef5350;
font-size: 12px;
padding: 4px 10px;
border-radius: 12px;
font-weight: 600;
transition: all 0.3s ease;
}
.unread-badge.zero {
background: rgba(76, 175, 80, 0.15);
color: #81c784;
}
.clear-btn {
background: rgba(79, 195, 247, 0.1);
color: #4fc3f7;
border: 1px solid rgba(79, 195, 247, 0.2);
padding: 6px 14px;
border-radius: 8px;
font-size: 13px;
cursor: pointer;
transition: all 0.2s ease;
}
.clear-btn:hover {
background: rgba(79, 195, 247, 0.2);
transform: scale(1.02);
}
.clear-btn:active {
transform: scale(0.98);
}
/* ========== 分类标签栏 ========== */
.tab-bar {
display: flex;
gap: 8px;
padding: 16px 0;
border-bottom: 1px solid rgba(255,255,255,0.06);
}
.tab {
padding: 8px 18px;
border-radius: 20px;
border: 1px solid rgba(255,255,255,0.1);
background: transparent;
color: #8899aa;
font-size: 13px;
cursor: pointer;
transition: all 0.2s ease;
}
.tab:hover {
border-color: rgba(79, 195, 247, 0.3);
color: #b0bec5;
}
.tab.active {
background: rgba(79, 195, 247, 0.15);
border-color: #4fc3f7;
color: #4fc3f7;
font-weight: 600;
}
/* ========== 通知列表 ========== */
.notification-list {
padding: 12px 0;
}
.notification-card {
display: flex;
align-items: flex-start;
gap: 14px;
padding: 16px 12px;
border-radius: 12px;
margin-bottom: 8px;
transition: all 0.3s ease;
position: relative;
cursor: pointer;
}
.notification-card:hover {
background: rgba(255,255,255,0.04);
}
.notification-card.unread {
background: rgba(79, 195, 247, 0.04);
border-left: 3px solid #4fc3f7;
}
.notification-card.hidden {
display: none;
}
.notification-card.expanded {
background: rgba(255,255,255,0.06);
}
/* 通知图标 */
.notif-icon {
width: 42px;
height: 42px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
flex-shrink: 0;
}
.notif-icon.system { background: rgba(156, 39, 176, 0.12); }
.notif-icon.task { background: rgba(76, 175, 80, 0.12); }
.notif-icon.message { background: rgba(79, 195, 247, 0.12); }
/* 通知内容 */
.notif-content {
flex: 1;
min-width: 0;
}
.notif-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 6px;
}
.notif-title {
font-size: 15px;
font-weight: 600;
color: #e0e6ed;
}
.notif-time {
font-size: 12px;
color: #556677;
flex-shrink: 0;
}
.notif-summary {
font-size: 13px;
color: #8899aa;
line-height: 1.5;
margin-bottom: 8px;
}
/* 通知详情(默认隐藏) */
.notif-detail {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease, opacity 0.3s ease, margin 0.3s ease;
opacity: 0;
font-size: 13px;
color: #90a4ae;
line-height: 1.6;
margin-top: 0;
}
.notif-detail.show {
max-height: 300px;
opacity: 1;
margin-top: 10px;
margin-bottom: 8px;
}
.notif-detail ul {
list-style: none;
padding-left: 0;
}
.notif-detail ul li {
padding: 3px 0;
padding-left: 16px;
position: relative;
}
.notif-detail ul li::before {
content: '▸';
position: absolute;
left: 0;
color: #4fc3f7;
}
.notif-detail p {
margin-bottom: 6px;
}
/* 通知标签 */
.notif-tag {
display: inline-block;
font-size: 11px;
padding: 2px 8px;
border-radius: 6px;
font-weight: 500;
}
.tag-system { background: rgba(156, 39, 176, 0.12); color: #ce93d8; }
.tag-task { background: rgba(76, 175, 80, 0.12); color: #81c784; }
.tag-message { background: rgba(79, 195, 247, 0.12); color: #4fc3f7; }
/* 未读圆点 */
.unread-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: #4fc3f7;
flex-shrink: 0;
margin-top: 6px;
cursor: pointer;
transition: all 0.3s ease;
}
.unread-dot:hover {
transform: scale(1.5);
box-shadow: 0 0 8px rgba(79, 195, 247, 0.5);
}
/* 标记已读动画 */
.notification-card.marking-read {
animation: markRead 0.4s ease forwards;
}
@keyframes markRead {
0% { border-left-color: #4fc3f7; }
50% { border-left-color: #81c784; background: rgba(76, 175, 80, 0.06); }
100% { border-left-color: transparent; background: transparent; }
}
/* ========== 底部状态栏 ========== */
.footer {
display: flex;
justify-content: space-between;
padding: 20px 0;
border-top: 1px solid rgba(255,255,255,0.06);
font-size: 12px;
color: #556677;
}
.footer-brand {
color: rgba(79, 195, 247, 0.5);
}
"@ | Out-File -FilePath "C:\HoloLake-Notification\style.css" -Encoding UTF8
Write-Host "✅ CSS已更新!添加了展开动画 + 已读动画" -ForegroundColor Green
📸 截图发给冰朔!
📋 步骤三:创建 JavaScript 交互脚本
这是本次的核心步骤!复制粘贴下面整段命令,按回车:
@"
/* HoloLake · 消息通知中心 · 交互脚本 */
// 等页面加载完成后执行
document.addEventListener('DOMContentLoaded', function() {
// ========== 1. 标签筛选功能 ==========
const tabs = document.querySelectorAll('.tab');
const cards = document.querySelectorAll('.notification-card');
tabs.forEach(function(tab) {
tab.addEventListener('click', function() {
// 移除所有标签的激活状态
tabs.forEach(function(t) { t.classList.remove('active'); });
// 激活当前标签
tab.classList.add('active');
const category = tab.getAttribute('data-category');
cards.forEach(function(card) {
if (category === 'all') {
card.classList.remove('hidden');
} else {
if (card.getAttribute('data-category') === category) {
card.classList.remove('hidden');
} else {
card.classList.add('hidden');
}
}
});
});
});
// ========== 2. 点击通知卡片展开详情 ==========
cards.forEach(function(card) {
card.addEventListener('click', function(e) {
// 如果点击的是未读圆点,不触发展开
if (e.target.classList.contains('unread-dot')) return;
const detail = card.querySelector('.notif-detail');
if (detail) {
detail.classList.toggle('show');
card.classList.toggle('expanded');
}
});
});
// ========== 3. 点击未读圆点标记已读 ==========
const dots = document.querySelectorAll('.unread-dot');
dots.forEach(function(dot) {
dot.addEventListener('click', function(e) {
e.stopPropagation();
const card = dot.closest('.notification-card');
markAsRead(card);
});
});
// ========== 4. 「全部已读」按钮 ==========
const clearBtn = document.getElementById('clearAllBtn');
clearBtn.addEventListener('click', function() {
const unreadCards = document.querySelectorAll('.notification-card.unread');
unreadCards.forEach(function(card, index) {
// 每张卡片延迟一点,形成波浪效果
setTimeout(function() {
markAsRead(card);
}, index * 150);
});
});
// ========== 标记已读函数 ==========
function markAsRead(card) {
if (!card.classList.contains('unread')) return;
card.classList.add('marking-read');
setTimeout(function() {
card.classList.remove('unread');
card.classList.remove('marking-read');
// 移除未读圆点
const dot = card.querySelector('.unread-dot');
if (dot) dot.remove();
// 更新计数
updateUnreadCount();
}, 400);
}
// ========== 更新未读计数 ==========
function updateUnreadCount() {
const unreadCount = document.querySelectorAll('.notification-card.unread').length;
const badge = document.getElementById('unreadBadge');
const footer = document.getElementById('footerStats');
const totalCount = document.querySelectorAll('.notification-card').length;
if (unreadCount === 0) {
badge.textContent = '全部已读 ✅';
badge.classList.add('zero');
} else {
badge.textContent = unreadCount + '条未读';
badge.classList.remove('zero');
}
footer.textContent = '共 ' + totalCount + ' 条通知 · ' + unreadCount + ' 条未读';
}
});
"@ | Out-File -FilePath "C:\HoloLake-Notification\script.js" -Encoding UTF8
Write-Host "✅ JavaScript交互脚本创建成功!" -ForegroundColor Green
📸 截图发给冰朔!
📋 步骤四:刷新浏览器查看交互效果
复制粘贴下面的命令,按回车:
Start-Process "C:\HoloLake-Notification\index.html"
Write-Host "✅ 浏览器已打开!试试下面的操作~" -ForegroundColor Green
📋 步骤五:更新DevLog状态
复制粘贴下面的命令,按回车:
@"
{"developer_id":"DEV-012","developer_name":"Awen","system":"Windows 10","terminal":"PowerShell","robot_version":"v0.0","current_task":"M09-消息通知中心界面-环节1","current_status":"in_progress","total_commands_logged":2,"skills_learned":["terminal_basic","html_scaffold","css_styling","javascript_interaction"],"tasks_completed":["BC-000","M09-E0"]}
"@ | Out-File -FilePath "C:\HoloLake-DevLog\current-progress.json" -Encoding UTF8
Write-Host "✅ DevLog状态已更新!" -ForegroundColor Green
然后运行:
C:\HoloLake-DevLog\status.bat
📸 截图发给冰朔!
📋 步骤六:填写完成报告
🌊 底层锚定声明
💙 Awen的通知中心要“活”起来啦!加油 🔔✨
📥 SYSLOG回执区
(等待执行完成后回填)