diff --git a/会员服务器/huiyuan.json b/会员服务器/huiyuan.json deleted file mode 100644 index 4b95a3e..0000000 --- a/会员服务器/huiyuan.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "会员": [ - { - "手机号": "17625166407", - "密码": "wujun2000", - "会员类型": "永久会员", - "有效期": "永久", - "注册时间": "2026-09-09", - "备注": "" - }, - { - "手机号": "18209918985", - "密码": "Wujun2000.", - "会员类型": "永久会员", - "有效期": "永久", - "注册时间": "2026-09-09", - "备注": "" - } - ] -} \ No newline at end of file diff --git a/会员服务器/server.cjs b/会员服务器/server.cjs deleted file mode 100644 index fa9f2c6..0000000 --- a/会员服务器/server.cjs +++ /dev/null @@ -1,243 +0,0 @@ -// 会员系统服务器(零依赖纯 node http,照 cadbt server.cjs 模式) -// · 端口 12701,只绑 127.0.0.1(外部访问不到) -// · 数据存 huiyuan.json(本目录): { "会员": [ {手机号,密码,会员类型,有效期,注册时间,备注} ] } -// · API: -// POST /api/login {手机号,密码} → {ok,会员类型,有效期} | {ok:false,msg} -// POST /api/register {手机号,密码} → {ok} 注册为"试用会员",有效期=今天+30天 -// GET /api/member?手机号=xxx → {ok,手机号,会员类型,有效期} -// POST /api/changepwd {手机号,旧密码,新密码} → {ok} -// GET /api/list → {ok,会员:[...]}(管理页用) -// POST /api/save {会员:[...]} → {ok}(管理页整表保存) -// · 项目云 API(2026-09-16,数据落 项目云\<手机号安全化>\<项目编号安全化>\项目.zip): -// POST /api/proj/upload body=JSON头 + \n\n + zip二进制 → {ok,编号,大小,时间}(覆盖式) -// GET /api/proj/list?手机号= → {ok,项目:[{编号,名称,时间,大小}]} -// GET /api/proj/download?手机号=&编号= → zip 二进制流 -// POST /api/proj/delete {手机号,编号} → {ok} -// 上传前校验会员已注册(huiyuan.json);手机号/编号文件名安全化+防路径穿越; -// 元数据存各项目目录 meta.json(项目名/上传时间/大小)。 -// · 管理页: GET / 或 /admin.html → www/admin.html -var http = require('http'); -var fs = require('fs'); -var path = require('path'); - -// · 监听地址/端口可用环境变量覆盖(Windows 本地默认 127.0.0.1:12701; -// Linux 服务器部署用: MEMBER_HOST=0.0.0.0 MEMBER_PORT=12701 node server.cjs) -var PORT = parseInt(process.env.MEMBER_PORT || '12701', 10); -var HOST = process.env.MEMBER_HOST || '127.0.0.1'; -var ROOT = __dirname; -var DB_FILE = path.join(ROOT, 'huiyuan.json'); -var WWW = path.join(ROOT, 'www'); - -var MIME = { - '.html': 'text/html; charset=utf-8', - '.js': 'application/javascript; charset=utf-8', - '.css': 'text/css; charset=utf-8', - '.json': 'application/json; charset=utf-8', - '.png': 'image/png', - '.ico': 'image/x-icon' -}; - -// ---- 数据读写(原子写:临时文件+rename) ---- -function 读库() { - try { - var d = JSON.parse(fs.readFileSync(DB_FILE, 'utf8')); - if (!Array.isArray(d['会员'])) d['会员'] = []; - return d; - } catch (e) { return { '会员': [] }; } -} -function 写库(data) { - var tmp = DB_FILE + '.tmp'; - fs.writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf8'); - fs.renameSync(tmp, DB_FILE); -} -function 今天加天数(n) { - var d = new Date(Date.now() + n * 86400000); - return d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2); -} - -// ---- 业务 ---- -function 登录(b) { - var db = 读库(); - for (var i = 0; i < db['会员'].length; i++) { - var m = db['会员'][i]; - if (m['手机号'] === b['手机号']) { - if (m['密码'] !== b['密码']) return { ok: false, msg: '密码错误' }; - return { ok: true, 会员类型: m['会员类型'], 有效期: m['有效期'] }; - } - } - return { ok: false, msg: '该手机号未注册' }; -} -function 注册(b) { - if (!b['手机号'] || !b['密码']) return { ok: false, msg: '手机号和密码不能为空' }; - var db = 读库(); - for (var i = 0; i < db['会员'].length; i++) - if (db['会员'][i]['手机号'] === b['手机号']) return { ok: false, msg: '该手机号已注册' }; - db['会员'].push({ - '手机号': b['手机号'], '密码': b['密码'], - '会员类型': '试用会员', '有效期': 今天加天数(30), - '注册时间': 今天加天数(0), '备注': '' - }); - 写库(db); - return { ok: true, msg: '注册成功' }; -} -function 查会员(b) { - var db = 读库(); - for (var i = 0; i < db['会员'].length; i++) { - var m = db['会员'][i]; - if (m['手机号'] === b['手机号']) - return { ok: true, 手机号: m['手机号'], 会员类型: m['会员类型'], 有效期: m['有效期'] }; - } - return { ok: false, msg: '该手机号未注册' }; -} -function 改密(b) { - var db = 读库(); - for (var i = 0; i < db['会员'].length; i++) { - var m = db['会员'][i]; - if (m['手机号'] === b['手机号']) { - if (m['密码'] !== b['旧密码']) return { ok: false, msg: '旧密码错误' }; - if (!b['新密码']) return { ok: false, msg: '新密码不能为空' }; - m['密码'] = b['新密码']; - 写库(db); - return { ok: true }; - } - } - return { ok: false, msg: '该手机号未注册' }; -} - -// ---- 项目云(2026-09-16):数据落 项目云\<手机号安全化>\<编号安全化>\{项目.zip,meta.json} ---- -var PROJ_ROOT = path.join(ROOT, '项目云'); -function 安全名(s) { // 文件名安全化:去掉路径分隔/非法字符,限长 80 - var t = String(s || '').replace(/[\\\/:*?"<>|]/g, '_').replace(/\.\./g, '_').trim(); - if (t.length > 80) t = t.slice(0, 80); - return t; -} -function 会员存在(手机号) { - var db = 读库(); - for (var i = 0; i < db['会员'].length; i++) - if (db['会员'][i]['手机号'] === 手机号) return true; - return false; -} -function 项目目录(手机号, 编号) { // 防穿越:拼好后必须仍在 项目云 下 - var d = path.join(PROJ_ROOT, 安全名(手机号), 安全名(编号)); - return d.indexOf(PROJ_ROOT) === 0 ? d : null; -} -function 列项目(手机号) { - if (!手机号 || !会员存在(手机号)) return { ok: false, msg: '该手机号未注册' }; - var dir = 项目目录(手机号, ''); - var 出 = []; - try { - fs.readdirSync(dir).forEach(function (编号) { - var p = path.join(dir, 编号); - try { - var meta = JSON.parse(fs.readFileSync(path.join(p, 'meta.json'), 'utf8')); - 出.push({ 编号: meta['编号'] || 编号, 名称: meta['名称'] || '', 时间: meta['时间'] || '', 大小: meta['大小'] || 0 }); - } catch (e) { } - }); - } catch (e) { } // 目录不存在=无项目 - return { ok: true, '项目': 出 }; -} - -// ---- HTTP ---- -function sendJson(res, obj) { - res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); - res.end(JSON.stringify(obj)); -} -function readBody(req, cb) { - var chunks = []; - req.on('data', function (c) { chunks.push(c); }); - req.on('end', function () { - try { cb(null, JSON.parse(Buffer.concat(chunks).toString('utf8'))); } - catch (e) { cb(e, null); } - }); -} - -var server = http.createServer(function (req, res) { - var urlPath = decodeURIComponent(req.url.split('?')[0]); - var query = {}; - (req.url.split('?')[1] || '').split('&').forEach(function (kv) { - var p = kv.split('='); - if (p[0]) query[decodeURIComponent(p[0])] = decodeURIComponent((p[1] || '').replace(/\+/g, ' ')); - }); - - // API 路由 - if (urlPath === '/api/login') return readBody(req, function (e, b) { sendJson(res, e ? { ok: false, msg: '参数错误' } : 登录(b || {})); }); - if (urlPath === '/api/register') return readBody(req, function (e, b) { sendJson(res, e ? { ok: false, msg: '参数错误' } : 注册(b || {})); }); - if (urlPath === '/api/member') return sendJson(res, 查会员(query)); - if (urlPath === '/api/changepwd') return readBody(req, function (e, b) { sendJson(res, e ? { ok: false, msg: '参数错误' } : 改密(b || {})); }); - if (urlPath === '/api/list') { - var db = 读库(); - return sendJson(res, { ok: true, '会员': db['会员'] }); - } - if (urlPath === '/api/save') return readBody(req, function (e, b) { - if (e || !b || !Array.isArray(b['会员'])) return sendJson(res, { ok: false, msg: '参数错误' }); - 写库(b); - return sendJson(res, { ok: true }); - }); - - // ---- 项目云路由 ---- - // 上传:body = JSON 文本(项目编号/名称/手机号) + "\n\n" + zip 二进制 - if (urlPath === '/api/proj/upload') { - var chunks = []; - req.on('data', function (c) { chunks.push(c); }); - req.on('end', function () { - var buf = Buffer.concat(chunks); - var sep = buf.indexOf('\n\n'); - if (sep < 0) return sendJson(res, { ok: false, msg: '缺少 JSON 头' }); - var 头 = {}; - try { 头 = JSON.parse(buf.slice(0, sep).toString('utf8')); } catch (e) { return sendJson(res, { ok: false, msg: 'JSON 头解析失败' }); } - var 手机号 = 头['手机号'], 编号 = 头['编号']; - if (!手机号 || !编号) return sendJson(res, { ok: false, msg: '缺少手机号或项目编号' }); - if (!会员存在(手机号)) return sendJson(res, { ok: false, msg: '该手机号未注册' }); - var zip = buf.slice(sep + 2); - if (zip.length < 100) return sendJson(res, { ok: false, msg: 'zip 数据为空或过小' }); - var d = 项目目录(手机号, 编号); - if (!d) return sendJson(res, { ok: false, msg: '路径非法' }); - try { - fs.mkdirSync(d, { recursive: true }); - var tmp = path.join(d, '项目.zip.tmp'); - fs.writeFileSync(tmp, zip); - var 目标 = path.join(d, '项目.zip'); - try { fs.unlinkSync(目标); } catch (e) { } - fs.renameSync(tmp, 目标); - var meta = { 编号: 编号, 名称: 头['名称'] || '', 时间: 头['时间'] || 今天加天数(0), 大小: zip.length }; - var mt = path.join(d, 'meta.json.tmp'); - fs.writeFileSync(mt, JSON.stringify(meta), 'utf8'); - fs.renameSync(mt, path.join(d, 'meta.json')); - return sendJson(res, { ok: true, 编号: 编号, 大小: zip.length, 时间: meta['时间'] }); - } catch (e) { return sendJson(res, { ok: false, msg: '写盘失败: ' + e.message }); } - }); - return; - } - if (urlPath === '/api/proj/list') { - return sendJson(res, 列项目(query['手机号'])); - } - if (urlPath === '/api/proj/download') { - var 手机号 = query['手机号'], 编号 = query['编号']; - var d2 = 手机号 && 编号 ? 项目目录(手机号, 编号) : null; - var zp = d2 ? path.join(d2, '项目.zip') : ''; - if (!d2 || !fs.existsSync(zp)) return sendJson(res, { ok: false, msg: '云上没有该项目' }); - res.writeHead(200, { 'Content-Type': 'application/zip', 'Content-Length': fs.statSync(zp).size }); - fs.createReadStream(zp).pipe(res); - return; - } - if (urlPath === '/api/proj/delete') return readBody(req, function (e, b) { - b = b || {}; - var d3 = b['手机号'] && b['编号'] ? 项目目录(b['手机号'], b['编号']) : null; - if (!d3) return sendJson(res, { ok: false, msg: '参数错误' }); - try { fs.rmSync(d3, { recursive: true, force: true }); return sendJson(res, { ok: true }); } - catch (e2) { return sendJson(res, { ok: false, msg: '删除失败: ' + e2.message }); } - }); - - // 静态文件(管理页) - if (urlPath === '/' || urlPath === '/admin.html') urlPath = '/admin.html'; - var file = path.join(WWW, path.normalize(urlPath).replace(/^([A-Za-z]:)?[\\\/]+/, '')); - if (file.indexOf(WWW) !== 0) { res.writeHead(403); res.end('Forbidden'); return; } - fs.readFile(file, function (err, data) { - if (err) { res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('Not Found: ' + urlPath); return; } - var ext = path.extname(file).toLowerCase(); - res.writeHead(200, { 'Content-Type': MIME[ext] || 'application/octet-stream' }); - res.end(data); - }); -}).listen(PORT, HOST, function () { - console.log('会员系统服务 on http://' + HOST + ':' + PORT + ' root=' + ROOT); -}); diff --git a/会员服务器/t1.json b/会员服务器/t1.json deleted file mode 100644 index 9768901..0000000 --- a/会员服务器/t1.json +++ /dev/null @@ -1 +0,0 @@ -{"手机号": "17625166407", "密码": "123456"} \ No newline at end of file diff --git a/会员服务器/www/admin.html b/会员服务器/www/admin.html deleted file mode 100644 index 2b5f8a8..0000000 --- a/会员服务器/www/admin.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - -会员管理 - - - - -

会员管理

-
- 手机号: - - - - - -
- - - - - -
手机号密码会员类型有效期注册时间备注
- - -

新增会员

-
-
-
- -
-
-
- - -
-
- - - - diff --git a/会员服务器/www/lib-cloud.html b/会员服务器/www/lib-cloud.html deleted file mode 100644 index 5b60f5e..0000000 --- a/会员服务器/www/lib-cloud.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - -库备份管理 - - - - -

库备份管理(方案库/用户库/柜体库/铜排铝排库/企业信息,按手机号)

-
- 手机号: - 或输入: - - -
- - - - - -
库名原始路径备份时间大小操作
- - - - diff --git a/会员服务器/www/xiangmu-cloud.html b/会员服务器/www/xiangmu-cloud.html deleted file mode 100644 index 5484cc2..0000000 --- a/会员服务器/www/xiangmu-cloud.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - -项目云管理 - - - - -

项目云管理(按手机号查看名下云上项目)

-
- 手机号: - 或输入: - - -
- - - - - -
项目编号项目名称上传时间大小操作
- - - - diff --git a/会员服务器/停止会员服务.bat b/会员服务器/停止会员服务.bat deleted file mode 100644 index 1a77b98..0000000 --- a/会员服务器/停止会员服务.bat +++ /dev/null @@ -1,20 +0,0 @@ -@echo off -rem »áԱ·þÎñÆ÷ֹͣ½ű¾ - °´¶˿ڶ¨λ½ø³Ì,²»ÎóɱÆäËû node - GBK ±àÂë,Îð¼Ó chcp -setlocal enabledelayedexpansion -set "FOUND=" -for /f "tokens=5" %%p in ('netstat -ano ^| findstr ":12701" ^| findstr "LISTENING"') do ( - set "FOUND=%%p" -) -if not defined FOUND ( - echo [Ìáʾ] »áԱ·þÎñµ±ǰûÓÐÔÚÔËÐС£ - pause - exit /b 0 -) -echo [ֹͣ] ½áÊø¼àÌý 12701 ¶˿ڵĽø³Ì PID=!FOUND! -taskkill /F /PID !FOUND! >nul 2>nul -if !errorlevel!==0 ( - echo [Íê³É] »áԱ·þÎñÒÑֹͣ¡£ -) else ( - echo [´íÎó] ֹͣʧ°Ü,ÇëÊֶ¯½áÊø PID !FOUND! -) -pause diff --git a/会员服务器/启动会员服务.bat b/会员服务器/启动会员服务.bat deleted file mode 100644 index 4fdaca3..0000000 --- a/会员服务器/启动会员服务.bat +++ /dev/null @@ -1,26 +0,0 @@ -@echo off -rem »áԱ·þÎñÆ÷Æô¶¯½ű¾(˫»÷ÔËÐÐ) - GBK ±àÂë,Îð¼Ó chcp -setlocal -set "DIR=%~dp0" -set "NODEEXE=" -if exist "%DIR%node\node.exe" set "NODEEXE=%DIR%node\node.exe" -if not defined NODEEXE if exist "%DIR%..\cadbt\node\node.exe" set "NODEEXE=%DIR%..\cadbt\node\node.exe" -if not defined NODEEXE if exist "%DIR%..\cadbt\cadbt\bin\Debug\node\node.exe" set "NODEEXE=%DIR%..\cadbt\cadbt\bin\Debug\node\node.exe" -if not defined NODEEXE ( - echo [´íÎó] δÕҵ½ node.exe,ÇëȷÈÏ node Ŀ¼´æÔڡ£ - pause - exit /b 1 -) - -powershell -NoProfile -Command "try{$c=New-Object Net.Sockets.TcpClient;$r=$c.BeginConnect('127.0.0.1',12701,$null,$null);if($r.AsyncWaitHandle.WaitOne(500)){$c.EndConnect($r);exit 0}}catch{};exit 1" >nul 2>nul -if %errorlevel%==0 ( - echo [Ìáʾ] »áԱ·þÎñÒÑÔÚÔËÐÐ: http://127.0.0.1:12701 - start "" "http://127.0.0.1:12701/" - pause - exit /b 0 -) - -echo [Æô¶¯] »áԱ·þÎñÆ÷ http://127.0.0.1:12701 Êý¾ÝÎļþ: %DIR%huiyuan.json -start "" "http://127.0.0.1:12701/" -"%NODEEXE%" "%DIR%server.cjs" -pause diff --git a/会员服务器/项目云/17625166407/20260916001/meta.json b/会员服务器/项目云/17625166407/20260916001/meta.json deleted file mode 100644 index 2a0a6e5..0000000 --- a/会员服务器/项目云/17625166407/20260916001/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"编号":"20260916001","名称":"32131风华绝代","时间":"2026-09-16","大小":1034} \ No newline at end of file diff --git a/会员服务器/项目云/17625166407/LIB_fak方案库(含公式表)/meta.json b/会员服务器/项目云/17625166407/LIB_fak方案库(含公式表)/meta.json deleted file mode 100644 index 3284e76..0000000 --- a/会员服务器/项目云/17625166407/LIB_fak方案库(含公式表)/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"编号":"LIB_fak方案库(含公式表)","名称":"fak方案库(含公式表)|sjk\\fak.db","时间":"2026-09-16","大小":1594} \ No newline at end of file diff --git a/会员服务器/项目云/17625166407/LIB_企业信息.config/meta.json b/会员服务器/项目云/17625166407/LIB_企业信息.config/meta.json deleted file mode 100644 index 56cba00..0000000 --- a/会员服务器/项目云/17625166407/LIB_企业信息.config/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"编号":"LIB_企业信息.config","名称":"企业信息.config|shezhi\\企业信息.config.xml","时间":"2026-09-16","大小":328} \ No newline at end of file diff --git a/会员服务器/项目云/17625166407/LIB_柜体库/meta.json b/会员服务器/项目云/17625166407/LIB_柜体库/meta.json deleted file mode 100644 index 56fd713..0000000 --- a/会员服务器/项目云/17625166407/LIB_柜体库/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"编号":"LIB_柜体库","名称":"柜体库|sjk\\advancedDataGridView10Table.db","时间":"2026-09-16","大小":444} \ No newline at end of file diff --git a/会员服务器/项目云/17625166407/LIB_用户库/meta.json b/会员服务器/项目云/17625166407/LIB_用户库/meta.json deleted file mode 100644 index 9ecbf49..0000000 --- a/会员服务器/项目云/17625166407/LIB_用户库/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"编号":"LIB_用户库","名称":"用户库|sjk\\advancedDataGridView7Table.db","时间":"2026-09-16","大小":8113} \ No newline at end of file diff --git a/会员服务器/项目云/17625166407/LIB_铜排库/meta.json b/会员服务器/项目云/17625166407/LIB_铜排库/meta.json deleted file mode 100644 index db4ede6..0000000 --- a/会员服务器/项目云/17625166407/LIB_铜排库/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"编号":"LIB_铜排库","名称":"铜排库|sjk\\advancedDataGridView8Table.db","时间":"2026-09-16","大小":1148} \ No newline at end of file diff --git a/会员服务器/项目云/17625166407/LIB_铝排库/meta.json b/会员服务器/项目云/17625166407/LIB_铝排库/meta.json deleted file mode 100644 index 54d7635..0000000 --- a/会员服务器/项目云/17625166407/LIB_铝排库/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"编号":"LIB_铝排库","名称":"铝排库|sjk\\advancedDataGridView8Table_LMY.db","时间":"2026-09-16","大小":1152} \ No newline at end of file