Skip to content

Commit f483ed5

Browse files
committed
feat: 加入设置页面
1 parent 553c019 commit f483ed5

25 files changed

Lines changed: 1003 additions & 88 deletions

src/components/BaseButton.vue

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { computed } from 'vue';
33
import { RouterLink } from 'vue-router';
44
import { getButtonColor } from '@/colors.js';
55
import BaseIcon from '@/components/BaseIcon.vue';
6+
import { mdiLoading } from '@mdi/js';
67
78
const props = defineProps({
89
label: {
@@ -46,6 +47,7 @@ const props = defineProps({
4647
active: Boolean,
4748
disabled: Boolean,
4849
roundedFull: Boolean,
50+
loading: Boolean,
4951
});
5052
5153
const is = computed(() => {
@@ -116,9 +118,15 @@ const componentClass = computed(() => {
116118
:type="computedType"
117119
:to="to"
118120
:target="target"
119-
:disabled="disabled"
121+
:disabled="disabled || loading"
120122
>
121-
<BaseIcon v-if="icon" :path="icon" :size="iconSize" />
123+
<BaseIcon
124+
v-if="loading"
125+
class="animate-spin"
126+
:path="mdiLoading"
127+
:size="iconSize"
128+
/>
129+
<BaseIcon v-else-if="icon" :path="icon" :size="iconSize" />
122130
<span v-if="label" :class="labelClass">{{ label }}</span>
123131
</component>
124132
</template>

src/components/Console.vue

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<script setup lang="ts">
2-
import { ServerLineType } from '@/types/server';
32
import { AnsiUp } from 'ansi_up';
43
import { encode } from 'html-entities';
54
import { computed, nextTick, onMounted, ref, watch } from 'vue';
@@ -10,13 +9,17 @@ const props = defineProps({
109
require: true,
1110
default: () => [],
1211
},
12+
type: {
13+
type: String,
14+
default: '',
15+
},
1316
});
1417
1518
const scrollToBottom = () =>
1619
(consoleRef.value.scrollTop = consoleRef.value.scrollHeight ?? 0);
1720
18-
const typed = computed(() => props.datas as { type: number; data: string }[]);
1921
const consoleRef = ref();
22+
const typed = computed(() => props.datas as { type: string; data: string }[]);
2023
const length = computed(() => props.datas.length);
2124
const ansiUp = new AnsiUp();
2225
ansiUp.use_classes = true;
@@ -33,29 +36,39 @@ onMounted(scrollToBottom);
3336
class="whitespace-pre-wrap break-all hover:bg-[#8881] px-3 transition-colors"
3437
>
3538
<span
36-
v-if="line.type === ServerLineType.Output"
39+
v-if="line.type === 'output' && type === 'server'"
3740
v-html="ansiUp.ansi_to_html(line.data)"
3841
>
3942
</span>
43+
4044
<span
41-
v-else-if="line.type === ServerLineType.Input"
45+
v-else-if="line.type === 'input' && type === 'server'"
4246
class="opacity-70"
4347
title="输入"
4448
>
4549
>> {{ line.data }}
4650
</span>
47-
<span v-else-if="line.type === ServerLineType.Info">
51+
52+
<span v-else-if="line.type === 'info'">
4853
<span class="text-sky-500"
4954
>[<span class="hover:underline hover:font-bold">Serein</span>]</span
5055
>
5156
{{ line.data }}
5257
</span>
53-
<span v-else-if="line.type === ServerLineType.Error">
58+
59+
<span v-else-if="line.type === 'sent' || line.type === 'received'">
60+
<span v-if="line.type === 'sent'" class="text-sky-500">[↑]</span>
61+
<span v-else class="text-emerald-500">[↓]</span>
62+
{{ line.data }}
63+
</span>
64+
65+
<span v-else-if="line.type === 'error'">
5466
<span class="text-red-500"
5567
>[<span class="hover:underline font-bold">Error</span>]</span
5668
>
5769
{{ line.data }}
5870
</span>
71+
5972
<span v-else v-html="encode(line.data)"></span>
6073
</div>
6174
</div>

src/components/FormControl.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ defineExpose({ inputEl, selectEl, textareaEl });
154154
v-else-if="computedType === 'textarea'"
155155
:id="id"
156156
v-model="computedValue"
157+
class="min-h-24"
157158
:class="inputElClass"
158159
:disabled="disabled"
159160
:name="name"

src/components/FormField.vue

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<script setup lang="ts">
2+
import { encode } from 'html-entities';
23
import { computed, useSlots } from 'vue';
34
4-
defineProps({
5+
const props = defineProps({
56
label: {
67
type: String,
78
default: null,
@@ -17,6 +18,9 @@ defineProps({
1718
});
1819
1920
const slots = useSlots();
21+
const escaptedHelp = computed(() =>
22+
encode(props.help)?.replace(/\n/g, '<br/>'),
23+
);
2024
2125
const wrapperClass = computed(() => {
2226
const base = [];
@@ -47,7 +51,7 @@ const wrapperClass = computed(() => {
4751
<slot />
4852
</div>
4953
<div v-if="help" class="text-xs text-gray-500 dark:text-slate-400 mt-1">
50-
{{ help }}
54+
<span v-html="escaptedHelp" />
5155
</div>
5256
</div>
5357
</template>

src/components/SectionTitleLineWithButton.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const hasSlot = computed(() => useSlots().default);
2424
<template>
2525
<section
2626
:class="{ 'pt-6': !main }"
27-
class="mb-6 flex items-center justify-between"
27+
class="mb-6 flex items-center justify-between flex-wrap"
2828
>
2929
<div class="flex items-center justify-start">
3030
<IconRounded

src/menuAside.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,23 +56,23 @@ export default [
5656
icon: mdiCogs,
5757
menu: [
5858
{
59-
to: '/settings/connection',
59+
to: 'settings.connection',
6060
label: '连接',
6161
},
6262
{
63-
to: '/settings/reaction',
63+
to: 'settings.reaction',
6464
label: '反应',
6565
},
6666
{
67-
to: '/settings/webapi',
67+
to: 'settings.webapi',
6868
label: '网页服务器',
6969
},
7070
{
71-
to: '/settings/app',
71+
to: 'settings.application',
7272
label: '应用',
7373
},
7474
{
75-
to: '/settings/web',
75+
to: 'settings.webconsole',
7676
label: '网页',
7777
},
7878
],

src/router/index.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,46 @@ const routes: RouteRecordRaw[] = [
8383
name: 'about',
8484
component: () => import('@/views/AboutView.vue'),
8585
},
86+
{
87+
meta: {
88+
title: '连接设置',
89+
},
90+
path: '/settings/connection',
91+
name: 'settings.connection',
92+
component: () => import('@/views/settings/ConnectionSettingView.vue'),
93+
},
94+
{
95+
meta: {
96+
title: '反应设置',
97+
},
98+
path: '/settings/reaction',
99+
name: 'settings.reaction',
100+
component: () => import('@/views/settings/ReactionSettingView.vue'),
101+
},
102+
{
103+
meta: {
104+
title: '网页服务器设置',
105+
},
106+
path: '/settings/webapi',
107+
name: 'settings.webapi',
108+
component: () => import('@/views/settings/WebApiSettingView.vue'),
109+
},
110+
{
111+
meta: {
112+
title: '应用设置',
113+
},
114+
path: '/settings/application',
115+
name: 'settings.application',
116+
component: () => import('@/views/settings/AppSettingView.vue'),
117+
},
118+
{
119+
meta: {
120+
title: '网页控制台设置',
121+
},
122+
path: '/settings/webconsole',
123+
name: 'settings.webconsole',
124+
component: () => import('@/views/settings/WebConsoleSettingView.vue'),
125+
},
86126
{
87127
meta: {
88128
title: '登录',

src/services/apis/client.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,9 @@ import { useToast } from 'vue-toastification';
77
const toast = useToast();
88
const client = axios.create({ baseURL: '/api' });
99

10-
client.defaults.headers.post =
11-
client.defaults.headers.put =
12-
client.defaults.headers.delete =
13-
{
14-
'Content-Type': 'application/json',
15-
};
10+
client.defaults.headers.post = client.defaults.headers.put = {
11+
'Content-Type': 'application/json',
12+
};
1613

1714
client.interceptors.request.use((value) => {
1815
const mainStore = useMainStore();

src/services/apis/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ export async function inputServer(id: string, input: string) {
4545
await client.post<Packet<void>>(`/servers/${id}/input`, [input]);
4646
}
4747
export async function getServerHistory(id: string) {
48-
const response = await client.get<Packet<Line[]>>(`/servers/${id}/history`);
48+
const response = await client.get<Packet<{ type: string; data?: string }[]>>(
49+
`/servers/${id}/history`,
50+
);
4951
return response.data.data;
5052
}

src/services/apis/settings.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import client from '@/services/apis/client';
2+
import { Packet } from '@/types/packet';
3+
import { Settings } from '@/types/settings';
4+
5+
export async function getSettings() {
6+
const response = await client.get<Packet<Settings>>('/settings');
7+
return response.data.data;
8+
}
9+
10+
export async function updateConnectionSetting(
11+
setting: Settings['connection'],
12+
): Promise<void> {
13+
await client.put<Packet<Settings>>('/settings/connection', setting);
14+
}
15+
16+
export async function updateApplicationSetting(
17+
setting: Settings['application'],
18+
): Promise<void> {
19+
await client.put<Packet<Settings>>('/settings/application', setting);
20+
}
21+
22+
export async function updateWebApiSetting(
23+
setting: Settings['webApi'],
24+
): Promise<void> {
25+
await client.put<Packet<Settings>>('/settings/web-api', setting);
26+
}

0 commit comments

Comments
 (0)