chore: 初始开源发布

iotlcm-app:小程序端 + 用户端服务。

- app/:uni-app 小程序前端(基于 unibest,MIT)
  - 微信 AppID → YOUR_WX_APPID,uni-app AppID → __UNI__YOURAPPID
  - 内网后端地址 → admin.iotlcm.example.com
  - 应用标题与 unibest 模板 README 重写(保留上游致谢与 MIT 声明)
- server/:GoFrame 用户端服务(基于 XiuAdmin,Apache-2.0)
  - module xiuadmin → git.5iot.com/iotlcm-public/iotlcm-app(360 文件)
  - 支付回调地址 → app.iotlcm.example.com,商户名与应用名泛化
  - 真实手机号 → 合法 11 位编造号(保留号段前 3 位 + 后 4 位)
  - 依赖号码尾部的断言同步更新
  - 补 server/LICENSE(Apache-2.0)
- 移除内部资产:CI 触发器
- 补根 README,LF 行尾 + .gitattributes

已知:TestSysDept_RefreshDeptAncestors 在源仓同一提交上同样失败,属既有缺陷。
This commit is contained in:
MiFaZhan
2026-10-26 14:01:25 +08:00
commit 2ed5dfa6a1
1013 changed files with 138466 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
import { existsSync, readFileSync } from 'node:fs'
import { resolve } from 'node:path'
import process from 'node:process'
const root = process.cwd()
const expectedPages = [
['business', 'renew', '套餐续费确认'],
['business', 'change', '套餐变更确认'],
['business', 'addon', '订购加油包'],
['business', 'diagnosis', '智能诊断'],
['business', 'workOrder', '工单列表'],
['business', 'workOrderCreate', '提交工单'],
['business', 'workOrderDetail', '工单详情'],
['card', 'detail', '卡片详情'],
['card', 'packageDetail', '套餐详情'],
['message', 'systemDetail', '系统消息详情'],
['message', 'cardDetail', '卡片消息详情'],
['user', 'profile', '账号资料'],
['user', 'realName', '实名信息'],
['user', 'notification', '通知设置'],
['user', 'feedback', '帮助与反馈'],
['user', 'contact', '联系客服'],
['user', 'agreement', '协议与隐私'],
['user', 'about', '关于我们'],
]
for (const [owner, name, title] of expectedPages) {
const file = resolve(root, `src/pages/${owner}/views/${name}/index.vue`)
if (!existsSync(file)) {
throw new Error(`缺少子界面文件:src/pages/${owner}/views/${name}/index.vue`)
}
const source = readFileSync(file, 'utf8')
if (!source.includes('definePage({')) {
throw new Error(`子界面缺少 definePage:${file}`)
}
if (!source.includes(`navigationBarTitleText: '${title}'`)) {
throw new Error(`子界面标题不匹配:${file},期望 ${title}`)
}
}
const entryFiles = [
'src/pages/business/index.vue',
'src/pages/card/components/CardList.vue',
'src/pages/card/components/PackageList.vue',
'src/pages/message/components/MessageList.vue',
'src/pages/user/components/UserServiceCells.vue',
'src/pages/user/components/UserSupportCells.vue',
]
for (const relative of entryFiles) {
const source = readFileSync(resolve(root, relative), 'utf8')
if (!source.includes('RouterPath')) {
throw new Error(`入口未使用 RouterPath 跳转:${relative}`)
}
if (!source.includes('navigateTo')) {
throw new Error(`入口未调用 navigateTo:${relative}`)
}
}
console.log('sub pages checked')