From c9d70584cce82ff3402cbabea72f9b2b1a7ff6e2 Mon Sep 17 00:00:00 2001 From: ljw <84855512@qq.com> Date: Tue, 24 Sep 2024 21:16:03 +0800 Subject: [PATCH] up readme --- README.md | 24 ++++++++++++------------ README_EN.md | 40 +++++++++++++++++----------------------- docs/web_admin_gr.png | Bin 7921 -> 8717 bytes 3 files changed, 29 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 8758d7f..0deb929 100644 --- a/README.md +++ b/README.md @@ -68,13 +68,13 @@ ![pc_ab](docs/pc_ab.png) -#### 群组,群组分为`共享组`和`普通组`,共享组中所有人都能看到小组成员的地址,普通组只有管理员能看到所有小组成员的地址 +#### 群组,群组分为`共享组`和`普通组`,共享组中所有人都能看到小组成员的设备,普通组只有管理员能看到所有小组成员的设备 ![pc_gr](docs/pc_gr.png) -### **Web Admin**: 使用前后端分离,提供用户友好的管理界面,主要用来管理和展示。 +### Web Admin: -***前端代码在[rustdesk-api-web](https://github.com/lejianwen/rustdesk-api-web)*** +***使用前后端分离,提供用户友好的管理界面,主要用来管理和展示。前端代码在[rustdesk-api-web](https://github.com/lejianwen/rustdesk-api-web)*** ***后台访问地址是`http://[:port]/_admin/`初次安装管理员为用户名密码为`admin` `admin`,请即时更改密码*** @@ -82,21 +82,21 @@ ![web_admin](docs/web_admin.png) 2. 普通用户界面 ![web_user](docs/web_admin_user.png) -3. 右上角也可以更改密码 + 右上角也可以更改密码 ![web_resetpwd](docs/web_resetpwd.png) -4. 分组可以自定义,方便管理,暂时支持两种类型: `共享组` 和 `普通组` +3. 分组可以自定义,方便管理,暂时支持两种类型: `共享组` 和 `普通组` ![web_admin_gr](docs/web_admin_gr.png) -5. 可以直接打开webclient,方便使用 +4. 可以直接打开webclient,方便使用 ![web_webclient](docs/admin_webclient.png) -6. Oauth,暂时只支持了`Github`和`Google`, 需要创建一个`OAuth App`,然后配置到后台 +5. Oauth,暂时只支持了`Github`和`Google`, 需要创建一个`OAuth App`,然后配置到后台 ![web_admin_oauth](docs/web_admin_oauth.png) - `github oauth app`在`Settings`->`Developer settings`->`OAuth Apps`->`New OAuth App` 中创建,地址 [https://github.com/settings/developers](https://github.com/settings/developers) - `Authorization callback URL`填写`http:///api/oauth/callback` ,比如`http://127.0.0.1:21114/api/oauth/callback` -### **Web Client**: +### Web Client: 1. 如果已经登录了后台,web client将自动直接登录 2. 如果没登录后台,点击右上角登录即可,api server已经自动配置好了 @@ -104,10 +104,10 @@ 3. 登录后,会自动同步ID服务器和KEY 4. 登录后,会将地址簿自动保存到web client中,方便使用 -### **自动化文档**: 使用 Swag 生成 API 文档,方便开发者理解和使用 API。 +### 自动化文档: 使用 Swag 生成 API 文档,方便开发者理解和使用 API。 -1. 后台文档 `/admin/swagger/index.html` -2. PC端文档 `/swagger/index.html` +1. 后台文档 `/admin/swagger/index.html` +2. PC端文档 `/swagger/index.html` ![api_swag](docs/api_swag.png) ## 安装与运行 @@ -371,7 +371,7 @@ lejianwen/rustdesk-api 5. 编译,如果想自己编译,先cd到项目根目录,然后windows下直接运行`build.bat`,linux下运行`build.sh`,编译后会在`release` 目录下生成对应的可执行文件。直接运行编译后的可执行文件即可。 -6. 打开浏览器访问`http://:21114/_admin/`,默认用户名密码为`admin`,请及时更改密码。 +6. 打开浏览器访问`http:///_admin/`,默认用户名密码为`admin`,请及时更改密码。 ## 其他 diff --git a/README_EN.md b/README_EN.md index 5203da3..46acd37 100644 --- a/README_EN.md +++ b/README_EN.md @@ -53,15 +53,13 @@ desktop software that provides self-hosted solutions. hbbr -k abc1234567 ``` -## Features +## Overview ### API Service: Basic implementation of the PC client's primary interfaces.Supports the Personal version api, which can be enabled by configuring the `rustdesk.personal` file or the `RUSTDESK_API_RUSTDESK_PERSONAL` environment variable. #### Login -- Added `GitHub` and `Google` login, which can be used after configuration in the admin panel. See the OAuth - configuration section - for details. +- Added `GitHub` and `Google` login, which can be used after configuration in the admin panel. See the OAuth configuration section for details. - Added authorization login for the web admin panel. ![pc_login](docs/pc_login.png) @@ -70,31 +68,29 @@ desktop software that provides self-hosted solutions. ![pc_ab](docs/pc_ab.png) -#### Groups: Groups are divided into `shared groups` and `regular groups`. In shared groups, everyone can see the addresses of all group members, while in regular groups, only administrators can see all members' addresses. +#### Groups: Groups are divided into `shared groups` and `regular groups`. In shared groups, everyone can see the peers of all group members, while in regular groups, only administrators can see all members' peers. ![pc_gr](docs/pc_gr.png) -### **Web UI +### Web Admin -**: The frontend and backend are separated to provide a user-friendly management interface, primarily for managing and -displaying data. +***The frontend and backend are separated to provide a user-friendly management interface, primarily for managing and +displaying data.Frontend code is available at [rustdesk-api-web](https://github.com/lejianwen/rustdesk-api-web)*** -***Frontend code is available at [rustdesk-api-web](https://github.com/lejianwen/rustdesk-api-web)*** - -***Admin panel URL: `http://[:port]/_admin/`. The default username and password for the initial +***Admin panel URL: `http:///_admin/`. The default username and password for the initial installation are `admin` `admin`, please change the password immediately.*** 1. Admin interface: ![web_admin](docs/web_admin.png) 2. Regular user interface: ![web_user](docs/web_admin_user.png) -3. You can change your password from the top right corner: + You can change your password from the top right corner: ![web_resetpwd](docs/web_resetpwd.png) -4. Groups can be customized for easy management. Currently, two types are supported: `shared group` and `regular group`. +3. Groups can be customized for easy management. Currently, two types are supported: `shared group` and `regular group`. ![web_admin_gr](docs/web_admin_gr.png) -5. You can open the web client directly for convenience: +4. You can open the web client directly for convenience: ![web_webclient](docs/admin_webclient.png) -6. OAuth support: Currently, `GitHub` and `Google` is supported. You need to create an `OAuth App` and configure it in +5. OAuth support: Currently, `GitHub` and `Google` is supported. You need to create an `OAuth App` and configure it in the admin panel. ![web_admin_oauth](docs/web_admin_oauth.png) @@ -103,7 +99,7 @@ installation are `admin` `admin`, please change the password immediately.*** - Set the `Authorization callback URL` to `http:///api/oauth/callback`, e.g., `http://127.0.0.1:21114/api/oauth/callback`. -### **Web Client**: +### Web Client: 1. If you're already logged into the admin panel, the web client will log in automatically. 2. If you're not logged in, simply click the login button at the top right corner, and the API server will be @@ -112,12 +108,10 @@ installation are `admin` `admin`, please change the password immediately.*** 3. After logging in, the ID server and key will be automatically synced. 4. The address book will also be automatically saved to the web client for convenient use. -### **Automated Documentation +### Automated Documentation : API documentation is generated using Swag, making it easier for developers to understand and use the API. -** : API documentation is generated using Swag, making it easier for developers to understand and use the API. - -1. Admin panel docs: `/admin/swagger/index.html` -2. PC client docs: `/swagger/index.html` +1. Admin panel docs: `/admin/swagger/index.html` +2. PC client docs: `/swagger/index.html` ![api_swag](docs/api_swag.png) ## Installation and Setup @@ -150,7 +144,7 @@ rustdesk: personal: 1 ``` -* Environment variables, with the prefix `RUSTDESK_API`, will override the settings in the configuration file if +* Environment variables, with the prefix `RUSTDESK_API_RUSTDESK_PERSONAL`, will override the settings in the configuration file if present. | Variable Name | Description | Example | @@ -383,7 +377,7 @@ Download the release from [release](https://github.com/lejianwen/rustdesk-api/re compiling, the corresponding executables will be generated in the `release` directory. Run the compiled executables directly. -6. Open your browser and visit `http://:21114/_admin/`, with default credentials `admin admin`. Please +6. Open your browser and visit `http:///_admin/`, with default credentials `admin admin`. Please change the password promptly. ## Miscellaneous diff --git a/docs/web_admin_gr.png b/docs/web_admin_gr.png index 868f6e5af924d969bbca2e32ba13ab9c11c3bc23..e16c175134cd09761fe396c467fe6b3b926a451f 100644 GIT binary patch literal 8717 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 DqVFxE