From 1f979b9b850f134ff978c741d2cd28c1916892a7 Mon Sep 17 00:00:00 2001 From: lingling Date: Mon, 20 Mar 2023 16:49:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=89=B9=E9=87=8F=E5=8C=96?= =?UTF-8?q?=20=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + public/img/clash.png | Bin 0 -> 8136 bytes public/img/v2ray.png | Bin 0 -> 3519 bytes public/img/v2rayNG.png | Bin 0 -> 1082 bytes src/components/LinkItem.vue | 43 ++++++++++-------- src/layouts/MainLayout.vue | 7 ++- src/pages/CreateLink.vue | 28 ++++++++---- src/pages/Download.vue | 88 ++++++++++++++++++++++++++++++++++++ src/pages/Help.vue | 84 ++++++++++++++++++++++++++++++++++ src/pages/IndexPage.vue | 30 ++++++++---- src/pages/Subscription.vue | 52 +++++++++++++++++++++ src/router/routes.ts | 2 +- 12 files changed, 294 insertions(+), 41 deletions(-) create mode 100644 public/img/clash.png create mode 100644 public/img/v2ray.png create mode 100644 public/img/v2rayNG.png create mode 100644 src/pages/Download.vue create mode 100644 src/pages/Help.vue create mode 100644 src/pages/Subscription.vue diff --git a/.gitignore b/.gitignore index 553e134..c1ddca6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ node_modules # Quasar core related directories .quasar /dist +/public/res # Cordova related directories and files /src-cordova/node_modules diff --git a/public/img/clash.png b/public/img/clash.png new file mode 100644 index 0000000000000000000000000000000000000000..a963e0abb2e3f8d7d60a058646a38abbb616b068 GIT binary patch literal 8136 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 W{+Fbt_j2(b1JF{}Q>#;fME?)X(sj51 literal 0 HcmV?d00001 diff --git a/public/img/v2ray.png b/public/img/v2ray.png new file mode 100644 index 0000000000000000000000000000000000000000..d69a2a3d7e2dee6420185d90531b1d2c9ead97e2 GIT binary patch literal 3519 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 Ang9R* literal 0 HcmV?d00001 diff --git a/src/components/LinkItem.vue b/src/components/LinkItem.vue index 5038146..25fee20 100644 --- a/src/components/LinkItem.vue +++ b/src/components/LinkItem.vue @@ -4,10 +4,10 @@
{{ props.serve.tips }}
- +
- +
@@ -36,12 +36,8 @@ export default defineComponent({ }, setup(props) { const online = ref(false); - const isonline = () => { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - let obj = JSON.parse(decode(props.text!.replace('vmess://', ''))); + const isonline = (ip: string) => { let http = props.serve.istls == 0 ? 'http' : 'https' - let reg = new RegExp(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/); - let ip = obj.ps.match(reg)[0]; api.text_server(`${http}://${props.serve.ip}:${props.serve.port}/${ip}`).then(res => { online.value = res.data.sataus == 400 }) @@ -49,18 +45,29 @@ export default defineComponent({ const api = new getdata; const $q = useQuasar() const outtext = computed(() => { - // eslint-disable-next-line vue/no-side-effects-in-computed-properties - online.value = false + let tmp = '' // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - let obj = JSON.parse(decode(props.text!.replace('vmess://', ''))); - obj.add = props.serve.ip - obj.port = props.serve.port - obj.host = props.serve.host - obj.tls = props.serve.istls == 0 ? '' : 'tls' - let reg = new RegExp(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/); - obj.path = '/' + obj.ps.match(reg)[0]; - isonline() - return 'vmess://' + encode(JSON.stringify(obj)) + let text = props.text!.replace(/\ +/g, ''); + text = text.replace(/[\r\n]/g, ''); + let arr = text.split('vmess://'); + for (let iterator of arr) { + if (!(iterator.length > 0)) continue + // eslint-disable-next-line vue/no-side-effects-in-computed-properties + online.value = false + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + let obj = JSON.parse(decode(iterator)); + obj.add = props.serve.ip + obj.port = props.serve.port + obj.host = props.serve.host + obj.tls = props.serve.istls == 0 ? '' : 'tls' + let reg = new RegExp(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/); + obj.path = '/' + obj.ps.match(reg)[0]; + let ip = obj.ps.match(reg)[0] + isonline(ip) + tmp += 'vmess://' + encode(JSON.stringify(obj)) + '\n' + } + + return tmp }) const copy = (type: string) => { let tmp = '' diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue index 63d0d1c..6576695 100644 --- a/src/layouts/MainLayout.vue +++ b/src/layouts/MainLayout.vue @@ -65,11 +65,13 @@ const menuList = [ { icon: 'file_download', label: '下载程序', + path: 'download', separator: false }, { - icon: 'error', - label: 'Spam', + icon: 'share', + label: '生成订阅', + path: 'subscription', separator: true }, { @@ -85,6 +87,7 @@ const menuList = [ { icon: 'help_outline', iconColor: 'primary', + path: 'help', label: '帮助', separator: false } diff --git a/src/pages/CreateLink.vue b/src/pages/CreateLink.vue index 26e49b1..8cb2be4 100644 --- a/src/pages/CreateLink.vue +++ b/src/pages/CreateLink.vue @@ -35,20 +35,28 @@ export default defineComponent({ return reg.test(ip); } + // eslint-disable-next-line @typescript-eslint/no-unused-vars watch(() => text.value, (newValue, oldValue) => { //直接监听 let obj = JSON.parse(decode(def_link)) - console.log(newValue) - if (!is_ip(newValue)) { - outlink.value = 'erroe ip' - return + let array = newValue.split(/[\s\n]/) + for (let index = 0; index < array.length; index++) { + if (!is_ip(array[index])) { + outlink.value = 'erroe ip' + return + } + + } + outlink.value = '' + for (let index = 0; index < array.length; index++) { + api.get_country(array[index]).then(res => { + let name = res.data.country == '中国' ? res.data.province : res.data.country + obj.ps = name + array[index] + obj.add = array[index] + outlink.value += 'vmess://' + encode(JSON.stringify(obj)) + '\n' + }) + } - api.get_country(newValue).then(res => { - let name = res.data.country == '中国' ? res.data.province : res.data.country - obj.ps = name + newValue - obj.add = newValue - outlink.value = 'vmess://' + encode(JSON.stringify(obj)) - }) }) return { diff --git a/src/pages/Download.vue b/src/pages/Download.vue new file mode 100644 index 0000000..7666983 --- /dev/null +++ b/src/pages/Download.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/pages/Help.vue b/src/pages/Help.vue new file mode 100644 index 0000000..d922e28 --- /dev/null +++ b/src/pages/Help.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/pages/IndexPage.vue b/src/pages/IndexPage.vue index 1af3bd8..7ecf345 100644 --- a/src/pages/IndexPage.vue +++ b/src/pages/IndexPage.vue @@ -44,24 +44,34 @@ export default defineComponent({ }) const isobj = computed(() => { try { - // eslint-disable-next-line vue/no-side-effects-in-computed-properties - online.value = false - let obj = JSON.parse(decode(text.value.replace('vmess://', ''))); - if (obj.id != '2ee57806-f6e4-482a-ef08-7360c04cd3e5' || obj.net != 'ws') { + if (text.value.length <= 0) { return false } - isonline() + let texttmp = text.value!.replace(/\ +/g, ''); + texttmp = texttmp.replace(/[\r\n]/g, ''); + let arr = texttmp.split('vmess://'); + for (let iterator of arr) { + // eslint-disable-next-line vue/no-side-effects-in-computed-properties + online.value = false + if (iterator.length > 0) { + let obj = JSON.parse(decode(iterator)); + if (obj.id != '2ee57806-f6e4-482a-ef08-7360c04cd3e5' || obj.net != 'ws') { + return false + } + let reg = new RegExp(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/); + let ip = obj.ps.match(reg)[0]; + isonline(ip) + } + + } } catch (error) { - console.log(error); + return false } return true }) - const isonline = () => { - let obj = JSON.parse(decode(text.value?.replace('vmess://', ''))); - let reg = new RegExp(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/); - let ip = obj.ps.match(reg)[0]; + const isonline = (ip: string) => { api.text_server(`http://${ip}:9000/`).then(res => { online.value = res.data.sataus == 400 }) diff --git a/src/pages/Subscription.vue b/src/pages/Subscription.vue new file mode 100644 index 0000000..f6afa94 --- /dev/null +++ b/src/pages/Subscription.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/router/routes.ts b/src/router/routes.ts index b23c8dd..a330577 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -4,7 +4,7 @@ const routes: RouteRecordRaw[] = [ { path: '/', component: () => import('layouts/MainLayout.vue'), - children: [{ path: '', name: 'home', component: () => import('pages/IndexPage.vue') }, { path: 'createlink', name: 'createlink', component: () => import('pages/CreateLink.vue') }], + children: [{ path: '', name: 'home', component: () => import('pages/IndexPage.vue') }, { path: 'createlink', name: 'createlink', component: () => import('pages/CreateLink.vue') }, { path: 'download', name: 'download', component: () => import('pages/Download.vue') }, { path: 'help', name: 'help', component: () => import('pages/Help.vue') }, { path: 'subscription', name: 'subscription', component: () => import('pages/Subscription.vue') }], }, // Always leave this as last one,