| | |
| | | <div class="app-container"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title">å¹è®åç§°ï¼</span> |
| | | <el-input v-model="searchForm.name" |
| | | <span class="search_title">课ç¨ç¼å·ï¼</span> |
| | | <el-input v-model="searchForm.courseCode" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥å¹è®åç§°æç´¢" |
| | | placeholder="请è¾å
¥å¹è®ç¼å·æç´¢" |
| | | @change="handleQuery" |
| | | clearable |
| | | :prefix-icon="Search" /> |
| | | <span class="search_title ml10">å¹è®ç±»åï¼</span> |
| | | <el-select v-model="searchForm.type" |
| | | <span class="search_title ml10">å¹è®æ¹å¼ï¼</span> |
| | | <el-select v-model="searchForm.trainingMode" |
| | | clearable |
| | | @change="handleQuery" |
| | | style="width: 240px"> |
| | | <el-option v-for="item in knowledgeTypeOptions" |
| | | <el-option v-for="item in trainingModeOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" /> |
| | |
| | | <div> |
| | | <el-button type="primary" |
| | | @click="openForm('add')">æ°å¢å¹è®</el-button> |
| | | <el-button type="primary" |
| | | @click="opendetail">å¹è®è®°å½</el-button> |
| | | <el-button type="danger" |
| | | plain |
| | | @click="handleDelete">å é¤</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | | <el-tabs v-model="searchForm.state" |
| | | @tab-click="tabhandleQuery"> |
| | | <el-tab-pane label="æªå¼å§" |
| | | :name="0"></el-tab-pane> |
| | | <el-tab-pane label="è¿è¡ä¸" |
| | | :name="1"></el-tab-pane> |
| | | <el-tab-pane label="å·²ç»æ" |
| | | :name="2"></el-tab-pane> |
| | | </el-tabs> |
| | | <!-- state ç¶æ(0ï¼æªå¼å§1ï¼è¿è¡ä¸ï¼2ï¼å·²ç»æ) --> |
| | | <PIMTable rowKey="id" |
| | | :column="tableColumn" |
| | | :tableData="tableData" |
| | |
| | | <el-form-item label="课ç¨å¦å" |
| | | prop="projectCredits"> |
| | | <el-input v-model="form.projectCredits" |
| | | type="number" |
| | | min="0" |
| | | placeholder="请è¾å
¥è¯¾ç¨å¦å" /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | </el-dialog> |
| | | <!-- æ¥çç¥è¯è¯¦æ
å¼¹çª --> |
| | | <el-dialog v-model="viewDialogVisible" |
| | | title="å¹è®è¯¦æ
" |
| | | title="ç»ææç»" |
| | | width="900px" |
| | | :close-on-click-modal="false"> |
| | | <div class="knowledge-detail"> |
| | | <el-descriptions :column="2" |
| | | border> |
| | | <el-descriptions-item label="å¹è®åç§°" |
| | | :span="2"> |
| | | <span class="detail-title">{{ currentKnowledge.name }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å¹è®ç¼ç "> |
| | | {{ currentKnowledge.code }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å¹è®ç±»å"> |
| | | <el-tag type="info"> |
| | | <!-- {{ getTypeLabel(currentKnowledge.type) }} --> |
| | | <el-descriptions size="mini" |
| | | style="margin-left: 60px;" |
| | | :column="3"> |
| | | <el-descriptions-item label="课ç¨ç¼å·:">{{ currentKnowledge.courseCode }}</el-descriptions-item> |
| | | <el-descriptions-item label="å¹è®å
容:">{{ currentKnowledge.trainingContent }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç¶æ:"> |
| | | <el-tag :type="currentKnowledge.status === 0 ? 'success' : (currentKnowledge.status === 1 ? 'success' : 'info')"> |
| | | {{ currentKnowledge.status === 0 ? 'æªå¼å§' : (currentKnowledge.status === 1 ? 'è¿è¡ä¸' : 'å·²ç»æ') }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="æå¨ä½ç½®"> |
| | | {{ currentKnowledge.location }} |
| | | <el-descriptions-item label="å¹è®è®²å¸:"> |
| | | {{ currentKnowledge.trainingLecturer }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ç®¡æ§æªæ½"> |
| | | {{ currentKnowledge.controlMeasures }} |
| | | <el-descriptions-item label="å¹è®å¼å§æ¶é´:"> |
| | | {{ currentKnowledge.trainingDate + ' ' + currentKnowledge.openingTime }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="åºåæ°é"> |
| | | {{ currentKnowledge.stockQty }} |
| | | <el-descriptions-item label="å¹è®ç»ææ¶é´:"> |
| | | {{ currentKnowledge.trainingDate + ' ' + currentKnowledge.endTime }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="管æ§è´£ä»»äºº"> |
| | | {{ currentKnowledge.principalUserId }} |
| | | <el-descriptions-item label="å¹è®ç®æ :"> |
| | | {{ currentKnowledge.trainingObjectives }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="责任人èç³»çµè¯"> |
| | | {{ currentKnowledge.principalMobile }} |
| | | <el-descriptions-item label="åå 对象:"> |
| | | {{ currentKnowledge.participants }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="é£é©ç级"> |
| | | <el-tag :type="getTypeTagType(currentKnowledge.riskLevel)"> |
| | | {{ currentKnowledge.riskLevel }} |
| | | <el-descriptions-item label="å¹è®æ¹å¼:"> |
| | | <el-tag type="primary"> |
| | | {{ getTrainingModeLabel(currentKnowledge.trainingMode) }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è§æ ¼ / é£é©æè¿°"> |
| | | {{ currentKnowledge.specInfo }} |
| | | <el-descriptions-item label="å¹è®å°ç¹:"> |
| | | {{ currentKnowledge.placeTraining }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="课æ¶:"> |
| | | {{ currentKnowledge.classHour }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="课ç¨å¦å:"> |
| | | {{ currentKnowledge.projectCredits }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="æ¥å人æ°:"> |
| | | {{ currentKnowledge.nums }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="éä»¶å表:"> |
| | | <el-button type="primary" |
| | | size="small" |
| | | @click="downLoadFile(endform)">éä»¶å表</el-button> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | <el-divider style="margin: 20px 0;" /> |
| | | <el-form ref="formRef" |
| | | :model="form" |
| | | :rules="rules" |
| | | label-width="130px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è¯ä»·äºº:" |
| | | prop="courseCode"> |
| | | <el-input v-model="endform.assessmentUserName" |
| | | disabled |
| | | placeholder="è¯·éæ©è¯ä»·äºº" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è¯ä»·æ¶é´:" |
| | | prop="trainingDate"> |
| | | <el-date-picker style="width: 100%" |
| | | disabled |
| | | v-model="endform.assessmentDate" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | type="date" |
| | | placeholder="è¯·éæ©" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="èæ ¸æ¹å¼:" |
| | | prop="assessmentMethod"> |
| | | <el-input v-model="endform.assessmentMethod" |
| | | placeholder="è¯·éæ©èæ ¸æ¹å¼" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¬æ¬¡è¯¾ç¨ç»¼åè¯ä»·:" |
| | | prop="comprehensiveAssessment"> |
| | | <el-input v-model="endform.comprehensiveAssessment" |
| | | placeholder="请è¾å
¥æ¬æ¬¡è¯¾ç¨ç»¼åè¯ä»·" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="å¹è®æè¦:" |
| | | prop="trainingAbstract"> |
| | | <el-input v-model="endform.trainingAbstract" |
| | | type="textarea" |
| | | :rows="2" |
| | | placeholder="请è¾å
¥å¹è®æè¦" /> |
| | | </el-form-item> |
| | | <!-- <el-row :gutter="30"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="éä»¶ææï¼" |
| | | prop="remark"> |
| | | <el-upload v-model:file-list="fileList" |
| | | :action="upload.url" |
| | | multiple |
| | | ref="fileUpload" |
| | | auto-upload |
| | | :headers="upload.headers" |
| | | :before-upload="handleBeforeUpload" |
| | | :on-error="handleUploadError" |
| | | :on-success="handleUploadSuccess" |
| | | :on-remove="handleRemove"> |
| | | <el-button type="primary" |
| | | v-if="operationType !== 'view'">ä¸ä¼ </el-button> |
| | | <template #tip |
| | | v-if="operationType !== 'view'"> |
| | | <div class="el-upload__tip"> |
| | | æä»¶æ ¼å¼æ¯æ |
| | | docï¼docxï¼xlsï¼xlsxï¼pptï¼pptxï¼pdfï¼txtï¼xmlï¼jpgï¼jpegï¼pngï¼gifï¼bmpï¼rarï¼zipï¼7z |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> --> |
| | | </el-form> |
| | | <el-table style="margin-top: 20px;" |
| | | :data="endform.safeTrainingDetailsDtoList" |
| | | border |
| | | fit |
| | | highlight-current-row> |
| | | <el-table-column prop="nickName" |
| | | label="å§å" /> |
| | | <el-table-column prop="phonenumber" |
| | | label="çµè¯å·ç " /> |
| | | <el-table-column prop="examinationResults" |
| | | label="èæ ¸ç»æ"> |
| | | <template #default="scope"> |
| | | <el-select v-model="scope.row.examinationResults" |
| | | placeholder="è¯·éæ©èæ ¸ç»æ"> |
| | | <el-option label="åæ ¼" |
| | | value="åæ ¼" /> |
| | | <el-option label="ä¸åæ ¼" |
| | | value="ä¸åæ ¼" /> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button type="primary" |
| | | @click="submitForm2">æäº¤</el-button> |
| | | <el-button @click="viewDialogVisible = false">å
³é</el-button> |
| | | </span> |
| | | </template> |
| | |
| | | safeTrainingFileListPage, |
| | | safeTrainingFileAdd, |
| | | safeTrainingFileDel, |
| | | safeTrainingSign, |
| | | safeTrainingGet, |
| | | safeTrainingSave, |
| | | } from "@/api/safeProduction/safetyTrainingAssessment.js"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import dayjs from "dayjs"; |
| | | const userStore = useUserStore(); |
| | | |
| | | // 表åéªè¯è§å |
| | | const rules = { |
| | |
| | | ], |
| | | classHour: [{ required: true, message: "请è¾å
¥è¯¾æ¶", trigger: "blur" }], |
| | | }; |
| | | |
| | | const upload = reactive({ |
| | | // ä¸ä¼ çå°å |
| | | url: import.meta.env.VITE_APP_BASE_API + "/file/upload", |
| | | // 设置ä¸ä¼ ç请æ±å¤´é¨ |
| | | headers: { Authorization: "Bearer " + getToken() }, |
| | | }); |
| | | // ååºå¼æ°æ® |
| | | const data = reactive({ |
| | | searchForm: { |
| | | name: "", |
| | | type: "", |
| | | courseCode: "", |
| | | trainingMode: "", |
| | | state: 0, |
| | | }, |
| | | tableLoading: false, |
| | | page: { |
| | |
| | | ); |
| | | return item ? item.label : val; |
| | | }; |
| | | // 忢tabæ¥è¯¢ |
| | | const tabhandleQuery = val => { |
| | | searchForm.value.state = val.paneName; |
| | | console.log(searchForm.value.state, "searchForm.value.state"); |
| | | |
| | | handleQuery(); |
| | | }; |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(); |
| | | const riskLevelOptions = ref([ |
| | |
| | | { value: "é大é£é©", label: "é大é£é©" }, |
| | | ]); |
| | | |
| | | const fileList = ref([]); |
| | | |
| | | // è¡¨æ ¼åé
ç½® |
| | | const tableColumn = ref([ |
| | | { |
| | | label: "课ç¨ç¼å·", |
| | | prop: "courseCode", |
| | | width: 150, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å¹è®æ¥æ", |
| | | prop: "trainingDate", |
| | | width: 120, |
| | | |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å¼å§æ¶é´", |
| | | prop: "openingTime", |
| | | width: 120, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "ç»ææ¶é´", |
| | | prop: "endTime", |
| | | width: 120, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å¹è®ç®æ ", |
| | | prop: "trainingObjectives", |
| | | width: 200, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "åå 对象", |
| | | prop: "participants", |
| | | width: 200, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å¹è®å
容", |
| | | prop: "trainingContent", |
| | | width: 200, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å¹è®è®²å¸", |
| | | prop: "trainingLecturer", |
| | | width: 200, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "项ç®å¦å", |
| | | prop: "projectCredits", |
| | | width: 120, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å¹è®æ¹å¼", |
| | | prop: "trainingMode", |
| | | width: 120, |
| | | showOverflowTooltip: true, |
| | | formatData: params => { |
| | | return getTrainingModeLabel(params); |
| | |
| | | { |
| | | label: "å¹è®å°ç¹", |
| | | prop: "placeTraining", |
| | | width: 200, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "课æ¶", |
| | | prop: "classHour", |
| | | width: 120, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "æ¥å人æ°", |
| | | prop: "nums", |
| | | width: 120, |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | |
| | | label: "æä½", |
| | | align: "center", |
| | | fixed: "right", |
| | | width: 200, |
| | | width: 300, |
| | | operation: [ |
| | | { |
| | | name: "ç¾å°", |
| | | type: "text", |
| | | disabled: row => row.state !== 1, |
| | | clickFun: row => { |
| | | signIn(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | disabled: row => row.state !== 0, |
| | | clickFun: row => { |
| | | openForm("edit", row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "导åº", |
| | | type: "danger", |
| | | type: "text", |
| | | clickFun: row => { |
| | | exportKnowledge(row); |
| | | }, |
| | | color: "#C49000", |
| | | }, |
| | | { |
| | | name: "éä»¶", |
| | | type: "danger", |
| | | type: "text", |
| | | clickFun: row => { |
| | | downLoadFile(row); |
| | | }, |
| | | color: "#007AFF", |
| | | }, |
| | | |
| | | { |
| | | name: "ç»ææç»", |
| | | type: "text", |
| | | // disabled: row => row.state !== 2, |
| | | clickFun: row => { |
| | | viewResultDetail(row); |
| | | }, |
| | | }, |
| | | // { |
| | |
| | | const userList = ref([]); |
| | | // çå½å¨æ |
| | | onMounted(() => { |
| | | getCurrentFactoryName(); |
| | | getList(); |
| | | startAutoRefresh(); |
| | | userListNoPage().then(res => { |
| | | userList.value = res.data; |
| | | }); |
| | | }); |
| | | const endform = ref({ |
| | | assessmentUserId: "", //è¯ä»·äºº |
| | | assessmentUserName: "", //è¯ä»·äººå§å |
| | | assessmentMethod: "", //èæ ¸æ¹å¼ |
| | | assessmentDate: "", //è¯ä»·æ¶é´ |
| | | comprehensiveAssessment: "", //综åè¯ä»· |
| | | trainingAbstract: "", //å¹è®æè¦ |
| | | safeTrainingFileList: [], //å¹è®éä»¶ |
| | | safeTrainingDetailsDtoList: [], //èæ ¸ç»æè¯¦æ
|
| | | }); |
| | | const operationType = ref("edit"); |
| | | const viewResultDetail = row => { |
| | | // fileList.value = []; |
| | | operationType.value = "edit"; |
| | | safeTrainingGet({ id: row.id }).then(res => { |
| | | if (res.code === 200) { |
| | | console.log(res.data, "res.data"); |
| | | currentKnowledge.value = JSON.parse(JSON.stringify(res.data)); |
| | | currentKnowledge.value.nums = row.nums; |
| | | viewDialogVisible.value = true; |
| | | endform.value = { ...res.data }; |
| | | endform.value.assessmentUserName = endform.value.assessmentUserName |
| | | ? endform.value.assessmentUserName |
| | | : currentUserName.value; |
| | | endform.value.assessmentUserId = endform.value.assessmentUserId |
| | | ? endform.value.assessmentUserId |
| | | : currentUserId.value; |
| | | endform.value.assessmentDate = dayjs().format("YYYY-MM-DD"); |
| | | } else { |
| | | proxy.$modal.msgError(res.msg || "æ¥è¯¢è¯¦æ
失败"); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // ä¸ä¼ åæ ¡æ£ |
| | | function handleBeforeUpload(file) { |
| | | proxy.$modal.loading("æ£å¨ä¸ä¼ æä»¶ï¼è¯·ç¨å..."); |
| | | return true; |
| | | } |
| | | // ä¸ä¼ 失败 |
| | | function handleUploadError(err) { |
| | | proxy.$modal.msgError("ä¸ä¼ æä»¶å¤±è´¥"); |
| | | proxy.$modal.closeLoading(); |
| | | } |
| | | // ä¸ä¼ æååè° |
| | | function handleUploadSuccess(res, file, uploadFiles) { |
| | | proxy.$modal.closeLoading(); |
| | | if (res.code === 200) { |
| | | // ç¡®ä¿ tempFileIds åå¨ä¸ä¸ºæ°ç» |
| | | if (!endform.value.safeTrainingFileList) { |
| | | endform.value.safeTrainingFileList = []; |
| | | } |
| | | endform.value.safeTrainingFileList.push({ |
| | | id: res.data.tempId, |
| | | fileName: res.data.originalName, |
| | | url: res.data.tempPath, |
| | | safeTrainingId: currentKnowledge.value.id, |
| | | }); |
| | | proxy.$modal.msgSuccess("ä¸ä¼ æå"); |
| | | } else { |
| | | proxy.$modal.msgError(res.msg); |
| | | proxy.$refs.fileUpload.handleRemove(file); |
| | | } |
| | | } |
| | | // ç§»é¤æä»¶ |
| | | function handleRemove(file) { |
| | | if (operationType.value === "edit") { |
| | | let index = endform.value.safeTrainingFileList.findIndex( |
| | | item => item.fileName === file.name |
| | | ); |
| | | if (index !== -1) { |
| | | endform.value.safeTrainingFileList.splice(index, 1); |
| | | } |
| | | } |
| | | } |
| | | const submitForm2 = () => { |
| | | endform.value.safeTrainingDetailsDtoList.forEach((item, index) => { |
| | | if (!item.examinationResults) { |
| | | proxy.$modal.msgError(`è¯·éæ©${item.nickName}çèæ ¸ç»æ`); |
| | | return; |
| | | } |
| | | }); |
| | | console.log(endform.value, "endform.value"); |
| | | proxy.$modal.loading("æ£å¨æäº¤ï¼è¯·ç¨å..."); |
| | | safeTrainingSave(endform.value).then(res => { |
| | | proxy.$modal.closeLoading(); |
| | | if (res.code === 200) { |
| | | proxy.$modal.msgSuccess("æäº¤æå"); |
| | | getList(); |
| | | viewDialogVisible.value = false; |
| | | } else { |
| | | proxy.$modal.msgError(res.msg || "æäº¤å¤±è´¥"); |
| | | } |
| | | }); |
| | | }; |
| | | const opendetail = row => { |
| | | proxy.$router.push({ |
| | | path: "/safeProduction/safetyTrainingAssessmentDetail", |
| | | }); |
| | | }; |
| | | |
| | | const signIn = row => { |
| | | ElMessageBox.confirm("确认ç¾å°åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }).then(() => { |
| | | safeTrainingSign({ |
| | | safeTrainingId: row.id, |
| | | userId: currentUserId.value, |
| | | }).then(res => { |
| | | if (res.code === 200) { |
| | | proxy.$modal.msgSuccess("ç¾å°æå"); |
| | | getList(); |
| | | } else { |
| | | proxy.$modal.msgError(res.msg || "ç¾å°å¤±è´¥"); |
| | | } |
| | | }); |
| | | }); |
| | | }; |
| | | |
| | | // å¤çç¨æ·éæ©åå |
| | | const handleUserChange = userId => { |
| | |
| | | const url = window.URL.createObjectURL(blob); |
| | | const link = document.createElement("a"); |
| | | link.href = url; |
| | | link.download = `å¹è®è®°å½_${row.courseCode}.xlsx`; |
| | | link.download = `å¹è®è®°å½_${row.courseCode}.docx`; |
| | | |
| | | // 模æç¹å»ä¸è½½ |
| | | document.body.appendChild(link); |
| | |
| | | const handleSelectionChange = selection => { |
| | | selectedIds.value = selection.map(item => item.id); |
| | | }; |
| | | const currentUserId = ref(""); |
| | | const currentUserName = ref(""); |
| | | const getCurrentFactoryName = async () => { |
| | | let res = await userStore.getInfo(); |
| | | currentUserId.value = res.user.userId; |
| | | currentUserName.value = res.user.nickName; |
| | | }; |
| | | |
| | | // æå¼è¡¨å |
| | | const openForm = (type, row = null) => { |
| | |
| | | }); |
| | | } |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // æ¥çå¹è®è¯¦æ
|
| | | const viewKnowledge = row => { |
| | | currentKnowledge.value = { ...row }; |
| | | viewDialogVisible.value = true; |
| | | }; |
| | | |
| | | // è·åç±»åæ ç¾ç±»å |