mirror of
https://github.com/snltty/linker.git
synced 2025-09-26 21:15:57 +08:00
172
This commit is contained in:
6
.github/workflows/dotnet.yml
vendored
6
.github/workflows/dotnet.yml
vendored
@@ -22,6 +22,8 @@ jobs:
|
|||||||
uses: microsoft/setup-msbuild@v2
|
uses: microsoft/setup-msbuild@v2
|
||||||
with:
|
with:
|
||||||
msbuild-architecture: x64
|
msbuild-architecture: x64
|
||||||
|
- name: install dotnet maui
|
||||||
|
run: dotnet workload install maui
|
||||||
- name: get current date
|
- name: get current date
|
||||||
id: date
|
id: date
|
||||||
run: echo "::set-output name=today::$(date +'%Y-%m-%d')"
|
run: echo "::set-output name=today::$(date +'%Y-%m-%d')"
|
||||||
@@ -35,9 +37,9 @@ jobs:
|
|||||||
release_name: v1.7.2.${{ steps.date.outputs.today }}
|
release_name: v1.7.2.${{ steps.date.outputs.today }}
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
body: "1. 内网穿透的计划任务\r\n2. 一些修复和优化"
|
body: "1. 内网穿透的计划任务\r\n2. 一些修复和优化\r\n3. 优化自动分配IP\r\n4. 优化网卡,排除不明数据包\r\n5. 优化管理UI,适配移动端"
|
||||||
- name: publish projects
|
- name: publish projects
|
||||||
run: ./publish.bat
|
run: ./publish.bat "C:\\Android\\android-sdk"
|
||||||
- name: upload-win-x86-oss
|
- name: upload-win-x86-oss
|
||||||
id: upload-win-x86-oss
|
id: upload-win-x86-oss
|
||||||
uses: tvrcgo/oss-action@v0.1.1
|
uses: tvrcgo/oss-action@v0.1.1
|
||||||
|
29
gen/index.js
29
gen/index.js
@@ -128,6 +128,35 @@ function writeUpload(data, tagName) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
data.jobs.build.steps.push({
|
||||||
|
name: `upload-apk-oss`,
|
||||||
|
id: `upload-apk-oss`,
|
||||||
|
uses: 'tvrcgo/oss-action@v0.1.1',
|
||||||
|
with: {
|
||||||
|
'region': 'oss-cn-shenzhen',
|
||||||
|
'key-id': '${{ secrets.ALIYUN_OSS_ID }}',
|
||||||
|
'key-secret': '${{ secrets.ALIYUN_OSS_SECRET }}',
|
||||||
|
'bucket': 'ide-qbcode',
|
||||||
|
'asset-path': `./public/publish-zip/linker.apk`,
|
||||||
|
'target-path': `/downloads/linker/${tagName}/linker.apk`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
data.jobs.build.steps.push({
|
||||||
|
name: `upload-apk`,
|
||||||
|
id: `upload-apk`,
|
||||||
|
uses: 'actions/upload-release-asset@master',
|
||||||
|
env: {
|
||||||
|
'GITHUB_TOKEN': '${{ secrets.ACTIONS_TOKEN }}'
|
||||||
|
},
|
||||||
|
with: {
|
||||||
|
'upload_url': '${{ steps.create_release.outputs.upload_url }}',
|
||||||
|
'asset_path': `./public/publish-zip/linker.apk`,
|
||||||
|
'asset_name': `linker.apk`,
|
||||||
|
'asset_content_type': 'application/apk'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
function writeUploadIpk(data, tagName) {
|
function writeUploadIpk(data, tagName) {
|
||||||
const platforms = ['x64', 'arm', 'arm64'];
|
const platforms = ['x64', 'arm', 'arm64'];
|
||||||
|
@@ -1,5 +1,8 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
|
SET sdkpath=%1
|
||||||
|
if "%sdkpath%"=="" (SET sdkpath="D:\\Android\\android-sdk")
|
||||||
|
|
||||||
rd /s /q public\\extends
|
rd /s /q public\\extends
|
||||||
rd /s /q public\\publish
|
rd /s /q public\\publish
|
||||||
rd /s /q public\\publish-zip
|
rd /s /q public\\publish-zip
|
||||||
@@ -14,6 +17,10 @@ cd ../../
|
|||||||
|
|
||||||
echo F|xcopy "version.txt" "public\\version.txt" /f /h /y
|
echo F|xcopy "version.txt" "public\\version.txt" /f /h /y
|
||||||
|
|
||||||
|
echo F|xcopy "public\\extends\\any\\web\\*" "src\\linker.app\\public\\web\\*" /s /f /h /y
|
||||||
|
dotnet publish ./src/linker.app -c:Release -f:net8.0-android /p:AndroidSigningKeyPass=123321 /p:AndroidSdkDirectory=%sdkpath%
|
||||||
|
echo F|xcopy "src\\linker.app\\bin\\Release\\net8.0-android\\publish\\com.snltty.linker.app-Signed.apk" "public\\publish-zip\\linker.apk" /s /f /h /y
|
||||||
|
|
||||||
for %%r in (win-x86,win-x64,win-arm64) do (
|
for %%r in (win-x86,win-x64,win-arm64) do (
|
||||||
echo F|xcopy "src\\linker.tray.win\\dist\\*" "public\\extends\\%%r\\linker-%%r\\*" /s /f /h /y
|
echo F|xcopy "src\\linker.tray.win\\dist\\*" "public\\extends\\%%r\\linker-%%r\\*" /s /f /h /y
|
||||||
echo F|xcopy "src\\linker.route.win\\dist\\*" "public\\extends\\%%r\\linker-%%r\\*" /s /f /h /y
|
echo F|xcopy "src\\linker.route.win\\dist\\*" "public\\extends\\%%r\\linker-%%r\\*" /s /f /h /y
|
||||||
|
@@ -1 +1 @@
|
|||||||
.el-radio-group[data-v-7061404c]{margin-right:.6rem}.wrap[data-v-7061404c]{padding-bottom:1rem}.el-form-item[data-v-2bef0d8e]{margin-bottom:1rem}.el-input-number--small[data-v-2bef0d8e]{width:10rem!important}.el-form-item[data-v-3d96703d]{margin-bottom:1rem}.el-input-number--small[data-v-3d96703d]{width:10rem!important}.head .search>div[data-v-5d11d068]{margin-right:1rem}.page[data-v-5d11d068]{padding:2rem 0;display:inline-block}.el-form-item[data-v-5d11d068]{margin-bottom:1rem}.el-input-number--small[data-v-5d11d068]{width:10rem!important}.head .search>div[data-v-22d5523e]{margin-right:1rem}.page[data-v-22d5523e]{padding:2rem 0;display:inline-block}.el-form-item[data-v-22d5523e]{margin-bottom:1rem}.el-input-number--small[data-v-22d5523e]{width:10rem!important}.el-form-item[data-v-c2557c92]{margin-bottom:1rem}.el-input-number--small[data-v-c2557c92]{width:10rem!important}.blue[data-v-5b81e49d]{color:#409eff}a.a-edit[data-v-5b81e49d]{margin-left:1rem}a.a-edit .el-icon[data-v-5b81e49d]{vertical-align:middle}.servers-wrap[data-v-597f32d0]{padding:1rem;font-size:1.3rem;color:#555}.servers-wrap a[data-v-597f32d0]{color:#333}
|
.el-radio-group[data-v-7061404c]{margin-right:.6rem}.wrap[data-v-7061404c]{padding-bottom:1rem}.el-form-item[data-v-2bef0d8e]{margin-bottom:1rem}.el-input-number--small[data-v-2bef0d8e]{width:10rem!important}.el-form-item[data-v-3d96703d]{margin-bottom:1rem}.el-input-number--small[data-v-3d96703d]{width:10rem!important}.head .search>div[data-v-5d11d068]{margin-right:1rem}.page[data-v-5d11d068]{padding:2rem 0;display:inline-block}.el-form-item[data-v-5d11d068]{margin-bottom:1rem}.el-input-number--small[data-v-5d11d068]{width:10rem!important}.head .search>div[data-v-22d5523e]{margin-right:1rem}.page[data-v-22d5523e]{padding:2rem 0;display:inline-block}.el-form-item[data-v-22d5523e]{margin-bottom:1rem}.el-input-number--small[data-v-22d5523e]{width:10rem!important}.el-form-item[data-v-c2557c92]{margin-bottom:1rem}.el-input-number--small[data-v-c2557c92]{width:10rem!important}.blue[data-v-21fcf68e]{color:#409eff}a.a-edit[data-v-21fcf68e]{margin-left:1rem}a.a-edit .el-icon[data-v-21fcf68e]{vertical-align:middle}.servers-wrap[data-v-597f32d0]{padding:1rem;font-size:1.3rem;color:#555}.servers-wrap a[data-v-597f32d0]{color:#333}
|
@@ -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.cfba5739.js"></script><script defer="defer" src="js/app.70d76e49.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.3aab4747.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.cfba5739.js"></script><script defer="defer" src="js/app.42e28509.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.3aab4747.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>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -81,6 +81,7 @@ namespace linker.messenger.tuntap.lease
|
|||||||
|
|
||||||
private void LeaseExpTask()
|
private void LeaseExpTask()
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
signInClientState.OnSignInSuccess += async (times) =>
|
signInClientState.OnSignInSuccess += async (times) =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -99,6 +100,7 @@ namespace linker.messenger.tuntap.lease
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
TimerHelper.SetIntervalLong(async () =>
|
TimerHelper.SetIntervalLong(async () =>
|
||||||
{
|
{
|
||||||
await messengerSender.SendReply(new MessageRequestWrap
|
await messengerSender.SendReply(new MessageRequestWrap
|
||||||
|
@@ -112,7 +112,8 @@ namespace linker.messenger.tuntap.lease
|
|||||||
if (NetworkHelper.ToValue(info.IP) == self.IP || info.IP.Equals(IPAddress.Any))
|
if (NetworkHelper.ToValue(info.IP) == self.IP || info.IP.Equals(IPAddress.Any))
|
||||||
{
|
{
|
||||||
self.LastTime = DateTime.Now;
|
self.LastTime = DateTime.Now;
|
||||||
info.IP = NetworkHelper.ToIP(self.IP);
|
uint networkValue = NetworkHelper.ToNetworkValue(cache.IP, cache.PrefixValue);
|
||||||
|
info.IP = NetworkHelper.ToIP(self.IP & ~cache.PrefixValue | networkValue);
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
cache.Users.Remove(self);
|
cache.Users.Remove(self);
|
||||||
@@ -124,6 +125,10 @@ namespace linker.messenger.tuntap.lease
|
|||||||
//分配失败,怎么来的怎么回去
|
//分配失败,怎么来的怎么回去
|
||||||
if (newIPValue == 0)
|
if (newIPValue == 0)
|
||||||
{
|
{
|
||||||
|
//万一网络号已经不一样了,更新一下
|
||||||
|
uint value = NetworkHelper.ToValue(info.IP);
|
||||||
|
uint networkValue = NetworkHelper.ToNetworkValue(cache.IP, cache.PrefixValue);
|
||||||
|
info.IP = NetworkHelper.ToIP(value & ~cache.PrefixValue | networkValue);
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -232,16 +232,7 @@ namespace linker.tun
|
|||||||
packet.Unpacket(buffer, 0, length);
|
packet.Unpacket(buffer, 0, length);
|
||||||
if (packet.DistIPAddress.Length == 0) continue;
|
if (packet.DistIPAddress.Length == 0) continue;
|
||||||
|
|
||||||
try
|
await linkerTunDeviceCallback.Callback(packet).ConfigureAwait(false);
|
||||||
{
|
|
||||||
await linkerTunDeviceCallback.Callback(packet).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
|
||||||
LoggerHelper.Instance.Warning($"tuntap callback Exception {ex}");
|
|
||||||
setupError = ex.Message;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
@@ -9,12 +9,10 @@
|
|||||||
<div class="mgr-1">
|
<div class="mgr-1">
|
||||||
<el-checkbox class="mgr-1" v-model="state.list.SSL" :label="$t('server.relaySSL')" @change="handleSave" />
|
<el-checkbox class="mgr-1" v-model="state.list.SSL" :label="$t('server.relaySSL')" @change="handleSave" />
|
||||||
<el-checkbox v-model="state.list.Disabled" :label="$t('server.relayDisable')" @change="handleSave" />
|
<el-checkbox v-model="state.list.Disabled" :label="$t('server.relayDisable')" @change="handleSave" />
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a href="javascript:;" @click="state.show=true" class="mgl-1 delay a-line" :class="{red:state.nodes.length==0,green:state.nodes.length>0}">
|
<a href="javascript:;" @click="state.show=true" class="mgl-1 delay a-line" :class="{red:state.nodes.length==0,green:state.nodes.length>0}">
|
||||||
{{$t('server.relayNodes')}} : {{state.nodes.length}}
|
{{$t('server.relayNodes')}} : {{state.nodes.length}}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<div class="mgl-1" :title="$t('server.relayUseCdkeyTitle')">
|
<div class="mgl-1" :title="$t('server.relayUseCdkeyTitle')">
|
||||||
<el-checkbox v-model="state.list.UseCdkey" :label="$t('server.relayUseCdkey')" @change="handleSave" />
|
<el-checkbox v-model="state.list.UseCdkey" :label="$t('server.relayUseCdkey')" @change="handleSave" />
|
||||||
</div>
|
</div>
|
||||||
@@ -140,7 +138,7 @@ export default {
|
|||||||
clearTimeout(state.timer);
|
clearTimeout(state.timer);
|
||||||
})
|
})
|
||||||
|
|
||||||
return {state,handleSave,handleEdit}
|
return {globalData,state,handleSave,handleEdit}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@@ -3,8 +3,9 @@
|
|||||||
<div class="flex">
|
<div class="flex">
|
||||||
<el-input class="flex-1" type="password" show-password v-model="state.SForwardSecretKey" maxlength="36" @blur="handleChange" />
|
<el-input class="flex-1" type="password" show-password v-model="state.SForwardSecretKey" maxlength="36" @blur="handleChange" />
|
||||||
<Sync class="mgl-1" name="SForwardSecretKey"></Sync>
|
<Sync class="mgl-1" name="SForwardSecretKey"></Sync>
|
||||||
<span class="mgl-1">{{$t('server.sforwardText')}}</span>
|
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.sforwardText')}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
@@ -13,10 +14,12 @@ import { ElMessage } from 'element-plus';
|
|||||||
import {onMounted, reactive } from 'vue'
|
import {onMounted, reactive } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import Sync from '../sync/Index.vue'
|
import Sync from '../sync/Index.vue'
|
||||||
|
import { injectGlobalData } from '@/provide';
|
||||||
export default {
|
export default {
|
||||||
components:{Sync},
|
components:{Sync},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
const {t} = useI18n();
|
const {t} = useI18n();
|
||||||
|
const globalData = injectGlobalData();
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
SForwardSecretKey:''
|
SForwardSecretKey:''
|
||||||
});
|
});
|
||||||
@@ -44,7 +47,7 @@ export default {
|
|||||||
_getSForwardSecretKey();
|
_getSForwardSecretKey();
|
||||||
});
|
});
|
||||||
|
|
||||||
return {state,handleChange}
|
return {globalData,state,handleChange}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@@ -3,26 +3,26 @@
|
|||||||
<el-card shadow="never">
|
<el-card shadow="never">
|
||||||
<template #header>{{$t('server.messenger')}}</template>
|
<template #header>{{$t('server.messenger')}}</template>
|
||||||
<div>
|
<div>
|
||||||
<el-form label-width="auto">
|
<el-form label-width="auto" :label-position="state.position">
|
||||||
<el-form-item :label="$t('server.messengerAddr')">
|
<el-form-item :label="$t('server.messengerAddr')">
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<el-input class="flex-1" v-model="state.list.Host" @change="handleSave" />
|
<el-input class="flex-1" v-model="state.list.Host" @change="handleSave" />
|
||||||
<Sync class="mgl-1" name="SignInServer"></Sync>
|
<Sync class="mgl-1" name="SignInServer"></Sync>
|
||||||
<span class="mgl-1">{{$t('server.messengerText')}}</span>
|
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.messengerText')}}</span>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('server.messengerSecretKey')">
|
<el-form-item :label="$t('server.messengerSecretKey')">
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<el-input class="flex-1" type="password" show-password maxlength="36" v-model="state.list.SecretKey" @change="handleSave" />
|
<el-input class="flex-1" type="password" show-password maxlength="36" v-model="state.list.SecretKey" @change="handleSave" />
|
||||||
<Sync class="mgl-1" name="SignInSecretKey"></Sync>
|
<Sync class="mgl-1" name="SignInSecretKey"></Sync>
|
||||||
<span class="mgl-1">{{$t('server.messengerSecretKeyText')}}</span>
|
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.messengerSecretKeyText')}}</span>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('server.messengerUserId')">
|
<el-form-item :label="$t('server.messengerUserId')">
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<el-input class="flex-1" type="password" show-password maxlength="36" v-model="state.list.UserId" @change="handleSave" />
|
<el-input class="flex-1" type="password" show-password maxlength="36" v-model="state.list.UserId" @change="handleSave" />
|
||||||
<Sync class="mgl-1" name="SignInUserId"></Sync>
|
<Sync class="mgl-1" name="SignInUserId"></Sync>
|
||||||
<span class="mgl-1">{{$t('server.messengerUserIdText')}}</span>
|
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.messengerUserIdText')}}</span>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<RelayServers class="mgt-2"></RelayServers>
|
<RelayServers class="mgt-2"></RelayServers>
|
||||||
@@ -56,6 +56,7 @@ export default {
|
|||||||
const state = reactive({
|
const state = reactive({
|
||||||
list:globalData.value.config.Client.Server,
|
list:globalData.value.config.Client.Server,
|
||||||
height: computed(()=>globalData.value.height-90),
|
height: computed(()=>globalData.value.height-90),
|
||||||
|
position: computed(()=>globalData.value.isPhone ? 'top':'right'),
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleSave = ()=>{
|
const handleSave = ()=>{
|
||||||
@@ -67,7 +68,7 @@ export default {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return {state,handleSave}
|
return {globalData,state,handleSave}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<div class="flex">
|
<div class="flex">
|
||||||
<el-input class="flex-1" type="password" show-password v-model="state.secretKey" maxlength="36" @blur="handleChange"/>
|
<el-input class="flex-1" type="password" show-password v-model="state.secretKey" maxlength="36" @blur="handleChange"/>
|
||||||
<Sync class="mgl-1" name="UpdaterSecretKey"></Sync>
|
<Sync class="mgl-1" name="UpdaterSecretKey"></Sync>
|
||||||
<span class="mgl-1">{{$t('server.updaterText')}}</span>
|
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.updaterText')}}</span>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item :label="$t('server.updaterRate')">
|
<!-- <el-form-item :label="$t('server.updaterRate')">
|
||||||
@@ -96,7 +96,7 @@ export default {
|
|||||||
state.sec = seconds;
|
state.sec = seconds;
|
||||||
});
|
});
|
||||||
|
|
||||||
return {state,handleChange,handleSecChange}
|
return {globalData,state,handleChange,handleSecChange}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@@ -21,7 +21,10 @@
|
|||||||
<Authors>snltty</Authors>
|
<Authors>snltty</Authors>
|
||||||
<Company>snltty</Company>
|
<Company>snltty</Company>
|
||||||
<Description>1. 内网穿透的计划任务
|
<Description>1. 内网穿透的计划任务
|
||||||
2. 一些修复和优化</Description>
|
2. 一些修复和优化
|
||||||
|
3. 优化自动分配IP
|
||||||
|
4. 优化网卡,排除不明数据包
|
||||||
|
5. 优化管理UI,适配移动端</Description>
|
||||||
<Copyright>snltty</Copyright>
|
<Copyright>snltty</Copyright>
|
||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
|
@@ -1,4 +1,7 @@
|
|||||||
v1.7.2
|
v1.7.2
|
||||||
2025-04-11 00:39:51
|
2025-04-11 16:54:42
|
||||||
1. 内网穿透的计划任务
|
1. 内网穿透的计划任务
|
||||||
2. 一些修复和优化
|
2. 一些修复和优化
|
||||||
|
3. 优化自动分配IP
|
||||||
|
4. 优化网卡,排除不明数据包
|
||||||
|
5. 优化管理UI,适配移动端
|
@@ -22,6 +22,9 @@ jobs:
|
|||||||
uses: microsoft/setup-msbuild@v2
|
uses: microsoft/setup-msbuild@v2
|
||||||
with:
|
with:
|
||||||
msbuild-architecture: x64
|
msbuild-architecture: x64
|
||||||
|
- name: install dotnet maui
|
||||||
|
run: dotnet workload install maui
|
||||||
|
|
||||||
- name: get current date
|
- name: get current date
|
||||||
id: date
|
id: date
|
||||||
run: echo "::set-output name=today::$(date +'%Y-%m-%d')"
|
run: echo "::set-output name=today::$(date +'%Y-%m-%d')"
|
||||||
@@ -37,4 +40,4 @@ jobs:
|
|||||||
prerelease: false
|
prerelease: false
|
||||||
body: ""
|
body: ""
|
||||||
- name: publish projects
|
- name: publish projects
|
||||||
run: ./publish.bat
|
run: ./publish.bat "C:\\Android\\android-sdk"
|
Reference in New Issue
Block a user