Skip to content

Commit 901e489

Browse files
committed
feat: add profile and subscribe template functions for streamlined creation
1 parent 16037db commit 901e489

File tree

5 files changed

+76
-141
lines changed

5 files changed

+76
-141
lines changed

frontend/src/stores/profiles.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import { parse } from 'yaml'
44

55
import { ReadFile, WriteFile } from '@/bridge'
66
import { ProfilesFilePath } from '@/constant/app'
7+
import * as Defaults from '@/constant/profile'
78
import { useAppSettingsStore } from '@/stores'
8-
import { ignoredError, eventBus, stringifyNoFolding, migrateProfiles } from '@/utils'
9+
import { ignoredError, eventBus, stringifyNoFolding, migrateProfiles, sampleID } from '@/utils'
910

1011
export const useProfilesStore = defineStore('profiles', () => {
1112
const appSettingsStore = useAppSettingsStore()
@@ -67,6 +68,21 @@ export const useProfilesStore = defineStore('profiles', () => {
6768

6869
const getProfileById = (id: string) => profiles.value.find((v) => v.id === id)
6970

71+
const getProfileTemplate = (name = ''): IProfile => {
72+
return {
73+
id: sampleID(),
74+
name: name,
75+
log: Defaults.DefaultLog(),
76+
experimental: Defaults.DefaultExperimental(),
77+
inbounds: Defaults.DefaultInbounds(),
78+
outbounds: Defaults.DefaultOutbounds(),
79+
route: Defaults.DefaultRoute(),
80+
dns: Defaults.DefaultDns(),
81+
mixin: Defaults.DefaultMixin(),
82+
script: Defaults.DefaultScript(),
83+
}
84+
}
85+
7086
return {
7187
profiles,
7288
currentProfile,
@@ -76,5 +92,6 @@ export const useProfilesStore = defineStore('profiles', () => {
7692
editProfile,
7793
deleteProfile,
7894
getProfileById,
95+
getProfileTemplate,
7996
}
8097
})

frontend/src/stores/subscribes.ts

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -48,35 +48,7 @@ export const useSubscribesStore = defineStore('subscribes', () => {
4848
}
4949

5050
const importSubscribe = async (name: string, url: string) => {
51-
const id = sampleID()
52-
await addSubscribe({
53-
id: id,
54-
name: name,
55-
upload: 0,
56-
download: 0,
57-
total: 0,
58-
expire: 0,
59-
updateTime: 0,
60-
type: 'Http',
61-
url: url,
62-
website: '',
63-
path: `data/subscribes/${id}.json`,
64-
include: '',
65-
exclude: '',
66-
includeProtocol: '',
67-
excludeProtocol: DefaultExcludeProtocols,
68-
proxyPrefix: '',
69-
disabled: false,
70-
inSecure: false,
71-
requestMethod: RequestMethod.Get,
72-
requestTimeout: 15,
73-
header: {
74-
request: {},
75-
response: {},
76-
},
77-
proxies: [],
78-
script: DefaultSubscribeScript,
79-
})
51+
await addSubscribe(getSubscribeTemplate(name, { url }))
8052
}
8153

8254
const deleteSubscribe = async (id: string) => {
@@ -255,6 +227,38 @@ export const useSubscribesStore = defineStore('subscribes', () => {
255227

256228
const getSubscribeById = (id: string) => subscribes.value.find((v) => v.id === id)
257229

230+
const getSubscribeTemplate = (name = '', options: { url?: string } = {}): Subscription => {
231+
const id = sampleID()
232+
return {
233+
id: id,
234+
name: name,
235+
upload: 0,
236+
download: 0,
237+
total: 0,
238+
expire: 0,
239+
updateTime: 0,
240+
type: 'Http',
241+
url: options.url || '',
242+
website: '',
243+
path: `data/subscribes/${id}.json`,
244+
include: '',
245+
exclude: '',
246+
includeProtocol: '',
247+
excludeProtocol: DefaultExcludeProtocols,
248+
proxyPrefix: '',
249+
disabled: false,
250+
inSecure: false,
251+
requestMethod: RequestMethod.Get,
252+
requestTimeout: 15,
253+
header: {
254+
request: {},
255+
response: {},
256+
},
257+
proxies: [],
258+
script: DefaultSubscribeScript,
259+
}
260+
}
261+
258262
return {
259263
subscribes,
260264
setupSubscribes,
@@ -266,5 +270,6 @@ export const useSubscribesStore = defineStore('subscribes', () => {
266270
updateSubscribes,
267271
getSubscribeById,
268272
importSubscribe,
273+
getSubscribeTemplate,
269274
}
270275
})

frontend/src/views/HomeView/components/QuickStart.vue

Lines changed: 7 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,11 @@
22
import { h, inject, ref } from 'vue'
33
import { useI18n } from 'vue-i18n'
44
5-
import { DefaultSubscribeScript } from '@/constant/app'
6-
import { DefaultExcludeProtocols } from '@/constant/kernel'
7-
import * as Defaults from '@/constant/profile'
8-
import { RequestMethod } from '@/enums/app'
95
import { useProfilesStore, useAppSettingsStore, useSubscribesStore } from '@/stores'
106
import { message, sampleID } from '@/utils'
117
128
import Button from '@/components/Button/index.vue'
139
14-
import type { Subscription } from '@/types/app'
15-
1610
const { t } = useI18n()
1711
const subscribeStore = useSubscribesStore()
1812
const profilesStore = useProfilesStore()
@@ -26,70 +20,30 @@ const handleCancel = inject('cancel') as any
2620
const handleSubmit = inject('submit') as any
2721
2822
const handleSave = async () => {
29-
const subscribeID = sampleID()
30-
3123
if (!name.value) {
3224
name.value = sampleID()
3325
}
3426
35-
const subscribe: Subscription = {
36-
id: subscribeID,
37-
name: name.value,
38-
url: url.value,
39-
upload: 0,
40-
download: 0,
41-
total: 0,
42-
expire: 0,
43-
updateTime: 0,
44-
type: 'Http',
45-
website: '',
46-
path: `data/subscribes/${subscribeID}.json`,
47-
include: '',
48-
exclude: '',
49-
includeProtocol: '',
50-
excludeProtocol: DefaultExcludeProtocols,
51-
proxyPrefix: '',
52-
disabled: false,
53-
inSecure: false,
54-
requestMethod: RequestMethod.Get,
55-
requestTimeout: 15,
56-
header: {
57-
request: {},
58-
response: {},
59-
},
60-
proxies: [],
61-
script: DefaultSubscribeScript,
62-
}
27+
const sub = subscribeStore.getSubscribeTemplate(name.value, { url: url.value })
6328
6429
loading.value = true
6530
6631
try {
67-
await subscribeStore.addSubscribe(subscribe)
68-
await subscribeStore.updateSubscribe(subscribeID)
32+
await subscribeStore.addSubscribe(sub)
33+
await subscribeStore.updateSubscribe(sub.id)
6934
} catch (error: any) {
7035
loading.value = false
7136
console.log(error)
7237
message.error(error)
73-
subscribeStore.deleteSubscribe(subscribeID)
38+
subscribeStore.deleteSubscribe(sub.id)
7439
return
7540
}
7641
77-
const profile: IProfile = {
78-
id: sampleID(),
79-
name: name.value,
80-
log: Defaults.DefaultLog(),
81-
experimental: Defaults.DefaultExperimental(),
82-
inbounds: Defaults.DefaultInbounds(),
83-
outbounds: Defaults.DefaultOutbounds(),
84-
route: Defaults.DefaultRoute(),
85-
dns: Defaults.DefaultDns(),
86-
mixin: Defaults.DefaultMixin(),
87-
script: Defaults.DefaultScript(),
88-
}
42+
const profile = profilesStore.getProfileTemplate(name.value)
8943
9044
if (profile.outbounds[0] && profile.outbounds[1]) {
91-
profile.outbounds[0].outbounds.push({ id: subscribeID, tag: subscribeID, type: 'Subscription' })
92-
profile.outbounds[1].outbounds.push({ id: subscribeID, tag: subscribeID, type: 'Subscription' })
45+
profile.outbounds[0].outbounds.push({ id: sub.id, tag: sub.id, type: 'Subscription' })
46+
profile.outbounds[1].outbounds.push({ id: sub.id, tag: sub.id, type: 'Subscription' })
9347
}
9448
9549
await profilesStore.addProfile(profile)

frontend/src/views/ProfilesView/components/ProfileForm.vue

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
import { ref, inject, computed, useTemplateRef, type Ref, h } from 'vue'
33
import { useI18n } from 'vue-i18n'
44
5-
import * as Defaults from '@/constant/profile'
65
import { useProfilesStore } from '@/stores'
7-
import { deepClone, generateConfig, message, sampleID, alert } from '@/utils'
6+
import { deepClone, generateConfig, message, alert } from '@/utils'
87
98
import Button from '@/components/Button/index.vue'
109
import Dropdown from '@/components/Dropdown/index.vue'
@@ -37,11 +36,14 @@ const props = withDefaults(defineProps<Props>(), {
3736
step: Step.Name,
3837
})
3938
40-
const loading = ref(false)
39+
const { t } = useI18n()
4140
const inboundsRef = useTemplateRef('inboundsRef')
4241
const outboundsRef = useTemplateRef('outboundsRef')
4342
const routeRef = useTemplateRef('routeRef')
4443
const dnsRef = useTemplateRef('dnsRef')
44+
const profilesStore = useProfilesStore()
45+
46+
const loading = ref(false)
4547
const currentStep = ref(props.step)
4648
4749
const stepItems = [
@@ -54,18 +56,7 @@ const stepItems = [
5456
{ title: 'profile.step.mixin-script' },
5557
] as const
5658
57-
const profile = ref<IProfile>({
58-
id: sampleID(),
59-
name: '',
60-
log: Defaults.DefaultLog(),
61-
experimental: Defaults.DefaultExperimental(),
62-
inbounds: Defaults.DefaultInbounds(),
63-
outbounds: Defaults.DefaultOutbounds(),
64-
route: Defaults.DefaultRoute(),
65-
dns: Defaults.DefaultDns(),
66-
mixin: Defaults.DefaultMixin(),
67-
script: Defaults.DefaultScript(),
68-
})
59+
const profile = ref<IProfile>(profilesStore.getProfileTemplate())
6960
7061
const inboundOptions = computed(() =>
7162
profile.value.inbounds.map((v) => ({ label: v.tag, value: v.id })),
@@ -99,9 +90,6 @@ const mixinAndScriptConfig = computed({
9990
},
10091
})
10192
102-
const { t } = useI18n()
103-
const profilesStore = useProfilesStore()
104-
10593
const handleCancel = inject('cancel') as any
10694
const handleSubmit = inject('submit') as any
10795
const handlePrevStep = () => currentStep.value--

frontend/src/views/SubscribesView/components/SubscribeForm.vue

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22
import { ref, inject, computed, h } from 'vue'
33
import { useI18n } from 'vue-i18n'
44
5-
import { DefaultSubscribeScript, RequestMethodOptions } from '@/constant/app'
6-
import { DefaultExcludeProtocols } from '@/constant/kernel'
7-
import { RequestMethod } from '@/enums/app'
5+
import { RequestMethodOptions } from '@/constant/app'
86
import { useBool } from '@/hooks'
97
import { useSubscribesStore } from '@/stores'
10-
import { deepClone, sampleID, message } from '@/utils'
8+
import { deepClone, message } from '@/utils'
119
1210
import Button from '@/components/Button/index.vue'
1311
@@ -19,47 +17,20 @@ interface Props {
1917
2018
const props = defineProps<Props>()
2119
22-
const loading = ref(false)
20+
const { t } = useI18n()
21+
const [showMore, toggleShowMore] = useBool(false)
22+
const subscribeStore = useSubscribesStore()
2323
24-
const sub = ref<Subscription>({
25-
id: sampleID(),
26-
name: '',
27-
upload: 0,
28-
download: 0,
29-
total: 0,
30-
expire: 0,
31-
updateTime: 0,
32-
type: 'Http',
33-
url: '',
34-
website: '',
35-
path: `data/subscribes/${sampleID()}.json`,
36-
include: '',
37-
exclude: '',
38-
includeProtocol: '',
39-
excludeProtocol: DefaultExcludeProtocols,
40-
proxyPrefix: '',
41-
disabled: false,
42-
inSecure: false,
43-
requestMethod: RequestMethod.Get,
44-
requestTimeout: 15,
45-
header: {
46-
request: {},
47-
response: {},
48-
},
49-
proxies: [],
50-
script: DefaultSubscribeScript,
51-
})
24+
const loading = ref(false)
25+
const sub = ref<Subscription>(subscribeStore.getSubscribeTemplate())
5226
5327
const isManual = computed(() => sub.value.type === 'Manual')
5428
const isRemote = computed(() => sub.value.type === 'Http')
5529
56-
const { t } = useI18n()
57-
const [showMore, toggleShowMore] = useBool(false)
58-
const subscribeStore = useSubscribesStore()
59-
6030
const handleCancel = inject('cancel') as any
31+
const handleSubmit = inject('submit') as any
6132
62-
const handleSubmit = async () => {
33+
const handleSave = async () => {
6334
loading.value = true
6435
6536
try {
@@ -68,7 +39,7 @@ const handleSubmit = async () => {
6839
} else {
6940
await subscribeStore.addSubscribe(sub.value)
7041
}
71-
handleCancel()
42+
await handleSubmit()
7243
} catch (error: any) {
7344
console.error(error)
7445
message.error(error)
@@ -101,7 +72,7 @@ const modalSlots = {
10172
type: 'primary',
10273
loading: loading.value,
10374
disabled: !sub.value.name || !sub.value.path || (!sub.value.url && !isManual.value),
104-
onClick: handleSubmit,
75+
onClick: handleSave,
10576
},
10677
() => t('common.save'),
10778
),

0 commit comments

Comments
 (0)