You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
4.8 KiB
Vue
155 lines
4.8 KiB
Vue
<template>
|
|
<div class="account-list">
|
|
<el-card shadow="never">
|
|
<el-form :inline="true" :model="filters" class="filter-form">
|
|
<el-form-item :label="$t('label.accountType')">
|
|
<el-select v-model="filters.type" :placeholder="$t('common.all')" clearable style="width:140px">
|
|
<el-option label="管理员" value="Admin" />
|
|
<el-option label="医院端" value="Hospital" />
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item :label="$t('placeholder.keyword')">
|
|
<el-input v-model="filters.keyword" :placeholder="$t('placeholder.keyword')" clearable style="width:200px" />
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-button type="primary" @click="onSearch">{{ $t('btn.query') }}</el-button>
|
|
<el-button @click="onReset">{{ $t('btn.reset') }}</el-button>
|
|
<el-button type="success" @click="goAdd">{{ $t('common.add') }}</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<el-table :data="list" v-loading="loading" border stripe>
|
|
<!-- <el-table-column prop="id" label="ID" width="80" /> -->
|
|
<el-table-column :label="$t('table.account')" prop="username" width="140" />
|
|
<el-table-column :label="$t('table.name')" prop="name" width="120" />
|
|
<el-table-column :label="$t('label.accountType')" width="100">
|
|
<template #default="{ row }">
|
|
<el-tag :type="row.userType === 'Admin' ? 'danger' : 'primary'" size="small">
|
|
{{ row.userType === "Admin" ? "管理员" : "医院端" }}
|
|
</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column :label="$t('table.role')" prop="role" width="120" />
|
|
<el-table-column :label="$t('table.hospital')" prop="hospitalName" min-width="160" show-overflow-tooltip />
|
|
<el-table-column :label="$t('label.status')" width="100">
|
|
<template #default="{ row }">
|
|
<el-switch
|
|
:model-value="row.status === '启用' ? true : false"
|
|
@change="toggleStatus(row)"
|
|
:loading="row.__loading"
|
|
:active-text="$t('account.enable')"
|
|
:inactive-text="$t('account.disable')"
|
|
inline-prompt
|
|
/>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column :label="$t('table.action')" width="200" fixed="right">
|
|
<template #default="{ row }">
|
|
<el-button link type="primary" @click="goEdit(row.id)">{{ $t('btn.edit') }}</el-button>
|
|
<el-button link type="warning" @click="resetPwd(row)">{{ $t('account.resetPassword') }}</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
|
|
<div class="pagination">
|
|
<el-pagination
|
|
v-model:current-page="page"
|
|
v-model:page-size="pageSize"
|
|
:page-sizes="[10, 20, 50]"
|
|
:total="total"
|
|
layout="total, sizes, prev, pager, next, jumper"
|
|
@size-change="loadList"
|
|
@current-change="loadList"
|
|
/>
|
|
</div>
|
|
</el-card>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { onMounted, reactive, ref } from "vue";
|
|
import { useRouter } from "vue-router";
|
|
import { ElMessage, ElMessageBox } from "element-plus";
|
|
import { useI18n } from "vue-i18n";
|
|
import {
|
|
getAdminAccounts,
|
|
toggleAdminAccountStatus,
|
|
resetAdminAccountPassword,
|
|
} from "@/service/modular/admin";
|
|
|
|
const { t: $t } = useI18n();
|
|
const router = useRouter();
|
|
const list = ref([]);
|
|
const total = ref(0);
|
|
const page = ref(1);
|
|
const pageSize = ref(10);
|
|
const loading = ref(false);
|
|
const filters = reactive({ type: "", keyword: "" });
|
|
|
|
const loadList = async () => {
|
|
loading.value = true;
|
|
try {
|
|
const res = await getAdminAccounts({
|
|
page: page.value,
|
|
pageSize: pageSize.value,
|
|
...filters,
|
|
});
|
|
list.value = res?.list || [];
|
|
total.value = res?.total || 0;
|
|
} finally {
|
|
loading.value = false;
|
|
}
|
|
};
|
|
|
|
const onSearch = () => {
|
|
page.value = 1;
|
|
loadList();
|
|
};
|
|
const onReset = () => {
|
|
filters.type = "";
|
|
filters.keyword = "";
|
|
onSearch();
|
|
};
|
|
|
|
const goAdd = () => router.push("/admin/accounts/edit");
|
|
const goEdit = (id) => router.push(`/admin/accounts/edit/${id}`);
|
|
|
|
const toggleStatus = async (row) => {
|
|
row.__loading = true;
|
|
try {
|
|
await toggleAdminAccountStatus(row.id);
|
|
ElMessage.success($t('msg.passwordChangeSuccess'));
|
|
loadList();
|
|
} finally {
|
|
row.__loading = false;
|
|
}
|
|
};
|
|
|
|
const resetPwd = async (row) => {
|
|
try {
|
|
await ElMessageBox.confirm(
|
|
`${row.username} - ${$t('account.defaultPassword')}`,
|
|
$t('common.confirm'),
|
|
{ type: "warning" },
|
|
);
|
|
await resetAdminAccountPassword(row.id);
|
|
ElMessage.success($t('msg.passwordResetSuccess'));
|
|
} catch (_) {
|
|
/* canceled */
|
|
}
|
|
};
|
|
|
|
onMounted(loadList);
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.filter-form {
|
|
margin-bottom: 12px;
|
|
}
|
|
.pagination {
|
|
margin-top: 16px;
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
}
|
|
</style>
|