feat: 初始化静态镜像站点仓库
163
__mirror/capture_cdp_page_apis.py
Normal file
@@ -0,0 +1,163 @@
|
||||
#!/usr/bin/env python3
|
||||
"""通过 Chrome DevTools Protocol 抓取页面接口响应。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import asyncio
|
||||
import base64
|
||||
import json
|
||||
import re
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
import websockets
|
||||
|
||||
|
||||
def load_pages() -> list[dict[str, Any]]:
|
||||
with urllib.request.urlopen("http://127.0.0.1:9222/json/list") as response:
|
||||
return json.loads(response.read().decode("utf-8"))
|
||||
|
||||
|
||||
def select_page(pages: list[dict[str, Any]], page_prefix: str) -> dict[str, Any]:
|
||||
for page in pages:
|
||||
if page.get("type") != "page":
|
||||
continue
|
||||
if page.get("url", "").startswith(page_prefix):
|
||||
return page
|
||||
raise RuntimeError(f"未找到匹配页面前缀的标签页: {page_prefix}")
|
||||
|
||||
|
||||
def sanitize_filename(value: str) -> str:
|
||||
value = re.sub(r"[^a-zA-Z0-9._-]+", "_", value)
|
||||
return value.strip("._") or "capture"
|
||||
|
||||
|
||||
async def capture_page_apis(
|
||||
ws_url: str,
|
||||
navigate_url: str,
|
||||
api_host_filter: str,
|
||||
duration: int,
|
||||
reload_page: bool,
|
||||
) -> list[dict[str, Any]]:
|
||||
pending: dict[str, dict[str, Any]] = {}
|
||||
finished: dict[str, dict[str, Any]] = {}
|
||||
next_id = 1
|
||||
|
||||
async with websockets.connect(ws_url, max_size=50_000_000) as ws:
|
||||
async def send(method: str, params: dict[str, Any] | None = None) -> dict[str, Any]:
|
||||
nonlocal next_id
|
||||
msg_id = next_id
|
||||
next_id += 1
|
||||
await ws.send(json.dumps({"id": msg_id, "method": method, "params": params or {}}))
|
||||
while True:
|
||||
msg = json.loads(await ws.recv())
|
||||
if msg.get("id") == msg_id:
|
||||
return msg
|
||||
handle_event(msg)
|
||||
|
||||
def handle_event(msg: dict[str, Any]) -> None:
|
||||
method = msg.get("method")
|
||||
params = msg.get("params", {})
|
||||
|
||||
if method == "Network.responseReceived":
|
||||
response = params.get("response", {})
|
||||
url = response.get("url", "")
|
||||
if api_host_filter not in url:
|
||||
return
|
||||
resource_type = params.get("type")
|
||||
if resource_type not in ("XHR", "Fetch", "Preflight"):
|
||||
return
|
||||
pending[params["requestId"]] = {
|
||||
"url": url,
|
||||
"status": response.get("status"),
|
||||
"mime_type": response.get("mimeType"),
|
||||
"resource_type": resource_type,
|
||||
}
|
||||
elif method == "Network.loadingFinished":
|
||||
request_id = params.get("requestId")
|
||||
if request_id in pending:
|
||||
finished[request_id] = pending[request_id]
|
||||
elif method == "Network.loadingFailed":
|
||||
request_id = params.get("requestId")
|
||||
pending.pop(request_id, None)
|
||||
|
||||
await send("Network.enable", {"maxTotalBufferSize": 100000000, "maxResourceBufferSize": 50000000})
|
||||
await send("Page.enable")
|
||||
await send("Runtime.enable")
|
||||
if reload_page:
|
||||
await send("Page.reload", {"ignoreCache": True})
|
||||
else:
|
||||
await send("Page.navigate", {"url": navigate_url})
|
||||
|
||||
end_time = asyncio.get_event_loop().time() + duration
|
||||
while asyncio.get_event_loop().time() < end_time:
|
||||
try:
|
||||
msg = json.loads(await asyncio.wait_for(ws.recv(), timeout=1))
|
||||
except asyncio.TimeoutError:
|
||||
continue
|
||||
handle_event(msg)
|
||||
|
||||
results: list[dict[str, Any]] = []
|
||||
for request_id, meta in finished.items():
|
||||
body = ""
|
||||
if meta["resource_type"] in ("XHR", "Fetch"):
|
||||
reply = await send("Network.getResponseBody", {"requestId": request_id})
|
||||
payload = reply.get("result", {})
|
||||
body = payload.get("body", "")
|
||||
if payload.get("base64Encoded"):
|
||||
try:
|
||||
body = base64.b64decode(body).decode("utf-8", errors="ignore")
|
||||
except Exception: # noqa: BLE001
|
||||
body = ""
|
||||
results.append(
|
||||
{
|
||||
**meta,
|
||||
"body_length": len(body),
|
||||
"body_preview": body[:1000],
|
||||
"body": body,
|
||||
}
|
||||
)
|
||||
return results
|
||||
|
||||
|
||||
def build_parser() -> argparse.ArgumentParser:
|
||||
parser = argparse.ArgumentParser(description="抓取页面接口响应")
|
||||
parser.add_argument("--page-prefix", required=True, help="已打开标签页 URL 前缀")
|
||||
parser.add_argument("--navigate-url", required=True, help="要导航到的真实页面 URL")
|
||||
parser.add_argument("--api-host-filter", required=True, help="接口域名关键字,例如 app-project-be.sqygj.cn")
|
||||
parser.add_argument("--duration", type=int, default=10, help="导航后监听秒数")
|
||||
parser.add_argument("--output", required=True, help="输出 JSON 文件路径")
|
||||
parser.add_argument("--reload", action="store_true", help="不导航,直接对当前标签页执行 reload")
|
||||
return parser
|
||||
|
||||
|
||||
def main() -> int:
|
||||
args = build_parser().parse_args()
|
||||
try:
|
||||
pages = load_pages()
|
||||
page = select_page(pages, args.page_prefix)
|
||||
results = asyncio.run(
|
||||
capture_page_apis(
|
||||
ws_url=page["webSocketDebuggerUrl"],
|
||||
navigate_url=args.navigate_url,
|
||||
api_host_filter=args.api_host_filter,
|
||||
duration=args.duration,
|
||||
reload_page=args.reload,
|
||||
)
|
||||
)
|
||||
output_path = Path(args.output)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
output_path.write_text(json.dumps(results, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
print(f"已捕获 {len(results)} 条接口响应")
|
||||
for item in results[:20]:
|
||||
print(f"{item['status']} {item['resource_type']} {item['url']}")
|
||||
return 0
|
||||
except Exception as exc: # noqa: BLE001
|
||||
print(f"抓取失败: {exc}")
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
20
__mirror/captures/hc-pos-basicsInfo-apis.json
Normal file
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"url": "https://app-project-be.sqygj.cn/appproject/project/findByCode",
|
||||
"status": 200,
|
||||
"mime_type": "",
|
||||
"resource_type": "Preflight",
|
||||
"body_length": 0,
|
||||
"body_preview": "",
|
||||
"body": ""
|
||||
},
|
||||
{
|
||||
"url": "https://app-project-be.sqygj.cn/appproject/project/findByCode",
|
||||
"status": 200,
|
||||
"mime_type": "application/json",
|
||||
"resource_type": "XHR",
|
||||
"body_length": 2408,
|
||||
"body_preview": "{\"data\":{\"id\":231,\"code\":\"e021fd7d-8365-41cc-a50f-1877c47c4e16\",\"name\":\"循环花园一期\",\"developer\":\"腾龙开发商\",\"floorage\":41980.48,\"carChargeImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20241201/1733065864105_e473b036.jpg\",\"lawFirmSeal\":null,\"greeningArea\":78000.00,\"address\":\"下陆区团城山街道龙湾一品小区\",\"isCommittee\":null,\"needApprove\":1,\"matching\":null,\"planImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/project/community_info_202503059026.jpg\",\"firePassageImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/project/community_info_202503059120.jpg\",\"areaImages\":null,\"spaceGridImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20230915/1694790916671_a974c795.jpg\",\"updateTime\":\"2026-04-01 21:03:58\",\"createTime\":\"2021-07-07 17:17:26\",\"isDelete\":0,\"codeNumber\":\"X39839\",\"nickname\":\"箭楼下社区\",\"province\":\"湖北省\",\"city\":\"黄石市\",\"area\":\"下陆区\",\"street\":\"团城山街道\",\"streetCode\":\"420204004\",\"deliverDate\":\"2010-07-01\",\"architectureDate\":\"2008-07-01\",\"architectureType\":\"高层\",\"houseCount\":38,",
|
||||
"body": "{\"data\":{\"id\":231,\"code\":\"e021fd7d-8365-41cc-a50f-1877c47c4e16\",\"name\":\"循环花园一期\",\"developer\":\"腾龙开发商\",\"floorage\":41980.48,\"carChargeImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20241201/1733065864105_e473b036.jpg\",\"lawFirmSeal\":null,\"greeningArea\":78000.00,\"address\":\"下陆区团城山街道龙湾一品小区\",\"isCommittee\":null,\"needApprove\":1,\"matching\":null,\"planImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/project/community_info_202503059026.jpg\",\"firePassageImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/project/community_info_202503059120.jpg\",\"areaImages\":null,\"spaceGridImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20230915/1694790916671_a974c795.jpg\",\"updateTime\":\"2026-04-01 21:03:58\",\"createTime\":\"2021-07-07 17:17:26\",\"isDelete\":0,\"codeNumber\":\"X39839\",\"nickname\":\"箭楼下社区\",\"province\":\"湖北省\",\"city\":\"黄石市\",\"area\":\"下陆区\",\"street\":\"团城山街道\",\"streetCode\":\"420204004\",\"deliverDate\":\"2010-07-01\",\"architectureDate\":\"2008-07-01\",\"architectureType\":\"高层\",\"houseCount\":38,\"buildingCount\":38,\"houseMemberCount\":173,\"companyId\":null,\"companyName\":null,\"manageArea\":13848.00,\"manageType\":7,\"programmeImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/project/community_info_202503059044.jpg\",\"dbName\":\"MHXHKJ\",\"longitude\":\"119.919847\",\"latitude\":\"31.016537\",\"payArea\":3440.51,\"presentation\":\"明珠佳园小区东至明珠路、南至城北路、西至金宇花园、北至小路,周边交通便利,配套完善,环境优美。\",\"image\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20220320/1647777882795_f65e03a8.jpg\",\"distance\":null,\"star\":5,\"type\":2,\"miniCode\":null,\"orderPrice\":20.00,\"layout\":\"一室一厅\",\"payMethod\":2,\"userNum\":null,\"unUserNum\":null,\"manageUnit\":\"测试\",\"signature\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20230414/1681480367954_5c56e2c5.png\",\"equipmentGridImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20230915/1694790826067_3823d4b3.jpg\",\"insideGridImages\":null,\"cleanGridImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20230915/1694790891460_cf000477.jpg\",\"safetyGridImages\":null,\"afforestationGridImages\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20230915/1694790916671_a974c795.jpg\",\"fireprotectionGridImages\":null,\"elevatorGridImages\":null,\"caryardGridImages\":null,\"energyGridImages\":null,\"fiveaGridImages\":null,\"typhoonGridImages\":null,\"incrementGmt\":\"2026-04-01 06:06:12\",\"lawFirmName\":null,\"lawFirmContractSummary\":null,\"lawFirmReminder\":null},\"code\":0,\"message\":\"success.\",\"ok\":true}"
|
||||
}
|
||||
]
|
||||
110
__mirror/captures/hc-pos-dashboard-apis.json
Normal file
1
__mirror/hc-pos-dashboard-capture.json
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
||||
BIN
__mirror/runtime/hc-etms-dashboard/branchOfficeManage-v2.png
Normal file
|
After Width: | Height: | Size: 245 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/companyInfo-v2.png
Normal file
|
After Width: | Height: | Size: 316 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/companyInfo-v3.png
Normal file
|
After Width: | Height: | Size: 322 KiB |
3
__mirror/runtime/hc-etms-dashboard/cookie-seed.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"language": "zh"
|
||||
}
|
||||
BIN
__mirror/runtime/hc-etms-dashboard/current-companyInfo.png
Normal file
|
After Width: | Height: | Size: 316 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/financeData-summary-debug.png
Normal file
|
After Width: | Height: | Size: 371 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/financeData-v2.png
Normal file
|
After Width: | Height: | Size: 195 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/financeData-v3.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/financeData-v4.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/financeData-v5.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/financeData-v6.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
44
__mirror/runtime/hc-etms-dashboard/index.html
Normal file
@@ -0,0 +1,44 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>企业服务平台 - 运行态镜像</title>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", sans-serif;
|
||||
background: #0c1424;
|
||||
color: #eef4ff;
|
||||
}
|
||||
|
||||
#mirror-loading {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
#mirror-loading small {
|
||||
color: #9aabc7;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mirror-loading">
|
||||
<div>正在启动企业服务平台运行态镜像…</div>
|
||||
<small>会预置本地存储、会话和接口 mock</small>
|
||||
</div>
|
||||
<div id="app"></div>
|
||||
<script>
|
||||
(function () {
|
||||
var script = document.createElement("script");
|
||||
script.src = "./runtime-bootstrap.js" + (location.search || "");
|
||||
document.body.appendChild(script);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
__mirror/runtime/hc-etms-dashboard/institution-v1.png
Normal file
|
After Width: | Height: | Size: 170 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/institution-v2.png
Normal file
|
After Width: | Height: | Size: 163 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/institution-v3.png
Normal file
|
After Width: | Height: | Size: 163 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/institution-v4.png
Normal file
|
After Width: | Height: | Size: 241 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/member-v1.png
Normal file
|
After Width: | Height: | Size: 170 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/member-v2.png
Normal file
|
After Width: | Height: | Size: 415 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/member-v3.png
Normal file
|
After Width: | Height: | Size: 412 KiB |
812
__mirror/runtime/hc-etms-dashboard/menu-seed.json
Normal file
@@ -0,0 +1,812 @@
|
||||
[
|
||||
{
|
||||
"id": 2,
|
||||
"menuName": "点击进入【项目运营平台】",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/404",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"menuName": "运营指数",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/404",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"menuName": "人事看板",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/404",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"menuName": "财务看板",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/microbrain/finance",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"menuName": "设备看板",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/microbrain/equipment",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"menuName": "车场看板",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/microbrain/parkingLot",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"menuName": "物业费报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/propertyFeeReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"menuName": "车场报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/parkingLotReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"menuName": "全年收入报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/404",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"menuName": "全员收费报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/404",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"menuName": "收入考核报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/404",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"menuName": "计划工单报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/planTaskReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"menuName": "非计划工单报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/workOrderReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"menuName": "工单耗时统计",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/dataReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 17,
|
||||
"menuName": "耗能报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/consumeReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 18,
|
||||
"menuName": "作业网格台账报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/jobGridReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"menuName": "合同保障报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/contractGuaranteeReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 20,
|
||||
"menuName": "合同保障明细报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/detailedContractGuaranteeReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 21,
|
||||
"menuName": "合同计划执行报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/contractPlanReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 22,
|
||||
"menuName": "体检统计报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/404",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 23,
|
||||
"menuName": "公众号拉新报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/officialAccount",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 24,
|
||||
"menuName": "催收跟踪报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/collectionTracking",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 25,
|
||||
"menuName": "企业收费项报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/collectionRate",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 26,
|
||||
"menuName": "拜访工作报表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/cloudData/visitWorkReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 27,
|
||||
"menuName": "月收入考核",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/r2cockpit/assessment/monthly",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 28,
|
||||
"menuName": "企业信息",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/companyInfo",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 29,
|
||||
"menuName": "成员",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/member",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 30,
|
||||
"menuName": "组织架构",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/institution",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 31,
|
||||
"menuName": "企微通讯录",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/organizational",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 32,
|
||||
"menuName": "分公司管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/branchOfficeManage",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 33,
|
||||
"menuName": "物料规范",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/materialStandard",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 34,
|
||||
"menuName": "社区动力方程",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/communityDynamic",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 35,
|
||||
"menuName": "财务规范",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/financeStandard",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 36,
|
||||
"menuName": "审批模板",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/approveMan",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 37,
|
||||
"menuName": "商户配置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/merchant",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 38,
|
||||
"menuName": "资质管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/qualificationMan",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 39,
|
||||
"menuName": "企业收费项",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/feeItem",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 40,
|
||||
"menuName": "满意度权重配置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/satisfactionWeight",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 41,
|
||||
"menuName": "财务数据",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/companyMetadata/financeData",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 42,
|
||||
"menuName": "人才测评",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/assessment",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 43,
|
||||
"menuName": "招聘管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/recruitManage",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 44,
|
||||
"menuName": "人事档案",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/personnelFiles",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 45,
|
||||
"menuName": "资质匹配",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/qualification",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 46,
|
||||
"menuName": "培训管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/trainingManage",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 47,
|
||||
"menuName": "考勤管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/checkWorkManage",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 48,
|
||||
"menuName": "薪酬管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/payManage",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 49,
|
||||
"menuName": "工资发放",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/salaryPayment",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 50,
|
||||
"menuName": "员工离任报告",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/employeeQuitReport",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 51,
|
||||
"menuName": "人事绩效管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/humanEffectManage",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 52,
|
||||
"menuName": "价值换算",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/laborValue",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 53,
|
||||
"menuName": "离职管控",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/leaveControl",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 54,
|
||||
"menuName": "法务纠纷",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/legalDispute",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 55,
|
||||
"menuName": "工伤人员",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/personnelMerits/injuredPersonnel",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 56,
|
||||
"menuName": "供应商库",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/supplierManage/supplierStock",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 57,
|
||||
"menuName": "合同管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/supplierManage/contractManage",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 58,
|
||||
"menuName": "供应商微脑",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/supplierManage/supplierMicrobrain",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 59,
|
||||
"menuName": "调查题库",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/satisfaction/questionBank",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 60,
|
||||
"menuName": "调查问卷",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/satisfaction/questionnaire",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 61,
|
||||
"menuName": "调查报告",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/satisfaction/report",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 62,
|
||||
"menuName": "整改跟踪",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/satisfaction/tracking",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 63,
|
||||
"menuName": "应用列表",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/appStore/applicationList",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 64,
|
||||
"menuName": "我的权益",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/appStore/myRights",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 65,
|
||||
"menuName": "短信通道",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/appStore/shortMessage",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 66,
|
||||
"menuName": "运营活动",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/appStore/operational",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 67,
|
||||
"menuName": "合同管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/appStore/saasContract",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 68,
|
||||
"menuName": "首页配置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/Miniprogram/homeSet",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 69,
|
||||
"menuName": "邻里配置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/Miniprogram/NBHConfig",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 70,
|
||||
"menuName": "服务配置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/Miniprogram/serviceConfig",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 71,
|
||||
"menuName": "小程序用户",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/operateMan/miniprogramUser",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 72,
|
||||
"menuName": "活跃运营",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/operateMan/activeStatistics",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 73,
|
||||
"menuName": "智能催收",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/operateMan/intelligentCollection",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 74,
|
||||
"menuName": "安全生产",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/operateMan/safeProduction",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 75,
|
||||
"menuName": "作业工单",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/operateMan/workOrder",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 76,
|
||||
"menuName": "项目拜访配置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/operateMan/smsVisitConfig",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 77,
|
||||
"menuName": "催收委案",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/operateMan/collectionCaseAssignment",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 78,
|
||||
"menuName": "微信客户",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/customerOperations/WeChatList",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 79,
|
||||
"menuName": "标签管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/customerOperations/tagList",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 80,
|
||||
"menuName": "通知公告",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/contentOperations/noticeAnnouncement",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 81,
|
||||
"menuName": "知识图谱应用",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/trainingPush/knowledge",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 82,
|
||||
"menuName": "品质抽样",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/trainingPush/sampling",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 83,
|
||||
"menuName": "人事设置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/systemManage/personnelSetting",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 84,
|
||||
"menuName": "角色权限管理",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/systemManage/permissions",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 85,
|
||||
"menuName": "操作日志",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/systemManage/operationLog",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 86,
|
||||
"menuName": "高级设置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/systemManage/advancedSetting",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 87,
|
||||
"menuName": "驾驶舱设置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/systemManage/cockpitConfig",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 88,
|
||||
"menuName": "指数设置",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/systemManage/indexConfig",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 89,
|
||||
"menuName": "审核记录",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/government/auditRecords",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 90,
|
||||
"menuName": "企业档案",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/government/information/enterpriseArchives",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 91,
|
||||
"menuName": "从业人员",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/government/information/practitioner",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
},
|
||||
{
|
||||
"id": 92,
|
||||
"menuName": "项目档案",
|
||||
"menuType": 3,
|
||||
"menuUrl": "/government/projectArchive",
|
||||
"disableds": "Y",
|
||||
"lastLeaf": 0,
|
||||
"menuChildren": []
|
||||
}
|
||||
]
|
||||
BIN
__mirror/runtime/hc-etms-dashboard/permissions-v1.png
Normal file
|
After Width: | Height: | Size: 170 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/permissions-v2.png
Normal file
|
After Width: | Height: | Size: 174 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/permissions-v3.png
Normal file
|
After Width: | Height: | Size: 248 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/personnelFiles-v1.png
Normal file
|
After Width: | Height: | Size: 432 KiB |
BIN
__mirror/runtime/hc-etms-dashboard/personnelFiles-v2.png
Normal file
|
After Width: | Height: | Size: 441 KiB |
682
__mirror/runtime/hc-etms-dashboard/route-map.json
Normal file
@@ -0,0 +1,682 @@
|
||||
{
|
||||
"/404": {
|
||||
"src": "/hc-etms.sqygj.cn/404/",
|
||||
"title": "体检统计报表"
|
||||
},
|
||||
"/r2cockpit/microbrain/finance": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/microbrain/finance/",
|
||||
"title": "财务看板"
|
||||
},
|
||||
"/r2cockpit/microbrain/equipment": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/microbrain/equipment/",
|
||||
"title": "设备看板"
|
||||
},
|
||||
"/r2cockpit/microbrain/parkingLot": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/microbrain/parkingLot/",
|
||||
"title": "车场看板"
|
||||
},
|
||||
"/r2cockpit/cloudData/propertyFeeReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/propertyFeeReport/",
|
||||
"title": "物业费报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/parkingLotReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/parkingLotReport/",
|
||||
"title": "车场报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/planTaskReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/planTaskReport/",
|
||||
"title": "计划工单报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/workOrderReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/workOrderReport/",
|
||||
"title": "非计划工单报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/dataReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/dataReport/",
|
||||
"title": "工单耗时统计"
|
||||
},
|
||||
"/r2cockpit/cloudData/consumeReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/consumeReport/",
|
||||
"title": "耗能报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/jobGridReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/jobGridReport/",
|
||||
"title": "作业网格台账报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/contractGuaranteeReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/contractGuaranteeReport/",
|
||||
"title": "合同保障报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/detailedContractGuaranteeReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/detailedContractGuaranteeReport/",
|
||||
"title": "合同保障明细报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/contractPlanReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/contractPlanReport/",
|
||||
"title": "合同计划执行报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/officialAccount": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/officialAccount/",
|
||||
"title": "公众号拉新报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/collectionTracking": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/collectionTracking/",
|
||||
"title": "催收跟踪报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/collectionRate": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/collectionRate/",
|
||||
"title": "企业收费项报表"
|
||||
},
|
||||
"/r2cockpit/cloudData/visitWorkReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/visitWorkReport/",
|
||||
"title": "拜访工作报表"
|
||||
},
|
||||
"/r2cockpit/assessment/monthly": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/assessment/monthly/",
|
||||
"title": "月收入考核"
|
||||
},
|
||||
"/companyMetadata/companyInfo": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/companyInfo/",
|
||||
"title": "企业信息"
|
||||
},
|
||||
"/companyMetadata/member": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/member/",
|
||||
"title": "成员"
|
||||
},
|
||||
"/companyMetadata/institution": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/institution/",
|
||||
"title": "组织架构"
|
||||
},
|
||||
"/companyMetadata/organizational": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/organizational/",
|
||||
"title": "企微通讯录"
|
||||
},
|
||||
"/companyMetadata/branchOfficeManage": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/branchOfficeManage/",
|
||||
"title": "分公司管理"
|
||||
},
|
||||
"/companyMetadata/materialStandard": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/materialStandard/",
|
||||
"title": "物料规范"
|
||||
},
|
||||
"/companyMetadata/communityDynamic": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/communityDynamic/",
|
||||
"title": "社区动力方程"
|
||||
},
|
||||
"/companyMetadata/financeStandard": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/financeStandard/",
|
||||
"title": "财务规范"
|
||||
},
|
||||
"/companyMetadata/approveMan": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/approveMan/",
|
||||
"title": "审批模板"
|
||||
},
|
||||
"/companyMetadata/merchant": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/merchant/",
|
||||
"title": "商户配置"
|
||||
},
|
||||
"/companyMetadata/qualificationMan": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/qualificationMan/",
|
||||
"title": "资质管理"
|
||||
},
|
||||
"/companyMetadata/feeItem": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/feeItem/",
|
||||
"title": "企业收费项"
|
||||
},
|
||||
"/companyMetadata/satisfactionWeight": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/satisfactionWeight/",
|
||||
"title": "满意度权重配置"
|
||||
},
|
||||
"/companyMetadata/financeData": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/financeData/",
|
||||
"title": "财务数据"
|
||||
},
|
||||
"/personnelMerits/assessment": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/assessment/",
|
||||
"title": "人才测评"
|
||||
},
|
||||
"/personnelMerits/recruitManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/recruitManage/",
|
||||
"title": "招聘管理"
|
||||
},
|
||||
"/personnelMerits/personnelFiles": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/personnelFiles/",
|
||||
"title": "人事档案"
|
||||
},
|
||||
"/personnelMerits/qualification": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/qualification/",
|
||||
"title": "资质匹配"
|
||||
},
|
||||
"/personnelMerits/trainingManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/trainingManage/",
|
||||
"title": "培训管理"
|
||||
},
|
||||
"/personnelMerits/checkWorkManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/checkWorkManage/",
|
||||
"title": "考勤管理"
|
||||
},
|
||||
"/personnelMerits/payManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/payManage/",
|
||||
"title": "薪酬管理"
|
||||
},
|
||||
"/personnelMerits/salaryPayment": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/salaryPayment/",
|
||||
"title": "工资发放"
|
||||
},
|
||||
"/personnelMerits/employeeQuitReport": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/employeeQuitReport/",
|
||||
"title": "员工离任报告"
|
||||
},
|
||||
"/personnelMerits/humanEffectManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/humanEffectManage/",
|
||||
"title": "人事绩效管理"
|
||||
},
|
||||
"/personnelMerits/laborValue": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/laborValue/",
|
||||
"title": "价值换算"
|
||||
},
|
||||
"/personnelMerits/leaveControl": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/leaveControl/",
|
||||
"title": "离职管控"
|
||||
},
|
||||
"/personnelMerits/legalDispute": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/legalDispute/",
|
||||
"title": "法务纠纷"
|
||||
},
|
||||
"/personnelMerits/injuredPersonnel": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/injuredPersonnel/",
|
||||
"title": "工伤人员"
|
||||
},
|
||||
"/supplierManage/supplierStock": {
|
||||
"src": "/hc-etms.sqygj.cn/supplierManage/supplierStock/",
|
||||
"title": "供应商库"
|
||||
},
|
||||
"/supplierManage/contractManage": {
|
||||
"src": "/hc-etms.sqygj.cn/supplierManage/contractManage/",
|
||||
"title": "合同管理"
|
||||
},
|
||||
"/supplierManage/supplierMicrobrain": {
|
||||
"src": "/hc-etms.sqygj.cn/supplierManage/supplierMicrobrain/",
|
||||
"title": "供应商微脑"
|
||||
},
|
||||
"/satisfaction/questionBank": {
|
||||
"src": "/hc-etms.sqygj.cn/satisfaction/questionBank/",
|
||||
"title": "调查题库"
|
||||
},
|
||||
"/satisfaction/questionnaire": {
|
||||
"src": "/hc-etms.sqygj.cn/satisfaction/questionnaire/",
|
||||
"title": "调查问卷"
|
||||
},
|
||||
"/satisfaction/report": {
|
||||
"src": "/hc-etms.sqygj.cn/satisfaction/report/",
|
||||
"title": "调查报告"
|
||||
},
|
||||
"/satisfaction/tracking": {
|
||||
"src": "/hc-etms.sqygj.cn/satisfaction/tracking/",
|
||||
"title": "整改跟踪"
|
||||
},
|
||||
"/appStore/applicationList": {
|
||||
"src": "/hc-etms.sqygj.cn/appStore/applicationList/",
|
||||
"title": "应用列表"
|
||||
},
|
||||
"/appStore/myRights": {
|
||||
"src": "/hc-etms.sqygj.cn/appStore/myRights/",
|
||||
"title": "我的权益"
|
||||
},
|
||||
"/appStore/shortMessage": {
|
||||
"src": "/hc-etms.sqygj.cn/appStore/shortMessage/",
|
||||
"title": "短信通道"
|
||||
},
|
||||
"/appStore/operational": {
|
||||
"src": "/hc-etms.sqygj.cn/appStore/operational/",
|
||||
"title": "运营活动"
|
||||
},
|
||||
"/appStore/saasContract": {
|
||||
"src": "/hc-etms.sqygj.cn/appStore/saasContract/",
|
||||
"title": "合同管理"
|
||||
},
|
||||
"/Miniprogram/homeSet": {
|
||||
"src": "/hc-etms.sqygj.cn/Miniprogram/homeSet/",
|
||||
"title": "首页配置"
|
||||
},
|
||||
"/Miniprogram/NBHConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/Miniprogram/NBHConfig/",
|
||||
"title": "邻里配置"
|
||||
},
|
||||
"/Miniprogram/serviceConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/Miniprogram/serviceConfig/",
|
||||
"title": "服务配置"
|
||||
},
|
||||
"/operateMan/miniprogramUser": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/miniprogramUser/",
|
||||
"title": "小程序用户"
|
||||
},
|
||||
"/operateMan/activeStatistics": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/activeStatistics/",
|
||||
"title": "活跃运营"
|
||||
},
|
||||
"/operateMan/intelligentCollection": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/intelligentCollection/",
|
||||
"title": "智能催收"
|
||||
},
|
||||
"/operateMan/safeProduction": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/safeProduction/",
|
||||
"title": "安全生产"
|
||||
},
|
||||
"/operateMan/workOrder": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/workOrder/",
|
||||
"title": "作业工单"
|
||||
},
|
||||
"/operateMan/smsVisitConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/smsVisitConfig/",
|
||||
"title": "项目拜访配置"
|
||||
},
|
||||
"/operateMan/collectionCaseAssignment": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/collectionCaseAssignment/",
|
||||
"title": "催收委案"
|
||||
},
|
||||
"/customerOperations/WeChatList": {
|
||||
"src": "/hc-etms.sqygj.cn/customerOperations/WeChatList/",
|
||||
"title": "微信客户"
|
||||
},
|
||||
"/customerOperations/tagList": {
|
||||
"src": "/hc-etms.sqygj.cn/customerOperations/tagList/",
|
||||
"title": "标签管理"
|
||||
},
|
||||
"/contentOperations/noticeAnnouncement": {
|
||||
"src": "/hc-etms.sqygj.cn/contentOperations/noticeAnnouncement/",
|
||||
"title": "通知公告"
|
||||
},
|
||||
"/trainingPush/knowledge": {
|
||||
"src": "/hc-etms.sqygj.cn/trainingPush/knowledge/",
|
||||
"title": "知识图谱应用"
|
||||
},
|
||||
"/trainingPush/sampling": {
|
||||
"src": "/hc-etms.sqygj.cn/trainingPush/sampling/",
|
||||
"title": "品质抽样"
|
||||
},
|
||||
"/systemManage/personnelSetting": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/personnelSetting/",
|
||||
"title": "人事设置"
|
||||
},
|
||||
"/systemManage/permissions": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/permissions/",
|
||||
"title": "角色权限管理"
|
||||
},
|
||||
"/systemManage/operationLog": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/operationLog/",
|
||||
"title": "操作日志"
|
||||
},
|
||||
"/systemManage/advancedSetting": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/advancedSetting/",
|
||||
"title": "高级设置"
|
||||
},
|
||||
"/systemManage/cockpitConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/cockpitConfig/",
|
||||
"title": "驾驶舱设置"
|
||||
},
|
||||
"/systemManage/indexConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/indexConfig/",
|
||||
"title": "指数设置"
|
||||
},
|
||||
"/government/auditRecords": {
|
||||
"src": "/hc-etms.sqygj.cn/government/auditRecords/",
|
||||
"title": "审核记录"
|
||||
},
|
||||
"/government/information/enterpriseArchives": {
|
||||
"src": "/hc-etms.sqygj.cn/government/information/enterpriseArchives/",
|
||||
"title": "企业档案"
|
||||
},
|
||||
"/government/information/practitioner": {
|
||||
"src": "/hc-etms.sqygj.cn/government/information/practitioner/",
|
||||
"title": "从业人员"
|
||||
},
|
||||
"/government/projectArchive": {
|
||||
"src": "/hc-etms.sqygj.cn/government/projectArchive/",
|
||||
"title": "项目档案"
|
||||
},
|
||||
"/dashboard": {
|
||||
"src": "/hc-etms.sqygj.cn/dashboard/__query_3cc8885b97/",
|
||||
"title": "首页"
|
||||
},
|
||||
"/": {
|
||||
"src": "/hc-etms.sqygj.cn/dashboard/__query_3cc8885b97/",
|
||||
"title": "首页"
|
||||
},
|
||||
"/goToProject": {
|
||||
"src": "/__mirror/runtime/hc-pos-dashboard/#/dashboard",
|
||||
"title": "点击进入【项目运营平台】"
|
||||
},
|
||||
"/finance": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/microbrain/finance/",
|
||||
"title": "财务看板"
|
||||
},
|
||||
"/equipment": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/microbrain/equipment/",
|
||||
"title": "设备看板"
|
||||
},
|
||||
"/parkingLot": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/microbrain/parkingLot/",
|
||||
"title": "车场看板"
|
||||
},
|
||||
"/propertyFeeReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/propertyFeeReport/",
|
||||
"title": "物业费报表"
|
||||
},
|
||||
"/parkingLotReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/parkingLotReport/",
|
||||
"title": "车场报表"
|
||||
},
|
||||
"/planTaskReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/planTaskReport/",
|
||||
"title": "计划工单报表"
|
||||
},
|
||||
"/workOrderReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/workOrderReport/",
|
||||
"title": "非计划工单报表"
|
||||
},
|
||||
"/dataReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/dataReport/",
|
||||
"title": "工单耗时统计"
|
||||
},
|
||||
"/consumeReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/consumeReport/",
|
||||
"title": "耗能报表"
|
||||
},
|
||||
"/jobGridReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/jobGridReport/",
|
||||
"title": "作业网格台账报表"
|
||||
},
|
||||
"/contractGuaranteeReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/contractGuaranteeReport/",
|
||||
"title": "合同保障报表"
|
||||
},
|
||||
"/detailedContractGuaranteeReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/detailedContractGuaranteeReport/",
|
||||
"title": "合同保障明细报表"
|
||||
},
|
||||
"/contractPlanReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/contractPlanReport/",
|
||||
"title": "合同计划执行报表"
|
||||
},
|
||||
"/officialAccount": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/officialAccount/",
|
||||
"title": "公众号拉新报表"
|
||||
},
|
||||
"/collectionTracking": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/collectionTracking/",
|
||||
"title": "催收跟踪报表"
|
||||
},
|
||||
"/collectionRate": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/collectionRate/",
|
||||
"title": "企业收费项报表"
|
||||
},
|
||||
"/visitWorkReport": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/cloudData/visitWorkReport/",
|
||||
"title": "拜访工作报表"
|
||||
},
|
||||
"/monthly": {
|
||||
"src": "/hc-etms.sqygj.cn/r2cockpit/assessment/monthly/",
|
||||
"title": "月收入考核"
|
||||
},
|
||||
"/companyInfo": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/companyInfo/",
|
||||
"title": "企业信息"
|
||||
},
|
||||
"/member": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/member/",
|
||||
"title": "成员"
|
||||
},
|
||||
"/institution": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/institution/",
|
||||
"title": "组织架构"
|
||||
},
|
||||
"/organizational": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/organizational/",
|
||||
"title": "企微通讯录"
|
||||
},
|
||||
"/branchOfficeManage": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/branchOfficeManage/",
|
||||
"title": "分公司管理"
|
||||
},
|
||||
"/materialStandard": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/materialStandard/",
|
||||
"title": "物料规范"
|
||||
},
|
||||
"/communityDynamic": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/communityDynamic/",
|
||||
"title": "社区动力方程"
|
||||
},
|
||||
"/financeStandard": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/financeStandard/",
|
||||
"title": "财务规范"
|
||||
},
|
||||
"/approveMan": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/approveMan/",
|
||||
"title": "审批模板"
|
||||
},
|
||||
"/merchant": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/merchant/",
|
||||
"title": "商户配置"
|
||||
},
|
||||
"/qualificationMan": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/qualificationMan/",
|
||||
"title": "资质管理"
|
||||
},
|
||||
"/feeItem": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/feeItem/",
|
||||
"title": "企业收费项"
|
||||
},
|
||||
"/satisfactionWeight": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/satisfactionWeight/",
|
||||
"title": "满意度权重配置"
|
||||
},
|
||||
"/financeData": {
|
||||
"src": "/hc-etms.sqygj.cn/companyMetadata/financeData/",
|
||||
"title": "财务数据"
|
||||
},
|
||||
"/assessment": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/assessment/",
|
||||
"title": "人才测评"
|
||||
},
|
||||
"/recruitManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/recruitManage/",
|
||||
"title": "招聘管理"
|
||||
},
|
||||
"/personnelFiles": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/personnelFiles/",
|
||||
"title": "人事档案"
|
||||
},
|
||||
"/qualification": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/qualification/",
|
||||
"title": "资质匹配"
|
||||
},
|
||||
"/trainingManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/trainingManage/",
|
||||
"title": "培训管理"
|
||||
},
|
||||
"/checkWorkManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/checkWorkManage/",
|
||||
"title": "考勤管理"
|
||||
},
|
||||
"/payManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/payManage/",
|
||||
"title": "薪酬管理"
|
||||
},
|
||||
"/salaryPayment": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/salaryPayment/",
|
||||
"title": "工资发放"
|
||||
},
|
||||
"/employeeQuitReport": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/employeeQuitReport/",
|
||||
"title": "员工离任报告"
|
||||
},
|
||||
"/humanEffectManage": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/humanEffectManage/",
|
||||
"title": "人事绩效管理"
|
||||
},
|
||||
"/laborValue": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/laborValue/",
|
||||
"title": "价值换算"
|
||||
},
|
||||
"/leaveControl": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/leaveControl/",
|
||||
"title": "离职管控"
|
||||
},
|
||||
"/legalDispute": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/legalDispute/",
|
||||
"title": "法务纠纷"
|
||||
},
|
||||
"/injuredPersonnel": {
|
||||
"src": "/hc-etms.sqygj.cn/personnelMerits/injuredPersonnel/",
|
||||
"title": "工伤人员"
|
||||
},
|
||||
"/supplierStock": {
|
||||
"src": "/hc-etms.sqygj.cn/supplierManage/supplierStock/",
|
||||
"title": "供应商库"
|
||||
},
|
||||
"/contractManage": {
|
||||
"src": "/hc-etms.sqygj.cn/supplierManage/contractManage/",
|
||||
"title": "合同管理"
|
||||
},
|
||||
"/supplierMicrobrain": {
|
||||
"src": "/hc-etms.sqygj.cn/supplierManage/supplierMicrobrain/",
|
||||
"title": "供应商微脑"
|
||||
},
|
||||
"/questionBank": {
|
||||
"src": "/hc-etms.sqygj.cn/satisfaction/questionBank/",
|
||||
"title": "调查题库"
|
||||
},
|
||||
"/questionnaire": {
|
||||
"src": "/hc-etms.sqygj.cn/satisfaction/questionnaire/",
|
||||
"title": "调查问卷"
|
||||
},
|
||||
"/report": {
|
||||
"src": "/hc-etms.sqygj.cn/satisfaction/report/",
|
||||
"title": "调查报告"
|
||||
},
|
||||
"/tracking": {
|
||||
"src": "/hc-etms.sqygj.cn/satisfaction/tracking/",
|
||||
"title": "整改跟踪"
|
||||
},
|
||||
"/applicationList": {
|
||||
"src": "/hc-etms.sqygj.cn/appStore/applicationList/",
|
||||
"title": "应用列表"
|
||||
},
|
||||
"/myRights": {
|
||||
"src": "/hc-etms.sqygj.cn/appStore/myRights/",
|
||||
"title": "我的权益"
|
||||
},
|
||||
"/shortMessage": {
|
||||
"src": "/hc-etms.sqygj.cn/appStore/shortMessage/",
|
||||
"title": "短信通道"
|
||||
},
|
||||
"/operational": {
|
||||
"src": "/hc-etms.sqygj.cn/appStore/operational/",
|
||||
"title": "运营活动"
|
||||
},
|
||||
"/saasContract": {
|
||||
"src": "/hc-etms.sqygj.cn/supplierManage/contractManage/",
|
||||
"title": "合同管理"
|
||||
},
|
||||
"/homeSet": {
|
||||
"src": "/hc-etms.sqygj.cn/Miniprogram/homeSet/",
|
||||
"title": "首页配置"
|
||||
},
|
||||
"/NBHConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/Miniprogram/NBHConfig/",
|
||||
"title": "邻里配置"
|
||||
},
|
||||
"/serviceConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/Miniprogram/serviceConfig/",
|
||||
"title": "服务配置"
|
||||
},
|
||||
"/miniprogramUser": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/miniprogramUser/",
|
||||
"title": "小程序用户"
|
||||
},
|
||||
"/activeStatistics": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/activeStatistics/",
|
||||
"title": "活跃运营"
|
||||
},
|
||||
"/intelligentCollection": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/intelligentCollection/",
|
||||
"title": "智能催收"
|
||||
},
|
||||
"/safeProduction": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/safeProduction/",
|
||||
"title": "安全生产"
|
||||
},
|
||||
"/workOrder": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/workOrder/",
|
||||
"title": "作业工单"
|
||||
},
|
||||
"/smsVisitConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/smsVisitConfig/",
|
||||
"title": "项目拜访配置"
|
||||
},
|
||||
"/collectionCaseAssignment": {
|
||||
"src": "/hc-etms.sqygj.cn/operateMan/collectionCaseAssignment/",
|
||||
"title": "催收委案"
|
||||
},
|
||||
"/WeChatList": {
|
||||
"src": "/hc-etms.sqygj.cn/customerOperations/WeChatList/",
|
||||
"title": "微信客户"
|
||||
},
|
||||
"/tagList": {
|
||||
"src": "/hc-etms.sqygj.cn/customerOperations/tagList/",
|
||||
"title": "标签管理"
|
||||
},
|
||||
"/noticeAnnouncement": {
|
||||
"src": "/hc-etms.sqygj.cn/contentOperations/noticeAnnouncement/",
|
||||
"title": "通知公告"
|
||||
},
|
||||
"/knowledge": {
|
||||
"src": "/hc-etms.sqygj.cn/trainingPush/knowledge/",
|
||||
"title": "知识图谱应用"
|
||||
},
|
||||
"/sampling": {
|
||||
"src": "/hc-etms.sqygj.cn/trainingPush/sampling/",
|
||||
"title": "品质抽样"
|
||||
},
|
||||
"/personnelSetting": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/personnelSetting/",
|
||||
"title": "人事设置"
|
||||
},
|
||||
"/permissions": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/permissions/",
|
||||
"title": "角色权限管理"
|
||||
},
|
||||
"/operationLog": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/operationLog/",
|
||||
"title": "操作日志"
|
||||
},
|
||||
"/advancedSetting": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/advancedSetting/",
|
||||
"title": "高级设置"
|
||||
},
|
||||
"/cockpitConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/cockpitConfig/",
|
||||
"title": "驾驶舱设置"
|
||||
},
|
||||
"/indexConfig": {
|
||||
"src": "/hc-etms.sqygj.cn/systemManage/indexConfig/",
|
||||
"title": "指数设置"
|
||||
},
|
||||
"/auditRecords": {
|
||||
"src": "/hc-etms.sqygj.cn/government/auditRecords/",
|
||||
"title": "审核记录"
|
||||
},
|
||||
"/enterpriseArchives": {
|
||||
"src": "/hc-etms.sqygj.cn/government/information/enterpriseArchives/",
|
||||
"title": "企业档案"
|
||||
},
|
||||
"/practitioner": {
|
||||
"src": "/hc-etms.sqygj.cn/government/information/practitioner/",
|
||||
"title": "从业人员"
|
||||
},
|
||||
"/projectArchive": {
|
||||
"src": "/hc-etms.sqygj.cn/government/projectArchive/",
|
||||
"title": "项目档案"
|
||||
}
|
||||
}
|
||||
3213
__mirror/runtime/hc-etms-dashboard/runtime-bootstrap.js
Normal file
5
__mirror/runtime/hc-etms-dashboard/session-seed.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"language": "zh",
|
||||
"Account": "13686801296",
|
||||
"CToken": "mock-ctoken-hc-etms"
|
||||
}
|
||||
9
__mirror/runtime/hc-etms-dashboard/storage-seed.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"boardInfo": "{\"login\":1,\"org\":1,\"company\":1,\"activation\":1,\"cockpit\":1,\"projectCount\":94,\"houseCount\":4686,\"floorageCount\":2888556.18}",
|
||||
"companyInfo": "{\"id\":74,\"corpUuid\":\"bfe41d86-d2ad-40a8-b2e4-539a7344314c\",\"fullName\":\"深圳市美好循环科技有限公司\",\"abbreviation\":\"循环科技企业管理后台\",\"contactPeople\":\"社区云\",\"jobName\":\"经理\",\"phoneNumber\":\"13686801296\",\"createDate\":null,\"createBy\":1894,\"updateDate\":\"2026-03-19 16:40:08\",\"updateBy\":12455,\"updateName\":\"万雅颂\",\"status\":1,\"updateSource\":2,\"openAnAccountPerson\":null,\"openAnAccountBank\":null,\"bankAccount\":null,\"osId\":421,\"osUuid\":\"92115dc9-09a2-42da-b9bb-60352c900a53\",\"level\":1,\"logo\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/company/2053_1634872802864.jpg\",\"creditCode\":\"123456789\",\"corporationIdCard\":\"\",\"businessLicence\":null,\"referrer\":\"\",\"legalPerson\":\"社区云 \",\"mobile\":\"13712345678\",\"weixinCorpId\":\"wpr5LtCwAA-l9KHwrl7vReK55ExYqKGg\",\"weixinCorpName\":null,\"weixinSecret\":\"DiXokh95U5Rx_tT-G1fcqyBcn4PtvWaAMGJiONYK_8M\",\"miniCode\":\"https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/company/20220305_1646480923898.jpg\",\"sealImages\":null,\"hrQrcode\":null,\"hrUrl\":null,\"useCockpit\":1,\"postalCode\":12,\"payer\":\"丁思雨\",\"payerMobile\":\"19912341233\",\"publicBank\":\"测试\",\"publicBankNo\":\"125544411111\",\"address\":\"2222222222222222222222222222222222222222222\",\"wxAppid\":null,\"invoiceStatus\":1,\"invoiceKey\":\"456\",\"invoiceSecret\":\"123\",\"discountScope\":\"POINT\",\"pointCopartnerIds\":\"27,34,99\",\"pointCopartnerNames\":null}",
|
||||
"fromPhone": "13686801296",
|
||||
"memberId": "12547",
|
||||
"memberInfor": "{\"id\":12547,\"uuid\":\"f1aee78c-8f95-4985-a67d-3e163db856c2\",\"codeNumber\":\"q7fsx5d0\",\"name\":\"郭晓\",\"phoneNumber\":\"15972712560\",\"accountUuid\":\"f212ba36-2910-4b8d-87e7-57a2bf5f6534\",\"postUuid\":152,\"postName\":\"环境管家-外围\",\"hrPostName\":null,\"sex\":1,\"province\":\"\",\"city\":\"\",\"area\":\"\",\"detailAddress\":\"\",\"idNumber\":\"430121200412272816\",\"birthday\":\"2004-12-27\",\"createDate\":\"2026-03-27 15:40:45\",\"createBy\":null,\"updateDate\":\"2026-03-27 15:40:45\",\"updateBy\":null,\"isStop\":1,\"companyId\":421,\"englishName\":\"\",\"country\":\"\",\"nation\":\"\",\"nativePlace\":\"\",\"maritalStatus\":null,\"height\":\"\",\"weight\":\"\",\"constellation\":null,\"zodiacSign\":null,\"healthCondition\":\"\",\"politicCountenance\":null,\"email\":\"\",\"expertise\":\"\",\"hobby\":\"\",\"urgentPerson\":\"\",\"urgentPhone\":\"\",\"archivesSource\":3,\"blacklist\":0,\"osId\":598,\"osName\":\"博万物\",\"certificateType\":1,\"certificateAddress\":null,\"education\":5,\"school\":null,\"major\":null,\"remark\":null,\"creatorName\":null,\"updaterName\":null,\"fileUrl\":null,\"accountNumber\":null,\"bankName\":null,\"branch\":null,\"source\":null,\"accountName\":null,\"appId\":null,\"operatorId\":null,\"operatorUuid\":null,\"operatorName\":null,\"operatingTime\":null}",
|
||||
"roleId": "97",
|
||||
"userInfo": "{\"id\":1893,\"uuid\":\"f4183b10-db0a-41fa-bb54-5a35659c0ee2\",\"accountName\":\"13686801296\",\"accountPassword\":\"d2fe469654fe4722a3c185edded3d75d\",\"passwordUpdateTime\":null,\"openid\":null,\"token\":null,\"retoken\":null,\"isDelete\":0,\"createDate\":null,\"createBy\":null,\"updateDate\":null,\"updateBy\":null}"
|
||||
}
|
||||
236
__mirror/runtime/hc-etms-dashboard/sw.js
Normal file
@@ -0,0 +1,236 @@
|
||||
const MENU_FILE = "./menu-seed.json";
|
||||
const STORAGE_FILE = "./storage-seed.json";
|
||||
|
||||
let menuPromise = null;
|
||||
let storagePromise = null;
|
||||
|
||||
self.addEventListener("install", (event) => {
|
||||
self.skipWaiting();
|
||||
event.waitUntil(Promise.all([loadMenu(), loadStorage()]));
|
||||
});
|
||||
|
||||
self.addEventListener("activate", (event) => {
|
||||
event.waitUntil(self.clients.claim());
|
||||
});
|
||||
|
||||
self.addEventListener("fetch", (event) => {
|
||||
const url = new URL(event.request.url);
|
||||
if (!(url.pathname.startsWith("/hakocompany/") || url.pathname.startsWith("/company/") || url.hostname.includes("app-company-be.sqygj.cn"))) {
|
||||
return;
|
||||
}
|
||||
event.respondWith(handleApiRequest(event.request));
|
||||
});
|
||||
|
||||
async function loadMenu() {
|
||||
if (menuPromise) {
|
||||
return menuPromise;
|
||||
}
|
||||
menuPromise = fetch(MENU_FILE, { cache: "no-store" })
|
||||
.then((response) => (response.ok ? response.json() : []))
|
||||
.catch(() => []);
|
||||
return menuPromise;
|
||||
}
|
||||
|
||||
async function loadStorage() {
|
||||
if (storagePromise) {
|
||||
return storagePromise;
|
||||
}
|
||||
storagePromise = fetch(STORAGE_FILE, { cache: "no-store" })
|
||||
.then((response) => (response.ok ? response.json() : {}))
|
||||
.catch(() => ({}));
|
||||
return storagePromise;
|
||||
}
|
||||
|
||||
function ok(data) {
|
||||
return {
|
||||
data,
|
||||
code: 0,
|
||||
message: "mock success.",
|
||||
ok: true
|
||||
};
|
||||
}
|
||||
|
||||
function paged(records = []) {
|
||||
return ok({
|
||||
rowsCount: records.length,
|
||||
pageNumber: 1,
|
||||
pageSize: 10,
|
||||
pageCount: records.length ? 1 : 0,
|
||||
records
|
||||
});
|
||||
}
|
||||
|
||||
function parseJsonMaybe(value, fallback = {}) {
|
||||
try {
|
||||
return JSON.parse(value || "{}");
|
||||
} catch (_error) {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
async function handleApiRequest(request) {
|
||||
if (request.method === "OPTIONS") {
|
||||
return new Response("", {
|
||||
status: 200,
|
||||
headers: corsHeaders("text/plain;charset=utf-8")
|
||||
});
|
||||
}
|
||||
|
||||
const storage = await loadStorage();
|
||||
const menu = await loadMenu();
|
||||
const companyInfo = parseJsonMaybe(storage.companyInfo);
|
||||
const userInfo = parseJsonMaybe(storage.userInfo);
|
||||
const boardInfo = parseJsonMaybe(storage.boardInfo);
|
||||
const memberInfo = parseJsonMaybe(storage.memberInfor);
|
||||
|
||||
const url = new URL(request.url);
|
||||
const path = url.pathname;
|
||||
|
||||
if (path.includes("/hakocompany/account/")) {
|
||||
return json(ok({
|
||||
companyAuthApplyOrderRespDTOS: [companyInfo],
|
||||
menuSelectAllResponseDTOS: menu,
|
||||
companyAuthApplyOrderRespDTO: companyInfo
|
||||
}));
|
||||
}
|
||||
|
||||
if (path.includes("/company/member/findById")) {
|
||||
return json(ok(memberInfo));
|
||||
}
|
||||
|
||||
if (path.includes("/company/organizationalStructure/statusBoard")) {
|
||||
return json(ok({
|
||||
login: boardInfo.login || 1,
|
||||
org: boardInfo.org || 1,
|
||||
company: boardInfo.company || 1,
|
||||
activation: boardInfo.activation || 1,
|
||||
cockpit: boardInfo.cockpit || 1,
|
||||
projectCount: boardInfo.projectCount || 94,
|
||||
houseCount: boardInfo.houseCount || 4686,
|
||||
floorageCount: boardInfo.floorageCount || 2888556.18
|
||||
}));
|
||||
}
|
||||
|
||||
if (path.includes("/company/organizationalStructure/dueNum")) {
|
||||
return json(ok({
|
||||
projectGoodsDueNum: 3,
|
||||
smsSurplusNum: 11042,
|
||||
contractDueNum: 1,
|
||||
memberCertificateDueNum: 0
|
||||
}));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/RightsProject/expireSchemeDetail")) {
|
||||
return json(ok({
|
||||
projectGoodsDueNum: 3,
|
||||
smsSurplusNum: 11042,
|
||||
contractDueNum: 1,
|
||||
memberCertificateDueNum: 0
|
||||
}));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/PlatformMessage/noticePageList")) {
|
||||
return json(paged([
|
||||
{ id: 1, title: "企业平台通知", createTime: "2026-04-01 22:00:00", content: "这是企业服务平台的本地 mock 通知。" }
|
||||
]));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/PlatformMessage/checkMessage")) {
|
||||
return json(ok(false));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/AgentConfig/getAgentUrl")) {
|
||||
return json(ok("https://example.com/mock-etms-agent"));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/SatisfactionEvaluate/checkEvaluateTime")) {
|
||||
return json(ok(false));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/OperationalGuidance/pageList")) {
|
||||
return json(paged([
|
||||
{ id: 1, title: "合同管理", tag: "操作指引" },
|
||||
{ id: 2, title: "事务报表", tag: "操作指引" },
|
||||
{ id: 3, title: "财务—常规配置", tag: "操作指引" }
|
||||
]));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/TrainingInfo/pageList")) {
|
||||
return json(paged([]));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/Company/") || path.includes("/company/Company/")) {
|
||||
return json(ok(companyInfo));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/FsSubject/")) {
|
||||
return json(ok([]));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/OrderContract/pageList")) {
|
||||
return json(paged([]));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/WeightConfig") || path.includes("/hakocompany/Satisfaction")) {
|
||||
return json(paged([]));
|
||||
}
|
||||
|
||||
if (path.includes("/hakocompany/Board") || path.includes("/hakocompany/Cockpit")) {
|
||||
return json(ok(boardInfo));
|
||||
}
|
||||
|
||||
if (path.includes("/pageList")) {
|
||||
return json(paged([]));
|
||||
}
|
||||
|
||||
if (path.includes("/listBy") || path.includes("/selectAll") || path.endsWith("/list")) {
|
||||
return json(ok([]));
|
||||
}
|
||||
|
||||
if (
|
||||
path.includes("/create") ||
|
||||
path.includes("/update") ||
|
||||
path.includes("/delete") ||
|
||||
path.includes("/save") ||
|
||||
path.includes("/edit") ||
|
||||
path.includes("/sync") ||
|
||||
path.includes("/batch")
|
||||
) {
|
||||
return json(ok(true));
|
||||
}
|
||||
|
||||
if (path.includes("/findBy") || path.includes("/detail")) {
|
||||
return json(ok({
|
||||
companyInfo,
|
||||
userInfo,
|
||||
memberInfo,
|
||||
boardInfo
|
||||
}));
|
||||
}
|
||||
|
||||
if (path.includes("/report") || path.includes("/statistics") || path.includes("/count") || path.includes("/total")) {
|
||||
return json(ok({
|
||||
projectCount: boardInfo.projectCount || 0,
|
||||
houseCount: boardInfo.houseCount || 0,
|
||||
floorageCount: boardInfo.floorageCount || 0
|
||||
}));
|
||||
}
|
||||
|
||||
return json(ok({}));
|
||||
}
|
||||
|
||||
function json(payload) {
|
||||
return new Response(JSON.stringify(payload), {
|
||||
status: 200,
|
||||
headers: corsHeaders("application/json;charset=utf-8")
|
||||
});
|
||||
}
|
||||
|
||||
function corsHeaders(contentType) {
|
||||
return {
|
||||
"Content-Type": contentType,
|
||||
"Access-Control-Allow-Origin": "*",
|
||||
"Access-Control-Allow-Methods": "GET,POST,PUT,PATCH,DELETE,OPTIONS",
|
||||
"Access-Control-Allow-Headers": "*"
|
||||
};
|
||||
}
|
||||
BIN
__mirror/runtime/hc-etms-dashboard/topbar-hcetms-latest.png
Normal file
|
After Width: | Height: | Size: 248 KiB |
1
__mirror/runtime/hc-etms-dashboard/webpack-runtime.js
Normal file
4
__mirror/runtime/hc-pos-dashboard/cookie-seed.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"language": "zh",
|
||||
"PToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjQ0IiwiaWF0IjoxNzc1MDQ4NjM4LCJleHAiOjE3NzU2NTM0Mzh9.VPrOYhyqsNwSi7kU34lB4_SWG74PXaFIt4Wk_0hqTMU"
|
||||
}
|
||||
BIN
__mirror/runtime/hc-pos-dashboard/current-fallback.png
Normal file
|
After Width: | Height: | Size: 316 KiB |
44
__mirror/runtime/hc-pos-dashboard/index.html
Normal file
@@ -0,0 +1,44 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>项目运营平台 - 运行态镜像</title>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", sans-serif;
|
||||
background: #0b1220;
|
||||
color: #eef4ff;
|
||||
}
|
||||
|
||||
#mirror-loading {
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
#mirror-loading small {
|
||||
color: #98a7c2;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mirror-loading">
|
||||
<div>正在启动项目运营平台运行态镜像…</div>
|
||||
<small>会预置本地存储并接管接口请求</small>
|
||||
</div>
|
||||
<div id="app"></div>
|
||||
<script>
|
||||
(function () {
|
||||
var script = document.createElement("script");
|
||||
script.src = "./runtime-bootstrap.js" + (location.search || "");
|
||||
document.body.appendChild(script);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
__mirror/runtime/hc-pos-dashboard/party-v2.png
Normal file
|
After Width: | Height: | Size: 186 KiB |
BIN
__mirror/runtime/hc-pos-dashboard/party-v3.png
Normal file
|
After Width: | Height: | Size: 183 KiB |
1038
__mirror/runtime/hc-pos-dashboard/route-map.json
Normal file
6922
__mirror/runtime/hc-pos-dashboard/runtime-bootstrap.js
Normal file
5
__mirror/runtime/hc-pos-dashboard/storage-seed.json
Normal file
308
__mirror/runtime/hc-pos-dashboard/sw.js
Normal file
@@ -0,0 +1,308 @@
|
||||
const CAPTURE_FILES = [
|
||||
"/__mirror/captures/hc-pos-dashboard-apis.json",
|
||||
"/__mirror/captures/hc-pos-basicsInfo-apis.json"
|
||||
];
|
||||
|
||||
let fixturesPromise = null;
|
||||
let storageSeedPromise = null;
|
||||
|
||||
self.addEventListener("install", (event) => {
|
||||
self.skipWaiting();
|
||||
event.waitUntil(loadFixtures());
|
||||
});
|
||||
|
||||
self.addEventListener("activate", (event) => {
|
||||
event.waitUntil(self.clients.claim());
|
||||
});
|
||||
|
||||
self.addEventListener("fetch", (event) => {
|
||||
const requestUrl = new URL(event.request.url);
|
||||
if (!requestUrl.hostname.includes("app-project-be.sqygj.cn")) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.respondWith(handleApiRequest(event.request));
|
||||
});
|
||||
|
||||
async function loadFixtures() {
|
||||
if (fixturesPromise) {
|
||||
return fixturesPromise;
|
||||
}
|
||||
|
||||
fixturesPromise = (async () => {
|
||||
const fixtureMap = new Map();
|
||||
for (const file of CAPTURE_FILES) {
|
||||
const response = await fetch(file, { cache: "no-store" });
|
||||
if (!response.ok) {
|
||||
continue;
|
||||
}
|
||||
const items = await response.json();
|
||||
items
|
||||
.filter((item) => item.resource_type === "XHR")
|
||||
.forEach((item) => {
|
||||
fixtureMap.set(item.url, item);
|
||||
});
|
||||
}
|
||||
return fixtureMap;
|
||||
})();
|
||||
|
||||
return fixturesPromise;
|
||||
}
|
||||
|
||||
async function loadStorageSeed() {
|
||||
if (storageSeedPromise) {
|
||||
return storageSeedPromise;
|
||||
}
|
||||
|
||||
storageSeedPromise = (async () => {
|
||||
const response = await fetch("./storage-seed.json", { cache: "no-store" });
|
||||
if (!response.ok) {
|
||||
return {};
|
||||
}
|
||||
return response.json();
|
||||
})();
|
||||
|
||||
return storageSeedPromise;
|
||||
}
|
||||
|
||||
async function handleApiRequest(request) {
|
||||
const fixtures = await loadFixtures();
|
||||
|
||||
if (request.method === "OPTIONS") {
|
||||
return new Response("", {
|
||||
status: 200,
|
||||
headers: corsHeaders("text/plain;charset=utf-8")
|
||||
});
|
||||
}
|
||||
|
||||
const fixture = fixtures.get(request.url);
|
||||
if (fixture) {
|
||||
return new Response(fixture.body || "", {
|
||||
status: fixture.status || 200,
|
||||
headers: corsHeaders(fixture.mime_type || "application/json;charset=utf-8")
|
||||
});
|
||||
}
|
||||
|
||||
const mockResponse = await buildMockResponse(request);
|
||||
return new Response(JSON.stringify(mockResponse), {
|
||||
status: 200,
|
||||
headers: corsHeaders("application/json;charset=utf-8")
|
||||
});
|
||||
}
|
||||
|
||||
function corsHeaders(contentType) {
|
||||
return {
|
||||
"Content-Type": contentType,
|
||||
"Access-Control-Allow-Origin": "*",
|
||||
"Access-Control-Allow-Methods": "GET,POST,PUT,PATCH,DELETE,OPTIONS",
|
||||
"Access-Control-Allow-Headers": "*"
|
||||
};
|
||||
}
|
||||
|
||||
function ok(data) {
|
||||
return {
|
||||
data,
|
||||
code: 0,
|
||||
message: "mock success.",
|
||||
ok: true
|
||||
};
|
||||
}
|
||||
|
||||
function paged(records = []) {
|
||||
return ok({
|
||||
rowsCount: records.length,
|
||||
pageNumber: 1,
|
||||
pageSize: 10,
|
||||
pageCount: records.length ? 1 : 0,
|
||||
records
|
||||
});
|
||||
}
|
||||
|
||||
function basicStats() {
|
||||
return ok({
|
||||
total: 0,
|
||||
num: 0,
|
||||
count: 0,
|
||||
value: 0,
|
||||
amount: 0,
|
||||
ratio: 0,
|
||||
rate: 0
|
||||
});
|
||||
}
|
||||
|
||||
async function buildMockResponse(request) {
|
||||
const url = new URL(request.url);
|
||||
const path = url.pathname;
|
||||
const seed = await loadStorageSeed();
|
||||
const targetInfo = parseTargetInfo(seed);
|
||||
const currentProject = parseCurrentProject(seed);
|
||||
|
||||
if (path.endsWith("/appproject/account/findProjectByRoleId")) {
|
||||
return ok(targetInfo.projectList || []);
|
||||
}
|
||||
|
||||
if (path.endsWith("/appproject/account/findByAccount")) {
|
||||
return ok(targetInfo.accountProfile || {});
|
||||
}
|
||||
|
||||
if (path.endsWith("/appproject/project/findByCode")) {
|
||||
return ok(mockProjectDetail(currentProject));
|
||||
}
|
||||
|
||||
if (path.endsWith("/appproject/account/findByCompanyId")) {
|
||||
return ok((targetInfo.projectList || []).filter((item) => item.companyId === currentProject.companyId));
|
||||
}
|
||||
|
||||
if (path.endsWith("/appproject/data/project/serviceCount")) {
|
||||
return ok({
|
||||
countryCount: null,
|
||||
provinceCount: 1,
|
||||
cityCount: 1,
|
||||
areaCount: 1,
|
||||
streetCount: 1,
|
||||
companyCount: 1,
|
||||
projectCount: 1,
|
||||
manageArea: 13848,
|
||||
contractArea: 41980.48,
|
||||
serviceArea: 78000,
|
||||
payArea: 3440.51,
|
||||
totalHouse: 38,
|
||||
totalHouseMember: 65,
|
||||
totalUser: 120,
|
||||
ownerUser: 25,
|
||||
status0Count: 0,
|
||||
status1Count: 0,
|
||||
status2Count: 0,
|
||||
status3Count: 1,
|
||||
status4Count: 10,
|
||||
status5Count: 0
|
||||
});
|
||||
}
|
||||
|
||||
if (path.endsWith("/appproject/PlatformMessage/noticePageList")) {
|
||||
return paged([
|
||||
{
|
||||
id: 1,
|
||||
title: "本地镜像通知",
|
||||
content: "这是本地 mock 数据,用于运行态镜像演示。",
|
||||
createTime: "2026-04-01 22:00:00"
|
||||
}
|
||||
]);
|
||||
}
|
||||
|
||||
if (path.endsWith("/appproject/OperationalGuidance/pageList")) {
|
||||
return paged([
|
||||
{ id: 1, title: "系统配置(项目平台)合集", tag: "项目平台" },
|
||||
{ id: 2, title: "满意度(公告+问卷+周检)", tag: "满意度" },
|
||||
{ id: 3, title: "工程管理—计划工单", tag: "工单" }
|
||||
]);
|
||||
}
|
||||
|
||||
if (path.endsWith("/appproject/AgentConfig/getAgentUrl")) {
|
||||
return ok("https://example.com/mock-agent");
|
||||
}
|
||||
|
||||
if (path.endsWith("/appproject/WorkOrder/findByProjectUuidAndAccountUuid")) {
|
||||
return ok([
|
||||
{ id: 1, status: 1, title: "巡检工单", createTime: "2026-04-01 10:00:00" },
|
||||
{ id: 2, status: 2, title: "报修工单", createTime: "2026-04-01 11:30:00" }
|
||||
]);
|
||||
}
|
||||
|
||||
if (/\/check[A-Z]/.test(path) || /\/check[a-zA-Z]/.test(path) || path.includes("/checkTips")) {
|
||||
return ok(false);
|
||||
}
|
||||
|
||||
if (path.includes("/pageList")) {
|
||||
return paged([]);
|
||||
}
|
||||
|
||||
if (path.includes("/treeList") || path.includes("/getList") || path.endsWith("/list")) {
|
||||
return ok([]);
|
||||
}
|
||||
|
||||
if (
|
||||
path.includes("/create") ||
|
||||
path.includes("/update") ||
|
||||
path.includes("/delete") ||
|
||||
path.includes("/save") ||
|
||||
path.includes("/edit") ||
|
||||
path.includes("/bind") ||
|
||||
path.includes("/sync")
|
||||
) {
|
||||
return ok(true);
|
||||
}
|
||||
|
||||
if (
|
||||
path.includes("/total") ||
|
||||
path.includes("/statistics") ||
|
||||
path.includes("/report") ||
|
||||
path.includes("/chart") ||
|
||||
path.includes("/count")
|
||||
) {
|
||||
return basicStats();
|
||||
}
|
||||
|
||||
if (path.includes("/findById") || path.includes("/detail") || path.includes("/findBy")) {
|
||||
return ok({});
|
||||
}
|
||||
|
||||
return ok({});
|
||||
}
|
||||
|
||||
function parseTargetInfo(seed) {
|
||||
try {
|
||||
const raw = JSON.parse(seed.C_userInfo || "{}");
|
||||
const targetInfo = JSON.parse(raw.targetInfo || "{}");
|
||||
return {
|
||||
accountProfile: targetInfo,
|
||||
projectList: targetInfo.projectList || [],
|
||||
menuTree: targetInfo.menuSelectAllResponseByProject || []
|
||||
};
|
||||
} catch (_error) {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
function parseCurrentProject(seed) {
|
||||
try {
|
||||
return JSON.parse(seed.store || "{}");
|
||||
} catch (_error) {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
function mockProjectDetail(project) {
|
||||
return {
|
||||
id: project.id || 426,
|
||||
code: project.community_uuid || "mock-project-code",
|
||||
name: project.community_name || "循环花园一期",
|
||||
nickname: "箭楼下社区",
|
||||
developer: "腾龙开发商",
|
||||
floorage: 41980.48,
|
||||
greeningArea: 78000,
|
||||
manageArea: 13848,
|
||||
payArea: 3440.51,
|
||||
houseCount: 38,
|
||||
houseMemberCount: 65,
|
||||
province: "湖北省",
|
||||
city: "黄石市",
|
||||
area: "下陆区",
|
||||
street: "团城山街道",
|
||||
longitude: "119.919847",
|
||||
latitude: "31.016537",
|
||||
architectureType: "高层",
|
||||
deliverDate: "2010-07-01",
|
||||
architectureDate: "2008-07-01",
|
||||
layout: "一室一厅",
|
||||
address: "下陆区团城山街道龙湾一品小区",
|
||||
image: "https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20220320/1647777882795_f65e03a8.jpg",
|
||||
signature: "https://sqy-oss-test.oss-cn-guangzhou.aliyuncs.com/20230414/1681480367954_5c56e2c5.png",
|
||||
companyId: project.companyId || 421,
|
||||
companyUuid: project.companyUuid || "92115dc9-09a2-42da-b9bb-60352c900a53",
|
||||
codeNumber: project.codeNumber || "X39839",
|
||||
star: project.star || 5,
|
||||
payMethod: 2,
|
||||
manageType: 7
|
||||
};
|
||||
}
|
||||
BIN
__mirror/runtime/hc-pos-dashboard/topbar-hcpos-latest.png
Normal file
|
After Width: | Height: | Size: 182 KiB |
1
__mirror/runtime/hc-pos-dashboard/webpack-runtime.js
Normal file
255
__mirror/runtime/index.html
Normal file
@@ -0,0 +1,255 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>运行态镜像入口</title>
|
||||
<style>
|
||||
:root {
|
||||
--bg: #0b1220;
|
||||
--panel: #121a2b;
|
||||
--text: #eef4ff;
|
||||
--muted: #92a4c4;
|
||||
--border: rgba(255,255,255,0.08);
|
||||
--accent: #4aa3ff;
|
||||
--accent-2: #45d2a0;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
min-height: 100vh;
|
||||
padding: 40px 20px;
|
||||
background:
|
||||
radial-gradient(circle at top left, rgba(74,163,255,0.16), transparent 30%),
|
||||
radial-gradient(circle at bottom right, rgba(69,210,160,0.12), transparent 28%),
|
||||
var(--bg);
|
||||
color: var(--text);
|
||||
font: 16px/1.6 -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", sans-serif;
|
||||
}
|
||||
|
||||
.wrap {
|
||||
width: min(980px, 100%);
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0 0 12px;
|
||||
font-size: 32px;
|
||||
line-height: 1.15;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0 0 28px;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||
gap: 18px;
|
||||
}
|
||||
|
||||
.card {
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 20px;
|
||||
background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02));
|
||||
padding: 22px 20px;
|
||||
box-shadow: 0 20px 48px rgba(0,0,0,0.24);
|
||||
}
|
||||
|
||||
.tag {
|
||||
display: inline-block;
|
||||
margin-bottom: 10px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 999px;
|
||||
background: rgba(255,255,255,0.07);
|
||||
color: var(--muted);
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 0 0 10px;
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.link-groups {
|
||||
display: grid;
|
||||
gap: 16px;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.group {
|
||||
padding-top: 16px;
|
||||
border-top: 1px solid rgba(255,255,255,0.06);
|
||||
}
|
||||
|
||||
.group:first-of-type {
|
||||
padding-top: 0;
|
||||
border-top: 0;
|
||||
}
|
||||
|
||||
.group-title {
|
||||
margin: 0 0 10px;
|
||||
color: var(--muted);
|
||||
font-size: 13px;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
|
||||
.actions {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-width: 140px;
|
||||
padding: 11px 16px;
|
||||
border-radius: 12px;
|
||||
border: 1px solid var(--border);
|
||||
color: var(--text);
|
||||
background: rgba(255,255,255,0.04);
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.btn.primary {
|
||||
background: var(--accent);
|
||||
color: #06101f;
|
||||
border-color: transparent;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.btn.secondary {
|
||||
background: var(--accent-2);
|
||||
color: #062118;
|
||||
border-color: transparent;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.btn.subtle {
|
||||
border-color: rgba(255,255,255,0.06);
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 2px 7px;
|
||||
border-radius: 999px;
|
||||
background: rgba(255,255,255,0.08);
|
||||
color: var(--muted);
|
||||
font-size: 11px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.badge.warn {
|
||||
background: rgba(255, 196, 92, 0.16);
|
||||
color: #ffd782;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main class="wrap">
|
||||
<h1>运行态镜像入口</h1>
|
||||
<p>这里汇总了两个后台的本地运行态入口。优先使用“运行态”地址,它比静态快照更接近真实站点。</p>
|
||||
<section class="grid">
|
||||
<article class="card">
|
||||
<span class="tag">项目运营平台 / hc-pos</span>
|
||||
<h2>项目运营平台</h2>
|
||||
<p>已接入本地存储、Cookie、Service Worker mock 和深链静态回退。适合查看主要业务页与配置页。</p>
|
||||
<div class="link-groups">
|
||||
<section class="group">
|
||||
<div class="group-title">常用入口</div>
|
||||
<div class="actions">
|
||||
<a class="btn primary" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/dashboard">运行态首页</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/propertySMG/basicManagement/basicsInfo">项目信息</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/propertySMG/basicManagement/communityBasicsInfo">楼宇信息</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/propertySMG/basicManagement/spatialRegion">网格划分</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="group">
|
||||
<div class="group-title">社区治理</div>
|
||||
<div class="actions">
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/communitySMG/party">党建活动</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/communitySMG/personnelList">住户档案</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/communitySMG/serviceProvider">服务商管理</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/communitySMG/accepterManage">共建组织</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="group">
|
||||
<div class="group-title">业务配置</div>
|
||||
<div class="actions">
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/systemManage/projectConfig/majorSettings/paySetting">支付配置</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/propertySMG/materialManage/inventoryManage">库存管理</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/propertySMG/materialManage/purchaseStorage">采购入库</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-pos-dashboard/?v=20260405q#/systemManage/projectConfig/internalControl/controlSetting">驾驶舱配置</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="group">
|
||||
<div class="group-title">补充入口</div>
|
||||
<div class="actions">
|
||||
<a class="btn subtle" href="/hc-pos.sqygj.cn/dashboard/">静态快照首页</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</article>
|
||||
<article class="card">
|
||||
<span class="tag">企业服务平台 / hc-etms</span>
|
||||
<h2>企业服务平台</h2>
|
||||
<p>已接入运行态首页和高频管理页映射,企业信息、成员、组织架构、分公司管理、角色权限管理、人事档案等页都可直接进入。</p>
|
||||
<div class="link-groups">
|
||||
<section class="group">
|
||||
<div class="group-title">基础资料</div>
|
||||
<div class="actions">
|
||||
<a class="btn secondary" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q">运行态首页</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/companyMetadata/companyInfo">企业信息</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/companyMetadata/member">成员</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/companyMetadata/institution">组织架构</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/companyMetadata/organizational">企微通讯录</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/companyMetadata/branchOfficeManage">分公司管理</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="group">
|
||||
<div class="group-title">组织人事</div>
|
||||
<div class="actions">
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/systemManage/permissions">角色权限</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/personnelMerits/personnelFiles">人事档案</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/personnelMerits/recruitManage">招聘管理</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/personnelMerits/checkWorkManage">考勤管理</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/systemManage/personnelSetting">人事设置</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/systemManage/operationLog">操作日志</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="group">
|
||||
<div class="group-title">经营看板</div>
|
||||
<div class="actions">
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/companyMetadata/financeData">财务数据</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/r2cockpit/cloudData/propertyFeeReport">物业费报表</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/finance">财务看板</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/equipment">设备看板</a>
|
||||
<a class="btn" href="/__mirror/runtime/hc-etms-dashboard/?v=20260405q#/parkingLot">车场看板</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="group">
|
||||
<div class="group-title">补充入口</div>
|
||||
<div class="actions">
|
||||
<a class="btn subtle" href="/hc-etms.sqygj.cn/dashboard/__query_3cc8885b97/">静态快照首页</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</article>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
12
__mirror/static-mirror.css
Normal file
@@ -0,0 +1,12 @@
|
||||
.el-submenu > .el-submenu__title {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.codex-static-submenu-open > .el-submenu__title .el-submenu__icon-arrow {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.codex-static-submenu-open > ul.el-menu--inline {
|
||||
display: block !important;
|
||||
}
|
||||
108
__mirror/static-mirror.js
Normal file
@@ -0,0 +1,108 @@
|
||||
(function () {
|
||||
function getDirectChildSubmenuList(submenu) {
|
||||
for (const child of submenu.children) {
|
||||
if (child.tagName === "UL" && child.classList.contains("el-menu--inline")) {
|
||||
return child;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function setExpanded(title, expand) {
|
||||
const submenu = title.closest(".el-submenu");
|
||||
if (!submenu) {
|
||||
return;
|
||||
}
|
||||
|
||||
const list = getDirectChildSubmenuList(submenu);
|
||||
if (!list) {
|
||||
return;
|
||||
}
|
||||
|
||||
submenu.classList.toggle("codex-static-submenu-open", expand);
|
||||
list.style.display = expand ? "block" : "none";
|
||||
title.setAttribute("aria-expanded", String(expand));
|
||||
}
|
||||
|
||||
function toggle(title) {
|
||||
const submenu = title.closest(".el-submenu");
|
||||
if (!submenu) {
|
||||
return;
|
||||
}
|
||||
const list = getDirectChildSubmenuList(submenu);
|
||||
if (!list) {
|
||||
return;
|
||||
}
|
||||
const computed = window.getComputedStyle(list).display;
|
||||
setExpanded(title, computed === "none");
|
||||
}
|
||||
|
||||
function expandAncestorsForCurrentLink() {
|
||||
const currentPath = window.location.pathname.replace(/index\.html$/, "");
|
||||
const anchors = document.querySelectorAll("a[href]");
|
||||
anchors.forEach((anchor) => {
|
||||
const href = anchor.getAttribute("href");
|
||||
if (!href || href.startsWith("#") || href.startsWith("http")) {
|
||||
return;
|
||||
}
|
||||
let resolvedPath = "";
|
||||
try {
|
||||
resolvedPath = new URL(href, window.location.href).pathname.replace(/index\.html$/, "");
|
||||
} catch (_error) {
|
||||
return;
|
||||
}
|
||||
if (resolvedPath !== currentPath) {
|
||||
return;
|
||||
}
|
||||
|
||||
let submenu = anchor.closest(".el-submenu");
|
||||
while (submenu) {
|
||||
const title = submenu.querySelector(":scope > .el-submenu__title");
|
||||
if (title) {
|
||||
setExpanded(title, true);
|
||||
}
|
||||
submenu = submenu.parentElement ? submenu.parentElement.closest(".el-submenu") : null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function initStaticSubmenus() {
|
||||
const titles = document.querySelectorAll(".el-submenu > .el-submenu__title");
|
||||
titles.forEach((title) => {
|
||||
const submenu = title.closest(".el-submenu");
|
||||
if (!submenu) {
|
||||
return;
|
||||
}
|
||||
const list = getDirectChildSubmenuList(submenu);
|
||||
if (!list) {
|
||||
return;
|
||||
}
|
||||
|
||||
title.setAttribute("role", "button");
|
||||
title.setAttribute("tabindex", "0");
|
||||
title.setAttribute("aria-expanded", window.getComputedStyle(list).display !== "none" ? "true" : "false");
|
||||
|
||||
title.addEventListener("click", function (event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
toggle(title);
|
||||
});
|
||||
|
||||
title.addEventListener("keydown", function (event) {
|
||||
if (event.key !== "Enter" && event.key !== " ") {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
toggle(title);
|
||||
});
|
||||
});
|
||||
|
||||
expandAncestorsForCurrentLink();
|
||||
}
|
||||
|
||||
if (document.readyState === "loading") {
|
||||
document.addEventListener("DOMContentLoaded", initStaticSubmenus);
|
||||
} else {
|
||||
initStaticSubmenus();
|
||||
}
|
||||
})();
|
||||