diff --git a/frontend/package.json b/frontend/package.json index 03550ed..76eb09e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -35,13 +35,29 @@ } ], "extraResources": [ - { "from": "src/assets", "to": "assets", "filter": ["**/*"] } + { + "from": "src/assets", + "to": "assets", + "filter": [ + "**/*" + ] + } ], "win": { "requestedExecutionLevel": "requireAdministrator", "target": [ - { "target": "nsis", "arch": ["x64"] }, - { "target": "zip", "arch": ["x64"] } + { + "target": "nsis", + "arch": [ + "x64" + ] + }, + { + "target": "zip", + "arch": [ + "x64" + ] + } ], "icon": "public/AUTO-MAS.ico", "artifactName": "AUTO-MAS-Setup-${version}-${arch}.${ext}" @@ -67,7 +83,8 @@ "form-data": "^4.0.4", "markdown-it": "^14.1.0", "vue": "^3.5.17", - "vue-router": "4" + "vue-router": "4", + "vuedraggable": "^4.1.0" }, "devDependencies": { "@types/node": "22.17.1", diff --git a/frontend/src/components/ScriptTable.vue b/frontend/src/components/ScriptTable.vue index 5755065..7a0f831 100644 --- a/frontend/src/components/ScriptTable.vue +++ b/frontend/src/components/ScriptTable.vue @@ -1,288 +1,302 @@ @@ -295,6 +309,10 @@ import { SettingOutlined, UserAddOutlined, } from '@ant-design/icons-vue' +import draggable from 'vuedraggable' +import { ref, watch } from 'vue' +import { Service } from '@/api' +import { message } from 'ant-design-vue' interface Props { scripts: Script[] @@ -303,20 +321,14 @@ interface Props { interface Emits { (e: 'edit', script: Script): void - (e: 'delete', script: Script): void - (e: 'addUser', script: Script): void - (e: 'editUser', user: User): void - (e: 'deleteUser', user: User): void - (e: 'startMaaConfig', script: Script): void - (e: 'saveMaaConfig', script: Script): void - (e: 'toggleUserStatus', user: User): void + (e: 'scriptsReordered', scripts: Script[]): void } const ANNIHILATION_MAP: Record = { @@ -330,6 +342,18 @@ const ANNIHILATION_MAP: Record = { const props = defineProps() const emit = defineEmits() +// 本地脚本列表状态 +const localScripts = ref([]) + +// 监听props变化,更新本地状态 +watch( + () => props.scripts, + (newScripts) => { + localScripts.value = [...newScripts] + }, + { immediate: true, deep: true } +) + const handleEdit = (script: Script) => { emit('edit', script) } @@ -361,6 +385,7 @@ const handleSaveMAAConfig = (script: Script) => { const handleToggleUserStatus = (user: User) => { emit('toggleUserStatus', user) } + const truncateText = (text: string, maxLength: number = 10): string => { if (!text || text.length === 0) return '无' return text.length > maxLength ? text.substring(0, maxLength) + '...' : text @@ -382,6 +407,49 @@ const getRemainingDayText = (remainedDay: number): string => { if (remainedDay === 0) return '剩余天数: 已到期' return `剩余天数: ${remainedDay}天` } + +// 处理脚本拖拽结束 +const onScriptDragEnd = async () => { + try { + const scriptIds = localScripts.value.map((script) => script.id) + await Service.reorderScriptApiScriptsOrderPost({ + indexList: scriptIds, + }) + + // 通知父组件脚本顺序已更改 + emit('scriptsReordered', localScripts.value) + + message.success('脚本排序已保存') + } catch (error) { + console.error('保存脚本排序失败:', error) + message.error('保存脚本排序失败') + + // 恢复原始顺序 + localScripts.value = [...props.scripts] + } +} + +// 处理用户拖拽结束 +const onUserDragEnd = async (evt: any, script: Script) => { + try { + const userIds = script.users?.map((user) => user.id) || [] + await Service.reorderUserApiScriptsUserOrderPost({ + scriptId: script.id, + indexList: userIds, + }) + + message.success('用户排序已保存') + } catch (error) { + console.error('保存用户排序失败:', error) + message.error('保存用户排序失败') + + // 恢复原始顺序 - 找到原始脚本并恢复用户顺序 + const originalScript = props.scripts.find((s) => s.id === script.id) + if (originalScript && originalScript.users) { + script.users = [...originalScript.users] + } + } +}