feat: 支持绘画同步
feat: 支持敏感词检测 feat: 支持多语言版本 feat: 支持回车发送消息 feat: 支持展示房主,语言版本 feat: 支持分享链接带上语言版本 feat: 支持设置公共聊天频道消息展示条数 feat: 支持固定/临时turn账号切换 feat: 支持一键启动脚本 feat: 支持浏览器控制台打印logo feat: 调整优化svg, icon图标 feat: 调整优化弹窗动画 feat: 调整优化媒体流时间动画 feat: 调整优化oss逻辑 feat: 调整优化报错告警信息
10
PAY.md
@@ -7,14 +7,14 @@
|
|||||||
|
|
||||||
## 项目定制服务
|
## 项目定制服务
|
||||||
|
|
||||||
### 1. 项目功能定制
|
### 1. 定制开发支持
|
||||||
|
- **服务内容:** 免费提供定制开发技术支持,可协助部署安装相关事项,或协助自行开发,细节问题答疑
|
||||||
|
- **免费:** 非常乐意为各位使用的小伙伴提供帮助,大家觉得好用的同时可以点击start支持下
|
||||||
|
|
||||||
|
### 2. 项目功能定制
|
||||||
- **服务内容:** 对项目进行功能定制或扩展
|
- **服务内容:** 对项目进行功能定制或扩展
|
||||||
- **价格:** 按功能大小,紧急程度,耗时,定制内容是否允许开源,等情况收费
|
- **价格:** 按功能大小,紧急程度,耗时,定制内容是否允许开源,等情况收费
|
||||||
|
|
||||||
### 2. 定制开发支持
|
|
||||||
- **服务内容:** 提供定制开发技术支持,可协助部署安装相关事项,或协助自行开发,细节问题答疑
|
|
||||||
- **价格:** 一杯咖啡
|
|
||||||
|
|
||||||
## 收费模式
|
## 收费模式
|
||||||
- **按小时计费:** 根据实际工作时间计算费用,目前个人定制功能2小时起,每小时200~300,企业定制另谈
|
- **按小时计费:** 根据实际工作时间计算费用,目前个人定制功能2小时起,每小时200~300,企业定制另谈
|
||||||
- **阶段性付费:** 确认开发前,预付1/3,开发完成付1/3,交付上线1/3
|
- **阶段性付费:** 确认开发前,预付1/3,开发完成付1/3,交付上线1/3
|
||||||
|
198
README.md
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
**qq交流群 : 624214498**
|
**qq交流群 : 624214498**
|
||||||
|
|
||||||
## 准备
|
## 准备 (必须步骤)
|
||||||
|
|
||||||
安装node-14.x,npm后进入项目目录运行下面命令
|
安装node-14.x,npm后进入项目目录运行下面命令
|
||||||
|
|
||||||
@@ -40,68 +40,177 @@
|
|||||||
`npm run dev` (打包开发环境min) 或者 `npm run pro` 打包生产环境min
|
`npm run dev` (打包开发环境min) 或者 `npm run pro` 打包生产环境min
|
||||||
|
|
||||||
|
|
||||||
## 启动
|
## 启动 (必须步骤)
|
||||||
|
|
||||||
http形式启动以下两个服务
|
http形式启动以下两个服务, 选一种模式启动即可
|
||||||
|
|
||||||
api服务: `npm run lapi`
|
api服务: `npm run lapi`
|
||||||
|
|
||||||
socket服务 : `npm run lsocket`
|
socket服务 : `npm run lsocket`
|
||||||
|
|
||||||
或者https形式启动一下两个服务
|
或者https形式启动一下两个服务
|
||||||
|
|
||||||
api服务: `npm run sapi`
|
api服务: `npm run sapi`
|
||||||
|
|
||||||
socket服务 : `npm run ssocket`
|
socket服务 : `npm run ssocket`
|
||||||
|
|
||||||
选一种模式启动即可
|
|
||||||
|
|
||||||
## 配置数据库 (默认关闭)
|
## 配置websocket (必须步骤)
|
||||||
|
|
||||||
修改conf/cfg.json中相应数据库配置即可, 如open, dbName, host, port, user, pwd 等
|
修改cfg.json中相应ws配置,或者wss配置
|
||||||
|
|
||||||
|
"ws": {
|
||||||
|
"port": 8444, #socket 端口
|
||||||
|
"host": "ws://127.0.0.1:8444", #socket ip
|
||||||
|
"control_port": 8445, #远程控制socket 端口
|
||||||
|
"control_host": "ws://127.0.0.1:8445" #远程控制socket ip
|
||||||
|
},
|
||||||
|
"wss" : {
|
||||||
|
"port": 8444,
|
||||||
|
"host": "wss://域名||ip:port",
|
||||||
|
"control_port": 8445,
|
||||||
|
"control_host": "wss://域名||ip:port"
|
||||||
|
},
|
||||||
|
|
||||||
|
## 配置数据库 (非必须步骤)
|
||||||
|
|
||||||
|
修改cfg.json中相应数据库配置
|
||||||
|
|
||||||
|
"db": {
|
||||||
|
"open": false, #是否开启数据库, 默认关闭
|
||||||
|
"mysql": {
|
||||||
|
"host": "host地址",
|
||||||
|
"port": 3306,
|
||||||
|
"dbName": "数据库名称",
|
||||||
|
"user": "用户名",
|
||||||
|
"password": "密码",
|
||||||
|
"other": {
|
||||||
|
"sequelize": {
|
||||||
|
"dialect": "mysql",
|
||||||
|
"host": "host地址",
|
||||||
|
"port": 3306,
|
||||||
|
"logging": false,
|
||||||
|
"pool": {
|
||||||
|
"max": 5,
|
||||||
|
"min": 0,
|
||||||
|
"acquire": 30000,
|
||||||
|
"idle": 10000
|
||||||
|
},
|
||||||
|
"timezone": "+08:00",
|
||||||
|
"define": {
|
||||||
|
"freezeTableName": true,
|
||||||
|
"underscored": true,
|
||||||
|
"charset": "utf8",
|
||||||
|
"collate": "utf8_general_ci",
|
||||||
|
"timestamps": false,
|
||||||
|
"paranoid": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## 配置turnserver (局域网非必须步骤,公网必须步骤)
|
||||||
|
|
||||||
|
ubuntu示例:
|
||||||
|
|
||||||
|
安装coturn `sudo apt-get install coturn`
|
||||||
|
|
||||||
|
项目提供了一份配置文件模板在 : `conf/turn/turnserver.conf`
|
||||||
|
|
||||||
|
修改配置文件后复制一份 `cp conf/turn/turnserver.conf /etc/turnserver.conf`
|
||||||
|
|
||||||
|
示例用户和密码: tlrtcfile
|
||||||
|
|
||||||
|
生成用户 (turnadmin生成密码) `turnadmin -k -u tlrtcfile -r 你的域名`
|
||||||
|
或者 (自定义密码) `turnadmin -a -u tlrtcfile -p tlrtcfile -r 你的域名`
|
||||||
|
启动turnserver `turnserver -c /etc/turnserver.conf`
|
||||||
|
|
||||||
|
可参考示例模板 : `bin/turnStart.sh`
|
||||||
|
|
||||||
|
|
||||||
## 配置websocket (ws/wss)
|
## Docker (非必须步骤)
|
||||||
|
|
||||||
修改conf/cfg.json中相应ws配置,或者wss配置
|
按需配置conf.json中的ws, 或者wss (需要填容器的ip,端口信息)
|
||||||
|
|
||||||
## 配置turnserver (中继服务)
|
docker build -t tl-open-source/tl-rtc-file .
|
||||||
|
|
||||||
ubuntu:
|
docker run -p 9092:9092 -p 8444:8444 --name tl-rtc-file-local -d tl-open-source/tl-rtc-file
|
||||||
|
|
||||||
1. sudo apt-get install coturn #安装coturn
|
|
||||||
|
|
||||||
2. cp conf/turn/turnserver.conf /etc/turnserver.conf #修改配置文件, 文件内容按需修改
|
|
||||||
|
|
||||||
3. chomd +x bin/genTurnUser.sh && ./genTurnUser.sh #文件内容按需修改
|
|
||||||
|
|
||||||
4. chomd +x bin/startTurnServer.sh && ./startTurnServer.sh #启动turnserver,文件内容按需修改
|
|
||||||
|
|
||||||
## Docker
|
|
||||||
|
|
||||||
修改conf/cfg.json中的ws/wss的ip地址(有更好的办法可以反馈下)
|
|
||||||
|
|
||||||
docker build -t iamtsm/tl-rtc-file .
|
|
||||||
|
|
||||||
docker run -p 9092:9092 -p 8444:8444 --name local -d iamtsm/tl-rtc-file
|
|
||||||
|
|
||||||
访问 : http://localhost:9092 或者 http://本机ip:9092
|
访问 : http://localhost:9092 或者 http://本机ip:9092
|
||||||
|
|
||||||
## 管理后台
|
## 管理后台 (非必须步骤)
|
||||||
|
|
||||||
前提 : 需要开启数据库配置
|
前提 : 需要开启数据库配置
|
||||||
|
|
||||||
修改conf/cfg.json中的manage的room和password,默认房间号和密码都是tlrtcfile
|
修改cfg.json中的manage的room和password,默认房间号和密码都是tlrtcfile
|
||||||
|
|
||||||
访问 : http://localhost:9092 或者 http://本机ip:9092
|
访问 : http://localhost:9092 或者 http://本机ip:9092
|
||||||
|
|
||||||
输入配置的房间号,输入密码,即可进入管理后台
|
输入配置的房间号,输入密码,即可进入管理后台
|
||||||
|
|
||||||
ps : 如有需要配置企业微信通知,修改conf/cfg.json中的notify的qiwei数组,填入企业微信机器人的key即可
|
"manage": {
|
||||||
|
"room": "tlrtcfile",
|
||||||
|
"password": "tlrtcfile"
|
||||||
|
},
|
||||||
|
|
||||||
## Chat-GPT
|
## 企微通知 (非必须步骤)
|
||||||
|
|
||||||
修改conf/cfg.json中的openai.apiKeys,填写你自己openai账号生成的apiKey
|
修改cfg.json中的notify的qiwei数组,填入企业微信机器人的key即可
|
||||||
|
|
||||||
|
normal : 正常通知, error : 系统报错通知
|
||||||
|
|
||||||
|
"notify": {
|
||||||
|
"open": true, #是否开启企业微信通知
|
||||||
|
"qiwei": {
|
||||||
|
"normal" : [
|
||||||
|
"key1",
|
||||||
|
"key2"
|
||||||
|
],
|
||||||
|
"error" : [
|
||||||
|
"key3",
|
||||||
|
"key4"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
## OSS云存储 (非必须步骤)
|
||||||
|
|
||||||
|
修改cfg.json中的oss
|
||||||
|
|
||||||
|
"oss": {
|
||||||
|
"seafile": {
|
||||||
|
"repoid": "",
|
||||||
|
"host": "",
|
||||||
|
"username": "帐号",
|
||||||
|
"password": "密码"
|
||||||
|
},
|
||||||
|
"alyun": {
|
||||||
|
"AccessKey": "",
|
||||||
|
"SecretKey": "",
|
||||||
|
"bucket": "tl-rtc-file"
|
||||||
|
},
|
||||||
|
"txyun": {
|
||||||
|
"AccessKey": "",
|
||||||
|
"SecretKey": "",
|
||||||
|
"bucket": "tl-rtc-file"
|
||||||
|
},
|
||||||
|
"qiniuyun": {
|
||||||
|
"AccessKey": "",
|
||||||
|
"SecretKey": "",
|
||||||
|
"bucket": "tl-rtc-file"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
## Chat-GPT (非必须步骤)
|
||||||
|
|
||||||
|
修改cfg.json中的openai.apiKeys,填写你自己openai账号生成的apiKey
|
||||||
|
|
||||||
|
"openai": {
|
||||||
|
"apiKeys": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
## 概述图
|
## 概述图
|
||||||
|
|
||||||
@@ -109,28 +218,7 @@ http形式启动以下两个服务
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT License
|
### MIT License Copyright (c) 2022 iamtsm
|
||||||
|
|
||||||
Copyright (c) 2022 iamtsm
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
|
|
||||||
## 免责声明
|
## 免责声明
|
||||||
|
|
||||||
|
119
doc/README_EN.md
@@ -1,4 +1,4 @@
|
|||||||
# tl-rtc-file-tool [More than just file transfer, starting from file transfer]
|
# tl-rtc-file-tool 【More Than Just File Transfer】
|
||||||
|
|
||||||
[](https://webrtc.org.cn/)
|
[](https://webrtc.org.cn/)
|
||||||
[](https://github.com/iamtsm/tl-rtc-file/)
|
[](https://github.com/iamtsm/tl-rtc-file/)
|
||||||
@@ -6,16 +6,13 @@
|
|||||||
[](https://github.com/iamtsm/tl-rtc-file/)
|
[](https://github.com/iamtsm/tl-rtc-file/)
|
||||||
[](https://github.com/iamtsm/tl-rtc-file/)
|
[](https://github.com/iamtsm/tl-rtc-file/)
|
||||||
|
|
||||||
|
#### Background: Organized around the topic of a 2020 thesis
|
||||||
|
|
||||||
#### Background: Consolidated from the topic of the 20-year graduation project
|
#### Introduction: (tl webrtc datachannel filetools) uses WebRTC to transfer files on the web and supports the transfer of very large files.
|
||||||
|
|
||||||
#### Introduction: (tl webrtc datachannel filetools) Transfer files on the web using WebRTC, supporting the transfer of large files.
|
#### Advantages: Supports fragmented transmission, cross-device compatibility, platform independence, easy-to-use, unlimited internal network speed, private deployment, and supports the drag-and-drop sending of multiple files.
|
||||||
|
|
||||||
#### Advantages: Fragmented transmission, cross-platform, platform-independent, easy to use, unlimited speed in the intranet, support for private deployment, support for multiple file drag and drop sending.
|
#### Extensions: Many rich functions have been added, such as local screen recording, remote screen sharing, remote audio and video calls, live broadcasting, password rooms, relay service settings, WebRTC detection, text transmission, public chat, rich back-end management, integrated Enterprise WeChat robot alarm notification, real-time execution log display, etc.
|
||||||
|
|
||||||
#### Extensions: Extended with many rich features such as local screen recording, remote screen sharing, remote audio and video calls, live streaming, pickup codes, password-protected rooms, relay service settings, WebRTC detection, text transmission, public chat, rich backend management, integration of Enterprise WeChat robot alert notification, real-time execution log display, and more.
|
|
||||||
|
|
||||||
#### Instructions: The example website is in a public network environment. In order to better demonstrate the transmission function, the relay service is enabled by default. If you want to verify whether P2P transmission is possible, simply disable the relay service. After the P2P detection, if you can see the internal network IP, the WebRTC connection can most likely go through P2P. In general, users in the internal network environment in the public network environment will also be automatically recognized. If the internal network speed is slow, you can leave feedback and it will be optimized and processed as soon as possible.
|
|
||||||
|
|
||||||
#### Experience: https://im.iamtsm.cn/file
|
#### Experience: https://im.iamtsm.cn/file
|
||||||
|
|
||||||
@@ -23,115 +20,63 @@
|
|||||||
|
|
||||||
## Preparation
|
## Preparation
|
||||||
|
|
||||||
Install node-14.x and npm, then enter the project directory and run the following commands:
|
Install Node.js and npm and then enter the project directory.
|
||||||
|
|
||||||
|
npm install
|
||||||
|
|
||||||
`cd svr/`
|
Go to the build directory: cd build/webpack/
|
||||||
|
|
||||||
`npm install`
|
Install some dependencies: npm install
|
||||||
|
|
||||||
`cd build/webpack/`
|
|
||||||
|
|
||||||
`npm install`
|
If you need to develop and modify the files in the res directory, keep one of the following two backend commands open.
|
||||||
|
|
||||||
For the first run or self-developed pages, you need to start the following two commands:
|
npm run dev packages the development environment min.
|
||||||
|
|
||||||
`cd build/webpack/`
|
npm run pro packages the production environment min.
|
||||||
|
|
||||||
`npm run dev` (package for development environment min) or `npm run pro` (package for production environment min)
|
## Test Environment
|
||||||
|
|
||||||
## Start
|
Start the following two services.
|
||||||
|
|
||||||
Start the following two services in HTTP format:
|
Local startup file-res: npm run dev
|
||||||
|
|
||||||
API service: `npm run lapi`
|
Local startup file-socket: npm run devsocket
|
||||||
|
|
||||||
Socket service: `npm run lsocket`
|
## Online Environment (WSS Configuration Required)
|
||||||
|
|
||||||
Or start the following two services in HTTPS format:
|
Start the following two services.
|
||||||
|
|
||||||
API service: `npm run sapi`
|
Public network environment starts file-res: npm run svr
|
||||||
|
|
||||||
Socket service: `npm run ssocket`
|
Public network environment starts file-socket: npm run svrsocket
|
||||||
|
|
||||||
Choose one mode to start.
|
|
||||||
|
|
||||||
## Configure Database (Default: Disabled)
|
## Configure the db (turned off by default)
|
||||||
|
|
||||||
Modify the corresponding database configuration in conf/cfg.json, such as open, dbName, host, port, user, pwd, etc.
|
Modify the corresponding DB configuration in conf/cfg.json, such as open, dbName, host, port, user, pwd, etc.
|
||||||
|
|
||||||
## Configure WebSocket (WS/WSS)
|
|
||||||
|
|
||||||
Modify the corresponding WS configuration or WSS configuration in conf/cfg.json.
|
## Configure the wss
|
||||||
|
|
||||||
## Configure TURN Server (Relay Service)
|
Modify the corresponding WS configuration in conf/cfg.json, such as port, ws_online, etc.
|
||||||
|
|
||||||
|
|
||||||
|
## Configure turnserver (private deployment)
|
||||||
|
|
||||||
Ubuntu:
|
Ubuntu:
|
||||||
|
|
||||||
1. sudo apt-get install coturn # Install coturn.
|
1. sudo apt-get install coturn # Install coturn.
|
||||||
|
|
||||||
2. cp conf/turn/turnserver.conf /etc/turnserver.conf # Modify the configuration file, modify the file content as needed.
|
2. cp conf/turn/turnserver.conf /etc/turnserver.conf # Modify the configuration file, and modify the file content as needed.
|
||||||
|
|
||||||
3. chmod +x bin/genTurnUser.sh && ./
|
3. chomd +x bin/genTurnUser.sh && ./genTurn
|
||||||
|
|
||||||
genTurnUser.sh # Modify the file content as needed.
|
|
||||||
|
|
||||||
4. chmod +x bin/startTurnServer.sh && ./startTurnServer.sh # Start turnserver, modify the file content as needed.
|
### Overview
|
||||||
|
|
||||||
## Docker
|
|
||||||
|
|
||||||
Modify the IP address of ws/wss in conf/cfg.json (feedback is welcome if there is a better way).
|
|
||||||
|
|
||||||
docker build -t iamtsm/tl-rtc-file .
|
|
||||||
|
|
||||||
docker run -p 9092:9092 -p 8444:8444 --name local -d iamtsm/tl-rtc-file
|
|
||||||
|
|
||||||
Access: http://localhost:9092 or http://localhost-ip:9092
|
|
||||||
|
|
||||||
## Admin Panel
|
|
||||||
|
|
||||||
Prerequisite: Database configuration needs to be enabled.
|
|
||||||
|
|
||||||
Modify the room and password of manage in conf/cfg.json. The default room number and password are both tlrtcfile.
|
|
||||||
|
|
||||||
Access: http://localhost:9092 or http://localhost-ip:9092
|
|
||||||
|
|
||||||
Enter the configured room number and password to enter the admin panel.
|
|
||||||
|
|
||||||
PS: If you need to configure Enterprise WeChat notification, modify the qiwei array in conf/cfg.json of notify and enter the key of the Enterprise WeChat robot.
|
|
||||||
|
|
||||||
## Chat-GPT
|
|
||||||
|
|
||||||
Modify openai.apiKeys in conf/cfg.json and fill in your own apiKey generated by your OpenAI account.
|
|
||||||
|
|
||||||
## Overview Diagram
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT License
|
### MIT License Copyright (c) 2022 iamtsm
|
||||||
|
|
||||||
Copyright (c) 2022 iamtsm
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
|
|
||||||
## Disclaimer
|
|
||||||
|
|
||||||
[Disclaimer](DISCLAIMER.md)
|
|
@@ -1 +0,0 @@
|
|||||||
turnadmin -a -u 用户名 -p 密码 -r 公网ip
|
|
@@ -1 +0,0 @@
|
|||||||
turnserver -o -a -f -user=用户名:密码
|
|
8
svr/bin/turnStart.sh
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#生成账号密码方式1
|
||||||
|
turnadmin -a -u tlrtcfile -p tlrtcfile -r 域名或ip:port
|
||||||
|
|
||||||
|
#生成账号密码方式2
|
||||||
|
turnadmin -k -u tlrtcfile -r 域名或ip:port
|
||||||
|
|
||||||
|
#启动turnserver
|
||||||
|
turnserver -c turnserver.conf路径
|
331
svr/build/webpack/package-lock.json
generated
@@ -15,36 +15,36 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/code-frame": {
|
"@babel/code-frame": {
|
||||||
"version": "7.21.4",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.21.4.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.5.tgz",
|
||||||
"integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
|
"integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/highlight": "^7.18.6"
|
"@babel/highlight": "^7.22.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/compat-data": {
|
"@babel/compat-data": {
|
||||||
"version": "7.22.3",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.5.tgz",
|
||||||
"integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==",
|
"integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/core": {
|
"@babel/core": {
|
||||||
"version": "7.22.1",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.22.1.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.22.5.tgz",
|
||||||
"integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==",
|
"integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@ampproject/remapping": "^2.2.0",
|
"@ampproject/remapping": "^2.2.0",
|
||||||
"@babel/code-frame": "^7.21.4",
|
"@babel/code-frame": "^7.22.5",
|
||||||
"@babel/generator": "^7.22.0",
|
"@babel/generator": "^7.22.5",
|
||||||
"@babel/helper-compilation-targets": "^7.22.1",
|
"@babel/helper-compilation-targets": "^7.22.5",
|
||||||
"@babel/helper-module-transforms": "^7.22.1",
|
"@babel/helper-module-transforms": "^7.22.5",
|
||||||
"@babel/helpers": "^7.22.0",
|
"@babel/helpers": "^7.22.5",
|
||||||
"@babel/parser": "^7.22.0",
|
"@babel/parser": "^7.22.5",
|
||||||
"@babel/template": "^7.21.9",
|
"@babel/template": "^7.22.5",
|
||||||
"@babel/traverse": "^7.22.1",
|
"@babel/traverse": "^7.22.5",
|
||||||
"@babel/types": "^7.22.0",
|
"@babel/types": "^7.22.5",
|
||||||
"convert-source-map": "^1.7.0",
|
"convert-source-map": "^1.7.0",
|
||||||
"debug": "^4.1.0",
|
"debug": "^4.1.0",
|
||||||
"gensync": "^1.0.0-beta.2",
|
"gensync": "^1.0.0-beta.2",
|
||||||
@@ -53,181 +53,181 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/generator": {
|
"@babel/generator": {
|
||||||
"version": "7.22.3",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.22.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.22.5.tgz",
|
||||||
"integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==",
|
"integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/types": "^7.22.3",
|
"@babel/types": "^7.22.5",
|
||||||
"@jridgewell/gen-mapping": "^0.3.2",
|
"@jridgewell/gen-mapping": "^0.3.2",
|
||||||
"@jridgewell/trace-mapping": "^0.3.17",
|
"@jridgewell/trace-mapping": "^0.3.17",
|
||||||
"jsesc": "^2.5.1"
|
"jsesc": "^2.5.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-compilation-targets": {
|
"@babel/helper-compilation-targets": {
|
||||||
"version": "7.22.1",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz",
|
||||||
"integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==",
|
"integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/compat-data": "^7.22.0",
|
"@babel/compat-data": "^7.22.5",
|
||||||
"@babel/helper-validator-option": "^7.21.0",
|
"@babel/helper-validator-option": "^7.22.5",
|
||||||
"browserslist": "^4.21.3",
|
"browserslist": "^4.21.3",
|
||||||
"lru-cache": "^5.1.1",
|
"lru-cache": "^5.1.1",
|
||||||
"semver": "^6.3.0"
|
"semver": "^6.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-environment-visitor": {
|
"@babel/helper-environment-visitor": {
|
||||||
"version": "7.22.1",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
|
||||||
"integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==",
|
"integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/helper-function-name": {
|
"@babel/helper-function-name": {
|
||||||
"version": "7.21.0",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
|
||||||
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
|
"integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/template": "^7.20.7",
|
"@babel/template": "^7.22.5",
|
||||||
"@babel/types": "^7.21.0"
|
"@babel/types": "^7.22.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-hoist-variables": {
|
"@babel/helper-hoist-variables": {
|
||||||
"version": "7.18.6",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
|
||||||
"integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
|
"integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/types": "^7.18.6"
|
"@babel/types": "^7.22.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-module-imports": {
|
"@babel/helper-module-imports": {
|
||||||
"version": "7.21.4",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
|
||||||
"integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==",
|
"integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/types": "^7.21.4"
|
"@babel/types": "^7.22.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-module-transforms": {
|
"@babel/helper-module-transforms": {
|
||||||
"version": "7.22.1",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz",
|
||||||
"integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==",
|
"integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/helper-environment-visitor": "^7.22.1",
|
"@babel/helper-environment-visitor": "^7.22.5",
|
||||||
"@babel/helper-module-imports": "^7.21.4",
|
"@babel/helper-module-imports": "^7.22.5",
|
||||||
"@babel/helper-simple-access": "^7.21.5",
|
"@babel/helper-simple-access": "^7.22.5",
|
||||||
"@babel/helper-split-export-declaration": "^7.18.6",
|
"@babel/helper-split-export-declaration": "^7.22.5",
|
||||||
"@babel/helper-validator-identifier": "^7.19.1",
|
"@babel/helper-validator-identifier": "^7.22.5",
|
||||||
"@babel/template": "^7.21.9",
|
"@babel/template": "^7.22.5",
|
||||||
"@babel/traverse": "^7.22.1",
|
"@babel/traverse": "^7.22.5",
|
||||||
"@babel/types": "^7.22.0"
|
"@babel/types": "^7.22.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-simple-access": {
|
"@babel/helper-simple-access": {
|
||||||
"version": "7.21.5",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
|
||||||
"integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==",
|
"integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/types": "^7.21.5"
|
"@babel/types": "^7.22.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-split-export-declaration": {
|
"@babel/helper-split-export-declaration": {
|
||||||
"version": "7.18.6",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz",
|
||||||
"integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
|
"integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/types": "^7.18.6"
|
"@babel/types": "^7.22.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-string-parser": {
|
"@babel/helper-string-parser": {
|
||||||
"version": "7.21.5",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
|
||||||
"integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==",
|
"integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/helper-validator-identifier": {
|
"@babel/helper-validator-identifier": {
|
||||||
"version": "7.19.1",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
|
||||||
"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
|
"integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/helper-validator-option": {
|
"@babel/helper-validator-option": {
|
||||||
"version": "7.21.0",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
|
||||||
"integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
|
"integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/helpers": {
|
"@babel/helpers": {
|
||||||
"version": "7.22.3",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.22.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.22.5.tgz",
|
||||||
"integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==",
|
"integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/template": "^7.21.9",
|
"@babel/template": "^7.22.5",
|
||||||
"@babel/traverse": "^7.22.1",
|
"@babel/traverse": "^7.22.5",
|
||||||
"@babel/types": "^7.22.3"
|
"@babel/types": "^7.22.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/highlight": {
|
"@babel/highlight": {
|
||||||
"version": "7.18.6",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.5.tgz",
|
||||||
"integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
|
"integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/helper-validator-identifier": "^7.18.6",
|
"@babel/helper-validator-identifier": "^7.22.5",
|
||||||
"chalk": "^2.0.0",
|
"chalk": "^2.0.0",
|
||||||
"js-tokens": "^4.0.0"
|
"js-tokens": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/parser": {
|
"@babel/parser": {
|
||||||
"version": "7.22.4",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.4.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.5.tgz",
|
||||||
"integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==",
|
"integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/template": {
|
"@babel/template": {
|
||||||
"version": "7.21.9",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.21.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.22.5.tgz",
|
||||||
"integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==",
|
"integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/code-frame": "^7.21.4",
|
"@babel/code-frame": "^7.22.5",
|
||||||
"@babel/parser": "^7.21.9",
|
"@babel/parser": "^7.22.5",
|
||||||
"@babel/types": "^7.21.5"
|
"@babel/types": "^7.22.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/traverse": {
|
"@babel/traverse": {
|
||||||
"version": "7.22.4",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.22.4.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.22.5.tgz",
|
||||||
"integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==",
|
"integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/code-frame": "^7.21.4",
|
"@babel/code-frame": "^7.22.5",
|
||||||
"@babel/generator": "^7.22.3",
|
"@babel/generator": "^7.22.5",
|
||||||
"@babel/helper-environment-visitor": "^7.22.1",
|
"@babel/helper-environment-visitor": "^7.22.5",
|
||||||
"@babel/helper-function-name": "^7.21.0",
|
"@babel/helper-function-name": "^7.22.5",
|
||||||
"@babel/helper-hoist-variables": "^7.18.6",
|
"@babel/helper-hoist-variables": "^7.22.5",
|
||||||
"@babel/helper-split-export-declaration": "^7.18.6",
|
"@babel/helper-split-export-declaration": "^7.22.5",
|
||||||
"@babel/parser": "^7.22.4",
|
"@babel/parser": "^7.22.5",
|
||||||
"@babel/types": "^7.22.4",
|
"@babel/types": "^7.22.5",
|
||||||
"debug": "^4.1.0",
|
"debug": "^4.1.0",
|
||||||
"globals": "^11.1.0"
|
"globals": "^11.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/types": {
|
"@babel/types": {
|
||||||
"version": "7.22.4",
|
"version": "7.22.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.22.4.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.22.5.tgz",
|
||||||
"integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==",
|
"integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/helper-string-parser": "^7.21.5",
|
"@babel/helper-string-parser": "^7.22.5",
|
||||||
"@babel/helper-validator-identifier": "^7.19.1",
|
"@babel/helper-validator-identifier": "^7.22.5",
|
||||||
"to-fast-properties": "^2.0.0"
|
"to-fast-properties": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -896,13 +896,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"browserslist": {
|
"browserslist": {
|
||||||
"version": "4.21.7",
|
"version": "4.21.9",
|
||||||
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.7.tgz",
|
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.9.tgz",
|
||||||
"integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==",
|
"integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"caniuse-lite": "^1.0.30001489",
|
"caniuse-lite": "^1.0.30001503",
|
||||||
"electron-to-chromium": "^1.4.411",
|
"electron-to-chromium": "^1.4.431",
|
||||||
"node-releases": "^2.0.12",
|
"node-releases": "^2.0.12",
|
||||||
"update-browserslist-db": "^1.0.11"
|
"update-browserslist-db": "^1.0.11"
|
||||||
}
|
}
|
||||||
@@ -976,6 +976,16 @@
|
|||||||
"unset-value": "^1.0.0"
|
"unset-value": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"call-bind": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"function-bind": "^1.1.1",
|
||||||
|
"get-intrinsic": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"camelcase": {
|
"camelcase": {
|
||||||
"version": "5.3.1",
|
"version": "5.3.1",
|
||||||
"resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
|
"resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
|
||||||
@@ -983,9 +993,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"caniuse-lite": {
|
"caniuse-lite": {
|
||||||
"version": "1.0.30001492",
|
"version": "1.0.30001512",
|
||||||
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz",
|
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz",
|
||||||
"integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==",
|
"integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"chalk": {
|
"chalk": {
|
||||||
@@ -1490,9 +1500,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"electron-to-chromium": {
|
"electron-to-chromium": {
|
||||||
"version": "1.4.416",
|
"version": "1.4.449",
|
||||||
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz",
|
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.449.tgz",
|
||||||
"integrity": "sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA==",
|
"integrity": "sha512-TxLRpRUj/107ATefeP8VIUWNOv90xJxZZbCW/eIbSZQiuiFANCx2b7u+GbVc9X4gU+xnbvypNMYVM/WArE1DNQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"elliptic": {
|
"elliptic": {
|
||||||
@@ -1909,6 +1919,12 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"function-bind": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"gensync": {
|
"gensync": {
|
||||||
"version": "1.0.0-beta.2",
|
"version": "1.0.0-beta.2",
|
||||||
"resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
|
"resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
|
||||||
@@ -1921,6 +1937,18 @@
|
|||||||
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"get-intrinsic": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"function-bind": "^1.1.1",
|
||||||
|
"has": "^1.0.3",
|
||||||
|
"has-proto": "^1.0.1",
|
||||||
|
"has-symbols": "^1.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"get-value": {
|
"get-value": {
|
||||||
"version": "2.0.6",
|
"version": "2.0.6",
|
||||||
"resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz",
|
"resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz",
|
||||||
@@ -1972,12 +2000,33 @@
|
|||||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"has": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"function-bind": "^1.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"has-flag": {
|
"has-flag": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
|
||||||
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
|
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"has-proto": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"has-symbols": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"has-value": {
|
"has-value": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz",
|
||||||
@@ -2697,6 +2746,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"object-inspect": {
|
||||||
|
"version": "1.12.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz",
|
||||||
|
"integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"object-visit": {
|
"object-visit": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz",
|
||||||
@@ -3027,11 +3082,14 @@
|
|||||||
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
|
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"querystring": {
|
"qs": {
|
||||||
"version": "0.2.0",
|
"version": "6.11.2",
|
||||||
"resolved": "https://registry.npmmirror.com/querystring/-/querystring-0.2.0.tgz",
|
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz",
|
||||||
"integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
|
"integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"side-channel": "^1.0.4"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"querystring-es3": {
|
"querystring-es3": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
@@ -3241,6 +3299,17 @@
|
|||||||
"safe-buffer": "^5.0.1"
|
"safe-buffer": "^5.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"side-channel": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"call-bind": "^1.0.0",
|
||||||
|
"get-intrinsic": "^1.0.2",
|
||||||
|
"object-inspect": "^1.9.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"snapdragon": {
|
"snapdragon": {
|
||||||
"version": "0.8.2",
|
"version": "0.8.2",
|
||||||
"resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz",
|
"resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz",
|
||||||
@@ -3985,19 +4054,19 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"version": "0.11.0",
|
"version": "0.11.1",
|
||||||
"resolved": "https://registry.npmmirror.com/url/-/url-0.11.0.tgz",
|
"resolved": "https://registry.npmmirror.com/url/-/url-0.11.1.tgz",
|
||||||
"integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
|
"integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"punycode": "1.3.2",
|
"punycode": "^1.4.1",
|
||||||
"querystring": "0.2.0"
|
"qs": "^6.11.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"punycode": {
|
"punycode": {
|
||||||
"version": "1.3.2",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.3.2.tgz",
|
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz",
|
||||||
"integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
|
"integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,105 +1,120 @@
|
|||||||
{
|
{
|
||||||
"version": "10.1.1",
|
"version": "10.2.0",
|
||||||
"ws": {
|
"ws": {
|
||||||
"port": 8444,
|
"port": 8444,
|
||||||
"host": "ws://127.0.0.1:8444",
|
"host": "ws://127.0.0.1:8444",
|
||||||
"control_port": 8445,
|
"control_port": 8445,
|
||||||
"control_host": "ws://127.0.0.1:8445"
|
"control_host": "ws://127.0.0.1:8445"
|
||||||
},
|
},
|
||||||
"wss" : {
|
"wss": {
|
||||||
"port": 8444,
|
"port": 8444,
|
||||||
"host": "wss://域名 || wss://ip:8444",
|
"host": "wss://域名 || wss://ip:8444",
|
||||||
"control_port": 8445,
|
"control_port": 8445,
|
||||||
"control_host": "wss://域名 || wss://ip:8445"
|
"control_host": "wss://域名 || wss://ip:8445"
|
||||||
},
|
},
|
||||||
"api": {
|
"api": {
|
||||||
"port": 9092,
|
"port": 9092,
|
||||||
"router": {
|
"router": {
|
||||||
"filter": {
|
"filter": {
|
||||||
"whiteDir": [ ],
|
"whiteDir": [],
|
||||||
"whiteFile": [ "router.js" ]
|
"whiteFile": [
|
||||||
},
|
"router.js"
|
||||||
"res": {
|
]
|
||||||
"/": "res/",
|
},
|
||||||
"/static": "static/"
|
"res": {
|
||||||
}
|
"/": "res/",
|
||||||
}
|
"/static": "static/"
|
||||||
},
|
}
|
||||||
"manage": {
|
}
|
||||||
"room": "tlrtcfile",
|
},
|
||||||
"password": "tlrtcfile"
|
"manage": {
|
||||||
},
|
"room": "tlrtcfile",
|
||||||
"webrtc": {
|
"password": "tlrtcfile"
|
||||||
"iceServers": [{
|
},
|
||||||
"urls": "stun:stun.xten.com"
|
"webrtc": {
|
||||||
}],
|
"turn": {
|
||||||
"iceTransportPolicy": "all",
|
"host": "turn服务地址",
|
||||||
"options": {
|
"secret": "tl-rtc-file",
|
||||||
"offerToReceiveAudio": 1,
|
"username": "tl-rtc-file",
|
||||||
"offerToReceiveVideo": 1
|
"credential": "tl-rtc-file"
|
||||||
}
|
},
|
||||||
},
|
"stun": {
|
||||||
"openai" : {
|
"host": "stun:stun.xten.com"
|
||||||
"apiKeys" : [
|
},
|
||||||
|
"iceTransportPolicy": "all",
|
||||||
]
|
"options": {
|
||||||
},
|
"offerToReceiveAudio": 1,
|
||||||
"oss" : {
|
"offerToReceiveVideo": 1
|
||||||
"seafile" : {
|
}
|
||||||
"repoid" : "存储库id",
|
},
|
||||||
"host" : "seafile私有网盘域名",
|
"openai": {
|
||||||
"username" : "账号",
|
"apiKeys": []
|
||||||
"password" : "密码"
|
},
|
||||||
},
|
"oss": {
|
||||||
"alyun" : {
|
"seafile": {
|
||||||
|
"repoid": "存储库id",
|
||||||
},
|
"host": "seafile私有网盘域名",
|
||||||
"qiniuyun" : {
|
"username": "账号",
|
||||||
|
"password": "密码"
|
||||||
}
|
},
|
||||||
},
|
"alyun": {
|
||||||
"notify": {
|
"AccessKey": "",
|
||||||
"open": false,
|
"SecretKey": "",
|
||||||
"qiwei": {
|
"bucket": "tl-rtc-file"
|
||||||
"normal" : [
|
},
|
||||||
"填写企业微信机器人key"
|
"txyun": {
|
||||||
],
|
"AccessKey": "",
|
||||||
"error" : [
|
"SecretKey": "",
|
||||||
"填写企业微信机器人key"
|
"bucket": "tl-rtc-file"
|
||||||
]
|
},
|
||||||
}
|
"qiniuyun": {
|
||||||
},
|
"AccessKey": "",
|
||||||
"db": {
|
"SecretKey": "",
|
||||||
"open" : false,
|
"bucket": "tl-rtc-file"
|
||||||
"mysql": {
|
}
|
||||||
"host": "host地址",
|
},
|
||||||
"port": 3306,
|
"notify": {
|
||||||
"dbName": "数据库名称",
|
"open": false,
|
||||||
"user": "用户名",
|
"qiwei": {
|
||||||
"password": "密码",
|
"normal": [
|
||||||
"other": {
|
"填写企业微信机器人key"
|
||||||
"sequelize": {
|
],
|
||||||
"dialect": "mysql",
|
"error": [
|
||||||
"host": "host地址",
|
"填写企业微信机器人key"
|
||||||
"port": 3306,
|
]
|
||||||
"logging": false,
|
}
|
||||||
"pool": {
|
},
|
||||||
"max": 5,
|
"db": {
|
||||||
"min": 0,
|
"open": false,
|
||||||
"acquire": 30000,
|
"mysql": {
|
||||||
"idle": 10000
|
"host": "host地址",
|
||||||
},
|
"port": 3306,
|
||||||
"timezone": "+08:00",
|
"dbName": "数据库名称",
|
||||||
"define": {
|
"user": "用户名",
|
||||||
"freezeTableName": true,
|
"password": "密码",
|
||||||
"underscored": true,
|
"other": {
|
||||||
"charset": "utf8",
|
"sequelize": {
|
||||||
"collate": "utf8_general_ci",
|
"dialect": "mysql",
|
||||||
"timestamps": false,
|
"host": "host地址",
|
||||||
"paranoid": true
|
"port": 3306,
|
||||||
}
|
"logging": false,
|
||||||
}
|
"pool": {
|
||||||
}
|
"max": 5,
|
||||||
}
|
"min": 0,
|
||||||
}
|
"acquire": 30000,
|
||||||
|
"idle": 10000
|
||||||
|
},
|
||||||
|
"timezone": "+08:00",
|
||||||
|
"define": {
|
||||||
|
"freezeTableName": true,
|
||||||
|
"underscored": true,
|
||||||
|
"charset": "utf8",
|
||||||
|
"collate": "utf8_general_ci",
|
||||||
|
"timestamps": false,
|
||||||
|
"paranoid": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@@ -1,636 +1,46 @@
|
|||||||
# Coturn TURN SERVER configuration file
|
#------------TURN BASE CONFIG------------#
|
||||||
#
|
#监听网卡
|
||||||
# Boolean values note: where boolean value is supposed to be used,
|
|
||||||
# you can use '0', 'off', 'no', 'false', 'f' as 'false,
|
|
||||||
# and you can use '1', 'on', 'yes', 'true', 't' as 'true'
|
|
||||||
# If the value is missed, then it means 'true'.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
cli-password=qwerty
|
|
||||||
listening-device=eth0
|
listening-device=eth0
|
||||||
listening-ip=内网ip
|
#监听ip(内网ip)
|
||||||
|
listening-ip=
|
||||||
|
#监听端口(端口)
|
||||||
listening-port=3478
|
listening-port=3478
|
||||||
#tls-listening-port=5349
|
#公网ip
|
||||||
external-ip=公网ip
|
external-ip=
|
||||||
#relay-threads=50
|
#端口最小值
|
||||||
#lt-cred-mech
|
min-port=49152
|
||||||
user=用户名:密码
|
#端口最大值
|
||||||
realm=公网ip:3478
|
min-port=55000
|
||||||
|
#cli密码
|
||||||
|
cli-password=qwerty
|
||||||
|
#后台运行
|
||||||
|
daemon
|
||||||
|
#会话指纹
|
||||||
|
fingerprint
|
||||||
|
#中等详细日志
|
||||||
|
verbose
|
||||||
|
#长期凭证
|
||||||
|
lt-cred-mech
|
||||||
|
#关闭tls
|
||||||
|
no-tls
|
||||||
|
#关闭dtls
|
||||||
|
no-dtls
|
||||||
|
|
||||||
|
#------------TURN USER CONFIG------------#
|
||||||
|
|
||||||
|
#用户账号密码
|
||||||
|
user=tlrtcfile:tlrtcfile
|
||||||
|
|
||||||
# Listener interface device (optional, Linux only).
|
#来源(域名或ip:port)
|
||||||
# NOT RECOMMENDED.
|
realm=
|
||||||
#
|
|
||||||
#listening-device=eth0
|
|
||||||
|
|
||||||
# TURN listener port for UDP and TCP (Default: 3478).
|
#------------TURN REST API USER CONFIG------------#
|
||||||
# Note: actually, TLS & DTLS sessions can connect to the
|
|
||||||
# "plain" TCP & UDP port(s), too - if allowed by configuration.
|
|
||||||
#
|
|
||||||
#listening-port=3478
|
|
||||||
|
|
||||||
# TURN listener port for TLS (Default: 5349).
|
#开启rest api
|
||||||
# Note: actually, "plain" TCP & UDP sessions can connect to the TLS & DTLS
|
|
||||||
# port(s), too - if allowed by configuration. The TURN server
|
|
||||||
# "automatically" recognizes the type of traffic. Actually, two listening
|
|
||||||
# endpoints (the "plain" one and the "tls" one) are equivalent in terms of
|
|
||||||
# functionality; but we keep both endpoints to satisfy the RFC 5766 specs.
|
|
||||||
# For secure TCP connections, we currently support SSL version 3 and
|
|
||||||
# TLS version 1.0, 1.1 and 1.2.
|
|
||||||
# For secure UDP connections, we support DTLS version 1.
|
|
||||||
#
|
|
||||||
#tls-listening-port=5349
|
|
||||||
|
|
||||||
# Alternative listening port for UDP and TCP listeners;
|
|
||||||
# default (or zero) value means "listening port plus one".
|
|
||||||
# This is needed for RFC 5780 support
|
|
||||||
# (STUN extension specs, NAT behavior discovery). The TURN Server
|
|
||||||
# supports RFC 5780 only if it is started with more than one
|
|
||||||
# listening IP address of the same family (IPv4 or IPv6).
|
|
||||||
# RFC 5780 is supported only by UDP protocol, other protocols
|
|
||||||
# are listening to that endpoint only for "symmetry".
|
|
||||||
#
|
|
||||||
#alt-listening-port=0
|
|
||||||
|
|
||||||
# Alternative listening port for TLS and DTLS protocols.
|
|
||||||
# Default (or zero) value means "TLS listening port plus one".
|
|
||||||
#
|
|
||||||
#alt-tls-listening-port=0
|
|
||||||
|
|
||||||
# Listener IP address of relay server. Multiple listeners can be specified.
|
|
||||||
# If no IP(s) specified in the config file or in the command line options,
|
|
||||||
# then all IPv4 and IPv6 system IPs will be used for listening.
|
|
||||||
#
|
|
||||||
#listening-ip=172.17.19.101
|
|
||||||
#listening-ip=10.207.21.238
|
|
||||||
#listening-ip=2607:f0d0:1002:51::4
|
|
||||||
|
|
||||||
# Auxiliary STUN/TURN server listening endpoint.
|
|
||||||
# Aux servers have almost full TURN and STUN functionality.
|
|
||||||
# The (minor) limitations are:
|
|
||||||
#
|
|
||||||
# 1) Auxiliary servers do not have alternative ports and
|
|
||||||
# they do not support STUN RFC 5780 functionality (CHANGE REQUEST).
|
|
||||||
#
|
|
||||||
# 2) Auxiliary servers also are never returning ALTERNATIVE-SERVER reply.
|
|
||||||
#
|
|
||||||
# Valid formats are 1.2.3.4:5555 for IPv4 and [1:2::3:4]:5555 for IPv6.
|
|
||||||
#
|
|
||||||
# There may be multiple aux-server options, each will be used for listening
|
|
||||||
# to client requests.
|
|
||||||
#
|
|
||||||
#aux-server=172.17.19.110:33478
|
|
||||||
#aux-server=[2607:f0d0:1002:51::4]:33478
|
|
||||||
|
|
||||||
# (recommended for older Linuxes only)
|
|
||||||
# Automatically balance UDP traffic over auxiliary servers (if configured).
|
|
||||||
# The load balancing is using the ALTERNATE-SERVER mechanism.
|
|
||||||
# The TURN client must support 300 ALTERNATE-SERVER response for this
|
|
||||||
# functionality.
|
|
||||||
#
|
|
||||||
#udp-self-balance
|
|
||||||
|
|
||||||
# Relay interface device for relay sockets (optional, Linux only).
|
|
||||||
# NOT RECOMMENDED.
|
|
||||||
#
|
|
||||||
#relay-device=eth1
|
|
||||||
|
|
||||||
# Relay address (the local IP address that will be used to relay the
|
|
||||||
# packets to the peer).
|
|
||||||
# Multiple relay addresses may be used.
|
|
||||||
# The same IP(s) can be used as both listening IP(s) and relay IP(s).
|
|
||||||
#
|
|
||||||
# If no relay IP(s) specified, then the turnserver will apply the default
|
|
||||||
# policy: it will decide itself which relay addresses to be used, and it
|
|
||||||
# will always be using the client socket IP address as the relay IP address
|
|
||||||
# of the TURN session (if the requested relay address family is the same
|
|
||||||
# as the family of the client socket).
|
|
||||||
#
|
|
||||||
#relay-ip=172.17.19.105
|
|
||||||
#relay-ip=2607:f0d0:1002:51::5
|
|
||||||
|
|
||||||
# For Amazon EC2 users:
|
|
||||||
#
|
|
||||||
# TURN Server public/private address mapping, if the server is behind NAT.
|
|
||||||
# In that situation, if a -X is used in form "-X <ip>" then that ip will be reported
|
|
||||||
# as relay IP address of all allocations. This scenario works only in a simple case
|
|
||||||
# when one single relay address is be used, and no RFC5780 functionality is required.
|
|
||||||
# That single relay address must be mapped by NAT to the 'external' IP.
|
|
||||||
# The "external-ip" value, if not empty, is returned in XOR-RELAYED-ADDRESS field.
|
|
||||||
# For that 'external' IP, NAT must forward ports directly (relayed port 12345
|
|
||||||
# must be always mapped to the same 'external' port 12345).
|
|
||||||
#
|
|
||||||
# In more complex case when more than one IP address is involved,
|
|
||||||
# that option must be used several times, each entry must
|
|
||||||
# have form "-X <public-ip/private-ip>", to map all involved addresses.
|
|
||||||
# RFC5780 NAT discovery STUN functionality will work correctly,
|
|
||||||
# if the addresses are mapped properly, even when the TURN server itself
|
|
||||||
# is behind A NAT.
|
|
||||||
#
|
|
||||||
# By default, this value is empty, and no address mapping is used.
|
|
||||||
#
|
|
||||||
#external-ip=60.70.80.91
|
|
||||||
#
|
|
||||||
#OR:
|
|
||||||
#
|
|
||||||
#external-ip=60.70.80.91/172.17.19.101
|
|
||||||
#external-ip=60.70.80.92/172.17.19.102
|
|
||||||
|
|
||||||
|
|
||||||
# Number of the relay threads to handle the established connections
|
|
||||||
# (in addition to authentication thread and the listener thread).
|
|
||||||
# If explicitly set to 0 then application runs relay process in a
|
|
||||||
# single thread, in the same thread with the listener process
|
|
||||||
# (the authentication thread will still be a separate thread).
|
|
||||||
#
|
|
||||||
# If this parameter is not set, then the default OS-dependent
|
|
||||||
# thread pattern algorithm will be employed. Usually the default
|
|
||||||
# algorithm is the most optimal, so you have to change this option
|
|
||||||
# only if you want to make some fine tweaks.
|
|
||||||
#
|
|
||||||
# In the older systems (Linux kernel before 3.9),
|
|
||||||
# the number of UDP threads is always one thread per network listening
|
|
||||||
# endpoint - including the auxiliary endpoints - unless 0 (zero) or
|
|
||||||
# 1 (one) value is set.
|
|
||||||
#
|
|
||||||
#relay-threads=0
|
|
||||||
|
|
||||||
# Lower and upper bounds of the UDP relay endpoints:
|
|
||||||
# (default values are 49152 and 65535)
|
|
||||||
#
|
|
||||||
#min-port=49152
|
|
||||||
#max-port=65535
|
|
||||||
|
|
||||||
# Uncomment to run TURN server in 'normal' 'moderate' verbose mode.
|
|
||||||
# By default the verbose mode is off.
|
|
||||||
#verbose
|
|
||||||
|
|
||||||
# Uncomment to run TURN server in 'extra' verbose mode.
|
|
||||||
# This mode is very annoying and produces lots of output.
|
|
||||||
# Not recommended under any normal circumstances.
|
|
||||||
#
|
|
||||||
#Verbose
|
|
||||||
|
|
||||||
# Uncomment to use fingerprints in the TURN messages.
|
|
||||||
# By default the fingerprints are off.
|
|
||||||
#
|
|
||||||
#fingerprint
|
|
||||||
|
|
||||||
# Uncomment to use long-term credential mechanism.
|
|
||||||
# By default no credentials mechanism is used (any user allowed).
|
|
||||||
#
|
|
||||||
#lt-cred-mech
|
|
||||||
|
|
||||||
# This option is opposite to lt-cred-mech.
|
|
||||||
# (TURN Server with no-auth option allows anonymous access).
|
|
||||||
# If neither option is defined, and no users are defined,
|
|
||||||
# then no-auth is default. If at least one user is defined,
|
|
||||||
# in this file or in command line or in usersdb file, then
|
|
||||||
# lt-cred-mech is default.
|
|
||||||
#
|
|
||||||
#no-auth
|
|
||||||
|
|
||||||
# TURN REST API flag.
|
|
||||||
# Flag that sets a special authorization option that is based upon authentication secret.
|
|
||||||
# This feature can be used with the long-term authentication mechanism, only.
|
|
||||||
# This feature purpose is to support "TURN Server REST API", see
|
|
||||||
# "TURN REST API" link in the project's page
|
|
||||||
# https://github.com/coturn/coturn/
|
|
||||||
#
|
|
||||||
# This option is used with timestamp:
|
|
||||||
#
|
|
||||||
# usercombo -> "timestamp:userid"
|
|
||||||
# turn user -> usercombo
|
|
||||||
# turn password -> base64(hmac(secret key, usercombo))
|
|
||||||
#
|
|
||||||
# This allows TURN credentials to be accounted for a specific user id.
|
|
||||||
# If you don't have a suitable id, the timestamp alone can be used.
|
|
||||||
# This option is just turning on secret-based authentication.
|
|
||||||
# The actual value of the secret is defined either by option static-auth-secret,
|
|
||||||
# or can be found in the turn_secret table in the database (see below).
|
|
||||||
#
|
|
||||||
#use-auth-secret
|
#use-auth-secret
|
||||||
|
|
||||||
# 'Static' authentication secret value (a string) for TURN REST API only.
|
#rest api账号密码
|
||||||
# If not set, then the turn server
|
#static-auth-secret=this-is-the-secret-configured-for-coturn-server
|
||||||
# will try to use the 'dynamic' value in turn_secret table
|
|
||||||
# in user database (if present). The database-stored value can be changed on-the-fly
|
|
||||||
# by a separate program, so this is why that other mode is 'dynamic'.
|
|
||||||
#
|
|
||||||
#static-auth-secret=north
|
|
||||||
|
|
||||||
# Server name used for
|
#来源(域名或ip:port)
|
||||||
# the oAuth authentication purposes.
|
#realm=
|
||||||
# The default value is the realm name.
|
|
||||||
#
|
|
||||||
#server-name=blackdow.carleon.gov
|
|
||||||
|
|
||||||
# Flag that allows oAuth authentication.
|
|
||||||
#
|
|
||||||
#oauth
|
|
||||||
|
|
||||||
# 'Static' user accounts for long term credentials mechanism, only.
|
|
||||||
# This option cannot be used with TURN REST API.
|
|
||||||
# 'Static' user accounts are NOT dynamically checked by the turnserver process,
|
|
||||||
# so that they can NOT be changed while the turnserver is running.
|
|
||||||
#
|
|
||||||
#user=username1:key1
|
|
||||||
#user=username2:key2
|
|
||||||
# OR:
|
|
||||||
#user=username1:password1
|
|
||||||
#user=username2:password2
|
|
||||||
#
|
|
||||||
# Keys must be generated by turnadmin utility. The key value depends
|
|
||||||
# on user name, realm, and password:
|
|
||||||
#
|
|
||||||
# Example:
|
|
||||||
# $ turnadmin -k -u ninefingers -r north.gov -p youhavetoberealistic
|
|
||||||
# Output: 0xbc807ee29df3c9ffa736523fb2c4e8ee
|
|
||||||
# ('0x' in the beginning of the key is what differentiates the key from
|
|
||||||
# password. If it has 0x then it is a key, otherwise it is a password).
|
|
||||||
#
|
|
||||||
# The corresponding user account entry in the config file will be:
|
|
||||||
#
|
|
||||||
#user=ninefingers:0xbc807ee29df3c9ffa736523fb2c4e8ee
|
|
||||||
# Or, equivalently, with open clear password (less secure):
|
|
||||||
#user=ninefingers:youhavetoberealistic
|
|
||||||
#
|
|
||||||
|
|
||||||
# SQLite database file name.
|
|
||||||
#
|
|
||||||
# Default file name is /var/db/turndb or /usr/local/var/db/turndb or
|
|
||||||
# /var/lib/turn/turndb.
|
|
||||||
#
|
|
||||||
#userdb=/var/db/turndb
|
|
||||||
|
|
||||||
# PostgreSQL database connection string in the case that we are using PostgreSQL
|
|
||||||
# as the user database.
|
|
||||||
# This database can be used for long-term credential mechanism
|
|
||||||
# and it can store the secret value for secret-based timed authentication in TURN RESP API.
|
|
||||||
# See http://www.postgresql.org/docs/8.4/static/libpq-connect.html for 8.x PostgreSQL
|
|
||||||
# versions connection string format, see
|
|
||||||
# http://www.postgresql.org/docs/9.2/static/libpq-connect.html#LIBPQ-CONNSTRING
|
|
||||||
# for 9.x and newer connection string formats.
|
|
||||||
#
|
|
||||||
#psql-userdb="host=<host> dbname=<database-name> user=<database-user> password=<database-user-password> connect_timeout=30"
|
|
||||||
|
|
||||||
# MySQL database connection string in the case that we are using MySQL
|
|
||||||
# as the user database.
|
|
||||||
# This database can be used for long-term credential mechanism
|
|
||||||
# and it can store the secret value for secret-based timed authentication in TURN RESP API.
|
|
||||||
#
|
|
||||||
# Optional connection string parameters for the secure communications (SSL):
|
|
||||||
# ca, capath, cert, key, cipher
|
|
||||||
# (see http://dev.mysql.com/doc/refman/5.1/en/ssl-options.html for the
|
|
||||||
# command options description).
|
|
||||||
#
|
|
||||||
# Use string format as below (space separated parameters, all optional):
|
|
||||||
#
|
|
||||||
#mysql-userdb="host=<host> dbname=<database-name> user=<database-user> password=<database-user-password> port=<port> connect_timeout=<seconds>"
|
|
||||||
|
|
||||||
# MongoDB database connection string in the case that we are using MongoDB
|
|
||||||
# as the user database.
|
|
||||||
# This database can be used for long-term credential mechanism
|
|
||||||
# and it can store the secret value for secret-based timed authentication in TURN RESP API.
|
|
||||||
# Use string format is described at http://hergert.me/docs/mongo-c-driver/mongoc_uri.html
|
|
||||||
#
|
|
||||||
#mongo-userdb="mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]"
|
|
||||||
|
|
||||||
# Redis database connection string in the case that we are using Redis
|
|
||||||
# as the user database.
|
|
||||||
# This database can be used for long-term credential mechanism
|
|
||||||
# and it can store the secret value for secret-based timed authentication in TURN RESP API.
|
|
||||||
# Use string format as below (space separated parameters, all optional):
|
|
||||||
#
|
|
||||||
#redis-userdb="ip=<ip-address> dbname=<database-number> password=<database-user-password> port=<port> connect_timeout=<seconds>"
|
|
||||||
|
|
||||||
# Redis status and statistics database connection string, if used (default - empty, no Redis stats DB used).
|
|
||||||
# This database keeps allocations status information, and it can be also used for publishing
|
|
||||||
# and delivering traffic and allocation event notifications.
|
|
||||||
# The connection string has the same parameters as redis-userdb connection string.
|
|
||||||
# Use string format as below (space separated parameters, all optional):
|
|
||||||
#
|
|
||||||
#redis-statsdb="ip=<ip-address> dbname=<database-number> password=<database-user-password> port=<port> connect_timeout=<seconds>"
|
|
||||||
|
|
||||||
# The default realm to be used for the users when no explicit
|
|
||||||
# origin/realm relationship was found in the database, or if the TURN
|
|
||||||
# server is not using any database (just the commands-line settings
|
|
||||||
# and the userdb file). Must be used with long-term credentials
|
|
||||||
# mechanism or with TURN REST API.
|
|
||||||
#
|
|
||||||
#realm=mycompany.org
|
|
||||||
|
|
||||||
# The flag that sets the origin consistency
|
|
||||||
# check: across the session, all requests must have the same
|
|
||||||
# main ORIGIN attribute value (if the ORIGIN was
|
|
||||||
# initially used by the session).
|
|
||||||
#
|
|
||||||
#check-origin-consistency
|
|
||||||
|
|
||||||
# Per-user allocation quota.
|
|
||||||
# default value is 0 (no quota, unlimited number of sessions per user).
|
|
||||||
# This option can also be set through the database, for a particular realm.
|
|
||||||
#
|
|
||||||
#user-quota=0
|
|
||||||
|
|
||||||
# Total allocation quota.
|
|
||||||
# default value is 0 (no quota).
|
|
||||||
# This option can also be set through the database, for a particular realm.
|
|
||||||
#
|
|
||||||
#total-quota=0
|
|
||||||
|
|
||||||
# Max bytes-per-second bandwidth a TURN session is allowed to handle
|
|
||||||
# (input and output network streams are treated separately). Anything above
|
|
||||||
# that limit will be dropped or temporary suppressed (within
|
|
||||||
# the available buffer limits).
|
|
||||||
# This option can also be set through the database, for a particular realm.
|
|
||||||
#
|
|
||||||
#max-bps=0
|
|
||||||
|
|
||||||
#
|
|
||||||
# Maximum server capacity.
|
|
||||||
# Total bytes-per-second bandwidth the TURN server is allowed to allocate
|
|
||||||
# for the sessions, combined (input and output network streams are treated separately).
|
|
||||||
#
|
|
||||||
# bps-capacity=0
|
|
||||||
|
|
||||||
# Uncomment if no UDP client listener is desired.
|
|
||||||
# By default UDP client listener is always started.
|
|
||||||
#
|
|
||||||
#no-udp
|
|
||||||
|
|
||||||
# Uncomment if no TCP client listener is desired.
|
|
||||||
# By default TCP client listener is always started.
|
|
||||||
#
|
|
||||||
#no-tcp
|
|
||||||
|
|
||||||
# Uncomment if no TLS client listener is desired.
|
|
||||||
# By default TLS client listener is always started.
|
|
||||||
#
|
|
||||||
#no-tls
|
|
||||||
|
|
||||||
# Uncomment if no DTLS client listener is desired.
|
|
||||||
# By default DTLS client listener is always started.
|
|
||||||
#
|
|
||||||
#no-dtls
|
|
||||||
|
|
||||||
# Uncomment if no UDP relay endpoints are allowed.
|
|
||||||
# By default UDP relay endpoints are enabled (like in RFC 5766).
|
|
||||||
#
|
|
||||||
#no-udp-relay
|
|
||||||
|
|
||||||
# Uncomment if no TCP relay endpoints are allowed.
|
|
||||||
# By default TCP relay endpoints are enabled (like in RFC 6062).
|
|
||||||
#
|
|
||||||
#no-tcp-relay
|
|
||||||
|
|
||||||
# Uncomment if extra security is desired,
|
|
||||||
# with nonce value having limited lifetime (600 secs).
|
|
||||||
# By default, the nonce value is unique for a session,
|
|
||||||
# but it has unlimited lifetime. With this option,
|
|
||||||
# the nonce lifetime is limited to 600 seconds, after that
|
|
||||||
# the client will get 438 error and will have to re-authenticate itself.
|
|
||||||
#
|
|
||||||
#stale-nonce
|
|
||||||
|
|
||||||
# Certificate file.
|
|
||||||
# Use an absolute path or path relative to the
|
|
||||||
# configuration file.
|
|
||||||
#
|
|
||||||
#cert=/usr/local/etc/turn_server_cert.pem
|
|
||||||
|
|
||||||
# Private key file.
|
|
||||||
# Use an absolute path or path relative to the
|
|
||||||
# configuration file.
|
|
||||||
# Use PEM file format.
|
|
||||||
#
|
|
||||||
#pkey=/usr/local/etc/turn_server_pkey.pem
|
|
||||||
|
|
||||||
# Private key file password, if it is in encoded format.
|
|
||||||
# This option has no default value.
|
|
||||||
#
|
|
||||||
#pkey-pwd=...
|
|
||||||
|
|
||||||
# Allowed OpenSSL cipher list for TLS/DTLS connections.
|
|
||||||
# Default value is "DEFAULT".
|
|
||||||
#
|
|
||||||
#cipher-list="DEFAULT"
|
|
||||||
|
|
||||||
# CA file in OpenSSL format.
|
|
||||||
# Forces TURN server to verify the client SSL certificates.
|
|
||||||
# By default it is not set: there is no default value and the client
|
|
||||||
# certificate is not checked.
|
|
||||||
#
|
|
||||||
# Example:
|
|
||||||
#CA-file=/etc/ssh/id_rsa.cert
|
|
||||||
|
|
||||||
# Curve name for EC ciphers, if supported by OpenSSL
|
|
||||||
# library (TLS and DTLS). The default value is prime256v1,
|
|
||||||
# if pre-OpenSSL 1.0.2 is used. With OpenSSL 1.0.2+,
|
|
||||||
# an optimal curve will be automatically calculated, if not defined
|
|
||||||
# by this option.
|
|
||||||
#
|
|
||||||
#ec-curve-name=prime256v1
|
|
||||||
|
|
||||||
# Use 566 bits predefined DH TLS key. Default size of the key is 1066.
|
|
||||||
#
|
|
||||||
#dh566
|
|
||||||
|
|
||||||
# Use 2066 bits predefined DH TLS key. Default size of the key is 1066.
|
|
||||||
#
|
|
||||||
#dh2066
|
|
||||||
|
|
||||||
# Use custom DH TLS key, stored in PEM format in the file.
|
|
||||||
# Flags --dh566 and --dh2066 are ignored when the DH key is taken from a file.
|
|
||||||
#
|
|
||||||
#dh-file=<DH-PEM-file-name>
|
|
||||||
|
|
||||||
# Flag to prevent stdout log messages.
|
|
||||||
# By default, all log messages are going to both stdout and to
|
|
||||||
# the configured log file. With this option everything will be
|
|
||||||
# going to the configured log only (unless the log file itself is stdout).
|
|
||||||
#
|
|
||||||
#no-stdout-log
|
|
||||||
|
|
||||||
# Option to set the log file name.
|
|
||||||
# By default, the turnserver tries to open a log file in
|
|
||||||
# /var/log, /var/tmp, /tmp and current directories directories
|
|
||||||
# (which open operation succeeds first that file will be used).
|
|
||||||
# With this option you can set the definite log file name.
|
|
||||||
# The special names are "stdout" and "-" - they will force everything
|
|
||||||
# to the stdout. Also, the "syslog" name will force everything to
|
|
||||||
# the system log (syslog).
|
|
||||||
# In the runtime, the logfile can be reset with the SIGHUP signal
|
|
||||||
# to the turnserver process.
|
|
||||||
#
|
|
||||||
#log-file=/var/tmp/turn.log
|
|
||||||
|
|
||||||
# Option to redirect all log output into system log (syslog).
|
|
||||||
#
|
|
||||||
#syslog
|
|
||||||
|
|
||||||
# This flag means that no log file rollover will be used, and the log file
|
|
||||||
# name will be constructed as-is, without PID and date appendage.
|
|
||||||
# This option can be used, for example, together with the logrotate tool.
|
|
||||||
#
|
|
||||||
#simple-log
|
|
||||||
|
|
||||||
# Option to set the "redirection" mode. The value of this option
|
|
||||||
# will be the address of the alternate server for UDP & TCP service in form of
|
|
||||||
# <ip>[:<port>]. The server will send this value in the attribute
|
|
||||||
# ALTERNATE-SERVER, with error 300, on ALLOCATE request, to the client.
|
|
||||||
# Client will receive only values with the same address family
|
|
||||||
# as the client network endpoint address family.
|
|
||||||
# See RFC 5389 and RFC 5766 for ALTERNATE-SERVER functionality description.
|
|
||||||
# The client must use the obtained value for subsequent TURN communications.
|
|
||||||
# If more than one --alternate-server options are provided, then the functionality
|
|
||||||
# can be more accurately described as "load-balancing" than a mere "redirection".
|
|
||||||
# If the port number is omitted, then the default port
|
|
||||||
# number 3478 for the UDP/TCP protocols will be used.
|
|
||||||
# Colon (:) characters in IPv6 addresses may conflict with the syntax of
|
|
||||||
# the option. To alleviate this conflict, literal IPv6 addresses are enclosed
|
|
||||||
# in square brackets in such resource identifiers, for example:
|
|
||||||
# [2001:db8:85a3:8d3:1319:8a2e:370:7348]:3478 .
|
|
||||||
# Multiple alternate servers can be set. They will be used in the
|
|
||||||
# round-robin manner. All servers in the pool are considered of equal weight and
|
|
||||||
# the load will be distributed equally. For example, if we have 4 alternate servers,
|
|
||||||
# then each server will receive 25% of ALLOCATE requests. A alternate TURN server
|
|
||||||
# address can be used more than one time with the alternate-server option, so this
|
|
||||||
# can emulate "weighting" of the servers.
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
#alternate-server=1.2.3.4:5678
|
|
||||||
#alternate-server=11.22.33.44:56789
|
|
||||||
#alternate-server=5.6.7.8
|
|
||||||
#alternate-server=[2001:db8:85a3:8d3:1319:8a2e:370:7348]:3478
|
|
||||||
|
|
||||||
# Option to set alternative server for TLS & DTLS services in form of
|
|
||||||
# <ip>:<port>. If the port number is omitted, then the default port
|
|
||||||
# number 5349 for the TLS/DTLS protocols will be used. See the previous
|
|
||||||
# option for the functionality description.
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
#tls-alternate-server=1.2.3.4:5678
|
|
||||||
#tls-alternate-server=11.22.33.44:56789
|
|
||||||
#tls-alternate-server=[2001:db8:85a3:8d3:1319:8a2e:370:7348]:3478
|
|
||||||
|
|
||||||
# Option to suppress TURN functionality, only STUN requests will be processed.
|
|
||||||
# Run as STUN server only, all TURN requests will be ignored.
|
|
||||||
# By default, this option is NOT set.
|
|
||||||
#
|
|
||||||
#stun-only
|
|
||||||
|
|
||||||
# Option to suppress STUN functionality, only TURN requests will be processed.
|
|
||||||
# Run as TURN server only, all STUN requests will be ignored.
|
|
||||||
# By default, this option is NOT set.
|
|
||||||
#
|
|
||||||
#no-stun
|
|
||||||
|
|
||||||
# This is the timestamp/username separator symbol (character) in TURN REST API.
|
|
||||||
# The default value is ':'.
|
|
||||||
# rest-api-separator=:
|
|
||||||
|
|
||||||
# Flag that can be used to disallow peers on the loopback addresses (127.x.x.x and ::1).
|
|
||||||
# This is an extra security measure.
|
|
||||||
#
|
|
||||||
#no-loopback-peers
|
|
||||||
|
|
||||||
# Flag that can be used to disallow peers on well-known broadcast addresses (224.0.0.0 and above, and FFXX:*).
|
|
||||||
# This is an extra security measure.
|
|
||||||
#
|
|
||||||
#no-multicast-peers
|
|
||||||
|
|
||||||
# Option to set the max time, in seconds, allowed for full allocation establishment.
|
|
||||||
# Default is 60 seconds.
|
|
||||||
#
|
|
||||||
#max-allocate-timeout=60
|
|
||||||
|
|
||||||
# Option to allow or ban specific ip addresses or ranges of ip addresses.
|
|
||||||
# If an ip address is specified as both allowed and denied, then the ip address is
|
|
||||||
# considered to be allowed. This is useful when you wish to ban a range of ip
|
|
||||||
# addresses, except for a few specific ips within that range.
|
|
||||||
#
|
|
||||||
# This can be used when you do not want users of the turn server to be able to access
|
|
||||||
# machines reachable by the turn server, but would otherwise be unreachable from the
|
|
||||||
# internet (e.g. when the turn server is sitting behind a NAT)
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
# denied-peer-ip=83.166.64.0-83.166.95.255
|
|
||||||
# allowed-peer-ip=83.166.68.45
|
|
||||||
|
|
||||||
# File name to store the pid of the process.
|
|
||||||
# Default is /var/run/turnserver.pid (if superuser account is used) or
|
|
||||||
# /var/tmp/turnserver.pid .
|
|
||||||
#
|
|
||||||
#pidfile="/var/run/turnserver.pid"
|
|
||||||
|
|
||||||
# Require authentication of the STUN Binding request.
|
|
||||||
# By default, the clients are allowed anonymous access to the STUN Binding functionality.
|
|
||||||
#
|
|
||||||
#secure-stun
|
|
||||||
|
|
||||||
# Mobility with ICE (MICE) specs support.
|
|
||||||
#
|
|
||||||
#mobility
|
|
||||||
|
|
||||||
# User name to run the process. After the initialization, the turnserver process
|
|
||||||
# will make an attempt to change the current user ID to that user.
|
|
||||||
#
|
|
||||||
#proc-user=<user-name>
|
|
||||||
|
|
||||||
# Group name to run the process. After the initialization, the turnserver process
|
|
||||||
# will make an attempt to change the current group ID to that group.
|
|
||||||
#
|
|
||||||
#proc-group=<group-name>
|
|
||||||
|
|
||||||
# Turn OFF the CLI support.
|
|
||||||
# By default it is always ON.
|
|
||||||
# See also options cli-ip and cli-port.
|
|
||||||
#
|
|
||||||
#no-cli
|
|
||||||
|
|
||||||
#Local system IP address to be used for CLI server endpoint. Default value
|
|
||||||
# is 127.0.0.1.
|
|
||||||
#
|
|
||||||
#cli-ip=127.0.0.1
|
|
||||||
|
|
||||||
# CLI server port. Default is 5766.
|
|
||||||
#
|
|
||||||
#cli-port=5766
|
|
||||||
|
|
||||||
# CLI access password. Default is empty (no password).
|
|
||||||
# For the security reasons, it is recommended to use the encrypted
|
|
||||||
# for of the password (see the -P command in the turnadmin utility).
|
|
||||||
#
|
|
||||||
# Secure form for password 'qwerty':
|
|
||||||
#
|
|
||||||
#cli-password=$5$79a316b350311570$81df9cfb9af7f5e5a76eada31e7097b663a0670f99a3c07ded3f1c8e59c5658a
|
|
||||||
#
|
|
||||||
# Or unsecure form for the same paassword:
|
|
||||||
#
|
|
||||||
#cli-password=qwerty
|
|
||||||
|
|
||||||
# Server relay. NON-STANDARD AND DANGEROUS OPTION.
|
|
||||||
# Only for those applications when we want to run
|
|
||||||
# server applications on the relay endpoints.
|
|
||||||
# This option eliminates the IP permissions check on
|
|
||||||
# the packets incoming to the relay endpoints.
|
|
||||||
#
|
|
||||||
#server-relay
|
|
||||||
|
|
||||||
# Maximum number of output sessions in ps CLI command.
|
|
||||||
# This value can be changed on-the-fly in CLI. The default value is 256.
|
|
||||||
#
|
|
||||||
#cli-max-output-sessions
|
|
||||||
|
|
||||||
# Set network engine type for the process (for internal purposes).
|
|
||||||
#
|
|
||||||
#ne=[1|2|3]
|
|
||||||
|
|
||||||
# Do not allow an TLS/DTLS version of protocol
|
|
||||||
#
|
|
||||||
#no-tlsv1
|
|
||||||
#no-tlsv1_1
|
|
||||||
#no-tlsv1_2
|
|
4710
svr/package-lock.json
generated
@@ -1,38 +1,38 @@
|
|||||||
{
|
{
|
||||||
"name": "tl-rtc-file",
|
"name": "tl-rtc-file",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "webrtc, p2p,file",
|
"description": "webrtc, p2p,file",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lapi": "cross-env ENV_MODE=local node localapi",
|
"lapi": "cross-env ENV_MODE=local node localapi",
|
||||||
"lsocket": "cross-env ENV_MODE=local node localsocket",
|
"lsocket": "cross-env ENV_MODE=local node localsocket",
|
||||||
"lcsocket": "cross-env ENV_MODE=local node localcontrolsocket",
|
"lcsocket": "cross-env ENV_MODE=local node localcontrolsocket",
|
||||||
"sapi": "cross-env ENV_MODE=server node serverapi",
|
"sapi": "cross-env ENV_MODE=server node serverapi",
|
||||||
"ssocket": "cross-env ENV_MODE=server node serversocket",
|
"ssocket": "cross-env ENV_MODE=server node serversocket",
|
||||||
"scsockert": "cross-env ENV_MODE=server node servercontrolsocket",
|
"scsocket": "cross-env ENV_MODE=server node servercontrolsocket",
|
||||||
"test": "cross-env mocha ./test/test.js"
|
"test": "cross-env mocha ./test/test.js"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": ""
|
"url": ""
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"none"
|
"none"
|
||||||
],
|
],
|
||||||
"author": "iamtsm",
|
"author": "iamtsm",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cross-env": "^5.2.0",
|
"cross-env": "^5.2.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"mocha": "^10.2.0",
|
"mocha": "^10.2.0",
|
||||||
"mysql2": "^2.1.0",
|
"mysql2": "^2.1.0",
|
||||||
"openai": "^1.0.0",
|
"openai": "^1.0.0",
|
||||||
"request": "^2.88.2",
|
"request": "^2.88.2",
|
||||||
"sequelize": "^6.1.0",
|
"sequelize": "^6.1.0",
|
||||||
"sequelize-pool": "^6.0.0",
|
"sequelize-pool": "^6.0.0",
|
||||||
"socket.io": "^2.3.0",
|
"socket.io": "^2.3.0",
|
||||||
"pngjs": "^7.0.0",
|
"pngjs": "^7.0.0",
|
||||||
"robotjs": "^0.6.0"
|
"robotjs": "^0.6.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {}
|
"devDependencies": {}
|
||||||
}
|
}
|
||||||
|
@@ -19,6 +19,7 @@ body {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
margin-left: 5%;
|
margin-left: 5%;
|
||||||
max-width: 90%;
|
max-width: 90%;
|
||||||
|
padding-bottom: 30px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
transition: background-color var(--duration);
|
transition: background-color var(--duration);
|
||||||
@@ -33,6 +34,10 @@ body {
|
|||||||
border-radius: 8px !important;
|
border-radius: 8px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.language-mode{
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
.layui-card {
|
.layui-card {
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
@@ -47,7 +52,7 @@ body {
|
|||||||
.tl-rtc-file-header-tool {
|
.tl-rtc-file-header-tool {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 10px;
|
top: 10px;
|
||||||
left: 10px;
|
right: 10px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,12 +225,12 @@ body {
|
|||||||
background-color: rgb(248 253 255 / 45%);
|
background-color: rgb(248 253 255 / 45%);
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
/* box-shadow: rgba(0, 0, 0, 0.4) 0px 2px 3px; */
|
|
||||||
transition: all 0.3s;
|
transition: all 0.3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tl-rtc-file-tool:hover {
|
.tl-rtc-file-tool:hover {
|
||||||
box-shadow: rgba(0, 0, 0, 0.4) 0px 7px 14px;
|
box-shadow: rgba(9,30,66,0.25) 0px 8px 9px;
|
||||||
|
/* box-shadow: 0 20px 32px -8px rgba(9,30,66,0.25), 0 0 1px rgba(9,30,66,0.31); */
|
||||||
}
|
}
|
||||||
|
|
||||||
.tl-rtc-file-tool i {
|
.tl-rtc-file-tool i {
|
||||||
@@ -244,6 +249,7 @@ body {
|
|||||||
.tl-rtc-file-tool b {
|
.tl-rtc-file-tool b {
|
||||||
margin: 10px 10px 10px 0;
|
margin: 10px 10px 10px 0;
|
||||||
letter-spacing: 2px;
|
letter-spacing: 2px;
|
||||||
|
left: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tl-rtc-file-tool-disabled,
|
.tl-rtc-file-tool-disabled,
|
||||||
@@ -385,6 +391,7 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tl-rtc-file-create-room-input {
|
.tl-rtc-file-create-room-input {
|
||||||
|
text-align: right;
|
||||||
width: 0%;
|
width: 0%;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
padding: 0px 15px 0px 15px;
|
padding: 0px 15px 0px 15px;
|
||||||
@@ -793,8 +800,8 @@ body {
|
|||||||
@media screen and (min-width: 765px) and (max-width: 1280px) {
|
@media screen and (min-width: 765px) and (max-width: 1280px) {
|
||||||
|
|
||||||
}
|
}
|
||||||
/** 1280px以上 */
|
/** 765px以上 */
|
||||||
@media screen and (min-width: 1280px) {
|
@media screen and (min-width: 765px) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -846,15 +853,16 @@ body {
|
|||||||
.tl-rtc-file-notification-container{
|
.tl-rtc-file-notification-container{
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 10px;
|
top: 10px;
|
||||||
right: 10px;
|
|
||||||
z-index: 9999;
|
z-index: 9999;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
transition: right .45s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tl-rtc-file-notification {
|
.tl-rtc-file-notification {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 20px 32px -8px rgba(9,30,66,0.25), 0 0 1px rgba(9,30,66,0.31);
|
||||||
|
transition: opacity .45s;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
@@ -864,7 +872,6 @@ body {
|
|||||||
flex-direction: initial;
|
flex-direction: initial;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: all 0.5s ease-in-out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tl-rtc-file-notification-content{
|
.tl-rtc-file-notification-content{
|
||||||
@@ -922,9 +929,9 @@ body {
|
|||||||
|
|
||||||
.tl-rtc-file-tool-mobile-title{
|
.tl-rtc-file-tool-mobile-title{
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
word-break: keep-all;
|
word-break: keep-all;
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
margin-left: 6px !important;
|
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
-webkit-transform-origin-x: 0;
|
-webkit-transform-origin-x: 0;
|
||||||
transform: scale(0.6);
|
transform: scale(0.6);
|
||||||
@@ -962,4 +969,168 @@ body {
|
|||||||
.isMediaing{
|
.isMediaing{
|
||||||
width: 50%;
|
width: 50%;
|
||||||
margin-left: 50%;
|
margin-left: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#tl-rtc-file-mouse-draw{
|
||||||
|
margin: 0px 5px 0px 5px;
|
||||||
|
border: 1px dashed;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tl-rtc-file-mouse-draw svg{
|
||||||
|
cursor: pointer;
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
margin-top: -2px;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tl-rtc-file-mouse-draw-canvas-body{
|
||||||
|
margin-left:4px;
|
||||||
|
border-top: 1px dashed;}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-body{
|
||||||
|
margin:5px;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-body-item{
|
||||||
|
padding: 10px;
|
||||||
|
display: inline-flex;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-body-item i{
|
||||||
|
margin-left: 5px;
|
||||||
|
font-size: 20px;
|
||||||
|
margin-top: -2px;
|
||||||
|
font-weight: 900;
|
||||||
|
color: black;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tl-rtc-file-mouse-draw-line-size-txt, #tl-rtc-file-mouse-draw-div-size-txt{
|
||||||
|
position: relative;
|
||||||
|
top: 3px;
|
||||||
|
margin-left: 5px;
|
||||||
|
font-size: 20px;
|
||||||
|
margin-top: -2px;
|
||||||
|
font-weight: 900;
|
||||||
|
color: black;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-body-item i:hover{
|
||||||
|
color: #5280d7;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tl-rtc-file-mouse-draw-stroke-color{
|
||||||
|
margin-left: 3px;
|
||||||
|
margin-top: -8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tl-rtc-file-mouse-draw-stroke-color .layui-colorpicker{
|
||||||
|
width: 50px;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-body-item:disabled{
|
||||||
|
color: #4c53d91f;
|
||||||
|
cursor: no-drop;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-line{
|
||||||
|
cursor: url("/image/drawline.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-delete{
|
||||||
|
cursor: url("/image/drawdelete.png") 15 20, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-circle{
|
||||||
|
cursor: url("/image/drawcircle.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-circle-fill{
|
||||||
|
cursor: url("/image/drawcirclefill.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-rectangle{
|
||||||
|
cursor: url("/image/drawrectangle.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-rectangle-fill{
|
||||||
|
cursor: url("/image/drawrectanglefill.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-hexagon{
|
||||||
|
cursor: url("/image/drawhexagon.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-hexagon-fill{
|
||||||
|
cursor: url("/image/drawhexagonfill.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-triangle{
|
||||||
|
cursor: url("/image/drawtriangle.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-triangle-fill{
|
||||||
|
cursor: url("/image/drawtrianglefill.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-rhomboid{
|
||||||
|
cursor: url("/image/drawrhomboid.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-rhomboid-fill{
|
||||||
|
cursor: url("/image/drawrhomboidfill.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-star{
|
||||||
|
cursor: url("/image/drawstar.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-star-fill{
|
||||||
|
cursor: url("/image/drawstarfill.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tl-rtc-file-mouse-draw-canvas-text{
|
||||||
|
cursor: url("/image/drawtext.png") 5 24, auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layui-layer-title{
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.chating_input_body{
|
||||||
|
bottom: 0px;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chating_input_body textarea{
|
||||||
|
border-radius: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chating_send_body{
|
||||||
|
float: right;
|
||||||
|
margin-top: 10px;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chating_send_body_span{
|
||||||
|
font-size: 12px;
|
||||||
|
color: #0000007d;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 26px;
|
||||||
|
right: 75px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chating_send_body_button{
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -150,6 +150,10 @@
|
|||||||
<div class="tl-rtc-file-intro-main">
|
<div class="tl-rtc-file-intro-main">
|
||||||
基于webrtc的媒体流传输工具
|
基于webrtc的媒体流传输工具
|
||||||
</div>
|
</div>
|
||||||
|
<div style="margin-top: 30px;">
|
||||||
|
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/tl-open-source/tl-rtc-file?style=social">
|
||||||
|
<img alt="GitHub forks" src="https://img.shields.io/github/forks/tl-open-source/tl-rtc-file?style=social">
|
||||||
|
</div>
|
||||||
<div class="tl-rtc-file-intro-tag">
|
<div class="tl-rtc-file-intro-tag">
|
||||||
<span class="layui-badge layui-bg-blue">文件传输</span>
|
<span class="layui-badge layui-bg-blue">文件传输</span>
|
||||||
<span class="layui-badge layui-bg-black">文件暂存</span>
|
<span class="layui-badge layui-bg-black">文件暂存</span>
|
||||||
|
@@ -149,6 +149,10 @@
|
|||||||
<div class="tl-rtc-file-intro-main">
|
<div class="tl-rtc-file-intro-main">
|
||||||
webrtc based media streaming tool
|
webrtc based media streaming tool
|
||||||
</div>
|
</div>
|
||||||
|
<div style="margin-top: 30px;">
|
||||||
|
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/tl-open-source/tl-rtc-file?style=social">
|
||||||
|
<img alt="GitHub forks" src="https://img.shields.io/github/forks/tl-open-source/tl-rtc-file?style=social">
|
||||||
|
</div>
|
||||||
<div class="tl-rtc-file-intro-tag">
|
<div class="tl-rtc-file-intro-tag">
|
||||||
<span class="layui-badge layui-bg-blue">file transfer</span>
|
<span class="layui-badge layui-bg-blue">file transfer</span>
|
||||||
<span class="layui-badge layui-bg-green">audio and video call</span>
|
<span class="layui-badge layui-bg-green">audio and video call</span>
|
||||||
|
BIN
svr/res/image/drawcircle.png
Normal file
After Width: | Height: | Size: 457 B |
BIN
svr/res/image/drawcirclefill.png
Normal file
After Width: | Height: | Size: 366 B |
BIN
svr/res/image/drawdelete.png
Normal file
After Width: | Height: | Size: 365 B |
BIN
svr/res/image/drawhexagon.png
Normal file
After Width: | Height: | Size: 389 B |
BIN
svr/res/image/drawhexagonfill.png
Normal file
After Width: | Height: | Size: 330 B |
BIN
svr/res/image/drawline.png
Normal file
After Width: | Height: | Size: 359 B |
BIN
svr/res/image/drawrectangle.png
Normal file
After Width: | Height: | Size: 253 B |
BIN
svr/res/image/drawrectanglefill.png
Normal file
After Width: | Height: | Size: 249 B |
BIN
svr/res/image/drawrhomboid.png
Normal file
After Width: | Height: | Size: 287 B |
BIN
svr/res/image/drawrhomboidfill.png
Normal file
After Width: | Height: | Size: 255 B |
BIN
svr/res/image/drawstar.png
Normal file
After Width: | Height: | Size: 511 B |
BIN
svr/res/image/drawstarfill.png
Normal file
After Width: | Height: | Size: 396 B |
BIN
svr/res/image/drawtext.png
Normal file
After Width: | Height: | Size: 227 B |
BIN
svr/res/image/drawtriangle.png
Normal file
After Width: | Height: | Size: 352 B |
BIN
svr/res/image/drawtrianglefill.png
Normal file
After Width: | Height: | Size: 343 B |
1121
svr/res/index.html
@@ -1,4 +1,33 @@
|
|||||||
|
// --------------------------- //
|
||||||
|
// -- comm.js -- //
|
||||||
|
// -- version : 1.0.0 -- //
|
||||||
|
// -- date : 2023-06-22 -- //
|
||||||
|
// --------------------------- //
|
||||||
|
|
||||||
window.tlrtcfile = {
|
window.tlrtcfile = {
|
||||||
|
addUrlHashParams : function(obj){
|
||||||
|
let redirect = window.location.protocol + "//" + window.location.host + "#"
|
||||||
|
let oldObj = this.getRequestHashArgsObj();
|
||||||
|
obj = Object.assign(oldObj,obj);
|
||||||
|
for(let key in obj){
|
||||||
|
redirect += key + "=" + obj[key] + "&";
|
||||||
|
}
|
||||||
|
return redirect;
|
||||||
|
},
|
||||||
|
getRequestHashArgsObj : function () {
|
||||||
|
let query = decodeURIComponent(window.location.hash.substring(1));
|
||||||
|
let args = query.split("&");
|
||||||
|
let obj = {};
|
||||||
|
for (let i = 0; i < args.length; i++) {
|
||||||
|
let pair = args[i].split("=");
|
||||||
|
const key = pair[0];
|
||||||
|
const val = pair[1];
|
||||||
|
if(key){
|
||||||
|
obj[key] = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
getRequestHashArgs : function (key) {
|
getRequestHashArgs : function (key) {
|
||||||
let query = decodeURIComponent(window.location.hash.substring(1));
|
let query = decodeURIComponent(window.location.hash.substring(1));
|
||||||
let args = query.split("&");
|
let args = query.split("&");
|
||||||
@@ -48,48 +77,59 @@ window.tlrtcfile = {
|
|||||||
}
|
}
|
||||||
return getRandomName(4);
|
return getRandomName(4);
|
||||||
},
|
},
|
||||||
escapeHtml: function () {
|
escapeStr: function (str) {
|
||||||
var entityMap = {
|
const entityMap = {
|
||||||
escape: {
|
'&': '&',
|
||||||
'&': '&',
|
'<': '<',
|
||||||
'<': '<',
|
'>': '>',
|
||||||
'>': '>',
|
'"': '"',
|
||||||
'"': '"',
|
"'": ''',
|
||||||
"'": ''',
|
'/': '/',
|
||||||
},
|
'`': '`',
|
||||||
unescape: {
|
'=': '='
|
||||||
'&': "&",
|
|
||||||
''': "'",
|
|
||||||
'>': ">",
|
|
||||||
'<': "<",
|
|
||||||
'"': '"',
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
var entityReg = {
|
const encodedMap = {
|
||||||
escape: RegExp('[' + Object.keys(entityMap.escape).join('') + ']', 'g'),
|
'%': '%25',
|
||||||
unescape: RegExp('(' + Object.keys(entityMap.unescape).join('|') + ')', 'g')
|
'!': '%21',
|
||||||
}
|
"'": '%27',
|
||||||
|
'(': '%28',
|
||||||
// 将HTML转义为实体
|
')': '%29',
|
||||||
function escape(html) {
|
'*': '%2A',
|
||||||
if (typeof html !== 'string') return ''
|
'-': '%2D',
|
||||||
return html.replace(entityReg.escape, function (match) {
|
'.': '%2E',
|
||||||
return entityMap.escape[match]
|
'_': '%5F',
|
||||||
})
|
'~': '%7E'
|
||||||
}
|
};
|
||||||
|
return String(str).replace(/[&<>"'`=\/%!'()*\-._~]/g, function (s) {
|
||||||
// 将实体转回为HTML
|
return entityMap[s] || encodedMap[s] || '';
|
||||||
function unescape(str) {
|
});
|
||||||
if (typeof str !== 'string') return ''
|
},
|
||||||
return str.replace(entityReg.unescape, function (match) {
|
unescapeStr: function (str) {
|
||||||
return entityMap.unescape[match]
|
const entityMap = {
|
||||||
})
|
'&': '&',
|
||||||
}
|
'<': '<',
|
||||||
|
'>': '>',
|
||||||
return {
|
'"': '"',
|
||||||
escape: escape,
|
''': "'",
|
||||||
unescape: unescape
|
'/': '/',
|
||||||
}
|
'`': '`',
|
||||||
|
'=': '='
|
||||||
|
};
|
||||||
|
const encodedMap = {
|
||||||
|
'%25': '%',
|
||||||
|
'%21': '!',
|
||||||
|
'%27': "'",
|
||||||
|
'%28': '(',
|
||||||
|
'%29': ')',
|
||||||
|
'%2A': '*',
|
||||||
|
'%2D': '-',
|
||||||
|
'%2E': '.',
|
||||||
|
'%5F': '_',
|
||||||
|
'%7E': '~'
|
||||||
|
};
|
||||||
|
return String(str).replace(/&(amp|lt|gt|quot|#39|#x2F|#x60|#x3D);|%(25|21|27|28|29|2A|2D|2E|5F|7E)/g, function (s) {
|
||||||
|
return entityMap[s] || encodedMap[s] || '';
|
||||||
|
});
|
||||||
},
|
},
|
||||||
getNetWorkState: function () {
|
getNetWorkState: function () {
|
||||||
let ua = navigator.userAgent;
|
let ua = navigator.userAgent;
|
||||||
@@ -148,6 +188,32 @@ window.tlrtcfile = {
|
|||||||
/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
|
/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
chatKeydown: function (dom, callback) {
|
||||||
|
if(dom){
|
||||||
|
dom.onkeydown = function (e) {
|
||||||
|
if (e.defaultPrevented) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.shiftKey) {
|
||||||
|
// shift+enter 换行
|
||||||
|
return;
|
||||||
|
}else if (e.key !== undefined) {
|
||||||
|
if (e.key === "Enter") {
|
||||||
|
// enter键执行
|
||||||
|
callback && callback()
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
} else if (e.keyCode !== undefined) {
|
||||||
|
if (e.keyCode === 13) {
|
||||||
|
// enter键执行
|
||||||
|
callback && callback()
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
closeFullVideo: function (node, type, from) {
|
closeFullVideo: function (node, type, from) {
|
||||||
let stream = node.srcObject;
|
let stream = node.srcObject;
|
||||||
let nodeId = node.id.substr(0, node.id.length - 5);
|
let nodeId = node.id.substr(0, node.id.length - 5);
|
||||||
@@ -221,6 +287,37 @@ window.tlrtcfile = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
getWebrtcStats: async function (peerConnection) {
|
getWebrtcStats: async function (peerConnection) {
|
||||||
|
// 候选者对
|
||||||
|
"candidate-pair" |
|
||||||
|
// 证书相关的统计信息
|
||||||
|
"certificate" |
|
||||||
|
// 当前音视频编解码器的统计信息
|
||||||
|
"codec" |
|
||||||
|
// CSRC相关的统计信息
|
||||||
|
"csrc" |
|
||||||
|
// 数据通道的相关统计信息
|
||||||
|
"data-channel" |
|
||||||
|
// 传入数据流的相关统计信息
|
||||||
|
"inbound-rtp" |
|
||||||
|
// 本地候选连接的相关统计信息
|
||||||
|
"local-candidate" |
|
||||||
|
// 媒体源的相关统计信息
|
||||||
|
"media-source" |
|
||||||
|
// 传出数据流的相关统计信息
|
||||||
|
"outbound-rtp" |
|
||||||
|
// 对等连接的相关统计信息
|
||||||
|
"peer-connection" |
|
||||||
|
// 对等连接的相关统计信息
|
||||||
|
"remote-candidate" |
|
||||||
|
// 远程传入数据流的相关统计信息
|
||||||
|
"remote-inbound-rtp" |
|
||||||
|
// 远程传出数据流的相关统计信息
|
||||||
|
"remote-outbound-rtp" |
|
||||||
|
// 媒体轨道的相关统计信息
|
||||||
|
"track" |
|
||||||
|
// 传输协议的相关统计信息
|
||||||
|
"transport";
|
||||||
|
|
||||||
if (!peerConnection) {
|
if (!peerConnection) {
|
||||||
return "RTCPeerConnection is not available";
|
return "RTCPeerConnection is not available";
|
||||||
}
|
}
|
||||||
@@ -294,42 +391,6 @@ window.tlrtcfile = {
|
|||||||
callback("keyup", event)
|
callback("keyup", event)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
drawMousePath: function (coordinates) {
|
|
||||||
if (window.layer) {
|
|
||||||
layer.open({
|
|
||||||
type: 1,
|
|
||||||
area: ["80%", "80%"],
|
|
||||||
title: "鼠标路径绘制",
|
|
||||||
content: ` <div id="tl-rtc-file-mouse-draw" style="height: 100%;"> </div> `,
|
|
||||||
success: function (layero, index) {
|
|
||||||
document.querySelector(".layui-layer-content").style.borderRadius = "15px"
|
|
||||||
// 获取 canvas 元素
|
|
||||||
const canvas = document.createElement('canvas');
|
|
||||||
let dom = document.getElementById("tl-rtc-file-mouse-draw");
|
|
||||||
canvas.setAttribute("style","height: 100%; width: 100%;")
|
|
||||||
canvas.height = document.querySelector(".layui-layer-content").clientHeight;
|
|
||||||
canvas.width = document.querySelector(".layui-layer-content").clientWidth;
|
|
||||||
dom.appendChild(canvas);
|
|
||||||
const context = canvas.getContext("2d");
|
|
||||||
|
|
||||||
// 设置画笔样式
|
|
||||||
context.lineWidth = 1;
|
|
||||||
context.strokeStyle = "red";
|
|
||||||
context.fillStyle = "red";
|
|
||||||
|
|
||||||
// 开始绘制路径
|
|
||||||
context.beginPath();
|
|
||||||
context.moveTo(coordinates[0].x, coordinates[0].y);
|
|
||||||
|
|
||||||
for (let i = 1; i < coordinates.length; i++) {
|
|
||||||
context.lineTo(coordinates[i].x, coordinates[i].y);
|
|
||||||
}
|
|
||||||
// 完成路径绘制
|
|
||||||
context.stroke();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
scrollToBottom: function (dom, duration, timeout) {
|
scrollToBottom: function (dom, duration, timeout) {
|
||||||
let start = dom.scrollTop;
|
let start = dom.scrollTop;
|
||||||
let end = dom.scrollHeight - dom.clientHeight;
|
let end = dom.scrollHeight - dom.clientHeight;
|
||||||
|
1014
svr/res/js/draw.js
Normal file
2467
svr/res/js/index.js
628
svr/res/js/language.js
Normal file
@@ -0,0 +1,628 @@
|
|||||||
|
// --------------------------- //
|
||||||
|
// -- lang.js -- //
|
||||||
|
// -- version : 1.0.0 -- //
|
||||||
|
// -- date : 2023-06-22 -- //
|
||||||
|
// --------------------------- //
|
||||||
|
|
||||||
|
//以内容val输出 key:value形式输出数据,并且注意key不能和之前存在重复, 并且key的长度控制在四个单词以内, val=请输入密码房间密码, key=英文翻译简称, value=英文翻译详情
|
||||||
|
|
||||||
|
const local_lang = {
|
||||||
|
"en": {
|
||||||
|
"add_ice_candidate_failed": "AddIceCandidate failed",
|
||||||
|
"add_ice_candidate_success": "AddIceCandidateSuccess success",
|
||||||
|
"ai_answering": "AI is answering your question, please ask again later",
|
||||||
|
"ai_chat": "Artificial intelligence dialogue",
|
||||||
|
"ai_chat_record": "AI chat record",
|
||||||
|
"ai_reply": "AI reply",
|
||||||
|
"ai_reply_you": "AI replied to you, let's chat~",
|
||||||
|
"ai_setting": "AI setting",
|
||||||
|
"ai_switch": "AI intelligent understanding of context switch",
|
||||||
|
"ai_thinking": "AI is thinking...",
|
||||||
|
"answer_failed": "Answer failed",
|
||||||
|
"basic_data_get": "Basic data acquisition",
|
||||||
|
"basic_data_get_done": "Basic data acquisition completed",
|
||||||
|
"blog": "Blog",
|
||||||
|
"chat_channel": "Chat channel",
|
||||||
|
"chat_comm": "Chat",
|
||||||
|
"chat_gpt": "ChatGPT",
|
||||||
|
"clear_log": "Clear log",
|
||||||
|
"click_choose_file": "Click to select a file, or drag the file here to support multi-file drag and drop sending. After re-selecting the file, the previously selected file will be overwritten",
|
||||||
|
"click_download": "Click me to download",
|
||||||
|
"click_to_stop_live": "Start live, click the button again to end the live",
|
||||||
|
"click_to_stop_recording": "Start recording, click to stop recording again",
|
||||||
|
"click_to_stop_sharing": "Start screen sharing, click the button again to stop sharing",
|
||||||
|
"click_to_stop_video": "Start audio and video calls, click the button again to hang up",
|
||||||
|
"collapse_live": "Collapse live panel",
|
||||||
|
"collapse_log": "Collapse log panel",
|
||||||
|
"collapse_receive_file": "Collapse receive file panel",
|
||||||
|
"collapse_screen_sharing": "Collapse screen sharing panel",
|
||||||
|
"collapse_selected_file": "Collapse selected file panel",
|
||||||
|
"collapse_send_file_record": "Collapse send file record panel",
|
||||||
|
"collapse_temporary": "Collapse the temporary file panel",
|
||||||
|
"collapse_video": "Collapse video panel",
|
||||||
|
"collapse_wait_send_file": "Collapse wait send file panel",
|
||||||
|
"common_event_init": "Common event initialization",
|
||||||
|
"common_event_init_done": "Common event initialization completed",
|
||||||
|
"communication_rational": "Civilized speech, rational communication",
|
||||||
|
"confirm": "Confirm",
|
||||||
|
"connection_closed": "Connection closed",
|
||||||
|
"connection_disconnected": "Connection disconnected",
|
||||||
|
"content_max_1000": "The content is too long, it cannot exceed 1000 characters",
|
||||||
|
"content_max_10000": "The text content is too long, the length is up to 10000 words",
|
||||||
|
"copy_room_link": "Copy room link successfully",
|
||||||
|
"create_join_room": "Create/join room",
|
||||||
|
"cur_selected_file": "Current selected file list",
|
||||||
|
"current_network": "The current network status is",
|
||||||
|
"current_number": "Current number",
|
||||||
|
"current_relay_status": "Current relay service status",
|
||||||
|
"custom_data_receive_channel_closed": "The custom data receive channel is closed",
|
||||||
|
"custom_data_receive_channel_ready": "The custom data receive channel is ready",
|
||||||
|
"debug_init": "Debug initialization",
|
||||||
|
"debug_init_done": "Debug initialization completed",
|
||||||
|
"demo_site": "This website is a demo site, only provides availability demonstration, duration 15 seconds, automatic end of demonstration, if you need to use please deploy it yourself",
|
||||||
|
"disclaimer": "Disclaimer",
|
||||||
|
"donate": "Donate",
|
||||||
|
"download": "Download",
|
||||||
|
"end_live": "End live",
|
||||||
|
"end_local_screen_recording": "End local screen recording",
|
||||||
|
"end_screen_sharing": "End screen sharing",
|
||||||
|
"end_video_call": "End video call",
|
||||||
|
"enter_password_room": "Enter the password room, room number",
|
||||||
|
"enter_send": "ctrl+enter New line | Enter to send",
|
||||||
|
"establish_connection": "Establish connection",
|
||||||
|
"event_init": "Event initialization",
|
||||||
|
"event_init_done": "Event initialization completed",
|
||||||
|
"expires_one_day" : "Expires after one day",
|
||||||
|
"exit_room": "Exit room",
|
||||||
|
"expand_live": "Expand live panel",
|
||||||
|
"expand_log": "Expand log panel",
|
||||||
|
"expand_receive_file": "Expand receive file panel",
|
||||||
|
"expand_screen_sharing": "Expand screen sharing panel",
|
||||||
|
"expand_selected_file": "Expand selected file panel",
|
||||||
|
"expand_send_file_record": "Expand send file record panel",
|
||||||
|
"expand_temporary": "Expand the temporary file panel",
|
||||||
|
"expand_video": "Expand video panel",
|
||||||
|
"expand_wait_send_file": "Expand wait send file panel",
|
||||||
|
"failed_find_file": "Failed, file resource does not exist",
|
||||||
|
"feature_close": "The current function has been temporarily closed. If you have any questions, you can add a group to communicate",
|
||||||
|
"feedback": "Feedback",
|
||||||
|
"file_box": "File box",
|
||||||
|
"file_from": "File from",
|
||||||
|
"file_not_exist": "File read failed, file resource does not exist",
|
||||||
|
"file_receive": "Receive file",
|
||||||
|
"file_receive_channel_closed": "The file receive channel is closed",
|
||||||
|
"file_receive_channel_ready": "The file receive channel is ready",
|
||||||
|
"file_room": "File room",
|
||||||
|
"file_select_init": "File select initialization",
|
||||||
|
"file_select_init_done": "File select initialization completed",
|
||||||
|
"file_send_channel_buffer_full": "The file send channel buffer is full, waiting...",
|
||||||
|
"file_send_channel_buffer_recover": "The file send channel buffer has been restored, continue to send",
|
||||||
|
"file_send_channel_not_establish": "When sending a file, the file sending channel is not established",
|
||||||
|
"file_send_done": "File send done",
|
||||||
|
"file_send_record": "File sending record",
|
||||||
|
"generate_send_file_record": "Generate send file record",
|
||||||
|
"get_device_failed": "Failed to get device recording permission",
|
||||||
|
"get_pickup_file": "Get files through pickup code",
|
||||||
|
"give_coffee": "Buy me a coffee",
|
||||||
|
"home": "Official website homepage",
|
||||||
|
"history_msg" : " History messages",
|
||||||
|
"i_said_to_ai": "I said to AI",
|
||||||
|
"illegal_event": "Illegal trigger event",
|
||||||
|
"in_living": "Currently live, please try again after exiting",
|
||||||
|
"in_sharing_screen": "Currently sharing the screen, please try again after exiting",
|
||||||
|
"in_videoing": "Currently in a video call, please try again after exiting",
|
||||||
|
"init_language_done": "Initialize the language version",
|
||||||
|
"input_room_num": "Input room number",
|
||||||
|
"is_pickup_code": "Whether to pick up the pickup code",
|
||||||
|
"is_screen_recording": "Whether to perform local screen recording",
|
||||||
|
"join_room": "Join room",
|
||||||
|
"language_select_init": "Language select initialization",
|
||||||
|
"language_select_init_done": "Language select initialization completed",
|
||||||
|
"live_done": "The live broadcast is over, the live broadcast time is ",
|
||||||
|
"living": "Living",
|
||||||
|
"log": "Execution log",
|
||||||
|
"max_previewed": "The maximum can only be previewed",
|
||||||
|
"max_saved": "The maximum can only be temporarily stored",
|
||||||
|
"mb_file": "MB's file",
|
||||||
|
"message_box_init": "Message box initialization",
|
||||||
|
"message_box_init_done": "Message box initialization completed",
|
||||||
|
"mobile_data": "Mobile data",
|
||||||
|
"mobile_not_support_recording": "Mobile does not support screen recording for the time being",
|
||||||
|
"name": "Name",
|
||||||
|
"no_code_file": "This pickup code has no file record temporarily",
|
||||||
|
"no_device": "No camera or microphone detected",
|
||||||
|
"no_notice": "No announcement",
|
||||||
|
"no_received_file": "No files received temporarily",
|
||||||
|
"no_send_file": "No files have been sent temporarily",
|
||||||
|
"not_support": "Not support",
|
||||||
|
"note_website_for_learing": "Note: The sample site is for learning purposes only, please do not use it for other purposes",
|
||||||
|
"notice": "notice",
|
||||||
|
"off": "Off",
|
||||||
|
"offer_failed": "Offer failed",
|
||||||
|
"on": "On",
|
||||||
|
"online": "Current online number",
|
||||||
|
"online_number": "Online number",
|
||||||
|
"only_show_10_history_msg": "Only show 10 history messages",
|
||||||
|
"only_show" : "Only show ",
|
||||||
|
"op_log": "Operation log",
|
||||||
|
"open_ai_chat": "Open AI chat window",
|
||||||
|
"open_ai_switch": "The synchronization context switch has been turned on, and AI can better understand your questions, but it may also cause the answer to become unpredictable, and you can turn it off in the settings",
|
||||||
|
"open_donate": "Open donate window",
|
||||||
|
"open_private_chat": "Open private chat panel",
|
||||||
|
"open_public_chat_panel": "Open public chat panel",
|
||||||
|
"open_relay_setting": "Open relay setting window",
|
||||||
|
"open_room_chat_panel": "Open room chat panel",
|
||||||
|
"open_setting": "Open setting window",
|
||||||
|
"open_share_join_room": "Open share join room window",
|
||||||
|
"open_share_pickup_code": "Open the window to share the pickup code",
|
||||||
|
"other_language": "Other language",
|
||||||
|
"owner" : "Owner",
|
||||||
|
"p2p_check": "P2p check",
|
||||||
|
"p2p_check_principle": "P2p detection principle",
|
||||||
|
"p2p_check_principle_detail": "This project is based on webrtc, and webrtc's p2p is limited by the connection",
|
||||||
|
"p2p_check_principle_detail_10": "Please search for the keyword 'IP' in the execution log to see if there is a similar intranet format IP",
|
||||||
|
"p2p_check_principle_detail_2": "The network NAT type and browser restrictions of both parties",
|
||||||
|
"p2p_check_principle_detail_3": "Self-check steps",
|
||||||
|
"p2p_check_principle_detail_4": "Before verifying p2p,",
|
||||||
|
"p2p_check_principle_detail_5": "Please turn off the relay service switch first",
|
||||||
|
"p2p_check_principle_detail_6": ", Both parties enter the room, and then perform self-check",
|
||||||
|
"p2p_check_principle_detail_7": "After both parties join the room, if the client can obtain the intranet IP of both parties in the room, it is highly probable that p2p transmission can be performed",
|
||||||
|
"p2p_check_principle_detail_8": "If it is chrome PC version, you can open",
|
||||||
|
"p2p_check_principle_detail_9": "Then search for the keyword 'mdns', turn on the switch and restart",
|
||||||
|
"password": "Password",
|
||||||
|
"password_room": "Password",
|
||||||
|
"password_too_long": "The password is too long",
|
||||||
|
"pickup_code": "Code",
|
||||||
|
"please_describe_your_feedback": "Please describe the problem you need to feedback",
|
||||||
|
"please_enter": "Please enter",
|
||||||
|
"please_enter_code": "Please enter the pickup code",
|
||||||
|
"please_enter_content": "Please enter text content",
|
||||||
|
"please_enter_live_room_num": "Please enter the live room number",
|
||||||
|
"please_enter_password": "Please enter the password room password",
|
||||||
|
"please_enter_right_code": "Please enter the correct pickup code",
|
||||||
|
"please_enter_room_num": "Please fill in the room number first",
|
||||||
|
"please_enter_screen_sharing_room_num": "Please enter the screen sharing room number",
|
||||||
|
"please_enter_video_call_room_num": "Please enter the audio and video call room number",
|
||||||
|
"please_exit_then_join_live": "Please exit the room first and then enter the live room",
|
||||||
|
"please_exit_then_join_password_room": "Please exit the room first and then enter the password room",
|
||||||
|
"please_exit_then_join_screen": "Please exit the room first and then initiate screen sharing",
|
||||||
|
"please_exit_then_join_video": "Please exit the room first and then initiate a video call",
|
||||||
|
"please_fill_content": "Please fill in the content first",
|
||||||
|
"please_join_then_chat": "Please join the room first and then speak",
|
||||||
|
"please_join_then_chat_with_ai": "Please join the room first and then chat with AI",
|
||||||
|
"please_join_then_choose_file": "Please join the room first and then select the file",
|
||||||
|
"please_join_then_draw": "Please join the room first and then open the remote whiteboard",
|
||||||
|
"please_join_then_send": "Please join the room first and then send the content",
|
||||||
|
"preview": "Preview",
|
||||||
|
"preview_file": "Preview file",
|
||||||
|
"preview_not_supported": "This format file is not supported for preview",
|
||||||
|
"print_logo": "Print logo",
|
||||||
|
"private_chat": "Private chat",
|
||||||
|
"public_channel_send_done": "Public channel send successfully",
|
||||||
|
"public_chat_channel": "Public chat channel",
|
||||||
|
"public_chat_channel_someone_interact": "Someone interacted in the public chat channel, go and see",
|
||||||
|
"qq": "QQ communication group",
|
||||||
|
"query_log": "Keyword query log",
|
||||||
|
"read_file_error": "Read file error",
|
||||||
|
"read_file_interrupt": "Read file interrupt",
|
||||||
|
"receive_ack": "Receive ack, ready to send to",
|
||||||
|
"receive_answer_event": "Receive answer event",
|
||||||
|
"receive_candidate_event": "Receive candidate event",
|
||||||
|
"receive_create_room_event": "Receive create room event",
|
||||||
|
"receive_done": "Receive done",
|
||||||
|
"receive_file_list": "Received file list",
|
||||||
|
"receive_join_room_event": "Receive join room event",
|
||||||
|
"receive_offer_event": "Receive offer event",
|
||||||
|
"receive_temporary_link": "Receive temporary link",
|
||||||
|
"received": "Received",
|
||||||
|
"recording_done": "Recording completed, please check in the received file list",
|
||||||
|
"recording_incomplete": "Screen recording is complete! It is detected that the recording is incomplete. If you need to stop recording, please click the stop button on this page to stop recording",
|
||||||
|
"refresh_random_room_num_init": "Refresh random room number initialization",
|
||||||
|
"refresh_random_room_num_init_done": "Refresh random room number initialization completed",
|
||||||
|
"refresh_room": "Refresh room",
|
||||||
|
"relay_on": "The relay server is currently enabled, for more information, please go to settings to view",
|
||||||
|
"relay_on_and_more_info_in_setting": "The relay server is currently enabled, for more information, please go to settings to view",
|
||||||
|
"relay_server_current": "The relay server is currently",
|
||||||
|
"relay_server_current_detail": "Enabling the relay server can ensure that the data is transferred in a complex p2p network environment. If it is disabled, it will be forced to go through p2p (p2p detection can be performed in the settings), which may cause the transmission to fail!",
|
||||||
|
"relay_setting": "Relay setting",
|
||||||
|
"remote_draw": "Paint",
|
||||||
|
"room": "Room",
|
||||||
|
"room_least_two_can_send_content": "At least two people are required in the room to send content",
|
||||||
|
"room_least_two_can_send_file": "At least two people are required in the room to send files",
|
||||||
|
"room_num_no_number": "Room number is not allowed in number",
|
||||||
|
"room_num_no_special_symbols": "Room number is not allowed in special symbols",
|
||||||
|
"room_num_no_zh": "Room number is not allowed in Chinese",
|
||||||
|
"room_num_too_long": "The room number is too long",
|
||||||
|
"save": "Temporarily save",
|
||||||
|
"save_fail": "Temporarily saved failed",
|
||||||
|
"save_failed": "Temporarily save failed",
|
||||||
|
"save_ok": "Temporarily saved successfully",
|
||||||
|
"saved": "Temporarily saved",
|
||||||
|
"saving": "Temporarily save",
|
||||||
|
"screen_recording": "Record",
|
||||||
|
"screen_sharing": "Screen",
|
||||||
|
"second": "second",
|
||||||
|
"select_wait_send_record": "Select wait send record...",
|
||||||
|
"selected_file": "Selected file",
|
||||||
|
"selected_file_exist": "The selected file already exists with the same file and will not be added again",
|
||||||
|
"self": "Myself",
|
||||||
|
"send": "Send",
|
||||||
|
"send_all": "Send all",
|
||||||
|
"send_alone": "Send alone",
|
||||||
|
"send_bug_info_ok": "The feedback was successful, and more questions can be added to the group to communicate, which will solve your problem faster",
|
||||||
|
"send_cancel": "Send canceled",
|
||||||
|
"send_chat": "Chat",
|
||||||
|
"send_file": "Send file",
|
||||||
|
"send_file_record_exist": "The same file record already exists and will not be added again",
|
||||||
|
"send_text": "Send text",
|
||||||
|
"send_to": "Send to",
|
||||||
|
"send_to_user_separately": "Send to user separately",
|
||||||
|
"sending": "Sending",
|
||||||
|
"sending_history": "File sending history",
|
||||||
|
"sending_to": "Sending to",
|
||||||
|
"sent": "Sent",
|
||||||
|
"setting": "Setting",
|
||||||
|
"share_init": "Share initialization",
|
||||||
|
"share_init_done": "Share initialization completed",
|
||||||
|
"share_join_room": "Share join room",
|
||||||
|
"share_join_room_done": "Share auto join room link copied",
|
||||||
|
"share_link": "Share room link",
|
||||||
|
"share_pickup_code": "Share pickup code",
|
||||||
|
"share_pickup_code_file": "Share pickup code file",
|
||||||
|
"sharing": "Sharing",
|
||||||
|
"sharing_done": "Screen sharing is over, this sharing time is ",
|
||||||
|
"size": "Size",
|
||||||
|
"slider_init": "Slider initialization",
|
||||||
|
"slider_init_done": "Slider initialization completed",
|
||||||
|
"socket_init": "Socket initialization",
|
||||||
|
"socket_init_done": "Socket initialization completed",
|
||||||
|
"start_live": "Live",
|
||||||
|
"start_local_screen_recording": "Start local screen recording",
|
||||||
|
"start_screen_sharing": "Start screen sharing",
|
||||||
|
"start_video_call": "Start video call",
|
||||||
|
"stream_room": "Stream room",
|
||||||
|
"support": "Support",
|
||||||
|
"sys_log": "System log",
|
||||||
|
"temporary_link_empty": "Temporary link empty",
|
||||||
|
"text_decode_failed": "Text decode failed",
|
||||||
|
"text_send_done": "Text content sent",
|
||||||
|
"time": "Time",
|
||||||
|
"timer": "Timer",
|
||||||
|
"total": "Total",
|
||||||
|
"total_pickup_file": "Total received temporary files",
|
||||||
|
"try_open_ai_switch": "You can try to turn on the synchronization context switch in the settings to help AI better understand your questions coherently",
|
||||||
|
"type": "Type",
|
||||||
|
"unknown_type": "Unknown type",
|
||||||
|
"user": "User",
|
||||||
|
"video_call": "Video",
|
||||||
|
"video_done": "Audio and video calls are over, this call time is ",
|
||||||
|
"videoing": "Videoing",
|
||||||
|
"view_pickup_code": "View pickup code",
|
||||||
|
"wait": "Waiting",
|
||||||
|
"wait_ack": "Waiting for ack...",
|
||||||
|
"wait_sending": "Pending",
|
||||||
|
"web_screen_recording": "Web screen recording",
|
||||||
|
"webrtc_check": "Webrtc check",
|
||||||
|
"website_agreement_statement": "Demo website/open source project agreement statement",
|
||||||
|
"will_send": "Will send",
|
||||||
|
"window_event_init": "Window event initialization",
|
||||||
|
"window_event_init_done": "Window event initialization completed",
|
||||||
|
"you_enter_file_room": "You entered the file room",
|
||||||
|
"you_enter_password_room": "You entered the password room",
|
||||||
|
"you_enter_stream_room": "You entered the stream room",
|
||||||
|
"you_join_room": "You joined the room number through sharing",
|
||||||
|
"you_refresh_room": "You refreshed the room number, the current room number is",
|
||||||
|
"your_browser": "Your browser",
|
||||||
|
"your_ip_list": "Your IP list is",
|
||||||
|
},
|
||||||
|
"zh": {
|
||||||
|
"add_ice_candidate_failed": "addIceCandidate失败",
|
||||||
|
"add_ice_candidate_success": "addIceCandidateSuccess成功",
|
||||||
|
"ai_answering": "AI正在回答您的问题,请稍后再问",
|
||||||
|
"ai_chat": "AI智能对话",
|
||||||
|
"ai_chat_record": "AI聊天记录",
|
||||||
|
"ai_reply": "AI回复",
|
||||||
|
"ai_reply_you": "AI回复了你,快点聊起来吧~",
|
||||||
|
"ai_setting": "智能理解",
|
||||||
|
"ai_switch": "AI智能理解上下文开关",
|
||||||
|
"ai_thinking": "AI思考中",
|
||||||
|
"answer_failed": "answer失败",
|
||||||
|
"basic_data_get": "基础数据 获取中",
|
||||||
|
"basic_data_get_done": "基础数据 获取完成",
|
||||||
|
"blog": "博客",
|
||||||
|
"chat_channel": "聊天频道",
|
||||||
|
"chat_comm": "公共聊天",
|
||||||
|
"chat_gpt": "ChatGPT",
|
||||||
|
"clear_log": "清空日志",
|
||||||
|
"click_choose_file": "点击选择文件,或将文件拖到此处支持多文件拖放发送。重新选择文件后,之前选择的文件将被覆盖",
|
||||||
|
"click_download": "点击下载",
|
||||||
|
"click_to_stop_live": "开始直播,再次点击按钮结束直播",
|
||||||
|
"click_to_stop_recording": "开始录制,再次点击停止录制",
|
||||||
|
"click_to_stop_sharing": "开始屏幕共享,再次点击按钮停止共享",
|
||||||
|
"click_to_stop_video": "开始音视频通话,再次点击按钮挂断通话",
|
||||||
|
"collapse_live": "收起直播面板",
|
||||||
|
"collapse_log": "收起日志面板",
|
||||||
|
"collapse_receive_file": "收起已接收文件面板",
|
||||||
|
"collapse_screen_sharing": "收起屏幕共享面板",
|
||||||
|
"collapse_selected_file": "收起已选文件面板",
|
||||||
|
"collapse_send_file_record": "收起发送文件记录面板",
|
||||||
|
"collapse_temporary": "折叠临时文件面板",
|
||||||
|
"collapse_video": "收起音视频面板",
|
||||||
|
"collapse_wait_send_file": "收起待发送文件面板",
|
||||||
|
"common_event_init": "公共事件监听 初始化中",
|
||||||
|
"common_event_init_done": "公共事件监听 初始化完成",
|
||||||
|
"communication_rational": "文明发言,理性交流",
|
||||||
|
"confirm": "确定",
|
||||||
|
"connection_closed": "连接关闭",
|
||||||
|
"connection_disconnected": "连接断开",
|
||||||
|
"content_max_1000": "内容过长,不能超过1000个字符",
|
||||||
|
"content_max_10000": "文本内容过长,长度最多为10000字",
|
||||||
|
"copy_room_link": "房间链接已成功复制",
|
||||||
|
"create_join_room": "创建/加入房间",
|
||||||
|
"cur_selected_file": "当前选择的文件列表",
|
||||||
|
"current_network": "当前网络状态为",
|
||||||
|
"current_number": "当前人数",
|
||||||
|
"current_relay_status": "当前中继服务状态",
|
||||||
|
"custom_data_receive_channel_closed": "自定义数据接收管道已关闭",
|
||||||
|
"custom_data_receive_channel_ready": "自定义数据接收管道已就绪",
|
||||||
|
"debug_init": "DEBUG组件 初始化中",
|
||||||
|
"debug_init_done": "DEBUG组件 初始化完成",
|
||||||
|
"demo_site": "本网站为演示站点,仅提供可用性演示,时长15秒,自动结束演示,如需使用请自行部署使用",
|
||||||
|
"disclaimer": "免责声明",
|
||||||
|
"donate": "捐赠",
|
||||||
|
"download": "下载",
|
||||||
|
"end_live": "结束直播",
|
||||||
|
"end_local_screen_recording": "结束本地屏幕录制",
|
||||||
|
"end_screen_sharing": "结束远程屏幕共享",
|
||||||
|
"end_video_call": "结束音视频通话",
|
||||||
|
"enter_password_room": "进入密码房间,房间号",
|
||||||
|
"enter_send": "ctrl+enter 换行 | Enter 发送",
|
||||||
|
"establish_connection": "建立连接",
|
||||||
|
"event_init": "事件监听组件 初始化中",
|
||||||
|
"event_init_done": "事件监听组件 初始化完成",
|
||||||
|
"expires_one_day" : "一天后过期",
|
||||||
|
"exit_room": "退出房间",
|
||||||
|
"expand_live": "展开直播面板",
|
||||||
|
"expand_log": "展开日志面板",
|
||||||
|
"expand_receive_file": "展开已接收文件面板",
|
||||||
|
"expand_screen_sharing": "展开屏幕共享面板",
|
||||||
|
"expand_selected_file": "展开已选文件面板",
|
||||||
|
"expand_send_file_record": "展开发送文件记录面板",
|
||||||
|
"expand_temporary": "展开临时文件面板",
|
||||||
|
"expand_video": "展开音视频面板",
|
||||||
|
"expand_wait_send_file": "展开待发送文件面板",
|
||||||
|
"failed_find_file": "失败,文件资源不存在",
|
||||||
|
"feature_close": "当前功能暂时关闭。如果您有任何问题,可以加入群组进行交流",
|
||||||
|
"feedback": "反馈问题",
|
||||||
|
"file_box": "文件箱",
|
||||||
|
"file_from": "文件来自",
|
||||||
|
"file_not_exist": "文件读取失败,文件资源不存在",
|
||||||
|
"file_receive": "接收文件",
|
||||||
|
"file_receive_channel_closed": "文件接收管道已关闭",
|
||||||
|
"file_receive_channel_ready": "文件接收管道已就绪",
|
||||||
|
"file_room": "文件房间",
|
||||||
|
"file_select_init": "文件选择组件 初始化中",
|
||||||
|
"file_select_init_done": "文件选择组件 初始化完成",
|
||||||
|
"file_send_channel_buffer_full": "文件发送管道缓冲区已满,等待中",
|
||||||
|
"file_send_channel_buffer_recover": "文件发送管道缓冲区已恢复,继续发送中",
|
||||||
|
"file_send_channel_not_establish": "发送文件时,文件发送管道未建立",
|
||||||
|
"file_send_done": "文件全部发送完毕",
|
||||||
|
"file_send_record": "文件发送记录",
|
||||||
|
"generate_send_file_record": "生成文件发送记录",
|
||||||
|
"get_device_failed": "获取设备录制权限失败",
|
||||||
|
"get_pickup_file": "通过取件码获取文件",
|
||||||
|
"give_coffee": "赞助一杯咖啡",
|
||||||
|
"history_msg" : " 条历史消息",
|
||||||
|
"home": "官网首页",
|
||||||
|
"i_said_to_ai": "我对AI说",
|
||||||
|
"illegal_event": "非法触发事件",
|
||||||
|
"in_living": "正在直播中,请退出后再试",
|
||||||
|
"in_sharing_screen": "正在共享屏幕,请退出后再试",
|
||||||
|
"in_videoing": "正在视频通话中,请退出后再试",
|
||||||
|
"init_language_done": "初始化语言版本完成",
|
||||||
|
"input_room_num": "输入房间编号",
|
||||||
|
"is_pickup_code": "是否取件码取件",
|
||||||
|
"is_screen_recording": "是否进行本地屏幕录制",
|
||||||
|
"join_room": "加入房间",
|
||||||
|
"language_select_init": "语言选择初始化",
|
||||||
|
"language_select_init_done": "语言选择初始化完成",
|
||||||
|
"live_done": "直播已结束,直播时间为",
|
||||||
|
"living": "直播中",
|
||||||
|
"log": "执行日志",
|
||||||
|
"max_previewed": "最多只能预览",
|
||||||
|
"max_saved": "最多只能临时存储",
|
||||||
|
"mb_file": "MB的文件",
|
||||||
|
"message_box_init": "消息弹窗 初始化中",
|
||||||
|
"message_box_init_done": "消息弹窗 初始化完成",
|
||||||
|
"mobile_data": "移动数据",
|
||||||
|
"mobile_not_support_recording": "移动设备暂不支持屏幕录制",
|
||||||
|
"name": "名称",
|
||||||
|
"no_code_file": "此取件码暂无文件记录",
|
||||||
|
"no_device": "未检测到摄像头或麦克风",
|
||||||
|
"no_notice": "暂无公告",
|
||||||
|
"no_received_file": "暂时未收到文件",
|
||||||
|
"no_send_file": "暂时没有发送过文件",
|
||||||
|
"not_support": "不支持",
|
||||||
|
"note_website_for_learing": "注意:示例网站仅用于学习演示,请勿他用",
|
||||||
|
"notice": "通知",
|
||||||
|
"off": "已关闭",
|
||||||
|
"offer_failed": "offer失败",
|
||||||
|
"on": "已开启",
|
||||||
|
"online": "当前在线人数",
|
||||||
|
"online_number": "人在线",
|
||||||
|
"only_show" : "仅展示 ",
|
||||||
|
"only_show_10_history_msg": "仅展示10条历史消息",
|
||||||
|
"op_log": "操作日志",
|
||||||
|
"open_ai_chat": "打开AI聊天窗口",
|
||||||
|
"open_ai_switch": "已开启同步上下文开关,AI可以更好地理解您的问题,但也可能导致答案变得不可预测,您可以在设置中关闭",
|
||||||
|
"open_donate": "打开赞助窗口",
|
||||||
|
"open_private_chat": "打开私聊面板",
|
||||||
|
"open_public_chat_panel": "打开公共聊天面板",
|
||||||
|
"open_relay_setting": "打开中继设置窗口",
|
||||||
|
"open_room_chat_panel": "打开房间聊天面板",
|
||||||
|
"open_setting": "打开设置窗口",
|
||||||
|
"open_share_join_room": "打开分享房间窗口",
|
||||||
|
"open_share_pickup_code": "打开分享取件码窗口",
|
||||||
|
"other_language": "其他语言",
|
||||||
|
"owner" : "房主",
|
||||||
|
"p2p_check": "P2p检测",
|
||||||
|
"p2p_check_principle": "p2p检测原理",
|
||||||
|
"p2p_check_principle_detail": "本项目是基于webrtc实现的,webrtc的p2p受限于连接",
|
||||||
|
"p2p_check_principle_detail_10": "具体是否有获取到双方内网IP,请自行在执行日志中搜索关键字 “IP”,查看是否有类似内网格式的IP即可",
|
||||||
|
"p2p_check_principle_detail_2": "双方的网络NAT类型和浏览器限制",
|
||||||
|
"p2p_check_principle_detail_3": "自检步骤",
|
||||||
|
"p2p_check_principle_detail_4": "在验证p2p之前,",
|
||||||
|
"p2p_check_principle_detail_5": "请先关闭中继服务开关后",
|
||||||
|
"p2p_check_principle_detail_6": ",双方进入后房间,再进行自检",
|
||||||
|
"p2p_check_principle_detail_7": "双方加入房间后,如果客户端可以获取到房间内双方的内网IP,大概率就可以进行p2p传输",
|
||||||
|
"p2p_check_principle_detail_8": "如果是chrome电脑版,可以打开",
|
||||||
|
"p2p_check_principle_detail_9": "然后搜索 'mdns' 关键字,打开开关后重启即可",
|
||||||
|
"password": "密码",
|
||||||
|
"password_room": "密码房间",
|
||||||
|
"password_too_long": "密码过长",
|
||||||
|
"pickup_code": "取件号码",
|
||||||
|
"please_describe_your_feedback": "请描述您需要反馈的问题",
|
||||||
|
"please_enter": "请输入",
|
||||||
|
"please_enter_code": "请输入取件码",
|
||||||
|
"please_enter_content": "请输入文本内容",
|
||||||
|
"please_enter_live_room_num": "请输入直播房间号",
|
||||||
|
"please_enter_password": "请输入密码房间密码",
|
||||||
|
"please_enter_right_code": "请输入正确的取件码",
|
||||||
|
"please_enter_room_num": "请先填写房间号",
|
||||||
|
"please_enter_screen_sharing_room_num": "请输入屏幕共享房间号",
|
||||||
|
"please_enter_video_call_room_num": "请输入音视频通话房间号",
|
||||||
|
"please_exit_then_join_live": "请先退出房间,然后进入直播间",
|
||||||
|
"please_exit_then_join_password_room": "请先退出房间,然后进入密码房间",
|
||||||
|
"please_exit_then_join_screen": "请先退出房间,然后发起屏幕共享",
|
||||||
|
"please_exit_then_join_video": "请先退出房间,然后发起视频通话",
|
||||||
|
"please_fill_content": "请先填写内容",
|
||||||
|
"please_join_then_chat": "请先加入房间,然后发言",
|
||||||
|
"please_join_then_chat_with_ai": "请先加入房间,然后与AI聊天",
|
||||||
|
"please_join_then_choose_file": "请先加入房间,然后选择文件",
|
||||||
|
"please_join_then_draw": "请先加入房间,然后打开远程白板",
|
||||||
|
"please_join_then_send": "请先加入房间,然后发送内容",
|
||||||
|
"preview": "预览",
|
||||||
|
"preview_file": "预览文件",
|
||||||
|
"preview_not_supported": "不支持此格式文件的预览",
|
||||||
|
"print_logo": "打印logo",
|
||||||
|
"private_chat": "私聊",
|
||||||
|
"public_channel_send_done": "公共频道发言成功",
|
||||||
|
"public_chat_channel": "公共聊天频道",
|
||||||
|
"public_chat_channel_someone_interact": "公共聊天频道有人互动啦,快去瞧瞧",
|
||||||
|
"qq": "QQ交流群",
|
||||||
|
"query_log": "关键词查询日志",
|
||||||
|
"read_file_error": "读取文件错误",
|
||||||
|
"read_file_interrupt": "读取文件中断",
|
||||||
|
"receive_ack": "收到ack回执,准备发送给",
|
||||||
|
"receive_answer_event": "收到answer事件",
|
||||||
|
"receive_candidate_event": "收到candidate事件",
|
||||||
|
"receive_create_room_event": "收到创建房间事件",
|
||||||
|
"receive_done": "接收完毕",
|
||||||
|
"receive_file_list": "接收文件列表",
|
||||||
|
"receive_join_room_event": "收到加入房间事件",
|
||||||
|
"receive_offer_event": "收到offer事件",
|
||||||
|
"receive_temporary_link": "收到暂存链接",
|
||||||
|
"received": "已接收",
|
||||||
|
"recording_done": "录制完成,请在接收文件列表中查看",
|
||||||
|
"recording_incomplete": "屏幕录制已完成!检测到录制不完整,如需停止录制,请点击本页面上的停止按钮停止录制",
|
||||||
|
"refresh_random_room_num_init": "刷新随机房间号 初始化中",
|
||||||
|
"refresh_random_room_num_init_done": "刷新随机房间号初始化完成",
|
||||||
|
"refresh_room": "刷新房间",
|
||||||
|
"relay_on": "当前已启用中继服务器,有关更多信息,请前往设置查看",
|
||||||
|
"relay_on_and_more_info_in_setting": "当前已启用中继服务器,有关更多信息,请前往设置查看",
|
||||||
|
"relay_server_current": "中继服务器当前已",
|
||||||
|
"relay_server_current_detail": "启用中继服务器可以保证在复杂的p2p网络环境下,提供保底的数据中转传输,如果禁用,则是强制走p2p(可在设置中进行p2p检测),可能会出现发送失败!",
|
||||||
|
"relay_setting": "中继设置",
|
||||||
|
"remote_draw": "远程画笔",
|
||||||
|
"room": "房间",
|
||||||
|
"room_least_two_can_send_content": "房间内至少需要两人才能发送内容",
|
||||||
|
"room_least_two_can_send_file": "房间内至少需要两人才能发送文件",
|
||||||
|
"room_num_no_number": "房间号不允许包含数字",
|
||||||
|
"room_num_no_special_symbols": "房间号不允许包含特殊符号",
|
||||||
|
"room_num_no_zh": "房间号不允许包含中文",
|
||||||
|
"room_num_too_long": "房间号过长",
|
||||||
|
"save": "暂存",
|
||||||
|
"save_fail": "临时保存失败",
|
||||||
|
"save_failed": "暂存失败",
|
||||||
|
"save_ok": "临时保存成功",
|
||||||
|
"saved": "已暂存",
|
||||||
|
"saving": "暂存中",
|
||||||
|
"screen_recording": "屏幕录制",
|
||||||
|
"screen_sharing": "屏幕共享",
|
||||||
|
"second": "秒",
|
||||||
|
"select_wait_send_record": "选择待发送记录中",
|
||||||
|
"selected_file": "已选择文件",
|
||||||
|
"selected_file_exist": "选择的文件已经存在相同的文件,不再重复添加",
|
||||||
|
"self": "我自己",
|
||||||
|
"send": "发送",
|
||||||
|
"send_all": "一键发送",
|
||||||
|
"send_alone": "单独发送",
|
||||||
|
"send_bug_info_ok": "反馈成功,更多问题可添加群组进行交流,将更快地解决您的问题",
|
||||||
|
"send_cancel": "发送已取消",
|
||||||
|
"send_chat": "发言",
|
||||||
|
"send_file": "发送文件",
|
||||||
|
"send_file_record_exist": "已经存在相同的文件记录,不再重复添加",
|
||||||
|
"send_text": "发送文本",
|
||||||
|
"send_to": "发送至",
|
||||||
|
"send_to_user_separately": "分别发送给用户",
|
||||||
|
"sending": "发送中",
|
||||||
|
"sending_history": "文件发送历史",
|
||||||
|
"sending_to": "正在发送给",
|
||||||
|
"sent": "已发送",
|
||||||
|
"setting": "设置",
|
||||||
|
"share_init": "分享组件 初始化中",
|
||||||
|
"share_init_done": "分享组件 初始化完成",
|
||||||
|
"share_join_room": "分享加入房间",
|
||||||
|
"share_join_room_done": "分享自动加入房间链接已复制",
|
||||||
|
"share_link": "分享房间链接",
|
||||||
|
"share_pickup_code": "分享取件码",
|
||||||
|
"share_pickup_code_file": "分享取件码文件",
|
||||||
|
"sharing": "共享中",
|
||||||
|
"sharing_done": "屏幕共享已结束,本次共享时间为",
|
||||||
|
"size": "大小",
|
||||||
|
"slider_init": "滑动组件 初始化中",
|
||||||
|
"slider_init_done": "滑动组件 初始化完成",
|
||||||
|
"socket_init": "SOCKET监听 初始化中",
|
||||||
|
"socket_init_done": "SOCKET监听 初始化完成",
|
||||||
|
"start_live": "开始直播",
|
||||||
|
"start_local_screen_recording": "开始本地屏幕录制",
|
||||||
|
"start_screen_sharing": "开始远程屏幕共享",
|
||||||
|
"start_video_call": "开始音视频通话",
|
||||||
|
"stream_room": "流媒体房间",
|
||||||
|
"support": "支持",
|
||||||
|
"sys_log": "系统日志",
|
||||||
|
"temporary_link_empty": "文件暂存失败, 上传链接为空",
|
||||||
|
"text_decode_failed": "文本内容解码失败",
|
||||||
|
"text_send_done": "文本内容已发送",
|
||||||
|
"time": "时间",
|
||||||
|
"timer": "计时器",
|
||||||
|
"total": "总计",
|
||||||
|
"total_pickup_file": "总计接收的暂存文件",
|
||||||
|
"try_open_ai_switch": "您可以尝试在设置中打开同步上下文开关,帮助AI更好地理解您的问题的连贯性",
|
||||||
|
"type": "类型",
|
||||||
|
"unknown_type": "未知类型",
|
||||||
|
"user": "用户",
|
||||||
|
"video_call": "视频通话",
|
||||||
|
"video_done": "音视频通话已结束,本次通话时间为",
|
||||||
|
"videoing": "视频中",
|
||||||
|
"view_pickup_code": "查看取件码",
|
||||||
|
"wait": "等待中",
|
||||||
|
"wait_ack": "等待ack回执中",
|
||||||
|
"wait_sending": "待发送",
|
||||||
|
"web_screen_recording": "网页录屏",
|
||||||
|
"webrtc_check": "Webrtc检测",
|
||||||
|
"website_agreement_statement": "演示网站/开源项目协议声明",
|
||||||
|
"will_send": "即将发送",
|
||||||
|
"window_event_init": "窗口事件监听 初始化中",
|
||||||
|
"window_event_init_done": "窗口事件监听 初始化完成",
|
||||||
|
"you_enter_file_room": "你进入了文件房间",
|
||||||
|
"you_enter_password_room": "你进入了密码房间",
|
||||||
|
"you_enter_stream_room": "你进入了流媒体房间",
|
||||||
|
"you_join_room": "你通过分享加入了房间号为",
|
||||||
|
"you_refresh_room": "你刷新了房间号, 当前房间号为",
|
||||||
|
"your_browser": "您的浏览器",
|
||||||
|
"your_ip_list": "你的IP列表为"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.local_lang = local_lang;
|
@@ -1,3 +1,9 @@
|
|||||||
|
// --------------------------- //
|
||||||
|
// -- liveShare.js -- //
|
||||||
|
// -- version : 1.0.0 -- //
|
||||||
|
// -- date : 2023-06-22 -- //
|
||||||
|
// --------------------------- //
|
||||||
|
|
||||||
var liveShare = new Vue({
|
var liveShare = new Vue({
|
||||||
el: '#liveShareApp',
|
el: '#liveShareApp',
|
||||||
data: function () {
|
data: function () {
|
||||||
@@ -106,9 +112,17 @@ var liveShare = new Vue({
|
|||||||
$("#liveShareIcon").css("color", "#fb0404")
|
$("#liveShareIcon").css("color", "#fb0404")
|
||||||
$("#liveShareTimes").css("color", "#fb0404")
|
$("#liveShareTimes").css("color", "#fb0404")
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
$("#liveShareIcon").css("color", "#ffffff")
|
$("#liveShareIcon").css("color", "#000000")
|
||||||
$("#liveShareTimes").css("color", "#ffffff")
|
$("#liveShareTimes").css("color", "#000000")
|
||||||
}, 500)
|
}, 500)
|
||||||
|
|
||||||
|
if(that.times >= 15){
|
||||||
|
that.stopLiveShare();
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.reload();
|
||||||
|
}, 1000);
|
||||||
|
return
|
||||||
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
if (window.layer) {
|
if (window.layer) {
|
||||||
|
@@ -1,14 +1,30 @@
|
|||||||
var screen = new Vue({
|
// --------------------------- //
|
||||||
|
// -- screen.js -- //
|
||||||
|
// -- version : 1.0.0 -- //
|
||||||
|
// -- date : 2023-06-22 -- //
|
||||||
|
// --------------------------- //
|
||||||
|
|
||||||
|
const screen = new Vue({
|
||||||
el: '#screenApp',
|
el: '#screenApp',
|
||||||
data: function () {
|
data: function () {
|
||||||
return {
|
return {
|
||||||
stream: null,
|
stream: null, //录制流
|
||||||
chunks: [],
|
chunks: [], //录制数据
|
||||||
mediaRecorder: null,
|
mediaRecorder: null, //录制对象
|
||||||
recording: null,
|
recording: null, //录制文件
|
||||||
times: 0,
|
times: 0, //录制时间
|
||||||
interverlId: 0,
|
interverlId: 0, //计时器id
|
||||||
size: 0,
|
size: 0, //录制文件大小
|
||||||
|
isScreen : false, //是否正在录制
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
isScreen: function (val, oldVal) {
|
||||||
|
if (val) {
|
||||||
|
$("#screenTimes").css("display", "contents");
|
||||||
|
} else {
|
||||||
|
$("#screenTimes").css("display", "none");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -26,6 +42,22 @@ var screen = new Vue({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
openLocalScreen : async function({
|
||||||
|
openCallback, closeCallback
|
||||||
|
}){
|
||||||
|
if(!this.isScreen){
|
||||||
|
layer.confirm("是否进行本地屏幕录制", (index) => {
|
||||||
|
this.startScreen();
|
||||||
|
this.isScreen = !this.isScreen;
|
||||||
|
openCallback && openCallback();
|
||||||
|
}, (index) => {
|
||||||
|
layer.close(index)
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
this.stopScreen(closeCallback ? closeCallback : ()=>{});
|
||||||
|
this.isScreen = !this.isScreen;
|
||||||
|
}
|
||||||
|
},
|
||||||
startScreen: async function () {
|
startScreen: async function () {
|
||||||
let that = this;
|
let that = this;
|
||||||
if (this.recording) {
|
if (this.recording) {
|
||||||
@@ -42,10 +74,8 @@ var screen = new Vue({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.stream == null) {
|
if (this.stream == null) {
|
||||||
if (window.layer) {
|
layer.msg("获取设备录制权限失败")
|
||||||
layer.msg("获取设备录制权限失败")
|
this.isScreen = false
|
||||||
}
|
|
||||||
window.Bus.$emit("changeScreenState", false)
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +91,11 @@ var screen = new Vue({
|
|||||||
//计算时间
|
//计算时间
|
||||||
this.interverlId = setInterval(() => {
|
this.interverlId = setInterval(() => {
|
||||||
that.times += 1;
|
that.times += 1;
|
||||||
window.Bus.$emit("changeScreenTimes", that.times)
|
if(that.times < 10){
|
||||||
|
$("#screenTimes").text("录制中: 0" + that.times + "秒")
|
||||||
|
}else{
|
||||||
|
$("#screenTimes").text("录制中: "+that.times + "秒")
|
||||||
|
}
|
||||||
$("#screenIcon").css("color","#fb0404")
|
$("#screenIcon").css("color","#fb0404")
|
||||||
$("#screenTimes").css("color","#fb0404")
|
$("#screenTimes").css("color","#fb0404")
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -80,9 +114,7 @@ var screen = new Vue({
|
|||||||
try {
|
try {
|
||||||
this.mediaRecorder.stop();
|
this.mediaRecorder.stop();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (window.layer) {
|
layer.msg("屏幕录制完毕! 检测到录制不完整,如需停止录制,请点击本页面的停止按钮来停止录制")
|
||||||
layer.msg("屏幕录制完毕! 检测到录制不完整,如需停止录制,请点击本页面的停止按钮来停止录制")
|
|
||||||
}
|
|
||||||
hasErr = true
|
hasErr = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,7 +141,7 @@ var screen = new Vue({
|
|||||||
|
|
||||||
callback(data)
|
callback(data)
|
||||||
|
|
||||||
if (window.layer && !hasErr) {
|
if (!hasErr) {
|
||||||
layer.msg("录制完成,请在接收文件列表查看")
|
layer.msg("录制完成,请在接收文件列表查看")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +153,6 @@ var screen = new Vue({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted: function () {
|
mounted: function () {
|
||||||
window.Bus.$on("startScreen", this.startScreen);
|
window.Bus.$on("openLocalScreen", this.openLocalScreen);
|
||||||
window.Bus.$on("stopScreen", this.stopScreen);
|
|
||||||
}
|
}
|
||||||
})
|
})
|
@@ -1,3 +1,10 @@
|
|||||||
|
// --------------------------- //
|
||||||
|
// -- screenShare.js -- //
|
||||||
|
// -- version : 1.0.0 -- //
|
||||||
|
// -- date : 2023-06-22 -- //
|
||||||
|
// --------------------------- //
|
||||||
|
|
||||||
|
|
||||||
var screenShare = new Vue({
|
var screenShare = new Vue({
|
||||||
el: '#screenShareApp',
|
el: '#screenShareApp',
|
||||||
data: function () {
|
data: function () {
|
||||||
@@ -75,9 +82,17 @@ var screenShare = new Vue({
|
|||||||
$("#screenShareIcon").css("color","#fb0404")
|
$("#screenShareIcon").css("color","#fb0404")
|
||||||
$("#screenShareTimes").css("color","#fb0404")
|
$("#screenShareTimes").css("color","#fb0404")
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
$("#screenShareIcon").css("color","#ffffff")
|
$("#screenShareIcon").css("color","#000000")
|
||||||
$("#screenShareTimes").css("color","#ffffff")
|
$("#screenShareTimes").css("color","#000000")
|
||||||
}, 500)
|
}, 500)
|
||||||
|
|
||||||
|
if(that.times >= 15){
|
||||||
|
that.stopScreenShare();
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.reload();
|
||||||
|
}, 1000);
|
||||||
|
return
|
||||||
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
if (window.layer) {
|
if (window.layer) {
|
||||||
|
@@ -1,3 +1,9 @@
|
|||||||
|
// --------------------------- //
|
||||||
|
// -- videoShare.js -- //
|
||||||
|
// -- version : 1.0.0 -- //
|
||||||
|
// -- date : 2023-06-22 -- //
|
||||||
|
// --------------------------- //
|
||||||
|
|
||||||
var videoShare = new Vue({
|
var videoShare = new Vue({
|
||||||
el: '#videoShareApp',
|
el: '#videoShareApp',
|
||||||
data: function () {
|
data: function () {
|
||||||
@@ -106,9 +112,17 @@ var videoShare = new Vue({
|
|||||||
$("#videoShareIcon").css("color", "#fb0404")
|
$("#videoShareIcon").css("color", "#fb0404")
|
||||||
$("#videoShareTimes").css("color", "#fb0404")
|
$("#videoShareTimes").css("color", "#fb0404")
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
$("#videoShareIcon").css("color", "#ffffff")
|
$("#videoShareIcon").css("color", "#000000")
|
||||||
$("#videoShareTimes").css("color", "#ffffff")
|
$("#videoShareTimes").css("color", "#000000")
|
||||||
}, 500)
|
}, 500)
|
||||||
|
|
||||||
|
if(that.times >= 15){
|
||||||
|
that.stopVideoShare();
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.reload();
|
||||||
|
}, 1000);
|
||||||
|
return
|
||||||
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
if (window.layer) {
|
if (window.layer) {
|
||||||
|
@@ -48,19 +48,19 @@
|
|||||||
<p>GitHub:<a href="https://github.com/iamtsm">https://github.com/iamtsm</a></p>
|
<p>GitHub:<a href="https://github.com/iamtsm">https://github.com/iamtsm</a></p>
|
||||||
|
|
||||||
<h2>项目定制服务</h2>
|
<h2>项目定制服务</h2>
|
||||||
|
|
||||||
<h3>1. 项目功能定制</h3>
|
<h3>1. 定制开发支持</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>服务内容:</strong>提供定制开发技术支持,可协助部署安装相关事项,或协助自行开发,细节问题答疑</li>
|
||||||
|
<li><strong>免费:</strong>非常乐意为各位使用的小伙伴提供帮助,大家觉得好用的同时可以点击start支持下</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2. 项目功能定制</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>服务内容:</strong>对项目进行功能定制或扩展</li>
|
<li><strong>服务内容:</strong>对项目进行功能定制或扩展</li>
|
||||||
<li><strong>价格:</strong>按功能大小,紧急程度,耗时,定制内容是否允许开源,等情况收费</li>
|
<li><strong>价格:</strong>按功能大小,紧急程度,耗时,定制内容是否允许开源,等情况收费</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3>2. 定制开发支持</h3>
|
|
||||||
<ul>
|
|
||||||
<li><strong>服务内容:</strong>提供定制开发技术支持,可协助部署安装相关事项,或协助自行开发,细节问题答疑</li>
|
|
||||||
<li><strong>价格:</strong>一杯咖啡</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2>收费模式</h2>
|
<h2>收费模式</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>按小时计费:</strong>根据实际工作时间计算费用,目前个人定制功能2小时起,每小时200~300,企业定制另谈</li>
|
<li><strong>按小时计费:</strong>根据实际工作时间计算费用,目前个人定制功能2小时起,每小时200~300,企业定制另谈</li>
|
||||||
|
@@ -79,6 +79,11 @@ async function getSettingPageHtml(data) {
|
|||||||
<input type="checkbox" name="openLiveShare" title="开启直播功能" lay-skin="primary">
|
<input type="checkbox" name="openLiveShare" title="开启直播功能" lay-skin="primary">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="checkbox" name="openRemoteDraw" title="开启远程画笔" lay-skin="primary">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="checkbox" name="openPasswordRoom" title="开启密码房间" lay-skin="primary">
|
<input type="checkbox" name="openPasswordRoom" title="开启密码房间" lay-skin="primary">
|
||||||
@@ -175,22 +180,29 @@ async function getSettingPageHtml(data) {
|
|||||||
<div class="layui-col-sm12">
|
<div class="layui-col-sm12">
|
||||||
<div class="layui-row layui-col-space15">
|
<div class="layui-row layui-col-space15">
|
||||||
<div class="layui-col-sm12">
|
<div class="layui-col-sm12">
|
||||||
<div class="room-recent-title">数据传输公告设置</div>
|
<div class="room-recent-title">其他设置</div>
|
||||||
<form class="layui-form notice-form" lay-filter="notice-form">
|
<form class="layui-form notice-form" lay-filter="notice-form">
|
||||||
<div class="layui-form-item" style="margin-top: 30px;">
|
<div class="layui-form-item" style="margin-top: 30px;">
|
||||||
<div class="layui-block">
|
<div class="layui-block">
|
||||||
<div class="layui-input-block" style="display: flex;margin-left: 0;">
|
<div class="layui-input-block" style="margin-left: 0;">
|
||||||
<input type="text" name="noticeMsg" placeholder="发布公告内容" autocomplete="off"
|
<div style="padding: 5px;">数据传输公告设置: </div>
|
||||||
class="layui-input">
|
<textarea name="noticeMsg" placeholder="发布公告内容" class="layui-textarea" style="height: 200px;border-radius: 8px;"></textarea>
|
||||||
<button type="button" lay-submit lay-filter="notice" class="layui-btn">发布</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="layui-form-item" style="margin-top: 30px;">
|
||||||
|
<div class="layui-block">
|
||||||
|
<div class="layui-input-block" style="margin-left: 0;">
|
||||||
|
<div style="padding: 5px;">公共聊天记录数量: </div>
|
||||||
|
<input type="number" name="chatingCommCount" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button style="margin-top: 10px;" type="button" lay-submit lay-filter="notice" class="layui-btn">更新其他设置</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -209,7 +221,8 @@ async function getSettingPageHtml(data) {
|
|||||||
noticeMsg = switchData.noticeMsgList[0].msg
|
noticeMsg = switchData.noticeMsgList[0].msg
|
||||||
}
|
}
|
||||||
form.val("notice-form",{
|
form.val("notice-form",{
|
||||||
noticeMsg : noticeMsg
|
noticeMsg : noticeMsg,
|
||||||
|
chatingCommCount : switchData.chatingCommCount
|
||||||
})
|
})
|
||||||
|
|
||||||
form.on('checkbox()', function(data){
|
form.on('checkbox()', function(data){
|
||||||
@@ -226,6 +239,7 @@ async function getSettingPageHtml(data) {
|
|||||||
switchData.noticeMsgList = [{
|
switchData.noticeMsgList = [{
|
||||||
msg : data.field.noticeMsg
|
msg : data.field.noticeMsg
|
||||||
}]
|
}]
|
||||||
|
switchData.chatingCommCount = parseInt(data.field.chatingCommCount)
|
||||||
window.manageChange({
|
window.manageChange({
|
||||||
id : ${resData.id},
|
id : ${resData.id},
|
||||||
content : switchData
|
content : switchData
|
||||||
|
@@ -12,7 +12,7 @@ function sendChatingNotify(data) {
|
|||||||
`库记录ID: ${data.recoderId}\n` +
|
`库记录ID: ${data.recoderId}\n` +
|
||||||
`消息体ID: ${data.msgRecoderId}\n` +
|
`消息体ID: ${data.msgRecoderId}\n` +
|
||||||
`发送方ID: ${data.socketId}\n` +
|
`发送方ID: ${data.socketId}\n` +
|
||||||
`文本内容: ${decodeURIComponent(data.msg)}\n` +
|
`文本内容: ${utils.unescapeStr(data.msg)}\n` +
|
||||||
`当前时间: ${utils.formateDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")}\n` +
|
`当前时间: ${utils.formateDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")}\n` +
|
||||||
`访问IP: ${data.ip}\n` +
|
`访问IP: ${data.ip}\n` +
|
||||||
`访问设备: ${data.userAgent}\n`;
|
`访问设备: ${data.userAgent}\n`;
|
||||||
@@ -67,7 +67,7 @@ function sendChatingRoomNotify(data) {
|
|||||||
` - <font color="comment">${data.room}</font>\n` +
|
` - <font color="comment">${data.room}</font>\n` +
|
||||||
`库记录ID: ${data.recoderId}\n` +
|
`库记录ID: ${data.recoderId}\n` +
|
||||||
`发送方ID: ${data.from}\n` +
|
`发送方ID: ${data.from}\n` +
|
||||||
`文本内容: ${decodeURIComponent(data.content)}\n` +
|
`文本内容: ${utils.unescapeStr(data.content)}\n` +
|
||||||
`当前时间: ${utils.formateDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")}\n` +
|
`当前时间: ${utils.formateDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")}\n` +
|
||||||
`访问IP: ${data.ip}\n` +
|
`访问IP: ${data.ip}\n` +
|
||||||
`访问设备: ${data.userAgent}\n`;
|
`访问设备: ${data.userAgent}\n`;
|
||||||
@@ -415,6 +415,35 @@ function sendSystemErrorMsg(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送开始远程画笔通知
|
||||||
|
* @param {*} data
|
||||||
|
*/
|
||||||
|
function sendStartRemoteDrawNotify(data) {
|
||||||
|
let notifyMsg = `## <font color='info'>文件传输通知</font> - <font color="warning">${data.title}</font>` +
|
||||||
|
` - <font color="comment">${data.room}</font>\n` +
|
||||||
|
`当前时间: ${utils.formateDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")}\n` +
|
||||||
|
`访问IP: ${data.ip}\n` +
|
||||||
|
`访问设备: ${data.userAgent}\n`;
|
||||||
|
notify.requestMsg(notifyMsg)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送停止远程画笔通知
|
||||||
|
* @param {*} data
|
||||||
|
*/
|
||||||
|
function sendStopRemoteDrawNotify(data) {
|
||||||
|
let notifyMsg = `## <font color='info'>文件传输通知</font> - <font color="warning">${data.title}</font>` +
|
||||||
|
` - <font color="comment">${data.room}</font>\n` +
|
||||||
|
`画笔记录: ${data.drawCount}条\n` +
|
||||||
|
`当前时间: ${utils.formateDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")}\n` +
|
||||||
|
`访问IP: ${data.ip}\n` +
|
||||||
|
`访问设备: ${data.userAgent}\n`;
|
||||||
|
notify.requestMsg(notifyMsg)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
sendExitRoomNotify,
|
sendExitRoomNotify,
|
||||||
sendCreateJoinRoomNotify,
|
sendCreateJoinRoomNotify,
|
||||||
@@ -441,5 +470,7 @@ module.exports = {
|
|||||||
addCodeFileNotify,
|
addCodeFileNotify,
|
||||||
getCodeFileNotify,
|
getCodeFileNotify,
|
||||||
prepareCodeFileNotify,
|
prepareCodeFileNotify,
|
||||||
sendSystemErrorMsg
|
sendSystemErrorMsg,
|
||||||
|
sendStartRemoteDrawNotify,
|
||||||
|
sendStopRemoteDrawNotify
|
||||||
}
|
}
|
@@ -0,0 +1,33 @@
|
|||||||
|
const aly = require('./aly');
|
||||||
|
const tx = require('./tx');
|
||||||
|
const qiniu = require('./qiniu');
|
||||||
|
const seafile = require('./seafile');
|
||||||
|
const cfg = require('./../../../conf/cfg.json');
|
||||||
|
|
||||||
|
const oss = {
|
||||||
|
aly,
|
||||||
|
tx,
|
||||||
|
qiniu,
|
||||||
|
seafile,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取上传token
|
||||||
|
*/
|
||||||
|
const getUploadToken = async function(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取上传url
|
||||||
|
*/
|
||||||
|
const getUploadUrl = async function(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取下载url
|
||||||
|
*/
|
||||||
|
const getDownLoadUrl = async function(){
|
||||||
|
|
||||||
|
}
|
@@ -9,8 +9,8 @@ const seafile = require('../../../conf/cfg.json').oss.seafile
|
|||||||
/**
|
/**
|
||||||
* 获取token
|
* 获取token
|
||||||
*/
|
*/
|
||||||
function seafileGetToken() {
|
async function seafileGetToken() {
|
||||||
return new Promise(resolve => {
|
return await new Promise(resolve => {
|
||||||
request({
|
request({
|
||||||
url: `${seafile.host}/api2/auth-token/`,
|
url: `${seafile.host}/api2/auth-token/`,
|
||||||
method: "POST",
|
method: "POST",
|
||||||
@@ -31,32 +31,14 @@ function seafileGetToken() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 服务是否正常
|
|
||||||
* @param {*} token
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function seafilePingPong(token) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
request({
|
|
||||||
url: `${seafile.host}/api2/ping/`,
|
|
||||||
method: "GET",
|
|
||||||
headers: {
|
|
||||||
"Authorization": `Token ${token}`
|
|
||||||
},
|
|
||||||
}, function (error, response, body) {
|
|
||||||
resolve(body)
|
|
||||||
});
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取上传链接
|
* 获取上传链接
|
||||||
* @param {*} token
|
* @param {*} token
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
function seafileGetUploadLink(token) {
|
async function seafileGetUploadLink(token) {
|
||||||
return new Promise(resolve => {
|
return await new Promise(resolve => {
|
||||||
request({
|
request({
|
||||||
url: `${seafile.host}/api2/repos/${seafile.repoid}/upload-link/`,
|
url: `${seafile.host}/api2/repos/${seafile.repoid}/upload-link/`,
|
||||||
method: "GET",
|
method: "GET",
|
||||||
@@ -69,45 +51,15 @@ function seafileGetUploadLink(token) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 上传文件
|
|
||||||
* @param {*} token
|
|
||||||
* @param {*} link
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function seafileUpload(token, options) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
request({
|
|
||||||
url: `${options.link}?ret-json=1`,
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"content-type": "application/json",
|
|
||||||
"Authorization": `Token ${token}`
|
|
||||||
},
|
|
||||||
body: JSON.stringify({
|
|
||||||
replace: options.replace,
|
|
||||||
file: options.file,
|
|
||||||
parent_dir: options.parent_dir
|
|
||||||
})
|
|
||||||
}, function (error, response, body) {
|
|
||||||
if (body) {
|
|
||||||
resolve(JSON.parse(body))
|
|
||||||
} else {
|
|
||||||
resolve(undefined)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建分享链接
|
* 获取直接下载链接
|
||||||
* @param {*} token
|
* @param {*} token
|
||||||
* @param {*} name
|
* @param {*} options
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
function seafileCreateShareLink(token, options) {
|
async function seafileGetDownLoadLink(token, options) {
|
||||||
return new Promise(resolve => {
|
return await new Promise(resolve => {
|
||||||
request({
|
request({
|
||||||
url: `${seafile.host}/api/v2.1/share-links/`,
|
url: `${seafile.host}/api/v2.1/share-links/`,
|
||||||
method: "POST",
|
method: "POST",
|
||||||
@@ -126,7 +78,14 @@ function seafileCreateShareLink(token, options) {
|
|||||||
})
|
})
|
||||||
}, function (error, response, body) {
|
}, function (error, response, body) {
|
||||||
if (body) {
|
if (body) {
|
||||||
resolve(JSON.parse(body))
|
let data = JSON.parse(body);
|
||||||
|
if(data){
|
||||||
|
resolve({
|
||||||
|
downloadLink : `${seafile.host}/f/${data.token}/?dl=1`,
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
resolve(undefined)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
resolve(undefined)
|
resolve(undefined)
|
||||||
}
|
}
|
||||||
@@ -134,45 +93,8 @@ function seafileCreateShareLink(token, options) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除分享链接
|
|
||||||
* @param {*} token
|
|
||||||
* @param {*} name
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function seafileDeleteShareLink(token, shareLinkToken) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
request({
|
|
||||||
url: `${seafile.host}/api/v2.1/share-links/${shareLinkToken}/`,
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Authorization": `Token ${token}`
|
|
||||||
},
|
|
||||||
}, function (error, response, body) {
|
|
||||||
resolve(body)
|
|
||||||
});
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取直接下载链接
|
|
||||||
* @param {*} token
|
|
||||||
* @param {*} name
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
function seafileGetDownLoadLink(shareLinkToken) {
|
|
||||||
return `${seafile.host}/f/${shareLinkToken}/?dl=1`;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
seafileGetToken,
|
seafileGetToken,
|
||||||
seafilePingPong,
|
|
||||||
seafileCreateShareLink,
|
|
||||||
seafileGetDownLoadLink,
|
|
||||||
seafileDeleteShareLink,
|
|
||||||
seafileGetUploadLink,
|
seafileGetUploadLink,
|
||||||
seafileUpload
|
seafileGetDownLoadLink,
|
||||||
}
|
}
|
4
svr/src/bussiness/oss/tx.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* oss tx api
|
||||||
|
* @author iamtsm
|
||||||
|
*/
|
32
svr/src/controller/check/check.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
const check = require("../../utils/check/content");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查内容
|
||||||
|
* @param {*} req
|
||||||
|
* @param {*} res
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function checkContent(req, res) {
|
||||||
|
try {
|
||||||
|
let content = req.query.content;
|
||||||
|
if(content.length > 1000){
|
||||||
|
res.json({
|
||||||
|
content: "内容过长"
|
||||||
|
})
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
res.json({
|
||||||
|
content: check.contentFilter(content)
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
res.json({
|
||||||
|
content: "",
|
||||||
|
err : "系统繁忙"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
checkContent
|
||||||
|
}
|
11
svr/src/controller/check/index.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
const express = require('express');
|
||||||
|
const check = require("./check");
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = function () {
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
router.get("/check", check.checkContent);
|
||||||
|
|
||||||
|
return router;
|
||||||
|
}
|
@@ -8,6 +8,13 @@ const webrtcConf = conf.webrtc;
|
|||||||
* @param {*} res
|
* @param {*} res
|
||||||
*/
|
*/
|
||||||
function initData(req, res) {
|
function initData(req, res) {
|
||||||
|
//是否开启turn
|
||||||
|
const openTurn = (req.query.turn || "") === 'true';
|
||||||
|
//使用的账号模式, true : 有效账号模式, false : 固定账号
|
||||||
|
const useSecret = (req.query.secret || "") === 'true';
|
||||||
|
|
||||||
|
//ice服务器配置
|
||||||
|
const iceServers = utils.genTurnServerIceServersConfig(openTurn, useSecret, "tlrtcfile");
|
||||||
|
|
||||||
if(process.env.ENV_MODE === 'local'){
|
if(process.env.ENV_MODE === 'local'){
|
||||||
|
|
||||||
@@ -21,18 +28,22 @@ function initData(req, res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let data = {
|
let data = {
|
||||||
|
version : conf.version,
|
||||||
wsHost: conf.ws.host || ip,
|
wsHost: conf.ws.host || ip,
|
||||||
rtcConfig: { iceServers: webrtcConf.iceServers },
|
rtcConfig: { iceServers },
|
||||||
options: webrtcConf.options
|
options: webrtcConf.options,
|
||||||
|
logo : utils.genClientLogo(),
|
||||||
};
|
};
|
||||||
|
|
||||||
res.json(data)
|
res.json(data)
|
||||||
}else if(process.env.ENV_MODE === 'server'){
|
}else if(process.env.ENV_MODE === 'server'){
|
||||||
|
|
||||||
let data = {
|
let data = {
|
||||||
|
version : conf.version,
|
||||||
wsHost: conf.wss.host,
|
wsHost: conf.wss.host,
|
||||||
rtcConfig: { iceServers: webrtcConf.iceServers },
|
rtcConfig: { iceServers },
|
||||||
options: webrtcConf.options
|
options: webrtcConf.options,
|
||||||
|
logo : utils.genClientLogo(),
|
||||||
};
|
};
|
||||||
|
|
||||||
res.json(data)
|
res.json(data)
|
||||||
|
@@ -98,7 +98,6 @@ async function getDogManageInfo(params, tables, dbClient) {
|
|||||||
})
|
})
|
||||||
data.transferFileSizeTodady = parseInt(data.transferFileSizeTodady / 1024 / 1024)
|
data.transferFileSizeTodady = parseInt(data.transferFileSizeTodady / 1024 / 1024)
|
||||||
|
|
||||||
|
|
||||||
//发送文本内容
|
//发送文本内容
|
||||||
let txtTransferList = transferListToday.filter(element => {
|
let txtTransferList = transferListToday.filter(element => {
|
||||||
return element.name === '发送文本内容'
|
return element.name === '发送文本内容'
|
||||||
@@ -108,7 +107,7 @@ async function getDogManageInfo(params, tables, dbClient) {
|
|||||||
let content = JSON.parse(element.content);
|
let content = JSON.parse(element.content);
|
||||||
data.txtList.push({
|
data.txtList.push({
|
||||||
room: element.room_id || content.room,
|
room: element.room_id || content.room,
|
||||||
content: decodeURIComponent(content.content),
|
content: utils.unescapeStr(content.content),
|
||||||
size: content.content.length,
|
size: content.content.length,
|
||||||
createTime: utils.formateDateTime(new Date(element.created_at), "yyyy-MM-dd hh:mm:ss"),
|
createTime: utils.formateDateTime(new Date(element.created_at), "yyyy-MM-dd hh:mm:ss"),
|
||||||
})
|
})
|
||||||
@@ -184,7 +183,7 @@ async function getDogManageInfo(params, tables, dbClient) {
|
|||||||
* @param {*} dbClient
|
* @param {*} dbClient
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
async function getDogChating10Info(params, tables, dbClient) {
|
async function getDogChatingCommInfo(params, tables, dbClient) {
|
||||||
try{
|
try{
|
||||||
if(!tables || !dbClient){
|
if(!tables || !dbClient){
|
||||||
return [];
|
return [];
|
||||||
@@ -220,7 +219,7 @@ async function getDogChating10Info(params, tables, dbClient) {
|
|||||||
module.exports = dbOpen ? {
|
module.exports = dbOpen ? {
|
||||||
addDogData,
|
addDogData,
|
||||||
getDogManageInfo,
|
getDogManageInfo,
|
||||||
getDogChating10Info,
|
getDogChatingCommInfo,
|
||||||
} : {
|
} : {
|
||||||
addDogData : () => {
|
addDogData : () => {
|
||||||
return {}
|
return {}
|
||||||
@@ -228,7 +227,7 @@ module.exports = dbOpen ? {
|
|||||||
getDogManageInfo : () => {
|
getDogManageInfo : () => {
|
||||||
return {}
|
return {}
|
||||||
},
|
},
|
||||||
getDogChating10Info : () => {
|
getDogChatingCommInfo : () => {
|
||||||
return [];
|
return [];
|
||||||
},
|
},
|
||||||
}
|
}
|
@@ -14,6 +14,7 @@ const defaultSwitchData = {
|
|||||||
openGetCodeFile: true,
|
openGetCodeFile: true,
|
||||||
openVideoShare: true,
|
openVideoShare: true,
|
||||||
openLiveShare: true,
|
openLiveShare: true,
|
||||||
|
openRemoteDraw: true,
|
||||||
openPasswordRoom: true,
|
openPasswordRoom: true,
|
||||||
openScreenShare: true,
|
openScreenShare: true,
|
||||||
openFileTransfer: true,
|
openFileTransfer: true,
|
||||||
@@ -28,6 +29,7 @@ const defaultSwitchData = {
|
|||||||
allowChinese: true,
|
allowChinese: true,
|
||||||
allowSymbol: true,
|
allowSymbol: true,
|
||||||
noticeMsgList: [],
|
noticeMsgList: [],
|
||||||
|
chatingCommCount : 10,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -4,7 +4,7 @@ const rtcCommData = require("../rtcCommData/commData");
|
|||||||
const utils = require("../../utils/utils");
|
const utils = require("../../utils/utils");
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const check = require("../../utils/check/content");
|
||||||
/**
|
/**
|
||||||
* 公共聊天频道
|
* 公共聊天频道
|
||||||
* @param {*} io socketio对象
|
* @param {*} io socketio对象
|
||||||
@@ -16,6 +16,8 @@ const rtcClientEvent = rtcConstant.rtcClientEvent
|
|||||||
*/
|
*/
|
||||||
async function chatingComm(io, socket, tables, dbClient, data){
|
async function chatingComm(io, socket, tables, dbClient, data){
|
||||||
try {
|
try {
|
||||||
|
data.msg = check.contentFilter(data.msg);
|
||||||
|
|
||||||
let cacheSwitchData = rtcCommData.getCacheSwitchData()
|
let cacheSwitchData = rtcCommData.getCacheSwitchData()
|
||||||
let chatingComm = rtcCommData.getChatingComm()
|
let chatingComm = rtcCommData.getChatingComm()
|
||||||
|
|
||||||
@@ -30,7 +32,7 @@ async function chatingComm(io, socket, tables, dbClient, data){
|
|||||||
|
|
||||||
data.time = new Date().toLocaleString()
|
data.time = new Date().toLocaleString()
|
||||||
|
|
||||||
if (chatingComm.length < 10) {
|
if (chatingComm.length < (cacheSwitchData.chatingCommCount || 10)) {
|
||||||
chatingComm.push(data)
|
chatingComm.push(data)
|
||||||
} else {
|
} else {
|
||||||
chatingComm.shift()
|
chatingComm.shift()
|
||||||
@@ -48,7 +50,7 @@ async function chatingComm(io, socket, tables, dbClient, data){
|
|||||||
socketId: data.socketId,
|
socketId: data.socketId,
|
||||||
device: userAgent,
|
device: userAgent,
|
||||||
flag: 0,
|
flag: 0,
|
||||||
content: decodeURIComponent(data.msg),
|
content: utils.unescapeStr(data.msg),
|
||||||
handshake: JSON.stringify(handshake),
|
handshake: JSON.stringify(handshake),
|
||||||
ip: ip
|
ip: ip
|
||||||
}, tables, dbClient);
|
}, tables, dbClient);
|
||||||
@@ -59,7 +61,7 @@ async function chatingComm(io, socket, tables, dbClient, data){
|
|||||||
recoderId: recoderId,
|
recoderId: recoderId,
|
||||||
msgRecoderId: recoderId,
|
msgRecoderId: recoderId,
|
||||||
socketId: data.socketId,
|
socketId: data.socketId,
|
||||||
msg: decodeURIComponent(data.msg),
|
msg: utils.unescapeStr(data.msg),
|
||||||
userAgent: userAgent,
|
userAgent: userAgent,
|
||||||
ip: ip
|
ip: ip
|
||||||
})
|
})
|
||||||
@@ -72,6 +74,7 @@ async function chatingComm(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-chatingComm",
|
title: "socket-chatingComm",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -3,6 +3,7 @@ const bussinessNotify = require("./../../bussiness/notify/notifyHandler")
|
|||||||
const utils = require("./../../utils/utils");
|
const utils = require("./../../utils/utils");
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 房间内聊天 群聊/私聊
|
* 房间内聊天 群聊/私聊
|
||||||
@@ -17,7 +18,6 @@ const rtcClientEvent = rtcConstant.rtcClientEvent
|
|||||||
*/
|
*/
|
||||||
async function chatingRoom(io, socket, tables, dbClient, data){
|
async function chatingRoom(io, socket, tables, dbClient, data){
|
||||||
try {
|
try {
|
||||||
|
|
||||||
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
||||||
|
|
||||||
await daoDog.addDogData({
|
await daoDog.addDogData({
|
||||||
@@ -76,6 +76,7 @@ async function chatingRoom(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-chatingRoom",
|
title: "socket-chatingRoom",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -6,6 +6,7 @@ const bussinessNotify = require("./../../bussiness/notify/notifyHandler")
|
|||||||
const utils = require("./../../utils/utils");
|
const utils = require("./../../utils/utils");
|
||||||
const seafile = require("./../../bussiness/oss/seafile")
|
const seafile = require("./../../bussiness/oss/seafile")
|
||||||
const rtcCommData = require("./../rtcCommData/commData");
|
const rtcCommData = require("./../rtcCommData/commData");
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加取件码文件
|
* 添加取件码文件
|
||||||
@@ -31,19 +32,17 @@ async function addCodeFile(io, socket, tables, dbClient, data){
|
|||||||
|
|
||||||
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
||||||
|
|
||||||
const ossToken = await seafile.seafileGetToken();
|
|
||||||
|
|
||||||
let donwloadLink = ""
|
let donwloadLink = ""
|
||||||
|
const ossToken = await seafile.seafileGetToken();
|
||||||
if(ossToken){
|
if(ossToken){
|
||||||
let shareLink = await seafile.seafileCreateShareLink(ossToken, {
|
let downloadData = await seafile.seafileGetDownLoadLink(ossToken, {
|
||||||
name : data.ossFileName,
|
name : data.ossFileName,
|
||||||
can_edit : false,
|
can_edit : false,
|
||||||
can_download : true,
|
can_download : true,
|
||||||
expire_days : 1
|
expire_days : 1
|
||||||
});
|
});
|
||||||
if(shareLink){
|
if(downloadData){
|
||||||
donwloadLink = seafile.seafileGetDownLoadLink(shareLink.token);
|
donwloadLink = downloadData.downloadLink;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,6 +97,7 @@ async function addCodeFile(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-addCodeFile",
|
title: "socket-addCodeFile",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -5,6 +5,7 @@ const bussinessNotify = require("./../../bussiness/notify/notifyHandler")
|
|||||||
const utils = require("./../../utils/utils");
|
const utils = require("./../../utils/utils");
|
||||||
const daoFile = require("./../../dao/file/file")
|
const daoFile = require("./../../dao/file/file")
|
||||||
const rtcCommData = require("./../rtcCommData/commData");
|
const rtcCommData = require("./../rtcCommData/commData");
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 取件码取件
|
* 取件码取件
|
||||||
@@ -71,6 +72,7 @@ async function getCodeFile(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-getCodeFile",
|
title: "socket-getCodeFile",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -5,6 +5,7 @@ const bussinessNotify = require("./../../bussiness/notify/notifyHandler")
|
|||||||
const utils = require("./../../utils/utils");
|
const utils = require("./../../utils/utils");
|
||||||
const seafile = require("./../../bussiness/oss/seafile")
|
const seafile = require("./../../bussiness/oss/seafile")
|
||||||
const rtcCommData = require("./../rtcCommData/commData");
|
const rtcCommData = require("./../rtcCommData/commData");
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成取件码上传链接
|
* 生成取件码上传链接
|
||||||
@@ -17,7 +18,6 @@ const rtcCommData = require("./../rtcCommData/commData");
|
|||||||
*/
|
*/
|
||||||
async function prepareCodeFile(io, socket, tables, dbClient, data){
|
async function prepareCodeFile(io, socket, tables, dbClient, data){
|
||||||
try{
|
try{
|
||||||
|
|
||||||
let cacheSwitchData = rtcCommData.getCacheSwitchData()
|
let cacheSwitchData = rtcCommData.getCacheSwitchData()
|
||||||
|
|
||||||
if(!cacheSwitchData.openGetCodeFile){
|
if(!cacheSwitchData.openGetCodeFile){
|
||||||
@@ -42,10 +42,8 @@ async function prepareCodeFile(io, socket, tables, dbClient, data){
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const ossToken = await seafile.seafileGetToken();
|
|
||||||
|
|
||||||
data.uploadLink = "";
|
data.uploadLink = "";
|
||||||
|
const ossToken = await seafile.seafileGetToken();
|
||||||
if(ossToken){
|
if(ossToken){
|
||||||
let uploadLink = await seafile.seafileGetUploadLink(ossToken);
|
let uploadLink = await seafile.seafileGetUploadLink(ossToken);
|
||||||
uploadLink = uploadLink.replace(/^(\s|\")+|(\s|\")+$/g, '') + "?ret-json=1";
|
uploadLink = uploadLink.replace(/^(\s|\")+|(\s|\")+$/g, '') + "?ret-json=1";
|
||||||
@@ -90,6 +88,7 @@ async function prepareCodeFile(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-prepareCodeFile",
|
title: "socket-prepareCodeFile",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -3,6 +3,7 @@ const daoDog = require("./../../dao/dog/dog")
|
|||||||
const utils = require("./../../utils/utils");
|
const utils = require("./../../utils/utils");
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const bussinessNotify = require("./../../bussiness/notify/notifyHandler")
|
||||||
|
|
||||||
// 公共聊天数据缓存
|
// 公共聊天数据缓存
|
||||||
let chatingComm = null
|
let chatingComm = null
|
||||||
@@ -20,7 +21,6 @@ let cacheSwitchData = null
|
|||||||
*/
|
*/
|
||||||
async function getCommData(io, socket, tables, dbClient, data){
|
async function getCommData(io, socket, tables, dbClient, data){
|
||||||
try{
|
try{
|
||||||
|
|
||||||
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
||||||
|
|
||||||
let manageInfo = await daoRoom.getOrCreateManageRoom({
|
let manageInfo = await daoRoom.getOrCreateManageRoom({
|
||||||
@@ -34,8 +34,8 @@ async function getCommData(io, socket, tables, dbClient, data){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!chatingComm){
|
if(!chatingComm){
|
||||||
chatingComm = await daoDog.getDogChating10Info({
|
chatingComm = await daoDog.getDogChatingCommInfo({
|
||||||
limit : 10
|
limit : switchData.chatingCommCount || 10
|
||||||
}, tables, dbClient);
|
}, tables, dbClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,6 +53,7 @@ async function getCommData(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-commData",
|
title: "socket-commData",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -73,8 +73,12 @@ let rtcServerMessageEvent = {
|
|||||||
stopVideoShare : "stopVideoShare",
|
stopVideoShare : "stopVideoShare",
|
||||||
//开始直播
|
//开始直播
|
||||||
startLiveShare : "startLiveShare",
|
startLiveShare : "startLiveShare",
|
||||||
// 结束直播
|
//结束直播
|
||||||
stopLiveShare : "stopLiveShare",
|
stopLiveShare : "stopLiveShare",
|
||||||
|
//开始远程画笔
|
||||||
|
startRemoteDraw : "startRemoteDraw",
|
||||||
|
//结束远程画笔
|
||||||
|
stopRemoteDraw : "stopRemoteDraw",
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -3,6 +3,7 @@ const daoDog = require("./../../dao/dog/dog")
|
|||||||
const bussinessNotify = require("./../../bussiness/notify/notifyHandler")
|
const bussinessNotify = require("./../../bussiness/notify/notifyHandler")
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 远程控制
|
* 远程控制
|
||||||
@@ -15,7 +16,6 @@ const rtcClientEvent = rtcConstant.rtcClientEvent
|
|||||||
*/
|
*/
|
||||||
async function control(io, socket, tables, dbClient, data){
|
async function control(io, socket, tables, dbClient, data){
|
||||||
try{
|
try{
|
||||||
|
|
||||||
let {room, from, to, opArr} = data;
|
let {room, from, to, opArr} = data;
|
||||||
|
|
||||||
if(from !== socket.id){
|
if(from !== socket.id){
|
||||||
@@ -78,6 +78,7 @@ async function control(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-control",
|
title: "socket-control",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -15,7 +15,7 @@ async function count(io, socket, tables, dbClient, data){
|
|||||||
try{
|
try{
|
||||||
let allManCount = Object.keys(io.sockets.connected).length || 0;
|
let allManCount = Object.keys(io.sockets.connected).length || 0;
|
||||||
io.sockets.emit(rtcClientEvent.count, {
|
io.sockets.emit(rtcClientEvent.count, {
|
||||||
mc : allManCount + 50
|
mc : allManCount
|
||||||
})
|
})
|
||||||
}catch(e){
|
}catch(e){
|
||||||
utils.tlConsole(e)
|
utils.tlConsole(e)
|
||||||
|
@@ -5,6 +5,7 @@ const utils = require("./../../utils/utils");
|
|||||||
const cfg = require("./../../../conf/cfg.json")
|
const cfg = require("./../../../conf/cfg.json")
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户创建或加入房间
|
* 用户创建或加入房间
|
||||||
@@ -18,7 +19,7 @@ const rtcClientEvent = rtcConstant.rtcClientEvent
|
|||||||
async function userCreateAndJoin(io, socket, tables, dbClient, data){
|
async function userCreateAndJoin(io, socket, tables, dbClient, data){
|
||||||
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
||||||
|
|
||||||
let {room, type, nickName, password = ''} = data;
|
let {room, type, nickName, password = '', langMode = 'zh'} = data;
|
||||||
|
|
||||||
if (room && room.length > 15) {
|
if (room && room.length > 15) {
|
||||||
room = room.toString().substr(0, 14);
|
room = room.toString().substr(0, 14);
|
||||||
@@ -29,6 +30,7 @@ async function userCreateAndJoin(io, socket, tables, dbClient, data){
|
|||||||
}
|
}
|
||||||
//设置昵称
|
//设置昵称
|
||||||
io.sockets.connected[socket.id].nickName = nickName;
|
io.sockets.connected[socket.id].nickName = nickName;
|
||||||
|
io.sockets.connected[socket.id].langMode = langMode;
|
||||||
|
|
||||||
if(password && password.length > 6){
|
if(password && password.length > 6){
|
||||||
password = password.toString().substr(0,6);
|
password = password.toString().substr(0,6);
|
||||||
@@ -62,6 +64,8 @@ async function userCreateAndJoin(io, socket, tables, dbClient, data){
|
|||||||
recoderId : recoderId
|
recoderId : recoderId
|
||||||
});
|
});
|
||||||
|
|
||||||
|
io.sockets.connected[socket.id].owner = true;
|
||||||
|
|
||||||
//密码房间 首次创建设置密码
|
//密码房间 首次创建设置密码
|
||||||
if(type === 'password'){
|
if(type === 'password'){
|
||||||
io.sockets.adapter.rooms[room].password = password
|
io.sockets.adapter.rooms[room].password = password
|
||||||
@@ -92,12 +96,15 @@ async function userCreateAndJoin(io, socket, tables, dbClient, data){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
io.sockets.connected[socket.id].owner = false;
|
||||||
|
|
||||||
io.sockets.in(room).emit(rtcClientEvent.joined,{
|
io.sockets.in(room).emit(rtcClientEvent.joined,{
|
||||||
id: socket.id,
|
id: socket.id,
|
||||||
room: room,
|
room: room,
|
||||||
nickName : nickName,
|
nickName : nickName,
|
||||||
type: type,
|
type: type,
|
||||||
recoderId : recoderId
|
recoderId : recoderId,
|
||||||
|
langMode : langMode,
|
||||||
});
|
});
|
||||||
|
|
||||||
let peers = new Array();
|
let peers = new Array();
|
||||||
@@ -105,9 +112,13 @@ async function userCreateAndJoin(io, socket, tables, dbClient, data){
|
|||||||
for (let i = 0; i < otherSocketIds.length; i++) {
|
for (let i = 0; i < otherSocketIds.length; i++) {
|
||||||
let otherSocketId = otherSocketIds[i]
|
let otherSocketId = otherSocketIds[i]
|
||||||
let peerNickName = io.sockets.connected[otherSocketId].nickName
|
let peerNickName = io.sockets.connected[otherSocketId].nickName
|
||||||
|
let peerOwner = io.sockets.connected[otherSocketId].owner
|
||||||
|
let peerLangMode = io.sockets.connected[otherSocketId].langMode
|
||||||
peers.push({
|
peers.push({
|
||||||
id: otherSocketId,
|
id: otherSocketId,
|
||||||
nickName: peerNickName
|
nickName: peerNickName,
|
||||||
|
owner : peerOwner,
|
||||||
|
langMode : peerLangMode
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,6 +244,7 @@ async function createJoin(io, socket, tables, dbClient, data){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cfg.manage.room !== room) {
|
if (cfg.manage.room !== room) {
|
||||||
|
data.room = check.contentFilter(data.room);
|
||||||
// 用户加入/创建房间
|
// 用户加入/创建房间
|
||||||
userCreateAndJoin(io, socket, tables, dbClient, data)
|
userCreateAndJoin(io, socket, tables, dbClient, data)
|
||||||
}else{
|
}else{
|
||||||
@@ -248,6 +260,7 @@ async function createJoin(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-createJoin",
|
title: "socket-createJoin",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -2,7 +2,7 @@ const utils = require("./../../utils/utils");
|
|||||||
const daoDog = require("./../../dao/dog/dog")
|
const daoDog = require("./../../dao/dog/dog")
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
/**
|
/**
|
||||||
* canvas画图
|
* canvas画图
|
||||||
* @param {*} io socketio对象
|
* @param {*} io socketio对象
|
||||||
|
@@ -54,6 +54,7 @@ async function exit(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-exit",
|
title: "socket-exit",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -5,6 +5,7 @@ const rtcCommData = require("./../rtcCommData/commData")
|
|||||||
const utils = require("./../../utils/utils");
|
const utils = require("./../../utils/utils");
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 管理后台修改数据
|
* 管理后台修改数据
|
||||||
@@ -71,6 +72,7 @@ async function change(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-manage-change",
|
title: "socket-manage-change",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -7,6 +7,7 @@ const cfg = require("./../../../conf/cfg.json")
|
|||||||
const manageConfig = cfg.manage
|
const manageConfig = cfg.manage
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
// 登陆token列表
|
// 登陆token列表
|
||||||
let tokens = [];
|
let tokens = [];
|
||||||
@@ -93,6 +94,7 @@ async function confirm(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-manage-confirm",
|
title: "socket-manage-confirm",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -8,6 +8,7 @@ const cfg = require("./../../../conf/cfg.json")
|
|||||||
const manageConfig = cfg.manage
|
const manageConfig = cfg.manage
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 管理后台登陆验证
|
* 管理后台登陆验证
|
||||||
@@ -85,6 +86,7 @@ async function reload(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-manage-reload",
|
title: "socket-manage-reload",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -3,6 +3,7 @@ const bussinessNotify = require("./../../bussiness/notify/notifyHandler")
|
|||||||
const utils = require("./../../utils/utils");
|
const utils = require("./../../utils/utils");
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcServerMessageEvent = rtcConstant.rtcServerMessageEvent
|
const rtcServerMessageEvent = rtcConstant.rtcServerMessageEvent
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
let rtcEventOpName = {
|
let rtcEventOpName = {
|
||||||
"sendFileInfo": "准备发送文件",
|
"sendFileInfo": "准备发送文件",
|
||||||
@@ -16,6 +17,8 @@ let rtcEventOpName = {
|
|||||||
"stopVideoShare": "停止音视频通话",
|
"stopVideoShare": "停止音视频通话",
|
||||||
"startLiveShare": "开启直播",
|
"startLiveShare": "开启直播",
|
||||||
"stopLiveShare": "关闭直播",
|
"stopLiveShare": "关闭直播",
|
||||||
|
"startRemoteDraw": "开启远程画笔",
|
||||||
|
"stopRemoteDraw": "关闭远程画笔",
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,6 +39,7 @@ async function message(io, socket, tables, dbClient, data){
|
|||||||
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket);
|
||||||
|
|
||||||
if (emitType === rtcServerMessageEvent.sendFileInfo) {
|
if (emitType === rtcServerMessageEvent.sendFileInfo) {
|
||||||
|
data.name = check.contentFilter(data.name);
|
||||||
bussinessNotify.sendFileInfoNotify({
|
bussinessNotify.sendFileInfoNotify({
|
||||||
title: rtcEventOpName.sendFileInfo,
|
title: rtcEventOpName.sendFileInfo,
|
||||||
room: data.room,
|
room: data.room,
|
||||||
@@ -50,6 +54,7 @@ async function message(io, socket, tables, dbClient, data){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (emitType === rtcServerMessageEvent.sendDone) {
|
if (emitType === rtcServerMessageEvent.sendDone) {
|
||||||
|
data.name = check.contentFilter(data.name);
|
||||||
bussinessNotify.sendFileDoneNotify({
|
bussinessNotify.sendFileDoneNotify({
|
||||||
title: rtcEventOpName.sendDone,
|
title: rtcEventOpName.sendDone,
|
||||||
room: data.room,
|
room: data.room,
|
||||||
@@ -152,6 +157,26 @@ async function message(io, socket, tables, dbClient, data){
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (emitType === rtcServerMessageEvent.startRemoteDraw) {
|
||||||
|
bussinessNotify.sendStartRemoteDrawNotify({
|
||||||
|
title: rtcEventOpName.startRemoteDraw,
|
||||||
|
userAgent: userAgent,
|
||||||
|
ip: ip,
|
||||||
|
room: data.room,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (emitType === rtcServerMessageEvent.stopRemoteDraw) {
|
||||||
|
bussinessNotify.sendStopRemoteDrawNotify({
|
||||||
|
title: rtcEventOpName.stopRemoteDraw,
|
||||||
|
userAgent: data.userAgent,
|
||||||
|
userAgent: userAgent,
|
||||||
|
ip: ip,
|
||||||
|
room: data.room,
|
||||||
|
drawCount : data.drawCount
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
if (rtcEventOpName[emitType]) {
|
if (rtcEventOpName[emitType]) {
|
||||||
await daoDog.addDogData({
|
await daoDog.addDogData({
|
||||||
name: rtcEventOpName[emitType],
|
name: rtcEventOpName[emitType],
|
||||||
@@ -200,6 +225,7 @@ async function message(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-message",
|
title: "socket-message",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -5,6 +5,7 @@ const utils = require("./../../utils/utils");
|
|||||||
const bussinessOpenai = require("./../../bussiness/openai/openai")
|
const bussinessOpenai = require("./../../bussiness/openai/openai")
|
||||||
const rtcConstant = require("../rtcConstant");
|
const rtcConstant = require("../rtcConstant");
|
||||||
const rtcClientEvent = rtcConstant.rtcClientEvent
|
const rtcClientEvent = rtcConstant.rtcClientEvent
|
||||||
|
const check = require("./../../utils/check/content");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ai聊天
|
* ai聊天
|
||||||
@@ -33,6 +34,9 @@ async function openai(io, socket, tables, dbClient, data){
|
|||||||
value = value.substr(0, 1000)
|
value = value.substr(0, 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data.content = check.contentFilter(data.content);
|
||||||
|
data.value = check.contentFilter(data.value);
|
||||||
|
|
||||||
// 有上下文,结合上下文
|
// 有上下文,结合上下文
|
||||||
if(content){
|
if(content){
|
||||||
content = content.substr(0, 5000);
|
content = content.substr(0, 5000);
|
||||||
@@ -61,7 +65,7 @@ async function openai(io, socket, tables, dbClient, data){
|
|||||||
socketId: data.socketId,
|
socketId: data.socketId,
|
||||||
device: userAgent,
|
device: userAgent,
|
||||||
flag: 0,
|
flag: 0,
|
||||||
content: decodeURIComponent(data.content),
|
content: utils.unescapeStr(data.content),
|
||||||
handshake: JSON.stringify(handshake),
|
handshake: JSON.stringify(handshake),
|
||||||
ip: ip
|
ip: ip
|
||||||
}, tables, dbClient);
|
}, tables, dbClient);
|
||||||
@@ -85,6 +89,7 @@ async function openai(io, socket, tables, dbClient, data){
|
|||||||
});
|
});
|
||||||
bussinessNotify.sendSystemErrorMsg({
|
bussinessNotify.sendSystemErrorMsg({
|
||||||
title: "socket-openai",
|
title: "socket-openai",
|
||||||
|
data: JSON.stringify(data),
|
||||||
room: data.room,
|
room: data.room,
|
||||||
from : socket.id,
|
from : socket.id,
|
||||||
msg : JSON.stringify({
|
msg : JSON.stringify({
|
||||||
|
@@ -1,7 +1,11 @@
|
|||||||
const checkLib = require("./core").trie
|
const checkLib = require("./core").trie
|
||||||
const utils = require("../../../src/utils/utils");
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 内容过滤
|
||||||
|
* @param {*} text
|
||||||
|
* @param {*} replaceChar
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
function contentFilter(text, replaceChar = '*') {
|
function contentFilter(text, replaceChar = '*') {
|
||||||
let filteredText = '';
|
let filteredText = '';
|
||||||
let currentIndex = 0;
|
let currentIndex = 0;
|
||||||
@@ -19,9 +23,32 @@ function contentFilter(text, replaceChar = '*') {
|
|||||||
return filteredText;
|
return filteredText;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
/**
|
||||||
contentFilter
|
* 对象内容过滤
|
||||||
|
* @param {*} text
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function objectContentFilter(obj) {
|
||||||
|
if (obj === null || obj === undefined) {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
if (typeof obj === 'string') {
|
||||||
|
return contentFilter(obj);
|
||||||
|
}
|
||||||
|
if (typeof obj === 'object') {
|
||||||
|
if (obj instanceof Array) {
|
||||||
|
return obj.map(item => objectContentFilter(item));
|
||||||
|
} else {
|
||||||
|
const newObj = {};
|
||||||
|
for (const key in obj) {
|
||||||
|
newObj[key] = objectContentFilter(obj[key]);
|
||||||
|
}
|
||||||
|
return newObj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
utils.tlConsole(contentFilter("草泥马"))
|
contentFilter, objectContentFilter
|
||||||
|
}
|
@@ -37,6 +37,16 @@ class Trie {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toJson() {
|
||||||
|
//将树转换为json
|
||||||
|
return JSON.stringify(this.root, (key, value) => {
|
||||||
|
if (key === 'children') {
|
||||||
|
return [...value];
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 敏感词库
|
// 敏感词库
|
||||||
|
1
svr/src/utils/check/words.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
module.exports = []
|
@@ -1,4 +1,5 @@
|
|||||||
const os = require('os');
|
const os = require('os');
|
||||||
|
const crypto = require('crypto');
|
||||||
const cfg = require('./../../conf/cfg.json');
|
const cfg = require('./../../conf/cfg.json');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -146,9 +147,6 @@ function getFileSizeStr(size) {
|
|||||||
return head + '.' + tail + "M";
|
return head + '.' + tail + "M";
|
||||||
}
|
}
|
||||||
|
|
||||||
// const style = "color: yellow; font-style: italic; background-color: black; padding: 5px; font-weight: bold; font-family: system-ui;"
|
|
||||||
// console.log( `%ctl-rtc-file-${cfg.version} \t ${msg}`, style );
|
|
||||||
|
|
||||||
function tlConsole(...msg){
|
function tlConsole(...msg){
|
||||||
console.log(`\x1B[1m${new Date().toLocaleString()}\x1B[0m \x1B[40m\x1B[33m tl-rtc-file-${cfg.version} \x1B[0m : \x1B[36m%s\x1B[0m`,...msg)
|
console.log(`\x1B[1m${new Date().toLocaleString()}\x1B[0m \x1B[40m\x1B[33m tl-rtc-file-${cfg.version} \x1B[0m : \x1B[36m%s\x1B[0m`,...msg)
|
||||||
}
|
}
|
||||||
@@ -171,6 +169,136 @@ ${".".repeat(process.stdout.columns - 2)}
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成客户端控制台打印logo
|
||||||
|
*/
|
||||||
|
function genClientLogo(){
|
||||||
|
let style = "font-size:20px;color: black; font-style: italic;";
|
||||||
|
style += "font-weight: bold; font-family: system-ui;";
|
||||||
|
style += "padding: 8px;cursor: pointer;"
|
||||||
|
return style;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成turn服务的iceServers配置
|
||||||
|
* @param {*} withTurn
|
||||||
|
* @param {*} useSecret
|
||||||
|
* @param {*} username
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function genTurnServerIceServersConfig(withTurn, useSecret, username){
|
||||||
|
let iceServers = [{
|
||||||
|
urls : cfg.webrtc.stun.host
|
||||||
|
}];
|
||||||
|
|
||||||
|
//无需turn中继
|
||||||
|
if(!withTurn){
|
||||||
|
return iceServers;
|
||||||
|
}
|
||||||
|
|
||||||
|
//turn固定账号模式
|
||||||
|
if(!useSecret){
|
||||||
|
iceServers.push({
|
||||||
|
urls : cfg.webrtc.turn.host,
|
||||||
|
username: cfg.webrtc.turn.username,
|
||||||
|
credential: cfg.webrtc.turn.credential
|
||||||
|
})
|
||||||
|
return iceServers;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 有效账号模式
|
||||||
|
const secret = cfg.webrtc.turn.secret || "tlrtcfile";
|
||||||
|
//生成账号的有效期
|
||||||
|
const expirseTime = 60 * 60 * 24 * 1000;
|
||||||
|
//当前时间
|
||||||
|
const time = new Date().getTime();
|
||||||
|
//turn服务的用户名规则
|
||||||
|
const turnUsername = `${time + expirseTime}:${username}`;
|
||||||
|
//turn服务的密码规则
|
||||||
|
const dig = crypto.createHmac('sha1', secret).update(turnUsername).digest();
|
||||||
|
const turnPassword = Buffer.from(dig, 'utf-8').toString('base64');
|
||||||
|
|
||||||
|
iceServers.push({
|
||||||
|
urls : cfg.webrtc.turn.host,
|
||||||
|
username: turnUsername,
|
||||||
|
credential: turnPassword
|
||||||
|
})
|
||||||
|
|
||||||
|
return iceServers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转义字符串
|
||||||
|
* @param {*} str
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function escapeStr(str) {
|
||||||
|
const entityMap = {
|
||||||
|
'&': '&',
|
||||||
|
'<': '<',
|
||||||
|
'>': '>',
|
||||||
|
'"': '"',
|
||||||
|
"'": ''',
|
||||||
|
'/': '/',
|
||||||
|
'`': '`',
|
||||||
|
'=': '='
|
||||||
|
};
|
||||||
|
|
||||||
|
const encodedMap = {
|
||||||
|
'%': '%25',
|
||||||
|
'!': '%21',
|
||||||
|
"'": '%27',
|
||||||
|
'(': '%28',
|
||||||
|
')': '%29',
|
||||||
|
'*': '%2A',
|
||||||
|
'-': '%2D',
|
||||||
|
'.': '%2E',
|
||||||
|
'_': '%5F',
|
||||||
|
'~': '%7E'
|
||||||
|
};
|
||||||
|
|
||||||
|
return String(str).replace(/[&<>"'`=\/%!'()*\-._~]/g, function (s) {
|
||||||
|
return entityMap[s] || encodedMap[s] || '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析转义字符串
|
||||||
|
* @param {*} str
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function unescapeStr(str) {
|
||||||
|
const entityMap = {
|
||||||
|
'&': '&',
|
||||||
|
'<': '<',
|
||||||
|
'>': '>',
|
||||||
|
'"': '"',
|
||||||
|
''': "'",
|
||||||
|
'/': '/',
|
||||||
|
'`': '`',
|
||||||
|
'=': '='
|
||||||
|
};
|
||||||
|
|
||||||
|
const encodedMap = {
|
||||||
|
'%25': '%',
|
||||||
|
'%21': '!',
|
||||||
|
'%27': "'",
|
||||||
|
'%28': '(',
|
||||||
|
'%29': ')',
|
||||||
|
'%2A': '*',
|
||||||
|
'%2D': '-',
|
||||||
|
'%2E': '.',
|
||||||
|
'%5F': '_',
|
||||||
|
'%7E': '~'
|
||||||
|
};
|
||||||
|
|
||||||
|
return String(str).replace(/&(amp|lt|gt|quot|#39|#x2F|#x60|#x3D);|%(25|21|27|28|29|2A|2D|2E|5F|7E)/g, function (s) {
|
||||||
|
return entityMap[s] || encodedMap[s] || '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
getLocalIP,
|
getLocalIP,
|
||||||
getClientIP,
|
getClientIP,
|
||||||
@@ -181,5 +309,9 @@ module.exports = {
|
|||||||
getSocketClientInfo,
|
getSocketClientInfo,
|
||||||
getFileSizeStr,
|
getFileSizeStr,
|
||||||
tlConsole,
|
tlConsole,
|
||||||
tlConsoleIcon
|
tlConsoleIcon,
|
||||||
|
genTurnServerIceServersConfig,
|
||||||
|
genClientLogo,
|
||||||
|
unescapeStr,
|
||||||
|
escapeStr
|
||||||
}
|
}
|
11
svr/start-local.sh
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
pm2 start npm --name=tl-rtc-file-api-local -- run lapi
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
pm2 start npm --name=tl-rtc-file-socket-local -- run lsocket
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
cd build/webpack
|
||||||
|
|
||||||
|
pm2 start npm --name=tl-rtc-file-build-local -- run dev
|
5
svr/start-server.sh
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
pm2 start npm --name=tl-rtc-file-api-server -- run sapi
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
pm2 start npm --name=tl-rtc-file-socket-server -- run ssocket
|
539
svr/static/layui/font-ext/demo.css
Normal file
@@ -0,0 +1,539 @@
|
|||||||
|
/* Logo 字体 */
|
||||||
|
@font-face {
|
||||||
|
font-family: "iconfont logo";
|
||||||
|
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
|
||||||
|
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
|
||||||
|
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
|
||||||
|
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
|
||||||
|
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
font-family: "iconfont logo";
|
||||||
|
font-size: 160px;
|
||||||
|
font-style: normal;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tabs */
|
||||||
|
.nav-tabs {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-tabs .nav-more {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
height: 42px;
|
||||||
|
line-height: 42px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tabs {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tabs li {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 100px;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 16px;
|
||||||
|
border-bottom: 2px solid transparent;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
margin-bottom: -1px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#tabs .active {
|
||||||
|
border-bottom-color: #f00;
|
||||||
|
color: #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-container .content {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 页面布局 */
|
||||||
|
.main {
|
||||||
|
padding: 30px 100px;
|
||||||
|
width: 960px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .logo {
|
||||||
|
color: #333;
|
||||||
|
text-align: left;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
line-height: 1;
|
||||||
|
height: 110px;
|
||||||
|
margin-top: -50px;
|
||||||
|
overflow: hidden;
|
||||||
|
*zoom: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .logo a {
|
||||||
|
font-size: 160px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.helps {
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.helps pre {
|
||||||
|
padding: 20px;
|
||||||
|
margin: 10px 0;
|
||||||
|
border: solid 1px #e7e1cd;
|
||||||
|
background-color: #fffdef;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists {
|
||||||
|
width: 100% !important;
|
||||||
|
overflow: hidden;
|
||||||
|
*zoom: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists li {
|
||||||
|
width: 100px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
margin-right: 20px;
|
||||||
|
text-align: center;
|
||||||
|
list-style: none !important;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists li .code-name {
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists .icon {
|
||||||
|
display: block;
|
||||||
|
height: 100px;
|
||||||
|
line-height: 100px;
|
||||||
|
font-size: 42px;
|
||||||
|
margin: 10px auto;
|
||||||
|
color: #333;
|
||||||
|
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
|
||||||
|
-moz-transition: font-size 0.25s linear, width 0.25s linear;
|
||||||
|
transition: font-size 0.25s linear, width 0.25s linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists .icon:hover {
|
||||||
|
font-size: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists .svg-icon {
|
||||||
|
/* 通过设置 font-size 来改变图标大小 */
|
||||||
|
width: 1em;
|
||||||
|
/* 图标和文字相邻时,垂直对齐 */
|
||||||
|
vertical-align: -0.15em;
|
||||||
|
/* 通过设置 color 来改变 SVG 的颜色/fill */
|
||||||
|
fill: currentColor;
|
||||||
|
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
|
||||||
|
normalize.css 中也包含这行 */
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_lists li .name,
|
||||||
|
.icon_lists li .code-name {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* markdown 样式 */
|
||||||
|
.markdown {
|
||||||
|
color: #666;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight {
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown img {
|
||||||
|
vertical-align: middle;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h1 {
|
||||||
|
color: #404040;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 40px;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h2,
|
||||||
|
.markdown h3,
|
||||||
|
.markdown h4,
|
||||||
|
.markdown h5,
|
||||||
|
.markdown h6 {
|
||||||
|
color: #404040;
|
||||||
|
margin: 1.6em 0 0.6em 0;
|
||||||
|
font-weight: 500;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h1 {
|
||||||
|
font-size: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h2 {
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h3 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h4 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h5 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h6 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown hr {
|
||||||
|
height: 1px;
|
||||||
|
border: 0;
|
||||||
|
background: #e9e9e9;
|
||||||
|
margin: 16px 0;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown p {
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>p,
|
||||||
|
.markdown>blockquote,
|
||||||
|
.markdown>.highlight,
|
||||||
|
.markdown>ol,
|
||||||
|
.markdown>ul {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown ul>li {
|
||||||
|
list-style: circle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>ul li,
|
||||||
|
.markdown blockquote ul>li {
|
||||||
|
margin-left: 20px;
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>ul li p,
|
||||||
|
.markdown>ol li p {
|
||||||
|
margin: 0.6em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown ol>li {
|
||||||
|
list-style: decimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>ol li,
|
||||||
|
.markdown blockquote ol>li {
|
||||||
|
margin-left: 20px;
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown code {
|
||||||
|
margin: 0 3px;
|
||||||
|
padding: 0 5px;
|
||||||
|
background: #eee;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown strong,
|
||||||
|
.markdown b {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0px;
|
||||||
|
empty-cells: show;
|
||||||
|
border: 1px solid #e9e9e9;
|
||||||
|
width: 95%;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>table th {
|
||||||
|
white-space: nowrap;
|
||||||
|
color: #333;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>table th,
|
||||||
|
.markdown>table td {
|
||||||
|
border: 1px solid #e9e9e9;
|
||||||
|
padding: 8px 16px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>table th {
|
||||||
|
background: #F7F7F7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown blockquote {
|
||||||
|
font-size: 90%;
|
||||||
|
color: #999;
|
||||||
|
border-left: 4px solid #e9e9e9;
|
||||||
|
padding-left: 0.8em;
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown blockquote p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown .anchor {
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown .waiting {
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown h1:hover .anchor,
|
||||||
|
.markdown h2:hover .anchor,
|
||||||
|
.markdown h3:hover .anchor,
|
||||||
|
.markdown h4:hover .anchor,
|
||||||
|
.markdown h5:hover .anchor,
|
||||||
|
.markdown h6:hover .anchor {
|
||||||
|
opacity: 1;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown>br,
|
||||||
|
.markdown>p>br {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.hljs {
|
||||||
|
display: block;
|
||||||
|
background: white;
|
||||||
|
padding: 0.5em;
|
||||||
|
color: #333333;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-comment,
|
||||||
|
.hljs-meta {
|
||||||
|
color: #969896;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-string,
|
||||||
|
.hljs-variable,
|
||||||
|
.hljs-template-variable,
|
||||||
|
.hljs-strong,
|
||||||
|
.hljs-emphasis,
|
||||||
|
.hljs-quote {
|
||||||
|
color: #df5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-keyword,
|
||||||
|
.hljs-selector-tag,
|
||||||
|
.hljs-type {
|
||||||
|
color: #a71d5d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-literal,
|
||||||
|
.hljs-symbol,
|
||||||
|
.hljs-bullet,
|
||||||
|
.hljs-attribute {
|
||||||
|
color: #0086b3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-section,
|
||||||
|
.hljs-name {
|
||||||
|
color: #63a35c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-tag {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-title,
|
||||||
|
.hljs-attr,
|
||||||
|
.hljs-selector-id,
|
||||||
|
.hljs-selector-class,
|
||||||
|
.hljs-selector-attr,
|
||||||
|
.hljs-selector-pseudo {
|
||||||
|
color: #795da3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-addition {
|
||||||
|
color: #55a532;
|
||||||
|
background-color: #eaffea;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-deletion {
|
||||||
|
color: #bd2c00;
|
||||||
|
background-color: #ffecec;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-link {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 代码高亮 */
|
||||||
|
/* PrismJS 1.15.0
|
||||||
|
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
|
||||||
|
/**
|
||||||
|
* prism.js default theme for JavaScript, CSS and HTML
|
||||||
|
* Based on dabblet (http://dabblet.com)
|
||||||
|
* @author Lea Verou
|
||||||
|
*/
|
||||||
|
code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
color: black;
|
||||||
|
background: none;
|
||||||
|
text-shadow: 0 1px white;
|
||||||
|
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||||
|
text-align: left;
|
||||||
|
white-space: pre;
|
||||||
|
word-spacing: normal;
|
||||||
|
word-break: normal;
|
||||||
|
word-wrap: normal;
|
||||||
|
line-height: 1.5;
|
||||||
|
|
||||||
|
-moz-tab-size: 4;
|
||||||
|
-o-tab-size: 4;
|
||||||
|
tab-size: 4;
|
||||||
|
|
||||||
|
-webkit-hyphens: none;
|
||||||
|
-moz-hyphens: none;
|
||||||
|
-ms-hyphens: none;
|
||||||
|
hyphens: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[class*="language-"]::-moz-selection,
|
||||||
|
pre[class*="language-"] ::-moz-selection,
|
||||||
|
code[class*="language-"]::-moz-selection,
|
||||||
|
code[class*="language-"] ::-moz-selection {
|
||||||
|
text-shadow: none;
|
||||||
|
background: #b3d4fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[class*="language-"]::selection,
|
||||||
|
pre[class*="language-"] ::selection,
|
||||||
|
code[class*="language-"]::selection,
|
||||||
|
code[class*="language-"] ::selection {
|
||||||
|
text-shadow: none;
|
||||||
|
background: #b3d4fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
|
||||||
|
code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Code blocks */
|
||||||
|
pre[class*="language-"] {
|
||||||
|
padding: 1em;
|
||||||
|
margin: .5em 0;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
:not(pre)>code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
background: #f5f2f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inline code */
|
||||||
|
:not(pre)>code[class*="language-"] {
|
||||||
|
padding: .1em;
|
||||||
|
border-radius: .3em;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.comment,
|
||||||
|
.token.prolog,
|
||||||
|
.token.doctype,
|
||||||
|
.token.cdata {
|
||||||
|
color: slategray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.punctuation {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.namespace {
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.property,
|
||||||
|
.token.tag,
|
||||||
|
.token.boolean,
|
||||||
|
.token.number,
|
||||||
|
.token.constant,
|
||||||
|
.token.symbol,
|
||||||
|
.token.deleted {
|
||||||
|
color: #905;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.selector,
|
||||||
|
.token.attr-name,
|
||||||
|
.token.string,
|
||||||
|
.token.char,
|
||||||
|
.token.builtin,
|
||||||
|
.token.inserted {
|
||||||
|
color: #690;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.operator,
|
||||||
|
.token.entity,
|
||||||
|
.token.url,
|
||||||
|
.language-css .token.string,
|
||||||
|
.style .token.string {
|
||||||
|
color: #9a6e3a;
|
||||||
|
background: hsla(0, 0%, 100%, .5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.atrule,
|
||||||
|
.token.attr-value,
|
||||||
|
.token.keyword {
|
||||||
|
color: #07a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.function,
|
||||||
|
.token.class-name {
|
||||||
|
color: #DD4A68;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.regex,
|
||||||
|
.token.important,
|
||||||
|
.token.variable {
|
||||||
|
color: #e90;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.important,
|
||||||
|
.token.bold {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.italic {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.entity {
|
||||||
|
cursor: help;
|
||||||
|
}
|
1959
svr/static/layui/font-ext/demo_index.html
Normal file
323
svr/static/layui/font-ext/iconfont.css
Normal file
@@ -0,0 +1,323 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: "iconfont"; /* Project id 4147343 */
|
||||||
|
src: url('iconfont.woff2?t=1688291642630') format('woff2'),
|
||||||
|
url('iconfont.woff?t=1688291642630') format('woff'),
|
||||||
|
url('iconfont.ttf?t=1688291642630') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconfont {
|
||||||
|
font-family: "iconfont" !important;
|
||||||
|
font-size: 16px;
|
||||||
|
font-style: normal;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-sanjiaoxing:before {
|
||||||
|
content: "\e619";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-xiangshangsanjiaoxing:before {
|
||||||
|
content: "\e70f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-xingxing:before {
|
||||||
|
content: "\e61a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-xingxing1:before {
|
||||||
|
content: "\e639";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-tx-fill-pinghangsibianxing:before {
|
||||||
|
content: "\e64c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-tx-fill-liubianxing:before {
|
||||||
|
content: "\e64b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-pinghangsibianxing:before {
|
||||||
|
content: "\edf9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-hexagon:before {
|
||||||
|
content: "\e61b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-AIzhineng:before {
|
||||||
|
content: "\e679";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-PP-:before {
|
||||||
|
content: "\e618";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-github:before {
|
||||||
|
content: "\e66f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-Excel:before {
|
||||||
|
content: "\e602";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-File:before {
|
||||||
|
content: "\e603";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-Word:before {
|
||||||
|
content: "\e605";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-PPT:before {
|
||||||
|
content: "\e606";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-music:before {
|
||||||
|
content: "\e607";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-chengxu:before {
|
||||||
|
content: "\e608";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-shipin:before {
|
||||||
|
content: "\e609";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-lianjiewenjian:before {
|
||||||
|
content: "\e60a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-tupian:before {
|
||||||
|
content: "\e60b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-yasuobao:before {
|
||||||
|
content: "\e60c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-weizhiwenjian:before {
|
||||||
|
content: "\e60d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-Gif:before {
|
||||||
|
content: "\e60e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-Exe:before {
|
||||||
|
content: "\e60f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-Pdf:before {
|
||||||
|
content: "\e610";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-txt1:before {
|
||||||
|
content: "\e611";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-WPS:before {
|
||||||
|
content: "\e612";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-shujuku:before {
|
||||||
|
content: "\e613";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-a-3D:before {
|
||||||
|
content: "\e614";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-youjian:before {
|
||||||
|
content: "\e616";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-peizhiwenjian:before {
|
||||||
|
content: "\e617";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-duoyuyan:before {
|
||||||
|
content: "\e659";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-WIFI:before {
|
||||||
|
content: "\e700";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-doc:before {
|
||||||
|
content: "\e652";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-jpg:before {
|
||||||
|
content: "\e653";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-html:before {
|
||||||
|
content: "\e654";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-icon_MP-:before {
|
||||||
|
content: "\e655";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-png:before {
|
||||||
|
content: "\e657";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-dll:before {
|
||||||
|
content: "\e658";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-mp4:before {
|
||||||
|
content: "\e65a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-pdf:before {
|
||||||
|
content: "\e65b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-gif:before {
|
||||||
|
content: "\e65c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-exe:before {
|
||||||
|
content: "\e65d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-mpg:before {
|
||||||
|
content: "\e65e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-psd:before {
|
||||||
|
content: "\e65f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-mkv:before {
|
||||||
|
content: "\e660";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-xls:before {
|
||||||
|
content: "\e661";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-rmvb:before {
|
||||||
|
content: "\e662";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-wav:before {
|
||||||
|
content: "\e664";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-swf:before {
|
||||||
|
content: "\e665";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-avi:before {
|
||||||
|
content: "\e666";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-zip1:before {
|
||||||
|
content: "\e667";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-othe:before {
|
||||||
|
content: "\e668";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-ppt:before {
|
||||||
|
content: "\e650";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-txt:before {
|
||||||
|
content: "\e651";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-PDF:before {
|
||||||
|
content: "\e601";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-daimawenjian_file-code:before {
|
||||||
|
content: "\e621";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-jinggao:before {
|
||||||
|
content: "\e600";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-hongbao:before {
|
||||||
|
content: "\e656";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-yuanjiao-rect:before {
|
||||||
|
content: "\e64e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-circle:before {
|
||||||
|
content: "\e64f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-xiangpica:before {
|
||||||
|
content: "\e6b8";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-icon-test:before {
|
||||||
|
content: "\e672";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-wenzi:before {
|
||||||
|
content: "\e6ec";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-zhu:before {
|
||||||
|
content: "\e689";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-yunfuwuqi:before {
|
||||||
|
content: "\e615";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-juxing:before {
|
||||||
|
content: "\e620";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-yuanxing:before {
|
||||||
|
content: "\e626";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-xiazai:before {
|
||||||
|
content: "\e638";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-tupian_huaban:before {
|
||||||
|
content: "\e691";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-gongju:before {
|
||||||
|
content: "\e6cf";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-yonghufankuibeifen:before {
|
||||||
|
content: "\e604";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-five-g:before {
|
||||||
|
content: "\e63f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-three-g:before {
|
||||||
|
content: "\e640";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-four-g:before {
|
||||||
|
content: "\e641";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-two-g:before {
|
||||||
|
content: "\e642";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-rtc-file-zhengque:before {
|
||||||
|
content: "\ec6b";
|
||||||
|
}
|
||||||
|
|
1
svr/static/layui/font-ext/iconfont.js
Normal file
548
svr/static/layui/font-ext/iconfont.json
Normal file
@@ -0,0 +1,548 @@
|
|||||||
|
{
|
||||||
|
"id": "4147343",
|
||||||
|
"name": "file",
|
||||||
|
"font_family": "iconfont",
|
||||||
|
"css_prefix_text": "icon-rtc-file-",
|
||||||
|
"description": "",
|
||||||
|
"glyphs": [
|
||||||
|
{
|
||||||
|
"icon_id": "3101162",
|
||||||
|
"name": "三角形",
|
||||||
|
"font_class": "sanjiaoxing",
|
||||||
|
"unicode": "e619",
|
||||||
|
"unicode_decimal": 58905
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6874514",
|
||||||
|
"name": "向上三角形",
|
||||||
|
"font_class": "xiangshangsanjiaoxing",
|
||||||
|
"unicode": "e70f",
|
||||||
|
"unicode_decimal": 59151
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "8727201",
|
||||||
|
"name": "星星",
|
||||||
|
"font_class": "xingxing",
|
||||||
|
"unicode": "e61a",
|
||||||
|
"unicode_decimal": 58906
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "10715456",
|
||||||
|
"name": "星星",
|
||||||
|
"font_class": "xingxing1",
|
||||||
|
"unicode": "e639",
|
||||||
|
"unicode_decimal": 58937
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "14718685",
|
||||||
|
"name": "tx-fill-平行四边形",
|
||||||
|
"font_class": "tx-fill-pinghangsibianxing",
|
||||||
|
"unicode": "e64c",
|
||||||
|
"unicode_decimal": 58956
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "14718689",
|
||||||
|
"name": "tx-fill-六边形",
|
||||||
|
"font_class": "tx-fill-liubianxing",
|
||||||
|
"unicode": "e64b",
|
||||||
|
"unicode_decimal": 58955
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22383635",
|
||||||
|
"name": "平行四边形",
|
||||||
|
"font_class": "pinghangsibianxing",
|
||||||
|
"unicode": "edf9",
|
||||||
|
"unicode_decimal": 60921
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "27938688",
|
||||||
|
"name": "六边形",
|
||||||
|
"font_class": "hexagon",
|
||||||
|
"unicode": "e61b",
|
||||||
|
"unicode_decimal": 58907
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6537210",
|
||||||
|
"name": "AI智能",
|
||||||
|
"font_class": "AIzhineng",
|
||||||
|
"unicode": "e679",
|
||||||
|
"unicode_decimal": 59001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "3827634",
|
||||||
|
"name": "P2P",
|
||||||
|
"font_class": "PP-",
|
||||||
|
"unicode": "e618",
|
||||||
|
"unicode_decimal": 58904
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "14401714",
|
||||||
|
"name": "github",
|
||||||
|
"font_class": "github",
|
||||||
|
"unicode": "e66f",
|
||||||
|
"unicode_decimal": 58991
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22725966",
|
||||||
|
"name": "文件类型-Excel",
|
||||||
|
"font_class": "Excel",
|
||||||
|
"unicode": "e602",
|
||||||
|
"unicode_decimal": 58882
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22735864",
|
||||||
|
"name": "文件类型-文件夹",
|
||||||
|
"font_class": "File",
|
||||||
|
"unicode": "e603",
|
||||||
|
"unicode_decimal": 58883
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22735865",
|
||||||
|
"name": "文件类型-Word",
|
||||||
|
"font_class": "Word",
|
||||||
|
"unicode": "e605",
|
||||||
|
"unicode_decimal": 58885
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22735866",
|
||||||
|
"name": "文件类型-PPT",
|
||||||
|
"font_class": "PPT",
|
||||||
|
"unicode": "e606",
|
||||||
|
"unicode_decimal": 58886
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22735867",
|
||||||
|
"name": "文件类型-音频",
|
||||||
|
"font_class": "music",
|
||||||
|
"unicode": "e607",
|
||||||
|
"unicode_decimal": 58887
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761828",
|
||||||
|
"name": "文件类型-程序",
|
||||||
|
"font_class": "chengxu",
|
||||||
|
"unicode": "e608",
|
||||||
|
"unicode_decimal": 58888
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761829",
|
||||||
|
"name": "文件类型-视频",
|
||||||
|
"font_class": "shipin",
|
||||||
|
"unicode": "e609",
|
||||||
|
"unicode_decimal": 58889
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761830",
|
||||||
|
"name": "文件类型-链接",
|
||||||
|
"font_class": "lianjiewenjian",
|
||||||
|
"unicode": "e60a",
|
||||||
|
"unicode_decimal": 58890
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761831",
|
||||||
|
"name": "文件类型-图片",
|
||||||
|
"font_class": "tupian",
|
||||||
|
"unicode": "e60b",
|
||||||
|
"unicode_decimal": 58891
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761832",
|
||||||
|
"name": "文件类型-压缩包",
|
||||||
|
"font_class": "yasuobao",
|
||||||
|
"unicode": "e60c",
|
||||||
|
"unicode_decimal": 58892
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761833",
|
||||||
|
"name": "文件类型-未知文件",
|
||||||
|
"font_class": "weizhiwenjian",
|
||||||
|
"unicode": "e60d",
|
||||||
|
"unicode_decimal": 58893
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761834",
|
||||||
|
"name": "文件类型-Gif",
|
||||||
|
"font_class": "Gif",
|
||||||
|
"unicode": "e60e",
|
||||||
|
"unicode_decimal": 58894
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761835",
|
||||||
|
"name": "文件类型-Exe",
|
||||||
|
"font_class": "Exe",
|
||||||
|
"unicode": "e60f",
|
||||||
|
"unicode_decimal": 58895
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761836",
|
||||||
|
"name": "文件类型-Pdf",
|
||||||
|
"font_class": "Pdf",
|
||||||
|
"unicode": "e610",
|
||||||
|
"unicode_decimal": 58896
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22761837",
|
||||||
|
"name": "文件类型-Txt",
|
||||||
|
"font_class": "txt1",
|
||||||
|
"unicode": "e611",
|
||||||
|
"unicode_decimal": 58897
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22767524",
|
||||||
|
"name": "文件类型-WPS",
|
||||||
|
"font_class": "WPS",
|
||||||
|
"unicode": "e612",
|
||||||
|
"unicode_decimal": 58898
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22767526",
|
||||||
|
"name": "文件类型-数据库",
|
||||||
|
"font_class": "shujuku",
|
||||||
|
"unicode": "e613",
|
||||||
|
"unicode_decimal": 58899
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22767545",
|
||||||
|
"name": "文件类型-3D",
|
||||||
|
"font_class": "a-3D",
|
||||||
|
"unicode": "e614",
|
||||||
|
"unicode_decimal": 58900
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22770102",
|
||||||
|
"name": "文件类型-邮件",
|
||||||
|
"font_class": "youjian",
|
||||||
|
"unicode": "e616",
|
||||||
|
"unicode_decimal": 58902
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22770103",
|
||||||
|
"name": "文件类型-配置文件",
|
||||||
|
"font_class": "peizhiwenjian",
|
||||||
|
"unicode": "e617",
|
||||||
|
"unicode_decimal": 58903
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "658008",
|
||||||
|
"name": "多语言",
|
||||||
|
"font_class": "duoyuyan",
|
||||||
|
"unicode": "e659",
|
||||||
|
"unicode_decimal": 58969
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1906325",
|
||||||
|
"name": "WIFI",
|
||||||
|
"font_class": "WIFI",
|
||||||
|
"unicode": "e700",
|
||||||
|
"unicode_decimal": 59136
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031002",
|
||||||
|
"name": "doc",
|
||||||
|
"font_class": "doc",
|
||||||
|
"unicode": "e652",
|
||||||
|
"unicode_decimal": 58962
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031003",
|
||||||
|
"name": "jpg",
|
||||||
|
"font_class": "jpg",
|
||||||
|
"unicode": "e653",
|
||||||
|
"unicode_decimal": 58963
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031004",
|
||||||
|
"name": "html",
|
||||||
|
"font_class": "html",
|
||||||
|
"unicode": "e654",
|
||||||
|
"unicode_decimal": 58964
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031005",
|
||||||
|
"name": "mp3",
|
||||||
|
"font_class": "icon_MP-",
|
||||||
|
"unicode": "e655",
|
||||||
|
"unicode_decimal": 58965
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031006",
|
||||||
|
"name": "png",
|
||||||
|
"font_class": "png",
|
||||||
|
"unicode": "e657",
|
||||||
|
"unicode_decimal": 58967
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031007",
|
||||||
|
"name": "dll",
|
||||||
|
"font_class": "dll",
|
||||||
|
"unicode": "e658",
|
||||||
|
"unicode_decimal": 58968
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031009",
|
||||||
|
"name": "mp4",
|
||||||
|
"font_class": "mp4",
|
||||||
|
"unicode": "e65a",
|
||||||
|
"unicode_decimal": 58970
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031010",
|
||||||
|
"name": "pdf",
|
||||||
|
"font_class": "pdf",
|
||||||
|
"unicode": "e65b",
|
||||||
|
"unicode_decimal": 58971
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031011",
|
||||||
|
"name": "gif",
|
||||||
|
"font_class": "gif",
|
||||||
|
"unicode": "e65c",
|
||||||
|
"unicode_decimal": 58972
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031012",
|
||||||
|
"name": "exe",
|
||||||
|
"font_class": "exe",
|
||||||
|
"unicode": "e65d",
|
||||||
|
"unicode_decimal": 58973
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031013",
|
||||||
|
"name": "mpg",
|
||||||
|
"font_class": "mpg",
|
||||||
|
"unicode": "e65e",
|
||||||
|
"unicode_decimal": 58974
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031014",
|
||||||
|
"name": "psd",
|
||||||
|
"font_class": "psd",
|
||||||
|
"unicode": "e65f",
|
||||||
|
"unicode_decimal": 58975
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031015",
|
||||||
|
"name": "mkv",
|
||||||
|
"font_class": "mkv",
|
||||||
|
"unicode": "e660",
|
||||||
|
"unicode_decimal": 58976
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031016",
|
||||||
|
"name": "xls",
|
||||||
|
"font_class": "xls",
|
||||||
|
"unicode": "e661",
|
||||||
|
"unicode_decimal": 58977
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031017",
|
||||||
|
"name": "rmvb",
|
||||||
|
"font_class": "rmvb",
|
||||||
|
"unicode": "e662",
|
||||||
|
"unicode_decimal": 58978
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031019",
|
||||||
|
"name": "wav",
|
||||||
|
"font_class": "wav",
|
||||||
|
"unicode": "e664",
|
||||||
|
"unicode_decimal": 58980
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031020",
|
||||||
|
"name": "swf",
|
||||||
|
"font_class": "swf",
|
||||||
|
"unicode": "e665",
|
||||||
|
"unicode_decimal": 58981
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031021",
|
||||||
|
"name": "avi",
|
||||||
|
"font_class": "avi",
|
||||||
|
"unicode": "e666",
|
||||||
|
"unicode_decimal": 58982
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4033510",
|
||||||
|
"name": "zip",
|
||||||
|
"font_class": "zip1",
|
||||||
|
"unicode": "e667",
|
||||||
|
"unicode_decimal": 58983
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4033741",
|
||||||
|
"name": "othe",
|
||||||
|
"font_class": "othe",
|
||||||
|
"unicode": "e668",
|
||||||
|
"unicode_decimal": 58984
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031008",
|
||||||
|
"name": "ppt",
|
||||||
|
"font_class": "ppt",
|
||||||
|
"unicode": "e650",
|
||||||
|
"unicode_decimal": 58960
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4031018",
|
||||||
|
"name": "txt",
|
||||||
|
"font_class": "txt",
|
||||||
|
"unicode": "e651",
|
||||||
|
"unicode_decimal": 58961
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "17880986",
|
||||||
|
"name": "PDF",
|
||||||
|
"font_class": "PDF",
|
||||||
|
"unicode": "e601",
|
||||||
|
"unicode_decimal": 58881
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "33390112",
|
||||||
|
"name": "代码文件_file-code",
|
||||||
|
"font_class": "daimawenjian_file-code",
|
||||||
|
"unicode": "e621",
|
||||||
|
"unicode_decimal": 58913
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "124495",
|
||||||
|
"name": "警告",
|
||||||
|
"font_class": "jinggao",
|
||||||
|
"unicode": "e600",
|
||||||
|
"unicode_decimal": 58880
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "683275",
|
||||||
|
"name": "红包",
|
||||||
|
"font_class": "hongbao",
|
||||||
|
"unicode": "e656",
|
||||||
|
"unicode_decimal": 58966
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "755610",
|
||||||
|
"name": "圆角矩形",
|
||||||
|
"font_class": "yuanjiao-rect",
|
||||||
|
"unicode": "e64e",
|
||||||
|
"unicode_decimal": 58958
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "755612",
|
||||||
|
"name": "圆形",
|
||||||
|
"font_class": "circle",
|
||||||
|
"unicode": "e64f",
|
||||||
|
"unicode_decimal": 58959
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1057040",
|
||||||
|
"name": "橡皮擦",
|
||||||
|
"font_class": "xiangpica",
|
||||||
|
"unicode": "e6b8",
|
||||||
|
"unicode_decimal": 59064
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "1909028",
|
||||||
|
"name": "头像 男孩",
|
||||||
|
"font_class": "icon-test",
|
||||||
|
"unicode": "e672",
|
||||||
|
"unicode_decimal": 58994
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4890393",
|
||||||
|
"name": "文字",
|
||||||
|
"font_class": "wenzi",
|
||||||
|
"unicode": "e6ec",
|
||||||
|
"unicode_decimal": 59116
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "6996983",
|
||||||
|
"name": "猪",
|
||||||
|
"font_class": "zhu",
|
||||||
|
"unicode": "e689",
|
||||||
|
"unicode_decimal": 59017
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "9959300",
|
||||||
|
"name": "云服务器",
|
||||||
|
"font_class": "yunfuwuqi",
|
||||||
|
"unicode": "e615",
|
||||||
|
"unicode_decimal": 58901
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "10048835",
|
||||||
|
"name": "矩形",
|
||||||
|
"font_class": "juxing",
|
||||||
|
"unicode": "e620",
|
||||||
|
"unicode_decimal": 58912
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "10048847",
|
||||||
|
"name": "圆形",
|
||||||
|
"font_class": "yuanxing",
|
||||||
|
"unicode": "e626",
|
||||||
|
"unicode_decimal": 58918
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "10715450",
|
||||||
|
"name": "下载",
|
||||||
|
"font_class": "xiazai",
|
||||||
|
"unicode": "e638",
|
||||||
|
"unicode_decimal": 58936
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "12706985",
|
||||||
|
"name": "图片",
|
||||||
|
"font_class": "tupian_huaban",
|
||||||
|
"unicode": "e691",
|
||||||
|
"unicode_decimal": 59025
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "15718632",
|
||||||
|
"name": "工具",
|
||||||
|
"font_class": "gongju",
|
||||||
|
"unicode": "e6cf",
|
||||||
|
"unicode_decimal": 59087
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "21497145",
|
||||||
|
"name": "用户反馈",
|
||||||
|
"font_class": "yonghufankuibeifen",
|
||||||
|
"unicode": "e604",
|
||||||
|
"unicode_decimal": 58884
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22272771",
|
||||||
|
"name": "5g",
|
||||||
|
"font_class": "five-g",
|
||||||
|
"unicode": "e63f",
|
||||||
|
"unicode_decimal": 58943
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22272772",
|
||||||
|
"name": "3g",
|
||||||
|
"font_class": "three-g",
|
||||||
|
"unicode": "e640",
|
||||||
|
"unicode_decimal": 58944
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22272775",
|
||||||
|
"name": "4g",
|
||||||
|
"font_class": "four-g",
|
||||||
|
"unicode": "e641",
|
||||||
|
"unicode_decimal": 58945
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "22272787",
|
||||||
|
"name": "2g",
|
||||||
|
"font_class": "two-g",
|
||||||
|
"unicode": "e642",
|
||||||
|
"unicode_decimal": 58946
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "23949547",
|
||||||
|
"name": "正确",
|
||||||
|
"font_class": "zhengque",
|
||||||
|
"unicode": "ec6b",
|
||||||
|
"unicode_decimal": 60523
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|