feat: 初始提交(仅核心代码,已排除大文件)
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
* { box-sizing: border-box }
|
||||
body { margin: 0; font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif }
|
||||
.topbar { display: flex; justify-content: space-between; align-items: center; padding: 8px 12px; border-bottom: 1px solid #ddd; position: sticky; top: 0; background: #fff; z-index: 10 }
|
||||
.tabs { display: flex; gap: 8px }
|
||||
.tab { border: none; background: #f5f5f5; padding: 8px 12px; border-radius: 8px; cursor: pointer; text-decoration: none; color: inherit }
|
||||
.tab.active { background: #222; color: #fff }
|
||||
.settings { border: none; background: #fff; padding: 6px 10px; border: 1px solid #222; border-radius: 6px; cursor: pointer }
|
||||
main { padding: 12px }
|
||||
.modal { position: fixed; inset: 0; display: grid; place-items: center; background: rgba(0,0,0,0.35); z-index: 1000 }
|
||||
.hidden { display: none }
|
||||
.modal-body { background: #fff; width: 520px; max-width: 90vw; border-radius: 10px; padding: 16px; display: grid; gap: 8px }
|
||||
.modal-actions { display: flex; justify-content: flex-end; gap: 8px }
|
||||
mark { background: #ffe58f }
|
||||
.kw-0 { background: #ffe58f }
|
||||
.kw-1 { background: #ffd6e7 }
|
||||
.kw-2 { background: #d6f5ff }
|
||||
.kw-3 { background: #d9f7be }
|
||||
.kw-4 { background: #fff1b8 }
|
||||
.kw-5 { background: #efdbff }
|
||||
@@ -0,0 +1,61 @@
|
||||
const el = id => document.getElementById(id)
|
||||
const highlight = (text, terms) => {
|
||||
if (!terms || terms.length === 0) return text
|
||||
let s = text
|
||||
terms.forEach((t, i) => {
|
||||
const cls = `kw-${i % 6}`
|
||||
const re = new RegExp(`(${t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi')
|
||||
s = s.replace(re, `<mark class="${cls}">$1</mark>`)
|
||||
})
|
||||
return s
|
||||
}
|
||||
|
||||
const fmtCNDateTime = (d) => {
|
||||
const date = d instanceof Date ? d : new Date()
|
||||
try {
|
||||
const s = new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }).format(date)
|
||||
return s.replace(/\//g, '-').replace(/\u200E/g, '')
|
||||
} catch {
|
||||
const pad = n => String(n).padStart(2, '0')
|
||||
const y = date.getFullYear(), m = pad(date.getMonth()+1), day = pad(date.getDate()), hh = pad(date.getHours()), mm = pad(date.getMinutes()), ss = pad(date.getSeconds())
|
||||
return `${y}-${m}-${day} ${hh}:${mm}:${ss}`
|
||||
}
|
||||
}
|
||||
|
||||
const fmtCNSimpleTime = (d) => {
|
||||
const date = d instanceof Date ? d : new Date()
|
||||
try {
|
||||
const s = new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai', hour: '2-digit', minute: '2-digit', hour12: false }).format(date)
|
||||
return s.replace(/\u200E/g, '')
|
||||
} catch {
|
||||
const pad = n => String(n).padStart(2, '0')
|
||||
return `${pad(date.getHours())}:${pad(date.getMinutes())}`
|
||||
}
|
||||
}
|
||||
|
||||
const cnDateStr = (d) => {
|
||||
const date = d instanceof Date ? d : new Date()
|
||||
try {
|
||||
const s = new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit' }).format(date)
|
||||
return s.replace(/\//g, '-').replace(/\u200E/g, '')
|
||||
} catch {
|
||||
const pad = n => String(n).padStart(2, '0')
|
||||
return `${date.getFullYear()}-${pad(date.getMonth()+1)}-${pad(date.getDate())}`
|
||||
}
|
||||
}
|
||||
|
||||
window.fmtCNDateTime = fmtCNDateTime
|
||||
window.fmtCNSimpleTime = fmtCNSimpleTime
|
||||
window.cnDateStr = cnDateStr
|
||||
|
||||
;(function handleSetToken() {
|
||||
try {
|
||||
const u = new URL(window.location.href)
|
||||
const token = u.searchParams.get('set_token')
|
||||
if (token) {
|
||||
localStorage.setItem('toolbox_creds_token', token)
|
||||
u.searchParams.delete('set_token')
|
||||
window.history.replaceState(null, '', u.toString())
|
||||
}
|
||||
} catch {}
|
||||
})()
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
||||
<header class="topbar">
|
||||
<nav class="tabs">
|
||||
<a class="tab" href="/go?systemId=Tools-weibo" data-key="weibo">微博跟踪</a>
|
||||
<a class="tab" href="/go?systemId=Tools-markets" data-key="markets">市场跟踪</a>
|
||||
<a class="tab" href="/go?systemId=Tools-wall-" data-key="wall">告知墙</a>
|
||||
<a class="tab" href="/go?systemId=Tools-funds" data-key="funds">本金变动池</a>
|
||||
<a class="tab" href="/go?systemId=Tools-ccb_private_funds" data-key="ccb_private_funds">建行私募理财</a>
|
||||
<a class="tab" href="/go?systemId=Tools-cloud" data-key="cloud">云产品管理</a>
|
||||
<a class="tab" href="/go?systemId=Tools-weekly" data-key="weekly">工作周报</a>
|
||||
<a class="tab" href="/go?systemId=TRAE-Rebalance&url=https%3A%2F%2Ftraesite.umersoft.com%3A8960%2FRebalance.html" data-key="rebalance">再平衡</a>
|
||||
<a class="tab" href="/go?systemId=Wager&url=https%3A%2F%2Ftraesite.umersoft.com%3A8956" data-key="wager">投注</a>
|
||||
<a class="tab" href="/go?systemId=TRAE-PSC&url=https%3A%2F%2Ftraesite.umersoft.com%3A8969%2F" data-key="disk">安全网盘</a>
|
||||
<a class="tab" href="/go?systemId=FitnessDiary" data-key="fitness">运动日志</a>
|
||||
<a class="tab" href="/go?systemId=CalendarReminder&url=https%3A%2F%2Ftraesite.umersoft.com%3A8972%2F" data-key="fitness">日历提醒</a>
|
||||
</nav>
|
||||
</header>
|
||||
@@ -0,0 +1,26 @@
|
||||
(async function(){
|
||||
try {
|
||||
const wrap = document.querySelector('#topbar')
|
||||
if (!wrap) return
|
||||
const res = await fetch('/common/nav.html')
|
||||
const html = await res.text()
|
||||
wrap.innerHTML = html
|
||||
const path = location.pathname.toLowerCase()
|
||||
let key = ''
|
||||
if (path.includes('/tools/weibo/')) key = 'weibo'
|
||||
else if (path.includes('/tools/markets/')) key = 'markets'
|
||||
else if (path.includes('/tools/wall/')) key = 'wall'
|
||||
else if (path.includes('/tools/funds/')) key = 'funds'
|
||||
else if (path.includes('/tools/ccb_private_funds/')) key = 'ccb_private_funds'
|
||||
else if (path.includes('/tools/cloud/')) key = 'cloud'
|
||||
else if (path.includes('/tools/weekly/')) key = 'weekly'
|
||||
else if (path.includes('/tools/ai-lib/')) key = 'ai-lib'
|
||||
else if (path.includes('/tools/expense/')) key = 'expense'
|
||||
if (key) {
|
||||
wrap.querySelectorAll('a.tab').forEach(a => {
|
||||
if (a.dataset.key === key) a.classList.add('active')
|
||||
else a.classList.remove('active')
|
||||
})
|
||||
}
|
||||
} catch {}
|
||||
})()
|
||||
@@ -0,0 +1,128 @@
|
||||
[
|
||||
|
||||
{
|
||||
"name": "地下偶像相关揭示板",
|
||||
"url": "https://m.weibo.cn/u/7716940453",
|
||||
"icon": "text_italic.png"
|
||||
},{
|
||||
"name": "世界树剧场",
|
||||
"url": "https://m.weibo.cn/u/7925328421",
|
||||
"icon": "user_go.png"
|
||||
},
|
||||
{
|
||||
"name": "育音堂",
|
||||
"url": "https://weibo.com/u/1802208671",
|
||||
"icon": "weather_sun.png"
|
||||
},
|
||||
{
|
||||
"name": "X下载利器",
|
||||
"url": "https://ssstwitter.com/",
|
||||
"icon": "twitter_tool.png"
|
||||
},
|
||||
{
|
||||
"name": "上海地下偶像联盟",
|
||||
"url": "https://m.weibo.cn/u/7912812433",
|
||||
"icon": "weibo.png"
|
||||
},
|
||||
{
|
||||
"name": "免费ICON",
|
||||
"url": "https://igoutu.cn/icons",
|
||||
"icon": ""
|
||||
},
|
||||
|
||||
{
|
||||
"name": "培训/导航/LOGO",
|
||||
"url": "http://112.74.31.221:8888/default.html",
|
||||
"icon": "HDA.png"
|
||||
},
|
||||
{
|
||||
"name": "Git 服务器",
|
||||
"url": "http://47.101.56.101:8998/Home/LogOn?ReturnUrl=%2F",
|
||||
"icon": "HDA.png"
|
||||
},
|
||||
{
|
||||
"name": "禅道 项目系统",
|
||||
"url": "http://112.74.31.221:82/zentao/user-login-L3plbnRhby9teS5odG1s.html",
|
||||
"icon": "HDA.png"
|
||||
},
|
||||
{
|
||||
"name": "阿里云-合规报告",
|
||||
"url": "https://security.aliyun.com/trust-center/compliance?spm=5176.32436255.J_JIpOXHuIiVOM6_FDQtQLN.2.377618c54gQlJa",
|
||||
"icon": "aliyun.png"
|
||||
},
|
||||
{
|
||||
"name": "硅谷-阿里合同",
|
||||
"url": "https://traesite.umersoft.com:8975/download_files/%E9%98%BF%E9%87%8C%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%8D%8F%E8%AE%AE.pdf",
|
||||
"icon": "aliyun.png"
|
||||
},
|
||||
{
|
||||
"name": "在线MP3播放",
|
||||
"url": "https://music.cpp-prog.com",
|
||||
"icon": "music.png"
|
||||
},
|
||||
{
|
||||
"name": "上海市医疗器械追溯报告系统",
|
||||
"url": "https://zssb.yjj.sh.gov.cn",
|
||||
"icon": "GOV.png"
|
||||
},
|
||||
{
|
||||
"name": "虚拟显示器,USB-MMIDD 驱动",
|
||||
"url": "https://traesite.umersoft.com:8975/download_files/usbmmidd_v2.zip",
|
||||
"icon": "download.png"
|
||||
},
|
||||
{
|
||||
"name": "CHROME纯净版X64",
|
||||
"url": "https://traesite.umersoft.com:8975/download_files/ChromeStandaloneSetup64.exe",
|
||||
"icon": "download.png"
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
},
|
||||
{
|
||||
"name": "测试长标题如果不指定图标",
|
||||
"url": "#",
|
||||
"icon": ""
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user