From a2299cce9c01976cb63fb327201ee14740d055bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B4=BE=E8=82=83?= <15833576927@163.com> Date: Wed, 29 May 2024 09:04:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 + src/api/basicData/breedingBaseApi.js | 3 + src/api/basicData/cropVarietyApi.js | 67 ++++ src/api/basicData/dataGatherApi.js | 18 + src/api/basicData/genoManageApi.js | 181 +++++++++ src/api/upload.js | 65 +++ src/assets/icons/svg/annex.svg | 5 + src/assets/styles/ruoyi.scss | 3 + src/components/baseSelection/index.vue | 2 + src/components/cropSelection/index.vue | 40 +- src/components/fileUploader/index.vue | 288 ++++++++++++++ src/main.js | 8 +- src/router/index.js | 2 +- src/utils/EventBus.js | 3 + src/utils/md5.js | 41 ++ src/utils/request.js | 246 ++++++------ src/utils/ruoyi.js | 11 + .../breedingBase/breedingBaseForm.vue | 18 +- src/views/basicData/breedingBase/index.vue | 2 +- src/views/basicData/cropVariety/index.vue | 212 +++++----- src/views/basicData/dataGather/index.vue | 141 ++++--- src/views/genoTypeData/genoManage/index.vue | 370 +++++++++++++----- .../genoTypeData/genoManage/uploadGeno.vue | 157 +++++++- src/views/system/base/mapMarkers.vue | 1 + .../tableTypeData/plantTableData/index.vue | 253 ++++++++++++ src/views/tableTypeData/rawData/index.vue | 11 + src/views/tableTypeData/tabularData/index.vue | 11 + 27 files changed, 1764 insertions(+), 397 deletions(-) create mode 100644 src/api/basicData/cropVarietyApi.js create mode 100644 src/api/basicData/dataGatherApi.js create mode 100644 src/api/basicData/genoManageApi.js create mode 100644 src/api/upload.js create mode 100644 src/assets/icons/svg/annex.svg create mode 100644 src/components/fileUploader/index.vue create mode 100644 src/utils/EventBus.js create mode 100644 src/utils/md5.js create mode 100644 src/views/tableTypeData/plantTableData/index.vue create mode 100644 src/views/tableTypeData/rawData/index.vue create mode 100644 src/views/tableTypeData/tabularData/index.vue diff --git a/package.json b/package.json index 9335039..e683cd5 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,10 @@ "fuse.js": "7.0.0", "js-cookie": "3.0.5", "jsencrypt": "3.3.2", + "mitt": "^3.0.1", "nprogress": "0.2.0", "pinia": "2.1.7", + "promise-queue-plus": "^1.2.2", "spark-md5": "^3.0.2", "vue": "3.4.27", "vue-cropper": "1.1.1", diff --git a/src/api/basicData/breedingBaseApi.js b/src/api/basicData/breedingBaseApi.js index 1318b16..f04be93 100644 --- a/src/api/basicData/breedingBaseApi.js +++ b/src/api/basicData/breedingBaseApi.js @@ -11,6 +11,9 @@ export function selBreedingBasePage(query) { // 查询所有基地 export function selAllBreedingBase(query) { return request({ + headers: { + repeatSubmit: false + }, url: '/baseNurseryInfo/selectByPage', method: 'post', params: query diff --git a/src/api/basicData/cropVarietyApi.js b/src/api/basicData/cropVarietyApi.js new file mode 100644 index 0000000..c24d114 --- /dev/null +++ b/src/api/basicData/cropVarietyApi.js @@ -0,0 +1,67 @@ +import request from '@/utils/request' + +// 查询作物列表 +export function selCropInfo(query) { + return request({ + headers: { + repeatSubmit: false + }, + url: '/crop_info/selCropInfo', + method: 'post', + data: query + }) +} + +// 查询作物品种列表 +export function queryCropVarietyPage(query) { + return request({ + url: '/breed_info/queryByPage', + method: 'get', + params: query + }) +} + +// 查询作物品种不分页 +export function selCropVariety(query) { + return request({ + url: '/breed_info/selectByPage', + method: 'post', + data: query + }) +} + +// 通过id查询作物品种 +export function selCropVarietyById(query) { + return request({ + url: '/breed_info/queryById', + method: 'get', + params: query + }) +} + +// 添加作物品种 +export function addCropVariety(query) { + return request({ + url: '/breed_info/add', + method: 'post', + data: query + }) +} + +// 修改作物品种 +export function updateCropVariety(query) { + return request({ + url: '/breed_info/edit', + method: 'put', + data: query + }) +} + +// 删除作物品种 +export function delCropVariety(query) { + return request({ + url: '/breed_info/deleteById', + method: 'get', + params: query + }) +} \ No newline at end of file diff --git a/src/api/basicData/dataGatherApi.js b/src/api/basicData/dataGatherApi.js new file mode 100644 index 0000000..3ad9d04 --- /dev/null +++ b/src/api/basicData/dataGatherApi.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 查询数据采集设备列表 +export function selDataGather(query) { + return request({ + url: '/device_info/queryByPage', + method: 'get', + params: query + }) +} +// 修改设备所属基地 +export function updateDataGather(query) { + return request({ + url: '/device_info/updBaseNursery', + method: 'post', + data: query + }) +} \ No newline at end of file diff --git a/src/api/basicData/genoManageApi.js b/src/api/basicData/genoManageApi.js new file mode 100644 index 0000000..c688047 --- /dev/null +++ b/src/api/basicData/genoManageApi.js @@ -0,0 +1,181 @@ +import request from '@/utils/request' + +// 查询界 +export function selKingdomInfo(query) { + return new Promise((resolve, reject) => { + request({ + url: '/kingdom_info/selKingdomInfo', + method: 'post', + data: query + }).then(res => { + resolve(res.data.map(item => { + return { + level: 1, + label: item.kingdomName, + value: item.id, + prop:'kingdomId', + children: [], + key:`kingdomId-${item.id}` + } + })) + }).catch(reject) + }) +} + +// 查询门 +export function selPhylumInfo(query) { + return new Promise((resolve, reject) => { + request({ + url: '/phylum_info/selPhylumInfo', + method: 'post', + data: query + }).then(res => { + resolve(res.data.map(item => { + return { + level: 2, + label: item.phylumName, + value: item.id, + prop:'phylumId', + children: [], + key:`phylumId-${item.id}`, + parent: `kingdomId-${item.parentId}` + } + })) + }).catch(reject) + }) +} + +// 查询纲 +export function selClassInfo(query) { + return new Promise((resolve, reject) => { + request({ + url: '/class_info/selClassInfo', + method: 'post', + data: query + }).then(res => { + resolve(res.data.map(item => { + return { + level: 3, + label: item.className, + value: item.id, + prop:'classId', + children: [], + key:`classId-${item.id}`, + parent: `phylumId-${item.parentId}` + } + })) + }).catch(reject) + }) +} + +// 查询目 +export function selOrderInfo(query) { + + return new Promise((resolve, reject) => { + request({ + url: '/order_info/selOrderInfo', + method: 'post', + data: query + }).then(res => { + resolve(res.data.map(item => { + return { + level: 4, + label: item.orderName, + value: item.id, + prop:'orderId', + children: [], + key:`orderId-${item.id}`, + parent: `classId-${item.parentId}` + } + })) + }).catch(reject) + }) +} + +// 查询科 +export function selFamilyInfo(query) { + return new Promise((resolve, reject) => { + request({ + url: '/family_info/selFamilyInfo', + method: 'post', + data: query + }).then(res => { + resolve(res.data.map(item => { + return { + level: 5, + label: item.familyName, + value: item.id, + prop:'familyId', + children: [], + key:`familyId-${item.id}`, + parent: `orderId-${item.parentId}` + } + })) + }).catch(reject) + }) +} + +// 查询属 +export function selGenusInfo(query) { + return new Promise((resolve, reject) => { + request({ + url: '/genus_info/selGenusInfo', + method: 'post', + data: query + }).then(res => { + resolve(res.data.map(item => { + return { + level: 6, + label: item.genusName, + value: item.id, + prop:'genusId', + children: [], + key:`genusId-${item.id}`, + parent: `familyId-${item.parentId}` + } + })) + }).catch(reject) + }) +} +// 添加基因数据 +export function addGeno(data) { + return request({ + url: '/gene_data/add', + method: 'post', + data: data, + upload:true + }) +} +//分页查询基因数据 +export function selGenoPage(query) { + return request({ + url: '/gene_data/queryByPage', + method: 'get', + params: query + }) +} +//通过id查询基因数据 +export function selGenoById(query) { + return request({ + url: '/gene_data/queryById', + method: 'get', + params: query + }) +} +//修改基因数据 +export function editGeno(data) { + return request({ + url: '/gene_data/edit', + method: 'post', + data: data, + upload:true + }) +} +//通过id删除基因数据 +export function delGeno(query) { + return request({ + url: '/gene_data/deleteById', + method: 'get', + params: query + }) +} \ No newline at end of file diff --git a/src/api/upload.js b/src/api/upload.js new file mode 100644 index 0000000..aa1315e --- /dev/null +++ b/src/api/upload.js @@ -0,0 +1,65 @@ +import axios from 'axios' +import {getToken} from "@/utils/auth.js"; + +const http = axios.create({ + maxConcurrent: 5, //并发为1 + queueOptions: { + retry: 3, //请求失败时,最多会重试3次 + retryIsJump: false //是否立即重试, 否则将在请求队列尾部插入重试请求 + }, + baseURL: import.meta.env.VITE_APP_BASE_API, + headers:{ + 'Authorization': 'Bearer ' + getToken() + } +}) + +http.interceptors.response.use(response => { + return response.data +}) + +/** + * 根据文件的md5获取未上传完的任务 + * @param identifier 文件md5 + * @returns {Promise>} + */ +const taskInfo = (identifier) => { + return http.get(`/sys_upload_task/taskInfo/${identifier}`) +} + +/** + * 初始化一个分片上传任务 + * @param identifier 文件md5 + * @param fileName 文件名称 + * @param totalSize 文件大小 + * @param chunkSize 分块大小 + * @returns {Promise>} + */ +const initTask = ({ identifier, fileName, totalSize, chunkSize }) => { + return http.post('/sys_upload_task/initTask/', {identifier, fileName, totalSize, chunkSize}) +} + +/** + * 获取预签名分片上传地址 + * @param identifier 文件md5 + * @param partNumber 分片编号 + * @returns {Promise>} + */ +const preSignUrl = ({ identifier, partNumber }) => { + return http.get(`/sys_upload_task/${identifier}/${partNumber}`) +} + +/** + * 合并分片 + * @param identifier + * @returns {Promise>} + */ +const merge = (identifier,data) => { + return http.post(`/sys_upload_task/merge/${identifier}`,data) +} + +export { + taskInfo, + initTask, + preSignUrl, + merge +} diff --git a/src/assets/icons/svg/annex.svg b/src/assets/icons/svg/annex.svg new file mode 100644 index 0000000..972dd20 --- /dev/null +++ b/src/assets/icons/svg/annex.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss index 51e0c71..8d29737 100644 --- a/src/assets/styles/ruoyi.scss +++ b/src/assets/styles/ruoyi.scss @@ -75,6 +75,9 @@ } .el-table { + .el-table__cell{ + position: static; + } .el-table__header-wrapper, .el-table__fixed-header-wrapper { th { word-break: break-word; diff --git a/src/components/baseSelection/index.vue b/src/components/baseSelection/index.vue index 03184b7..8a67eb6 100644 --- a/src/components/baseSelection/index.vue +++ b/src/components/baseSelection/index.vue @@ -26,6 +26,8 @@ const selBaseList = () => { router.replace({ query: {} }); } }) + }else if (baseList.value.length > 0){ + clickBase(baseList.value[0]) } }).finally(()=>{ loading.value = false diff --git a/src/components/cropSelection/index.vue b/src/components/cropSelection/index.vue index 864f538..d77fa36 100644 --- a/src/components/cropSelection/index.vue +++ b/src/components/cropSelection/index.vue @@ -1,22 +1,30 @@