diff --git a/.env b/.env index f15851b..5f92b71 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ VITE_BASE_URL=http://192.168.0.17:8001/ -VITE_PROXY=/api +VITE_PROXY=/api/ VITE_FILE_URL=https://file.zcloudchina.com/YTHFile -VITE_TEMPLATE_URL='https://qaaq.qhdsafety.com/file/' +VITE_TEMPLATE_URL=https://qaaq.qhdsafety.com/file/ diff --git a/src/assets/js/asyncRouter.js b/src/assets/js/asyncRouter.js index aa72e03..a19141f 100644 --- a/src/assets/js/asyncRouter.js +++ b/src/assets/js/asyncRouter.js @@ -112,6 +112,43 @@ export default [ }, ], }, + { + path: "/system_operation", + redirect: "/system_operation/system_documents", + meta: { title: "体系运行", model: MODEL["1"] }, + component: "children", + children: [ + { + path: "/system_operation/system_documents", + meta: { title: "体系文件", isSubMenu: false }, + component: "system_operation/system_documents/index", + }, + ], + }, + { + path: "/risk_control", + redirect: "/risk_control/risk_point", + meta: { title: "风险管控", model: MODEL["1"] }, + component: "children", + children: [ + { + path: "/risk_control/risk_point", + meta: { title: "风险点(单元)", isSubMenu: false }, + component: "children", + children: [ + { + path: "", + component: "risk_control/risk_point/index", + }, + { + path: "/risk_control/risk_point/view", + meta: { title: "查看", activeMenu: "/risk_control/risk_point" }, + component: "risk_control/risk_point/view", + }, + ], + }, + ], + }, { path: "/platform_resource_library", redirect: "/platform_resource_library/courseware", diff --git a/src/assets/js/data_dictionary.js b/src/assets/js/data_dictionary.js index caec7db..62687b1 100644 --- a/src/assets/js/data_dictionary.js +++ b/src/assets/js/data_dictionary.js @@ -4,6 +4,7 @@ import { getLevelsAndChildrenNumber, getRegulatoryType, getDepartmentTree, + getLevelsCorp, } from "@/request/data_dictionary.js"; import { ref } from "vue"; @@ -112,21 +113,21 @@ export const layoutFnGetPersonnelType = async () => { }; // 职务 export const layoutFnGetDuties = async () => { - const resData = await getLevels({ + const resData = await getLevelsCorp({ DICTIONARIES_ID: "09e36ac01e9540f8bc84eab1c1a78754", }); return ref(resData.list); }; // 职称 export const layoutFnGetProfessionalTitle = async () => { - const resData = await getLevels({ + const resData = await getLevelsCorp({ DICTIONARIES_ID: "945a6b10e59946078b500f0fbafa8679", }); return ref(resData.list); }; // 工种 export const layoutFnGetJobType = async () => { - const resData = await getLevels({ + const resData = await getLevelsCorp({ DICTIONARIES_ID: "55484e491a5e442d839c4595380713ec", }); return ref(resData.list); @@ -139,8 +140,8 @@ export const layoutFnGetEmploymentSituation = async () => { return ref(resData.list); }; // 部门树 -export const layoutFnGetDepartmentTree = async () => { - const resData = await getDepartmentTree(); +export const layoutFnGetDepartmentTree = async (params) => { + const resData = await getDepartmentTree(params); return ref(JSON.parse(resData.zTreeNodes)); }; // 无法确定DICTIONARIES_ID的数据字典 diff --git a/src/assets/js/useDownloadFile.js b/src/assets/js/useDownloadFile.js new file mode 100644 index 0000000..2c558fe --- /dev/null +++ b/src/assets/js/useDownloadFile.js @@ -0,0 +1,22 @@ +import { ElMessageBox } from "element-plus"; +import { getFileName, getFileSuffix } from "@/assets/js/utils.js"; + +export default async function useDownloadFile(url, name) { + if (!url) throw new Error("没有下载地址"); + await ElMessageBox.confirm("确定要下载此文件吗?", { type: "warning" }); + const FILE_URL = import.meta.env.VITE_FILE_URL; + name = name ? name + getFileSuffix(url) : getFileName(url); + fetch(FILE_URL + url) + .then((res) => res.blob()) + .then((blob) => { + const a = document.createElement("a"); + document.body.appendChild(a); + a.style.display = "none"; + const url = window.URL.createObjectURL(blob); + a.href = url; + a.download = `${name}`; + a.click(); + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + }); +} diff --git a/src/assets/js/utils.js b/src/assets/js/utils.js index d81037e..912ac1e 100644 --- a/src/assets/js/utils.js +++ b/src/assets/js/utils.js @@ -1,4 +1,4 @@ -import { ElMessage, ElMessageBox } from "element-plus"; +import { ElMessage } from "element-plus"; /** * @description 计算序号 @@ -266,16 +266,6 @@ export function secondConversion(second) { } } -/** - * @description 下载附件 - * @param {string} filePah 下载路径 - **/ -export async function downloadFile(filePah) { - const FILE_URL = import.meta.env.VITE_FILE_URL; - await ElMessageBox.confirm("确定要下载此文件吗?", { type: "warning" }); - window.open(FILE_URL + filePah, "_blank"); -} - /** * @description 附件添加前缀 * @param {Array} list 附件数组 @@ -319,6 +309,18 @@ export function translationStatus(status, list) { } } +/** + * @description 计算文件大小 + * @param {number | string} size 文件kb + * @return {string} 计算后的文件大小 + **/ +export function calculateFileSize(size) { + return size > 1024 + ? (size / 1024 + "").substring(0, (size / 1024 + "").lastIndexOf(".") + 3) + + "MB" + : size + "KB"; +} + /** * @description 根据身份证号获取出生日期和性别 * @param {String} idCard 身份证号 diff --git a/src/components/ali-player/index.vue b/src/components/ali-player/index.vue index e65f734..e90ebd0 100644 --- a/src/components/ali-player/index.vue +++ b/src/components/ali-player/index.vue @@ -86,6 +86,10 @@ const play = () => { const pause = () => { player && player.pause(); }; +defineExpose({ + play, + pause, +}); diff --git a/src/components/pdf/index.vue b/src/components/pdf/index.vue index f90b76f..48ab62c 100644 --- a/src/components/pdf/index.vue +++ b/src/components/pdf/index.vue @@ -5,7 +5,7 @@ ref="pdfRef" v-for="page in numOfPages" :key="page" - :src="src" + :src="VITE_FILE_URL + src" :page="page" /> @@ -18,6 +18,7 @@ import { VuePdf, createLoadingTask } from "vue3-pdfjs/esm"; import { ElMessage } from "element-plus"; import { useVModel } from "@vueuse/core"; +const VITE_FILE_URL = import.meta.env.VITE_FILE_URL; defineOptions({ name: "LayoutPdf", }); @@ -38,7 +39,7 @@ const pdfRef = ref(null); const numOfPages = ref(0); watchEffect(() => { if (props.visible) { - const loadingTask = createLoadingTask(props.src); + const loadingTask = createLoadingTask(VITE_FILE_URL + props.src); loadingTask.promise .then((pdf) => { numOfPages.value = pdf.numPages; diff --git a/src/components/qr_code/index.vue b/src/components/qr_code/index.vue new file mode 100644 index 0000000..23a77f1 --- /dev/null +++ b/src/components/qr_code/index.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/select_create/index.vue b/src/components/select_create/index.vue index 5c8049f..561ff5c 100644 --- a/src/components/select_create/index.vue +++ b/src/components/select_create/index.vue @@ -20,7 +20,7 @@ >
{{ item.NAME }}
- +
diff --git a/src/components/table/index.vue b/src/components/table/index.vue index 4133715..73a1fb0 100644 --- a/src/components/table/index.vue +++ b/src/components/table/index.vue @@ -8,7 +8,7 @@ :height="height" :max-height="maxHeight" :highlight-current-row="highlightCurrentRow" - :row-key="rowKey" + :row-key="getRowKey" :row-class-name="rowClassName" :show-header="showHeader" :show-summary="showSummary" @@ -121,6 +121,11 @@ const handleSizeChange = (val) => { }); emits("get-data"); }; +const getRowKey = (row) => { + if (!props.rowKey) return; + if (typeof props.rowKey === "string") return row[props.rowKey]; + else return props.rowKey(row); +}; const rowClick = (row, column, event) => { emits("row-click", row, column, event); }; diff --git a/src/components/video/index.vue b/src/components/video/index.vue new file mode 100644 index 0000000..84c90a9 --- /dev/null +++ b/src/components/video/index.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/request/api.js b/src/request/api.js index 0ca86bd..eaa0ee9 100644 --- a/src/request/api.js +++ b/src/request/api.js @@ -3,6 +3,7 @@ import { post, upload } from "./axios"; export const Login = (params) => post("/admin/check", params); // 登录 export const logout = (params) => post("/main/logout", params); // 退出登录 export const getAsyncRouter = (params) => post("/main/index", params); // 获取动态路由 +export const getHasMenu = (params) => post("/head/hasMenu", params); // 获取有没有权限访问路由 export const getUserInfo = (params) => post("/user/goEditMyInfo", params); // 获取用户信息 export const setUserInfo = (params) => post("/user/editUserOwn", params); // 修改用户信息 export const getVerifyDuplicateEmail = (params) => diff --git a/src/request/data_dictionary.js b/src/request/data_dictionary.js index 2a458cf..76b130c 100644 --- a/src/request/data_dictionary.js +++ b/src/request/data_dictionary.js @@ -6,6 +6,12 @@ export const getLevels = (params) => loading: false, ...params, }); +// 获取数据字典 +export const getLevelsCorp = (params) => + post("/dictionariesCorp/getLevels", { + loading: false, + ...params, + }); // 获取数据字典包括子级数量 export const getLevelsAndChildrenNumber = (params) => post("/dictionaries/getLevelsAndSCount", { diff --git a/src/request/enterprise_management.js b/src/request/enterprise_management.js index 7129288..5358e93 100644 --- a/src/request/enterprise_management.js +++ b/src/request/enterprise_management.js @@ -39,3 +39,6 @@ export const getUserScheduleView = (params) => post("/shiftworkperiod/getWorkDate", params); // 用户管理查看排班表 export const setDictionaryDelete = (params) => post("/dictionariesCorp/delete", params); // 数据字典删除 +export const setUserAdd = (params) => post("/user/saveUser", params); // 用户管理添加 +export const setUserEdit = (params) => post("/user/editUser", params); // 用户管理修改 +export const getUserView = (params) => post("/user/goEditUser", params); // 用户管理查看 diff --git a/src/request/risk_control.js b/src/request/risk_control.js new file mode 100644 index 0000000..e56827d --- /dev/null +++ b/src/request/risk_control.js @@ -0,0 +1,13 @@ +import { post, upload } from "@/request/axios.js"; + +export const getRiskPointList = (params) => post("/riskunit/list", params); // 风险点单元列表 +export const setRiskPointDelete = (params) => post("/riskunit/delete", params); // 风险点单元删除 +export const setRiskPointImport = (params) => + upload("/riskunit/readExcel", params); // 风险点单元导入 +export const setRiskPointBatchDelete = (params) => + post("/riskunit/deleteAll", params); // 风险点单元批量删除 +export const getRiskPointView = (params) => post("/riskunit/goEdit", params); // 风险点单元查看 +export const setRiskPointAdd = (params) => post("/riskunit/add", params); // 风险点单元添加 +export const setRiskPointEdit = (params) => post("/riskunit/edit", params); // 风险点单元修改 +export const getRiskPointInspectList = (params) => + post("/riskunit/getRisByUnitId", params); // 风险点单元检查内容 diff --git a/src/request/system_operation.js b/src/request/system_operation.js new file mode 100644 index 0000000..364910c --- /dev/null +++ b/src/request/system_operation.js @@ -0,0 +1,13 @@ +import { post, upload } from "@/request/axios.js"; + +export const getSystemDocumentsTree = (params) => + post("/mfolder/listTree", params); // 体系文件树 +export const getSystemDocumentsList = (params) => post("/mfolder/list", params); // 体系文件列表 +export const setSystemDocumentsDelete = (params) => + post("/mfolder/delete", params); // 体系文件删除 +export const setSystemDocumentsAddFolder = (params) => + post("/mfolder/add", params); // 体系文件添加文件夹 +export const setSystemDocumentsUploadFile = (params) => + upload("/mfolder/upload", params); // 体系文件上传文件 +export const setSystemDocumentsBatchUploadFile = (params) => + upload("/mfolder/batchUpload", params); // 体系文件批量上传文件 diff --git a/src/views/enterprise_management/department/components/add.vue b/src/views/enterprise_management/department/components/add.vue index f879b83..de70f2a 100644 --- a/src/views/enterprise_management/department/components/add.vue +++ b/src/views/enterprise_management/department/components/add.vue @@ -54,7 +54,12 @@ label="监管部门" prop="checkedIds" > - + + +
+
+

{{ info.CORP_NAME }}

+
+ +
+ +
+ + + + + diff --git a/src/views/enterprise_management/information/edit.vue b/src/views/enterprise_management/information/edit.vue index 3b6eb47..f317506 100644 --- a/src/views/enterprise_management/information/edit.vue +++ b/src/views/enterprise_management/information/edit.vue @@ -584,7 +584,7 @@ const data = reactive({ SUBORDINATION: "", SCALE: "", SCALE_TYPE: "", - TRAINTYPE: [], + TRAINTYPE: "", USERS_NUM: "", FOURTYPE: "", four_images: [], diff --git a/src/views/enterprise_management/information/info.vue b/src/views/enterprise_management/information/info.vue index 1e8cb6b..93ffada 100644 --- a/src/views/enterprise_management/information/info.vue +++ b/src/views/enterprise_management/information/info.vue @@ -191,26 +191,9 @@ > 修改 - 二维码 + 二维码 - -
-
-

{{ data.info.CORP_NAME }}

-
-
- -
-
- -
+ @@ -219,18 +202,14 @@ import { getEnterpriseInfo } from "@/request/enterprise_management.js"; import { addingPrefixToFile } from "@/assets/js/utils.js"; import { reactive } from "vue"; import { useRouter } from "vue-router"; -import { useQRCode } from "@vueuse/integrations/useQRCode"; -import { ElMessage } from "element-plus"; +import Print from "./components/print.vue"; const router = useRouter(); const data = reactive({ info: {}, bus_images: [], four_images: [], - qrCodeDialog: { - visible: false, - src: "", - }, + qrCodeDialogVisible: false, }); const fnGetData = async () => { const resData = await getEnterpriseInfo(); @@ -239,21 +218,6 @@ const fnGetData = async () => { data.four_images = addingPrefixToFile(resData.fourImgs); }; fnGetData(); -const fnQrCodeDialogChangeShow = () => { - data.qrCodeDialog.visible = !data.qrCodeDialog.visible; -}; -const fnQrCode = () => { - if (data.info.CORPINFO_ID) { - fnQrCodeDialogChangeShow(); - // TODO: 扫码跳转到企业信息页面 - data.qrCodeDialog.src = useQRCode("https://vueuse.org", { - width: 200, - height: 200, - margin: 1, - correctLevel: "H", - }); - } else ElMessage.error("请重新获取二维码"); -}; diff --git a/src/views/enterprise_management/user/add.vue b/src/views/enterprise_management/user/add.vue index e5b6549..3829575 100644 --- a/src/views/enterprise_management/user/add.vue +++ b/src/views/enterprise_management/user/add.vue @@ -390,7 +390,10 @@ import { getUserCurrentShiftList, getUserInfo, getUserScheduling, + getUserView, setDictionaryDelete, + setUserAdd, + setUserEdit, } from "@/request/enterprise_management.js"; import LayoutDepartment from "@/components/department/index.vue"; import LayoutUpload from "@/components/upload/index.vue"; @@ -399,7 +402,11 @@ import { getPostListAll } from "@/request/data_dictionary.js"; import { useRoute, useRouter } from "vue-router"; import Scheduling from "./components/scheduling.vue"; import { InfoFilled } from "@element-plus/icons-vue"; -import { idCardGetDateAndGender } from "@/assets/js/utils.js"; +import { + addingPrefixToFile, + idCardGetDateAndGender, + image2Base64, +} from "@/assets/js/utils.js"; import { layoutFnGetDegreeOfEducation, layoutFnGetDuties, @@ -416,6 +423,7 @@ import { debounce } from "throttle-debounce"; import { getVerifyDeduplicationUser, getVerifyDuplicateEmail, + setUploadImg, } from "@/request/api.js"; import useFormValidate from "@/assets/js/useFormValidate.js"; @@ -534,6 +542,8 @@ const data = reactive({ employmentSituationList: [], allUser: 0, USERS_NUM: 0, + oldPostId: "", + oldDepartId: "", form: { ROLE_ID: "", DEPARTMENT_ID: "", @@ -573,6 +583,24 @@ const data = reactive({ }, scheduleVisible: false, }); +const fnGetData = async () => { + if (!USER_ID) return; + const resData = await getUserView({ USER_ID }); + const form = resData.pd; + form.PASSWORD = "666666"; + form.periodStr = resData.periodStr; + form.ISSTUDENT = resData.pd.ISSTUDENT.toString(); + if (form.USERAVATARURL_CONVERT) + form.faceFile = [ + { url: form.USERAVATARPREFIX + form.USERAVATARURL_CONVERT }, + ]; + data.scheduleInfo = resData.period; + data.oldPostId = form.POST_ID; + data.oldDepartId = form.DEPARTMENT_ID; + form.userCerFile = addingPrefixToFile(resData.userCerList); + data.form = { ...data.form, ...form }; +}; +fnGetData(); const fnGetUserRole = async () => { const resData = await getUserInfo(); data.roleList = resData.roleList; @@ -624,41 +652,27 @@ const fnChangeIdCard = () => { data.form.SEX = sex; data.form.DATE_OF_BIRTH = date; }; -const fnGetNation = async () => { - const { value } = await layoutFnGetNation(); - data.nationList = value; -}; -const fnGetSex = async () => { - const { value } = await layoutFnGetSex(); - data.sexList = value; -}; -const fnGetPoliticalLandscape = async () => { - const { value } = await layoutFnGetPoliticalLandscape(); - data.politicalLandscapeList = value; -}; -const fnGetDegreeOfEducation = async () => { - const { value } = await layoutFnGetDegreeOfEducation(); - data.degreeOfEducationList = value; -}; -const fnGetPersonnelType = async () => { - const { value } = await layoutFnGetPersonnelType(); - data.personnelTypeList = value; -}; -const fnGetDuties = async () => { - const { value } = await layoutFnGetDuties(); - data.dutiesList = value; -}; -const fnGetProfessionalTitle = async () => { - const { value } = await layoutFnGetProfessionalTitle(); - data.professionalTitleList = value; -}; -const fnGetJobType = async () => { - const { value } = await layoutFnGetJobType(); - data.jobTypeList = value; -}; -const fnGetEmploymentSituation = async () => { - const { value } = await layoutFnGetEmploymentSituation(); - data.employmentSituationList = value; +const fnGetLevels = async () => { + const { value: nationList } = await layoutFnGetNation(); + data.nationList = nationList; + const { value: sexList } = await layoutFnGetSex(); + data.sexList = sexList; + const { value: politicalLandscapeList } = + await layoutFnGetPoliticalLandscape(); + data.politicalLandscapeList = politicalLandscapeList; + const { value: degreeOfEducationList } = await layoutFnGetDegreeOfEducation(); + data.degreeOfEducationList = degreeOfEducationList; + const { value: personnelTypeList } = await layoutFnGetPersonnelType(); + data.personnelTypeList = personnelTypeList; + const { value: dutiesList } = await layoutFnGetDuties(); + data.dutiesList = dutiesList; + const { value: professionalTitleList } = await layoutFnGetProfessionalTitle(); + data.professionalTitleList = professionalTitleList; + const { value: jobTypeList } = await layoutFnGetJobType(); + data.jobTypeList = jobTypeList; + const { value: employmentSituationList } = + await layoutFnGetEmploymentSituation(); + data.employmentSituationList = employmentSituationList; }; const fnDictionaryDelete = debounce( 1000, @@ -704,15 +718,7 @@ const stop = watch( () => data.form.ISSTUDENT, (val) => { if (val === "true") { - fnGetNation(); - fnGetSex(); - fnGetPoliticalLandscape(); - fnGetDegreeOfEducation(); - fnGetPersonnelType(); - fnGetDuties(); - fnGetProfessionalTitle(); - fnGetJobType(); - fnGetEmploymentSituation(); + fnGetLevels(); stop && stop(); } }, @@ -728,20 +734,82 @@ const fnSubmit = debounce( form.WORKSTATUS = data.scheduleInfo.WORKSTATUS; form.DURATION = data.scheduleInfo.DURATION; form.WORKPERIOD = data.scheduleInfo.WORKPERIOD; + if (fnFindValueInList("dutiesList", form.DUTIES)) { + form.letDutiesType = "select"; + form.DUTIESValue = ""; + } else { + form.letDutiesType = "value"; + form.DUTIESValue = form.DUTIES; + } + if (fnFindValueInList("professionalTitleList", form.TITLE)) { + form.letTitleType = "select"; + form.letTitleValue = ""; + } else { + form.letTitleType = "value"; + form.letTitleValue = form.TITLE; + } + if (fnFindValueInList("jobTypeList", form.TYPE_OF_WORK)) { + form.letTypeOfWorkType = "select"; + form.letTypeOfWorkValue = ""; + } else { + form.letTypeOfWorkType = "value"; + form.letTypeOfWorkValue = form.TYPE_OF_WORK; + } + if (data.form.faceFile?.[0]?.raw) { + const resData = await image2Base64(data.form.faceFile[0].url); + form.USERAVATARPREFIX = resData.substring( + 0, + resData.indexOf("base64,") + 7 + ); + form.USERAVATARURL = resData.substring(resData.indexOf("base64,") + 7); + } if (!USER_ID) { - // 添加 - if (data.USERS_NUM > data.allUser) { + if (data.allUser > data.USERS_NUM) { ElMessage.error("已超过可创建用户数量"); return; } + const resData = await setUserAdd({ ...form }); + if (data.form.ISSTUDENT === "true") await fnUploadImage(resData.USER_ID); } else { - // 修改 + if ( + data.oldDepartId !== data.form.DEPARTMENT_ID || + data.oldPostId !== data.form.POST_ID + ) { + await ElMessageBox.confirm( + "如变更了部门或岗位,保存后将删除该用户所有清单,是否确定?", + { type: "warning" } + ); + form.OPERATIONTYPE = 1; + } + await setUserEdit({ ...form }); + if (data.form.ISSTUDENT === "true") + await fnUploadImage(data.form.USER_ID); } ElMessage.success("操作成功"); router.back(); }, { atBegin: true } ); +const fnUploadImage = async (USER_ID) => { + const formData = new FormData(); + for (let i = 0; i < data.form.userCerFile.length; i++) { + if (data.form.userCerFile[i].raw) + formData.append("FFILE", data.form.userCerFile[i].raw); + } + formData.append("FOREIGN_KEY", USER_ID); + formData.append("TYPE", 18); + await setUploadImg(formData); +}; +const fnFindValueInList = (list, value) => { + let existence = false; + for (let i = 0; i < data[list].length; i++) { + if (data[list][i].DICTIONARIES_ID === value) { + existence = true; + break; + } + } + return existence; +}; diff --git a/src/views/risk_control/risk_point/components/add.vue b/src/views/risk_control/risk_point/components/add.vue new file mode 100644 index 0000000..e7c6570 --- /dev/null +++ b/src/views/risk_control/risk_point/components/add.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/views/risk_control/risk_point/components/print.vue b/src/views/risk_control/risk_point/components/print.vue new file mode 100644 index 0000000..131cae7 --- /dev/null +++ b/src/views/risk_control/risk_point/components/print.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/views/risk_control/risk_point/index.vue b/src/views/risk_control/risk_point/index.vue new file mode 100644 index 0000000..adb7025 --- /dev/null +++ b/src/views/risk_control/risk_point/index.vue @@ -0,0 +1,248 @@ + + + + + diff --git a/src/views/risk_control/risk_point/view.vue b/src/views/risk_control/risk_point/view.vue new file mode 100644 index 0000000..08837c8 --- /dev/null +++ b/src/views/risk_control/risk_point/view.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/views/system_operation/system_documents/components/add_folder.vue b/src/views/system_operation/system_documents/components/add_folder.vue new file mode 100644 index 0000000..6b778b1 --- /dev/null +++ b/src/views/system_operation/system_documents/components/add_folder.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/views/system_operation/system_documents/components/batch_upload_file.vue b/src/views/system_operation/system_documents/components/batch_upload_file.vue new file mode 100644 index 0000000..d949427 --- /dev/null +++ b/src/views/system_operation/system_documents/components/batch_upload_file.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/src/views/system_operation/system_documents/components/upload_file.vue b/src/views/system_operation/system_documents/components/upload_file.vue new file mode 100644 index 0000000..d39d8ad --- /dev/null +++ b/src/views/system_operation/system_documents/components/upload_file.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/views/system_operation/system_documents/index.vue b/src/views/system_operation/system_documents/index.vue new file mode 100644 index 0000000..f3b73fc --- /dev/null +++ b/src/views/system_operation/system_documents/index.vue @@ -0,0 +1,272 @@ + + + + +