diff --git a/.env b/.env new file mode 100644 index 0000000..cadad16 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +BASE_DIR=/app/houseDream +PORT=8080 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 08d678d..3c48fdc 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,8 @@ pids/ .yarn-integrity # dotenv environment variables file -.env +.env.local +.env.*.local # OS files .DS_Store diff --git a/README.md b/README.md index 41df1cc..2a0dc6e 100644 --- a/README.md +++ b/README.md @@ -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 # 本文件 diff --git a/data/2026-03-23.json b/data/2026-03-23.json new file mode 100644 index 0000000..30f22da --- /dev/null +++ b/data/2026-03-23.json @@ -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": "60~80m2", + "area_deal_units": "2200", + "area_deal_percent": "152566.2600" + }, + { + "area_range": "80~100m2", + "area_deal_units": "1999", + "area_deal_percent": "177844.6000" + }, + { + "area_range": "100~120m2", + "area_deal_units": "791", + "area_deal_percent": "86075.4300" + }, + { + "area_range": "120~140m2", + "area_deal_units": "550", + "area_deal_percent": "71435.1700" + }, + { + "area_range": "140m2以上", + "area_deal_units": "743", + "area_deal_percent": "157368.9500" + } + ] + } + } +} \ No newline at end of file diff --git a/package.json b/package.json index 3433786..58c4ff5 100644 --- a/package.json +++ b/package.json @@ -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" } } diff --git a/pic/2026-03-23.png b/pic/2026-03-23.png new file mode 100644 index 0000000..8d5f20f Binary files /dev/null and b/pic/2026-03-23.png differ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..5642a64 --- /dev/null +++ b/pnpm-lock.yaml @@ -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 diff --git a/public/define.js b/public/define.js new file mode 100644 index 0000000..96b8459 --- /dev/null +++ b/public/define.js @@ -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: '占比(%)', + }, + }, + } + } + } +} \ No newline at end of file diff --git a/scripts/daily.js b/scripts/daily.js index 54fd43f..a464a90 100644 --- a/scripts/daily.js +++ b/scripts/daily.js @@ -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'); diff --git a/scripts/screenshot.js b/scripts/screenshot.js index 3720439..75f31c9 100644 --- a/scripts/screenshot.js +++ b/scripts/screenshot.js @@ -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'; diff --git a/server.js b/server.js index 5696b54..a95096a 100644 --- a/server.js +++ b/server.js @@ -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); diff --git a/startup.sh b/startup.sh new file mode 100755 index 0000000..b7bde30 --- /dev/null +++ b/startup.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +# 启动 houseDream +# cd /app/houseDream +pnpm run server \ No newline at end of file diff --git a/web/app.js b/web/app.js index a12dc12..a479dbe 100644 --- a/web/app.js +++ b/web/app.js @@ -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 => `${item[field.key]}`).join(''); tbody.appendChild(row);