增加admin管理帐号和项目的界面--初步实现

This commit is contained in:
Cheng Zhou
2025-12-17 20:12:49 +08:00
parent 4f50237f56
commit c074c2b5bc
18933 changed files with 2088454 additions and 63 deletions
+113
View File
@@ -0,0 +1,113 @@
<template>
<div class="page">
<el-card>
<div class="header">
<h3>项目管理</h3>
<el-button type="primary" @click="openCreate">新建项目</el-button>
</div>
<el-table :data="projects" v-loading="loading" stripe>
<el-table-column prop="code" label="项目编号" width="140" />
<el-table-column prop="name" label="项目名称" min-width="200" />
<el-table-column prop="sponsor" label="申办方" min-width="160" />
<el-table-column prop="status" label="状态" width="120">
<template #default="scope">
<el-tag :type="statusTag(scope.row.status)">{{ statusLabel(scope.row.status) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="created_at" label="创建时间" width="200" />
<el-table-column label="操作" width="320" fixed="right">
<template #default="scope">
<el-button link type="primary" size="small" @click="openEdit(scope.row)">编辑</el-button>
<el-button link type="primary" size="small" @click="goMembers(scope.row)">成员配置</el-button>
<el-button link type="primary" size="small" @click="goSites(scope.row)">中心管理</el-button>
<el-button link type="success" size="small" @click="enterStudy(scope.row)">进入项目</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<ProjectForm v-model:visible="formVisible" :project="editingProject" @saved="loadProjects" />
</div>
</template>
<script setup lang="ts">
import { onMounted, ref } from "vue";
import { useRouter } from "vue-router";
import { ElMessage } from "element-plus";
import { fetchStudies } from "../../api/studies";
import type { Study } from "../../types/api";
import ProjectForm from "./ProjectForm.vue";
import { useStudyStore } from "../../store/study";
const projects = ref<Study[]>([]);
const loading = ref(false);
const formVisible = ref(false);
const editingProject = ref<Study | null>(null);
const router = useRouter();
const studyStore = useStudyStore();
const loadProjects = async () => {
loading.value = true;
try {
const { data } = await fetchStudies();
const items = (data as any).items || [];
projects.value = items;
} catch (e: any) {
ElMessage.error(e?.response?.data?.message || "项目列表加载失败");
} finally {
loading.value = false;
}
};
const openCreate = () => {
editingProject.value = null;
formVisible.value = true;
};
const openEdit = (row: Study) => {
editingProject.value = row;
formVisible.value = true;
};
const goMembers = (row: Study) => {
router.push(`/admin/projects/${row.id}/members`);
};
const goSites = (row: Study) => {
router.push(`/admin/projects/${row.id}/sites`);
};
const enterStudy = (row: Study) => {
studyStore.setCurrentStudy({ ...row, role_in_study: "PM" } as Study);
router.push("/study/home");
};
const statusLabel = (status: string) =>
({
DRAFT: "草稿",
ACTIVE: "进行中",
CLOSED: "已关闭",
}[status] || status);
const statusTag = (status: string) =>
({
DRAFT: "info",
ACTIVE: "success",
CLOSED: "warning",
}[status] || "info");
onMounted(() => {
loadProjects();
});
</script>
<style scoped>
.page {
padding: 16px;
}
.header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
</style>