lejianwen 1 год назад
Родитель
Сommit
127419e89b
3 измененных файлов с 265 добавлено и 21 удалено
  1. 93 0
      src/views/rustdesk/blacklist.vue
  2. 93 0
      src/views/rustdesk/blocklist.vue
  3. 79 21
      src/views/rustdesk/control.vue

+ 93 - 0
src/views/rustdesk/blacklist.vue

@@ -0,0 +1,93 @@
1
+<template>
2
+  <el-card class="simple-card" shadow="hover" v-loading="form.loading">
3
+    <template #header>
4
+      <div class="card-header">
5
+        <span>BLACK_LIST</span>
6
+      </div>
7
+    </template>
8
+    <el-form :disabled="!canSend">
9
+      <el-form-item>
10
+        <el-input type="textarea" :model-value="form.list.join('|')" :rows="5"></el-input>
11
+      </el-form-item>
12
+      <el-form-item>
13
+        <el-button @click="getList">{{ T('Refresh') }}</el-button>
14
+        <el-button @click="showForm('add')" type="primary">{{ T('Add') }}</el-button>
15
+        <el-button @click="showForm('delete')" type="danger">{{ T('Delete') }}</el-button>
16
+      </el-form-item>
17
+    </el-form>
18
+    <el-dialog v-model="form.form_visible" :title="form.form_type">
19
+      <el-form label-width="100px">
20
+        <el-form-item label="IP">
21
+          <el-input v-model="form.form_input"></el-input>
22
+          <div>多个IP以 | 分割</div>
23
+          <div v-if="form.form_type==='delete'">, 全部填 <strong>all</strong></div>
24
+        </el-form-item>
25
+        <el-form-item>
26
+          <el-button @click="form.form_visible=false">{{ T('Cancel') }}</el-button>
27
+          <el-button @click="form.form_type === 'add' ? add() : remove()" type="primary">{{ T('Submit') }}</el-button>
28
+        </el-form-item>
29
+      </el-form>
30
+    </el-dialog>
31
+  </el-card>
32
+</template>
33
+<script setup>
34
+
35
+  import { T } from '@/utils/i18n'
36
+  import { reactive, watch } from 'vue'
37
+  import { sendCmd } from '@/api/rustdesk'
38
+  import { ElMessage } from 'element-plus'
39
+
40
+  const RELAY_TARGET = '21117'
41
+  const props = defineProps({
42
+    canSend: Boolean,
43
+  })
44
+
45
+  const form = reactive({
46
+    get_cmd: 'blacklist',
47
+    add_cmd: 'blacklist-add',
48
+    remove_cmd: 'blacklist-remove',
49
+    list: [],
50
+    target: RELAY_TARGET,
51
+    loading: false,
52
+    form_visible: false,
53
+    form_input: '',
54
+    form_type: '',
55
+  })
56
+  const getList = async () => {
57
+    form.loading = true
58
+    const res = await sendCmd({ cmd: form.get_cmd, target: RELAY_TARGET }).catch(_ => false)
59
+    form.loading = false
60
+    if (res) {
61
+      form.list = res.data.split('\n').filter(i => i)
62
+    }
63
+  }
64
+  const showForm = (type) => {
65
+    form.form_visible = true
66
+    form.form_input = ''
67
+    form.form_type = type
68
+  }
69
+  const add = async () => {
70
+    const res = await sendCmd({ cmd: form.add_cmd, option: form.form_input, target: RELAY_TARGET }).catch(_ => false)
71
+    if (res) {
72
+      ElMessage.success(T('OperationSuccess'))
73
+      getList()
74
+    }
75
+  }
76
+  const remove = async () => {
77
+    const res = await sendCmd({ cmd: form.remove_cmd, option: form.form_input, target: RELAY_TARGET }).catch(_ => false)
78
+    if (res) {
79
+      ElMessage.success(T('OperationSuccess'))
80
+      getList()
81
+    }
82
+  }
83
+  watch(() => props.canSend, (v) => {
84
+    if (v) {
85
+      getList()
86
+    }
87
+  })
88
+
89
+
90
+</script>
91
+<style scoped lang="scss">
92
+
93
+</style>

+ 93 - 0
src/views/rustdesk/blocklist.vue

@@ -0,0 +1,93 @@
1
+<template>
2
+  <el-card class="simple-card" shadow="hover" v-loading="form.loading">
3
+    <template #header>
4
+      <div class="card-header">
5
+        <span>BLOCK_LIST</span>
6
+      </div>
7
+    </template>
8
+    <el-form :disabled="!canSend">
9
+      <el-form-item>
10
+        <el-input type="textarea" :model-value="form.list.join('|')" :rows="5"></el-input>
11
+      </el-form-item>
12
+      <el-form-item>
13
+        <el-button @click="getList">{{ T('Refresh') }}</el-button>
14
+        <el-button @click="showForm('add')" type="primary">{{ T('Add') }}</el-button>
15
+        <el-button @click="showForm('delete')" type="danger">{{ T('Delete') }}</el-button>
16
+      </el-form-item>
17
+    </el-form>
18
+    <el-dialog v-model="form.form_visible" :title="form.form_type">
19
+      <el-form label-width="100px">
20
+        <el-form-item label="IP">
21
+          <el-input v-model="form.form_input"></el-input>
22
+          <div>多个IP以 | 分割</div>
23
+          <div v-if="form.form_type==='delete'">, 全部填 <strong>all</strong></div>
24
+        </el-form-item>
25
+        <el-form-item>
26
+          <el-button @click="form.form_visible=false">{{ T('Cancel') }}</el-button>
27
+          <el-button @click="form.form_type === 'add' ? add() : remove()" type="primary">{{ T('Submit') }}</el-button>
28
+        </el-form-item>
29
+      </el-form>
30
+    </el-dialog>
31
+  </el-card>
32
+</template>
33
+<script setup>
34
+
35
+  import { T } from '@/utils/i18n'
36
+  import { reactive, watch } from 'vue'
37
+  import { sendCmd } from '@/api/rustdesk'
38
+  import { ElMessage } from 'element-plus'
39
+
40
+  const RELAY_TARGET = '21117'
41
+  const props = defineProps({
42
+    canSend: Boolean,
43
+  })
44
+
45
+  const form = reactive({
46
+    get_cmd: 'blocklist',
47
+    add_cmd: 'blocklist-add',
48
+    remove_cmd: 'blocklist-remove',
49
+    list: [],
50
+    target: RELAY_TARGET,
51
+    loading: false,
52
+    form_visible: false,
53
+    form_input: '',
54
+    form_type: '',
55
+  })
56
+  const getList = async () => {
57
+    form.loading = true
58
+    const res = await sendCmd({ cmd: form.get_cmd, target: RELAY_TARGET }).catch(_ => false)
59
+    form.loading = false
60
+    if (res) {
61
+      form.list = res.data.split('\n').filter(i => i)
62
+    }
63
+  }
64
+  const showForm = (type) => {
65
+    form.form_visible = true
66
+    form.form_input = ''
67
+    form.form_type = type
68
+  }
69
+  const add = async () => {
70
+    const res = await sendCmd({ cmd: form.add_cmd, option: form.form_input, target: RELAY_TARGET }).catch(_ => false)
71
+    if (res) {
72
+      ElMessage.success(T('OperationSuccess'))
73
+      getList()
74
+    }
75
+  }
76
+  const remove = async () => {
77
+    const res = await sendCmd({ cmd: form.remove_cmd, option: form.form_input, target: RELAY_TARGET }).catch(_ => false)
78
+    if (res) {
79
+      ElMessage.success(T('OperationSuccess'))
80
+      getList()
81
+    }
82
+  }
83
+  watch(() => props.canSend, (v) => {
84
+    if (v) {
85
+      getList()
86
+    }
87
+  })
88
+
89
+
90
+</script>
91
+<style scoped lang="scss">
92
+
93
+</style>

+ 79 - 21
src/views/rustdesk/control.vue

@@ -2,10 +2,16 @@
2
   <div>
2
   <div>
3
     <h4 v-html="T('ServerCmdTips', {wiki: '<a target=\'_blank\' href=\'https://github.com/lejianwen/rustdesk-api/wiki/Rustdesk-Command\'>WIKI</a>'})"></h4>
3
     <h4 v-html="T('ServerCmdTips', {wiki: '<a target=\'_blank\' href=\'https://github.com/lejianwen/rustdesk-api/wiki/Rustdesk-Command\'>WIKI</a>'})"></h4>
4
     <h5>
4
     <h5>
5
-      <span>{{ T('Status') }}: </span>
6
-      <el-tag v-if="canSendCmd" type="success">{{ T('Available') }}</el-tag>
5
+      <span>ID {{ T('Status') }}: </span>
6
+      <el-tag v-if="canSendIdServerCmd" type="success">{{ T('Available') }}</el-tag>
7
       <el-tag v-else type="danger">{{ T('NotAvailable') }}</el-tag>
7
       <el-tag v-else type="danger">{{ T('NotAvailable') }}</el-tag>
8
-      <el-button size="small" type="text" @click="refreshCanSendCmd">{{ T('Refresh') }}</el-button>
8
+      <el-button size="small" type="text" @click="refreshCanSendIdServerCmd">{{ T('Refresh') }}</el-button>
9
+    </h5>
10
+    <h5>
11
+      <span>RELAY {{ T('Status') }}: </span>
12
+      <el-tag v-if="canSendRelayServerCmd" type="success">{{ T('Available') }}</el-tag>
13
+      <el-tag v-else type="danger">{{ T('NotAvailable') }}</el-tag>
14
+      <el-button size="small" type="text" @click="refreshCanSendRelayServerCmd">{{ T('Refresh') }}</el-button>
9
     </h5>
15
     </h5>
10
     <el-tabs
16
     <el-tabs
11
         v-model="activeName"
17
         v-model="activeName"
@@ -13,13 +19,13 @@
13
     >
19
     >
14
       <el-tab-pane :label="T('Simple')" name="Simple">
20
       <el-tab-pane :label="T('Simple')" name="Simple">
15
         <el-space>
21
         <el-space>
16
-          <el-card shadow="hover" style="width: 300px" v-loading="rsForm.loading">
22
+          <el-card class="simple-card" shadow="hover" v-loading="rsForm.loading">
17
             <template #header>
23
             <template #header>
18
               <div class="card-header">
24
               <div class="card-header">
19
                 <span>RELAY_SERVERS</span>
25
                 <span>RELAY_SERVERS</span>
20
               </div>
26
               </div>
21
             </template>
27
             </template>
22
-            <el-form :disabled="!canSendCmd">
28
+            <el-form :disabled="!canSendCmd(rsForm.target)">
23
               <el-form-item>
29
               <el-form-item>
24
                 <el-input v-model="rsForm.option"></el-input>
30
                 <el-input v-model="rsForm.option"></el-input>
25
               </el-form-item>
31
               </el-form-item>
@@ -29,13 +35,13 @@
29
               </el-form-item>
35
               </el-form-item>
30
             </el-form>
36
             </el-form>
31
           </el-card>
37
           </el-card>
32
-          <el-card shadow="hover" style="width: 300px">
38
+          <el-card class="simple-card" shadow="hover" v-loading="aurForm.loading">
33
             <template #header>
39
             <template #header>
34
               <div class="card-header">
40
               <div class="card-header">
35
                 <span>ALWAYS_USE_RELAY</span>
41
                 <span>ALWAYS_USE_RELAY</span>
36
               </div>
42
               </div>
37
             </template>
43
             </template>
38
-            <el-form :disabled="!canSendCmd">
44
+            <el-form :disabled="!canSendCmd(aurForm.target)">
39
               <el-form-item>
45
               <el-form-item>
40
                 <el-switch v-model="aurForm.option" active-value="Y" inactive-value="N"></el-switch>
46
                 <el-switch v-model="aurForm.option" active-value="Y" inactive-value="N"></el-switch>
41
               </el-form-item>
47
               </el-form-item>
@@ -45,6 +51,8 @@
45
               </el-form-item>
51
               </el-form-item>
46
             </el-form>
52
             </el-form>
47
           </el-card>
53
           </el-card>
54
+          <blocklist :can-send="canSendCmd(RELAY_TARGET)"></blocklist>
55
+          <blacklist :can-send="canSendCmd(RELAY_TARGET)"></blacklist>
48
         </el-space>
56
         </el-space>
49
 
57
 
50
 
58
 
@@ -55,7 +63,7 @@
55
             <el-form-item>
63
             <el-form-item>
56
               <el-button type="primary" @click="handlerQuery">{{ T('Filter') }}</el-button>
64
               <el-button type="primary" @click="handlerQuery">{{ T('Filter') }}</el-button>
57
               <el-button type="danger" @click="toAdd">{{ T('Add') }}</el-button>
65
               <el-button type="danger" @click="toAdd">{{ T('Add') }}</el-button>
58
-              <el-button type="success" :disabled="!canSendCmd" @click="showCmd({cmd:'',option:''})">{{ T('Send') }}</el-button>
66
+              <el-button type="success" :disabled="!canSendIdServerCmd" @click="showCmd({cmd:'',option:''})">{{ T('Send') }}</el-button>
59
             </el-form-item>
67
             </el-form-item>
60
           </el-form>
68
           </el-form>
61
         </el-card>
69
         </el-card>
@@ -68,7 +76,7 @@
68
             <el-table-column prop="explain" label="explain" align="center"></el-table-column>
76
             <el-table-column prop="explain" label="explain" align="center"></el-table-column>
69
             <el-table-column label="actions" align="center">
77
             <el-table-column label="actions" align="center">
70
               <template #default="{row}">
78
               <template #default="{row}">
71
-                <el-button type="success" :disabled="!canSendCmd" @click="showCmd(row)">{{ T('SendCustom') }}</el-button>
79
+                <el-button type="success" :disabled="!canSendCmd(row.target)" @click="showCmd(row)">{{ T('Send') }}</el-button>
72
                 <el-button v-if="row.id" type="primary" @click="toUpdate(row)">{{ T('Edit') }}</el-button>
80
                 <el-button v-if="row.id" type="primary" @click="toUpdate(row)">{{ T('Edit') }}</el-button>
73
                 <el-button v-if="row.id" type="danger" @click="del(row)">{{ T('Delete') }}</el-button>
81
                 <el-button v-if="row.id" type="danger" @click="del(row)">{{ T('Delete') }}</el-button>
74
               </template>
82
               </template>
@@ -86,6 +94,12 @@
86
               <el-form-item label="option">
94
               <el-form-item label="option">
87
                 <el-input v-model="formData.option"></el-input>
95
                 <el-input v-model="formData.option"></el-input>
88
               </el-form-item>
96
               </el-form-item>
97
+              <el-form-item label="target">
98
+                <el-radio-group v-model="formData.target">
99
+                  <el-radio label="id_server" value="21115"></el-radio>
100
+                  <el-radio label="relay_server" value="21117"></el-radio>
101
+                </el-radio-group>
102
+              </el-form-item>
89
               <el-form-item label="explain">
103
               <el-form-item label="explain">
90
                 <el-input v-model="formData.explain"></el-input>
104
                 <el-input v-model="formData.explain"></el-input>
91
               </el-form-item>
105
               </el-form-item>
@@ -97,7 +111,7 @@
97
           </el-dialog>
111
           </el-dialog>
98
 
112
 
99
           <el-dialog :title="T('SendCmd')" v-model="showCmdForm">
113
           <el-dialog :title="T('SendCmd')" v-model="showCmdForm">
100
-            <el-form label-width="150" :disabled="!canSendCmd">
114
+            <el-form label-width="150" :disabled="!canSendCmd(customCmd.target)">
101
               <el-form-item label="cmd">
115
               <el-form-item label="cmd">
102
                 <el-input v-model="customCmd.cmd"></el-input>
116
                 <el-input v-model="customCmd.cmd"></el-input>
103
               </el-form-item>
117
               </el-form-item>
@@ -107,6 +121,12 @@
107
                   <el-text type="primary">{{ customCmd.example }}</el-text>
121
                   <el-text type="primary">{{ customCmd.example }}</el-text>
108
                 </el-text>
122
                 </el-text>
109
               </el-form-item>
123
               </el-form-item>
124
+              <!--              <el-form-item label="target">
125
+                              <el-radio-group v-model="customCmd.target">
126
+                                <el-radio label="id_server" value="21115"></el-radio>
127
+                                <el-radio label="relay_server" value="21117"></el-radio>
128
+                              </el-radio-group>
129
+                            </el-form-item>-->
110
               <el-form-item>
130
               <el-form-item>
111
                 <el-button type="primary" @click="submitCmd">{{ T('Send') }}</el-button>
131
                 <el-button type="primary" @click="submitCmd">{{ T('Send') }}</el-button>
112
               </el-form-item>
132
               </el-form-item>
@@ -128,32 +148,60 @@
128
   import { onMounted, reactive, ref } from 'vue'
148
   import { onMounted, reactive, ref } from 'vue'
129
   import { T } from '@/utils/i18n'
149
   import { T } from '@/utils/i18n'
130
   import { ElMessage, ElMessageBox } from 'element-plus'
150
   import { ElMessage, ElMessageBox } from 'element-plus'
151
+  import blocklist from '@/views/rustdesk/blocklist.vue'
152
+  import blacklist from '@/views/rustdesk/blacklist.vue'
131
 
153
 
154
+  const ID_TARGET = '21115'
155
+  const RELAY_TARGET = '21117'
132
   const activeName = ref('Simple')
156
   const activeName = ref('Simple')
133
 
157
 
134
-  const canSendCmd = ref(false)
135
-  const checkCanSendCmd = async () => {
136
-    const res = await sendCmd({ cmd: 'h' }).catch(_ => false)
137
-    canSendCmd.value = !!res.data
158
+  const canSendIdServerCmd = ref(false)
159
+  const checkCanSendIdServerCmd = async () => {
160
+    const res = await sendCmd({ cmd: 'h', target: ID_TARGET }).catch(_ => false)
161
+    canSendIdServerCmd.value = !!res.data
138
   }
162
   }
139
-  const refreshCanSendCmd = () => {
140
-    checkCanSendCmd().then(_ => {
141
-      if (canSendCmd.value) {
163
+  const refreshCanSendIdServerCmd = () => {
164
+    checkCanSendIdServerCmd().then(_ => {
165
+      if (canSendIdServerCmd.value) {
142
         getAUR()
166
         getAUR()
143
         getRS()
167
         getRS()
144
       }
168
       }
145
     })
169
     })
146
   }
170
   }
147
-  onMounted(refreshCanSendCmd)
171
+  onMounted(refreshCanSendIdServerCmd)
172
+
173
+  const canSendRelayServerCmd = ref(false)
174
+  const checkCanSendRelayServerCmd = async () => {
175
+    const res = await sendCmd({ cmd: 'h', target: RELAY_TARGET }).catch(_ => false)
176
+    canSendRelayServerCmd.value = !!res.data
177
+  }
178
+  const refreshCanSendRelayServerCmd = () => {
179
+    checkCanSendRelayServerCmd().then(_ => {
180
+      if (canSendRelayServerCmd.value) {
181
+      }
182
+    })
183
+  }
184
+  onMounted(refreshCanSendRelayServerCmd)
185
+
186
+  const canSendCmd = (target) => {
187
+    if (target === ID_TARGET) {
188
+      return canSendIdServerCmd.value
189
+    }
190
+    if (target === RELAY_TARGET) {
191
+      return canSendRelayServerCmd.value
192
+    }
193
+    return false
194
+  }
148
 
195
 
149
   const rsForm = reactive({
196
   const rsForm = reactive({
150
     cmd: 'rs',
197
     cmd: 'rs',
151
     option: '',
198
     option: '',
199
+    target: ID_TARGET,
152
     loading: false,
200
     loading: false,
153
   })
201
   })
154
   const getRS = async () => {
202
   const getRS = async () => {
155
     rsForm.loading = true
203
     rsForm.loading = true
156
-    const res = await sendCmd({ cmd: 'rs' }).catch(_ => false)
204
+    const res = await sendCmd({ cmd: 'rs', target: ID_TARGET }).catch(_ => false)
157
     rsForm.loading = false
205
     rsForm.loading = false
158
     if (res) {
206
     if (res) {
159
       const data = res.data.split('\n').filter(i => i)
207
       const data = res.data.split('\n').filter(i => i)
@@ -170,12 +218,13 @@
170
   const aurForm = reactive({
218
   const aurForm = reactive({
171
     cmd: 'aur',
219
     cmd: 'aur',
172
     option: '',
220
     option: '',
221
+    target: ID_TARGET,
173
     value: 0,
222
     value: 0,
174
     loading: false,
223
     loading: false,
175
   })
224
   })
176
   const getAUR = async () => {
225
   const getAUR = async () => {
177
     aurForm.loading = true
226
     aurForm.loading = true
178
-    const res = await sendCmd({ cmd: 'aur' }).catch(_ => false)
227
+    const res = await sendCmd({ cmd: 'aur', target: ID_TARGET }).catch(_ => false)
179
     aurForm.loading = false
228
     aurForm.loading = false
180
     if (res) {
229
     if (res) {
181
       if (res.data === 'ALWAYS_USE_RELAY: true' || res.data === 'ALWAYS_USE_RELAY: true\n') {
230
       if (res.data === 'ALWAYS_USE_RELAY: true' || res.data === 'ALWAYS_USE_RELAY: true\n') {
@@ -236,6 +285,7 @@
236
     cmd: '',
285
     cmd: '',
237
     alias: '',
286
     alias: '',
238
     option: '',
287
     option: '',
288
+    target: '',
239
     explain: '',
289
     explain: '',
240
   })
290
   })
241
   const formVisible = ref(false)
291
   const formVisible = ref(false)
@@ -252,6 +302,7 @@
252
     formData.cmd = row.cmd
302
     formData.cmd = row.cmd
253
     formData.alias = row.alias
303
     formData.alias = row.alias
254
     formData.option = row.option
304
     formData.option = row.option
305
+    formData.target = row.target
255
     formData.explain = row.explain
306
     formData.explain = row.explain
256
   }
307
   }
257
   const submit = async () => {
308
   const submit = async () => {
@@ -275,6 +326,7 @@
275
   const customCmd = reactive({
326
   const customCmd = reactive({
276
     cmd: '',
327
     cmd: '',
277
     option: '',
328
     option: '',
329
+    target: '',
278
     res: '',
330
     res: '',
279
     example: '',
331
     example: '',
280
   })
332
   })
@@ -283,17 +335,23 @@
283
     customCmd.cmd = row.cmd
335
     customCmd.cmd = row.cmd
284
     customCmd.option = ''
336
     customCmd.option = ''
285
     customCmd.res = ''
337
     customCmd.res = ''
338
+    customCmd.target = row.target
286
     customCmd.example = `${row.cmd} ${row.option}`
339
     customCmd.example = `${row.cmd} ${row.option}`
287
   }
340
   }
288
   const submitCmd = async () => {
341
   const submitCmd = async () => {
289
     sendCmd(customCmd).then(res => {
342
     sendCmd(customCmd).then(res => {
290
       console.log(res)
343
       console.log(res)
291
       customCmd.res = res.data
344
       customCmd.res = res.data
345
+      ElMessage.success(T('OperationSuccess'))
292
     })
346
     })
293
   }
347
   }
294
 
348
 
295
 </script>
349
 </script>
296
 
350
 
297
 <style scoped lang="scss">
351
 <style scoped lang="scss">
298
-
352
+.simple-card {
353
+  width: 300px;
354
+  margin: 10px;
355
+  min-height: 300px;
356
+}
299
 </style>
357
 </style>