全流程测试

This commit is contained in:
root 2026-03-23 10:37:38 +08:00
parent bd8aed9f4f
commit c458341633
13 changed files with 888 additions and 14 deletions

2
.env Normal file
View File

@ -0,0 +1,2 @@
BASE_DIR=/app/houseDream
PORT=8080

3
.gitignore vendored
View File

@ -25,7 +25,8 @@ pids/
.yarn-integrity
# dotenv environment variables file
.env
.env.local
.env.*.local
# OS files
.DS_Store

View File

@ -41,12 +41,12 @@
│ ├── index.html # 主页面
│ ├── style.css # 样式
│ ├── app.js # 前端逻辑
│ └── define.js # 数据定义
├── scripts/ # 后端脚本
│ ├── daily.js # 完整爬取流程
│ └── screenshot.js # 仅截图
├── public/ # 公共资源
│ └── extract.js # 数据提取逻辑
│ └── define.js # 数据定义
├── server.js # Web 服务器
├── package.json # 项目配置
└── README.md # 本文件

307
data/2026-03-23.json Normal file
View File

@ -0,0 +1,307 @@
{
"date": "2026-03-23",
"timestamp": 1774233229501,
"source": "http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=307749",
"data": {
"spfsjtj": {
"ksqf": {
"kspf_total_units": "89040",
"kspf_total_area": "7571859.5700",
"kspf_residential_units": "39888",
"kspf_residential_area": "5511182.5200",
"kspf_commercial_units": "214",
"kspf_commercial_area": "159917.8800",
"kspf_office_units": "533",
"kspf_office_area": "517721.2300",
"kspf_parking_units": "39286",
"kspf_parking_area": "1081054.5200"
},
"ysxk": {
"ysxk_license_count": "8",
"ysxk_total_area": "314659.9000",
"ysxk_residential_units": "2020",
"ysxk_residential_area": "264160.8100",
"ysxk_commercial_units": "0",
"ysxk_commercial_area": "0.0000",
"ysxk_office_units": "0",
"ysxk_office_area": "0.0000",
"ysxk_parking_units": "1384",
"ysxk_parking_area": "38546.2200"
},
"qfrg": {
"qfrg_total_units": "57",
"qfrg_total_area": "6659.5600",
"qfrg_residential_units": "53",
"qfrg_residential_area": "6550.1200",
"qfrg_commercial_units": "0",
"qfrg_commercial_area": "0.0000",
"qfrg_office_units": "0",
"qfrg_office_area": "0.0000",
"qfrg_parking_units": "3",
"qfrg_parking_area": "88.2900"
},
"qfqy": {
"qfqy_total_units": "70",
"qfqy_total_area": "6102.5800",
"qfqy_residential_units": "49",
"qfqy_residential_area": "5618.9100",
"qfqy_commercial_units": "0",
"qfqy_commercial_area": "0.0000",
"qfqy_office_units": "0",
"qfqy_office_area": "0.0000",
"qfqy_parking_units": "17",
"qfqy_parking_area": "380.8600"
},
"wyxf": {
"wyxf_total_units": "212494",
"wyxf_total_area": "11397185.3200",
"wyxf_residential_units": "29974",
"wyxf_residential_area": "3409421.6900",
"wyxf_commercial_units": "1738",
"wyxf_commercial_area": "797406.8600",
"wyxf_office_units": "4427",
"wyxf_office_area": "1544716.4200",
"wyxf_parking_units": "124128",
"wyxf_parking_area": "4148777.9000"
},
"xfxm": {
"xfxm_project_count": "39917",
"xfxm_total_area": "279541202.2700",
"xfxm_residential_units": "937787",
"xfxm_residential_area": "116845842.5300",
"xfxm_commercial_units": "96928",
"xfxm_commercial_area": "23085554.9600",
"xfxm_office_units": "134740",
"xfxm_office_area": "25167845.3100",
"xfxm_parking_units": "828373",
"xfxm_parking_area": "31600058.2600"
},
"xfrg": {
"xfrg_total_units": "41",
"xfrg_total_area": "4229.3500",
"xfrg_residential_units": "37",
"xfrg_residential_area": "4132.3900",
"xfrg_commercial_units": "0",
"xfrg_commercial_area": "0.0000",
"xfrg_office_units": "0",
"xfrg_office_area": "0.0000",
"xfrg_parking_units": "1",
"xfrg_parking_area": "38.1600"
},
"xfqy": {
"xfqy_total_units": "46",
"xfqy_total_area": "3421.7700",
"xfqy_residential_units": "14",
"xfqy_residential_area": "1770.4700",
"xfqy_commercial_units": "1",
"xfqy_commercial_area": "691.7800",
"xfqy_office_units": "0",
"xfqy_office_area": "0.0000",
"xfqy_parking_units": "20",
"xfqy_parking_area": "525.8600"
}
},
"clfwsqytj": {
"clf_month": {
"clf_month_total_units": "9111",
"clf_month_total_area": "772959.8600",
"clf_month_residential_units": "8130",
"clf_month_residential_area": "721746.3800"
},
"clf_day": {
"clf_day_total_units": "202",
"clf_day_total_area": "16951.6200",
"clf_day_residential_units": "191",
"clf_day_residential_area": "16459.4000"
}
},
"clfwdtj": {
"broker": [
{
"broker_seq": "1",
"broker_name": "北京链家置地房地产经纪有限公司",
"broker_deal_units": "3968",
"broker_refund_units": "67"
},
{
"broker_seq": "2",
"broker_name": "北京我爱我家房地产经纪有限公司",
"broker_deal_units": "860",
"broker_refund_units": "27"
},
{
"broker_seq": "3",
"broker_name": "北京我爱我家华熙房地产经纪有限公司",
"broker_deal_units": "191",
"broker_refund_units": "4"
},
{
"broker_seq": "4",
"broker_name": "北京金色时光房地产经纪有限公司",
"broker_deal_units": "183",
"broker_refund_units": "7"
},
{
"broker_seq": "5",
"broker_name": "北京麦田房产经纪有限公司",
"broker_deal_units": "167",
"broker_refund_units": "2"
},
{
"broker_seq": "6",
"broker_name": "北京市易合房地产经纪有限责任公司",
"broker_deal_units": "54",
"broker_refund_units": "0"
},
{
"broker_seq": "7",
"broker_name": "汇石凯岩(北京)停车管理有限公司",
"broker_deal_units": "45",
"broker_refund_units": "0"
},
{
"broker_seq": "8",
"broker_name": "北京金城阜业房地产经纪有限公司",
"broker_deal_units": "40",
"broker_refund_units": "1"
},
{
"broker_seq": "9",
"broker_name": "北京市兴商房地产经纪中心有限公司",
"broker_deal_units": "36",
"broker_refund_units": "1"
},
{
"broker_seq": "10",
"broker_name": "京安驰(北京)房地产经纪有限公司",
"broker_deal_units": "30",
"broker_refund_units": "3"
}
],
"district": [
{
"district_name": "全 市",
"district_deal_units": "9111.0",
"district_deal_area": "772959.86"
},
{
"district_name": "东 城",
"district_deal_units": "368",
"district_deal_area": "26395.3600"
},
{
"district_name": "西 城",
"district_deal_units": "526",
"district_deal_area": "33057.9300"
},
{
"district_name": "朝 阳",
"district_deal_units": "2150",
"district_deal_area": "190029.8400"
},
{
"district_name": "海 淀",
"district_deal_units": "1026",
"district_deal_area": "81386.1200"
},
{
"district_name": "丰 台",
"district_deal_units": "951",
"district_deal_area": "76383.6700"
},
{
"district_name": "石景山",
"district_deal_units": "276",
"district_deal_area": "20243.8900"
},
{
"district_name": "通 州",
"district_deal_units": "651",
"district_deal_area": "57381.0200"
},
{
"district_name": "房 山",
"district_deal_units": "477",
"district_deal_area": "39740.7200"
},
{
"district_name": "顺 义",
"district_deal_units": "477",
"district_deal_area": "48649.5400"
},
{
"district_name": "门头沟",
"district_deal_units": "295",
"district_deal_area": "21153.3900"
},
{
"district_name": "大 兴",
"district_deal_units": "590",
"district_deal_area": "51463.3600"
},
{
"district_name": "怀 柔",
"district_deal_units": "107",
"district_deal_area": "10798.1600"
},
{
"district_name": "密 云",
"district_deal_units": "196",
"district_deal_area": "19915.1000"
},
{
"district_name": "昌 平",
"district_deal_units": "712",
"district_deal_area": "67716.5300"
},
{
"district_name": "延 庆",
"district_deal_units": "102",
"district_deal_area": "8821.4400"
},
{
"district_name": "平 谷",
"district_deal_units": "108",
"district_deal_area": "10040.0800"
},
{
"district_name": "开发区",
"district_deal_units": "99",
"district_deal_area": "9783.7100"
}
],
"area": [
{
"area_range": "60m2以下",
"area_deal_units": "2828",
"area_deal_percent": "127669.4500"
},
{
"area_range": "6080m2",
"area_deal_units": "2200",
"area_deal_percent": "152566.2600"
},
{
"area_range": "80100m2",
"area_deal_units": "1999",
"area_deal_percent": "177844.6000"
},
{
"area_range": "100120m2",
"area_deal_units": "791",
"area_deal_percent": "86075.4300"
},
{
"area_range": "120140m2",
"area_deal_units": "550",
"area_deal_percent": "71435.1700"
},
{
"area_range": "140m2以上",
"area_deal_units": "743",
"area_deal_percent": "157368.9500"
}
]
}
}
}

View File

@ -4,14 +4,21 @@
"description": "北京市房地产数据监控系统 - 自动爬取、提取、可视化展示",
"main": "server.js",
"scripts": {
"server": "node ./server.js",
"server": "node server.js",
"screenshot": "node scripts/screenshot.js",
"daily": "node scripts/daily.js"
},
"keywords": ["房地产", "数据监控", "北京", "爬虫", "可视化"],
"keywords": [
"房地产",
"数据监控",
"北京",
"爬虫",
"可视化"
],
"author": "",
"license": "ISC",
"dependencies": {
"dotenv": "^17.3.1",
"playwright": "^1.40.0"
}
}

BIN
pic/2026-03-23.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

52
pnpm-lock.yaml generated Normal file
View File

@ -0,0 +1,52 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
dotenv:
specifier: ^17.3.1
version: 17.3.1
playwright:
specifier: ^1.40.0
version: 1.58.2
packages:
dotenv@17.3.1:
resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==}
engines: {node: '>=12'}
fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
playwright-core@1.58.2:
resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==}
engines: {node: '>=18'}
hasBin: true
playwright@1.58.2:
resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==}
engines: {node: '>=18'}
hasBin: true
snapshots:
dotenv@17.3.1: {}
fsevents@2.3.2:
optional: true
playwright-core@1.58.2: {}
playwright@1.58.2:
dependencies:
playwright-core: 1.58.2
optionalDependencies:
fsevents: 2.3.2

494
public/define.js Normal file
View File

@ -0,0 +1,494 @@
const rootDefined = {
spfsjtj: {
key: 'spfsjtj',
label: '商品房数据统计',
childMap: {
ksqf: {
key: 'kspf',
label: '可售期房统计',
childMap: {
kspf_total_units: {
key: 'kspf_total_units',
label: '可售房屋套数',
},
kspf_total_area: {
key: 'kspf_total_area',
label: '可售房屋面积(M2)',
},
kspf_residential_units: {
key: 'kspf_residential_units',
label: '其中,住宅套数',
},
kspf_residential_area: {
key: 'kspf_residential_area',
label: '面积(M2)',
},
kspf_residential_units: {
key: 'kspf_residential_units',
label: '其中,住宅套数',
},
kspf_commercial_units: {
key: 'kspf_commercial_units',
label: '其中,商业单元',
},
kspf_commercial_area: {
key: 'kspf_commercial_area',
label: '面积(M2)',
},
kspf_office_units: {
key: 'kspf_office_units',
label: '其中,办公单元',
},
kspf_office_area: {
key: 'kspf_office_area',
label: '面积(M2)',
},
kspf_parking_units: {
key: 'kspf_parking_units',
label: '其中,车位个数',
},
kspf_parking_area: {
key: 'kspf_parking_area',
label: '面积(M2)',
},
},
},
ysxk: {
key: 'ysxk',
label: '预售许可',
childMap: {
ysxk_license_count: {
key: 'ysxk_license_count',
label: '批准预售许可证',
},
ysxk_total_area: {
key: 'ysxk_total_area',
label: '批准预售面积(M2)',
},
ysxk_residential_units: {
key: 'ysxk_residential_units',
label: '其中,住宅套数',
},
ysxk_residential_area: {
key: 'ysxk_residential_area',
label: '面积(M2)',
},
ysxk_commercial_units: {
key: 'ysxk_commercial_units',
label: '其中,商业单元',
},
ysxk_commercial_area: {
key: 'ysxk_commercial_area',
label: '面积(M2)',
},
ysxk_office_units: {
key: 'ysxk_office_units',
label: '其中,办公单元',
},
ysxk_office_area: {
key: 'ysxk_office_area',
label: '面积(M2)',
},
ysxk_parking_units: {
key: 'ysxk_parking_units',
label: '其中,车位个数',
},
ysxk_parking_area: {
key: 'ysxk_parking_area',
label: '面积(M2)',
},
},
},
qfrg: {
key: 'qfrg',
label: '期房网上认购',
childMap: {
qfrg_total_units: {
key: 'qfrg_total_units',
label: '网上认购套数',
},
qfrg_total_area: {
key: 'qfrg_total_area',
label: '网上认购面积(M2)',
},
qfrg_residential_units: {
key: 'qfrg_residential_units',
label: '住宅套数',
},
qfrg_residential_area: {
key: 'qfrg_residential_area',
label: '面积(M2)',
},
qfrg_commercial_units: {
key: 'qfrg_commercial_units',
label: '商业单元',
},
qfrg_commercial_area: {
key: 'qfrg_commercial_area',
label: '面积(M2)',
},
qfrg_office_units: {
key: 'qfrg_office_units',
label: '办公单元',
},
qfrg_office_area: {
key: 'qfrg_office_area',
label: '面积(M2)',
},
qfrg_parking_units: {
key: 'qfrg_parking_units',
label: '车位个数',
},
qfrg_parking_area: {
key: 'qfrg_parking_area',
label: '面积(M2)',
},
},
},
qfqy: {
key: 'qfqy',
label: '期房网上签约',
childMap: {
qfqy_total_units: {
key: 'qfqy_total_units',
label: '网上签约套数',
},
qfqy_total_area: {
key: 'qfqy_total_area',
label: '网上签约面积(M2)',
},
qfqy_residential_units: {
key: 'qfqy_residential_units',
label: '住宅套数',
},
qfqy_residential_area: {
key: 'qfqy_residential_area',
label: '面积(M2)',
},
qfqy_commercial_units: {
key: 'qfqy_commercial_units',
label: '商业单元',
},
qfqy_commercial_area: {
key: 'qfqy_commercial_area',
label: '面积(M2)',
},
qfqy_office_units: {
key: 'qfqy_office_units',
label: '办公单元',
},
qfqy_office_area: {
key: 'qfqy_office_area',
label: '面积(M2)',
},
qfqy_parking_units: {
key: 'qfqy_parking_units',
label: '车位个数',
},
qfqy_parking_area: {
key: 'qfqy_parking_area',
label: '面积(M2)',
},
},
},
wyxf: {
key: 'wyxf',
label: '未签约现房统计',
childMap: {
wyxf_total_units: {
key: 'wyxf_total_units',
label: '未签约套数',
},
wyxf_total_area: {
key: 'wyxf_total_area',
label: '未签约面积(M2)',
},
wyxf_residential_units: {
key: 'wyxf_residential_units',
label: '住宅套数',
},
wyxf_residential_area: {
key: 'wyxf_residential_area',
label: '面积(M2)',
},
wyxf_commercial_units: {
key: 'wyxf_commercial_units',
label: '商业单元',
},
wyxf_commercial_area: {
key: 'wyxf_commercial_area',
label: '面积(M2)',
},
wyxf_office_units: {
key: 'wyxf_office_units',
label: '办公单元',
},
wyxf_office_area: {
key: 'wyxf_office_area',
label: '面积(M2)',
},
wyxf_parking_units: {
key: 'wyxf_parking_units',
label: '车位个数',
},
wyxf_parking_area: {
key: 'wyxf_parking_area',
label: '面积(M2)',
},
},
},
xfxm: {
key: 'xfxm',
label: '现房项目情况',
childMap: {
xfxm_project_count: {
key: 'xfxm_project_count',
label: '现房项目个数',
},
xfxm_total_area: {
key: 'xfxm_total_area',
label: '初始登记面积(M2)',
},
xfxm_residential_units: {
key: 'xfxm_residential_units',
label: '住宅套数',
},
xfxm_residential_area: {
key: 'xfxm_residential_area',
label: '面积(M2)',
},
xfxm_commercial_units: {
key: 'xfxm_commercial_units',
label: '商业单元',
},
xfxm_commercial_area: {
key: 'xfxm_commercial_area',
label: '面积(M2)',
},
xfxm_office_units: {
key: 'xfxm_office_units',
label: '办公单元',
},
xfxm_office_area: {
key: 'xfxm_office_area',
label: '面积(M2)',
},
xfxm_parking_units: {
key: 'xfxm_parking_units',
label: '车位个数',
},
xfxm_parking_area: {
key: 'xfxm_parking_area',
label: '面积(M2)',
},
},
},
xfrg: {
key: 'xfrg',
label: '现房网上认购',
childMap: {
xfrg_total_units: {
key: 'xfrg_total_units',
label: '网上认购套数',
},
xfrg_total_area: {
key: 'xfrg_total_area',
label: '网上认购面积(M2)',
},
xfrg_residential_units: {
key: 'xfrg_residential_units',
label: '住宅套数',
},
xfrg_residential_area: {
key: 'xfrg_residential_area',
label: '面积(M2)',
},
xfrg_commercial_units: {
key: 'xfrg_commercial_units',
label: '商业单元',
},
xfrg_commercial_area: {
key: 'xfrg_commercial_area',
label: '面积(M2)',
},
xfrg_office_units: {
key: 'xfrg_office_units',
label: '办公单元',
},
xfrg_office_area: {
key: 'xfrg_office_area',
label: '面积(M2)',
},
xfrg_parking_units: {
key: 'xfrg_parking_units',
label: '车位个数',
},
xfrg_parking_area: {
key: 'xfrg_parking_area',
label: '面积(M2)',
},
},
},
xfqy: {
key: 'xfqy',
label: '现房网上签约',
childMap: {
xfqy_total_units: {
key: 'xfqy_total_units',
label: '网上签约套数',
},
xfqy_total_area: {
key: 'xfqy_total_area',
label: '网上签约面积(M2)',
},
xfqy_residential_units: {
key: 'xfqy_residential_units',
label: '住宅套数',
},
xfqy_residential_area: {
key: 'xfqy_residential_area',
label: '面积(M2)',
},
xfqy_commercial_units: {
key: 'xfqy_commercial_units',
label: '商业单元',
},
xfqy_commercial_area: {
key: 'xfqy_commercial_area',
label: '面积(M2)',
},
xfqy_office_units: {
key: 'xfqy_office_units',
label: '办公单元',
},
xfqy_office_area: {
key: 'xfqy_office_area',
label: '面积(M2)',
},
xfqy_parking_units: {
key: 'xfqy_parking_units',
label: '车位个数',
},
xfqy_parking_area: {
key: 'xfqy_parking_area',
label: '面积(M2)',
},
},
}
}
},
clfwsqytj: {
key: 'clfwsqytj',
label: '存量房网上签约统计',
childMap: {
clf_month: {
key: 'clf_month',
label: '月签约',
childMap: {
clf_month_total_units: {
key: 'clf_month_total_units',
label: '网上签约套数',
},
clf_month_total_area: {
key: 'clf_month_total_area',
label: '网上签约面积(m2)',
},
clf_month_residential_units: {
key: 'clf_month_residential_units',
label: '住宅签约套数',
},
clf_month_residential_area: {
key: 'clf_month_residential_area',
label: '住宅签约面积(m2)',
},
},
},
clf_day: {
key: 'clf_day',
label: '日签约',
childMap: {
clf_day_total_units: {
key: 'clf_day_total_units',
label: '网上签约套数',
},
clf_day_total_area: {
key: 'clf_day_total_area',
label: '网上签约面积(m2)',
},
clf_day_residential_units: {
key: 'clf_day_residential_units',
label: '住宅签约套数',
},
clf_day_residential_area: {
key: 'clf_day_residential_area',
label: '住宅签约面积(m2)',
},
},
}
}
},
clfwdtj: {
key: 'clfwdtj',
label: '存量房维度统计',
childMap: {
broker: {
key: 'broker',
label: '按经纪机构',
childMap: {
broker_seq: {
key: 'broker_seq',
label: '序号',
},
broker_name: {
key: 'broker_name',
label: '房地产经纪机构名称',
},
broker_deal_units: {
key: 'broker_deal_units',
label: '签约套数',
},
broker_refund_units: {
key: 'broker_refund_units',
label: '退房套数',
},
},
},
district: {
key: 'district',
label: '按所在区县',
childMap: {
district_name: {
key: 'district_name',
label: '所在区县',
},
district_deal_units: {
key: 'district_deal_units',
label: '签约套数',
},
district_deal_area: {
key: 'district_deal_area',
label: '签约面积(m2)',
},
},
},
area: {
key: 'area',
label: '按建筑面积',
childMap: {
area_range: {
key: 'area_range',
label: '建筑面积区间',
},
area_deal_units: {
key: 'area_deal_units',
label: '签约套数',
},
area_deal_percent: {
key: 'area_deal_percent',
label: '占比(%)',
},
},
}
}
}
}

View File

@ -6,11 +6,11 @@ const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');
const dotenv = require('dotenv');
const extractFunc = require('../utils/extract_data');
dotenv.config({path: ['.env.local', '.env'], quiet: true});
const BASE_DIR = '/app/houseDream';
// const BASE_DIR = '/Users/liyanyan/vps/tencet-ecs/app/houseDream';
const BASE_DIR = process.env.BASE_DIR;
const PIC_DIR = path.join(BASE_DIR, 'pic');
const DATA_DIR = path.join(BASE_DIR, 'data');

View File

@ -5,9 +5,11 @@
const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');
const dotenv = require('dotenv');
const BASE_DIR = '/app/houseDream';
// const BASE_DIR = '/Users/liyanyan/vps/tencet-ecs/app/houseDream';
dotenv.config({path: ['.env.local', '.env'], quiet: true});
const BASE_DIR = process.env.BASE_DIR;
const PIC_DIR = path.join(BASE_DIR, 'pic');
const TARGET_URL = 'http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=307749';

View File

@ -7,9 +7,13 @@ const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');
const dotenv = require('dotenv');
const BASE_DIR = '/app/houseDream';
// const BASE_DIR = '/Users/liyanyan/vps/tencet-ecs/app/houseDream';
dotenv.config({path: ['.env.local', '.env'], quiet: true});
console.log('环境变量:', process.env.BASE_DIR);
const BASE_DIR = process.env.BASE_DIR;
const WEB_DIR = path.join(BASE_DIR, 'web');
const DATA_DIR = path.join(BASE_DIR, 'data');
const PIC_DIR = path.join(BASE_DIR, 'pic');
@ -130,6 +134,7 @@ const server = http.createServer(async (req, res) => {
res.end(data);
} catch (err) {
console.error('文件读取错误:', err);
if (err.code === 'ENOENT') {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Not Found');
@ -152,7 +157,7 @@ server.listen(PORT, 'localhost', () => {
// 优雅关闭
process.on('SIGTERM', () => {
console.log('\n正在关闭服务器...');
console.log('\nSIGTERM\n正在关闭服务器...');
server.close(() => {
console.log('服务器已关闭');
process.exit(0);
@ -160,7 +165,7 @@ process.on('SIGTERM', () => {
});
process.on('SIGINT', () => {
console.log('\n正在关闭服务器...');
console.log('\nSIGINT\n正在关闭服务器...');
server.close(() => {
console.log('服务器已关闭');
process.exit(0);

5
startup.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
# 启动 houseDream
# cd /app/houseDream
pnpm run server

View File

@ -175,7 +175,6 @@ function renderBrokerTable(table, data, fieldMap) {
// 表体
const tbody = document.createElement('tbody');
data.forEach(item => {
console.log('渲染经纪机构表格数据:', item);
const row = document.createElement('tr');
row.innerHTML = Object.values(fieldMap).map(field => `<td>${item[field.key]}</td>`).join('');
tbody.appendChild(row);