| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-tabs v-model="activeTab" type="border-card" @tab-change="handleTabChange"> |
| | | <el-tab-pane label="äººåæ¡£æ¡" name="personnel"> |
| | | <el-form :model="personnelFilters" :inline="true"> |
| | | <el-form-item label="å§å"> |
| | | <el-input v-model="personnelFilters.name" placeholder="请è¾å
¥å§å" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item label="é¨é¨"> |
| | | <el-input v-model="personnelFilters.dept" placeholder="请è¾å
¥é¨é¨" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getPersonnelData">æç´¢</el-button> |
| | | <el-button @click="resetPersonnelFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <el-button type="primary" @click="addPersonnel" icon="Plus">æ°å¢</el-button> |
| | | </div> |
| | | <PIMTable :column="personnelColumns" :tableData="personnelList" :page="personnelPage" @pagination="changePersonnelPage" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="设å¤è®¾æ½" name="equipment"> |
| | | <el-form :model="equipmentFilters" :inline="true"> |
| | | <el-form-item label="设å¤åç§°"> |
| | | <el-input v-model="equipmentFilters.name" placeholder="请è¾å
¥è®¾å¤åç§°" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item label="æå±åºå"> |
| | | <el-input v-model="equipmentFilters.area" placeholder="请è¾å
¥æå±åºå" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getEquipmentData">æç´¢</el-button> |
| | | <el-button @click="resetEquipmentFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <el-button type="primary" @click="addEquipment" icon="Plus">æ°å¢</el-button> |
| | | </div> |
| | | <PIMTable :column="equipmentColumns" :tableData="equipmentList" :page="equipmentPage" @pagination="changeEquipmentPage" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="ä½ä¸åºå" name="workArea"> |
| | | <el-form :model="areaFilters" :inline="true"> |
| | | <el-form-item label="åºååç§°"> |
| | | <el-input v-model="areaFilters.name" placeholder="请è¾å
¥åºååç§°" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getAreaData">æç´¢</el-button> |
| | | <el-button @click="resetAreaFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <el-button type="primary" @click="addArea" icon="Plus">æ°å¢</el-button> |
| | | </div> |
| | | <PIMTable :column="areaColumns" :tableData="areaList" :page="areaPage" @pagination="changeAreaPage" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="å²ä½é£é©" name="risk"> |
| | | <el-form :model="riskFilters" :inline="true"> |
| | | <el-form-item label="é£é©ç±»å"> |
| | | <el-input v-model="riskFilters.type" placeholder="请è¾å
¥é£é©ç±»å" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getRiskData">æç´¢</el-button> |
| | | <el-button @click="resetRiskFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <el-button type="primary" @click="addRisk" icon="Plus">æ°å¢</el-button> |
| | | </div> |
| | | <PIMTable :column="riskColumns" :tableData="riskList" :page="riskPage" @pagination="changeRiskPage" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="åºæ¥èµæº" name="emergency"> |
| | | <el-form :model="emergencyFilters" :inline="true"> |
| | | <el-form-item label="èµæºåç§°"> |
| | | <el-input v-model="emergencyFilters.name" placeholder="请è¾å
¥èµæºåç§°" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getEmergencyData">æç´¢</el-button> |
| | | <el-button @click="resetEmergencyFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <el-button type="primary" @click="addEmergency" icon="Plus">æ°å¢</el-button> |
| | | </div> |
| | | <PIMTable :column="emergencyColumns" :tableData="emergencyList" :page="emergencyPage" @pagination="changeEmergencyPage" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive } from "vue"; |
| | | import PIMTable from "@/components/PIMTable/PIMTable.vue"; |
| | | |
| | | defineOptions({ |
| | | name: "åºç¡ä¿¡æ¯ç®¡ç", |
| | | }); |
| | | |
| | | const activeTab = ref("personnel"); |
| | | |
| | | // äººåæ¡£æ¡ |
| | | const personnelFilters = reactive({ name: "", dept: "" }); |
| | | const personnelList = ref([]); |
| | | const personnelPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const personnelColumns = [ |
| | | { label: "å§å", prop: "name", align: "center" }, |
| | | { label: "é¨é¨", prop: "dept", align: "center" }, |
| | | { label: "å²ä½", prop: "post", align: "center" }, |
| | | { label: "èç³»æ¹å¼", prop: "phone", align: "center" }, |
| | | { label: "å
¥èæ¥æ", prop: "entryDate", align: "center" }, |
| | | ]; |
| | | |
| | | // 设å¤è®¾æ½ |
| | | const equipmentFilters = reactive({ name: "", area: "" }); |
| | | const equipmentList = ref([]); |
| | | const equipmentPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const equipmentColumns = [ |
| | | { label: "设å¤åç§°", prop: "name", align: "center" }, |
| | | { label: "è§æ ¼åå·", prop: "model", align: "center" }, |
| | | { label: "æå±åºå", prop: "area", align: "center" }, |
| | | { label: "ç¶æ", prop: "status", align: "center" }, |
| | | ]; |
| | | |
| | | // ä½ä¸åºå |
| | | const areaFilters = reactive({ name: "" }); |
| | | const areaList = ref([]); |
| | | const areaPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const areaColumns = [ |
| | | { label: "åºååç§°", prop: "name", align: "center" }, |
| | | { label: "ä½ç½®", prop: "location", align: "center" }, |
| | | { label: "è´è´£äºº", prop: "manager", align: "center" }, |
| | | ]; |
| | | |
| | | // å²ä½é£é© |
| | | const riskFilters = reactive({ type: "" }); |
| | | const riskList = ref([]); |
| | | const riskPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const riskColumns = [ |
| | | { label: "é£é©ç±»å", prop: "type", align: "center" }, |
| | | { label: "é£é©ç级", prop: "level", align: "center" }, |
| | | { label: "æè¿°", prop: "description", align: "center" }, |
| | | ]; |
| | | |
| | | // åºæ¥èµæº |
| | | const emergencyFilters = reactive({ name: "" }); |
| | | const emergencyList = ref([]); |
| | | const emergencyPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const emergencyColumns = [ |
| | | { label: "èµæºåç§°", prop: "name", align: "center" }, |
| | | { label: "ç±»å", prop: "type", align: "center" }, |
| | | { label: "æ°é", prop: "quantity", align: "center" }, |
| | | { label: "åæ¾ä½ç½®", prop: "location", align: "center" }, |
| | | ]; |
| | | |
| | | const handleTabChange = () => { |
| | | // 忢tabæ¶å è½½å¯¹åºæ°æ® |
| | | }; |
| | | |
| | | const getPersonnelData = () => {}; |
| | | const resetPersonnelFilters = () => { personnelFilters.name = ""; personnelFilters.dept = ""; }; |
| | | const addPersonnel = () => {}; |
| | | const changePersonnelPage = ({ page, limit }) => { personnelPage.current = page; personnelPage.size = limit; }; |
| | | |
| | | const getEquipmentData = () => {}; |
| | | const resetEquipmentFilters = () => { equipmentFilters.name = ""; equipmentFilters.area = ""; }; |
| | | const addEquipment = () => {}; |
| | | const changeEquipmentPage = ({ page, limit }) => { equipmentPage.current = page; equipmentPage.size = limit; }; |
| | | |
| | | const getAreaData = () => {}; |
| | | const resetAreaFilters = () => { areaFilters.name = ""; }; |
| | | const addArea = () => {}; |
| | | const changeAreaPage = ({ page, limit }) => { areaPage.current = page; areaPage.size = limit; }; |
| | | |
| | | const getRiskData = () => {}; |
| | | const resetRiskFilters = () => { riskFilters.type = ""; }; |
| | | const addRisk = () => {}; |
| | | const changeRiskPage = ({ page, limit }) => { riskPage.current = page; riskPage.size = limit; }; |
| | | |
| | | const getEmergencyData = () => {}; |
| | | const resetEmergencyFilters = () => { emergencyFilters.name = ""; }; |
| | | const addEmergency = () => {}; |
| | | const changeEmergencyPage = ({ page, limit }) => { emergencyPage.current = page; emergencyPage.size = limit; }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .actions { |
| | | margin-bottom: 15px; |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <el-card class="user-card"> |
| | | <div class="user-info"> |
| | | <el-avatar :size="80" :src="userInfo.avatar" /> |
| | | <h3>{{ userInfo.name }}</h3> |
| | | <p>{{ userInfo.dept }} - {{ userInfo.post }}</p> |
| | | </div> |
| | | <el-divider /> |
| | | <div class="stat-item"> |
| | | <span class="label">已宿å¹è®</span> |
| | | <span class="value">{{ userInfo.completedTrainings }} 次</span> |
| | | </div> |
| | | <div class="stat-item"> |
| | | <span class="label">å¾
åå å¹è®</span> |
| | | <span class="value">{{ userInfo.pendingTrainings }} 次</span> |
| | | </div> |
| | | <div class="stat-item"> |
| | | <span class="label">å¹³åèæ ¸åæ°</span> |
| | | <span class="value">{{ userInfo.avgScore }} å</span> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | |
| | | <el-col :span="18"> |
| | | <el-tabs v-model="activeTab" type="border-card"> |
| | | <el-tab-pane label="æçå¦ä¹ è®°å½" name="records"> |
| | | <PIMTable :column="recordColumns" :tableData="recordList" :page="recordPage" @pagination="changeRecordPage" /> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="èæ ¸æ¥å" name="reports"> |
| | | <PIMTable :column="reportColumns" :tableData="reportList" :page="reportPage" @pagination="changeReportPage" /> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="å¨çº¿æµè¯" name="assessment"> |
| | | <div class="assessment-list"> |
| | | <el-card v-for="item in assessmentList" :key="item.id" class="assessment-card"> |
| | | <div class="assessment-header"> |
| | | <h4>{{ item.title }}</h4> |
| | | <el-tag :type="item.status === 'å¾
æµè¯' ? 'warning' : 'success'">{{ item.status }}</el-tag> |
| | | </div> |
| | | <p class="assessment-desc">{{ item.description }}</p> |
| | | <div class="assessment-footer"> |
| | | <span>æªæ¢æ¶é´ï¼{{ item.deadline }}</span> |
| | | <el-button type="primary" size="small" :disabled="item.status !== 'å¾
æµè¯'" @click="startAssessment(item)"> |
| | | {{ item.status === 'å¾
æµè¯' ? 'å¼å§æµè¯' : '已宿' }} |
| | | </el-button> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive } from "vue"; |
| | | import PIMTable from "@/components/PIMTable/PIMTable.vue"; |
| | | |
| | | defineOptions({ |
| | | name: "åå·¥å¦ä¹ ", |
| | | }); |
| | | |
| | | const activeTab = ref("records"); |
| | | |
| | | const userInfo = reactive({ |
| | | name: "å¼ ä¸", |
| | | dept: "ç产é¨", |
| | | post: "æä½å·¥", |
| | | avatar: "", |
| | | completedTrainings: 12, |
| | | pendingTrainings: 3, |
| | | avgScore: 85, |
| | | }); |
| | | |
| | | // å¦ä¹ è®°å½ |
| | | const recordList = ref([]); |
| | | const recordPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const recordColumns = [ |
| | | { label: "å¹è®å
容", prop: "content", align: "center" }, |
| | | { label: "å¹è®æ¶é´", prop: "trainingTime", align: "center" }, |
| | | { label: "å¹è®æ¶é¿", prop: "duration", align: "center" }, |
| | | { label: "å¹è®æ¹å¼", prop: "method", align: "center" }, |
| | | { label: "å®æç¶æ", prop: "status", align: "center" }, |
| | | ]; |
| | | |
| | | // èæ ¸æ¥å |
| | | const reportList = ref([]); |
| | | const reportPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const reportColumns = [ |
| | | { label: "èæ ¸åç§°", prop: "name", align: "center" }, |
| | | { label: "èæ ¸æ¶é´", prop: "assessTime", align: "center" }, |
| | | { label: "å¾å", prop: "score", align: "center" }, |
| | | { label: "ç级", prop: "grade", align: "center" }, |
| | | { label: "æ¯å¦åæ ¼", prop: "qualified", align: "center" }, |
| | | ]; |
| | | |
| | | // å¨çº¿æµè¯ |
| | | const assessmentList = ref([ |
| | | { id: 1, title: "å®å
¨æä½è§ç¨æµè¯", description: "èæ ¸å工对å®å
¨æä½è§ç¨çææ¡ç¨åº¦", deadline: "2026-05-30", status: "å¾
æµè¯" }, |
| | | { id: 2, title: "åºæ¥å¤ç½®è½åæµè¯", description: "èæ ¸åå·¥åºæ¥å¤ç½®è½å", deadline: "2026-06-15", status: "已宿" }, |
| | | ]); |
| | | |
| | | const changeRecordPage = ({ page, limit }) => { recordPage.current = page; recordPage.size = limit; }; |
| | | const changeReportPage = ({ page, limit }) => { reportPage.current = page; reportPage.size = limit; }; |
| | | const startAssessment = (item) => {}; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .user-card { |
| | | .user-info { |
| | | text-align: center; |
| | | h3 { |
| | | margin: 15px 0 5px; |
| | | } |
| | | p { |
| | | color: #666; |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | .stat-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | padding: 10px 0; |
| | | .label { |
| | | color: #666; |
| | | } |
| | | .value { |
| | | font-weight: bold; |
| | | color: #409eff; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .assessment-list { |
| | | .assessment-card { |
| | | margin-bottom: 15px; |
| | | .assessment-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | h4 { |
| | | margin: 0; |
| | | } |
| | | } |
| | | .assessment-desc { |
| | | color: #666; |
| | | margin: 10px 0; |
| | | } |
| | | .assessment-footer { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | span { |
| | | color: #999; |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-row :gutter="20" class="stat-cards"> |
| | | <el-col :span="6"> |
| | | <el-card> |
| | | <div class="stat-item"> |
| | | <div class="stat-icon" style="background: #67c23a;"><el-icon><CircleCheck /></el-icon></div> |
| | | <div class="stat-info"> |
| | | <span class="stat-value">{{ todayStats.completionRate }}%</span> |
| | | <span class="stat-label">彿¥å·¡æ£å®æç</span> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card> |
| | | <div class="stat-item"> |
| | | <div class="stat-icon" style="background: #409eff;"><el-icon><User /></el-icon></div> |
| | | <div class="stat-info"> |
| | | <span class="stat-value">{{ todayStats.inspectorCount }}</span> |
| | | <span class="stat-label">å·¡æ£äººåæ°</span> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card> |
| | | <div class="stat-item"> |
| | | <div class="stat-icon" style="background: #e6a23c;"><el-icon><Warning /></el-icon></div> |
| | | <div class="stat-info"> |
| | | <span class="stat-value">{{ todayStats.abnormalCount }}</span> |
| | | <span class="stat-label">å¼å¸¸è®°å½æ°</span> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card> |
| | | <div class="stat-item"> |
| | | <div class="stat-icon" style="background: #f56c6c;"><el-icon><CircleClose /></el-icon></div> |
| | | <div class="stat-info"> |
| | | <span class="stat-value">{{ todayStats.missedCount }}</span> |
| | | <span class="stat-label">æ¼æ£è®°å½æ°</span> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20" class="chart-row"> |
| | | <el-col :span="12"> |
| | | <el-card> |
| | | <template #header> |
| | | <span>å·¡æ£ä»»å¡æ§è¡è¶å¿</span> |
| | | </template> |
| | | <div ref="trendChartRef" style="height: 300px;"></div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-card> |
| | | <template #header> |
| | | <span>å·¡æ£ç±»åä¸é¢çåå¸</span> |
| | | </template> |
| | | <div ref="typeChartRef" style="height: 300px;"></div> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-card class="table-card"> |
| | | <template #header> |
| | | <span>å·¡æ£è®°å½æç»</span> |
| | | </template> |
| | | <el-form :model="filters" :inline="true"> |
| | | <el-form-item label="å·¡æ£æ¥æ"> |
| | | <el-date-picker v-model="filters.dateRange" type="daterange" range-separator="è³" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" value-format="YYYY-MM-DD" /> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£äººå"> |
| | | <el-input v-model="filters.inspector" placeholder="请è¾å
¥å·¡æ£äººå" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ"> |
| | | <el-select v-model="filters.status" placeholder="è¯·éæ©" clearable style="width: 150px"> |
| | | <el-option label="æ£å¸¸" value="normal" /> |
| | | <el-option label="å¼å¸¸" value="abnormal" /> |
| | | <el-option label="æ¼æ£" value="missed" /> |
| | | <el-option label="æªæ§è¡" value="unexecuted" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getData">æç´¢</el-button> |
| | | <el-button @click="resetFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <PIMTable :column="columns" :tableData="dataList" :page="pagination" @pagination="changePage" /> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from "vue"; |
| | | import PIMTable from "@/components/PIMTable/PIMTable.vue"; |
| | | import * as echarts from "echarts"; |
| | | |
| | | defineOptions({ |
| | | name: "å·¡æ£æ°æ®æ¥è¡¨", |
| | | }); |
| | | |
| | | const todayStats = reactive({ |
| | | completionRate: 95, |
| | | inspectorCount: 8, |
| | | abnormalCount: 2, |
| | | missedCount: 1, |
| | | }); |
| | | |
| | | const filters = reactive({ |
| | | dateRange: [], |
| | | inspector: "", |
| | | status: "", |
| | | }); |
| | | |
| | | const dataList = ref([]); |
| | | const pagination = reactive({ current: 1, size: 10, total: 0 }); |
| | | |
| | | const columns = [ |
| | | { label: "å·¡æ£æ¶é´", prop: "inspectionTime", align: "center" }, |
| | | { label: "å·¡æ£äººå", prop: "inspector", align: "center" }, |
| | | { label: "å·¡æ£åºå", prop: "area", align: "center" }, |
| | | { label: "å·¡æ£ç±»å", prop: "type", align: "center" }, |
| | | { label: "ç¶æ", prop: "status", align: "center" }, |
| | | { label: "å¼å¸¸æ
åµ", prop: "abnormalDesc", align: "center" }, |
| | | ]; |
| | | |
| | | const trendChartRef = ref(null); |
| | | const typeChartRef = ref(null); |
| | | |
| | | onMounted(() => { |
| | | initTrendChart(); |
| | | initTypeChart(); |
| | | }); |
| | | |
| | | const initTrendChart = () => { |
| | | const chart = echarts.init(trendChartRef.value); |
| | | const option = { |
| | | xAxis: { |
| | | type: "category", |
| | | data: ["å¨ä¸", "å¨äº", "å¨ä¸", "å¨å", "å¨äº", "å¨å
", "卿¥"], |
| | | }, |
| | | yAxis: { type: "value" }, |
| | | series: [ |
| | | { name: "已宿", type: "line", data: [120, 132, 101, 134, 90, 230, 210], smooth: true }, |
| | | { name: "æªå®æ", type: "line", data: [20, 12, 21, 14, 30, 20, 10], smooth: true }, |
| | | ], |
| | | legend: { data: ["已宿", "æªå®æ"], bottom: 0 }, |
| | | grid: { left: "3%", right: "4%", bottom: "10%", containLabel: true }, |
| | | }; |
| | | chart.setOption(option); |
| | | }; |
| | | |
| | | const initTypeChart = () => { |
| | | const chart = echarts.init(typeChartRef.value); |
| | | const option = { |
| | | series: [ |
| | | { |
| | | type: "pie", |
| | | radius: ["40%", "70%"], |
| | | data: [ |
| | | { value: 335, name: "设å¤å·¡æ£" }, |
| | | { value: 310, name: "å®å
¨å·¡æ£" }, |
| | | { value: 234, name: "ç¯å¢å·¡æ£" }, |
| | | { value: 135, name: "æ¶é²å·¡æ£" }, |
| | | ], |
| | | }, |
| | | ], |
| | | legend: { orient: "vertical", left: "left" }, |
| | | }; |
| | | chart.setOption(option); |
| | | }; |
| | | |
| | | const getData = () => {}; |
| | | const resetFilters = () => { |
| | | filters.dateRange = []; |
| | | filters.inspector = ""; |
| | | filters.status = ""; |
| | | }; |
| | | const changePage = ({ page, limit }) => { |
| | | pagination.current = page; |
| | | pagination.size = limit; |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .stat-cards { |
| | | margin-bottom: 20px; |
| | | .stat-item { |
| | | display: flex; |
| | | align-items: center; |
| | | .stat-icon { |
| | | width: 60px; |
| | | height: 60px; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | color: #fff; |
| | | font-size: 28px; |
| | | margin-right: 15px; |
| | | } |
| | | .stat-info { |
| | | display: flex; |
| | | flex-direction: column; |
| | | .stat-value { |
| | | font-size: 24px; |
| | | font-weight: bold; |
| | | color: #333; |
| | | } |
| | | .stat-label { |
| | | font-size: 14px; |
| | | color: #666; |
| | | margin-top: 5px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .chart-row { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .table-card { |
| | | :deep(.el-card__header) { |
| | | font-weight: bold; |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-tabs v-model="activeTab" type="border-card"> |
| | | <el-tab-pane label="å¹è®èµæ" name="materials"> |
| | | <el-form :model="materialFilters" :inline="true"> |
| | | <el-form-item label="èµæåç§°"> |
| | | <el-input v-model="materialFilters.name" placeholder="请è¾å
¥èµæåç§°" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item label="èµæç±»å"> |
| | | <el-select v-model="materialFilters.type" placeholder="è¯·éæ©" clearable style="width: 150px"> |
| | | <el-option label="å¶åº¦" value="system" /> |
| | | <el-option label="课件" value="courseware" /> |
| | | <el-option label="è§é¢" value="video" /> |
| | | <el-option label="æ¡ä¾" value="case" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getMaterialData">æç´¢</el-button> |
| | | <el-button @click="resetMaterialFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <el-button type="primary" @click="uploadMaterial" icon="Upload">ä¸ä¼ èµæ</el-button> |
| | | </div> |
| | | <PIMTable :column="materialColumns" :tableData="materialList" :page="materialPage" @pagination="changeMaterialPage" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="å¹è®è®¡å" name="plans"> |
| | | <el-form :model="planFilters" :inline="true"> |
| | | <el-form-item label="计å年度"> |
| | | <el-date-picker v-model="planFilters.year" type="year" placeholder="éæ©å¹´åº¦" value-format="YYYY" style="width: 150px" /> |
| | | </el-form-item> |
| | | <el-form-item label="å²ä½"> |
| | | <el-input v-model="planFilters.post" placeholder="请è¾å
¥å²ä½" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getPlanData">æç´¢</el-button> |
| | | <el-button @click="resetPlanFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <el-button type="primary" @click="addPlan" icon="Plus">å¶å®è®¡å</el-button> |
| | | </div> |
| | | <PIMTable :column="planColumns" :tableData="planList" :page="planPage" @pagination="changePlanPage" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="å®æè®°å½" name="records"> |
| | | <el-form :model="recordFilters" :inline="true"> |
| | | <el-form-item label="åå·¥å§å"> |
| | | <el-input v-model="recordFilters.employeeName" placeholder="请è¾å
¥åå·¥å§å" clearable style="width: 200px" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getRecordData">æç´¢</el-button> |
| | | <el-button @click="resetRecordFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <PIMTable :column="recordColumns" :tableData="recordList" :page="recordPage" @pagination="changeRecordPage" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive } from "vue"; |
| | | import PIMTable from "@/components/PIMTable/PIMTable.vue"; |
| | | |
| | | defineOptions({ |
| | | name: "å¹è®ç®¡ç", |
| | | }); |
| | | |
| | | const activeTab = ref("materials"); |
| | | |
| | | // å¹è®èµæ |
| | | const materialFilters = reactive({ name: "", type: "" }); |
| | | const materialList = ref([]); |
| | | const materialPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const materialColumns = [ |
| | | { label: "èµæåç§°", prop: "name", align: "center" }, |
| | | { label: "ç±»å", prop: "type", align: "center" }, |
| | | { label: "ä¸ä¼ 人", prop: "uploader", align: "center" }, |
| | | { label: "ä¸ä¼ æ¶é´", prop: "uploadTime", align: "center" }, |
| | | { label: "æä»¶å¤§å°", prop: "fileSize", align: "center" }, |
| | | ]; |
| | | |
| | | // å¹è®è®¡å |
| | | const planFilters = reactive({ year: "", post: "" }); |
| | | const planList = ref([]); |
| | | const planPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const planColumns = [ |
| | | { label: "计å年度", prop: "year", align: "center" }, |
| | | { label: "å²ä½", prop: "post", align: "center" }, |
| | | { label: "å±çº§", prop: "level", align: "center" }, |
| | | { label: "å¹è®å
容", prop: "content", align: "center" }, |
| | | { label: "计å课æ¶", prop: "hours", align: "center" }, |
| | | ]; |
| | | |
| | | // å®æè®°å½ |
| | | const recordFilters = reactive({ employeeName: "" }); |
| | | const recordList = ref([]); |
| | | const recordPage = reactive({ current: 1, size: 10, total: 0 }); |
| | | const recordColumns = [ |
| | | { label: "åå·¥å§å", prop: "employeeName", align: "center" }, |
| | | { label: "å¹è®å
容", prop: "content", align: "center" }, |
| | | { label: "宿æ¶é´", prop: "completeTime", align: "center" }, |
| | | { label: "èæ ¸ç»æ", prop: "result", align: "center" }, |
| | | ]; |
| | | |
| | | const getMaterialData = () => {}; |
| | | const resetMaterialFilters = () => { materialFilters.name = ""; materialFilters.type = ""; }; |
| | | const uploadMaterial = () => {}; |
| | | const changeMaterialPage = ({ page, limit }) => { materialPage.current = page; materialPage.size = limit; }; |
| | | |
| | | const getPlanData = () => {}; |
| | | const resetPlanFilters = () => { planFilters.year = ""; planFilters.post = ""; }; |
| | | const addPlan = () => {}; |
| | | const changePlanPage = ({ page, limit }) => { planPage.current = page; planPage.size = limit; }; |
| | | |
| | | const getRecordData = () => {}; |
| | | const resetRecordFilters = () => { recordFilters.employeeName = ""; }; |
| | | const changeRecordPage = ({ page, limit }) => { recordPage.current = page; recordPage.size = limit; }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .actions { |
| | | margin-bottom: 15px; |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | </style> |