├── .browserslistrc ├── .editorconfig ├── .gitattributes ├── .github └── ISSUE_TEMPLATE │ ├── 1-bug.yml │ ├── 2-feature.yml │ └── config.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .vscode ├── extensions.json └── settings.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── deploy ├── deploy.json └── tsconfig.json ├── docs ├── benchmarking.md ├── faq.md ├── features.md ├── start-app.md ├── start-client.md ├── start-server.md ├── tob.md ├── toc.md ├── 思路.md ├── 本地环境.md └── 流程.md ├── electron-builder.json5 ├── eslint.config.js ├── index.html ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── prettier.config.js ├── public └── favicon.ico ├── script ├── backgroundService.cjs └── urlProtoco.nsh ├── src ├── App.vue ├── api │ ├── deskConfig.ts │ ├── deskUser.ts │ ├── deskVersion.ts │ ├── globalMsg.ts │ ├── inivte.ts │ ├── loginRecord.ts │ ├── screenWall.ts │ └── ws.ts ├── assets │ ├── css │ │ ├── constant.scss │ │ ├── main.css │ │ └── main.scss │ ├── img │ │ ├── arrow_down.png │ │ ├── button-back.png │ │ ├── button-home.png │ │ ├── button-menu.png │ │ ├── check.png │ │ ├── clipboard.png │ │ ├── connect.png │ │ ├── copy.png │ │ ├── edit.png │ │ ├── exit.png │ │ ├── fullscreen.png │ │ ├── link.png │ │ ├── logo.png │ │ ├── message.png │ │ ├── my-wechat.png │ │ ├── refresh.png │ │ ├── screenshot.png │ │ ├── setting.png │ │ ├── sync.png │ │ ├── system-close.png │ │ ├── system-min.png │ │ ├── view.png │ │ ├── view_off.png │ │ ├── volume-down.png │ │ ├── volume-up.png │ │ └── volume.png │ └── readme_img │ │ ├── 111.png │ │ ├── 222.png │ │ ├── 333.png │ │ ├── 444.png │ │ ├── 555.png │ │ ├── 666.png │ │ ├── 777.png │ │ ├── 888.png │ │ ├── wechat_group1.jpg │ │ ├── wechat_group2.jpg │ │ ├── wechat_group3-1.jpg │ │ ├── wechat_group3.jpg │ │ ├── wechat_group4-1.jpg │ │ └── wechat_group4.jpg ├── components │ ├── DisableModal │ │ └── index.vue │ ├── Dropdown │ │ └── index.vue │ ├── GlobalMsgModal │ │ └── index.vue │ ├── Modal │ │ └── index.vue │ ├── NaiveMessage │ │ └── index.vue │ ├── NaiveModal │ │ └── index.vue │ ├── NaiveNotification │ │ └── index.vue │ ├── UpdateModal │ │ └── index.vue │ └── icons │ │ ├── VPIconChevronDown.vue │ │ └── VPIconExternalLink.vue ├── constant.ts ├── interface.ts ├── layout │ └── index.vue ├── main.ts ├── pure-constant.ts ├── pure-interface.ts ├── router │ └── index.ts └── spec-config.ts ├── test ├── BilldDesk.cpp ├── aa.js ├── test.html ├── test.js ├── test.json └── test.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 version 3 | not dead 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | # 控制编辑器代码规范,如按下回车的时候,缩进几个空格等等。 3 | # 最顶层的EditorConfig文件 4 | root = true 5 | 6 | [*] 7 | charset = utf-8 8 | indent_style = space # 缩进样式为空格,也可以设置成:tab 9 | indent_size = 2 # 一个缩进2个空格 10 | # tab_width默认为indent_size的值,通常不需要指定。 11 | end_of_line = lf # 结尾符,也可以设置成:crlf 12 | insert_final_newline = true # 设置为true以确保文件在保存时以换行符结尾,设置为false以确保文件不以换行符号结尾。 13 | trim_trailing_whitespace = true # 设置为true以删除换行符之前的任何空白字符,设置为false以确保不会。 14 | 15 | [*.md] 16 | insert_final_newline = false 17 | trim_trailing_whitespace = false 18 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/1-bug.yml: -------------------------------------------------------------------------------- 1 | name: "\U0001F41E BilldDesk问题反馈" 2 | description: 欢迎提出你遇到的问题! 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: | 7 | **强烈建议主控和被控使用同一个版本!** 8 | **如果你使用浏览器作为主控/被控,强烈建议使用:[Chrome浏览器](https://www.google.com/intl/zh-CN/chrome/) / [Via浏览器](https://viayoo.com) / `Safari浏览器`** 9 | - type: input 10 | id: app1 11 | attributes: 12 | label: BilldDesk主控端 13 | description: | 14 | web电脑网页端、web手机网页端、安卓端、win客户端、mac客户端... 15 | placeholder: web电脑网页端 16 | validations: 17 | required: true 18 | - type: input 19 | id: version1 20 | attributes: 21 | label: BilldDesk主控端版本 22 | placeholder: 0.24.0 23 | validations: 24 | required: true 25 | - type: input 26 | id: env1 27 | attributes: 28 | label: 主控端环境 29 | description: | 30 | 如果你使用浏览器:电脑火狐浏览器、电脑edge浏览器、手机via浏览器、手机Safari浏览器... 31 | 32 | 如果你使用pc客户端:win7、win10、win11、macos... 33 | 34 | 如果你使用安卓端:安卓11、安卓12、安卓13、安卓14、安卓15... 35 | placeholder: 手机via浏览器 36 | validations: 37 | required: true 38 | - type: input 39 | id: app2 40 | attributes: 41 | label: BilldDesk被控端 42 | description: | 43 | web电脑网页端、web手机网页端、安卓端、win客户端、mac客户端... 44 | placeholder: win客户端 45 | validations: 46 | required: true 47 | - type: input 48 | id: version2 49 | attributes: 50 | label: BilldDesk被控端版本 51 | placeholder: 0.25.0 52 | validations: 53 | required: true 54 | - type: input 55 | id: env2 56 | attributes: 57 | label: 被控端环境 58 | description: | 59 | 如果你使用浏览器:电脑火狐浏览器、电脑edge浏览器、手机via浏览器、手机Safari浏览器... 60 | 61 | 如果你使用pc客户端:win7、win10、win11、macos... 62 | 63 | 如果你使用安卓端:安卓11、安卓12、安卓13、安卓14、安卓15... 64 | placeholder: 安卓12 65 | validations: 66 | required: true 67 | - type: textarea 68 | id: problem1 69 | attributes: 70 | label: 你遇到的问题是什么? 71 | placeholder: 详细描述你遇到的问题 72 | validations: 73 | required: true 74 | - type: textarea 75 | id: problem2 76 | attributes: 77 | label: 你期望的结果是什么? 78 | placeholder: 详细描述你期望的结果 79 | validations: 80 | required: true 81 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/2-feature.yml: -------------------------------------------------------------------------------- 1 | name: "\U0001F680 BilldDesk功能建议" 2 | description: 欢迎提出你的想法! 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: | 7 | **BilldDesk自2024年2月底开始开发,经过不断迭代升级,逐步趋向完善!** 8 | - type: textarea 9 | id: feat 10 | attributes: 11 | label: 请说出你的想法 12 | placeholder: 详细描述你的想法 13 | validations: 14 | required: true 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: BilldDesk在线远程 4 | url: https://desk.hsslive.cn 5 | about: 网页远程控制客户端/手机端! 6 | - name: BilldDesk最新版下载 7 | url: https://desk.hsslive.cn/#/download 8 | about: 遇到问题,先看看版本是不是最新的,优先使用最新版! 9 | - name: BilldDesk官方交流群 10 | url: https://desk.hsslive.cn/#/officialGroup 11 | about: 欢迎进群交流! 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | components.d.ts 4 | auto-imports.d.ts 5 | .DS_Store 6 | .eslintcache 7 | deploy/index.js 8 | deploy/index.cjs 9 | electron-release 10 | electron-dist 11 | build/output/ 12 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | # 将所有依赖提升到最外层 2 | shamefully-hoist=true 3 | 4 | # 设置淘宝镜像 5 | registry=https://registry.npmmirror.com/ 6 | 7 | # 设置@billd*包使用的镜像 8 | @billd:registry=https://registry.hsslive.cn/ 9 | 10 | # https://sharp.pixelplumbing.com/install#chinese-mirror 11 | sharp_binary_host=https://npmmirror.com/mirrors/sharp 12 | sharp_libvips_binary_host=https://npmmirror.com/mirrors/sharp-libvips 13 | 14 | canvas_binary_host_mirror=https://npmmirror.com/mirrors/canvas 15 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | pnpm-lock.yaml 3 | dist 4 | components.d.ts 5 | .eslintcache 6 | .DS_Store 7 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"], 3 | "unwantedRecommendations": [ 4 | "octref.vetur", 5 | "Vue.vscode-typescript-vue-plugin" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | // 指定行尾序列为\n(LF)或者\r\n(CRLF)或者auto 3 | // "files.eol": "\n", 4 | 5 | // "files.exclude": { 6 | // "electron-dist": true, 7 | // "electron-release": true 8 | // }, 9 | 10 | // 在保存时格式化 11 | "editor.formatOnSave": true, 12 | 13 | // 保存时进行一些操作 14 | "editor.codeActionsOnSave": { 15 | "source.fixAll.eslint": "explicit", 16 | "source.organizeImports": "explicit" 17 | }, 18 | 19 | // "eslint.autoFixOnSave": true, // 废弃,使用editor.codeActionsOnSave替代 20 | 21 | // Path Autocomplete,这个插件能够支持路径补全,默认vsc默认的路径提示可能不会提示一些css或者jpg等资源,用这个插件可以完善vscode的路径提示 22 | // 主要作用是你输入@、components、layouts的时候,会有路径提示 23 | "path-autocomplete.pathMappings": { 24 | "@": "${folder}/src", 25 | "components": "${folder}/src/components", 26 | "layouts": "${folder}/src/layouts" 27 | }, 28 | 29 | // 别名路径跳转,这个插件可以完善vscode的跳转 30 | "alias-skip.allowedsuffix": [ 31 | "css", 32 | "less", 33 | "sass", 34 | "scss", 35 | "png", 36 | "jpg", 37 | "jpeg", 38 | "webp", 39 | "gif", 40 | "svg", 41 | "js", 42 | "jsx", 43 | "ts", 44 | "tsx", 45 | "vue" 46 | ], 47 | "typescript.tsdk": "node_modules/typescript/lib" 48 | } 49 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | ## [0.28.0](https://github.com/billd-project/billd-desk-pro/compare/v0.27.0...v0.28.0) (2025-05-27) 6 | 7 | ## [0.27.0](https://github.com/billd-project/billd-desk-pro/compare/v0.26.0...v0.27.0) (2025-05-26) 8 | 9 | ## [0.26.0](https://github.com/billd-project/billd-desk-pro/compare/v0.25.0...v0.26.0) (2025-05-26) 10 | 11 | 12 | ### Bug Fixes 13 | 14 | * 完善 ([aecbfba](https://github.com/billd-project/billd-desk-pro/commit/aecbfba2af7dbbd803502c0ac221ce91dcef3f8e)) 15 | * 完善 ([5245f54](https://github.com/billd-project/billd-desk-pro/commit/5245f542fdfe7da7f5cfbb5fa7a2afd978e3df14)) 16 | 17 | ## [0.25.0](https://github.com/billd-project/billd-desk-pro/compare/v0.24.0...v0.25.0) (2025-05-24) 18 | 19 | 20 | ### Bug Fixes 21 | 22 | * 保存 ([dbf40be](https://github.com/billd-project/billd-desk-pro/commit/dbf40be1b117327a59f560c91aeb64266d0b57ec)) 23 | * 修复窗口卡主问题 ([894f0af](https://github.com/billd-project/billd-desk-pro/commit/894f0af10dfd3b67740fc7526190bc751bce8f2e)) 24 | 25 | ## [0.24.0](https://github.com/billd-project/billd-desk-pro/compare/v0.23.0...v0.24.0) (2025-05-14) 26 | 27 | ## [0.23.0](https://github.com/billd-project/billd-desk-pro/compare/v0.22.0...v0.23.0) (2025-05-14) 28 | 29 | 30 | ### Features 31 | 32 | * 新增部分功能 ([7b04632](https://github.com/billd-project/billd-desk-pro/commit/7b04632f993f6a654228efd75b054dd34d48e13f)) 33 | 34 | 35 | ### Bug Fixes 36 | 37 | * 保存 ([a360c11](https://github.com/billd-project/billd-desk-pro/commit/a360c115030b931db49bb4bbc3c802398df1b3a5)) 38 | 39 | ## [0.22.0](https://github.com/billd-project/billd-desk-pro/compare/v0.21.0...v0.22.0) (2025-05-10) 40 | 41 | 42 | ### Bug Fixes 43 | 44 | * 保存 ([9f2911f](https://github.com/billd-project/billd-desk-pro/commit/9f2911f6274ebc4047602f7c422869a0c54a6689)) 45 | * 优化 ([a2580ec](https://github.com/billd-project/billd-desk-pro/commit/a2580ecaaebb4c41162972fa549ecff84ef6216b)) 46 | * 优化 ([e6b33c8](https://github.com/billd-project/billd-desk-pro/commit/e6b33c82d4cd3f7b6a08368c23833e32eb570ebb)) 47 | 48 | ## [0.21.0](https://github.com/billd-project/billd-desk-pro/compare/v0.20.0...v0.21.0) (2025-05-08) 49 | 50 | ## [0.20.0](https://github.com/billd-project/billd-desk-pro/compare/v0.19.0...v0.20.0) (2025-05-07) 51 | 52 | 53 | ### Bug Fixes 54 | 55 | * 保存 ([17c0d03](https://github.com/billd-project/billd-desk-pro/commit/17c0d03b66b9e8dba77f0628fb53f416f33dbfdd)) 56 | 57 | ## [0.19.0](https://github.com/billd-project/billd-desk-pro/compare/v0.18.0...v0.19.0) (2025-05-06) 58 | 59 | 60 | ### Bug Fixes 61 | 62 | * 优化 ([742fbc9](https://github.com/billd-project/billd-desk-pro/commit/742fbc9dbaed96ca2e703eeb7257928406ed1e98)) 63 | 64 | ## [0.18.0](https://github.com/billd-project/billd-desk-pro/compare/v0.17.0...v0.18.0) (2025-05-06) 65 | 66 | ## [0.17.0](https://github.com/billd-project/billd-desk-pro/compare/v0.16.0...v0.17.0) (2025-05-06) 67 | 68 | 69 | ### Bug Fixes 70 | 71 | * 优化架构 ([4d2ad7e](https://github.com/billd-project/billd-desk-pro/commit/4d2ad7e24990e34f1a2d7a819c12f77951a5810b)) 72 | 73 | ## [0.16.0](https://github.com/billd-project/billd-desk-pro/compare/v0.15.0...v0.16.0) (2025-04-30) 74 | 75 | 76 | ### Bug Fixes 77 | 78 | * 完善基建 ([ee94865](https://github.com/billd-project/billd-desk-pro/commit/ee94865adff589137576cf805cc36aafeea97b78)) 79 | 80 | ## [0.15.0](https://github.com/billd-project/billd-desk-pro/compare/v0.14.0...v0.15.0) (2025-04-27) 81 | 82 | 83 | ### Bug Fixes 84 | 85 | * 自定义设备码 ([b50bbd2](https://github.com/billd-project/billd-desk-pro/commit/b50bbd2d2a0db0a7a38125c6b80f361a2a212061)) 86 | 87 | ## [0.14.0](https://github.com/billd-project/billd-desk-pro/compare/v0.13.0...v0.14.0) (2025-04-26) 88 | 89 | 90 | ### Bug Fixes 91 | 92 | * 优化 ([3c92788](https://github.com/billd-project/billd-desk-pro/commit/3c9278828f9718358cec6b7b663ea0a2bcd38a6b)) 93 | 94 | ## [0.13.0](https://github.com/billd-project/billd-desk-pro/compare/v0.12.0...v0.13.0) (2025-04-26) 95 | 96 | 97 | ### Bug Fixes 98 | 99 | * 兼容网页移动端 ([20a0005](https://github.com/billd-project/billd-desk-pro/commit/20a000517f5c6ad45db25626009b68ed32a2e76d)) 100 | 101 | ## [0.12.0](https://github.com/billd-project/billd-desk-pro/compare/v0.11.0...v0.12.0) (2025-04-25) 102 | 103 | 104 | ### Bug Fixes 105 | 106 | * 优化 ([4248f85](https://github.com/billd-project/billd-desk-pro/commit/4248f85906ad77512cb1514ab7b7924aee826948)) 107 | 108 | ## [0.11.0](https://github.com/billd-project/billd-desk-pro/compare/v0.10.0...v0.11.0) (2025-04-22) 109 | 110 | 111 | ### Bug Fixes 112 | 113 | * 优化 ([7a0e30d](https://github.com/billd-project/billd-desk-pro/commit/7a0e30d84039e2d8a863fe0df9f2d37498212d37)) 114 | 115 | ## [0.10.0](https://github.com/billd-project/billd-desk-pro/compare/v0.9.0...v0.10.0) (2025-04-21) 116 | 117 | 118 | ### Bug Fixes 119 | 120 | * 消息中心 ([59bdd31](https://github.com/billd-project/billd-desk-pro/commit/59bdd31f9f34af5f540bf8d77ca8c99d8912afaf)) 121 | * 优化 ([37d1896](https://github.com/billd-project/billd-desk-pro/commit/37d18967c54e6468bfb07cd49359bf2a2a2758e9)) 122 | 123 | ## [0.9.0](https://github.com/billd-project/billd-desk-pro/compare/v0.8.0...v0.9.0) (2025-04-19) 124 | 125 | 126 | ### Features 127 | 128 | * 优化 ([776797f](https://github.com/billd-project/billd-desk-pro/commit/776797f547183a02c453ae05d8a0a1416d3d3c83)) 129 | 130 | 131 | ### Bug Fixes 132 | 133 | * 完善代码 ([a1c20fd](https://github.com/billd-project/billd-desk-pro/commit/a1c20fd1869abc1e213c5b2942a0adfbbc5b4ba7)) 134 | * 优化 ([7994386](https://github.com/billd-project/billd-desk-pro/commit/799438669646c6637d99557a3ce7fe56c6fc7f30)) 135 | * 优化 ([9a74bc5](https://github.com/billd-project/billd-desk-pro/commit/9a74bc51e3004c8d272089f311f63d45ae53d480)) 136 | * 支持移动端 ([ece2624](https://github.com/billd-project/billd-desk-pro/commit/ece26242783a68ff4d73fe77a113253d42112be5)) 137 | * readme ([6c4715d](https://github.com/billd-project/billd-desk-pro/commit/6c4715d8f1dd537e255f147deef67c24bc500b88)) 138 | 139 | ## [0.8.0](https://github.com/billd-project/billd-desk-pro/compare/v0.7.0...v0.8.0) (2025-04-08) 140 | 141 | 142 | ### Bug Fixes 143 | 144 | * 右键 ([eb6fd7f](https://github.com/billd-project/billd-desk-pro/commit/eb6fd7ff6a041a5a128a99d41e068c2a034fe256)) 145 | 146 | ## [0.7.0](https://github.com/billd-project/billd-desk-pro/compare/v0.6.0...v0.7.0) (2025-04-08) 147 | 148 | 149 | ### Bug Fixes 150 | 151 | * 屏幕前 ([b64f6a2](https://github.com/billd-project/billd-desk-pro/commit/b64f6a2064413400749c03c0d55b7a76077aca1a)) 152 | 153 | ## [0.6.0](https://github.com/billd-project/billd-desk-pro/compare/v0.5.0...v0.6.0) (2025-04-08) 154 | 155 | ## [0.5.0](https://github.com/billd-project/billd-desk-pro/compare/v0.4.0...v0.5.0) (2025-04-08) 156 | 157 | ## [0.4.0](https://github.com/billd-project/billd-desk-pro/compare/v0.3.0...v0.4.0) (2025-04-08) 158 | 159 | ## [0.3.0](https://github.com/billd-project/billd-desk-pro/compare/v0.2.0...v0.3.0) (2025-04-08) 160 | 161 | ## [0.2.0](https://github.com/billd-project/billd-desk-pro/compare/v0.1.88...v0.2.0) (2025-04-08) 162 | 163 | 164 | ### Bug Fixes 165 | 166 | * 优化 ([30370ea](https://github.com/billd-project/billd-desk-pro/commit/30370ea5f9325eb8ee8344ea61cb3448fd6574da)) 167 | * 优化 ([951b4c6](https://github.com/billd-project/billd-desk-pro/commit/951b4c61b6a83cd5e54de310c5deafc24bd464be)) 168 | 169 | ### [0.1.88](https://github.com/billd-project/billd-desk-pro/compare/v0.1.87...v0.1.88) (2025-03-28) 170 | 171 | 172 | ### Bug Fixes 173 | 174 | * 优化 ([2276506](https://github.com/billd-project/billd-desk-pro/commit/22765066b7941e708bd7e1f1d3b59b72e972490a)) 175 | 176 | ### [0.1.87](https://github.com/billd-project/billd-desk-pro/compare/v0.1.86...v0.1.87) (2025-03-28) 177 | 178 | 179 | ### Bug Fixes 180 | 181 | * 删除无用 ([59074b1](https://github.com/billd-project/billd-desk-pro/commit/59074b1fe6bfd466c52a81e3ffd7b2ba6113ed60)) 182 | * 完善版本 ([3722dd0](https://github.com/billd-project/billd-desk-pro/commit/3722dd07f7038e0e7717a369c51383c749c240b8)) 183 | * 优化代码 ([27a5618](https://github.com/billd-project/billd-desk-pro/commit/27a5618608427f646dbf2a1ceccd7881349fb561)) 184 | 185 | ### [0.1.86](https://github.com/billd-project/billd-desk-pro/compare/v0.1.85...v0.1.86) (2025-03-28) 186 | 187 | ### [0.1.85](https://github.com/billd-project/billd-desk-pro/compare/v0.1.84...v0.1.85) (2025-03-28) 188 | 189 | ### [0.1.84](https://github.com/billd-project/billd-desk-pro/compare/v0.1.83...v0.1.84) (2025-03-28) 190 | 191 | ### [0.1.83](https://github.com/billd-project/billd-desk-pro/compare/v0.1.82...v0.1.83) (2025-03-28) 192 | 193 | ### [0.1.82](https://github.com/billd-project/billd-desk-pro/compare/v0.1.81...v0.1.82) (2025-03-28) 194 | 195 | ### [0.1.81](https://github.com/billd-project/billd-desk-pro/compare/v0.1.80...v0.1.81) (2025-03-28) 196 | 197 | ### [0.1.80](https://github.com/billd-project/billd-desk-pro/compare/v0.1.79...v0.1.80) (2025-03-28) 198 | 199 | ### [0.1.79](https://github.com/billd-project/billd-desk-pro/compare/v0.1.78...v0.1.79) (2025-03-28) 200 | 201 | ### [0.1.78](https://github.com/billd-project/billd-desk-pro/compare/v0.1.77...v0.1.78) (2025-03-28) 202 | 203 | ### [0.1.77](https://github.com/billd-project/billd-desk-pro/compare/v0.1.76...v0.1.77) (2025-03-27) 204 | 205 | ### [0.1.76](https://github.com/billd-project/billd-desk-pro/compare/v0.1.75...v0.1.76) (2025-03-27) 206 | 207 | ### [0.1.75](https://github.com/billd-project/billd-desk-pro/compare/v0.1.74...v0.1.75) (2025-03-27) 208 | 209 | ### [0.1.74](https://github.com/billd-project/billd-desk-pro/compare/v0.1.73...v0.1.74) (2025-03-27) 210 | 211 | 212 | ### Bug Fixes 213 | 214 | * 修复架构 ([72fc2d6](https://github.com/billd-project/billd-desk-pro/commit/72fc2d6bad0a94b19ba32bf64d49937e3aca0b9b)) 215 | 216 | ### [0.1.73](https://github.com/billd-project/billd-desk-pro/compare/v0.1.72...v0.1.73) (2025-03-26) 217 | 218 | ### [0.1.72](https://github.com/billd-project/billd-desk-pro/compare/v0.1.71...v0.1.72) (2025-03-26) 219 | 220 | 221 | ### Bug Fixes 222 | 223 | * 优化 ([98f1fdd](https://github.com/billd-project/billd-desk-pro/commit/98f1fddc9f1240142bae8cbecd9fe5017accf6f6)) 224 | * 优化架构 ([d29c0b2](https://github.com/billd-project/billd-desk-pro/commit/d29c0b22b3ba20c9f5442e1b73c3f353215925a6)) 225 | 226 | ### [0.1.71](https://github.com/billd-project/billd-desk-pro/compare/v0.1.70...v0.1.71) (2025-03-24) 227 | 228 | 229 | ### Bug Fixes 230 | 231 | * 保存 ([a34e3df](https://github.com/billd-project/billd-desk-pro/commit/a34e3df4606d34e7d88cb0cc780e723f8603a6b9)) 232 | * 优化架构 ([9c42f17](https://github.com/billd-project/billd-desk-pro/commit/9c42f17ef0654b57ea111428363516c026883bad)) 233 | 234 | ### [0.1.70](https://github.com/billd-project/billd-desk-pro/compare/v0.1.69...v0.1.70) (2025-03-21) 235 | 236 | 237 | ### Bug Fixes 238 | 239 | * 邀请 ([b11963e](https://github.com/billd-project/billd-desk-pro/commit/b11963e7e3ca5053a91ac7ac520b411b08f34f26)) 240 | 241 | ### [0.1.69](https://github.com/billd-project/billd-desk-pro/compare/v0.1.68...v0.1.69) (2025-03-20) 242 | 243 | 244 | ### Bug Fixes 245 | 246 | * 优化 ([63fb9d4](https://github.com/billd-project/billd-desk-pro/commit/63fb9d472b18a8543e3ae1eeb8f808fca8e75b6e)) 247 | 248 | ### [0.1.68](https://github.com/billd-project/billd-desk-pro/compare/v0.1.67...v0.1.68) (2025-03-20) 249 | 250 | 251 | ### Bug Fixes 252 | 253 | * 优化 ([9f12880](https://github.com/billd-project/billd-desk-pro/commit/9f128804cb9451fc02d4ffc5990d2bc22d8381ff)) 254 | 255 | ### [0.1.67](https://github.com/billd-project/billd-desk-pro/compare/v0.1.66...v0.1.67) (2025-03-20) 256 | 257 | 258 | ### Bug Fixes 259 | 260 | * 优化 ([9344e5e](https://github.com/billd-project/billd-desk-pro/commit/9344e5e15d35d275a2f9a31a5400bda1d0cb340e)) 261 | 262 | ### [0.1.66](https://github.com/billd-project/billd-desk-pro/compare/v0.1.65...v0.1.66) (2025-03-20) 263 | 264 | ### [0.1.65](https://github.com/billd-project/billd-desk-pro/compare/v0.1.60...v0.1.65) (2025-03-20) 265 | 266 | 267 | ### Features 268 | 269 | * 保存 ([6b92438](https://github.com/billd-project/billd-desk-pro/commit/6b92438af5e406d59b1d776b86808e28e98be741)) 270 | 271 | 272 | ### Bug Fixes 273 | 274 | * 优化 ([383a1ce](https://github.com/billd-project/billd-desk-pro/commit/383a1cea17a91fed1a12c1b76b26b7b40da7ab66)) 275 | 276 | ### [0.1.64](https://github.com/billd-project/billd-desk-pro/compare/v0.1.60...v0.1.64) (2025-03-20) 277 | 278 | 279 | ### Features 280 | 281 | * 保存 ([6b92438](https://github.com/billd-project/billd-desk-pro/commit/6b92438af5e406d59b1d776b86808e28e98be741)) 282 | 283 | 284 | ### Bug Fixes 285 | 286 | * 优化 ([383a1ce](https://github.com/billd-project/billd-desk-pro/commit/383a1cea17a91fed1a12c1b76b26b7b40da7ab66)) 287 | 288 | ### [0.1.63](https://github.com/billd-project/billd-desk-pro/compare/v0.1.60...v0.1.63) (2025-03-20) 289 | 290 | 291 | ### Features 292 | 293 | * 保存 ([6b92438](https://github.com/billd-project/billd-desk-pro/commit/6b92438af5e406d59b1d776b86808e28e98be741)) 294 | 295 | 296 | ### Bug Fixes 297 | 298 | * 优化 ([383a1ce](https://github.com/billd-project/billd-desk-pro/commit/383a1cea17a91fed1a12c1b76b26b7b40da7ab66)) 299 | 300 | ### [0.1.62](https://github.com/billd-project/billd-desk-pro/compare/v0.1.60...v0.1.62) (2025-03-20) 301 | 302 | 303 | ### Features 304 | 305 | * 保存 ([6b92438](https://github.com/billd-project/billd-desk-pro/commit/6b92438af5e406d59b1d776b86808e28e98be741)) 306 | 307 | 308 | ### Bug Fixes 309 | 310 | * 优化 ([383a1ce](https://github.com/billd-project/billd-desk-pro/commit/383a1cea17a91fed1a12c1b76b26b7b40da7ab66)) 311 | 312 | ### [0.1.61](https://github.com/billd-project/billd-desk-pro/compare/v0.1.60...v0.1.61) (2025-03-20) 313 | 314 | 315 | ### Features 316 | 317 | * 保存 ([6b92438](https://github.com/billd-project/billd-desk-pro/commit/6b92438af5e406d59b1d776b86808e28e98be741)) 318 | 319 | 320 | ### Bug Fixes 321 | 322 | * 优化 ([383a1ce](https://github.com/billd-project/billd-desk-pro/commit/383a1cea17a91fed1a12c1b76b26b7b40da7ab66)) 323 | 324 | ### [0.1.60](https://github.com/billd-project/billd-desk-pro/compare/v0.1.59...v0.1.60) (2025-03-16) 325 | 326 | 327 | ### Bug Fixes 328 | 329 | * 保存 ([506743e](https://github.com/billd-project/billd-desk-pro/commit/506743e7c6188840d0ac4d93ee8e5f90a6fed826)) 330 | 331 | ### [0.1.59](https://github.com/billd-project/billd-desk-pro/compare/v0.1.58...v0.1.59) (2025-03-16) 332 | 333 | ### [0.1.58](https://github.com/billd-project/billd-desk-pro/compare/v0.1.57...v0.1.58) (2025-03-16) 334 | 335 | ### [0.1.57](https://github.com/billd-project/billd-desk-pro/compare/v0.1.56...v0.1.57) (2025-03-16) 336 | 337 | ### [0.1.56](https://github.com/billd-project/billd-desk-pro/compare/v0.1.55...v0.1.56) (2025-03-16) 338 | 339 | ### [0.1.55](https://github.com/billd-project/billd-desk-pro/compare/v0.1.54...v0.1.55) (2025-03-16) 340 | 341 | ### [0.1.54](https://github.com/billd-project/billd-desk-pro/compare/v0.1.53...v0.1.54) (2025-03-16) 342 | 343 | ### [0.1.53](https://github.com/billd-project/billd-desk-pro/compare/v0.1.52...v0.1.53) (2025-03-16) 344 | 345 | ### [0.1.52](https://github.com/billd-project/billd-desk-pro/compare/v0.1.51...v0.1.52) (2025-03-16) 346 | 347 | 348 | ### Bug Fixes 349 | 350 | * 保存 ([a068e5d](https://github.com/billd-project/billd-desk-pro/commit/a068e5d3575ee669360cc5152bdd60a13a641aea)) 351 | * 定价 ([c3753f4](https://github.com/billd-project/billd-desk-pro/commit/c3753f44c8ec3e5965a73d1dafc8dc89d66f3b88)) 352 | * 配置调整 ([334124f](https://github.com/billd-project/billd-desk-pro/commit/334124fe780dbc004ab32a6dd5bc1dec974cf2d1)) 353 | * 文字 ([a7398db](https://github.com/billd-project/billd-desk-pro/commit/a7398db0f9dbbffcfc86462073feda4d7ea86a1f)) 354 | * 优化 ([29abbc9](https://github.com/billd-project/billd-desk-pro/commit/29abbc9f54f2ca4d3fdcfe16979f65a80a896cda)) 355 | * 优化 ([167b4ac](https://github.com/billd-project/billd-desk-pro/commit/167b4ac044aa57a3c98bf51eb0f62f7271999f29)) 356 | * deploy ([3515ce6](https://github.com/billd-project/billd-desk-pro/commit/3515ce61736aa73187e6e77f7bdb9ed15deb548d)) 357 | * release ([9752c0f](https://github.com/billd-project/billd-desk-pro/commit/9752c0f6260dbb3858a4d6776e711102b0de444d)) 358 | 359 | ### [0.1.51](https://github.com/billd-project/billd-desk-pro/compare/v0.1.50...v0.1.51) (2025-02-13) 360 | 361 | 362 | ### Features 363 | 364 | * 浏览器打开客户端 ([a505f90](https://github.com/billd-project/billd-desk-pro/commit/a505f90d12ab374370199f7f300ce68417ac8d57)) 365 | * 同步仓库 ([341b578](https://github.com/billd-project/billd-desk-pro/commit/341b5786a5d3ff9486ecd6bd3f9b45a1d3a3e3a1)) 366 | 367 | ### [0.1.50](https://github.com/billd-project/billd-desk-pro/compare/v0.1.49...v0.1.50) (2025-02-05) 368 | 369 | ### [0.1.49](https://github.com/billd-project/billd-desk-pro/compare/v0.1.48...v0.1.49) (2025-02-05) 370 | 371 | ### [0.1.48](https://github.com/billd-project/billd-desk-pro/compare/v0.1.47...v0.1.48) (2025-02-05) 372 | 373 | ### [0.1.47](https://github.com/billd-project/billd-desk-pro/compare/v0.1.46...v0.1.47) (2025-02-05) 374 | 375 | 376 | ### Bug Fixes 377 | 378 | * 稳定 ([1156eec](https://github.com/billd-project/billd-desk-pro/commit/1156eec74974ff7f304727ed0d5f36ce6a757807)) 379 | * 优化 ([b1940ce](https://github.com/billd-project/billd-desk-pro/commit/b1940ce9e59a6938fb1d0d038d7d3672cad1bd0d)) 380 | * 优化 ([d7d65c1](https://github.com/billd-project/billd-desk-pro/commit/d7d65c1578c07438dc86e12da4d5480e54390fe9)) 381 | * 优化 ([022dba1](https://github.com/billd-project/billd-desk-pro/commit/022dba10693d9acd702265efa16307f17849f75b)) 382 | * 优化 ([9f030c7](https://github.com/billd-project/billd-desk-pro/commit/9f030c72a673b27316ffbece995bbc7d84ab0f17)) 383 | * 优化 ([d029fd3](https://github.com/billd-project/billd-desk-pro/commit/d029fd38bf1e8ce1a115d5cae7f8e9e4d75543c2)) 384 | * 优化 ([aba04b1](https://github.com/billd-project/billd-desk-pro/commit/aba04b167a3db169a05018c9620bf923f555fafa)) 385 | * 优化 ([c7ca68a](https://github.com/billd-project/billd-desk-pro/commit/c7ca68a1f7783d4e4fac29e2dad8069e36851bde)) 386 | * 优化 ([0e2fe65](https://github.com/billd-project/billd-desk-pro/commit/0e2fe654358615eb02ca92411a600c78165f386c)) 387 | * 优化 ([e76dbae](https://github.com/billd-project/billd-desk-pro/commit/e76dbaea80ae688a9be351a50fffd31cfafa93b5)) 388 | 389 | ### [0.1.46](https://github.com/billd-project/billd-desk-pro/compare/v0.1.45...v0.1.46) (2024-12-28) 390 | 391 | ### [0.1.45](https://github.com/billd-project/billd-desk-pro/compare/v0.1.44...v0.1.45) (2024-12-27) 392 | 393 | ### [0.1.44](https://github.com/billd-project/billd-desk-pro/compare/v0.1.43...v0.1.44) (2024-12-27) 394 | 395 | ### [0.1.43](https://github.com/billd-project/billd-desk-pro/compare/v0.1.42...v0.1.43) (2024-12-27) 396 | 397 | ### [0.1.42](https://github.com/billd-project/billd-desk-pro/compare/v0.1.41...v0.1.42) (2024-12-27) 398 | 399 | ### [0.1.41](https://github.com/billd-project/billd-desk-pro/compare/v0.1.40...v0.1.41) (2024-12-27) 400 | 401 | ### [0.1.40](https://github.com/billd-project/billd-desk-pro/compare/v0.1.39...v0.1.40) (2024-12-27) 402 | 403 | ### [0.1.39](https://github.com/billd-project/billd-desk-pro/compare/v0.1.38...v0.1.39) (2024-12-27) 404 | 405 | ### [0.1.38](https://github.com/billd-project/billd-desk-pro/compare/v0.1.37...v0.1.38) (2024-12-27) 406 | 407 | ### [0.1.37](https://github.com/billd-project/billd-desk-pro/compare/v0.1.36...v0.1.37) (2024-12-27) 408 | 409 | ### [0.1.36](https://github.com/billd-project/billd-desk-pro/compare/v0.1.35...v0.1.36) (2024-12-27) 410 | 411 | ### [0.1.35](https://github.com/billd-project/billd-desk-pro/compare/v0.1.34...v0.1.35) (2024-12-27) 412 | 413 | ### [0.1.34](https://github.com/billd-project/billd-desk-pro/compare/v0.1.33...v0.1.34) (2024-12-27) 414 | 415 | ### [0.1.33](https://github.com/billd-project/billd-desk-pro/compare/v0.1.32...v0.1.33) (2024-12-27) 416 | 417 | ### [0.1.32](https://github.com/billd-project/billd-desk-pro/compare/v0.1.31...v0.1.32) (2024-12-27) 418 | 419 | ### [0.1.31](https://github.com/billd-project/billd-desk-pro/compare/v0.1.30...v0.1.31) (2024-12-27) 420 | 421 | ### [0.1.30](https://github.com/billd-project/billd-desk-pro/compare/v0.1.29...v0.1.30) (2024-12-27) 422 | 423 | ### [0.1.29](https://github.com/billd-project/billd-desk-pro/compare/v0.1.28...v0.1.29) (2024-12-27) 424 | 425 | ### [0.1.28](https://github.com/billd-project/billd-desk-pro/compare/v0.1.27...v0.1.28) (2024-12-27) 426 | 427 | ### [0.1.27](https://github.com/billd-project/billd-desk-pro/compare/v0.1.26...v0.1.27) (2024-12-27) 428 | 429 | ### [0.1.26](https://github.com/billd-project/billd-desk-pro/compare/v0.1.25...v0.1.26) (2024-12-27) 430 | 431 | ### [0.1.25](https://github.com/billd-project/billd-desk-pro/compare/v0.1.24...v0.1.25) (2024-12-27) 432 | 433 | ### [0.1.24](https://github.com/billd-project/billd-desk-pro/compare/v0.1.23...v0.1.24) (2024-12-27) 434 | 435 | ### [0.1.23](https://github.com/billd-project/billd-desk-pro/compare/v0.1.22...v0.1.23) (2024-12-27) 436 | 437 | ### [0.1.22](https://github.com/billd-project/billd-desk-pro/compare/v0.1.21...v0.1.22) (2024-12-27) 438 | 439 | ### [0.1.21](https://github.com/billd-project/billd-desk-pro/compare/v0.1.20...v0.1.21) (2024-12-27) 440 | 441 | ### [0.1.20](https://github.com/billd-project/billd-desk-pro/compare/v0.1.19...v0.1.20) (2024-12-27) 442 | 443 | ### [0.1.19](https://github.com/billd-project/billd-desk-pro/compare/v0.1.18...v0.1.19) (2024-12-27) 444 | 445 | ### [0.1.18](https://github.com/billd-project/billd-desk-pro/compare/v0.1.17...v0.1.18) (2024-12-27) 446 | 447 | ### [0.1.17](https://github.com/billd-project/billd-desk-pro/compare/v0.1.16...v0.1.17) (2024-12-27) 448 | 449 | 450 | ### Bug Fixes 451 | 452 | * 优化 ([899b9f1](https://github.com/billd-project/billd-desk-pro/commit/899b9f10d15a26d4f0f4328c73116fd41d74e3b1)) 453 | * 优化 ([0d017a4](https://github.com/billd-project/billd-desk-pro/commit/0d017a47b379f256fdbc87753fbce20008694be5)) 454 | * 优化 ([a8729a3](https://github.com/billd-project/billd-desk-pro/commit/a8729a30f27022acd3c4dd5c34957dfc8e33cd80)) 455 | 456 | ### [0.1.16](https://github.com/billd-project/billd-desk-pro/compare/v0.1.15...v0.1.16) (2024-12-26) 457 | 458 | ### [0.1.15](https://github.com/billd-project/billd-desk-pro/compare/v0.1.14...v0.1.15) (2024-12-26) 459 | 460 | ### [0.1.14](https://github.com/billd-project/billd-desk-pro/compare/v0.1.13...v0.1.14) (2024-12-26) 461 | 462 | ### [0.1.13](https://github.com/billd-project/billd-desk-pro/compare/v0.1.12...v0.1.13) (2024-12-26) 463 | 464 | ### [0.1.12](https://github.com/billd-project/billd-desk-pro/compare/v0.1.11...v0.1.12) (2024-12-26) 465 | 466 | ### [0.1.11](https://github.com/billd-project/billd-desk-pro/compare/v0.1.10...v0.1.11) (2024-12-26) 467 | 468 | ### [0.1.10](https://github.com/billd-project/billd-desk-pro/compare/v0.1.9...v0.1.10) (2024-12-26) 469 | 470 | ### [0.1.9](https://github.com/billd-project/billd-desk-pro/compare/v0.1.8...v0.1.9) (2024-12-26) 471 | 472 | ### [0.1.8](https://github.com/billd-project/billd-desk-pro/compare/v0.1.7...v0.1.8) (2024-12-26) 473 | 474 | ### [0.1.7](https://github.com/billd-project/billd-desk-pro/compare/v0.1.6...v0.1.7) (2024-12-26) 475 | 476 | ### [0.1.6](https://github.com/billd-project/billd-desk-pro/compare/v0.1.5...v0.1.6) (2024-12-26) 477 | 478 | ### [0.1.5](https://github.com/billd-project/billd-desk-pro/compare/v0.1.4...v0.1.5) (2024-12-26) 479 | 480 | ### [0.1.4](https://github.com/billd-project/billd-desk-pro/compare/v0.1.3...v0.1.4) (2024-12-26) 481 | 482 | ### [0.1.3](https://github.com/billd-project/billd-desk-pro/compare/v0.1.2...v0.1.3) (2024-12-26) 483 | 484 | ### [0.1.2](https://github.com/billd-project/billd-desk-pro/compare/v0.1.1...v0.1.2) (2024-12-26) 485 | 486 | ### 0.1.1 (2024-12-26) 487 | 488 | 489 | ### Features 490 | 491 | * init ([97bf4b4](https://github.com/billd-project/billd-desk-pro/commit/97bf4b476f8a3fbf22b82f3ec04a70e1ebca51c7)) 492 | 493 | 494 | ### Bug Fixes 495 | 496 | * 优化 ([34ae9f3](https://github.com/billd-project/billd-desk-pro/commit/34ae9f37fc6d2fadc7d7d530fcc519c9c3979223)) 497 | * 优化 ([1f11264](https://github.com/billd-project/billd-desk-pro/commit/1f11264404b9cfcde7de96f0378a1e24a92c2600)) 498 | * 优化 ([abe25d6](https://github.com/billd-project/billd-desk-pro/commit/abe25d62eeecb6196cd9d86bfbe953d23346271f)) 499 | * 优化 ([fb6e544](https://github.com/billd-project/billd-desk-pro/commit/fb6e54433aac17d43865b637db97932e9960d836)) 500 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023-PRESENT shuisheng 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | BilldDesk logo 8 | 9 |

10 | 11 |

12 | BilldDesk 13 |

14 | 15 |

16 | 基于Vue3 + WebRTC + Nodejs + Electron搭建的远程桌面控制 17 |

18 | 19 |
20 | 21 | ![stars](https://img.shields.io/github/stars/galaxy-s10/billd-desk) 22 | ![forks](https://img.shields.io/github/forks/galaxy-s10/billd-desk) 23 | 24 | ![version](https://img.shields.io/github/package-json/v/galaxy-s10/billd-desk) 25 | ![License](https://img.shields.io/github/license/galaxy-s10/billd-desk) 26 | ![language](https://img.shields.io/github/languages/top/galaxy-s10/billd-desk) 27 | ![language](https://img.shields.io/github/languages/top/galaxy-s10/billd-desk-server) 28 | ![language](https://img.shields.io/github/languages/top/galaxy-s10/billd-desk-flutter) 29 | 30 |
31 | 32 | ## 简介 33 | 34 | BilldDesk 远程桌面控制,目前实现了类似 ToDesk、向日葵等远程桌面的功能。 35 | 36 | ## 对比ToDesk免费个人版 37 | 38 | > 作者使用过很多远程软件:TeamViewer、向日葵、ToTesk、AnyDesk、RustDesk、UU远程、连连控,还有qq自带的远程协助等等,但用ToDesk免费个人版比较多,因此用ToTesk和BilldDesk作对比~ 39 | 40 | | | BilldDesk | ToDesk免费个人版 | 41 | | ------------------------- | -------------- | ------------------------------------------------------ | 42 | | 连接限制 | 无限制,免费 | 80h/月,200次/月,24h/次,超出需要购买专业版(¥24/月) | 43 | | 画质限制 | 无限制,免费 | 最高1080p,30帧 | 44 | | 安卓被控 | 支持,免费 | 不支持,需要购买专业版(¥24/月)或购买插件(¥15/月) | 45 | | 同时显示多屏 | 支持,免费 | 不支持,需要购买性能版(¥95/月) | 46 | | 屏幕墙 | 支持,免费 | 不支持,需要购买ToDesk企业版(¥805/年) | 47 | | 远程时录屏 | 支持,免费 | 不支持 | 48 | | web网页发起远程控制 | 支持,免费 | 不支持,需要购买ToDesk企业版(¥805/年) | 49 | | 远程控制web网页(仅观看) | 支持,免费 | 不支持 | 50 | | 同账号多主控同时发起远控 | 支持,免费 | 支持,需要购买插件(¥233/月) | 51 | | 私有化部署/二次开发 | 支持,开源免费 | 不支持,需要ToDesk企业版,定价未知 | 52 | 53 | ## 生态 54 | 55 | | 项目名称 | 代码仓库 | star & fork | 线上地址/下载地址 | 56 | | ------------------- | ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | 57 | | 远程桌面网页/客户端 | [billd-desk](https://github.com/galaxy-s10/billd-desk) | [![github](https://img.shields.io/github/stars/galaxy-s10/billd-desk?label=star&logo=GitHub)](https://github.com/galaxy-s10/billd-desk) [![github](https://img.shields.io/github/forks/galaxy-s10/billd-desk?label=fork&logo=GitHub)](https://github.com/galaxy-s10/billd-desk) | [https://desk.hsslive.cn](https://desk.hsslive.cn) | 58 | | 远程桌面后台 | [billd-desk-admin](https://github.com/galaxy-s10/billd-desk-admin) | [![github](https://img.shields.io/github/stars/galaxy-s10/billd-desk-admin?label=star&logo=GitHub)](https://github.com/galaxy-s10/billd-desk) [![github](https://img.shields.io/github/forks/galaxy-s10/billd-desk-admin?label=fork&logo=GitHub)](https://github.com/galaxy-s10/billd-desk-admin) | [https://desk-admin.hsslive.cn](https://desk-admin.hsslive.cn) | 59 | | 远程桌面移动端 | [billd-desk-flutter](https://github.com/galaxy-s10/billd-desk-flutter) | [![github](https://img.shields.io/github/stars/galaxy-s10/billd-desk-flutter?label=star&logo=GitHub)](https://github.com/galaxy-s10/billd-desk-flutter) [![github](https://img.shields.io/github/forks/galaxy-s10/billd-desk-flutter?label=fork&logo=GitHub)](https://github.com/galaxy-s10/billd-desk-flutter) | [https://desk.hsslive.cn/#/download](https://desk.hsslive.cn/#/download) | 60 | | 远程桌面服务端 | [billd-desk-server](https://github.com/galaxy-s10/billd-desk-server) | [![github](https://img.shields.io/github/stars/galaxy-s10/billd-desk-server?label=star&logo=GitHub)](https://github.com/galaxy-s10/billd-desk-server) [![github](https://img.shields.io/github/forks/galaxy-s10/billd-desk-server?label=fork&logo=GitHub)](https://github.com/galaxy-s10/billd-desk-server) | [https://desk-api.hsslive.cn](https://desk-api.hsslive.cn) | 61 | 62 | ## 功能 63 | 64 | - [x] `web网页` 控制 `电脑端` 65 | - [x] `web网页` 控制 `安卓端` 66 | - [x] `web网页` 控制 `web网页`(仅观看) 67 | - [x] `电脑端` 控制 `电脑端` 68 | - [x] `电脑端` 控制 `安卓端` 69 | - [x] `电脑端` 控制 `web网页`(仅观看) 70 | - [ ] `安卓端` 控制 `电脑端` 71 | - [ ] `安卓端` 控制 `安卓端` 72 | - [ ] `安卓端` 控制 `web网页`(仅观看) 73 | - [x] 多台设备同时远程一台设备 74 | - [x] 一台设备同时远程多台设备 75 | - [x] 多屏操作 76 | - [x] 连接鉴权 77 | - [x] 自定义设备码/连接密码 78 | - [x] 自定义接口(wws/api/中继服务器) 79 | - [x] 按键组合键 80 | - [x] 文件传输 81 | - [x] 开机自启 82 | - [x] 锁屏保活 83 | - [x] 屏幕墙 84 | - [x] 支持 macOS 系统 85 | - [x] 支持 Windows 系统 86 | - [x] 支持 Linux 系统(未实际测试) 87 | - [x] 支持 安卓端(Flutter) 88 | - [ ] 支持 苹果端(Flutter) 89 | - [ ] 后台管理 90 | - [ ] Docker一键部署 91 | - [x] 支持私有化部署 92 | 93 | > 更多功能请查看:[features.md](docs/features.md) 94 | 95 | ## 预览 96 | 97 | 快速体验:[https://desk.hsslive.cn](https://desk.hsslive.cn) 98 | 99 | ### web网页/电脑端控制电脑端 100 | 101 | ![img](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/111.png?raw=true) 102 | 103 | ### web网页/电脑端控制安卓端 104 | 105 | ![img](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/222.png?raw=true) 106 | 107 | ### web网页/电脑端控制web网页 108 | 109 | > 仅观看模式 110 | 111 | ![img](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/333.png?raw=true) 112 | 113 | ### web网页移动端 114 | 115 | > 首页 116 | 117 | ![img](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/777.png?raw=true) 118 | 119 | > 控制页 120 | 121 | ![img](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/888.png?raw=true) 122 | 123 | ### 屏幕墙 124 | 125 | ![img](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/444.png?raw=true) 126 | 127 | ### 安卓端控制电脑端【TODO】 128 | 129 | ### 安卓端控制安卓端【TODO】 130 | 131 | ### 安卓端控制web网页【TODO】 132 | 133 | > 仅观看模式 134 | 135 | ### 文件传输 136 | 137 | ![img](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/666.png?raw=true) 138 | 139 | ### 跨平台支持 140 | 141 | ![img](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/555.png?raw=true) 142 | 143 | ## 技术栈 144 | 145 | - 前端相关:[Vue3](https://vuejs.org) 以及相关技术栈、`Typescript`、`WebRTC`、`WebCodecs`、`Web Workder`、`Web Audio`、`Canvas` 146 | - 后端相关:[Nodejs](https://nodejs.org) 以及相关技术栈、`Koa2`、`Typescript`、`Sequelize`、`Mysql`、`Redis`、`Socket.io` 147 | - 桌面客户端相关:[Electron](https://www.electronjs.org)以及相关技术栈、`WebRTC` 148 | - 移动客户端相关:[Flutter3](https://flutter.dev)以及相关技术栈、`WebRTC` 149 | - 流媒体服务器相关:[SRS](https://ossrs.net)、 [FFmpeg](https://ffmpeg.org)、[Coturn](https://github.com/coturn/coturn) 150 | - Docker 相关:[Docker](https://www.docker.com) 151 | - 部署相关:[阿里云云效](https://devops.aliyun.com)、[billd-deploy](https://github.com/galaxy-s10/billd-deploy) 152 | 153 | ## 本地启动 154 | 155 | > https://desk.hsslive.cn/s/qk 156 | 157 | - [x] billd-desk(pro) 查看 [start-client.md](docs/start-client.md) 158 | 159 | - [x] billd-desk-server(pro) 查看 [start-server.md](docs/start-server.md) 160 | 161 | - [x] billd-desk-fultter(pro) 查看 [start-app.md](docs/start-app.md) 162 | 163 | ## 接口文档 164 | 165 | 查看 [apifox](https://apifox.com/apidoc/shared-a8ba9715-7730-432d-896c-97f983050795) 166 | 167 | ## 性能测试 168 | 169 | 查看 [benchmarking.md](docs/benchmarking.md) 170 | 171 | ## 常见问题 172 | 173 | 查看 [faq.md](docs/faq.md) 174 | 175 | ## 问题反馈 176 | 177 | 欢迎提 [issue](https://github.com/galaxy-s10/billd-desk/issues) 178 | 179 | ## 参与贡献 180 | 181 | 欢迎提 [pr](https://github.com/galaxy-s10/billd-desk/pulls) 182 | 183 | ## 私有化部署 184 | 185 | billd-desk完全开源(可商用),欢迎部署! 186 | 187 | ## 客户端下载 188 | 189 | > https://desk.hsslive.cn/s/bd2 190 | > 191 | > 备用链接:https://pan.baidu.com/s/1MRTeS47wsV70BQe4bxDqSQ?pwd=qx8j 192 | 193 | ## 官方交流群 194 | 195 | - qq群:957845615 196 | 197 | - 微信4群(未满200人) 198 | ![wechat_group4-1](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/wechat_group4-1.jpg?raw=true) 199 | 200 | - 微信3群(已满200人) 201 | ![wechat_group3-1](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/wechat_group3-1.jpg?raw=true) 202 | 203 | - 微信2群(已满200人) 204 | ![wechat_group2](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/wechat_group2.jpg?raw=true) 205 | 206 | - 微信1群(已满200人) 207 | ![wechat_group1](https://github.com/galaxy-s10/billd-desk/blob/main/src/assets/readme_img/wechat_group1.jpg?raw=true) 208 | 209 | ## 多平台支持 210 | 211 | - [x] Web网页(建议使用:[Chrome浏览器](https://www.google.com/intl/zh-CN/chrome/) / [Via浏览器](https://viayoo.com) / `Safari浏览器`) 212 | - [ ] Windows 7([再见,Windows 7/8/8.1](https://www.electronjs.org/zh/blog/windows-7-to-8-1-deprecation-notice)) 213 | - [x] Windows 10、Windows 11 214 | - [x] macOS 215 | - [x] Linux 216 | - [x] Android 11 至 Android 15,其他安卓版本的未实际测试 217 | - [ ] iOS 218 | 219 | ## 贡献者 220 | 221 | 222 | BilldDesk logo 227 | 228 | 229 | ## 初心 230 | 231 | 该项目初心只是作为[billd-live](https://github.com/galaxy-s10/billd-live)的衍生项目,但后面觉得远程桌面也挺有意思的,就一直坚持完善下去。 232 | 233 | ## 愿景 234 | 235 | 各大远程软件虽然免费都能用,但免费版的功能覆盖不够全面,比如有些普通个人用户可能只是临时需要远程一下安卓手机,但却需要开通一个月的服务才可以。BilldDesk完善了这些基本功能,让普通用户也能用上~ 236 | -------------------------------------------------------------------------------- /deploy/deploy.json: -------------------------------------------------------------------------------- 1 | {"name":"billd-desk","version":"0.28.0","buildDate":"2025/5/31 13:15:26"} -------------------------------------------------------------------------------- /deploy/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | "noImplicitAny": false, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "noEmit": true, 16 | "jsx": "preserve", 17 | 18 | "baseUrl": "./", 19 | "paths": { 20 | "@/*": ["src/*"] 21 | }, 22 | 23 | /* Linting */ 24 | "strict": true, 25 | "noUnusedLocals": true, 26 | "noUnusedParameters": true, 27 | "noFallthroughCasesInSwitch": true 28 | }, 29 | 30 | "include": [ 31 | "src/**/*.ts", 32 | "src/**/*.d.ts", 33 | "src/**/*.tsx", 34 | "src/**/*.vue", 35 | "config/**/*.ts", 36 | "components.d.ts" 37 | ], // 仅仅匹配这些文件,除了src以外的文件都不会被匹配 38 | "references": [{ "path": "./tsconfig.node.json" }] 39 | } 40 | -------------------------------------------------------------------------------- /docs/benchmarking.md: -------------------------------------------------------------------------------- 1 | 主要测试各个端之间远程时候的延迟。 2 | 3 | > TODO 4 | -------------------------------------------------------------------------------- /docs/faq.md: -------------------------------------------------------------------------------- 1 | ## 应用图标缓存问题 2 | 3 | 如果应用图标不更新,可以尝试替换一个图标图片再打包,或者你不希望换图标图片的话,可以将现在的图标图片拿去压缩一下,亲测也能解决问题。 4 | 5 | ## windows 任务管理器显示的进程图标问题 6 | 7 | 如果windows 任务管理器显示的进程图标问题不更新,请尝试以下步骤: 8 | 9 | 1,重启 ​​Windows 资源管理器​​: 10 | 11 | ```bash 12 | taskkill /f /im explorer.exe && start explorer.exe 13 | ``` 14 | 15 | 2,重启任务管理器。 16 | 17 | ## pnpm 安装 electron 时卡在 postinstall 18 | 19 | 1. 直接 ctrl+c 退出 npm 安装 20 | 2. 进入 node_modules/electron/install.js,将 21 | ```js 22 | downloadArtifact({ 23 | version, 24 | artifactName: 'electron', 25 | force: process.env.force_no_cache === 'true', 26 | cacheRoot: process.env.electron_config_cache, 27 | checksums: 28 | (process.env.electron_use_remote_checksums ?? 29 | process.env.npm_config_electron_use_remote_checksums) 30 | ? undefined 31 | : require('./checksums.json'), 32 | platform, 33 | arch, 34 | }) 35 | .then(extractFile) 36 | .catch((err) => { 37 | console.error(err.stack); 38 | process.exit(1); 39 | }); 40 | ``` 41 | 修改为: 42 | ```js 43 | downloadArtifact({ 44 | version, 45 | artifactName: 'electron', 46 | force: process.env.force_no_cache === 'true', 47 | cacheRoot: process.env.electron_config_cache, 48 | checksums: 49 | (process.env.electron_use_remote_checksums ?? 50 | process.env.npm_config_electron_use_remote_checksums) 51 | ? undefined 52 | : require('./checksums.json'), 53 | platform, 54 | arch, 55 | mirrorOptions: { 56 | mirror: 'https://npmmirror.com/mirrors/electron/', 57 | platform, 58 | arch, 59 | }, 60 | }) 61 | .then(extractFile) 62 | .catch((err) => { 63 | console.error(err.stack); 64 | process.exit(1); 65 | }); 66 | ``` 67 | 3. 在 node_modules/electron 目录下执行 node install 68 | 69 | ## rebuild 70 | 71 | ```bash 72 | npm config set registry https://registry.npmmirror.com 73 | ``` 74 | 75 | ```bash 76 | ./node_modules/.bin/electron-rebuild 77 | ``` 78 | 79 | ## rebuild 时 cpu-feature 报错 80 | 81 | 直接删了 node_modules 的 cpu-feature,然后重新 rebuild 82 | 83 | ## windows下,desktopCapturer.getSources获取不到自身窗口 84 | 85 | - 最开始Issue:https://github.com/electron/electron/issues/36037 86 | - 升级到最新版35.0.2解决:https://github.com/electron/electron/pull/45000 87 | - 好家伙,隔了两年才修复哈哈哈。 88 | -------------------------------------------------------------------------------- /docs/features.md: -------------------------------------------------------------------------------- 1 | ## 基础功能 2 | 3 | | | BilldDesk | 4 | | ------------------------- | ----------------- | 5 | | 远程控制 | 支持 | 6 | | 画质 | 最高支持8K、120帧 | 7 | | 快速邀请远程 | 支持 | 8 | | 文件传输 | 支持 | 9 | | 安卓被控 | 支持 | 10 | | 多屏操作 | 支持 | 11 | | 屏幕墙 | 支持 | 12 | | web网页发起远程控制 | 支持 | 13 | | 远程控制web网页(仅观看) | 支持 | 14 | | 远程控制时保存截图 | 支持 | 15 | | 远程控制时保存录制视频 | TODO | 16 | 17 | ## web网页/客户端 18 | 19 | | | BilldDesk | 20 | | ---------------- | --------- | 21 | | 常用按键 | 支持 | 22 | | 常用组合键 | 支持 | 23 | | 自定义组合键映射 | TODO | 24 | 25 | ## 安卓端 26 | 27 | | | BilldDesk | 28 | | ------------ | ---------------------------------------- | 29 | | 物理按键控制 | 支持返回键、主页键、任务键、音量+、音量- | 30 | | 剪贴板 | 支持 | 31 | 32 | ## 更多功能敬请期待 33 | -------------------------------------------------------------------------------- /docs/start-app.md: -------------------------------------------------------------------------------- 1 | ## billd-desk-flutter(pro) 2 | 3 | ## 调试 4 | 5 | ```bash 6 | flutter pub get 7 | ``` 8 | 9 | 使用 vscode 开发,用 vscode 自带的调试 10 | 11 | ## 打包 12 | 13 | > https://docs.flutter.cn/deployment/android/#build-an-apk 14 | 15 | ### 安卓 16 | 17 | ```bash 18 | flutter build apk --release 19 | ``` 20 | 21 | > 默认输出项项目的 build/app/outputs/flutter-apk/app-release.apk 目录 22 | 23 | ### 苹果(TODO) 24 | 25 | ```bash 26 | flutter build ipa --release 27 | ``` 28 | 29 | ### 生成 app 图标 30 | 31 | > 生成的图标在 android/app/src/main/res/目录里 32 | 33 | ```bash 34 | dart run flutter_launcher_icons:main 35 | ## 或者 36 | flutter pub run flutter_launcher_icons:main 37 | ``` 38 | -------------------------------------------------------------------------------- /docs/start-client.md: -------------------------------------------------------------------------------- 1 | ## billd-desk(pro) 2 | 3 | ## 安装依赖 4 | 5 | > 使用 node 版本:v18.19.0,建议18版本 6 | > 使用 pnpm 版本:9.1.3,建议9版本 7 | 8 | ```bash 9 | pnpm i 10 | ``` 11 | 12 | > 更新 billd 相关依赖: 13 | 14 | ```bash 15 | pnpm i billd-deploy@latest billd-utils@latest billd-scss@latest billd-html-webpack-plugin@latest 16 | ``` 17 | 18 | ## 运行 19 | 20 | > 配置文件:**`src/spec-config.ts`**,请在该文件填写对应的信息。 21 | 22 | ```bash 23 | npm run dev 24 | ``` 25 | 26 | ## 打包 27 | 28 | > 打包时会先使用[`standard-version`](https://github.com/conventional-changelog/standard-version#readme)进行发版,请确保当前项目初始化了 git,否则打包会失败。 29 | 30 | - web 31 | 32 | > 打包成功后,资源输出在`dist`目录 33 | 34 | ```bash 35 | npm run build:web 36 | ``` 37 | 38 | - windows、macos、linux 包 39 | 40 | > 打包成功后,资源输出在`electron-release`目录 41 | 42 | ```bash 43 | npm run build 44 | ``` 45 | 46 | - windows 包 47 | 48 | > 打包成功后,资源输出在`electron-release`目录 49 | 50 | ```bash 51 | npm run build:win 52 | ``` 53 | 54 | - macos 包 55 | 56 | > 打包成功后,资源输出在`electron-release`目录 57 | 58 | ```bash 59 | npm run build:mac 60 | ``` 61 | 62 | - linux 包 63 | 64 | > 打包成功后,资源输出在`electron-release`目录 65 | 66 | ```bash 67 | npm run build:linux 68 | ``` 69 | -------------------------------------------------------------------------------- /docs/start-server.md: -------------------------------------------------------------------------------- 1 | ## billd-desk-server(pro) 2 | 3 | ## 安装依赖 4 | 5 | > 使用 node 版本:v18.19.0,建议18版本 6 | > 使用 pnpm 版本:9.1.3,建议9版本 7 | 8 | ```bash 9 | pnpm i 10 | ``` 11 | 12 | > 更新 billd 相关依赖: 13 | 14 | ```bash 15 | pnpm i billd-utils@latest billd-html-webpack-plugin@latest 16 | ``` 17 | 18 | ## 运行 19 | 20 | > 1. 项目使用到了 mysql 和 redis,他们都是用 docker 来启动的。 21 | > 2. 项目启动后,会在项目的 src/secret/目录下生成 secret-beta、secret-dev、secret-prod 文件,请填写里面的信息,MYSQL_CONFIG、REDIS_CONFIG 必填! 22 | > 3. 配置文件:**`src/spec-config.ts`**,请填写里面的信息。 23 | 24 | 1. 初始化 docker 容器 25 | 26 | 如果你用 docker 启动 mysql 和 redis,就需要初始化 docker 容器。 27 | 28 | 如果你不用 docker,你本地 mysql 和 redis,只要你连上 mysql 和 redis 即可,不需要初始化 docker 容器。 29 | 30 | ```bash 31 | npm run docker:dev 32 | ``` 33 | 34 | 执行效果: 35 | 36 | ```bash 37 | ➜ billd-desk-server-pro git:(main) ✗ npm run docker:dev 38 | 39 | > billd-desk-server@0.1.0 docker:dev 40 | > cross-env NODE_ENV=development NODE_APP_RELEASE_PROJECT_ALIAS=src NODE_APP_RELEASE_PROJECT_NAME=billd-desk-server NODE_APP_RELEASE_PROJECT_ENV=dev NODE_APP_RELEASE_PROJECT_PORT=5300 nodemon --exec node -r @swc-node/register ./src/init/docker.ts 41 | 42 | [nodemon] 2.0.15 43 | [nodemon] to restart at any time, enter `rs` 44 | [nodemon] watching path(s): *.* 45 | [nodemon] watching extensions: ts,json 46 | [nodemon] starting `node -r @swc-node/register ./src/init/docker.ts` 47 | [2025/2/17 21:06:33] SUCCESS 添加路径别名成功! 48 | [2025/2/17 21:06:33] SUCCESS docker已安装 49 | [2025/2/17 21:06:33] WARN 开始启动Mysql 50 | [2025/2/17 21:06:36] SUCCESS 启动Mysql成功! ✅ 51 | [2025/2/17 21:06:36] WARN 开始启动Redis 52 | [2025/2/17 21:06:37] SUCCESS 启动Redis成功! ✅ 53 | [nodemon] clean exit - waiting for changes before restart 54 | 55 | ``` 56 | 57 | > 看到 `[nodemon] clean exit - waiting for changes before restart`后,就 ctrl+c 退出命令即可。 58 | 59 | 2. 初始化数据库 60 | 61 | 这个命令只需要执行一次,执行后就会自动创建数据库(src/secret/secret-dev 的 MYSQL_CONFIG.database)和数据库表。 62 | 63 | 执行一次后,以后都不需要执行了。 64 | 65 | ```bash 66 | npm run mysql:dev 67 | ``` 68 | 69 | 执行效果: 70 | 71 | ```bash 72 | ➜ billd-desk-server-pro git:(main) ✗ npm run mysql:dev 73 | 74 | > billd-desk-server@0.1.0 mysql:dev 75 | > cross-env NODE_APP_INIT_MYSQL=true NODE_ENV=development NODE_APP_RELEASE_PROJECT_NAME=billd-desk-server NODE_APP_RELEASE_PROJECT_ENV=dev NODE_APP_RELEASE_PROJECT_PORT=5300 nodemon --exec node -r @swc-node/register ./src/index.ts 76 | 77 | [nodemon] 2.0.15 78 | [nodemon] to restart at any time, enter `rs` 79 | [nodemon] watching path(s): *.* 80 | [nodemon] watching extensions: ts,json 81 | [nodemon] starting `node -r @swc-node/register ./src/index.ts` 82 | [2025/2/17 21:21:47] SUCCESS 添加路径别名成功! 83 | [2025/2/17 21:21:48] INFO 开始连接127.0.0.1:3307服务器的billd_desk_test数据库... 84 | [2025/2/17 21:21:48] SUCCESS 新建billd_desk_test数据库成功! 85 | [2025/2/17 21:21:48] WARN 开始校正数据库所有表 86 | [2025/2/17 21:21:48] SUCCESS 校正数据库所有表完成! 87 | [2025/2/17 21:21:48] INFO 加载数据库表: auth 88 | [2025/2/17 21:21:48] INFO 加载数据库表: desk_config 89 | [2025/2/17 21:21:48] INFO 加载数据库表: desk_user 90 | [2025/2/17 21:21:48] INFO 加载数据库表: desk_version 91 | [2025/2/17 21:21:48] INFO 加载数据库表: live 92 | [2025/2/17 21:21:48] INFO 加载数据库表: mock_day_data 93 | [2025/2/17 21:21:48] INFO 加载数据库表: mock_hour_data 94 | [2025/2/17 21:21:48] INFO 加载数据库表: mock_minute_ten_data 95 | [2025/2/17 21:21:48] INFO 加载数据库表: mock_minute_thirty_data 96 | [2025/2/17 21:21:48] INFO 加载数据库表: qq_user 97 | [2025/2/17 21:21:48] INFO 加载数据库表: role 98 | [2025/2/17 21:21:48] INFO 加载数据库表: role_auth 99 | [2025/2/17 21:21:48] INFO 加载数据库表: third_user 100 | [2025/2/17 21:21:48] INFO 加载数据库表: user 101 | [2025/2/17 21:21:48] INFO 加载数据库表: user_role 102 | [2025/2/17 21:21:48] INFO 加载数据库表: wechat_user 103 | [2025/2/17 21:21:48] SUCCESS 加载所有数据库表成功! 104 | [2025/2/17 21:21:48] WARN 开始初始化数据库所有表 105 | [2025/2/17 21:21:48] WARN 需要删除外键的表: 106 | [2025/2/17 21:21:48] SUCCESS 删除表的外键成功! 107 | [2025/2/17 21:21:48] WARN 需要删除索引的表: 108 | [2025/2/17 21:21:48] SUCCESS 删除表的索引成功! 109 | [2025/2/17 21:21:48] SUCCESS 删除所有表成功! 110 | [2025/2/17 21:21:48] SUCCESS 初始化数据库所有表完成! 111 | [2025/2/17 21:21:48] SUCCESS 初始化数据库数据完成!请退出该命令! 112 | 113 | ``` 114 | 115 | > 看到 `初始化数据库数据完成!请退出该命令!`后,就 ctrl+c 退出命令即可。 116 | 117 | 3. 运行,默认运行在 5300 端口 118 | 119 | ```bash 120 | npm run dev 121 | ``` 122 | 123 | 执行效果: 124 | 125 | ```bash 126 | ➜ billd-desk-server-pro git:(main) ✗ npm run dev 127 | 128 | > billd-desk-server@0.1.0 dev 129 | > cross-env NODE_ENV=development NODE_APP_RELEASE_PROJECT_NAME=billd-desk-server NODE_APP_RELEASE_PROJECT_ENV=dev NODE_APP_RELEASE_PROJECT_PORT=5300 nodemon --exec node -r @swc-node/register ./src/index.ts 130 | 131 | [nodemon] 2.0.15 132 | [nodemon] to restart at any time, enter `rs` 133 | [nodemon] watching path(s): *.* 134 | [nodemon] watching extensions: ts,json 135 | [nodemon] starting `node -r @swc-node/register ./src/index.ts` 136 | [2025/2/17 21:27:17] SUCCESS 添加路径别名成功! 137 | [2025/2/17 21:27:17] INFO 开始连接127.0.0.1:3307服务器的billd_desk_test数据库... 138 | [2025/2/17 21:27:17] INFO 开始连接127.0.0.1:6380服务器的redis数据库... 139 | [2025/2/17 21:27:17] INFO 开始连接127.0.0.1:6380服务器的redis Pub... 140 | [2025/2/17 21:27:17] INFO 开始连接127.0.0.1:6380服务器的redis Sub... 141 | [2025/2/17 21:27:17] SUCCESS 连接127.0.0.1:6380服务器的redis数据库成功! 142 | [2025/2/17 21:27:17] SUCCESS 连接127.0.0.1:6380服务器的redis Sub 成功! 143 | [2025/2/17 21:27:17] SUCCESS 连接127.0.0.1:6380服务器的redis Pub 成功! 144 | [2025/2/17 21:27:17] INFO 加载数据库表: auth 145 | [2025/2/17 21:27:17] INFO 加载数据库表: desk_config 146 | [2025/2/17 21:27:17] INFO 加载数据库表: desk_user 147 | [2025/2/17 21:27:17] INFO 加载数据库表: desk_version 148 | [2025/2/17 21:27:17] INFO 加载数据库表: live 149 | [2025/2/17 21:27:17] INFO 加载数据库表: mock_day_data 150 | [2025/2/17 21:27:17] INFO 加载数据库表: mock_hour_data 151 | [2025/2/17 21:27:17] INFO 加载数据库表: mock_minute_ten_data 152 | [2025/2/17 21:27:17] INFO 加载数据库表: mock_minute_thirty_data 153 | [2025/2/17 21:27:17] INFO 加载数据库表: qq_user 154 | [2025/2/17 21:27:17] INFO 加载数据库表: role 155 | [2025/2/17 21:27:17] INFO 加载数据库表: role_auth 156 | [2025/2/17 21:27:17] INFO 加载数据库表: third_user 157 | [2025/2/17 21:27:17] INFO 加载数据库表: user 158 | [2025/2/17 21:27:17] INFO 加载数据库表: user_role 159 | [2025/2/17 21:27:17] INFO 加载数据库表: wechat_user 160 | [2025/2/17 21:27:17] SUCCESS 加载所有数据库表成功! 161 | [2025/2/17 21:27:17] SUCCESS 连接127.0.0.1:3307服务器的billd_desk_test数据库成功! 162 | [2025/2/17 21:27:17] INFO 加载路由: auth.router.ts 163 | [2025/2/17 21:27:17] INFO 加载路由: deskUser.router.ts 164 | [2025/2/17 21:27:17] INFO 加载路由: deskVersion.router.ts 165 | [2025/2/17 21:27:17] INFO 加载路由: init.router.ts 166 | [2025/2/17 21:27:17] INFO 加载路由: qqUser.router.ts 167 | [2025/2/17 21:27:17] INFO 加载路由: role.router.ts 168 | [2025/2/17 21:27:17] INFO 加载路由: user.router.ts 169 | [2025/2/17 21:27:17] INFO 加载路由: wechatUser.router.ts 170 | [2025/2/17 21:27:17] SUCCESS 加载所有路由成功! 171 | [2025/2/17 21:27:17] SUCCESS 初始化websocket成功! 172 | 173 | [2025/2/17 21:27:17] WARN 监听端口: 5300 174 | [2025/2/17 21:27:17] WARN 项目名称: billd-desk-server 175 | [2025/2/17 21:27:17] WARN 项目环境: dev 176 | [2025/2/17 21:27:17] WARN mysql host: 127.0.0.1 177 | [2025/2/17 21:27:17] WARN mysql数据库: billd_desk_test 178 | [2025/2/17 21:27:17] SUCCESS http://127.0.0.1:5300/ 179 | [2025/2/17 21:27:17] SUCCESS http://192.168.1.102:5300/ 180 | [2025/2/17 21:27:17] SUCCESS http://10.211.55.2:5300/ 181 | [2025/2/17 21:27:17] SUCCESS http://10.37.129.2:5300/ 182 | [2025/2/17 21:27:17] SUCCESS 项目启动成功!耗时:233ms 183 | 184 | [2025/2/17 21:27:17] INFO 联系作者: https://desk.hsslive.cn/#/hi 185 | [2025/2/17 21:27:17] INFO 订阅仓库: https://desk.hsslive.cn/#/price 186 | [2025/2/17 21:27:17] INFO 私有化部署: https://desk.hsslive.cn/#/privatizationDeployment 187 | [2025/2/17 21:27:17] INFO 欢迎PR: billd-desk目前只有作者一人开发,难免有不足的地方,欢迎提PR或Issue 188 | 189 | 190 | ``` 191 | -------------------------------------------------------------------------------- /docs/tob.md: -------------------------------------------------------------------------------- 1 | ## ToB 2 | 3 | 面向企业用户服务,主要是订阅BilldDeskPro源码仓库 4 | 5 | ## 基础功能 6 | 7 | | | BilldDeskPro | BilldDesk | 8 | | ------------------------- | ----------------- | ------------------- | 9 | | 远程控制 | 支持 | 支持 | 10 | | 画质 | 最高支持8K、120帧 | 最高支持1080p、30帧 | 11 | | 快速邀请远程 | 支持 | 支持 | 12 | | 文件传输 | 支持 | 不支持 | 13 | | 安卓被控 | 支持 | 支持 | 14 | | 多屏操作 | 支持 | 支持 | 15 | | 屏幕墙 | 支持 | 不支持 | 16 | | web网页发起远程控制 | 支持 | 支持 | 17 | | 远程控制web网页(仅观看) | 支持 | 支持 | 18 | | 自定义设备码 | 支持 | 支持 | 19 | | 自定义服务器 | 支持 | 支持 | 20 | 21 | ## web网页/客户端 22 | 23 | | | BilldDeskPro | BilldDesk | 24 | | ---------------- | ------------ | --------- | 25 | | 常用按键 | 支持 | 支持 | 26 | | 常用组合键 | 支持 | 支持 | 27 | | 自定义组合键映射 | TODO | TODO | 28 | 29 | ## 安卓端 30 | 31 | | | BilldDesk | BilldDeskPro | 32 | | ------------ | ---------------------------------------- | ---------------------------------------- | 33 | | 物理按键控制 | 支持返回键、主页键、任务键、音量+、音量- | 支持返回键、主页键、任务键、音量+、音量- | 34 | | 剪贴板 | 支持 | 支持 | 35 | 36 | ## 更多功能敬请期待 37 | -------------------------------------------------------------------------------- /docs/toc.md: -------------------------------------------------------------------------------- 1 | ## ToC 2 | 3 | 面向普通用户服务,目前线上运行的是BilldDeskPro,任何功能都免费! 4 | -------------------------------------------------------------------------------- /docs/思路.md: -------------------------------------------------------------------------------- 1 | - 客户端打开后,判断缓存有无uid 2 | 3 | - 有uid和token,验证uid和token,连接Websocket 4 | - 没有uid和token,调接口获取uid 5 | 6 | - 打开客户端,ws连接,join的时候,带上desk_user_id,在redis里添加一个记录desk_user_uuid,设置他的过期时间为10秒 7 | - 设置心跳为5秒一次,每次心跳都更新desk_user_uuid的过期时间 8 | - 给desk_user_uuid添加过期订阅,过期的时候判断为远程连接断开 9 | - 发起远程连接的时候,发送startRemote,带上desk信息 10 | 11 | - 锁屏的时候 12 | 13 | - websocket是否会断开 14 | - 会断开。 15 | - webrtc是否会断开 16 | - 会断开。 17 | 18 | - 主动断开远程连接如何判定? 19 | -------------------------------------------------------------------------------- /docs/本地环境.md: -------------------------------------------------------------------------------- 1 | ## docker 安装 mysql 2 | 3 | ### 拉镜像 4 | 5 | ```bash 6 | docker pull mysql:8.0 7 | ``` 8 | 9 | ### 复制配置文件到本地 10 | 11 | 先查看配置文件位置: 12 | 13 | ```bash 14 | docker run --rm mysql:8.0 mysql --help | grep my.cnf 15 | ``` 16 | 17 | 查看配置文件位置结果: 18 | 19 | ```bash 20 | ➜ billd-desk-server git:(master) ✗ docker run --rm mysql:8.0 mysql --help | grep my.cnf 21 | order of preference, my.cnf, $MYSQL_TCP_PORT, 22 | /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 23 | ➜ billd-desk-server git:(master) ✗ 24 | ``` 25 | 26 | 意思是按照/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 路径按优先排序。 27 | 28 | ```bash 29 | ➜ billd-desk-server git:(master) ✗ docker run --rm mysql cat /etc/my.cnf 30 | # For advice on how to change settings please see 31 | # http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html 32 | 33 | [mysqld] 34 | # 35 | # Remove leading # and set to the amount of RAM for the most important data 36 | 省略... 37 | ➜ billd-desk-server git:(master) ✗ 38 | ``` 39 | 40 | 可以得到镜像中 mysql 配置文件路径为:/etc/my.cnf 41 | 42 | 创建一个临时的容器,在它里面复制配置文件到本地: 43 | 44 | > 注意,本地需要存在/Users/huangshuisheng/Desktop/docker/mysql/conf 这个目录 45 | 46 | 本地复制时用这个命令: 47 | 48 | ```bash 49 | LOCAL_DOCKER_MYSQL_PATH=/Users/huangshuisheng/Desktop/docker/mysql \ 50 | DOCKER_MYSQL_TMP=`docker run -d mysql:8.0` \ 51 | && docker cp $DOCKER_MYSQL_TMP:/etc/my.cnf $LOCAL_DOCKER_MYSQL_PATH/conf \ 52 | && docker stop $DOCKER_MYSQL_TMP \ 53 | && docker rm $DOCKER_MYSQL_TMP 54 | ``` 55 | 56 | ### 启动容器 57 | 58 | ```bash 59 | # 使用自定义 MySQL 配置文件 60 | # billd-desk-mysql是docker容器名,/Users/huangshuisheng/Desktop/docker/mysql是映射到本机的mysql,123456是密码 61 | 62 | LOCAL_DOCKER_MYSQL_PATH=/Users/huangshuisheng/Desktop/docker/mysql \ 63 | && docker run -d \ 64 | -p 3306:3306 \ 65 | --name billd-desk-mysql \ 66 | -e MYSQL_ROOT_PASSWORD=mysql123. \ 67 | -v $LOCAL_DOCKER_MYSQL_PATH/conf/my.cnf:/etc/my.cnf \ 68 | -v $LOCAL_DOCKER_MYSQL_PATH/data:/var/lib/mysql/ \ 69 | mysql:8.0 70 | ``` 71 | 72 | ## docker 安装 redis 73 | 74 | ### 拉镜像 75 | 76 | ```bash 77 | docker pull redis:7.0 78 | ``` 79 | 80 | ### 复制配置文件到本地 81 | 82 | > https://raw.githubusercontent.com/redis/redis/7.0/redis.conf 83 | 84 | 在/Users/huangshuisheng/Desktop/docker/redis/新建 conf 目录 85 | 在/Users/huangshuisheng/Desktop/docker/redis/新建 data 目录 86 | 87 | 将项目根目录的/docker/redis/conf/redis.conf 和 users.acl 复制到/Users/huangshuisheng/Desktop/docker/redis/conf 88 | 89 | ### 本地启动容器 90 | 91 | ```bash 92 | # 使用自定义 redis 配置文件 93 | # billd-desk-redis是docker容器名,/Users/huangshuisheng/Desktop/docker/redis是映射到本机的redis 94 | 95 | LOCAL_DOCKER_RESIS_PATH=/Users/huangshuisheng/Desktop/docker/redis \ 96 | && docker run -d \ 97 | -p 6379:6379 \ 98 | --name billd-desk-redis \ 99 | -v $LOCAL_DOCKER_RESIS_PATH/data:/data \ 100 | -v $LOCAL_DOCKER_RESIS_PATH/conf/redis.conf:/etc/redis/redis.conf \ 101 | -v $LOCAL_DOCKER_RESIS_PATH/conf/users.acl:/etc/redis/users.acl \ 102 | redis:7.0 redis-server /etc/redis/redis.conf 103 | ``` 104 | 105 | ## docker 安装 coturn 106 | 107 | > 本地环境时,不需要用 coturn 108 | 109 | ### 拉镜像 110 | 111 | ```bash 112 | docker pull coturn/coturn 113 | ``` 114 | 115 | ### 启动容器 116 | 117 | ```bash 118 | LOCAL_DOCKER_COTURN_PATH=/Users/huangshuisheng/Desktop/docker/coturn \ 119 | && docker run -d --network=host \ 120 | --name billd-desk-coturn \ 121 | -v $LOCAL_DOCKER_COTURN_PATH/coturn.conf:/my/coturn.conf \ 122 | coturn/coturn -c /my/coturn.conf 123 | ``` 124 | -------------------------------------------------------------------------------- /docs/流程.md: -------------------------------------------------------------------------------- 1 | # 一对一远程 2 | 3 | 没什么好说的 4 | 5 | # 多对一远程 6 | 7 | > 多个用户同时控制一个客户端 8 | > 被控端都有自己的房间(唯一) 9 | 10 | - 开始远程控制 11 | - 控制端,用户点击连接,发送startRemote消息,开始远程控制。 12 | - 被控端,监听startRemote消息,收到startRemote消息后,判断stream 13 | - 没有stream,调原生接口获取stream 14 | - 有stream,开始updateWebRtcRemoteDeskConfig,开始走webrtc流程(offer、answer等) 15 | - 操作问题,所有进入远程控制的用户都可以进行操作(或者可以加个限制或者切换,一种是控制模式,另一种是观看模式)。 16 | - 结束远程控制,用户结束远程控制。 17 | - 一对多,断开一个不能影响其他连接 18 | - 被控端判断有没有用户连接,只有当所有用户都断开连接的时候,才显示已断开远程连接。 19 | 20 | # 实际 21 | 22 | - a用户远程客户端 23 | - 客户端收到a用户的远程请求,获取stream,然后和a用户进行webrtc处理 24 | - b用户远程客户端 25 | - 客户端收到b用户的远程请求,获取stream,然后和a用户进行webrtc处理 26 | -------------------------------------------------------------------------------- /electron-builder.json5: -------------------------------------------------------------------------------- 1 | /** 2 | * https://www.electron.build/configuration/configuration 3 | * https://github.com/electron-vite/electron-vite-vue/blob/main/electron-builder.json5 4 | */ 5 | { 6 | $schema: 'https://raw.githubusercontent.com/electron-userland/electron-builder/master/packages/app-builder-lib/scheme.json', 7 | appId: 'com.billddesk.app', 8 | // asar: false, 9 | // 优先读取这个文件的productName,没有就会读取package.json的productName 10 | // productName: 'BilldDesk', 11 | directories: { 12 | output: 'electron-release/${version}', 13 | }, 14 | files: ['dist', 'electron-dist'], 15 | // https://www.electron.build/app-builder-lib.interface.configuration#extraresources 16 | // extraResources.from的build是项目目录,它最终会复制到安装目录的resources的build 17 | extraResources: [ 18 | { 19 | from: 'build', 20 | to: 'build', 21 | }, 22 | { 23 | from: 'script', 24 | to: 'script', 25 | }, 26 | ], 27 | mac: { 28 | target: { 29 | target: 'dmg', 30 | // https://github.com/electron-userland/electron-builder/issues/5392 31 | arch: ['x64', 'arm64'], 32 | // arch: ['arm64'], 33 | }, 34 | artifactName: '${productName}-mac-${platform}-${version}-${arch}-installer.${ext}', 35 | icon: 'build/output/icons/icon.icns', 36 | }, 37 | protocols: [ 38 | // for macOS - 用于在主机注册指定协议 39 | { 40 | name: 'BilldDesk', 41 | schemes: ['BilldDesk'], 42 | }, 43 | ], 44 | linux: { 45 | artifactName: '${productName}-linux-${platform}-${version}-${arch}-installer.${ext}', 46 | // amd是x64 47 | target: [ 48 | { 49 | target: 'AppImage', 50 | arch: ['x64', 'arm64'], 51 | }, 52 | ], 53 | }, 54 | win: { 55 | artifactName: '${productName}-win-${platform}-${version}-${arch}-installer.${ext}', 56 | // highestAvailable,可用的最高权限 57 | // requireAdministrator,管理员权限 58 | // WARN 设置管理员权限后,开启自启不生效 59 | // requestedExecutionLevel: 'requireAdministrator', 60 | target: [ 61 | { 62 | // portable、nsis 63 | target: 'nsis', 64 | // arch: ['x64', 'arm64'], 65 | arch: ['x64'], 66 | }, 67 | ], 68 | icon: 'build/output/icons/icon.ico', 69 | }, 70 | // https://www.electron.build/generated/nsisoptions 71 | nsis: { 72 | // oneClick,是否创建一键安装程序或辅助安装程序 73 | oneClick: false, 74 | // perMachine,是否显示辅助安装程序的安装模式安装程序页面(按计算机或按用户选择)。或者是否始终为所有用户(每台计算机)安装。 75 | perMachine: true, 76 | // allowToChangeInstallationDirectory,仅辅助安装程序。是否允许用户更改安装目录。 77 | allowToChangeInstallationDirectory: true, 78 | // removeDefaultUninstallWelcomePage,仅辅助安装程序。删除默认卸载欢迎页面。 79 | removeDefaultUninstallWelcomePage: false, 80 | // deleteAppDataOnUninstall,仅限一键安装程序。卸载时是否删除应用程序数据。 81 | deleteAppDataOnUninstall: false, 82 | // for win - 将协议写入主机的脚本 83 | // include: 'script/urlProtoco.nsh', 84 | // installerIcon: 'build/output/icons/icon.ico', 85 | // uninstallerIcon: 'build/output/icons/icon.ico', 86 | }, 87 | } 88 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js'; 2 | import pluginTypeScript from '@typescript-eslint/eslint-plugin'; 3 | import * as parserTypeScript from '@typescript-eslint/parser'; 4 | import configPrettier from 'eslint-config-prettier'; 5 | import { defineFlatConfig } from 'eslint-define-config'; 6 | import importPlugin from 'eslint-plugin-import'; 7 | import pluginPrettier from 'eslint-plugin-prettier'; 8 | import pluginVue from 'eslint-plugin-vue'; 9 | import * as parserVue from 'vue-eslint-parser'; 10 | 11 | console.log( 12 | '\x1B[0;37;44m INFO \x1B[0m', 13 | '\x1B[0;;34m ' + `读取了: eslint配置文件` + ' \x1B[0m' 14 | ); 15 | 16 | export default defineFlatConfig([ 17 | { 18 | ...js.configs.recommended, 19 | ...importPlugin.flatConfigs.recommended, 20 | ignores: [ 21 | 'node_modules', 22 | 'pnpm-lock.yaml', 23 | 'dist', 24 | 'components.d.ts', 25 | 'auto-imports.d.ts', 26 | 'electron-dist/**/*', 27 | 'deploy/**/*', 28 | '.DS_Store', 29 | '.eslintcache', 30 | ], 31 | languageOptions: { 32 | globals: {}, 33 | }, 34 | plugins: { 35 | prettier: pluginPrettier, 36 | import: importPlugin, 37 | }, 38 | rules: { 39 | ...configPrettier.rules, 40 | ...pluginPrettier.configs.recommended.rules, 41 | /** 42 | * 0 => off 43 | * 1 => warn 44 | * 2 => error 45 | */ 46 | 'no-unused-vars': 0, // 禁止出现未使用过的变量 47 | 'no-shadow': 0, // 禁止变量声明与外层作用域的变量同名 48 | 'class-methods-use-this': 0, // 类方法如果不使用this的话会报错 49 | 'no-console': 0, // 此规则不允许调用console对象的方法。 50 | 'spaced-comment': ['error', 'always', { exceptions: ['-', '+'] }], // 该规则强制注释中 // 或 /* 后空格的一致性 51 | 'no-var': 2, // 要求let或const代替var 52 | camelcase: [ 53 | 'error', 54 | { properties: 'never' }, // properties默认always,即检查属性名;可以设置为never,即不检查属性名 55 | ], // 强制执行驼峰命名约定 56 | 'no-underscore-dangle': 2, // 此规则不允许在标识符中使用悬空下划线。 57 | 'no-param-reassign': 2, // 禁止对 function 的参数进行重新赋值 58 | 'no-nested-ternary': 2, // 禁止嵌套三元 59 | 'no-plusplus': 2, // 禁用一元操作符 ++ 和 -- 60 | 'vars-on-top': 2, // 要求所有的 var 声明出现在它们所在的作用域顶部 61 | 'prefer-const': 2, // 要求使用 const 声明那些声明后不再被修改的变量 62 | 'prefer-template': 2, // 要求使用模板字符串代替字符串连接 63 | 'new-cap': 2, // 要求构造函数名称以大写字母开头 64 | 'no-restricted-syntax': [ 65 | // 禁用一些语法 66 | 'error', 67 | // 'ForInStatement', 68 | // 'ForOfStatement', 69 | { 70 | selector: 'ForInStatement', 71 | /** 72 | * 用 map() / every() / filter() / find() / findIndex() / reduce() / some() / ... 遍历数组, 73 | * 和使用 Object.keys() / Object.values() / Object.entries() 迭代你的对象生成数组。 74 | * 拥有返回值得纯函数比这个更容易解释 75 | */ 76 | message: 77 | 'for in会迭代遍历原型链(__proto__),建议使用map/every/filter等遍历数组,使用Object.{keys,values,entries}等遍历对象', 78 | }, 79 | { 80 | selector: 'ForOfStatement', 81 | message: 82 | '建议使用map/every/filter等遍历数组,使用Object.{keys,values,entries}等遍历对象', 83 | }, 84 | ], // https://github.com/BingKui/javascript-zh#%E8%BF%AD%E4%BB%A3%E5%99%A8%E5%92%8C%E5%8F%91%E7%94%9F%E5%99%A8 85 | 'no-iterator': 2, // 禁止使用__iterator__迭代器 86 | 'require-await': 2, // 禁止使用不带 await 表达式的 async 函数 87 | 'no-empty': 2, // 禁止空块语句 88 | 'guard-for-in': 2, // 要求for-in循环包含if语句 89 | 'global-require': 2, // 此规则要求所有调用require()都在模块的顶层,此规则在 ESLint v7.0.0中已弃用。请使用 中的相应规则eslint-plugin-node:https://github.com/mysticatea/eslint-plugin-node 90 | 'no-unused-expressions': [ 91 | 2, 92 | { 93 | allowShortCircuit: true, // 允许短路 94 | allowTernary: true, // 允许三元 95 | }, 96 | ], // 禁止未使用的表达式,即let a = true && console.log(1)允许,但是true && console.log(1)不行 97 | 'object-shorthand': ['error', 'always'], // (默认)希望尽可能使用速记。var foo = {x:x};替换为var foo = {x}; 98 | 'no-useless-escape': 2, // 禁止不必要的转义字符 99 | 100 | 'import/order': [ 101 | 'error', 102 | { 103 | groups: [ 104 | 'builtin', // 如:import fs from 'fs'; 105 | 'external', // 如:import _ from 'lodash'; 106 | 'internal', // 如:import foo from 'src/foo'; 107 | 'parent', // 如:import foo from '../foo'; 108 | 'sibling', // 如:import bar from './bar'; 109 | // ['sibling', 'parent'], 110 | // ['parent', 'sibling'], 111 | 'index', // 如:import main from './'; 112 | 'object', // 如:import log = console.log; 113 | 'type', // 如:import type { Foo } from 'foo'; 114 | ], 115 | pathGroups: [ 116 | { 117 | pattern: '@/**', 118 | group: 'internal', 119 | }, 120 | ], 121 | 'newlines-between': 'always', // 强制或禁止导入组之间的新行 122 | // 根据导入路径以字母顺序排列每个组中的顺序 123 | alphabetize: { 124 | order: 'asc', // 使用asc按升序排序,使用desc按降序排序(默认值:ignore)。 125 | caseInsensitive: true, // 使用true忽略大小写,而false考虑大小写(默认值:false)。 126 | orderImportKind: 'asc', // 使用asc以升序对各种导入类型进行排序,例如以type或typeof为前缀的导入,具有相同的导入路径。使用desc按降序排序(默认值:忽略) 127 | }, 128 | }, 129 | ], 130 | 'import/newline-after-import': 2, // 强制在最后一个顶级导入语句或 require 调用之后有一个或多个空行 131 | 'import/no-extraneous-dependencies': 2, // 禁止导入未在package.json中声明的外部模块。 132 | }, 133 | }, 134 | { 135 | files: ['**/*.?([cm])ts', '**/*.?([cm])tsx'], 136 | languageOptions: { 137 | parser: parserTypeScript, 138 | parserOptions: { 139 | sourceType: 'module', 140 | }, 141 | }, 142 | plugins: { 143 | '@typescript-eslint': pluginTypeScript, 144 | }, 145 | rules: { 146 | ...pluginTypeScript.configs.strict.rules, 147 | 148 | // @typescript-eslint插件 149 | '@typescript-eslint/no-unused-vars': 2, 150 | 151 | // '@typescript-eslint/restrict-template-expressions': [ 152 | // 'error', 153 | // { 154 | // allowBoolean: true, 155 | // allowNumber: true, 156 | // }, 157 | // ], // 强制模板文字表达式为string类型。即const a = {};console.log(`${a}`);会报错 158 | '@typescript-eslint/no-floating-promises': 0, // 要求适当处理类似 Promise 的语句。即将await或者return Promise,或者对promise进行.then或者.catch 159 | '@typescript-eslint/no-explicit-any': 0, // 不允许定义any类型。即let a: any;会报错 160 | '@typescript-eslint/no-non-null-assertion': 0, // 禁止使用非空断言(后缀运算符!)。即const el = document.querySelector('.app');console.log(el!.tagName);会报错 161 | '@typescript-eslint/ban-ts-comment': 0, // 禁止使用@ts-注释 162 | '@typescript-eslint/no-unsafe-assignment': 0, // 不允许将具有类型的值分配any给变量和属性。即const a: any = {};const b = a;会报错 163 | '@typescript-eslint/no-unsafe-argument': 0, // 不允许用any类型的值调用一个函数。即let a: any;Object.keys(a);会报错 164 | '@typescript-eslint/no-unsafe-member-access': 0, // 不允许对类型为any的值进行成员访问。即const a: any = [];console.log(a[0]);会报错 165 | '@typescript-eslint/no-unsafe-return': 0, // 不允许从一个函数中返回一个类型为any的值 166 | '@typescript-eslint/no-unsafe-call': 0, // 不允许调用any类型的值 167 | '@typescript-eslint/no-var-requires': 0, // 即不允许var foo = require('foo');。但是允许import foo = require('foo'); 168 | '@typescript-eslint/restrict-plus-operands': 0, // 要求加法的两个操作数是相同的类型并且是bigint, number, 或string。即const a = '1';console.log(a + 1);会报错 169 | }, 170 | }, 171 | 172 | { 173 | files: ['**/*.vue'], 174 | languageOptions: { 175 | globals: {}, 176 | parser: parserVue, 177 | parserOptions: { 178 | ecmaFeatures: { 179 | jsx: true, 180 | }, 181 | extraFileExtensions: ['.vue'], 182 | parser: '@typescript-eslint/parser', 183 | sourceType: 'module', 184 | }, 185 | }, 186 | plugins: { 187 | vue: pluginVue, 188 | }, 189 | processor: pluginVue.processors['.vue'], 190 | rules: { 191 | ...pluginVue.configs.base.rules, 192 | ...pluginVue.configs['vue3-essential'].rules, 193 | ...pluginVue.configs['vue3-recommended'].rules, 194 | 'vue/multi-word-component-names': 0, 195 | }, 196 | }, 197 | ]); 198 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | <%= title %> 15 | 58 | 59 | 60 |
61 | 65 |
66 | 67 |
68 | 69 | 70 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "billd-desk", 3 | "version": "0.28.0", 4 | "description": "BilldDesk远程桌面控制", 5 | "keywords": [ 6 | "billd", 7 | "remote-desk", 8 | "webrtc", 9 | "turn", 10 | "turnserver", 11 | "todesk", 12 | "rustdesk", 13 | "向日葵" 14 | ], 15 | "homepage": "https://desk.hsslive.cn", 16 | "bugs": { 17 | "url": "https://github.com/galaxy-s10/billd-desk/issues" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/galaxy-s10/billd-desk" 22 | }, 23 | "license": "MIT", 24 | "author": "shuisheng <2274751790@qq.com>", 25 | "type": "module", 26 | "main": "electron-dist/index.cjs", 27 | "scripts": { 28 | "build:beta": "cross-env VITE_APP_RELEASE_PROJECT_ISWEB=true vite build", 29 | "build:deb": "vite build && electron-builder --linux deb", 30 | "build:linux": "vite build && electron-builder --linux", 31 | "build:mac": "vite build && electron-builder --mac", 32 | "build:mw": "npm run release-prod && vite build && electron-builder --mac --win", 33 | "build:mwl": "npm run release-prod && vite build && electron-builder --mac --win --linux", 34 | "build:prod": "cross-env VITE_APP_RELEASE_PROJECT_ISWEB=true vite build", 35 | "build:web": "cross-env VITE_APP_RELEASE_PROJECT_ISWEB=true vite build", 36 | "build:win": "vite build && electron-builder --win", 37 | "cz": "cz", 38 | "deploy:beta": "node ./deploy/index.cjs --beta", 39 | "deploy:prod": "node ./deploy/index.cjs --prod", 40 | "dev": "rimraf electron-dist dist && vite", 41 | "gen-icons": "rimraf build/output/ && electron-icon-builder --input=./build/source/logo.png --output=./build/output/ --flatten", 42 | "lint": "eslint . --config ./eslint.config.js --cache", 43 | "lint:fix": "eslint . --config ./eslint.config.js --cache --fix", 44 | "preview": "vite preview", 45 | "release": "standard-version", 46 | "release-bigversion": "npm run release -- --release-as major", 47 | "release-fix": "npm run release -- --release-as patch", 48 | "release-prod": "npm run release -- --release-as minor", 49 | "release-version": "npm run release -- --release-as 1.0.0", 50 | "sync-all-github": "ts-node ./deploy/handleSyncAllGithub.mjs", 51 | "sync-codeup": "ts-node ./deploy/handleSyncCodeup.mjs", 52 | "sync-doc-local": "ts-node ./deploy/handleSyncDocLocal.mjs", 53 | "sync-github": "ts-node ./deploy/handleSyncGithub.mjs" 54 | }, 55 | "config": {}, 56 | "dependencies": {}, 57 | "devDependencies": { 58 | "@electron-toolkit/preload": "^3.0.0", 59 | "@electron/rebuild": "^3.7.1", 60 | "@eslint/js": "^9.10.0", 61 | "@types/node": "^20.4.1", 62 | "@typescript-eslint/eslint-plugin": "^7.18.0", 63 | "@typescript-eslint/parser": "^7.18.0", 64 | "@vitejs/plugin-legacy": "^5.3.1", 65 | "@vitejs/plugin-vue": "^5.2.1", 66 | "@vue/eslint-config-prettier": "^8.0.0", 67 | "@vue/eslint-config-typescript": "^11.0.3", 68 | "commitizen": "^4.3.1", 69 | "cross-env": "^7.0.3", 70 | "electron": "^35.0.2", 71 | "electron-builder": "^24.12.0", 72 | "electron-icon-builder": "^2.0.1", 73 | "eslint": "^9.10.0", 74 | "eslint-config-prettier": "^9.1.0", 75 | "eslint-define-config": "^2.1.0", 76 | "eslint-import-resolver-typescript": "^3.6.0", 77 | "eslint-plugin-import": "^2.31.0", 78 | "eslint-plugin-prettier": "^5.2.1", 79 | "eslint-plugin-vue": "^9.28.0", 80 | "node-abi": "^3.71.0", 81 | "postcss-preset-env": "^10.1.2", 82 | "prettier": "^3.4.2", 83 | "rimraf": "^6.0.1", 84 | "sass": "^1.63.6", 85 | "standard-version": "^9.5.0", 86 | "trash": "^8.1.1", 87 | "ts-node": "^10.9.2", 88 | "typescript": "^5.6.2", 89 | "unplugin-auto-import": "^0.17.6", 90 | "unplugin-vue-components": "^0.25.1", 91 | "vite": "^6.0.3", 92 | "vite-plugin-bundle-prefetch": "^0.0.4", 93 | "vite-plugin-checker": "^0.8.0", 94 | "vite-plugin-chunk-split": "^0.5.0", 95 | "vite-plugin-commonjs": "^0.10.1", 96 | "vite-plugin-electron": "^0.28.2", 97 | "vite-plugin-electron-renderer": "^0.14.5", 98 | "vite-plugin-eslint2": "^5.0.3", 99 | "vite-plugin-html": "^3.2.2", 100 | "vue-eslint-parser": "^9.4.3", 101 | "vue-tsc": "^2.1.10" 102 | }, 103 | "productName": "BilldDesk" 104 | } -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | console.log( 2 | '\x1B[0;37;44m INFO \x1B[0m', 3 | '\x1B[0;;34m ' + `读取了: postcss配置文件` + ' \x1B[0m' 4 | ); 5 | 6 | // 把.browserslistrc的last 2 version改成last 20 version就可以看到明显效果 7 | // user-select:none 8 | export default { 9 | plugins: { 10 | 'postcss-preset-env': {}, 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | console.log( 2 | '\x1B[0;37;44m INFO \x1B[0m', 3 | '\x1B[0;;34m ' + `读取了: prettier配置文件` + ' \x1B[0m' 4 | ); 5 | 6 | /** 7 | * @see https://prettier.io/docs/en/configuration.html 8 | * @type {import("prettier").Config} 9 | */ 10 | const config = { 11 | bracketSpacing: true, // 默认为true。即要求:{ foo: bar };可改为false,即要求{foo: bar} 12 | singleQuote: true, // 默认为false。即要求:const a = "1";可改为true,即要求const a = '1' 13 | semi: true, // 默认值true,即要求在所有代码语句的末尾添加分号;可改为false,即要求仅在可能导致 ASI 失败的行的开头添加分号。 14 | singleAttributePerLine: true, // 默认false。即在HTML、Vue和JSX中不要每行强制执行单个属性;可改为true,即要求每行强制执行单个属性。 15 | /** 16 | * jsxBracketSameLine 17 | * 注意是多行,如果是类似这种:1,基本不会触发换行,因此也就不会触发这个bracketSameLine 18 | * 但是如果是类似这种:1,它有多个属性,或者说他的一个属性值很长,可能会导致换行, 19 | * 如果换行了,那么就会触发bracketSameLine,将最后的>单独放在一行或者最后一行的末尾 20 | */ 21 | bracketSameLine: false, // 默认为false。即将多行HTML(HTML、JSX、Vue、Angular)元素的 > 单独放在下一行;可改为true,即将 > 放在最后一行的末尾。 22 | // jsxBracketSameLine: false, // 此选项已在v2.4.0中弃用,使用bracketSameLine替换,https://prettier.io/blog/2021/09/09/2.4.0.html 23 | 24 | /** 25 | * trailingComma 26 | * https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Trailing_commas 27 | * 尾后逗号 (有时叫做“终止逗号”)在向 JavaScript 代码添加元素、参数、属性时十分有用。 28 | * 如果你想要添加新的属性,并且上一行已经使用了尾后逗号,你可以仅仅添加新的一行,而不需要修改上一行。 29 | * 这使得版本控制的代码比较(diff)更加清晰,代码编辑过程中遇到的麻烦更少。 30 | */ 31 | trailingComma: 'es5', // 默认值在v2.0.0中none更改为es5。即在ES5中有效的尾随逗号(对象、数组等)。可选:"none":没有尾随逗号;"all":尽可能尾随逗号 32 | 33 | /** 34 | * printWidth 35 | * 如果设置了printWidth值,则以设置的printWidth值为准 36 | * 如果没有设置printWidth值,且.editorconfig文件有设置max_line_length值,则使用.editorconfig文件的max_line_length 37 | */ 38 | printWidth: 80, // 默认80,printWidth不是硬性的允许行长度上限,不要试图将 printWidth 当作 ESLint 的max-len 来使用——它们不一样 39 | 40 | /** 41 | * tabWidth 42 | * 如果设置了tabWidth值,则以设置的tabWidth值为准 43 | * 如果没有设置tabWidth值,且.editorconfig文件有设置indent_size或者tab_width值,则使用.editorconfig文件的indent_size或者tab_width 44 | */ 45 | tabWidth: 2, // 指定每个缩进级别的空格数。 46 | // parser: 'babel', // 指定要使用的解析器。Prettier 会自动从输入文件路径推断解析器,因此您不必更改此设置。 47 | }; 48 | 49 | export default config; 50 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/public/favicon.ico -------------------------------------------------------------------------------- /script/backgroundService.cjs: -------------------------------------------------------------------------------- 1 | // import { ipcMain } from 'electron'; 2 | // const nutjs = require('@nut-tree-fork/nut-js'); 3 | // const { ipcMain } = require('electron'); 4 | // const fs = require('fs'); 5 | // const path = require('path'); 6 | // import fs from 'fs'; 7 | // import path from 'path'; 8 | 9 | // console.log('ipcMain.on', ipcMain.on); 10 | 11 | // ipcMain.on('mouseMove', async (_event, reqData) => { 12 | // console.log(`electron收到${'mouseMove'}`, reqData); 13 | // const { requestId, data } = reqData; 14 | // const { windowId, x, y } = data; 15 | // try { 16 | // await nutjs.mouse.move([{ x, y }]); 17 | // } catch (error) { 18 | // console.log(error); 19 | // } 20 | // }); 21 | 22 | // ipcMain.on('mouseMove2', (_event, reqData) => { 23 | // console.log(`electron收到${'mouseMove2'}`, reqData); 24 | // }); 25 | 26 | const http = require('http'); 27 | 28 | // 创建 HTTP 服务器 29 | const server = http.createServer((req, res) => { 30 | // 获取请求的 URL 31 | const url = req.url; 32 | 33 | // 路由处理 34 | if (url === '/') { 35 | res.writeHead(200, { 'Content-Type': 'application/json' }); 36 | res.end(JSON.stringify({ msg: '首页' })); 37 | } else if (url === '/about') { 38 | res.writeHead(200, { 'Content-Type': 'application/json' }); 39 | res.end(JSON.stringify({ msg: 'about' })); 40 | } else { 41 | res.writeHead(404, { 'Content-Type': 'application/json' }); 42 | res.end(JSON.stringify({ msg: '404' })); 43 | } 44 | }); 45 | 46 | // 服务器监听指定端口 47 | const PORT = 8002; 48 | server.listen(PORT, () => { 49 | console.log(`服务器正在运行,访问 http://localhost:${PORT}`); 50 | }); 51 | 52 | // setInterval(() => { 53 | // console.log('1113'); 54 | // console.log(fs, path); 55 | // console.log('process.argv', process.argv); 56 | // const index = process.argv.findIndex((v) => v === '--path'); 57 | // if (index !== -1) { 58 | // const path1 = process.argv[index + 1]; 59 | // console.log(path1); 60 | // if (path1) { 61 | // fs.writeFile( 62 | // path.resolve(path1, 'text.txt'), 63 | // `${new Date().toLocaleString()}\n`, 64 | // { 65 | // flag: 'a', // a:追加写入;w:覆盖写入 66 | // }, 67 | // (err) => { 68 | // if (err) { 69 | // console.error(err); 70 | // } 71 | // } 72 | // ); 73 | // } 74 | // } 75 | // }, 1000); 76 | -------------------------------------------------------------------------------- /script/urlProtoco.nsh: -------------------------------------------------------------------------------- 1 | !macro customInstall 2 | DetailPrint "Register BilldDesk URI Handler" 3 | DeleteRegKey HKCR "BilldDesk" 4 | WriteRegStr HKCR "BilldDesk" "" "URL:BilldDesk" 5 | WriteRegStr HKCR "BilldDesk" "URL Protocol" "" 6 | WriteRegStr HKCR "BilldDesk\shell" "" "" 7 | WriteRegStr HKCR "BilldDesk\shell\Open" "" "" 8 | WriteRegStr HKCR "BilldDesk\shell\Open\command" "" "$INSTDIR\${APP_EXECUTABLE_FILENAME} %1" 9 | !macroend 10 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 113 | 114 | 115 | 116 | 121 | -------------------------------------------------------------------------------- /src/api/deskConfig.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | export function fetchDeskConfigTurnserver() { 4 | return request.get(`/desk_config/turnserver`); 5 | } 6 | -------------------------------------------------------------------------------- /src/api/deskUser.ts: -------------------------------------------------------------------------------- 1 | import { IDeskUser } from '@/interface'; 2 | import request from '@/utils/request'; 3 | 4 | export function fetchFindReceiverByUuid(uuid) { 5 | return request.get(`/desk_user/find_receiver_by_uuid`, { params: { uuid } }); 6 | } 7 | 8 | export function fetchDeskUserLogin(data: IDeskUser) { 9 | return request.post(`/desk_user/login`, data); 10 | } 11 | 12 | export function fetchDeskUserAutoLogin(data: IDeskUser) { 13 | return request.post(`/desk_user/auto_login`, data); 14 | } 15 | 16 | export function fetchDeskUserLinkVerify(data: IDeskUser) { 17 | return request.post(`/desk_user/link_verify`, data); 18 | } 19 | 20 | export function fetchDeskUserCreate() { 21 | return request.post(`/desk_user/create`); 22 | } 23 | 24 | export function fetchDeskUserUpdateByUuid(data: IDeskUser) { 25 | return request.put(`/desk_user/update_by_uuid`, data); 26 | } 27 | -------------------------------------------------------------------------------- /src/api/deskVersion.ts: -------------------------------------------------------------------------------- 1 | import { IDeskVersion, IList } from '@/interface'; 2 | import request from '@/utils/request'; 3 | 4 | export function fetchDeskVersionLatest(params) { 5 | return request.get(`/desk_version/latest`, { params }); 6 | } 7 | 8 | export function fetchDeskVersionCheck({ version, type }) { 9 | return request.get(`/desk_version/check`, { params: { version, type } }); 10 | } 11 | 12 | export function fetchDeskVersionByVersion({ version, type }) { 13 | return request.get(`/desk_version/find_by_version`, { 14 | params: { version, type }, 15 | }); 16 | } 17 | export function fetchDeskVersionAllVersion(params: IList) { 18 | return request.get(`/desk_version/find_all_version`, { 19 | params, 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /src/api/globalMsg.ts: -------------------------------------------------------------------------------- 1 | import { IGlobalMsg, IList, IPaging } from '@/interface'; 2 | import request from '@/utils/request'; 3 | 4 | export function fetchGlobalMsgMyList(params: IList) { 5 | return request.get>('/global_msg/my_list', { 6 | params, 7 | }); 8 | } 9 | 10 | export function fetchGlobalMsgGlobal(params: IList) { 11 | return request.get('/global_msg/global', { 12 | params, 13 | }); 14 | } 15 | -------------------------------------------------------------------------------- /src/api/inivte.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | export function fetchInviteCreate(data) { 4 | return request.post('/invite/create', data); 5 | } 6 | 7 | export function fetchInviteDel(data) { 8 | return request.post('/invite/del', data); 9 | } 10 | 11 | export function fetchInviteGet(params) { 12 | return request.get('/invite/get', { params }); 13 | } 14 | -------------------------------------------------------------------------------- /src/api/loginRecord.ts: -------------------------------------------------------------------------------- 1 | import { ILoginRecord } from '@/interface'; 2 | import request from '@/utils/request'; 3 | 4 | export function fetchLoginRecordCreate(data: ILoginRecord) { 5 | return request.post(`/login_record/create`, data); 6 | } 7 | -------------------------------------------------------------------------------- /src/api/screenWall.ts: -------------------------------------------------------------------------------- 1 | import { IScreenWall } from '@/interface'; 2 | import request from '@/utils/request'; 3 | 4 | export function fetchScreenWallSetImg(data) { 5 | return request.post('/screen_wall/set_img', data); 6 | } 7 | 8 | export function fetchScreenWallGetImg(params) { 9 | return request.get('/screen_wall/get_img', { params }); 10 | } 11 | 12 | export function fetchScreenWallGetAllImg(params) { 13 | return request.get('/screen_wall/get_all_img', { params }); 14 | } 15 | 16 | export function fetchScreenWallGetImgBySuperAdmin(params) { 17 | return request.get('/screen_wall/get_img_by_superadmin', { params }); 18 | } 19 | 20 | export function fetchScreenWallAddGroup(data) { 21 | return request.post('/screen_wall/add_group', data); 22 | } 23 | 24 | export function fetchScreenWallDelData(data) { 25 | return request.post('/screen_wall/del_data', data); 26 | } 27 | 28 | export function fetchScreenWallDelGroup(data) { 29 | return request.post('/screen_wall/del_group', data); 30 | } 31 | 32 | export function fetchScreenWallEditData(data) { 33 | return request.post('/screen_wall/edit_data', data); 34 | } 35 | 36 | export function fetchScreenWallEditGroup(data) { 37 | return request.post('/screen_wall/edit_group', data); 38 | } 39 | 40 | export function fetchScreenWallAddData(data) { 41 | return request.post('/screen_wall/add_data', data); 42 | } 43 | 44 | export function fetchScreenWallGetData(params) { 45 | return request.get('/screen_wall/get_data', { params }); 46 | } 47 | -------------------------------------------------------------------------------- /src/api/ws.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | export function fetchWsKeepAlive(data) { 4 | return request.post('/ws/keep_alive', data); 5 | } 6 | 7 | export function fetchWsSendMsg(data) { 8 | return request.post('/ws/send_msg', data); 9 | } 10 | -------------------------------------------------------------------------------- /src/assets/css/constant.scss: -------------------------------------------------------------------------------- 1 | $theme-color-gold: #ffd700; 2 | $top-system-bar-height: 50px; 3 | 4 | // 自定义滚动条:https://developer.mozilla.org/zh-CN/docs/Web/CSS/::-webkit-scrollbar 5 | %customScrollbar { 6 | // 整个滚动条 7 | &::-webkit-scrollbar { 8 | width: 8px; 9 | height: 0px; 10 | border-radius: 0px; 11 | background: rgba(0, 0, 0, 0); 12 | } 13 | 14 | // 滚动条轨道 15 | &::-webkit-scrollbar-track { 16 | border-radius: 0px; 17 | background: rgba(0, 0, 0, 0); 18 | box-shadow: rgba(0, 0, 0, 0); 19 | } 20 | 21 | // 滚动条上的滚动滑块 22 | &::-webkit-scrollbar-thumb { 23 | border-radius: 3px; 24 | background: #e0e0e0; 25 | } 26 | } 27 | 28 | // 自定义滚动条:https://developer.mozilla.org/zh-CN/docs/Web/CSS/::-webkit-scrollbar 29 | %hideScrollbar { 30 | // 整个滚动条 31 | &::-webkit-scrollbar { 32 | width: 0px; 33 | height: 0px; 34 | border-radius: 0px; 35 | background: rgba(0, 0, 0, 0); 36 | } 37 | 38 | // 滚动条轨道 39 | &::-webkit-scrollbar-track { 40 | border-radius: 0px; 41 | background: rgba(0, 0, 0, 0); 42 | box-shadow: rgba(0, 0, 0, 0); 43 | } 44 | 45 | // 滚动条上的滚动滑块 46 | &::-webkit-scrollbar-thumb { 47 | border-radius: 3px; 48 | background: transparent; 49 | } 50 | } 51 | 52 | // 自定义滚动条:https://developer.mozilla.org/zh-CN/docs/Web/CSS/::-webkit-scrollbar 53 | %customScrollbarHide { 54 | // 整个滚动条 55 | &::-webkit-scrollbar { 56 | width: 8px; 57 | height: 0px; 58 | border-radius: 0px; 59 | background: rgba(0, 0, 0, 0); 60 | } 61 | 62 | // 滚动条轨道 63 | &::-webkit-scrollbar-track { 64 | border-radius: 0px; 65 | background: rgba(0, 0, 0, 0); 66 | box-shadow: rgba(0, 0, 0, 0); 67 | } 68 | 69 | // 滚动条上的滚动滑块 70 | &::-webkit-scrollbar-thumb { 71 | border-radius: 3px; 72 | background: transparent; 73 | } 74 | } 75 | 76 | // 自定义横向滚动条:https://developer.mozilla.org/zh-CN/docs/Web/CSS/::-webkit-scrollbar 77 | %customHengScrollbar { 78 | /* 滚动条的宽度 */ 79 | &::-webkit-scrollbar { 80 | width: 8px; 81 | height: 4px; 82 | } 83 | 84 | /* 滚动条的滑块 */ 85 | &::-webkit-scrollbar-thumb { 86 | background-color: #888; 87 | border-radius: 3px; 88 | } 89 | } 90 | 91 | // 自定义横向滚动条:https://developer.mozilla.org/zh-CN/docs/Web/CSS/::-webkit-scrollbar 92 | %customHengScrollbarHide { 93 | /* 滚动条的宽度 */ 94 | &::-webkit-scrollbar { 95 | width: 8px; 96 | height: 4px; 97 | } 98 | 99 | /* 滚动条的滑块 */ 100 | &::-webkit-scrollbar-thumb { 101 | background-color: transparent; 102 | border-radius: 3px; 103 | } 104 | } 105 | 106 | // 自定义滚动条:https://developer.mozilla.org/zh-CN/docs/Web/CSS/::-webkit-scrollbar 107 | %customMiniScrollbar { 108 | // 整个滚动条 109 | &::-webkit-scrollbar { 110 | width: 4px; 111 | height: 0px; 112 | border-radius: 0px; 113 | background: rgba(0, 0, 0, 0); 114 | } 115 | 116 | // 滚动条轨道 117 | &::-webkit-scrollbar-track { 118 | border-radius: 0px; 119 | background: rgba(0, 0, 0, 0); 120 | box-shadow: rgba(0, 0, 0, 0); 121 | } 122 | 123 | // 滚动条上的滚动滑块 124 | &::-webkit-scrollbar-thumb { 125 | border-radius: 3px; 126 | background: #e0e0e0; 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /src/assets/css/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 0; 3 | margin: 0; 4 | } 5 | 6 | .n-notification-container--top-right { 7 | top: 30px !important; 8 | } -------------------------------------------------------------------------------- /src/assets/css/main.scss: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 0; 3 | margin: 0; 4 | } 5 | .n-notification-container--top-right { 6 | // 触控栏 7 | top: 30px !important; 8 | } 9 | -------------------------------------------------------------------------------- /src/assets/img/arrow_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/arrow_down.png -------------------------------------------------------------------------------- /src/assets/img/button-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/button-back.png -------------------------------------------------------------------------------- /src/assets/img/button-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/button-home.png -------------------------------------------------------------------------------- /src/assets/img/button-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/button-menu.png -------------------------------------------------------------------------------- /src/assets/img/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/check.png -------------------------------------------------------------------------------- /src/assets/img/clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/clipboard.png -------------------------------------------------------------------------------- /src/assets/img/connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/connect.png -------------------------------------------------------------------------------- /src/assets/img/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/copy.png -------------------------------------------------------------------------------- /src/assets/img/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/edit.png -------------------------------------------------------------------------------- /src/assets/img/exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/exit.png -------------------------------------------------------------------------------- /src/assets/img/fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/fullscreen.png -------------------------------------------------------------------------------- /src/assets/img/link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/link.png -------------------------------------------------------------------------------- /src/assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/logo.png -------------------------------------------------------------------------------- /src/assets/img/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/message.png -------------------------------------------------------------------------------- /src/assets/img/my-wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/my-wechat.png -------------------------------------------------------------------------------- /src/assets/img/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/refresh.png -------------------------------------------------------------------------------- /src/assets/img/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/screenshot.png -------------------------------------------------------------------------------- /src/assets/img/setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/setting.png -------------------------------------------------------------------------------- /src/assets/img/sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/sync.png -------------------------------------------------------------------------------- /src/assets/img/system-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/system-close.png -------------------------------------------------------------------------------- /src/assets/img/system-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/system-min.png -------------------------------------------------------------------------------- /src/assets/img/view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/view.png -------------------------------------------------------------------------------- /src/assets/img/view_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/view_off.png -------------------------------------------------------------------------------- /src/assets/img/volume-down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/volume-down.png -------------------------------------------------------------------------------- /src/assets/img/volume-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/volume-up.png -------------------------------------------------------------------------------- /src/assets/img/volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/img/volume.png -------------------------------------------------------------------------------- /src/assets/readme_img/111.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/111.png -------------------------------------------------------------------------------- /src/assets/readme_img/222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/222.png -------------------------------------------------------------------------------- /src/assets/readme_img/333.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/333.png -------------------------------------------------------------------------------- /src/assets/readme_img/444.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/444.png -------------------------------------------------------------------------------- /src/assets/readme_img/555.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/555.png -------------------------------------------------------------------------------- /src/assets/readme_img/666.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/666.png -------------------------------------------------------------------------------- /src/assets/readme_img/777.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/777.png -------------------------------------------------------------------------------- /src/assets/readme_img/888.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/888.png -------------------------------------------------------------------------------- /src/assets/readme_img/wechat_group1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/wechat_group1.jpg -------------------------------------------------------------------------------- /src/assets/readme_img/wechat_group2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/wechat_group2.jpg -------------------------------------------------------------------------------- /src/assets/readme_img/wechat_group3-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/wechat_group3-1.jpg -------------------------------------------------------------------------------- /src/assets/readme_img/wechat_group3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/wechat_group3.jpg -------------------------------------------------------------------------------- /src/assets/readme_img/wechat_group4-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/wechat_group4-1.jpg -------------------------------------------------------------------------------- /src/assets/readme_img/wechat_group4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galaxy-s10/billd-desk/5365360fd97f61be09c7f751d9210aaa8050e19a/src/assets/readme_img/wechat_group4.jpg -------------------------------------------------------------------------------- /src/components/DisableModal/index.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 50 | 51 | 117 | -------------------------------------------------------------------------------- /src/components/Dropdown/index.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 52 | 53 | 96 | -------------------------------------------------------------------------------- /src/components/GlobalMsgModal/index.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 78 | 79 | 173 | -------------------------------------------------------------------------------- /src/components/Modal/index.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 57 | 58 | 108 | -------------------------------------------------------------------------------- /src/components/NaiveMessage/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/NaiveModal/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/NaiveNotification/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/UpdateModal/index.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 103 | 104 | 177 | -------------------------------------------------------------------------------- /src/components/icons/VPIconChevronDown.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /src/components/icons/VPIconExternalLink.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | -------------------------------------------------------------------------------- /src/constant.ts: -------------------------------------------------------------------------------- 1 | import { Key } from '@nut-tree-fork/shared'; 2 | 3 | import type { BilldHtmlWebpackPluginLog } from '@/interface'; 4 | 5 | export const PROJECT_GITHUB = `https://github.com/galaxy-s10/billd-desk`; 6 | export const WEB_DESK_URL = `https://desk.hsslive.cn`; 7 | 8 | export const AUTHOR_INFO = { 9 | github: 'https://github.com/galaxy-s10', 10 | wechat: 'shuisheng9905', 11 | qq: '2274751790', 12 | }; 13 | 14 | export const COMMON_URL = { 15 | privatizationDeployment: 'https://desk.hsslive.cn/#/privatizationDeployment', 16 | price: 'https://desk.hsslive.cn/#/price', 17 | hi: 'https://desk.hsslive.cn/#/hi', 18 | download: 'https://desk.hsslive.cn/#/download', 19 | officialGroup: 'https://desk.hsslive.cn/#/officialGroup', 20 | payCoursesArticle: `https://www.hsslive.cn/article/151`, 21 | qqGroup: 957845615, 22 | }; 23 | 24 | // @ts-ignore 25 | export const APP_BUILD_INFO = process.env 26 | .BilldHtmlWebpackPlugin as BilldHtmlWebpackPluginLog; 27 | 28 | export const NODE_ENV = process.env.NODE_ENV; 29 | 30 | export const THEME_COLOR = '#ffd700'; 31 | 32 | export const PRODUCT_NAME = 'BilldDesk'; 33 | 34 | export const NUT_KEY_MAP = { 35 | Escape: Key.Escape, // esc 36 | Fn: Key.Fn, 37 | F1: Key.F1, 38 | F2: Key.F2, 39 | F3: Key.F3, 40 | F4: Key.F4, 41 | F5: Key.F5, 42 | F6: Key.F6, 43 | F7: Key.F7, 44 | F8: Key.F8, 45 | F9: Key.F9, 46 | F10: Key.F10, 47 | F11: Key.F11, 48 | F12: Key.F12, 49 | F13: Key.F13, 50 | F14: Key.F14, 51 | F15: Key.F15, 52 | F16: Key.F16, 53 | F17: Key.F17, 54 | F18: Key.F18, 55 | F19: Key.F19, 56 | F20: Key.F20, 57 | F21: Key.F21, 58 | F22: Key.F22, 59 | F23: Key.F23, 60 | F24: Key.F24, 61 | 62 | Backquote: Key.Grave, // 波浪号 63 | Digit1: Key.Num1, 64 | Digit2: Key.Num2, 65 | Digit3: Key.Num3, 66 | Digit4: Key.Num4, 67 | Digit5: Key.Num5, 68 | Digit6: Key.Num6, 69 | Digit7: Key.Num7, 70 | Digit8: Key.Num8, 71 | Digit9: Key.Num9, 72 | Digit0: Key.Num0, 73 | Minus: Key.Minus, // 减号 74 | Equal: Key.Equal, // 等号 75 | Backspace: Key.Backspace, // 删除 76 | 77 | Tab: Key.Tab, 78 | KeyQ: Key.Q, 79 | KeyW: Key.W, 80 | KeyE: Key.E, 81 | KeyR: Key.R, 82 | KeyT: Key.T, 83 | KeyY: Key.Y, 84 | KeyU: Key.U, 85 | KeyI: Key.I, 86 | KeyO: Key.O, 87 | KeyP: Key.P, 88 | BracketLeft: Key.LeftBracket, // 左方括号 89 | BracketRight: Key.RightBracket, // 右方括号 90 | Backslash: Key.Backslash, // 反斜杠 91 | Delete: Key.Delete, // del 92 | 93 | CapsLock: Key.CapsLock, // 大小写切换 94 | KeyA: Key.A, 95 | KeyS: Key.S, 96 | KeyD: Key.D, 97 | KeyF: Key.F, 98 | KeyG: Key.G, 99 | KeyH: Key.H, 100 | KeyJ: Key.J, 101 | KeyK: Key.K, 102 | KeyL: Key.L, 103 | Semicolon: Key.Semicolon, // 分号 104 | Quote: Key.Quote, // 引号 105 | Enter: Key.Enter, // 回车enter 106 | 107 | ShiftLeft: Key.LeftShift, // 左边的shift 108 | KeyZ: Key.Z, 109 | KeyX: Key.X, 110 | KeyC: Key.C, 111 | KeyV: Key.V, 112 | KeyB: Key.B, 113 | KeyN: Key.N, 114 | KeyM: Key.M, 115 | Comma: Key.Comma, // 逗号 116 | Period: Key.Period, // 句号 117 | Slash: Key.Slash, // 斜杠 118 | ShiftRight: Key.RightShift, // 右边边的shift 119 | 120 | fn: 'fn', 121 | ControlLeft: Key.LeftControl, 122 | Alt: Key.LeftAlt, 123 | MetaLeft: Key.LeftCmd, 124 | Space: Key.Space, 125 | MetaRight: Key.RightCmd, 126 | AltRight: Key.RightAlt, 127 | ControlRight: Key.RightControl, 128 | 129 | ArrowUp: Key.Up, 130 | ArrowDown: Key.Down, 131 | ArrowLeft: Key.Left, 132 | ArrowRight: Key.Right, 133 | 134 | // 右侧小键盘 135 | Home: Key.Home, 136 | End: Key.End, 137 | Insert: Key.Insert, 138 | Print: Key.Print, 139 | PageUp: Key.PageUp, 140 | PageDown: Key.PageDown, 141 | Pause: Key.Pause, 142 | ScrollLock: Key.ScrollLock, 143 | 144 | // 数字小键盘 145 | Numpad1: Key.Num1, 146 | Numpad2: Key.Num2, 147 | Numpad3: Key.Num3, 148 | Numpad4: Key.Num4, 149 | Numpad5: Key.Num5, 150 | Numpad6: Key.Num6, 151 | Numpad7: Key.Num7, 152 | Numpad8: Key.Num8, 153 | Numpad9: Key.Num9, 154 | Numpad0: Key.Num0, 155 | 156 | // 没用到 157 | // RightCmd: Key.RightCmd, 158 | }; 159 | 160 | // 全局的cookie的key 161 | export const COOKIE_KEY = {}; 162 | 163 | export const LS_KEY_PREFIX = 'billd_desk___'; 164 | 165 | // 全局的localStorage的key 166 | export const LS_KEY = { 167 | lastBuildDate: 'lastBuildDate', 168 | uuid: 'uuid', 169 | password: 'password', 170 | token: 'token', 171 | api: 'api', 172 | wss: 'wss', 173 | turn: 'turn', 174 | preview: 'preview', 175 | todaylock: 'todaylock', 176 | }; 177 | 178 | export const pricePageData = { 179 | currentTab: 'priceTwo', 180 | tab: [ 181 | { 182 | id: 'priceOne', 183 | txt: '个人订阅', 184 | }, 185 | { 186 | id: 'priceTwo', 187 | txt: '个人套餐', 188 | }, 189 | { 190 | id: 'priceThree', 191 | txt: '企业订阅', 192 | }, 193 | { 194 | id: 'priceFour', 195 | txt: '企业套餐', 196 | }, 197 | ], 198 | detail: { 199 | priceOne: { 200 | slogan: ['一次性源码,适合个人用户', '欢迎订阅🚀'], 201 | list: [ 202 | { 203 | color: '#38c0ff', 204 | name: '远程控制桌面端', 205 | desc: '基于Vue3 + WebRTC + Electron', 206 | price: { 207 | left: '¥', 208 | center: '599', 209 | right: '元', 210 | }, 211 | tip: '包含以下代码仓库:', 212 | feat: [ 213 | { 214 | status: 'done', 215 | txt: 'billd-desk-pro', 216 | }, 217 | ], 218 | btn: { 219 | type: 'showContact', 220 | link: '', 221 | txt: '立即咨询', 222 | }, 223 | }, 224 | { 225 | color: '#597ef7', 226 | name: '远程控制后台', 227 | desc: '基于Vue3 + NaiveUI + Vite6', 228 | price: { 229 | left: '¥', 230 | center: '599', 231 | right: '元', 232 | }, 233 | tip: '包含以下代码仓库:', 234 | feat: [ 235 | { 236 | status: 'todo', 237 | txt: 'billd-desk-admin-pro', 238 | }, 239 | ], 240 | btn: { 241 | type: 'todo', 242 | link: '', 243 | txt: '敬请期待', 244 | }, 245 | }, 246 | { 247 | color: '#30d1aa', 248 | name: '远程控制后端', 249 | desc: '基于Nodejs + Koa2 + TypeScript', 250 | price: { 251 | left: '¥', 252 | center: '599', 253 | right: '元', 254 | }, 255 | tip: '包含以下代码仓库:', 256 | feat: [ 257 | { 258 | status: 'done', 259 | txt: 'billd-desk-server-pro', 260 | }, 261 | ], 262 | btn: { 263 | type: 'showContact', 264 | link: '', 265 | txt: '立即咨询', 266 | }, 267 | }, 268 | { 269 | color: '#ffa940', 270 | name: '远程控制App端', 271 | desc: '基于Flutter3 + WebRTC', 272 | price: { 273 | left: '¥', 274 | center: '599', 275 | right: '元', 276 | }, 277 | tip: '包含以下代码仓库:', 278 | feat: [ 279 | { 280 | status: 'done', 281 | txt: 'billd-desk-flutter-pro', 282 | }, 283 | ], 284 | btn: { 285 | type: 'showContact', 286 | link: '', 287 | txt: '立即咨询', 288 | }, 289 | }, 290 | ], 291 | }, 292 | priceTwo: { 293 | slogan: ['一次性源码,适合个人用户', '套餐订阅更优惠!🚀'], 294 | list: [ 295 | { 296 | color: '#1677ff', 297 | name: '远程控制', 298 | desc: '网页/客户端远程控制', 299 | price: { 300 | left: '¥', 301 | center: '899', 302 | right: '元', 303 | }, 304 | tip: '包含以下代码仓库:', 305 | feat: [ 306 | { 307 | status: 'done', 308 | txt: 'billd-desk-pro', 309 | }, 310 | { 311 | status: 'done', 312 | txt: 'billd-desk-server-pro', 313 | }, 314 | ], 315 | btn: { 316 | type: 'showContact', 317 | link: '', 318 | txt: '立即咨询', 319 | }, 320 | }, 321 | { 322 | color: '#EE826C', 323 | name: 'App远程控制', 324 | desc: '手机App远程控制', 325 | price: { 326 | left: '¥', 327 | center: '899', 328 | right: '元', 329 | }, 330 | tip: '包含以下代码仓库:', 331 | feat: [ 332 | { 333 | status: 'done', 334 | txt: 'billd-desk-flutter-pro', 335 | }, 336 | { 337 | status: 'done', 338 | txt: 'billd-desk-server-pro', 339 | }, 340 | ], 341 | btn: { 342 | type: 'showContact', 343 | link: '', 344 | txt: '立即咨询', 345 | }, 346 | }, 347 | { 348 | color: '#bae637', 349 | name: '远程控制+后台', 350 | desc: '网页/客户端远程控制;
远程控制后台', 351 | price: { 352 | left: '¥', 353 | center: '1099', 354 | right: '元', 355 | }, 356 | tip: '包含以下代码仓库:', 357 | feat: [ 358 | { 359 | status: 'done', 360 | txt: 'billd-desk-pro', 361 | }, 362 | { 363 | status: 'todo', 364 | txt: 'billd-desk-admin-pro', 365 | }, 366 | { 367 | status: 'done', 368 | txt: 'billd-desk-server-pro', 369 | }, 370 | ], 371 | btn: { 372 | type: 'todo', 373 | link: '', 374 | txt: '敬请期待', 375 | }, 376 | }, 377 | { 378 | color: '#eb2f96', 379 | name: 'App远程控制+后台', 380 | desc: '手机App远程控制;
远程控制后台', 381 | price: { 382 | left: '¥', 383 | center: '1099', 384 | right: '元', 385 | }, 386 | tip: '包含以下代码仓库:', 387 | feat: [ 388 | { 389 | status: 'done', 390 | txt: 'billd-desk-flutter-pro', 391 | }, 392 | { 393 | status: 'todo', 394 | txt: 'billd-desk-admin-pro', 395 | }, 396 | { 397 | status: 'done', 398 | txt: 'billd-desk-server-pro', 399 | }, 400 | ], 401 | btn: { 402 | type: 'todo', 403 | link: '', 404 | txt: '敬请期待', 405 | }, 406 | }, 407 | { 408 | color: '#13c2c2', 409 | name: '全平台远程控制', 410 | desc: '网页/客户端远程控制;
手机App远程控制;
远程控制后台', 411 | price: { 412 | left: '¥', 413 | center: '1299', 414 | right: '元', 415 | }, 416 | tip: '包含以下代码仓库:', 417 | feat: [ 418 | { 419 | status: 'done', 420 | txt: 'billd-desk-pro', 421 | }, 422 | { 423 | status: 'done', 424 | txt: 'billd-desk-flutter-pro', 425 | }, 426 | { 427 | status: 'todo', 428 | txt: 'billd-desk-admin-pro', 429 | }, 430 | { 431 | status: 'done', 432 | txt: 'billd-desk-server-pro', 433 | }, 434 | ], 435 | btn: { 436 | type: 'todo', 437 | link: '', 438 | txt: '敬请期待', 439 | }, 440 | }, 441 | ], 442 | }, 443 | priceThree: { 444 | slogan: ['源码永久更新,适合企业用户', '欢迎订阅🚀'], 445 | list: [ 446 | { 447 | color: '#38c0ff', 448 | name: '远程控制桌面端', 449 | desc: '基于Vue3 + WebRTC + Electron', 450 | price: { 451 | left: '¥', 452 | center: '999', 453 | right: '元/永久', 454 | }, 455 | tip: '包含以下代码仓库:', 456 | feat: [ 457 | { 458 | status: 'done', 459 | txt: 'billd-desk-pro', 460 | }, 461 | ], 462 | btn: { 463 | type: 'showContact', 464 | link: '', 465 | txt: '立即咨询', 466 | }, 467 | }, 468 | { 469 | color: '#597ef7', 470 | name: '远程控制后台', 471 | desc: '基于Vue3 + NaiveUI + Vite6', 472 | price: { 473 | left: '¥', 474 | center: '999', 475 | right: '元/永久', 476 | }, 477 | tip: '包含以下代码仓库:', 478 | feat: [ 479 | { 480 | status: 'todo', 481 | txt: 'billd-desk-admin-pro', 482 | }, 483 | ], 484 | btn: { 485 | type: 'todo', 486 | link: '', 487 | txt: '敬请期待', 488 | }, 489 | }, 490 | { 491 | color: '#30d1aa', 492 | name: '远程控制后端', 493 | desc: '基于Nodejs + Koa2 + TypeScript', 494 | price: { 495 | left: '¥', 496 | center: '999', 497 | right: '元/永久', 498 | }, 499 | tip: '包含以下代码仓库:', 500 | feat: [ 501 | { 502 | status: 'done', 503 | txt: 'billd-desk-server-pro', 504 | }, 505 | ], 506 | btn: { 507 | type: 'showContact', 508 | link: '', 509 | txt: '立即咨询', 510 | }, 511 | }, 512 | { 513 | color: '#ffa940', 514 | name: '远程控制App端', 515 | desc: '基于Flutter3 + WebRTC', 516 | price: { 517 | left: '¥', 518 | center: '999', 519 | right: '元/永久', 520 | }, 521 | tip: '包含以下代码仓库:', 522 | feat: [ 523 | { 524 | status: 'done', 525 | txt: 'billd-desk-flutter-pro', 526 | }, 527 | ], 528 | btn: { 529 | type: 'showContact', 530 | link: '', 531 | txt: '立即咨询', 532 | }, 533 | }, 534 | ], 535 | }, 536 | priceFour: { 537 | slogan: ['源码永久更新,适合企业用户', '套餐订阅更优惠!🚀'], 538 | list: [ 539 | { 540 | color: '#1677ff', 541 | name: '远程控制', 542 | desc: '网页/客户端远程控制', 543 | price: { 544 | left: '¥', 545 | center: '1399', 546 | right: '元/永久', 547 | }, 548 | tip: '包含以下代码仓库:', 549 | feat: [ 550 | { 551 | status: 'done', 552 | txt: 'billd-desk-pro', 553 | }, 554 | { 555 | status: 'done', 556 | txt: 'billd-desk-server-pro', 557 | }, 558 | ], 559 | btn: { 560 | type: 'showContact', 561 | link: '', 562 | txt: '立即咨询', 563 | }, 564 | }, 565 | { 566 | color: '#EE826C', 567 | name: 'App远程控制', 568 | desc: '手机App远程控制', 569 | price: { 570 | left: '¥', 571 | center: '1399', 572 | right: '元/永久', 573 | }, 574 | tip: '包含以下代码仓库:', 575 | feat: [ 576 | { 577 | status: 'done', 578 | txt: 'billd-desk-flutter-pro', 579 | }, 580 | { 581 | status: 'done', 582 | txt: 'billd-desk-server-pro', 583 | }, 584 | ], 585 | btn: { 586 | type: 'showContact', 587 | link: '', 588 | txt: '立即咨询', 589 | }, 590 | }, 591 | { 592 | color: '#bae637', 593 | name: '远程控制+后台', 594 | desc: '网页/客户端远程控制;
远程控制后台', 595 | price: { 596 | left: '¥', 597 | center: '1599', 598 | right: '元/永久', 599 | }, 600 | tip: '包含以下代码仓库:', 601 | feat: [ 602 | { 603 | status: 'done', 604 | txt: 'billd-desk-pro', 605 | }, 606 | { 607 | status: 'todo', 608 | txt: 'billd-desk-admin-pro', 609 | }, 610 | { 611 | status: 'done', 612 | txt: 'billd-desk-server-pro', 613 | }, 614 | ], 615 | btn: { 616 | type: 'todo', 617 | link: '', 618 | txt: '敬请期待', 619 | }, 620 | }, 621 | { 622 | color: '#eb2f96', 623 | name: 'App远程控制+后台', 624 | desc: '手机App远程控制;
远程控制后台', 625 | price: { 626 | left: '¥', 627 | center: '1599', 628 | right: '元/永久', 629 | }, 630 | tip: '包含以下代码仓库:', 631 | feat: [ 632 | { 633 | status: 'done', 634 | txt: 'billd-desk-flutter-pro', 635 | }, 636 | { 637 | status: 'todo', 638 | txt: 'billd-desk-admin-pro', 639 | }, 640 | { 641 | status: 'done', 642 | txt: 'billd-desk-server-pro', 643 | }, 644 | ], 645 | btn: { 646 | type: 'todo', 647 | link: '', 648 | txt: '敬请期待', 649 | }, 650 | }, 651 | { 652 | color: '#13c2c2', 653 | name: '全平台远程控制', 654 | desc: '网页/客户端远程控制;
手机App远程控制;
远程控制后台', 655 | price: { 656 | left: '¥', 657 | center: '1799', 658 | right: '元/永久', 659 | }, 660 | tip: '包含以下代码仓库:', 661 | feat: [ 662 | { 663 | status: 'done', 664 | txt: 'billd-desk-pro', 665 | }, 666 | { 667 | status: 'done', 668 | txt: 'billd-desk-flutter-pro', 669 | }, 670 | { 671 | status: 'todo', 672 | txt: 'billd-desk-admin-pro', 673 | }, 674 | { 675 | status: 'done', 676 | txt: 'billd-desk-server-pro', 677 | }, 678 | ], 679 | btn: { 680 | type: 'todo', 681 | link: '', 682 | txt: '敬请期待', 683 | }, 684 | }, 685 | ], 686 | }, 687 | }, 688 | }; 689 | 690 | export const privatizationDeploymentData = { 691 | currentTab: 'single', 692 | tab: [ 693 | { 694 | id: 'single', 695 | txt: '开源版', 696 | }, 697 | { 698 | id: 'multi', 699 | txt: '高级版', 700 | }, 701 | { 702 | id: 'forever', 703 | txt: '定制版', 704 | }, 705 | ], 706 | detail: { 707 | single: { 708 | slogan: ['BilldDesk开源版允许商用!', '欢迎部署🚀'], 709 | list: [ 710 | { 711 | color: '#1677ff', 712 | name: '远程控制', 713 | desc: '网页/客户端远程控制', 714 | price: { 715 | left: '¥', 716 | center: '0', 717 | right: '元', 718 | }, 719 | tip: '包含以下代码仓库:', 720 | feat: [ 721 | { 722 | status: 'done', 723 | txt: 'billd-desk', 724 | }, 725 | { 726 | status: 'done', 727 | txt: 'billd-desk-server', 728 | }, 729 | ], 730 | btn: { 731 | type: 'link', 732 | link: 'https://github.com/galaxy-s10/billd-desk', 733 | txt: '立即部署', 734 | }, 735 | }, 736 | { 737 | color: '#EE826C', 738 | name: 'App远程控制', 739 | desc: '手机App远程控制', 740 | price: { 741 | left: '¥', 742 | center: '0', 743 | right: '元', 744 | }, 745 | tip: '包含以下代码仓库:', 746 | feat: [ 747 | { 748 | status: 'done', 749 | txt: 'billd-desk-flutter', 750 | }, 751 | { 752 | status: 'done', 753 | txt: 'billd-desk-server', 754 | }, 755 | ], 756 | btn: { 757 | type: 'link', 758 | link: 'https://github.com/galaxy-s10/billd-desk', 759 | txt: '立即部署', 760 | }, 761 | }, 762 | { 763 | color: '#bae637', 764 | name: '远程控制+后台', 765 | desc: '网页/客户端远程控制;
远程控制后台', 766 | price: { 767 | left: '¥', 768 | center: '0', 769 | right: '元', 770 | }, 771 | tip: '包含以下代码仓库:', 772 | feat: [ 773 | { 774 | status: 'done', 775 | txt: 'billd-desk', 776 | }, 777 | { 778 | status: 'todo', 779 | txt: 'billd-desk-admin', 780 | }, 781 | { 782 | status: 'done', 783 | txt: 'billd-desk-server', 784 | }, 785 | ], 786 | btn: { 787 | type: 'link', 788 | link: 'https://github.com/galaxy-s10/billd-desk', 789 | txt: '立即部署', 790 | }, 791 | }, 792 | { 793 | color: '#eb2f96', 794 | name: 'App远程控制+后台', 795 | desc: '手机App远程控制;
远程控制后台', 796 | price: { 797 | left: '¥', 798 | center: '0', 799 | right: '元', 800 | }, 801 | tip: '包含以下代码仓库:', 802 | feat: [ 803 | { 804 | status: 'done', 805 | txt: 'billd-desk-flutter', 806 | }, 807 | { 808 | status: 'todo', 809 | txt: 'billd-desk-admin', 810 | }, 811 | { 812 | status: 'done', 813 | txt: 'billd-desk-server', 814 | }, 815 | ], 816 | btn: { 817 | type: 'link', 818 | link: 'https://github.com/galaxy-s10/billd-desk', 819 | txt: '立即部署', 820 | }, 821 | }, 822 | { 823 | color: '#13c2c2', 824 | name: '全平台远程控制', 825 | desc: '网页/客户端远程控制;
手机App远程控制;
远程控制后台', 826 | price: { 827 | left: '¥', 828 | center: '0', 829 | right: '元', 830 | }, 831 | tip: '包含以下代码仓库:', 832 | feat: [ 833 | { 834 | status: 'done', 835 | txt: 'billd-desk', 836 | }, 837 | { 838 | status: 'done', 839 | txt: 'billd-desk-flutter', 840 | }, 841 | { 842 | status: 'todo', 843 | txt: 'billd-desk-admin', 844 | }, 845 | { 846 | status: 'done', 847 | txt: 'billd-desk-server', 848 | }, 849 | ], 850 | btn: { 851 | type: 'link', 852 | link: 'https://github.com/galaxy-s10/billd-desk', 853 | txt: '立即部署', 854 | }, 855 | }, 856 | ], 857 | }, 858 | multi: { 859 | slogan: ['一次部署,永久使用!', '无需懂技术,全程专人部署🚀'], 860 | list: [ 861 | { 862 | color: '#1677ff', 863 | name: '远程控制', 864 | desc: '网页/客户端远程控制', 865 | price: { 866 | left: '¥', 867 | center: '4999', 868 | right: '元', 869 | }, 870 | tip: '包含以下代码仓库:', 871 | feat: [ 872 | { 873 | status: 'done', 874 | txt: 'billd-desk-pro', 875 | }, 876 | { 877 | status: 'done', 878 | txt: 'billd-desk-server-pro', 879 | }, 880 | ], 881 | btn: { 882 | type: 'showContact', 883 | link: '', 884 | txt: '立即咨询', 885 | }, 886 | }, 887 | { 888 | color: '#EE826C', 889 | name: 'App远程控制', 890 | desc: '手机App远程控制', 891 | price: { 892 | left: '¥', 893 | center: '4999', 894 | right: '元', 895 | }, 896 | tip: '包含以下代码仓库:', 897 | feat: [ 898 | { 899 | status: 'done', 900 | txt: 'billd-desk-flutter-pro', 901 | }, 902 | { 903 | status: 'done', 904 | txt: 'billd-desk-server-pro', 905 | }, 906 | ], 907 | btn: { 908 | type: 'showContact', 909 | link: '', 910 | txt: '立即咨询', 911 | }, 912 | }, 913 | { 914 | color: '#bae637', 915 | name: '远程控制+后台', 916 | desc: '网页/客户端远程控制;
远程控制后台', 917 | price: { 918 | left: '¥', 919 | center: '5999', 920 | right: '元', 921 | }, 922 | tip: '包含以下代码仓库:', 923 | feat: [ 924 | { 925 | status: 'done', 926 | txt: 'billd-desk-pro', 927 | }, 928 | { 929 | status: 'todo', 930 | txt: 'billd-desk-admin-pro', 931 | }, 932 | { 933 | status: 'done', 934 | txt: 'billd-desk-server-pro', 935 | }, 936 | ], 937 | btn: { 938 | type: 'todo', 939 | link: '', 940 | txt: '敬请期待', 941 | }, 942 | }, 943 | { 944 | color: '#eb2f96', 945 | name: 'App远程控制+后台', 946 | desc: '手机App远程控制;
远程控制后台', 947 | price: { 948 | left: '¥', 949 | center: '5999', 950 | right: '元', 951 | }, 952 | tip: '包含以下代码仓库:', 953 | feat: [ 954 | { 955 | status: 'done', 956 | txt: 'billd-desk-flutter-pro', 957 | }, 958 | { 959 | status: 'todo', 960 | txt: 'billd-desk-admin-pro', 961 | }, 962 | { 963 | status: 'done', 964 | txt: 'billd-desk-server-pro', 965 | }, 966 | ], 967 | btn: { 968 | type: 'todo', 969 | link: '', 970 | txt: '敬请期待', 971 | }, 972 | }, 973 | { 974 | color: '#13c2c2', 975 | name: '全平台远程控制', 976 | desc: '网页/客户端远程控制;
手机App远程控制;
远程控制后台', 977 | price: { 978 | left: '¥', 979 | center: '6999', 980 | right: '元', 981 | }, 982 | tip: '包含以下代码仓库:', 983 | feat: [ 984 | { 985 | status: 'done', 986 | txt: 'billd-desk-pro', 987 | }, 988 | { 989 | status: 'done', 990 | txt: 'billd-desk-flutter-pro', 991 | }, 992 | { 993 | status: 'todo', 994 | txt: 'billd-desk-admin-pro', 995 | }, 996 | { 997 | status: 'done', 998 | txt: 'billd-desk-server-pro', 999 | }, 1000 | ], 1001 | btn: { 1002 | type: 'todo', 1003 | link: '', 1004 | txt: '敬请期待', 1005 | }, 1006 | }, 1007 | ], 1008 | }, 1009 | forever: { 1010 | slogan: ['BilldDesk支持定制化!', '适合二开,定制个性化功能~'], 1011 | list: [ 1012 | { 1013 | color: '#38c0ff', 1014 | name: '在线咨询', 1015 | desc: '咨询任何问题服务', 1016 | price: { 1017 | left: '¥', 1018 | center: '100', 1019 | right: '元/小时', 1020 | }, 1021 | tip: '', 1022 | feat: [ 1023 | { 1024 | status: 'done', 1025 | txt: '一对一解答', 1026 | }, 1027 | ], 1028 | btn: { 1029 | type: 'showContact', 1030 | link: '', 1031 | txt: '立即咨询', 1032 | }, 1033 | }, 1034 | { 1035 | color: '#eb2f96', 1036 | name: '技术支持', 1037 | desc: '处理技术相关问题服务', 1038 | price: { 1039 | left: '¥', 1040 | center: '200', 1041 | right: '元/小时', 1042 | }, 1043 | tip: '', 1044 | feat: [ 1045 | { 1046 | status: 'done', 1047 | txt: '远程协助处理问题', 1048 | }, 1049 | ], 1050 | btn: { 1051 | type: 'showContact', 1052 | link: '', 1053 | txt: '立即咨询', 1054 | }, 1055 | }, 1056 | { 1057 | color: '#30d1aa', 1058 | name: '定制私有化部署', 1059 | desc: '适用于个人/企业自建远程桌面', 1060 | price: { 1061 | left: '¥', 1062 | center: '6999', 1063 | right: '元/起', 1064 | }, 1065 | tip: '包含以下代码仓库:', 1066 | feat: [ 1067 | { 1068 | status: 'done', 1069 | txt: 'billd-desk-pro', 1070 | }, 1071 | { 1072 | status: 'done', 1073 | txt: 'billd-desk-server-pro', 1074 | }, 1075 | ], 1076 | btn: { 1077 | type: 'showContact', 1078 | link: '', 1079 | txt: '立即咨询', 1080 | }, 1081 | }, 1082 | ], 1083 | }, 1084 | }, 1085 | }; 1086 | -------------------------------------------------------------------------------- /src/interface.ts: -------------------------------------------------------------------------------- 1 | export interface BilldHtmlWebpackPluginLog { 2 | pkgName: string; 3 | pkgVersion: string; 4 | pkgRepository: string; 5 | commitSubject: string; 6 | commitBranch: string; 7 | committerDate: string; 8 | commitHash: string; 9 | committerName: string; 10 | committerEmail: string; 11 | lastBuildDate: string; 12 | } 13 | 14 | export interface IDeskVersion { 15 | id?: number; 16 | type?: string; 17 | /** 1:强制更新; 2:不强制更新 */ 18 | force?: number; 19 | /** 版本 */ 20 | version?: string; 21 | /** 显示版本 */ 22 | show_version?: string; 23 | /** 更新内容 */ 24 | update_content?: string; 25 | /** 更新日期 */ 26 | update_date?: string; 27 | /** 是否禁用,1:禁用; 2:不禁用 */ 28 | disable?: number; 29 | /** 禁用消息 */ 30 | disable_msg?: number; 31 | /** macos 32位ARM */ 32 | download_macos_arm_dmg?: string; 33 | /** macos 64位ARM */ 34 | download_macos_arm64_dmg?: string; 35 | /** macos 64位X86,X86是x86_64 或 amd64的别名 */ 36 | download_macos_x64_dmg?: string; 37 | /** windows 32位ARM */ 38 | download_windows_arm_exe?: string; 39 | /** windows 64位ARM */ 40 | download_windows_arm64_exe?: string; 41 | /** windows 64位X86,X86是x86_64 或 amd64的别名 */ 42 | download_windows_x64_exe?: string; 43 | /** linux 32位ARM */ 44 | download_linux_arm_appimage?: string; 45 | /** linux 64位ARM */ 46 | download_linux_arm64_appimage?: string; 47 | /** linux 64位X86,X86是x86_64 或 amd64的别名 */ 48 | download_linux_x64_appimage?: string; 49 | /** linux deb 32位ARM */ 50 | download_linux_arm_deb?: string; 51 | /** linux deb 64位ARM */ 52 | download_linux_arm64_deb?: string; 53 | /** linux deb 64位X86,X86是x86_64 或 amd64的别名 */ 54 | download_linux_x64_deb?: string; 55 | download_android_apk?: string; 56 | download_ios_ipa?: string; 57 | download_ios_deb?: string; 58 | download_ios_pxl?: string; 59 | remark?: string; 60 | 61 | created_at?: string; 62 | updated_at?: string; 63 | deleted_at?: string; 64 | } 65 | 66 | export enum MediaTypeEnum { 67 | camera, 68 | screen, 69 | microphone, 70 | txt, 71 | img, 72 | media, 73 | time, 74 | stopwatch, 75 | webAudio, 76 | pk, 77 | metting, 78 | } 79 | 80 | export enum ClientEnvEnum { 81 | android = 'android', 82 | ios = 'ios', 83 | ipad = 'ipad', 84 | web = 'web', 85 | web_mobile = 'web_mobile', 86 | web_pc = 'web_pc', 87 | windows = 'windows', 88 | macos = 'macos', 89 | linux = 'linux', 90 | } 91 | 92 | export enum ClientAppEnum { 93 | billd_live = 'billd_live', 94 | billd_live_admin = 'billd_live_admin', 95 | billd_desk = 'billd_desk', 96 | billd_desk_admin = 'billd_desk_admin', 97 | } 98 | 99 | export interface IDeskUser { 100 | id?: number; 101 | uuid?: string; 102 | password?: string; 103 | new_password?: string; 104 | /** status: 1正常;2非法 */ 105 | status?: number; 106 | created_at?: string; 107 | updated_at?: string; 108 | deleted_at?: string; 109 | } 110 | 111 | export interface IScreenWall { 112 | id?: number; 113 | uuid?: string; 114 | group_name?: string; 115 | c_uuid?: string; 116 | c_password?: string; 117 | 118 | created_at?: string; 119 | updated_at?: string; 120 | deleted_at?: string; 121 | } 122 | 123 | export enum DeskConfigTypeEnum { 124 | electronVersionConfig = 'electronVersionConfig', 125 | flutterVersionConfig = 'flutterVersionConfig', 126 | } 127 | 128 | export type IListBase = { 129 | nowPage?: number | string; 130 | pageSize?: number | string; 131 | orderBy?: string; 132 | orderName?: string; 133 | keyWord?: string; 134 | childNowPage?: number | string; 135 | childPageSize?: number | string; 136 | childOrderBy?: string; 137 | childOrderName?: string; 138 | childKeyWord?: string; 139 | rangTimeType?: 'created_at' | 'updated_at' | 'deleted_at'; 140 | rangTimeStart?: number | string; 141 | rangTimeEnd?: number | string; 142 | }; 143 | 144 | export type IList = IListBase & T; 145 | 146 | export interface IPaging { 147 | nowPage: number; 148 | pageSize: number; 149 | hasMore: boolean; 150 | total: number; 151 | rows: T[]; 152 | } 153 | 154 | export enum GlobalMsgTypeEnum { 155 | user = 'user', 156 | system = 'system', 157 | activity = 'activity', 158 | notification = 'notification', 159 | alwaysRedMsg = 'alwaysRedMsg', 160 | } 161 | 162 | export enum SwitchEnum { 163 | yes, 164 | no, 165 | } 166 | 167 | export interface IGlobalMsg { 168 | id?: number; 169 | user_id?: number; 170 | client_ip?: string; 171 | type?: GlobalMsgTypeEnum; 172 | show?: SwitchEnum; 173 | show_date?: string; 174 | priority?: number; 175 | title?: string; 176 | content?: string; 177 | remark?: string; 178 | 179 | created_at?: string; 180 | updated_at?: string; 181 | deleted_at?: string; 182 | } 183 | 184 | export interface ILoginRecord { 185 | id?: number; 186 | uuid?: string; 187 | user_agent?: string; 188 | system?: string; 189 | brand?: string; 190 | model?: string; 191 | client_ip?: string; 192 | client_env?: ClientEnvEnum; 193 | client_app?: ClientAppEnum; 194 | client_app_version?: string; 195 | remark?: string; 196 | 197 | created_at?: string; 198 | updated_at?: string; 199 | deleted_at?: string; 200 | } 201 | 202 | export type closeMainWindowType = 'mini' | 'exit'; 203 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import '@/assets/css/main.scss'; 2 | import { createApp } from 'vue'; 3 | 4 | import router from '@/router/index'; 5 | import store from '@/store/index'; 6 | 7 | import App from './App.vue'; 8 | 9 | const app = createApp(App); 10 | 11 | app.use(store); 12 | app.use(router); 13 | 14 | app.mount('#app'); 15 | -------------------------------------------------------------------------------- /src/pure-constant.ts: -------------------------------------------------------------------------------- 1 | export const WINDOW_ID_MAP = { 2 | remote: 1, 3 | webrtc: 2, 4 | about: 3, 5 | layout: 4, 6 | fixedPopupWindow: 5, 7 | }; 8 | 9 | export const ENGLISH_LETTER = [ 10 | 'a', 11 | 'b', 12 | 'c', 13 | 'd', 14 | 'e', 15 | 'f', 16 | 'g', 17 | 'h', 18 | 'i', 19 | 'j', 20 | 'k', 21 | 'l', 22 | 'm', 23 | 'n', 24 | 'o', 25 | 'p', 26 | 'q', 27 | 'r', 28 | 's', 29 | 't', 30 | 'u', 31 | 'v', 32 | 'w', 33 | 'x', 34 | 'y', 35 | 'z', 36 | ]; 37 | 38 | export const IPC_EVENT = { 39 | powerSaveBlockerStart: 'powerSaveBlockerStart', 40 | closeAllWindow: 'closeAllWindow', 41 | closeWindow: 'closeWindow', 42 | windowMinimize: 'windowMinimize', 43 | windowMaximize: 'windowMaximize', 44 | handleOpenDevTools: 'handleOpenDevTools', 45 | handleMoveScreenRightBottom: 'handleMoveScreenRightBottom', 46 | mouseScrollDown: 'mouseScrollDown', 47 | mouseScrollUp: 'mouseScrollUp', 48 | mouseScrollLeft: 'mouseScrollLeft', 49 | mouseScrollRight: 'mouseScrollRight', 50 | mouseSetPosition: 'mouseSetPosition', 51 | mouseMove: 'mouseMove', 52 | mouseDrag: 'mouseDrag', 53 | keyboardType: 'keyboardType', 54 | keyboardReleaseKey: 'keyboardReleaseKey', 55 | keyboardPressKey: 'keyboardPressKey', 56 | mousePressButtonLeft: 'mousePressButtonLeft', 57 | mouseReleaseButtonLeft: 'mouseReleaseButtonLeft', 58 | mouseDoubleClick: 'mouseDoubleClick', 59 | mouseLeftClick: 'mouseLeftClick', 60 | mouseRightClick: 'mouseRightClick', 61 | getMousePosition: 'getMousePosition', 62 | setWindowBounds: 'setWindowBounds', 63 | getWindowTitlebarHeight: 'getWindowTitlebarHeight', 64 | setWindowPosition: 'setWindowPosition', 65 | getWindowPosition: 'getWindowPosition', 66 | getScreenStream: 'getScreenStream', 67 | getThumbnail: 'getThumbnail', 68 | getWindowStream: 'getWindowStream', 69 | setAlwaysOnTop: 'setAlwaysOnTop', 70 | createWindow: 'createWindow', 71 | powerMonitorSuspend: 'powerMonitorSuspend', 72 | powerMonitorResume: 'powerMonitorResume', 73 | shellOpenExternal: 'shellOpenExternal', 74 | globalShortcut: 'globalShortcut', 75 | getArch: 'getArch', 76 | writeFile: 'writeFile', 77 | powerBoot: 'powerBoot', 78 | powerBootStatus: 'powerBootStatus', 79 | windowManager: 'windowManager', 80 | getAllWindowName: 'getAllWindowName', 81 | getPrimaryDisplay: 'getPrimaryDisplay', 82 | request_rtcMap: 'request_rtcMap', 83 | message: 'message', 84 | getAllWindowMap: 'getAllWindowMap', 85 | windowHide: 'windowHide', 86 | windowClose: 'windowClose', 87 | getSystemInfo: 'getSystemInfo', 88 | setMainWindowPosition: 'setMainWindowPosition', 89 | debugInfo: 'debugInfo', 90 | sudoPrompt: 'sudoPrompt', 91 | runService: 'runService', 92 | unInstallService: 'unInstallService', 93 | eLog: 'eLog', 94 | psExecStartup: 'psExecStartup', 95 | quit: 'quit', 96 | 97 | response_powerSaveBlockerStart: 'response_powerSaveBlockerStart', 98 | response_closeAllWindow: 'response_closeAllWindow', 99 | response_closeWindow: 'response_closeWindow', 100 | response_closeWindowed: 'response_closeWindowed', 101 | response_windowMinimize: 'response_windowMinimize', 102 | response_windowMaximize: 'response_windowMaximize', 103 | response_handleOpenDevTools: 'response_handleOpenDevTools', 104 | response_handleMoveScreenRightBottom: 'response_handleMoveScreenRightBottom', 105 | response_mouseScrollDown: 'response_mouseScrollDown', 106 | response_mouseScrollUp: 'response_mouseScrollUp', 107 | response_mouseScrollLeft: 'response_mouseScrollLeft', 108 | response_mouseScrollRight: 'response_mouseScrollRight', 109 | response_mouseSetPosition: 'response_mouseSetPosition', 110 | response_mouseMove: 'response_mouseMove', 111 | response_mouseDrag: 'response_mouseDrag', 112 | response_keyboardType: 'response_keyboardType', 113 | response_keyboardReleaseKey: 'response_keyboardReleaseKey', 114 | response_keyboardPressKey: 'response_keyboardPressKey', 115 | response_mousePressButtonLeft: 'response_mousePressButtonLeft', 116 | response_mouseReleaseButtonLeft: 'response_mouseReleaseButtonLeft', 117 | response_mouseDoubleClick: 'response_mouseDoubleClick', 118 | response_mouseLeftClick: 'response_mouseLeftClick', 119 | response_mouseRightClick: 'response_mouseRightClick', 120 | response_getMousePosition: 'response_getMousePosition', 121 | response_setWindowBounds: 'response_setWindowBounds', 122 | response_setWindowPosition: 'response_setWindowPosition', 123 | response_getWindowPosition: 'response_getWindowPosition', 124 | response_getScreenStream: 'response_getScreenStream', 125 | response_setAlwaysOnTop: 'response_setAlwaysOnTop', 126 | response_createWindow: 'response_createWindow', 127 | response_powerMonitorSuspend: 'response_powerMonitorSuspend', 128 | response_powerMonitorResume: 'response_powerMonitorResume', 129 | response_powerMonitorLockScreen: 'response_powerMonitorLockScreen', 130 | response_powerMonitorUnLockScreen: 'response_powerMonitorUnLockScreen', 131 | response_globalShortcut: 'response_globalShortcut', 132 | response_open_about: 'response_open_about', 133 | response_open_version: 'response_open_version', 134 | response_open_url: 'response_open_url', 135 | response_getAllWindowName: 'response_getAllWindowName', 136 | response_rtcMap: 'response_rtcMap', 137 | }; 138 | 139 | export const GLOBAL_SHORTCUT = { 140 | // 'CommandOrControl+A': 'CommandOrControl+A', 141 | // 'CommandOrControl+C': 'CommandOrControl+C', 142 | // 'CommandOrControl+V': 'CommandOrControl+V', 143 | // 'CommandOrControl+S': 'CommandOrControl+S', 144 | }; 145 | -------------------------------------------------------------------------------- /src/pure-interface.ts: -------------------------------------------------------------------------------- 1 | export interface IIpcRendererData { 2 | /** 发送消息的窗口id */ 3 | windowId: number; 4 | channel: any; 5 | requestId: string; 6 | data: any; 7 | code?: number; 8 | msg?: string; 9 | } 10 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { isIPad, isMobile } from 'billd-utils'; 2 | import { createRouter, createWebHashHistory } from 'vue-router'; 3 | 4 | import Layout from '@/layout/index.vue'; 5 | 6 | import type { RouteRecordRaw } from 'vue-router'; 7 | 8 | export const commonRouterName = { 9 | qrcodeLogin: 'qrcodeLogin', 10 | notFound: 'notFound', 11 | }; 12 | 13 | export const mobileRouterName = { 14 | h5PrivatizationDeployment: 'h5PrivatizationDeployment', 15 | h5Price: 'h5Price', 16 | }; 17 | 18 | export const routerName = { 19 | remote: 'remote', 20 | home: 'home', 21 | about: 'about', 22 | wechatGroup: 'wechatGroup', 23 | officialGroup: 'officialGroup', 24 | fixedPopupWindow: 'fixedPopupWindow', 25 | version: 'version', 26 | webrtc: 'webrtc', 27 | deviceManage: 'deviceManage', 28 | screenWall: 'screenWall', 29 | screenWallAdmin: 'screenWallAdmin', 30 | setting: 'setting', 31 | hi: 'hi', 32 | privatizationDeployment: 'privatizationDeployment', 33 | price: 'price', 34 | invite: 'invite', 35 | download: 'download', 36 | release: 'release', 37 | 38 | pull: 'pull', 39 | push: 'push', 40 | ...mobileRouterName, 41 | ...commonRouterName, 42 | }; 43 | 44 | // 默认路由 45 | export const defaultRoutes: RouteRecordRaw[] = [ 46 | { 47 | name: routerName.home, 48 | path: '/', 49 | component: Layout, 50 | redirect: routerName.remote, 51 | children: [ 52 | { 53 | name: routerName.remote, 54 | path: '/remote', 55 | component: () => import('@/views/remote/index.vue'), 56 | }, 57 | { 58 | name: routerName.deviceManage, 59 | path: '/deviceManage', 60 | component: () => import('@/views/deviceManage/index.vue'), 61 | }, 62 | { 63 | name: routerName.screenWall, 64 | path: '/screenWall', 65 | component: () => import('@/views/screenWall/index.vue'), 66 | }, 67 | { 68 | name: routerName.screenWallAdmin, 69 | path: '/screenWallAdmin', 70 | component: () => import('@/views/screenWallAdmin/index.vue'), 71 | }, 72 | { 73 | name: routerName.setting, 74 | path: '/setting', 75 | component: () => import('@/views/setting/index.vue'), 76 | }, 77 | { 78 | name: routerName.download, 79 | path: '/download', 80 | component: () => import('@/views/download/index.vue'), 81 | }, 82 | { 83 | name: routerName.release, 84 | path: '/release', 85 | component: () => import('@/views/release/index.vue'), 86 | }, 87 | { 88 | name: routerName.hi, 89 | path: '/hi', 90 | component: () => import('@/views/hi/index.vue'), 91 | }, 92 | ], 93 | }, 94 | { 95 | name: routerName.privatizationDeployment, 96 | path: '/privatizationDeployment', 97 | component: () => import('@/views/privatizationDeployment/index.vue'), 98 | }, 99 | { 100 | name: routerName.price, 101 | path: '/price', 102 | component: () => import('@/views/price/index.vue'), 103 | }, 104 | { 105 | name: routerName.webrtc, 106 | path: '/webrtc', 107 | component: () => import('@/views/webrtc/index.vue'), 108 | }, 109 | { 110 | name: routerName.about, 111 | path: '/about', 112 | component: () => import('@/views/about/index.vue'), 113 | }, 114 | { 115 | name: routerName.wechatGroup, 116 | path: '/wechatGroup', 117 | component: () => import('@/views/wechatGroup/index.vue'), 118 | }, 119 | { 120 | name: routerName.officialGroup, 121 | path: '/officialGroup', 122 | component: () => import('@/views/officialGroup/index.vue'), 123 | }, 124 | { 125 | name: routerName.fixedPopupWindow, 126 | path: '/fixedPopupWindow', 127 | component: () => import('@/views/fixedPopupWindow/index.vue'), 128 | }, 129 | { 130 | name: routerName.invite, 131 | path: '/invite', 132 | component: () => import('@/views/invite/index.vue'), 133 | }, 134 | { 135 | name: mobileRouterName.h5PrivatizationDeployment, 136 | path: '/h5/privatizationDeployment', 137 | component: () => import('@/views/h5/privatizationDeployment/index.vue'), 138 | }, 139 | { 140 | name: mobileRouterName.h5Price, 141 | path: '/h5/price', 142 | component: () => import('@/views/h5/price/index.vue'), 143 | }, 144 | ]; 145 | 146 | const router = createRouter({ 147 | routes: [ 148 | ...defaultRoutes, 149 | { 150 | path: '/:pathMatch(.*)*', 151 | name: routerName.notFound, 152 | component: () => import('@/views/notFound.vue'), 153 | }, 154 | ], 155 | history: createWebHashHistory(), 156 | }); 157 | 158 | router.beforeEach((to, _from, next) => { 159 | if (Object.keys(commonRouterName).includes(to.name as string)) { 160 | // 跳转通用路由 161 | return next(); 162 | } else if (isMobile() && !isIPad()) { 163 | console.log('当前是移动端', to.name); 164 | if (!Object.keys(mobileRouterName).includes(to.name as string)) { 165 | console.log('当前移动端,但是跳转了非移动端路由'); 166 | if (to.name === routerName.privatizationDeployment) { 167 | return next({ 168 | name: routerName.h5PrivatizationDeployment, 169 | }); 170 | } else if (to.name === routerName.price) { 171 | return next({ 172 | name: routerName.h5Price, 173 | }); 174 | } else { 175 | return next(); 176 | } 177 | } else { 178 | return next(); 179 | } 180 | } else { 181 | if (Object.keys(mobileRouterName).includes(to.name as string)) { 182 | console.log('当前非移动端,但是跳转了移动端路由', to.name); 183 | if (to.name === routerName.h5PrivatizationDeployment) { 184 | return next({ 185 | name: routerName.privatizationDeployment, 186 | }); 187 | } else if (to.name === routerName.h5Price) { 188 | return next({ 189 | name: routerName.price, 190 | }); 191 | } else { 192 | return next(); 193 | } 194 | } 195 | return next(); 196 | } 197 | }); 198 | 199 | export default router; 200 | -------------------------------------------------------------------------------- /src/spec-config.ts: -------------------------------------------------------------------------------- 1 | export const PROD_DOMAIN = 'hsslive.cn'; 2 | 3 | // 这个BACKEND_SERVER_PORT和vite.config.ts需要一致,改的话要一起改。 4 | const BACKEND_SERVER_PORT = 5300; // 后端服务的端口号 5 | 6 | // ======本地调试===== 7 | 8 | // const BACKEND_SERVER_IP = '192.168.1.102'; // 后端服务的IP(本机局域网地址) 9 | 10 | // export const WEBSOCKET_URL = 11 | // process.env.NODE_ENV === 'development' 12 | // ? `ws://${BACKEND_SERVER_IP}:${BACKEND_SERVER_PORT}` 13 | // : `ws://${BACKEND_SERVER_IP}:${BACKEND_SERVER_PORT}`; 14 | 15 | // export const AXIOS_BASEURL = 16 | // process.env.NODE_ENV === 'development' 17 | // ? `http://${BACKEND_SERVER_IP}:${BACKEND_SERVER_PORT}` 18 | // : `http://${BACKEND_SERVER_IP}:${BACKEND_SERVER_PORT}`; 19 | 20 | // ======本地调试===== 21 | 22 | // ======线上正式===== 23 | 24 | export const WEBSOCKET_URL = 25 | process.env.NODE_ENV === 'development' 26 | ? `ws://localhost:${BACKEND_SERVER_PORT}` 27 | : `wss://desk-api.${PROD_DOMAIN}`; 28 | 29 | export const AXIOS_BASEURL = 30 | process.env.NODE_ENV === 'development' 31 | ? `/api` 32 | : `https://desk-api.${PROD_DOMAIN}`; 33 | 34 | // ======线上正式===== 35 | 36 | export const COOKIE_DOMAIN = 37 | process.env.NODE_ENV === 'development' ? undefined : `.${PROD_DOMAIN}`; 38 | -------------------------------------------------------------------------------- /test/BilldDesk.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() { 4 | std::cout << "Hello World!" << std::endl; 5 | return 0; 6 | } -------------------------------------------------------------------------------- /test/aa.js: -------------------------------------------------------------------------------- 1 | const command = ` 2 | sc stop aaaService 3 | 4 | sc delete aaaService 5 | 6 | sc create aaaService binPath= "\\"xxx\\" --billddir \\"xxx\\"" start= auto 7 | 8 | sc start aaaService 9 | `; 10 | console.log(command); 11 | -------------------------------------------------------------------------------- /test/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | Document 10 | 11 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 后端返回版本信息,前端判断更新逻辑 3 | * 可以这样设计:前端本地存有一个版本号,localVersion 4 | * 1.前端先判断checkUpdate,checkUpdate等于1才提示更新,否则直接不提示更新 5 | * 2.判断forceUpdateList,如果localVersion在forceUpdateList里面,就强制更新到最新版本 6 | * 3.判断newVersion, 7 | * 3.1如果localVersion小于newVersion,则判断localVersion是否小于minVersion,如果localVersion小于minVersion,则代表有版本更新,且是强制更新。 8 | * 3.2如果localVersion不小于newVersion,则代表当前是最新版本,不用更新 9 | * 4.判断noiceVersion,localVersion小于这个版本的就提示更新 10 | */ 11 | const versionInfo = { 12 | // 是否检查更新,1就代表检查更新 13 | checkUpdate: 1, 14 | // 最低版本 15 | minVersion: '0.0.100', 16 | // 最新版本 17 | newVersion: '0.0.100', 18 | // 显示的版本 19 | showNewVersion: 'v0.0.100', 20 | // 强更版本列表 21 | forceUpdateList: ['0.0.100', '0.0.101'], 22 | // 更新内容 23 | updateContent: '更新内容更新内容', 24 | // 更新日期 25 | updateDate: '2024年10月22日11:08:51', 26 | // 下载地址 27 | download: { 28 | macos_dmg: '', 29 | window_64_exe: '', 30 | window_32_exe: '', 31 | window_arm_exe: '', 32 | linux_64_deb: '', 33 | linux_64_tar: '', 34 | linux_arm_deb: '', 35 | linux_arm_tar: '', 36 | }, 37 | // 禁用版本 38 | disableList: [ 39 | { 40 | version: '0.0.100', 41 | msg: '当前版本过久,请前往官网更新最新版本', 42 | }, 43 | ], 44 | // 备注 45 | remark: '', 46 | }; 47 | 48 | /** 49 | * 后端返回版本信息 50 | * 前端判断status,status=1的话,则判断isUpdate、forceUpdate,download,下载对应的包 51 | * 前端判断status,status=2的话,则代表这个版本禁用,提示statusDesc 52 | */ 53 | const front = { 54 | // 是否提示更新,1:提示; 2:不提示 55 | isUpdate: 1, 56 | // 是否强制更新,1:强制; 2:不强制 57 | forceUpdate: 2, 58 | // 更新内容 59 | updateContent: '更新内容更新内容', 60 | // 更新日期 61 | updateDate: '2024年10月22日11:08:51', 62 | // 下载地址 63 | download: { 64 | macos_dmg: '', 65 | window_64_exe: '', 66 | window_32_exe: '', 67 | window_arm_exe: '', 68 | linux_64_deb: '', 69 | linux_64_tar: '', 70 | linux_arm_deb: '', 71 | linux_arm_tar: '', 72 | }, 73 | // 禁用版本 74 | disableList: [ 75 | { 76 | version: '0.0.100', 77 | msg: '当前版本过久,请前往官网更新最新版本', 78 | }, 79 | ], 80 | // 备注 81 | remark: '', 82 | }; 83 | -------------------------------------------------------------------------------- /test/test.json: -------------------------------------------------------------------------------- 1 | { 2 | "t": "2025/5/13 14:46:09", 3 | "arr": [ 4 | "", 5 | "", 6 | "BilldDesk", 7 | "", 8 | "", 9 | "C:\\Windows\\System32\\cmd.exe", 10 | "C:\\Program Files\\nodejs\\node.exe", 11 | "", 12 | "Windows Push Notifications Platform", 13 | "CWNPTransportImpl", 14 | "CWNPTransportImpl", 15 | "C:\\Program Files\\Oray\\SunLogin\\SunloginClient\\sunlogin_guard\\64\\sunlogin_guard.exe", 16 | "", 17 | "HID Input Service" 18 | ], 19 | "len": 14 20 | } -------------------------------------------------------------------------------- /test/test.ts: -------------------------------------------------------------------------------- 1 | function handleUrlQuery(obj: Record) { 2 | let res = ''; 3 | Object.keys(obj).forEach((item) => { 4 | res += `${item}=${obj[item]}&`; 5 | }); 6 | if (res.length > 0) { 7 | return res.slice(0, -1); 8 | } else { 9 | return res; 10 | } 11 | } 12 | 13 | console.log(handleUrlQuery({ a: '1', b: '32' })); 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | "noImplicitAny": false, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "noEmit": true, 16 | "jsx": "preserve", 17 | 18 | "baseUrl": "./", 19 | "paths": { 20 | "@/*": ["src/*"] 21 | }, 22 | 23 | /* Linting */ 24 | "strict": true, 25 | "noUnusedLocals": true, 26 | "noUnusedParameters": true, 27 | "noFallthroughCasesInSwitch": true 28 | }, 29 | 30 | "include": [ 31 | "electron-main/**/*.ts", 32 | "src/**/*.ts", 33 | "src/**/*.d.ts", 34 | "src/**/*.tsx", 35 | "src/**/*.vue", 36 | "config/**/*.ts", 37 | "components.d.ts" 38 | ], // 仅仅匹配这些文件,除了src以外的文件都不会被匹配 39 | "references": [{ "path": "./tsconfig.node.json" }] 40 | } 41 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | 3 | import vue from '@vitejs/plugin-vue'; 4 | import { BilldHtmlWebpackPlugin, logData } from 'billd-html-webpack-plugin'; 5 | import autoImport from 'unplugin-auto-import/vite'; 6 | import { NaiveUiResolver as naiveUiResolver } from 'unplugin-vue-components/resolvers'; 7 | import unpluginVueComponents from 'unplugin-vue-components/vite'; 8 | import { defineConfig } from 'vite'; 9 | import prefetchPlugin from 'vite-plugin-bundle-prefetch'; 10 | import checker from 'vite-plugin-checker'; 11 | import { chunkSplitPlugin } from 'vite-plugin-chunk-split'; 12 | import electron from 'vite-plugin-electron/simple'; 13 | import eslint from 'vite-plugin-eslint2'; 14 | import { createHtmlPlugin } from 'vite-plugin-html'; 15 | 16 | import pkg from './package.json'; 17 | 18 | const BACKEND_SERVER_PORT = 5300; // 后端服务的端口号 19 | const isWeb = process.env['VITE_APP_RELEASE_PROJECT_ISWEB'] === 'true'; 20 | 21 | // https://vitejs.dev/config/ 22 | export default defineConfig(({ mode }) => { 23 | const isProduction = mode === 'production'; 24 | 25 | const outputStaticUrl = () => { 26 | if (isWeb) { 27 | if (isProduction) { 28 | return 'https://tencentcos-res.hsslive.cn/billd-desk/client/dist/'; 29 | } else { 30 | return './'; 31 | } 32 | } else { 33 | if (isProduction) { 34 | return './'; 35 | } else { 36 | return './'; 37 | } 38 | } 39 | }; 40 | 41 | return { 42 | base: outputStaticUrl(), 43 | css: { 44 | preprocessorOptions: { 45 | scss: { 46 | additionalData: `@use 'billd-scss/src/index.scss' as *;@import "@/assets/css/constant.scss";`, 47 | }, 48 | }, 49 | }, 50 | resolve: { 51 | alias: { '@': path.resolve(__dirname, 'src') }, 52 | /** 53 | * 不建议省略.vue后缀 54 | * https://cn.vitejs.dev/config/shared-options.html#resolve-extensions 55 | */ 56 | // extensions: ['.js', '.ts', '.jsx', '.tsx', '.vue'], 57 | }, 58 | build: { 59 | outDir: 'dist', 60 | }, 61 | plugins: [ 62 | // legacy(), 63 | // isProduction && legacy(), 64 | chunkSplitPlugin({ 65 | // 指定拆包策略 66 | // customSplitting: { 67 | // // `vue` and `vue-router` 会被打包到一个名为`vue-vendor`的 chunk 里面(包括它们的一些依赖,如 object-assign) 68 | // 'vue-vendor': [/vue/], 69 | // 'vue-router-vendor': [/vue-router/], 70 | // 'av-cliper-vendor': [/@webav\/av-cliper/], 71 | // // 源码中 utils 目录的代码都会打包进 `utils` 这个 chunk 中 72 | // // utils: [/src\/utils/], 73 | // views: [/src\/views/], 74 | // compoents: [/src\/compoents/], 75 | // }, 76 | }), 77 | prefetchPlugin(), 78 | vue(), 79 | createHtmlPlugin({ 80 | inject: { 81 | data: { 82 | // @ts-ignore 83 | title: pkg.productName, 84 | }, 85 | }, 86 | }), 87 | isWeb 88 | ? false 89 | : electron({ 90 | main: { 91 | entry: 'electron-main/index.ts', // 主进程文件 92 | vite: { 93 | build: { 94 | outDir: 'electron-dist', 95 | lib: { 96 | entry: 'electron-main/index.ts', // 主进程文件 97 | formats: ['cjs'], 98 | fileName: () => '[name].cjs', 99 | }, 100 | }, 101 | }, 102 | }, 103 | preload: { 104 | input: 'electron-main/preload.ts', 105 | vite: { 106 | build: { 107 | outDir: 'electron-dist', 108 | }, 109 | }, 110 | }, 111 | }), 112 | checker({ 113 | // typescript: true, 114 | vueTsc: true, 115 | // eslint: { 116 | // lintCommand: 'eslint "./src/**/*.{ts,tsx}"', // for example, lint .ts & .tsx 117 | // }, 118 | }), 119 | eslint({}), 120 | autoImport({ 121 | imports: [ 122 | { 123 | 'naive-ui': ['useMessage', 'useNotification'], 124 | }, 125 | ], 126 | }), 127 | unpluginVueComponents({ 128 | resolvers: [naiveUiResolver()], 129 | }), 130 | new BilldHtmlWebpackPlugin({ env: 'vite4' }).config, 131 | ].filter(Boolean), 132 | define: { 133 | 'process.env': { 134 | BilldHtmlWebpackPlugin: logData(null), 135 | NODE_ENV: JSON.stringify(isProduction ? 'production' : 'development'), 136 | PUBLIC_PATH: outputStaticUrl(), 137 | VUE_APP_RELEASE_PROJECT_NAME: JSON.stringify( 138 | process.env.VUE_APP_RELEASE_PROJECT_NAME 139 | ), 140 | VUE_APP_RELEASE_PROJECT_ENV: JSON.stringify( 141 | process.env.VUE_APP_RELEASE_PROJECT_ENV 142 | ), 143 | VUE_APP_RELEASE_PROJECT_VERSION: JSON.stringify(pkg.version), 144 | }, 145 | }, 146 | 147 | server: { 148 | host: '0.0.0.0', 149 | proxy: { 150 | '/api': { 151 | target: `http://localhost:${BACKEND_SERVER_PORT}`, 152 | secure: false, // 默认情况下(secure: true),不接受在HTTPS上运行的带有无效证书的后端服务器。设置secure: false后,后端服务器的HTTPS有无效证书也可运行 153 | /** 154 | * changeOrigin,是否修改请求地址的源 155 | * 默认changeOrigin: false,即发请求即使用devServer的localhost:port发起的,如果后端服务器有校验源,就会有问题 156 | * 设置changeOrigin: true,就会修改发起请求的源,将原本的localhost:port修改为target,这样就可以通过后端服务器对源的校验 157 | */ 158 | changeOrigin: true, 159 | rewrite: (path) => path.replace(/^\/api/, '/'), 160 | }, 161 | '/prodapi': { 162 | target: 'http://localhost:5200', 163 | secure: false, // 默认情况下(secure: true),不接受在HTTPS上运行的带有无效证书的后端服务器。设置secure: false后,后端服务器的HTTPS有无效证书也可运行 164 | /** 165 | * changeOrigin,是否修改请求地址的源 166 | * 默认changeOrigin: false,即发请求即使用devServer的localhost:port发起的,如果后端服务器有校验源,就会有问题 167 | * 设置changeOrigin: true,就会修改发起请求的源,将原本的localhost:port修改为target,这样就可以通过后端服务器对源的校验 168 | */ 169 | changeOrigin: true, 170 | rewrite: (path) => path.replace(/^\/prodapi/, '/'), 171 | }, 172 | }, 173 | }, 174 | }; 175 | }); 176 | --------------------------------------------------------------------------------