/**
* 账号管理
* 管理对话账号,并为账号绑定默认客服角色。
*/
import { ref, reactive, onMounted } from 'vue'
import { getAllAccounts, createAccount, updateAccount, deleteAccount, getRoleList } from '../js/api.js'
import { toast } from '../js/utils.js'
export default {
template: `
账号管理
为每个账号绑定一个默认角色。对话页选择账号后,系统会按账号绑定的角色回答,并把会话历史归属到该账号。
暂无账号
| 账号 |
说明 |
绑定角色 |
状态 |
操作 |
|
{{ account.name }}
{{ account.account_key }}
|
{{ account.description || '-' }} |
{{ account.role_name || '未绑定' }} |
{{ account.enabled === false ? '停用' : '启用' }} |
|
`,
setup() {
const accounts = ref([])
const roles = ref([])
const editingId = ref('')
const form = reactive({ name: '', description: '', roleId: '', enabled: true })
async function loadRoles() {
const json = await getRoleList()
if (json.success) {
roles.value = json.data || []
}
}
async function reload() {
try {
const json = await getAllAccounts()
if (json.success) {
accounts.value = json.data || []
}
} catch (e) {
toast('加载账号失败:' + e.message, 'error')
}
}
function resetForm() {
editingId.value = ''
form.name = ''
form.description = ''
form.roleId = ''
form.enabled = true
}
function startEdit(account) {
editingId.value = account.id
form.name = account.name || ''
form.description = account.description || ''
form.roleId = account.role_id || ''
form.enabled = account.enabled !== false
}
async function submit() {
if (!form.name.trim()) {
toast('请输入账号名称', 'error')
return
}
const payload = {
name: form.name,
description: form.description,
roleId: form.roleId || null,
enabled: form.enabled
}
try {
const json = editingId.value
? await updateAccount(editingId.value, payload)
: await createAccount(payload)
if (json.success) {
toast(editingId.value ? '账号已更新' : '账号已创建', 'success')
resetForm()
reload()
} else {
toast(json.message || '操作失败', 'error')
}
} catch (e) {
toast('操作失败:' + e.message, 'error')
}
}
async function remove(account) {
if (!confirm(`确定删除账号「${account.name}」?历史会话记录会保留归属信息。`)) return
try {
const json = await deleteAccount(account.id)
if (json.success) {
toast('账号已删除', 'success')
if (editingId.value === account.id) resetForm()
reload()
} else {
toast(json.message || '删除失败', 'error')
}
} catch (e) {
toast('删除失败:' + e.message, 'error')
}
}
onMounted(() => {
loadRoles()
reload()
})
return { accounts, roles, editingId, form, reload, resetForm, startEdit, submit, remove }
}
}