From 1b19cc612672386c7f7c8d1a9c61b97439eb7559 Mon Sep 17 00:00:00 2001 From: Admin <978517621@qq.com> Date: 星期四, 22 九月 2022 14:39:25 +0800 Subject: [PATCH] Default Changelist --- src/views/system/appVersion/index.vue | 396 +++++++++++++++++++++++++----------------------- src/api/systemManage/appVersion/index.ts | 59 +++++++ 2 files changed, 264 insertions(+), 191 deletions(-) diff --git a/src/api/systemManage/appVersion/index.ts b/src/api/systemManage/appVersion/index.ts new file mode 100644 index 0000000..915bdee --- /dev/null +++ b/src/api/systemManage/appVersion/index.ts @@ -0,0 +1,59 @@ +import request from '/@/utils/request'; + +export function appVersionApi() { + return { + + //app版本分页列表 + getRecordPage: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/appVersion/page/list`, + method: 'post', + data: data + }); + }, + + //获取最新版本 + getRecordByNew: () => { + return request({ + url: import.meta.env.VITE_API_URL + `/appVersion/lastest-release`, + method: 'get' + }); + }, + + // app版本新增 + addRecord: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/appVersion/add`, + method: 'post', + data: data + }); + }, + + // app版本修改 + updateRecord: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/appVersion/mod`, + method: 'post', + data: data + }); + }, + + // app版本删除 + deleteRecord: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/appVersion/del`, + method: 'post', + data: data + }); + }, + + // 获取上传路径 + getUploadUrl: (data: object) => { + return request({ + url: import.meta.env.VITE_API_URL + `/appVersion/presign`, + method: 'post', + data: data + }); + }, + }; +} diff --git a/src/views/system/appVersion/index.vue b/src/views/system/appVersion/index.vue index 83f918e..6912b55 100644 --- a/src/views/system/appVersion/index.vue +++ b/src/views/system/appVersion/index.vue @@ -2,38 +2,56 @@ <div class="home-container"> <div style="height: 100%"> <el-row class="homeCard"> - <el-col :span="8"> + <el-col :span="5" style="display:flex;align-items: center"> + <span style="white-space: nowrap">app类型:</span> <div class="grid-content topInfo"> - <el-input v-model="searchWord" placeholder="版本名称"></el-input> - <el-button type="primary" @click="searchRecord">查询</el-button> - <el-button plain @click="clearSearch">重置</el-button> + <el-select v-model="searchType"> + <el-option + v-for="item in appTypeList" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> </div> </el-col> + <el-col :span="5" style="display:flex;align-items: center"> + <span style="white-space: nowrap">版本号:</span> + <div class="grid-content topInfo"> + <el-input v-model="searchVersion"/> + </div> + </el-col> + <el-col :span="5" style="display:flex;align-items: center"> + <span style="white-space: nowrap">APP名称:</span> + <div class="grid-content topInfo"> + <el-input v-model="searchName"/> + </div> + </el-col> + <el-button style="margin-left: 20px" type="primary" @click="searchRecord">查询</el-button> + <el-button plain @click="clearSearch">重置</el-button> </el-row> <div class="homeCard"> <div class="main-card"> <el-row class="cardTop"> <el-col :span="12" class="mainCardBtn"> <el-button type="primary" :icon="Plus" size="default" @click="dialogAddRecord = true">新增</el-button> - <!-- <el-button type="warning" :icon="Edit" size="default" plain>修改</el-button>--> -<!-- <el-button type="danger" :icon="Delete" size="default" plain @click="deleteBatchBtn">删除</el-button>--> </el-col> <el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()" /> </el-row> <el-table ref="multipleTableRef" :data="tableData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }" @selection-change="handleSelectionChange"> <!-- <el-table-column type="selection" width="100" />--> <el-table-column type="index" label="排序" width="80" align="center"/> - <el-table-column property="fileType" label="文件类型" align="center" :show-overflow-tooltip="true"/> - <el-table-column property="fileName" label="文件名称" align="center" :show-overflow-tooltip="true"/> - <el-table-column property="link" label="文件链接" align="center"/> - <el-table-column property="version" label="版本号" align="center"> + <el-table-column property="appTypeDesc" label="文件类型" align="center" :show-overflow-tooltip="true"/> + <el-table-column property="name" label="app名称" align="center" :show-overflow-tooltip="true"/> + <el-table-column property="objectUrl" label="文件链接" align="center" :show-overflow-tooltip="true"/> + <el-table-column property="customVersion" label="版本号" align="center"> <template #default="scope"> - <el-tag>{{ scope.row.version }}</el-tag> + <el-tag>{{ scope.row.customVersion }}</el-tag> </template> </el-table-column> - <el-table-column property="info" label="备注" align="center"/> - <el-table-column property="createTime" label="创建时间" align="center"/> - <el-table-column property="updateTime" label="更新时间" align="center"/> + <el-table-column property="info" label="备注" align="center" :show-overflow-tooltip="true"/> + <el-table-column property="gmtCreate" label="创建时间" align="center"/> + <el-table-column property="gmtModified" label="更新时间" align="center"/> <el-table-column fixed="right" label="操作" align="center" width="250"> <template #default="scope"> <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> @@ -50,26 +68,26 @@ </div> <el-dialog v-model="dialogDetails" title="APP版本信息"> <el-form :model="details" label-width="120px"> - <el-form-item label="文件类型"> - <el-input v-model="details.fileType" readonly /> + <el-form-item label="类型"> + <el-input v-model="details.appTypeDesc" readonly /> </el-form-item> - <el-form-item label="文件名称"> - <el-input v-model="details.fileName" readonly /> + <el-form-item label="app名称"> + <el-input v-model="details.name" readonly /> </el-form-item> <el-form-item label="文件链接"> - <el-input v-model="details.link" type="textarea" readonly /> + <el-input v-model="details.objectUrl" type="textarea" autosize readonly /> </el-form-item> <el-form-item label="版本号"> - <el-input v-model="details.version" type="textarea" readonly /> + <el-input v-model="details.customVersion" type="textarea" readonly /> </el-form-item> <el-form-item label="备注"> <el-input v-model="details.info" type="textarea" readonly /> </el-form-item> <el-form-item label="创建时间"> - <el-input v-model="details.createTime" readonly /> + <el-input v-model="details.gmtCreate" readonly /> </el-form-item> <el-form-item label="更新时间"> - <el-input v-model="details.updateTime" readonly /> + <el-input v-model="details.gmtModified" readonly /> </el-form-item> <el-form-item> <el-button type="primary" @click="dialogDetails = false" size="default">确认</el-button> @@ -78,24 +96,39 @@ </el-dialog> <el-dialog v-model="dialogAddRecord" title="APP版本信息编辑" @close="closeAdd" @open="openAdd"> <el-form :model="addRecord" label-width="150px" ref="addRef" :rules="addRules"> - <el-form-item label="文件类型" prop="fileType"> - <el-input v-model="addRecord.fileType"> </el-input> + <el-form-item label="类型" prop="appType"> + <el-select v-model="addRecord.appType"> + <el-option + v-for="item in appTypeList" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> </el-form-item> - <el-form-item label="文件名称" prop="fileName"> - <el-input v-model="addRecord.fileName"> </el-input> + <el-form-item label="app名称" prop="name"> + <el-input v-model="addRecord.name"/> </el-form-item> - <el-form-item label="上传文件" prop="link"> - <el-upload accept=".apk" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='fileLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-form-item v-if="chosenIndex == null" label="上传文件" prop="objectName"> + <el-upload :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='fileLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> <el-button type="primary" plain>选择文件</el-button> <template #tip> <div class="el-upload__tip">上传新版APP</div> </template> </el-upload> </el-form-item> - <el-form-item label="版本号" prop="version"> - <el-input v-model="addRecord.version"> </el-input> + <el-form-item v-else label="上传文件"> + <el-upload :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='fileLimit' v-model:file-list="fileList" :http-request="upload" :action="uploadUrl" :on-remove="handleRemove" :before-remove="beforeRemove" :before-upload="getUploadUrl"> + <el-button type="primary" plain>选择文件</el-button> + <template #tip> + <div class="el-upload__tip">上传新版APP(不上传则默认使用当前版本)</div> + </template> + </el-upload> </el-form-item> - <el-form-item label="备注"> + <el-form-item label="自定义版本号" prop="customVersion"> + <el-input v-model="addRecord.customVersion"> </el-input> + </el-form-item> + <el-form-item label="备注" prop="info"> <el-input v-model="addRecord.info" type="textarea"> </el-input> </el-form-item> <el-form-item> @@ -132,15 +165,15 @@ import { useUserInfo } from '/@/stores/userInfo'; import { Session } from '/@/utils/storage'; import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue'; -import { ElMessage, ElTable } from 'element-plus' +import { ElMessage, ElMessageBox } from 'element-plus'; import type { FormInstance, FormRules, UploadProps, UploadUserFile } from 'element-plus' -import { teamManageApi } from '/@/api/systemManage/basicDateManage/personShiftManage/teamManage'; +import { appVersionApi } from '/@/api/systemManage/appVersion'; +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import axios from "axios"; // 定义接口来定义对象的类型 interface stateType { tableData: Array<any>; - departmentList: Array<any>; - casProps: {}; multipleSelection: Array<any>; deleteArr: Array<any>; dialogDetails: boolean; @@ -151,24 +184,20 @@ pageSize: number; chosenIndex: null | number; deleteId: null | number; - searchWord: string; + searchType: number; + appTypeList: Array<any>; + searchVersion: string; + searchName: string; totalSize: number; - addRecord: { - groupName: string; - department: number | null; - depId: number | null; - groupMembers: Array<any>; - groupInfo: string; - }; - details: { - groupName: string; - department: number | null; - groupMembers: Array<any>; - groupInfo: string; - }; - fileLimit: number + addRecord: {}; + details: {}; + fileLimit: number; + uploadUrl: string; + fileList: Array<file> } - +interface file { + url: string; +} export default { name: 'appVersion', components: {}, @@ -181,116 +210,35 @@ pageSize: 10, totalSize: 0, chosenIndex: null, - searchWord: '', - tableData: [ + searchType: 1, + appTypeList: [ { - fileType: '国泰APP', - fileName: '4', - link: 'http', - version: '4.0', - info: '最新', - createTime: '2022-09-10', - updateTime: '2022-09-19' + name: '国泰app', + id: 1 }, { - fileType: '国泰APP', - fileName: '3', - link: 'http', - version: '3.0', - info: '', - createTime: '2022-09-10', - updateTime: '2022-09-19' - }, - { - fileType: '国泰APP', - fileName: '2', - link: 'http', - version: '2.0', - info: '', - createTime: '2022-09-10', - updateTime: '2022-09-19' - }, - { - fileType: '国泰APP', - fileName: '1', - link: 'http', - version: '1.0', - info: '', - createTime: '2022-09-10', - updateTime: '2022-09-19' + name: '其他', + id: 0 } ], + searchVersion: '', + searchName: '', + tableData: [], fileLimit: 1, - departmentList: [], - department: '', - workTypeList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 - } - ], - casProps: { - expandTrigger: 'hover', - emitPath: false, - value: 'depId', - label: 'depName' - }, + uploadUrl: '', multipleSelection: [], dialogDetails: false, dialogAddRecord: false, deleteDialog: false, deleteSetDialog: false, - addRecord: { - groupName: '', - department: null, - groupMembers: [], - depId: null, - groupInfo: '' - }, - details: { - groupName: '', - department: null, - groupMembers: [], - depId: null, - groupInfo: '' - }, + addRecord: {}, + details: {}, deleteId: null, - deleteArr: [] + deleteArr: [], + fileList: [] }); interface User { - groupName: string; - department: number | null; - depId: number; - groupMembers: Array<any>; - groupInfo: string; + } // const multipleTableRef = ref<InstanceType<typeof ElTable>>(); // const toggleSelection = (rows?: User[]) => { @@ -317,31 +265,24 @@ const addRef = ref<FormInstance>(); const addRules = reactive<FormRules>({ - fileType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - fileName: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - link: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - version: [{ required: true, message: '该内容不能为空', trigger: 'blur' }] + appType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + name: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + objectName: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + customVersion: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + info: [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); // 页面载入时执行方法 onMounted(() => { - // getListByPage(); - // getAllDepartment(); + getListByPage(); }); // 分页获取物资标准列表 const getListByPage = async () => { - const data = { pageSize: state.pageSize, pageIndex: state.pageIndex, searchParams: { groupName: state.searchWord, containGroupMemberEnable: true } }; - let res = await teamManageApi().getRecordPage(data); + const data = { pageSize: state.pageSize, pageIndex: state.pageIndex, searchParams: { appType: state.searchType, customVersion: state.searchVersion, appName: state.searchName} }; + let res = await appVersionApi().getRecordPage(data); if (res.data.code === '200') { - state.tableData = res.data.data.map((item) => { - if (!item.groupMembers || item.groupMembers == null) { - item.groupMembers = []; - } else { - item.groupMembers = Array.from(item.groupMembers, ({ username }) => username); - } - return item; - }); + state.tableData = JSON.parse(JSON.stringify(res.data.data)) state.totalSize = res.data.total; } else { ElMessage({ @@ -351,23 +292,11 @@ } }; - // 获取部门列表 - const getAllDepartment = async () => { - let res = await teamManageApi().getAllDepartment(); - if (res.data.code === '200') { - state.departmentList = res.data.data; - } else { - ElMessage({ - type: 'warning', - message: res.data.msg - }); - } - }; // const handleChange = async (value) => { // state.addRecord.depId = value; // console.log(state.addRecord.department, 'de'); - // let res = await teamManageApi().getAllMember(value); + // let res = await appVersionApi().getAllMember(value); // if (res.data.code === '200') { // state.workerList = res.data.data; // } else { @@ -380,7 +309,7 @@ // 关键词查询记录 const searchRecord = async () => { - if (state.searchWord == '') { + if (state.searchType == null && state.searchVersion == '' && state.searchName == '') { ElMessage({ type: 'warning', message: '请输入查询关键词' @@ -391,18 +320,89 @@ }; const clearSearch = async () => { - state.searchWord = ''; + state.searchType = 1 + state.searchVersion = '' + state.searchName = '' getListByPage(); }; + const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); + } + + const getUploadUrl = async (rawFile: any) => { + const res = await appVersionApi().getUploadUrl({ filename: rawFile.name }); + state.addRecord.objectName = res.data.data.objectName + state.uploadUrl = res.data.data.presignedUrl; + }; + + const upload = async (params: any) => { + // const formData = new FormData(); + // formData.append('file', state.fileList[0].raw); + let reader = new FileReader(); + reader.readAsArrayBuffer(params.file); + reader.onload = async () => { + axios + .put(state.uploadUrl, reader.result, { + header: { 'Content-Type': 'multipart/form-data' } + }) + .then(() => { + // if (state.fileList.length === 2) { + // state.fileList.splice(0, 1); + // } + // console.log(state.form.workDetail.gbPath,'gbpath') + }); + }; + }; + + const beforeRemove = (file: {}, fileList: []) => { + const result = new Promise((resolve, reject) => { + ElMessageBox.confirm('此操作将删除该图片, 是否继续?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + // console.log(state.workDetail.gbPath,'path') + state.fileList = [] + // 请求删除接口 + deletePic(state.addRecord.objectName) + state.addRecord.objectName = null + }) + .catch(() => { + reject(false); + }); + }); + return result; + }; + // 删除图片接口 + const deletePic = async(fileName:string)=>{ + const res = await workApplyApi().deleteFile({fileName: fileName}) + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '删除成功!' + }); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + // 添加班组管理方法 const addRecord = async (data: any) => { - let res = await teamManageApi().addRecord(data); + let res = await appVersionApi().addRecord(data); if (res.data.code === '200') { ElMessage({ type: 'success', message: '添加成功!' }); + state.fileList = [] getListByPage(); } else { ElMessage({ @@ -414,15 +414,14 @@ // 修改工作时段方法 const editRecordBtn = async (index, row) => { + console.log(row,'row') state.addRecord = JSON.parse(JSON.stringify(row)); - state.addRecord.department = ''; - state.addRecord.groupMembers = []; state.dialogAddRecord = true; state.chosenIndex = index; }; const editRecord = async (data: any) => { - let res = await teamManageApi().updateRecord(data); + let res = await appVersionApi().updateRecord(data); if (res.data.code === '200') { ElMessage({ type: 'success', @@ -443,15 +442,16 @@ await formEl.validate(async (valid, fields) => { if (valid) { const data = { - groupName: state.addRecord.groupName, - groupInfo: state.addRecord.groupInfo, - depId: state.addRecord.depId, - groupMemberIds: state.addRecord.groupMembers + appType: state.addRecord.appType, + appName: state.addRecord.name, + objectName: state.addRecord.objectName, + info: state.addRecord.info, + customVersion: state.addRecord.customVersion }; if (state.chosenIndex == null) { await addRecord(data); } else { - data.groupId = JSON.stringify(state.addRecord.groupId); + data.id = JSON.stringify(state.addRecord.id); await editRecord(data); } state.dialogAddRecord = false; @@ -463,7 +463,7 @@ // 删除工作时间组方法 const deleteRecord = async (data: any) => { - let res = await teamManageApi().deleteRecord(data); + let res = await appVersionApi().deleteRecord(data); if (res.data.code === '200') { ElMessage({ type: 'success', @@ -480,12 +480,12 @@ const deleteRecordBtn = (row) => { console.log(row, 'row'); - state.deleteId = row.groupId; + state.deleteId = row.id; state.deleteDialog = true; }; const conFirmDelete = () => { - deleteRecord({ groupId: state.deleteId }); + deleteRecord({ id: state.deleteId }); state.deleteDialog = false; }; @@ -506,7 +506,7 @@ // }; // const conFirmDeleteBatch = async () => { - // let res = await teamManageApi().deletBatchRecord({ids: state.deleteArr}); + // let res = await appVersionApi().deletBatchRecord({ids: state.deleteArr}); // if (res.data.code === '200') { // state.deleteSetDialog = false // ElMessage({ @@ -545,6 +545,8 @@ const closeAdd = () => { state.addRecord = {}; + state.uploadUrl = '' + state.fileList = [] state.chosenIndex = null; }; const openAdd = () => { @@ -578,6 +580,10 @@ getListByPage, reLoadData, deleteRecord, + showTip, + getUploadUrl, + upload, + beforeRemove, handleSizeChange, handleCurrentChange, confirmAddRecord, @@ -647,6 +653,7 @@ } .topInfo { + width: 100%; display: flex; align-items: center; font-size: 16px; @@ -671,4 +678,11 @@ .el-tabs{ width: 100%; } +::v-deep(.el-date-editor){ + width: 100%; +} + +:deep(.el-cascader){ + width: 100% !important; +} </style> -- Gitblit v1.9.2