mirror of
https://github.com/snltty/linker.git
synced 2025-09-26 21:15:57 +08:00
169
This commit is contained in:
68
README.md
68
README.md
@@ -18,72 +18,72 @@
|
||||
[](https://gitee.com/snltty/linker/stargazers)
|
||||
[](https://gitee.com/snltty/linker/members)
|
||||
|
||||
<a href="https://linker.snltty.com">官方网站</a>、<a href="https://linker-doc.snltty.com">使用说明文档</a>、<a href="https://jq.qq.com/?_wv=1027&k=ucoIVfz4" target="_blank">加入组织:1121552990</a>
|
||||
<a href="https://linker.snltty.com">Website</a>、<a href="https://linker-doc.snltty.com">Documentation</a>、<a href="https://jq.qq.com/?_wv=1027&k=ucoIVfz4" target="_blank">Join QQ Group</a>
|
||||
|
||||
公共服务器,连通99.999%
|
||||
[README](README.md) | [中文说明](README_zh.md)
|
||||
|
||||
</div>
|
||||
|
||||
## 大概意思
|
||||
## Overview
|
||||
|
||||
使用p2p或者服务器转发,让你的各个局域网连通起来,让各个局域网内的任意联网设备都可以相互连通
|
||||
Using P2P or server relay, connect multiple LANs to enable communication between any networked devices across these LANs.
|
||||
|
||||
<div align="center">
|
||||
<p><img src="./readme/linker.jpg"></p>
|
||||
</div>
|
||||
|
||||
## 遵纪守法
|
||||
本项目的作者和贡献者不对因使用、修改、复制或分发本代码而产生的任何形式的直接、间接、偶然、特殊或后果性损害负责。无论在何种情况下,无论是合同责任、侵权行为或其他任何法律责任,作者和贡献者均不承担任何责任
|
||||
## Legal Compliance
|
||||
The authors and contributors of this project are not liable for any direct, indirect, incidental, special, or consequential damages arising from the use, modification, copying, or distribution of this code. Under no circumstances shall the authors or contributors be held liable for any contractual, tort, or other legal responsibilities.
|
||||
|
||||
使用本项目代码的用户有责任确保其使用符合当地法律法规。作者和贡献者不对任何违法行为或因使用本代码而可能发生的法律问题负责。用户应确保在符合法律的范围内使用本项目。
|
||||
Users of this project are responsible for ensuring compliance with local laws and regulations. The authors and contributors assume no responsibility for any illegal activities or legal issues resulting from the use of this code. Users must ensure lawful usage within their jurisdiction.
|
||||
|
||||
本项目的代码仅限用于合法、道德和合规的目的。作者严禁任何用户将其用于非法活动、攻击行为、滥用或其他不当用途,包括但不限于未经授权的访问、网络攻击等行为。
|
||||
This code is strictly intended for legal, ethical, and compliant purposes. The authors prohibit any use for illegal activities, attacks, abuse, or other malicious actions, including but not limited to unauthorized access, network attacks, etc.
|
||||
|
||||
为方便用户使用,本项目提供**公开信标服务器**、**公开中继服务器**,使用**公开信标服务器**、**公开中继服务器**时请遵守当地法律法规,作者和贡献者和服务器提供者不对任何违法行为或因使用**公开信标服务器**、**公开中继服务器**而可能发生的法律问题负责
|
||||
For user convenience, this project provides **public messenger servers** and **public relay servers**. When using these services, users must comply with local laws and regulations. The authors, contributors, and server providers are not responsible for any illegal activities or legal issues arising from the use of these public servers.
|
||||
|
||||
## 已有功能
|
||||
- [x] 配置加密,配置文件加密
|
||||
- [x] 通信加密,所有通信均`ssl加密`
|
||||
- [x] 打洞连接,TCP(支持IPV6)打洞、UDP打洞
|
||||
- [x] 打洞类库,你可以使用`linker.tunnel`打洞库到你的项目中
|
||||
- [x] 中继连接,先中继连接,然后偷偷打洞,打洞成功则无缝切换线路
|
||||
- [x] 异地组网,使用虚拟网卡,将各个客户端组建为局域网络,`点对点`,`点对网`,`网对网`
|
||||
- [x] 网卡类库,你可以使用`linker.tun` tun网卡库到你的项目中
|
||||
- [x] 端口转发,将客户端的端口转发到其它客户端的端口
|
||||
- [x] 服务器穿透,在服务器注册端口或域名,通过访问服务器端口或域名,访问内网服务
|
||||
- [x] 权限管理,主客户端拥有完全权限,可导出、配置子客户端配置,分配其管理权限
|
||||
- [x] 自定义验证,通过`HTTP POST`让你可以自定义认证是否允许`连接信标`,`中继`,`内网穿透`
|
||||
- [x] 流量统计,统计服务器`信标`、`中继`、`内网穿透` 的流量情况
|
||||
- [x] 网络配置,主客户端设置网络,所有客户端自动分配IP
|
||||
- [x] 分布式,多中继服务器节点,承载海量设备
|
||||
- [x] socks5代理,端口转发需要指定端口,而socks5代理可以代理所有端口
|
||||
- [x] 集成linker,使用`linker.messenger.entry`入口库,轻松集成到你的项目中
|
||||
## Features
|
||||
- [x] Encrypted configuration files
|
||||
- [x] Encrypted communication (SSL for all traffic)
|
||||
- [x] Hole-punching support: TCP (including IPv6) and UDP
|
||||
- [x] Hole-punching library: Use `linker.tunnel` in your projects
|
||||
- [x] Relay connections with seamless switch to direct P2P once a hole is punched
|
||||
- [x] Cross-LAN networking: Virtual NIC for building LANs between clients (P2P, point-to-network, network-to-network)
|
||||
- [x] Virtual NIC library: Use `linker.tun` in your projects
|
||||
- [x] Port forwarding: Forward local ports to remote client ports
|
||||
- [x] Server penetration: Register ports/domains on a server to access internal services
|
||||
- [x] Permission management: Master client controls permissions, exports/configures sub-client settings
|
||||
- [x] Custom authentication: Validate connections via `HTTP POST` for beacon, relay, and penetration
|
||||
- [x] Traffic statistics: Track beacon, relay, and penetration traffic on servers
|
||||
- [x] Network configuration: Master client sets up networks, auto-assigns IPs to all clients
|
||||
- [x] Distributed architecture: Multiple relay nodes for massive scalability
|
||||
- [x] SOCKS5 proxy: Dynamic port forwarding without specifying ports
|
||||
- [x] Easy integration: Use `linker.messenger.entry` to embed into your projects
|
||||
|
||||
## 轻松集成
|
||||
在.NET8+项目中,nuget 安装 `linker.messenger.entry`
|
||||
## Quick Integration
|
||||
In a .NET 8+ project, install the NuGet package `linker.messenger.entry`
|
||||
```
|
||||
LinkerMessengerEntry.Initialize();
|
||||
LinkerMessengerEntry.Build();
|
||||
LinkerMessengerEntry.Setup(ExcludeModule.None);
|
||||
```
|
||||
|
||||
## 管理页面
|
||||
## Management Website
|
||||
|
||||
<div align="center">
|
||||
|
||||
<p><img src="./readme/full.png"></p>
|
||||
</div>
|
||||
|
||||
## 可怜作者
|
||||
## Support the Author
|
||||
|
||||
<div align="center">
|
||||
请作者喝一杯咖啡,让作者更有动力更新代码
|
||||
Buy the author a coffee to keep the project alive!
|
||||
<p><img src="./readme/qr.jpg" width="360"></p>
|
||||
</div>
|
||||
|
||||
## 感谢投喂
|
||||
## Special Thanks
|
||||
|
||||
<div align="center">
|
||||
<a href="https://mi-d.cn" target="_blank">
|
||||
<img src="https://mi-d.cn/wp-content/uploads/2021/12/cropped-1639494965-网站LOGO无字.png" width="40" style="vertical-align: middle;"> 米多贝克</a>
|
||||
</div>
|
||||
|
||||
</div>
|
95
README_zh.md
Normal file
95
README_zh.md
Normal file
@@ -0,0 +1,95 @@
|
||||
|
||||
<!--
|
||||
* @Author: snltty
|
||||
* @Date: 2021-08-22 14:09:03
|
||||
* @LastEditors: snltty
|
||||
* @LastEditTime: 2022-11-21 16:36:26
|
||||
* @version: v1.0.0
|
||||
* @Descripttion: 功能说明
|
||||
* @FilePath: \client.service.ui.webd:\desktop\linker\README.md
|
||||
-->
|
||||
<div align="center">
|
||||
<p><img src="./readme/logo.png" height="150"></p>
|
||||
|
||||
# .NET8.0、linker、link anywhere
|
||||
|
||||

|
||||

|
||||
[](https://gitee.com/snltty/linker/stargazers)
|
||||
[](https://gitee.com/snltty/linker/members)
|
||||
|
||||
<a href="https://linker.snltty.com">官方网站</a>、<a href="https://linker-doc.snltty.com">使用说明文档</a>、<a href="https://jq.qq.com/?_wv=1027&k=ucoIVfz4" target="_blank">加入组织:1121552990</a>
|
||||
|
||||
[README](README.md) | [中文说明](README_zh.md)
|
||||
|
||||
</div>
|
||||
|
||||
## 大概意思
|
||||
|
||||
使用p2p或者服务器转发,让你的各个局域网连通起来,让各个局域网内的任意联网设备都可以相互连通
|
||||
|
||||
<div align="center">
|
||||
<p><img src="./readme/linker.jpg"></p>
|
||||
</div>
|
||||
|
||||
## 遵纪守法
|
||||
本项目的作者和贡献者不对因使用、修改、复制或分发本代码而产生的任何形式的直接、间接、偶然、特殊或后果性损害负责。无论在何种情况下,无论是合同责任、侵权行为或其他任何法律责任,作者和贡献者均不承担任何责任
|
||||
|
||||
使用本项目代码的用户有责任确保其使用符合当地法律法规。作者和贡献者不对任何违法行为或因使用本代码而可能发生的法律问题负责。用户应确保在符合法律的范围内使用本项目。
|
||||
|
||||
本项目的代码仅限用于合法、道德和合规的目的。作者严禁任何用户将其用于非法活动、攻击行为、滥用或其他不当用途,包括但不限于未经授权的访问、网络攻击等行为。
|
||||
|
||||
为方便用户使用,本项目提供**公开信标服务器**、**公开中继服务器**,使用**公开信标服务器**、**公开中继服务器**时请遵守当地法律法规,作者和贡献者和服务器提供者不对任何违法行为或因使用**公开信标服务器**、**公开中继服务器**而可能发生的法律问题负责
|
||||
|
||||
## 已有功能
|
||||
- [x] 配置加密,配置文件加密
|
||||
- [x] 通信加密,所有通信均`ssl加密`
|
||||
- [x] 打洞连接,TCP(支持IPV6)打洞、UDP打洞
|
||||
- [x] 打洞类库,你可以使用`linker.tunnel`打洞库到你的项目中
|
||||
- [x] 中继连接,先中继连接,然后偷偷打洞,打洞成功则无缝切换线路
|
||||
- [x] 异地组网,使用虚拟网卡,将各个客户端组建为局域网络,`点对点`,`点对网`,`网对网`
|
||||
- [x] 网卡类库,你可以使用`linker.tun` tun网卡库到你的项目中
|
||||
- [x] 端口转发,将客户端的端口转发到其它客户端的端口
|
||||
- [x] 服务器穿透,在服务器注册端口或域名,通过访问服务器端口或域名,访问内网服务
|
||||
- [x] 权限管理,主客户端拥有完全权限,可导出、配置子客户端配置,分配其管理权限
|
||||
- [x] 自定义验证,通过`HTTP POST`让你可以自定义认证是否允许`连接信标`,`中继`,`内网穿透`
|
||||
- [x] 流量统计,统计服务器`信标`、`中继`、`内网穿透` 的流量情况
|
||||
- [x] 网络配置,主客户端设置网络,所有客户端自动分配IP
|
||||
- [x] 分布式,多中继服务器节点,承载海量设备
|
||||
- [x] socks5代理,端口转发需要指定端口,而socks5代理可以代理所有端口
|
||||
- [x] 集成linker,使用`linker.messenger.entry`入口库,轻松集成到你的项目中
|
||||
|
||||
## 轻松集成
|
||||
在.NET8+项目中,nuget 安装 `linker.messenger.entry`
|
||||
```
|
||||
LinkerMessengerEntry.Initialize();
|
||||
LinkerMessengerEntry.Build();
|
||||
LinkerMessengerEntry.Setup(ExcludeModule.None);
|
||||
```
|
||||
|
||||
## 管理页面
|
||||
|
||||
<div align="center">
|
||||
<p><img src="./readme/full.png"></p>
|
||||
</div>
|
||||
|
||||
## 可怜作者
|
||||
|
||||
<div align="center">
|
||||
请作者喝一杯咖啡,让作者更有动力更新代码
|
||||
<p><img src="./readme/qr.jpg" width="360"></p>
|
||||
</div>
|
||||
|
||||
## 感谢投喂
|
||||
|
||||
<div align="center">
|
||||
<a href="https://mi-d.cn" target="_blank">
|
||||
<img src="https://mi-d.cn/wp-content/uploads/2021/12/cropped-1639494965-网站LOGO无字.png" width="40" style="vertical-align: middle;"> 米多贝克</a>
|
||||
</div>
|
||||
|
||||
|
||||
## 特别声明
|
||||
|
||||
本项目已加入 [dotNET China](https://gitee.com/dotnetchina) 组织。<br/>
|
||||
|
||||

|
@@ -31,7 +31,7 @@ namespace linker.messenger.signin
|
||||
{
|
||||
signInClientStore.SetName(info.Name);
|
||||
}
|
||||
if (accessStore.HasAccess(AccessValue.RenameSelf))
|
||||
if (accessStore.HasAccess(AccessValue.Group))
|
||||
{
|
||||
signInClientStore.SetGroups(info.Groups);
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.211" ProductVersion="0.0.0.211" publishDir="/dist/" dstrip="false" local="false" ignored="false">
|
||||
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.212" ProductVersion="0.0.0.212" publishDir="/dist/" dstrip="false" local="false" ignored="false">
|
||||
<file name="main.aardio" path="main.aardio" comment="main.aardio"/>
|
||||
<folder name="资源文件" path="res" embed="true" local="false" ignored="false">
|
||||
<file name="favicon.ico" path="res\favicon.ico" comment="res\favicon.ico"/>
|
||||
|
BIN
src/linker.tray.win/dist/linker.tray.win.exe
vendored
BIN
src/linker.tray.win/dist/linker.tray.win.exe
vendored
Binary file not shown.
1
src/linker.tray.win/web/css/115.62f5b636.css
Normal file
1
src/linker.tray.win/web/css/115.62f5b636.css
Normal file
@@ -0,0 +1 @@
|
||||
.group-wrap[data-v-06dc106b]{padding:1rem}
|
1
src/linker.tray.win/web/css/47.86fae9b6.css
Normal file
1
src/linker.tray.win/web/css/47.86fae9b6.css
Normal file
@@ -0,0 +1 @@
|
||||
.delay[data-v-06246cf5]{margin-left:3rem}.servers-wrap[data-v-548b41f4]{padding:1rem;font-size:1.3rem;color:#555}.servers-wrap a[data-v-548b41f4]{color:#333}.el-checkbox[data-v-548b41f4]{vertical-align:middle;margin-right:1rem}
|
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
.delay[data-v-06246cf5]{margin-left:3rem}.servers-wrap[data-v-ec7c750a]{padding:1rem;font-size:1.3rem;color:#555}.servers-wrap a[data-v-ec7c750a]{color:#333}.el-checkbox[data-v-ec7c750a]{vertical-align:middle;margin-right:1rem}
|
1
src/linker.tray.win/web/img/group.ec3cd11a.svg
Normal file
1
src/linker.tray.win/web/img/group.ec3cd11a.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1740620597547" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="27257" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M32 32m496 0l0 0q496 0 496 496l0 0q0 496-496 496l0 0q-496 0-496-496l0 0q0-496 496-496Z" fill="#323a6b" p-id="27258" data-spm-anchor-id="a313x.search_index.0.i6.15da3a81CaU74a" class=""></path><path d="M256 686.762667c0-21.290667 15.786667-40.106667 35.925333-47.317334l86.272-38.144s23.381333-7.125333 29.781334-14.250666c3.157333-3.498667 4.693333-12.928 3.114666-21.76a29.141333 29.141333 0 0 0-2.645333-7.509334c-4.821333-9.173333-40.277333-55.296-47.786667-98.816a93.013333 93.013333 0 0 1-1.621333-16.64c0-76.373333 50.602667-138.24 112.981333-138.24 38.528 0 72.576 23.594667 92.970667 59.648 12.970667 22.570667 20.608 50.090667 20.608 79.786667 0 49.493333-49.152 104.064-53.162667 117.461333-2.986667 9.813333-3.925333 18.090667-2.432 23.552a9.002667 9.002667 0 0 0 2.133334 3.413334c7.082667 6.869333 25.301333 13.909333 25.301333 13.909333l95.701333 36.992c13.738667 4.906667 25.429333 15.488 31.488 28.458667 3.328 6.528 5.248 13.653333 5.248 21.077333v10.112c0 23.253333-19.072 37.504-42.453333 37.504H298.453333c-23.381333 0-42.453333-14.250667-42.453333-37.504z m320.170667-398.762667c55.168 0 99.84 54.698667 99.84 122.197333 0 43.690667-43.306667 91.776-46.890667 103.637334-3.541333 11.818667-3.84 21.077333 0.170667 25.002666 6.272 6.144 22.4 12.373333 22.4 12.373334l84.565333 32.682666c17.792 6.314667 31.744 23.509333 31.744 42.325334v8.917333c0 20.48-16.810667 33.066667-37.461333 33.066667h-10.282667a84.906667 84.906667 0 0 0-16.938667-33.237334h27.221334a12.245333 12.245333 0 0 0 3.968-0.554666v-8.192c0-3.626667-3.925333-9.045333-9.6-11.093334a33.706667 33.706667 0 0 1-0.853334-0.298666l-84.48-32.682667c-6.826667-2.56-23.637333-9.728-33.749333-19.626667-9.813333-9.514667-14.037333-22.485333-12.714667-38.613333 0.512-6.058667 1.834667-12.629333 3.925334-19.626667 2.432-7.978667 7.253333-15.232 14.592-26.24l2.474666-3.669333c11.605333-17.536 28.458667-44.117333 28.458667-64.170667 0-25.045333-7.765333-48.298667-21.76-65.493333-12.373333-15.146667-28.245333-23.466667-44.629333-23.466667a159.573333 159.573333 0 0 0-30.592-27.392c9.642667-3.797333 19.925333-5.845333 30.592-5.845333z" fill="#ffffff" p-id="27259" data-spm-anchor-id="a313x.search_index.0.i11.15da3a81CaU74a" class=""></path></svg>
|
After Width: | Height: | Size: 2.5 KiB |
@@ -1 +1 @@
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>linker.web</title><link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/><script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script><script defer="defer" src="js/chunk-vendors.1a70ad89.js"></script><script defer="defer" src="js/app.a7bae510.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.4a287cbb.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but linker.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>linker.web</title><link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/><script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script><script defer="defer" src="js/chunk-vendors.1a70ad89.js"></script><script defer="defer" src="js/app.8973b210.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.4a287cbb.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but linker.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
1
src/linker.tray.win/web/js/115.45b0144a.js
Normal file
1
src/linker.tray.win/web/js/115.45b0144a.js
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[115],{8115:function(e,l,o){o.r(l),o.d(l,{default:function(){return h}});var t=o(6768),a=o(4232);const n={class:"group-wrap"};function r(e,l,o,r,d,i){const s=(0,t.g2)("el-input"),u=(0,t.g2)("el-table-column"),c=(0,t.g2)("Delete"),p=(0,t.g2)("el-icon"),m=(0,t.g2)("el-button"),g=(0,t.g2)("el-popconfirm"),w=(0,t.g2)("Plus"),h=(0,t.g2)("Select"),k=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",n,[(0,t.bF)(k,{stripe:"",data:r.state.list,border:"",size:"small",width:"100%",height:`${r.state.height}px`,onCellDblclick:r.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(u,{prop:"Name",label:e.$t("server.groupName"),width:"100"},{default:(0,t.k6)((e=>[e.row.NameEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":l=>e.row.Name=l,onBlur:l=>r.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,a.v_)(e.row.Name),1)],64))])),_:1},8,["label"]),(0,t.bF)(u,{prop:"Id",label:"Id"},{default:(0,t.k6)((e=>[e.row.IdEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Id,"onUpdate:modelValue":l=>e.row.Id=l,onBlur:l=>r.handleEditBlur(e.row,"Id")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,a.v_)(e.row.Id),1)],64))])),_:1}),(0,t.bF)(u,{prop:"Password",label:e.$t("server.groupPassword")},{default:(0,t.k6)((e=>[e.row.PasswordEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,type:"password","show-password":"",size:"small",modelValue:e.row.Password,"onUpdate:modelValue":l=>e.row.Password=l,onBlur:l=>r.handleEditBlur(e.row,"Password")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,a.v_)(e.row.Password.replace(/.{1}/g,"*")),1)],64))])),_:1},8,["label"]),(0,t.bF)(u,{prop:"Oper",label:e.$t("server.groupOper"),width:"160"},{default:(0,t.k6)((l=>[(0,t.Lk)("div",null,[(0,t.bF)(g,{title:e.$t("server.groupDelConfirm"),onConfirm:e=>r.handleDel(l.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(m,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(p,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1})])),_:1})])),_:2},1032,["title","onConfirm"]),(0,t.bF)(m,{size:"small",onClick:e=>r.handleAdd(l.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(p,null,{default:(0,t.k6)((()=>[(0,t.bF)(w)])),_:1})])),_:2},1032,["onClick"]),(0,t.bF)(m,{type:"primary",size:"small",onClick:e=>r.handleUse(l.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(p,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})])),_:2},1032,["onClick"])])])),_:1},8,["label"])])),_:1},8,["data","height","onCellDblclick"])])}var d=o(9299),i=o(3830),s=o(1219),u=o(144),c=o(7477),p=o(5931),m={components:{Delete:c.epd,Plus:c.FWt,Select:c.l6P},setup(e){const{t:l}=(0,p.s9)(),o=(0,i.B)(),a=(0,u.Kh)({list:o.value.config.Client.Groups||[],height:(0,t.EW)((()=>o.value.height-70))});(0,t.wB)((()=>o.value.config.Client.Groups),(()=>{0==a.list.filter((e=>e["__editing"])).length&&(a.list=o.value.config.Client.Groups)}));const n=(e,l)=>{r(e,l.property)},r=(e,l)=>{a.list.forEach((e=>{e["NameEditing"]=!1,e["IdEditing"]=!1,e["PasswordEditing"]=!1})),e[`${l}Editing`]=!0,e["__editing"]=!0},c=(e,l)=>{e[`${l}Editing`]=!1,e["__editing"]=!1,h()},m=e=>{a.list.splice(e,1),h()},g=e=>{a.list.filter((e=>""==e.Id||""==e.Name)).length>0||(a.list.splice(e+1,0,{Name:"",Id:"",Password:""}),h())},w=e=>{const t=a.list.slice(),n=t[e];t[e]=t[0],t[0]=n,(0,d.rd)({name:o.value.config.Client.Name,groups:t}).then((()=>{s.nk.success(l("common.oper")),setTimeout((()=>{window.location.reload()}),1e3)})).catch((e=>{console.log(e),s.nk.error(l("common.operFail"))}))},h=()=>{(0,d.zp)(a.list).then((()=>{s.nk.success(l("common.oper"))})).catch((e=>{console.log(e),s.nk.error(l("common.operFail"))}))};return{state:a,handleCellClick:n,handleEditBlur:c,handleDel:m,handleAdd:g,handleUse:w}}},g=o(1241);const w=(0,g.A)(m,[["render",r],["__scopeId","data-v-06dc106b"]]);var h=w}}]);
|
1
src/linker.tray.win/web/js/47.6caf9301.js
Normal file
1
src/linker.tray.win/web/js/47.6caf9301.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
src/linker.tray.win/web/js/654.f6997154.js
Normal file
1
src/linker.tray.win/web/js/654.f6997154.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
src/linker.tray.win/web/js/app.8973b210.js
Normal file
1
src/linker.tray.win/web/js/app.8973b210.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
src/linker.web/src/assets/group.svg
Normal file
1
src/linker.web/src/assets/group.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1740620597547" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="27257" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M32 32m496 0l0 0q496 0 496 496l0 0q0 496-496 496l0 0q-496 0-496-496l0 0q0-496 496-496Z" fill="#323a6b" p-id="27258" data-spm-anchor-id="a313x.search_index.0.i6.15da3a81CaU74a" class=""></path><path d="M256 686.762667c0-21.290667 15.786667-40.106667 35.925333-47.317334l86.272-38.144s23.381333-7.125333 29.781334-14.250666c3.157333-3.498667 4.693333-12.928 3.114666-21.76a29.141333 29.141333 0 0 0-2.645333-7.509334c-4.821333-9.173333-40.277333-55.296-47.786667-98.816a93.013333 93.013333 0 0 1-1.621333-16.64c0-76.373333 50.602667-138.24 112.981333-138.24 38.528 0 72.576 23.594667 92.970667 59.648 12.970667 22.570667 20.608 50.090667 20.608 79.786667 0 49.493333-49.152 104.064-53.162667 117.461333-2.986667 9.813333-3.925333 18.090667-2.432 23.552a9.002667 9.002667 0 0 0 2.133334 3.413334c7.082667 6.869333 25.301333 13.909333 25.301333 13.909333l95.701333 36.992c13.738667 4.906667 25.429333 15.488 31.488 28.458667 3.328 6.528 5.248 13.653333 5.248 21.077333v10.112c0 23.253333-19.072 37.504-42.453333 37.504H298.453333c-23.381333 0-42.453333-14.250667-42.453333-37.504z m320.170667-398.762667c55.168 0 99.84 54.698667 99.84 122.197333 0 43.690667-43.306667 91.776-46.890667 103.637334-3.541333 11.818667-3.84 21.077333 0.170667 25.002666 6.272 6.144 22.4 12.373333 22.4 12.373334l84.565333 32.682666c17.792 6.314667 31.744 23.509333 31.744 42.325334v8.917333c0 20.48-16.810667 33.066667-37.461333 33.066667h-10.282667a84.906667 84.906667 0 0 0-16.938667-33.237334h27.221334a12.245333 12.245333 0 0 0 3.968-0.554666v-8.192c0-3.626667-3.925333-9.045333-9.6-11.093334a33.706667 33.706667 0 0 1-0.853334-0.298666l-84.48-32.682667c-6.826667-2.56-23.637333-9.728-33.749333-19.626667-9.813333-9.514667-14.037333-22.485333-12.714667-38.613333 0.512-6.058667 1.834667-12.629333 3.925334-19.626667 2.432-7.978667 7.253333-15.232 14.592-26.24l2.474666-3.669333c11.605333-17.536 28.458667-44.117333 28.458667-64.170667 0-25.045333-7.765333-48.298667-21.76-65.493333-12.373333-15.146667-28.245333-23.466667-44.629333-23.466667a159.573333 159.573333 0 0 0-30.592-27.392c9.642667-3.797333 19.925333-5.845333 30.592-5.845333z" fill="#ffffff" p-id="27259" data-spm-anchor-id="a313x.search_index.0.i11.15da3a81CaU74a" class=""></path></svg>
|
After Width: | Height: | Size: 2.5 KiB |
@@ -10,6 +10,7 @@ export default {
|
||||
|
||||
'head.home': 'Home',
|
||||
'head.server': 'Server',
|
||||
'head.group': 'Group',
|
||||
'head.protocol': 'P2P Protocol',
|
||||
'head.action': 'Action',
|
||||
'head.logger': 'Logs',
|
||||
|
@@ -10,6 +10,7 @@ export default {
|
||||
|
||||
'head.home': '首页',
|
||||
'head.server': '服务器',
|
||||
'head.group': '分组',
|
||||
'head.protocol': '打洞协议',
|
||||
'head.action': '自定义验证',
|
||||
'head.logger': '日志',
|
||||
|
@@ -16,6 +16,11 @@ const routes = [
|
||||
name: 'FullServers',
|
||||
component: () => import('@/views/full/server/Index.vue')
|
||||
},
|
||||
{
|
||||
path: '/full/group.html',
|
||||
name: 'FullGroup',
|
||||
component: () => import('@/views/full/group/Index.vue')
|
||||
},
|
||||
{
|
||||
path: '/full/transport.html',
|
||||
name: 'FullTransport',
|
||||
|
@@ -14,6 +14,9 @@
|
||||
<li v-if="hasConfig">
|
||||
<router-link :to="{name:'FullServers'}"><img src="@/assets/fuwuqi.svg"/> {{$t('head.server')}}</router-link>
|
||||
</li>
|
||||
<li v-if="hasGroup">
|
||||
<router-link :to="{name:'FullGroup'}"><img src="@/assets/group.svg"/> {{$t('head.group')}}</router-link>
|
||||
</li>
|
||||
<li v-if="hasTransport">
|
||||
<router-link :to="{name:'FullTransport'}"><img src="@/assets/dadong.svg"/> {{$t('head.protocol')}}</router-link>
|
||||
</li>
|
||||
@@ -63,6 +66,7 @@ export default {
|
||||
const hasLogger = computed(()=>globalData.value.hasAccess('LoggerShow'));
|
||||
const hasTransport = computed(()=>globalData.value.hasAccess('Transport'));
|
||||
const hasAction = computed(()=>globalData.value.hasAccess('Action'));
|
||||
const hasGroup = computed(()=>globalData.value.hasAccess('Group'));
|
||||
|
||||
const localeOptions = ref(LOCALE_OPTIONS);
|
||||
const { changeLocale, currentLocale } = useLocale()
|
||||
@@ -79,7 +83,7 @@ export default {
|
||||
}
|
||||
|
||||
return {
|
||||
hasConfig,
|
||||
hasConfig,hasGroup,
|
||||
hasLogger,hasTransport,hasAction,localeOptions,locale,handleLocale
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<template>
|
||||
<div class="group-wrap">
|
||||
<el-table stripe :data="state.list" border size="small" width="100%" :height="`${state.height}px`" @cell-dblclick="handleCellClick">
|
||||
<el-table-column prop="Name" :label="$t('server.groupName')" width="100">
|
||||
<template #default="scope">
|
||||
@@ -30,7 +31,7 @@
|
||||
<template v-else>{{ scope.row.Password.replace(/.{1}/g,'*') }}</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="Oper" :label="$t('server.groupOper')" width="110">
|
||||
<el-table-column prop="Oper" :label="$t('server.groupOper')" width="160">
|
||||
<template #default="scope">
|
||||
<div>
|
||||
<el-popconfirm :title="$t('server.groupDelConfirm')" @confirm="handleDel(scope.$index)">
|
||||
@@ -40,16 +41,20 @@
|
||||
</el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
<el-button type="primary" size="small" @click="handleAdd(scope.$index)">
|
||||
<el-button size="small" @click="handleAdd(scope.$index)">
|
||||
<el-icon><Plus /></el-icon>
|
||||
</el-button>
|
||||
<el-button type="primary" size="small" @click="handleUse(scope.$index)">
|
||||
<el-icon><Select /></el-icon>
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { setSignInGroups } from '@/apis/signin';
|
||||
import { setSignIn, setSignInGroups } from '@/apis/signin';
|
||||
import { injectGlobalData } from '@/provide';
|
||||
import { ElMessage } from 'element-plus';
|
||||
import { computed, reactive, watch } from 'vue'
|
||||
@@ -62,7 +67,7 @@ export default {
|
||||
const globalData = injectGlobalData();
|
||||
const state = reactive({
|
||||
list:globalData.value.config.Client.Groups || [],
|
||||
height: computed(()=>globalData.value.height-90),
|
||||
height: computed(()=>globalData.value.height-70),
|
||||
});
|
||||
watch(()=>globalData.value.config.Client.Groups,()=>{
|
||||
if(state.list.filter(c=>c['__editing']).length == 0){
|
||||
@@ -99,6 +104,24 @@ export default {
|
||||
state.list.splice(index+1,0,{Name:'',Id:'',Password:''});
|
||||
handleSave();
|
||||
}
|
||||
const handleUse = (index)=>{
|
||||
const arr = state.list.slice();
|
||||
const temp = arr[index];
|
||||
arr[index] = arr[0];
|
||||
arr[0] = temp;
|
||||
setSignIn({
|
||||
name:globalData.value.config.Client.Name,
|
||||
groups:arr
|
||||
}).then(() => {
|
||||
ElMessage.success(t('common.oper'));
|
||||
setTimeout(()=>{
|
||||
window.location.reload();
|
||||
},1000);
|
||||
}).catch((err) => {
|
||||
console.log(err);
|
||||
ElMessage.error(t('common.operFail'));
|
||||
});
|
||||
}
|
||||
|
||||
const handleSave = ()=>{
|
||||
setSignInGroups(state.list).then(()=>{
|
||||
@@ -109,10 +132,10 @@ export default {
|
||||
});
|
||||
}
|
||||
|
||||
return {state,handleCellClick,handleEditBlur,handleDel,handleAdd}
|
||||
return {state,handleCellClick,handleEditBlur,handleDel,handleAdd,handleUse}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="stylus" scoped>
|
||||
|
||||
.group-wrap{padding:1rem}
|
||||
</style>
|
@@ -4,9 +4,6 @@
|
||||
<el-tab-pane :label="$t('server.messenger')" name="signin" v-if="hasConfig">
|
||||
<SignInServers></SignInServers>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane :label="$t('server.group')" name="groups" v-if="hasGroup">
|
||||
<Groups></Groups>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane :label="$t('server.sync')" name="async" v-if="hasSync">
|
||||
<Async></Async>
|
||||
</el-tab-pane>
|
||||
@@ -14,29 +11,22 @@
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { computed, onMounted, reactive } from 'vue';
|
||||
import { computed, reactive } from 'vue';
|
||||
import { injectGlobalData } from '@/provide';
|
||||
import SignInServers from './SignInServers.vue';
|
||||
import Groups from './Groups.vue';
|
||||
import Async from './Async.vue';
|
||||
export default {
|
||||
components:{SignInServers,Groups,Async},
|
||||
components:{SignInServers,Async},
|
||||
setup(props) {
|
||||
|
||||
const globalData = injectGlobalData();
|
||||
const hasConfig = computed(()=>globalData.value.hasAccess('Config'))
|
||||
const hasSync = computed(()=>globalData.value.hasAccess('Sync'));
|
||||
const hasGroup = computed(()=>globalData.value.hasAccess('Group'));
|
||||
|
||||
const state = reactive({
|
||||
tab:'signin'
|
||||
});
|
||||
onMounted(()=>{
|
||||
state.tab =hasConfig.value ? 'signin' : hasGroup.value ? 'groups' : 'async';
|
||||
});
|
||||
|
||||
return {
|
||||
state,hasConfig,hasSync,hasGroup
|
||||
state,hasConfig,hasSync
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
v1.6.9
|
||||
2025-02-26 16:56:29
|
||||
2025-02-27 14:33:12
|
||||
1. 修复litedb抢锁超时导致客户端登录失败问题
|
||||
2. 同步信标服务器
|
||||
3. 其它一些修复优化
|
Reference in New Issue
Block a user