From ee3aa34b609057abea4c142afdcc09d05da644fb Mon Sep 17 00:00:00 2001 From: wx-jincw <jin.chenwei@iwhalecloud.com> Date: Wed, 9 Apr 2025 00:36:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BE=E7=89=87=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E3=80=81=E7=BC=96=E8=BE=91=E3=80=81=E9=A6=96=E9=A1=B5=E5=81=87?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bs-ui/src/api/system/file.js | 18 + bs-ui/src/assets/logo/logo.png | Bin 5663 -> 49512 bytes .../src/components/FileGroupUpload/index.vue | 320 ++++++++++++++++++ bs-ui/src/components/MyImageViewer/index.vue | 20 +- bs-ui/src/utils/index.js | 18 + bs-ui/src/views/dashboard/BarChart.vue | 8 +- bs-ui/src/views/dashboard/LineChart.vue | 8 +- bs-ui/src/views/dashboard/PanelGroup.vue | 18 +- bs-ui/src/views/dashboard/PieChart.vue | 14 +- .../gallery/list/components/ImageItem.vue | 49 ++- bs-ui/src/views/gallery/list/index.vue | 263 ++++++++++++-- bs-ui/src/views/index.vue | 161 ++++++++- bs-ui/src/views/index_v1.vue | 98 ++++++ 13 files changed, 925 insertions(+), 70 deletions(-) create mode 100644 bs-ui/src/components/FileGroupUpload/index.vue create mode 100644 bs-ui/src/views/index_v1.vue diff --git a/bs-ui/src/api/system/file.js b/bs-ui/src/api/system/file.js index e69de29..8fca007 100644 --- a/bs-ui/src/api/system/file.js +++ b/bs-ui/src/api/system/file.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 编辑 +export function update(data) { + return request({ + url: '/common/editFile', + method: 'put', + data + }) +} + +export function fileDownload(attachId) { + return request({ + url: `/file/download/${attachId}`, + method: "get", + responseType: "blob", + }); +} \ No newline at end of file diff --git a/bs-ui/src/assets/logo/logo.png b/bs-ui/src/assets/logo/logo.png index e26376026420542212ed58d90d0ed34f554fa4ae..a58da9b3680cb4e70fc651230eed2fc83ae4d999 100644 GIT binary patch literal 49512 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 literal 5663 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 diff --git a/bs-ui/src/components/FileGroupUpload/index.vue b/bs-ui/src/components/FileGroupUpload/index.vue new file mode 100644 index 0000000..0b9cf60 --- /dev/null +++ b/bs-ui/src/components/FileGroupUpload/index.vue @@ -0,0 +1,320 @@ +<template> + <div class="file-group-upload" v-loading="loading"> + <div class="file-group-upload__btns"> + <el-badge + v-for="(item, index) in uploadTypes" + :key="item.key" + :value="getTypeFileCount(item.key)" + > + <el-upload + ref="upload" + class="upload-demo" + :action="action" + multiple + :file-list="item.children" + :limit="item.max" + :show-file-list="false" + :on-exceed="handleExceed" + :on-success="handleSuccess" + :before-upload="handleBeforeUpload" + :headers="headers" + :data="{ fileId: item.key }" + > + <el-button + size="small" + icon="el-icon-upload" + :disabled="readonly || loadFail" + @click="handleUpload(index)" + > + {{ item.label }} + </el-button> + </el-upload> + </el-badge> + </div> + <el-table + :data="tableFileList" + :highlight-current-row="true" + :header-row-style="{ height: '40px' }" + :row-style="{ height: '46px' }" + :cell-style="{ padding: '0px' }" + :header-cell-style="{ padding: '0px' }" + :span-method="spanMethod" border + > + <el-button v-if="loadFail" slot="empty" type="text" icon="el-icon-refresh-right" @click="getFileList">加载错误,点击刷新</el-button> + <el-table-column label="" type="index" width="30"></el-table-column> + <el-table-column prop="belong" label="所属类别" align="center" /> + <el-table-column label="附件名" align="center"> + <template slot-scope="scope"> + <el-button type="text" @click="handleDownload(scope.row)">{{ scope.row.oldName }}</el-button> + </template> + </el-table-column> + <el-table-column label="预览" align="center" min-width="60"> + <template slot-scope="scope"> + <div class="img-box"> + <el-image style="width:40px; height:40px" fit="contain" :src="getFullUrl(scope.row.attachFileUrl)" :preview-src-list="[getFullUrl(scope.row.attachFileUrl)]" /> + </div> + </template> + </el-table-column> + <el-table-column label="类型" align="center" width="80"> + <template slot-scope="scope"> + <div>{{ scope.row.oldName.split('.')[1] }}</div> + </template> + </el-table-column> + <el-table-column v-if="!readonly" label="操作" width="80" align="center"> + <template slot-scope="scope"> + <el-popconfirm + title="删除后不可恢复,确定删除吗?" + @confirm="handleRemove(scope.row)" + > + <el-button slot="reference" type="text" :disabled="readonly">删除</el-button> + </el-popconfirm> + </template> + </el-table-column> + </el-table> + </div> +</template> + +<script> +import { getToken } from '@/utils/auth' +import { deleteFile, getAttachListByFileIds } from '@/api/common/file.js' +import download from '@/plugins/download.js' + +// 文件类型所对应的mime类型 +const FILE_MIME_MAP = { + 'png': 'image/png', + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'ppt': 'application/vnd.ms-powerpoint', + 'doc': 'application/msword', + 'docx': 'application/vndopenxmlformats-officedocumentwordprocessingmldocument', + 'xls': 'application/vnd.ms-excel', + 'xlsx': 'application/vndopenxmlformats-officedocumentspreadsheetmlsheet' +} +export default { + name: 'FileGroupUpload', + props: { + // 上传的种类 每个种类都会形成一个独有的上传按钮 + uploadTypes: { + type: Array, + default: () => { + return [ + { + prop: 'fileId', + label: '上传附件', // 按钮名称 + key: '', // 文件分类的标识,如果是第一次上传则无这个标识,由uuid生成 + idFromServer: false, // 文件ID是否来自服务器 + min: 1, // 最少上传数量 一般没啥用 + max: 10, // 最多上传数量 + types: '', // 限制上传类型 用逗号隔开 + } + ] + } + }, + readonly: { + type: Boolean, + default: false + } + }, + data() { + return { + loading: false, + loadFail: false, + fileList: [], // 文件总列表 + currentActive: 0, // 当前操作的文件类型下标 + action: process.env.VUE_APP_BASE_API + '/common/upload', + headers: { + Authorization: 'Bearer ' + getToken() + } + } + }, + computed: { + fileKeyList() { + const fileKeyList = {}; + this.fileList.forEach(item => { + if (!fileKeyList[item.key]) { + fileKeyList[item.key] = []; + } + fileKeyList[item.key].push(item); + }); + return fileKeyList; + }, + tableFileList() { + const list = []; + Object.keys(this.fileKeyList).forEach(key => { + list.push(...this.fileKeyList[key]); + }) + return list; + } + }, + watch: { + uploadTypes(newVal) { + this.getFileList(); + } + }, + methods: { + getFullUrl(url) { + return process.env.VUE_APP_BASE_API + url; + }, + async getFileList() { + const filterUploadTypes = this.uploadTypes.filter(item => item.idFromServer); + const fileIds = filterUploadTypes.map(item => item.key); + this.loading = true; + this.loadFail = false; + try { + const { data } = await getAttachListByFileIds(fileIds.join()); + if (!data) { + return; + } + const fileList = []; + filterUploadTypes.forEach(item => { + let children = data[item.key] || []; + children = children.map(child => ({ + ...child, + key: item.key, + prop: item.prop, + belong: item.label, + attachId: child.id, + })); + fileList.push(...children); + }); + this.fileList = fileList; + } catch (error) { + this.loadFail = true; + } finally { + this.loading = false; + } + + }, + getTypeFileCount(key) { + return this.fileList.filter(item => item.key === key).length; + }, + // 更新发送文件ID数据 + sendFileId() { + const fileIdMap = this.fileList.reduce((pre, cur) => { + return { + ...pre, + [cur.prop]: cur.key + } + }, {}); + this.$emit('fileMap', fileIdMap); + }, + /** + * 上传操作 + * @param {*} index 上传类型所对应的下标 + */ + handleUpload(index) { + this.currentActive = index + }, + /** + * 删除 + * @param {*} info 文件信息 + */ + async handleRemove(info) { + try { + const { code } = await deleteFile(info.attachId) + if (+code === 200) { + this.$message.success('删除成功') + this.fileList = this.fileList.filter(item => item.attachId !== info.attachId); + this.sendFileId(); + } + } catch (e) { + console.error(e) + } + }, + /** + * 处理文件超出个数限制 + * @param {*} files 上传的文件 + * @param {*} fileList 文件总列表 + */ + handleExceed(files, fileList) { + this.$message.warning(`文件超出可上传的个数限制! 该类型文件最多可上传${this.uploadTypes[this.currentActive].max}个`) + }, + /** + * @param {*} res 上传接口返回 + * @param {*} file 上传的文件 + * @param {*} fileList 已经上传的文件列表 + */ + handleSuccess(res, file, fileList) { + const { cmAttach } = res + const { label, key, prop } = this.uploadTypes[this.currentActive] + this.fileList.push({ + ...cmAttach, + prop, + belong: label, + key, + attachId: cmAttach.id + }); + this.sendFileId(); + }, + handleBeforeUpload(file) { + const acceptTypes = this.uploadTypes[this.currentActive].types.split(',').map(item => FILE_MIME_MAP[item]) + if (!acceptTypes.includes(file.type)) { + this.$message.error(`只允许上传类型为: ${this.uploadTypes[this.currentActive].types} 的文件`) + return false + } else { + return true + } + }, + /** + * 点击文件名下载文件 + * @param {*} info 文件信息 + */ + async handleDownload(info) { + try { + download.attachId(info.attachId, info.oldName, false) + } catch (e) { + console.error(e) + } + }, + spanMethod({ row, column, rowIndex, columnIndex }) { + if (columnIndex !== 1) { + return ; + } + const typeFiles = this.fileKeyList[row.key]; + const firstFile = typeFiles[0]; + if (row.attachId === firstFile.attachId) { + return [typeFiles.length, 1]; + } else { + return [0, 0]; + } + }, + } +} +</script> + +<style scoped lang="scss"> + +.file-group-upload { + margin-top: 12px; + &__btns { + margin-bottom: 12px; + display: grid; + grid-template-columns: repeat(auto-fill, 88px); + grid-auto-rows: 32px; + gap: 12px; + + .el-button--small { + width: 88px; + height: 32px; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + } + } + .file-name:hover { + cursor: pointer; + color: #409EFF; + } + + .file-delete:hover { + color: #409EFF; + } +} +.img-box { + height: 100%; + display: flex; + justify-content: center; + align-items: center; +} +</style> diff --git a/bs-ui/src/components/MyImageViewer/index.vue b/bs-ui/src/components/MyImageViewer/index.vue index b100002..fd7c0b4 100644 --- a/bs-ui/src/components/MyImageViewer/index.vue +++ b/bs-ui/src/components/MyImageViewer/index.vue @@ -4,7 +4,7 @@ <script> import ImageViewer from './image-viewer'; -import { update, fileDownload, deleteFile } from '@/api/system/file'; +import { update, fileDownload } from '@/api/system/file'; import { downloadFile } from '@/utils'; export default { @@ -43,10 +43,10 @@ export default { console.log("this.files"); console.log(this.files); return this.files.map(val => { - if (val.attachFileurl.indexOf("http") === 0) { - return val.attachFileurl; + if (val.attachFileUrl?.indexOf("http") === 0) { + return val.attachFileUrl; } - return process.env.VUE_APP_BASE_API + val.attachFileurl; + return process.env.VUE_APP_BASE_API + val.attachFileUrl; }); } }, @@ -70,7 +70,7 @@ export default { const item = this.files[index]; this.loading = true; fileDownload(item.attachId).then((res) => { - const suffix = item.attachFileurl.substring(item.attachFileurl.lastIndexOf(".")).toLowerCase(); + const suffix = item.attachFileUrl.substring(item.attachFileUrl.lastIndexOf(".")).toLowerCase(); downloadFile(res, item.oldName + suffix); this.loading = false; }).catch(e => { @@ -87,8 +87,7 @@ export default { const item = this.files[index]; this.loading = true; update({ - attachId: item.attachId, - refId: item.refId, + ...item, oldName: filename, }).then(res => { this.loading = false; @@ -107,13 +106,12 @@ export default { const item = this.files[index]; this.loading = true; update({ - attachId: item.attachId, - refId: item.refId, + ...item, angle: deg, }).then(res => { this.loading = false; - item.attachFileurl = res.data.attachFileurl; - item.url = process.env.VUE_APP_BASE_API + res.data.attachFileurl; + item.attachFileUrl = res.data.attachFileUrl; + item.url = process.env.VUE_APP_BASE_API + res.data.attachFileUrl; // this.files[index] = res.data; this.$emit('change', [...this.files]); this.$refs.viewer && this.$refs.viewer.reset(); diff --git a/bs-ui/src/utils/index.js b/bs-ui/src/utils/index.js index a43ff18..19451b4 100644 --- a/bs-ui/src/utils/index.js +++ b/bs-ui/src/utils/index.js @@ -1,5 +1,23 @@ import { parseTime } from './bs' +/** + * 表格时间格式化 + */ +export function formatDateStr(cellValue, hasTime = false) { + + var date = cellValue ? new Date(cellValue) : new Date(); + var year = date.getFullYear() + var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + if (hasTime) { + var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() + return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds + } + return year + '-' + month + '-' + day; +} + /** * 表格时间格式化 */ diff --git a/bs-ui/src/views/dashboard/BarChart.vue b/bs-ui/src/views/dashboard/BarChart.vue index cd33d2d..09432e3 100644 --- a/bs-ui/src/views/dashboard/BarChart.vue +++ b/bs-ui/src/views/dashboard/BarChart.vue @@ -62,7 +62,7 @@ export default { }, xAxis: [{ type: 'category', - data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + data: ['04-02', '04-03', '04-04', '04-05', '04-06', '04-07', '04-08'], axisTick: { alignWithLabel: true } @@ -74,21 +74,21 @@ export default { } }], series: [{ - name: 'pageA', + name: '访问量', type: 'bar', stack: 'vistors', barWidth: '60%', data: [79, 52, 200, 334, 390, 330, 220], animationDuration }, { - name: 'pageB', + name: '下载量', type: 'bar', stack: 'vistors', barWidth: '60%', data: [80, 52, 200, 334, 390, 330, 220], animationDuration }, { - name: 'pageC', + name: '上传量', type: 'bar', stack: 'vistors', barWidth: '60%', diff --git a/bs-ui/src/views/dashboard/LineChart.vue b/bs-ui/src/views/dashboard/LineChart.vue index ddd1063..2a8358e 100644 --- a/bs-ui/src/views/dashboard/LineChart.vue +++ b/bs-ui/src/views/dashboard/LineChart.vue @@ -64,7 +64,7 @@ export default { setOptions({ expectedData, actualData } = {}) { this.chart.setOption({ xAxis: { - data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + data: ['04-02', '04-03', '04-04', '04-05', '04-06', '04-07', '04-08'], boundaryGap: false, axisTick: { show: false @@ -90,10 +90,10 @@ export default { } }, legend: { - data: ['expected', 'actual'] + data: ['上月', '当月'] }, series: [{ - name: 'expected', itemStyle: { + name: '上月', itemStyle: { normal: { color: '#FF005A', lineStyle: { @@ -109,7 +109,7 @@ export default { animationEasing: 'cubicInOut' }, { - name: 'actual', + name: '当月', smooth: true, type: 'line', itemStyle: { diff --git a/bs-ui/src/views/dashboard/PanelGroup.vue b/bs-ui/src/views/dashboard/PanelGroup.vue index 1a1081f..9457b12 100644 --- a/bs-ui/src/views/dashboard/PanelGroup.vue +++ b/bs-ui/src/views/dashboard/PanelGroup.vue @@ -7,9 +7,9 @@ </div> <div class="card-panel-description"> <div class="card-panel-text"> - 访客 + 访问 </div> - <count-to :start-val="0" :end-val="102400" :duration="2600" class="card-panel-num" /> + <count-to :start-val="0" :end-val="102" :duration="2600" class="card-panel-num" /> </div> </div> </el-col> @@ -22,33 +22,33 @@ <div class="card-panel-text"> 消息 </div> - <count-to :start-val="0" :end-val="81212" :duration="3000" class="card-panel-num" /> + <count-to :start-val="0" :end-val="34" :duration="3000" class="card-panel-num" /> </div> </div> </el-col> <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"> <div class="card-panel" @click="handleSetLineChartData('purchases')"> <div class="card-panel-icon-wrapper icon-money"> - <svg-icon icon-class="money" class-name="card-panel-icon" /> + <svg-icon icon-class="form" class-name="card-panel-icon" /> </div> <div class="card-panel-description"> <div class="card-panel-text"> - 金额 + 已办 </div> - <count-to :start-val="0" :end-val="9280" :duration="3200" class="card-panel-num" /> + <count-to :start-val="0" :end-val="68" :duration="3200" class="card-panel-num" /> </div> </div> </el-col> <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col"> <div class="card-panel" @click="handleSetLineChartData('shoppings')"> <div class="card-panel-icon-wrapper icon-shopping"> - <svg-icon icon-class="shopping" class-name="card-panel-icon" /> + <svg-icon icon-class="upload" class-name="card-panel-icon" /> </div> <div class="card-panel-description"> <div class="card-panel-text"> - 订单 + 图片 </div> - <count-to :start-val="0" :end-val="13600" :duration="3600" class="card-panel-num" /> + <count-to :start-val="0" :end-val="65" :duration="3600" class="card-panel-num" /> </div> </div> </el-col> diff --git a/bs-ui/src/views/dashboard/PieChart.vue b/bs-ui/src/views/dashboard/PieChart.vue index c360057..8197934 100644 --- a/bs-ui/src/views/dashboard/PieChart.vue +++ b/bs-ui/src/views/dashboard/PieChart.vue @@ -52,21 +52,21 @@ export default { legend: { left: 'center', bottom: '10', - data: ['Industries', 'Technology', 'Forex', 'Gold', 'Forecasts'] + data: ['互动小组', '品牌宣讲', '日常任务'] }, series: [ { - name: 'WEEKLY WRITE ARTICLES', + name: '任务类型', type: 'pie', roseType: 'radius', radius: [15, 95], center: ['50%', '38%'], data: [ - { value: 320, name: 'Industries' }, - { value: 240, name: 'Technology' }, - { value: 149, name: 'Forex' }, - { value: 100, name: 'Gold' }, - { value: 59, name: 'Forecasts' } + { value: 320, name: '互动小组' }, + { value: 240, name: '品牌宣讲' }, + { value: 149, name: '日常任务' }, + // { value: 100, name: 'Gold' }, + // { value: 59, name: 'Forecasts' } ], animationEasing: 'cubicInOut', animationDuration: 2600 diff --git a/bs-ui/src/views/gallery/list/components/ImageItem.vue b/bs-ui/src/views/gallery/list/components/ImageItem.vue index 3153192..3f66c4a 100644 --- a/bs-ui/src/views/gallery/list/components/ImageItem.vue +++ b/bs-ui/src/views/gallery/list/components/ImageItem.vue @@ -1,13 +1,13 @@ <template> <div class="image-item" @click="$emit('goDetail')"> - <img class="image" src="https://picsum.photos/200/300" alt=""> + <img class="image" :src="imageUrl" alt=""> <div class="info"> - <div class="info-title">图片名称</div> - <div class="info-date">2025-05-05 12:12:12</div> + <div class="info-subtitle">{{ imageName }}</div> + <div class="info-title">{{ item.imageTitle }}</div> + <div class="info-date">{{ item.uploadTime }}</div> <div class="info-tag"> - <el-tag size="small">大厅</el-tag> - <el-tag size="small" style="margin-left: 3px;">大厅</el-tag> - <el-tag size="small" style="margin-left: 3px;">大厅</el-tag> + <el-tag size="small" >公开</el-tag> + <el-tag size="small" v-if="item.keyWords" style="margin-left: 3px;">{{ item.keyWords }}</el-tag> </div> </div> </div> @@ -15,7 +15,34 @@ <script> export default { - name: 'ImageItem' + name: 'ImageItem', + props: { + item: { + type: Object, + default: () => ({}) + } + }, + computed: { + imageUrl() { + let url = this.item.imagePath; + if (this.item.file?.length > 0) { + url = this.item.file[0].attachFileUrl || this.item.imagePath; + } + if (url.indexOf("http") === 0) { + return url; + } + return process.env.VUE_APP_BASE_API + url; + }, + imageName() { + if (this.item.file?.length > 0) { + return this.item.file[0].oldName || this.item.imageName; + } + return this.item.imageName; + } + }, + methods: { + + } } </script> @@ -35,12 +62,18 @@ export default { .info-title { font-size: 18px; + margin-top: 5px; + } + + .info-subtitle { + font-size: 14px; + color: #999999; } .info-date { margin-top: 2px; font-size: 15px; - color: #666666; + color: #999999; } diff --git a/bs-ui/src/views/gallery/list/index.vue b/bs-ui/src/views/gallery/list/index.vue index 9ae1205..ff3078c 100644 --- a/bs-ui/src/views/gallery/list/index.vue +++ b/bs-ui/src/views/gallery/list/index.vue @@ -1,10 +1,15 @@ <template> - <div class="app-container" v-loading="tableLoading"> - <el-form :model="query" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> - <el-form-item label="图片名称" prop="name"> + <div class="app-container" > + <div class="left-content"> + <div style="margin-bottom: 20px;">图片目录:</div> + <el-tree :data="cates" :props="defaultProps" @node-click="handleNodeClick"></el-tree> + </div> + <div class="right-content" v-loading="tableLoading"> + <el-form :model="query" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> + <el-form-item label="图片标题" prop="imageTitle"> <el-input - v-model="query.cataName" - placeholder="请输入图片名称" + v-model="query.imageTitle" + placeholder="请输入图片标题" clearable @keyup.enter.native="handleQuery" /> @@ -15,40 +20,105 @@ </el-form-item> </el-form> <el-row :gutter="10" class="mb8"> - <!-- <el-col :span="1.5"> + <el-col :span="1.5"> <el-button type="warning" plain - icon="el-icon-download" + icon="el-icon-upload" size="mini" - @click="handleExport" - v-hasPermi="['gallery:cata:export']" - >导出</el-button> - </el-col> --> + @click="handleUpload" + >上传</el-button> + </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getTableList"></right-toolbar> </el-row> <div class="image-list"> - <ImageItem class="image-item" @goDetail="showImageViewer"></ImageItem> - <ImageItem class="image-item"></ImageItem> - <ImageItem class="image-item"></ImageItem> + <ImageItem v-for="(item, index) in tableData" :key="index" :item="item" class="image-item" @goDetail="showImageViewer($event, index)"></ImageItem> </div> <!-- 表格页脚 --> <pagination v-show="total > 0" :total="total" - :pageSizes="[5, 10, 20, 50]" :page.sync="page.pageNum" :limit.sync="page.pageSize" @pagination="getTableList" /> + </div> + <MyImageViewer ref="previewImage" :z-index="2000" - :files="[{attachFileurl:'https://picsum.photos/200/300'}, {attachFileurl:'https://picsum.photos/200/300'}]"></MyImageViewer> + :files="images" :options="{ + download: true, + print: true, + edit: true, + check: true, + }" @change="imageEditChange"></MyImageViewer> + <!-- 添加或修改部门对话框 --> + <el-dialog title="上传图片" :visible.sync="openLoad" width="600px" append-to-body> + <el-form ref="form" :model="form" :rules="rules" label-width="80px"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="目录" prop="cataId"> + <el-select v-model="form.cataId" + style="width: 100%"> + <el-option v-for="item in cates" :key="item.id" :label="item.cataName" :value="item.id"></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="图片标题" prop="imageTitle"> + <el-input v-model="form.imageTitle" placeholder="请输入图片标题" /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="拍摄时间" prop="photoTime"> + <el-date-picker + v-model="form.photoTime" + style="width: 100%" + value-format="yyyy-MM-dd" + type="date" + placeholder="选择日期" + ></el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="关键词" prop="keyWords"> + <el-input v-model="form.keyWords" placeholder="请输入图片关键词" /> + </el-form-item> + </el-col> + </el-row> + <el-upload + v-if="openLoad" + ref="upload" + class="avatar-uploader" + :action="uploadFileUrl" + :show-file-list="false" + :on-change="handleFileChange" + :on-success="handleFileSuccess" + :on-error="handleFileError" + :auto-upload="false" + :headers="headers" + :data="uploadData" + :limit="1" accept=".png,.jpg,.jpeg,.gif"> + <img v-if="imageUrl" :src="imageUrl" class="avatar"> + <i v-else class="el-icon-plus avatar-uploader-icon"></i> + </el-upload> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" v-loading="uploading" @click="submitForm">确 定</el-button> + <el-button @click="cancel">取 消</el-button> + </div> + </el-dialog> </div> </template> <script> import ImageItem from './components/ImageItem.vue'; import tableMixin from '../../../mixins/table-mixin'; +import { listCata } from "@/api/gallery/cata"; +import { pageListImages } from "@/api/gallery/images"; +import { getToken } from "@/utils/auth"; +import { formatDateStr } from "@/utils"; export default { name: 'List', @@ -56,23 +126,150 @@ export default { ImageItem }, mixins: [tableMixin], + pageInfo: { + title: '图片列表', + exportUrl: '', + pageListApi: pageListImages, + }, data() { return { - showViewer: false, + cates: [], + defaultProps: { + children: 'children', + label: 'cataName' + }, + openLoad: false, + form: { + imageTitle: null, + photoTime: null,// 图片拍摄时间, + uploadTime: formatDateStr(), + isOpen: 1, + keyWords: '日常', + cataId: null, + }, + rules: { + imageTitle: [{ required: true, message: '请输入图片标题', trigger: 'blur' }], + photoTime: [{ required: true, message: '请输入图片拍摄时间', trigger: 'change' }], + cataId: [{ required: true, message: '请选择图片目录', trigger: 'change' }] + }, + imageUrl: '', + uploadFileUrl: process.env.VUE_APP_BASE_API + "/gallery/images/upload", // 上传文件服务器地址 + headers: { + Authorization: "Bearer " + getToken(), + }, + uploading: false, }; }, + computed: { + uploadData() { + const params = {}; + Object.keys(this.form).forEach(key => { + if (this.form[key] !== null) { + params[key] = this.form[key]; + } + }); + return params; + }, + images() { + return this.tableData.map(item => { + return item.file?.[0] || {}; + }); + } + }, + created() { + listCata().then(res => { + const list = res.data || []; + this.cates = list; + }) + }, methods: { - showImageViewer() { + imageEditChange() { + this.getTableList(); + }, + showImageViewer(event, index) { console.log('showImageViewer'); - this.showViewer = true; - this.$refs.previewImage.open(0); + this.$refs.previewImage.open(index); - } + }, + handleNodeClick(data) { + console.log(data); + if (this.query.cataId === data.id) { + this.query.cataId = null; + } else { + this.query.cataId = data.id; + } + this.getTableList(); + }, + handleUpload() { + this.form = { + imageTitle: null, + photoTime: null,// 图片拍摄时间, + uploadTime: formatDateStr(), + isOpen: 1, + keyWords: '日常', + cataId: null, + }; + this.imageUrl = ''; + this.openLoad = true; + }, + cancel() { + this.openLoad = false; + this.uploading = false; + }, + submitForm() { + if (!this.imageUrl) { + this.$message.error('请选择图片'); + return; + } + + this.$refs['form'].validate((valid) => { + if (valid) { + this.uploading = true; + this.$refs.upload.submit(); + } + }); + }, + handleFileChange(file) { + this.imageUrl = URL.createObjectURL(file.raw); + }, + handleFileSuccess(res, file) { + this.$message.success('上传成功'); + this.openLoad = false; + this.uploading = false; + this.getTableList(); + }, + handleFileError() { + this.$message.error('上传失败'); + this.uploading = false; + }, + beforeAvatarUpload(file) { + const isImg = file.type.indexOf('image/') !== -1; + + if (!isImg) { + this.$message.error('只能上传图片!'); + } + return isImg; + } } } </script> <style lang="scss" scoped> +.app-container { + display: flex; +} +.left-content { + width: 300px; + padding: 15px; + border: #EEEEEE 1px solid; + border-radius: 8px; +} + +.right-content { + width: 0; + flex: 1; + margin-left: 10px; +} .image-list { display: flex; flex-wrap: wrap; @@ -82,4 +279,28 @@ export default { margin: 0 15px 15px 0; } } + + .avatar-uploader ::v-deep .el-upload { + border: 1px dashed #d9d9d9; + border-radius: 6px; + cursor: pointer; + position: relative; + overflow: hidden; + } + .avatar-uploader ::v-deep .el-upload:hover { + border-color: #409EFF; + } + .avatar-uploader-icon { + font-size: 28px; + color: #8c939d; + width: 178px; + height: 178px; + line-height: 178px; + text-align: center; + } + .avatar { + width: 178px; + height: 178px; + display: block; + } </style> \ No newline at end of file diff --git a/bs-ui/src/views/index.vue b/bs-ui/src/views/index.vue index 7fe35dd..cc03819 100644 --- a/bs-ui/src/views/index.vue +++ b/bs-ui/src/views/index.vue @@ -1,29 +1,142 @@ <template> <div class="app-container"> <div class="left-container"> - <!-- <el-carousel height="300px"> - <el-carousel-item v-for="item in 4" :key="item"> - <div></div> - <div></div> + <el-carousel height="300px"> + <el-carousel-item v-for="item in cates" :key="item.id" @click="goImageList"> + <div class="index-flex" @click="goImageList"> + <div class="cata-name">{{ item.cataName }}</div> + <img class="single-image image-border" :src="imageUrl(item.images[0])"/> + </div> + <div class="index-flex" @click="goImageList"> + <img class="double-image image-border" :src="imageUrl(item.images[1])"/> + <img class="double-image image-border" style="margin-left: 10px;" :src="imageUrl(item.images[2])"/> + </div> </el-carousel-item> - </el-carousel> --> + </el-carousel> + <el-card style="margin-top: 50px;" > + <div slot="header" class="clearfix"> + <span>我的任务</span> + <el-button style="float: right; padding: 3px 0" type="text" @click="goMoreTask">查看更多</el-button> + </div> + <el-table + ref="multipleTable" + tooltip-effect="dark" + :data="tableData" + class="w100p" + border + header-cell-class-name="duojibiaotou" + > + <el-table-column + align="center" + label="任务名称" + show-overflow-tooltip + min-width="160" + prop="taskTitle" + /> + <el-table-column label="任务类型" align="center" prop="taskType" min-width="100"> + <template slot-scope="scope"> + <dict-tag :options="dict.type.task_type" :value="scope.row.taskType"/> + </template> + </el-table-column> + <el-table-column label="任务状态" align="center" prop="taskStatus" min-width="100"> + <template slot-scope="scope"> + <dict-tag :options="dict.type.task_status" :value="scope.row.taskStatus"/> + </template> + </el-table-column> + <el-table-column + align="center" + label="状态" + show-overflow-tooltip + min-width="90" + > + <template v-slot="{ row }"> + <template v-if="row.sdTaskOther && row.sdTaskOther.status === '2'"> + <el-tag + type="success">已办结</el-tag> + </template> + <template v-else-if="row.sdTaskOtherFeedbackByCreate"> + <el-tag v-if="row.sdTaskOtherFeedbackByCreate.status === '1'" + >已反馈</el-tag + > + <el-tag + v-else-if="row.sdTaskOtherFeedbackByCreate.status === '2'" + type="success" + >已通过</el-tag + > + <el-tag + v-else-if="row.sdTaskOtherFeedbackByCreate.status === '-1'" + type="danger" + >驳回</el-tag + > + <el-tag v-else type="info">未反馈</el-tag> + </template> + <el-tag v-else type="info">未反馈</el-tag> + </template> + </el-table-column> + </el-table> + </el-card> </div> <div class="right-container"> - + <index_v1 ></index_v1> </div> </div> </template> <script> +import { listCata } from "@/api/gallery/cata"; +import { pageListImages } from "@/api/gallery/images"; +import index_v1 from "./index_v1.vue"; +import { pageListByUser } from "@/api/task/branch"; + export default { name: "Index", + components: { + index_v1, + }, + dicts: ['task_type','task_status'], data() { return { + cates: [], + tableData: [] }; }, + created() { + listCata().then((res) => { + this.cates = res.data || []; + this.cates.forEach((item) => { + this.$set(item, "images", []); + pageListImages({ cataId: item.id, pageNum: 1, pageSize: 3 }).then((result) => { + this.$set(item, "images", result.rows || []); + }); + }); + }); + + pageListByUser({ pageNum: 1, pageSize: 10 }).then((res) => { + this.tableData = res.rows || []; + }); + }, methods: { + goMoreTask() { + this.$router.push({ path: "/task/MyTask" }); + }, + goImageList() { + this.$router.push({ path: "/gallery/list" }); + }, + imageUrl(item) { + if (!item) { + return ""; + } + let url = item.imagePath; + if (item.file?.length > 0) { + url = item.file[0].attachFileUrl || item.imagePath; + } + if (url.indexOf("http") === 0) { + return url; + } + return process.env.VUE_APP_BASE_API + url; + } } }; </script> @@ -32,6 +145,42 @@ export default { .app-container { display: flex; + .index-flex { + display: flex; + padding: 5px; + height: 50%; + } + + .cata-name { + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + font-weight: 500; + height: 100%; + width: 120px; + padding: 10px; + } + + .image-border { + border-radius: 6px; + overflow: hidden; + } + + .single-image { + flex: 1; + height: 100%; + background: #f5f5f5; + object-fit: cover; + } + + .double-image { + flex: 1; + height: 100%; + background: #f5f5f5; + object-fit: cover; + } + .left-container { width: 400px; diff --git a/bs-ui/src/views/index_v1.vue b/bs-ui/src/views/index_v1.vue new file mode 100644 index 0000000..b9d16bf --- /dev/null +++ b/bs-ui/src/views/index_v1.vue @@ -0,0 +1,98 @@ +<template> + <div class="dashboard-editor-container"> + + <panel-group @handleSetLineChartData="handleSetLineChartData" /> + + <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;"> + <line-chart :chart-data="lineChartData" /> + </el-row> + + <el-row :gutter="32"> + <!-- <el-col :xs="24" :sm="24" :lg="8"> + <div class="chart-wrapper"> + <raddar-chart /> + </div> + </el-col> --> + <el-col :xs="24" :sm="24" :lg="12"> + <div class="chart-wrapper"> + <pie-chart /> + </div> + </el-col> + <el-col :xs="24" :sm="24" :lg="12"> + <div class="chart-wrapper"> + <bar-chart /> + </div> + </el-col> + </el-row> + + + </div> +</template> + +<script> +import PanelGroup from './dashboard/PanelGroup' +import LineChart from './dashboard/LineChart' +import RaddarChart from './dashboard/RaddarChart' +import PieChart from './dashboard/PieChart' +import BarChart from './dashboard/BarChart' + +const lineChartData = { + newVisitis: { + expectedData: [100, 120, 161, 134, 105, 160, 165], + actualData: [120, 82, 91, 154, 162, 140, 145] + }, + messages: { + expectedData: [200, 192, 120, 144, 160, 130, 140], + actualData: [180, 160, 151, 106, 145, 150, 130] + }, + purchases: { + expectedData: [80, 100, 121, 104, 105, 90, 100], + actualData: [120, 90, 100, 138, 142, 130, 130] + }, + shoppings: { + expectedData: [130, 140, 141, 142, 145, 150, 160], + actualData: [120, 82, 91, 154, 162, 140, 130] + } +} + +export default { + name: 'Index', + components: { + PanelGroup, + LineChart, + RaddarChart, + PieChart, + BarChart + }, + data() { + return { + lineChartData: lineChartData.newVisitis + } + }, + methods: { + handleSetLineChartData(type) { + this.lineChartData = lineChartData[type] + } + } +} +</script> + +<style lang="scss" scoped> +.dashboard-editor-container { + padding: 32px; + background-color: rgb(240, 242, 245); + position: relative; + + .chart-wrapper { + background: #fff; + padding: 16px 16px 0; + margin-bottom: 32px; + } +} + +@media (max-width:1024px) { + .chart-wrapper { + padding: 8px; + } +} +</style>