diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml
index 7bc83b5..851d0ff 100644
--- a/backend/.idea/workspace.xml
+++ b/backend/.idea/workspace.xml
@@ -20,12 +20,22 @@
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
@@ -82,7 +92,7 @@
-
+
@@ -102,132 +112,132 @@
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
diff --git a/web/package-lock.json b/web/package-lock.json
index 332f532..c8bbad1 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -1078,6 +1078,21 @@
"to-fast-properties": "^2.0.0"
}
},
+ "@dzangolab/flag-icon-css": {
+ "version": "3.4.5",
+ "resolved": "https://registry.npmjs.org/@dzangolab/flag-icon-css/-/flag-icon-css-3.4.5.tgz",
+ "integrity": "sha512-XqVAi0O/KITtznpMK5TP4D+rWfwst5lrsbPbes5c5SPMGjwK7fuvlTdEmG2XUrxzYqDTIPshywyzdVYKooGdGA=="
+ },
+ "@dzangolab/vue-country-flag-icon": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@dzangolab/vue-country-flag-icon/-/vue-country-flag-icon-0.2.0.tgz",
+ "integrity": "sha512-o0MqokudSrr56haWk5acyfnFwRBjSH20ARzuLaWNak7Suw3QQXK1dyh0AJFQVuGYmScCI1qpLozvav9P2tg5RA==",
+ "requires": {
+ "@dzangolab/flag-icon-css": "^3.4.5",
+ "core-js": "^3.5.0",
+ "vue": "^2.6.11"
+ }
+ },
"@hapi/address": {
"version": "2.1.4",
"resolved": "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz?cache=0&sync_timestamp=1593993895205&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Faddress%2Fdownload%2F%40hapi%2Faddress-2.1.4.tgz",
diff --git a/web/package.json b/web/package.json
index c7b9a29..018100c 100644
--- a/web/package.json
+++ b/web/package.json
@@ -8,6 +8,7 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
+ "@dzangolab/vue-country-flag-icon": "^0.2.0",
"axios": "^0.20.0",
"core-js": "^3.6.5",
"lodash": "^4.17.20",
diff --git a/web/src/App.vue b/web/src/App.vue
index 1370ce6..769d5cd 100644
--- a/web/src/App.vue
+++ b/web/src/App.vue
@@ -44,29 +44,29 @@ export default {
},
created() {
- this.$vuetify.theme.dark = this.$store.state.isDarkMode;
- this.$vuetify.theme.themes.dark.primary = '#ae51e3';
+ this.$vuetify.theme.dark = false;
+ this.$vuetify.theme.themes.dark.primary = '#0899ab';
this.$vuetify.theme.themes.light.primary = '#d73964';
initStore(this.$store);
},
computed: {
- successMessage: function () {
+ successMessage() {
return this.$store.state.successMessage;
},
- errorMessage: function () {
+ errorMessage() {
return this.$store.state.errorMessage;
}
},
watch: {
- successMessage: function () {
+ successMessage() {
setTimeout(() => {
this.$store.commit("SET_SUCCESS_MESSAGE", "");
}, 1000);
},
- errorMessage: function () {
+ errorMessage() {
setTimeout(() => {
this.$store.commit("SET_ERROR_MESSAGE", "");
}, 1000);
diff --git a/web/src/components/KeywordFilter.vue b/web/src/components/KeywordFilter.vue
new file mode 100644
index 0000000..dd0716b
--- /dev/null
+++ b/web/src/components/KeywordFilter.vue
@@ -0,0 +1,91 @@
+
+
+
+ filter_list
+ 关键词过滤
+
+
+ mdi-delete
+
+
+
+
+ help
+
+
+
+
+ 关键词过滤
+
+
+ 根据关键词过滤节点。如果设置为保留模式,则含有关键词的节点会被保留,否则会被过滤。
+
+
+
+
+
+ 模式
+
+
+
+
+
+
+
+
+
+
+ 关键词
+
+
+ {{ keyword }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/KeywordRename.vue b/web/src/components/KeywordRename.vue
new file mode 100644
index 0000000..15020d2
--- /dev/null
+++ b/web/src/components/KeywordRename.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/KeywordSort.vue b/web/src/components/KeywordSort.vue
new file mode 100644
index 0000000..2ec9da3
--- /dev/null
+++ b/web/src/components/KeywordSort.vue
@@ -0,0 +1,97 @@
+
+
+
+ sort
+ 关键词排序
+
+
+ mdi-delete
+
+
+
+
+ help
+
+
+
+
+ 关键词排序
+
+
+ 根据给出的关键词的顺序对节点进行排序。
+
+
+
+
+
+ 关键词
+
+
+ {{ keyword }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/ProxyList.vue b/web/src/components/ProxyList.vue
index 2fb2d86..d99af2f 100644
--- a/web/src/components/ProxyList.vue
+++ b/web/src/components/ProxyList.vue
@@ -3,7 +3,24 @@
-
+
+
+ mdi-server
+ {{ proxy.type.toUpperCase() }}
+
+
+ mdi-fire
+ UDP
+
+
+ mdi-flash
+ TFO
+
+
+ error
+ SCERT
+
+
@@ -19,16 +36,7 @@ export default {
name: "ProxyList",
props: ['proxies'],
methods: {
- getType(type) {
- switch (type) {
- case 'ss':
- return 'shadowsocks'
- case 'ssr':
- return 'shadowsocksr'
- default:
- return type
- }
- }
+
}
}
diff --git a/web/src/components/RegexFilter.vue b/web/src/components/RegexFilter.vue
new file mode 100644
index 0000000..f171315
--- /dev/null
+++ b/web/src/components/RegexFilter.vue
@@ -0,0 +1,95 @@
+
+
+
+ code
+ 正则过滤
+
+
+ mdi-delete
+
+
+
+
+ help
+
+
+
+
+ 正则过滤
+
+
+ 根据正则表达式过滤节点。如果设置为保留模式,则匹配任何一个正则表达式的节点会被保留,否则会被过滤。
+ 正则表达式需要注意转义。
+
这里是一个合法的正则表达式:
+
+ IEPL|IPLC
+
+
+
+
+
+ 模式
+
+
+
+
+
+
+
+
+
+
+ 正则表达式
+
+
+ {{ regex }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/RegexRename.vue b/web/src/components/RegexRename.vue
new file mode 100644
index 0000000..bf5723f
--- /dev/null
+++ b/web/src/components/RegexRename.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/RegionFilter.vue b/web/src/components/RegionFilter.vue
new file mode 100644
index 0000000..6900e74
--- /dev/null
+++ b/web/src/components/RegionFilter.vue
@@ -0,0 +1,81 @@
+
+
+
+ flag
+ 区域过滤
+
+
+ mdi-delete
+
+
+
+
+ help
+
+
+
+
+ 区域过滤器
+
+
+ 根据区域过滤节点,不选则默认保留所有节点。
+
+
+
+
+
+
+
+ {{ region.name }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/Sort.vue b/web/src/components/Sort.vue
new file mode 100644
index 0000000..9b7602a
--- /dev/null
+++ b/web/src/components/Sort.vue
@@ -0,0 +1,57 @@
+
+
+
+ sort_by_alpha
+ 节点排序
+
+
+ mdi-delete
+
+
+
+
+ help
+
+
+
+
+ 节点排序
+
+
+ 根据节点名排序,一共有正序,逆序,随机三种模式。
+
+
+
+
+
+ 模式
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/main.js b/web/src/main.js
index 35946f9..4a2ed45 100644
--- a/web/src/main.js
+++ b/web/src/main.js
@@ -1,9 +1,9 @@
import Vue from 'vue'
import App from './App.vue'
-import Clipboard from 'v-clipboard';
import vuetify from './plugins/vuetify';
import router from './router';
import store from './store';
+import Clipboard from 'v-clipboard';
Vue.config.productionTip = false
Vue.use(Clipboard);
diff --git a/web/src/router/index.js b/web/src/router/index.js
index 447e99a..b408bc9 100644
--- a/web/src/router/index.js
+++ b/web/src/router/index.js
@@ -11,7 +11,6 @@ import CollectionEditor from "@/views/CollectionEditor";
Vue.use(Router);
const router = new Router({
- mode: "history",
base: process.env.BASE_URL,
routes: [
{
diff --git a/web/src/store/index.js b/web/src/store/index.js
index b36f791..1b3f537 100644
--- a/web/src/store/index.js
+++ b/web/src/store/index.js
@@ -33,7 +33,7 @@ const store = new Vuex.Store({
SET_ERROR_MESSAGE(state, msg) {
state.errorMessage = msg;
- },
+ }
},
actions: {
diff --git a/web/src/views/SubEditor.vue b/web/src/views/SubEditor.vue
index 2c67689..f71026b 100644
--- a/web/src/views/SubEditor.vue
+++ b/web/src/views/SubEditor.vue
@@ -1,13 +1,194 @@
-
+
+
+ 基本信息
+
+
+
+
+
+
+ 常用选项
+
+
+
+ 国旗
+
+
+
+
+
+
+
+
+
+
+
+
+ UDP转发
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 证书验证
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TCP Fast Open
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 节点操作
+
+
+ add_circle
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/web/src/views/Subscription.vue b/web/src/views/Subscription.vue
index 890b472..2e6b885 100644
--- a/web/src/views/Subscription.vue
+++ b/web/src/views/Subscription.vue
@@ -116,25 +116,30 @@
mdi-plus
-
+
-
- mdi-cloud
-
- 节点列表
-
-
-
- mdi-close
-
-
-
-
+
+
+ mdi-cloud
+
+ 节点列表
+
+
+
+ mdi-close
+
+
+
+
+
+
+
@@ -204,6 +209,7 @@ export default {
this.$store.commit("SET_SUCCESS_MESSAGE", "成功复制订阅链接");
break
case 'EDIT':
+ this.$router.push(`/sub-edit/${collection.name}`);
break
case 'DELETE':
this.$store.dispatch("DELETE_COLLECTION", collection.name);
@@ -225,10 +231,20 @@ export default {
this.$store.commit("SET_ERROR_MESSAGE", err);
})
},
+ createSub() {
+ this.$router.push("/sub-edit/UNTITLED");
+ },
+ createCol() {
+ this.$router.push("/collection-edit/UNTITLED")
+ }
}
}
\ No newline at end of file