Pre Merge pull request !106 from puhui999/dev

pull/106/MERGE
puhui999 2023-04-08 16:24:41 +00:00 committed by Gitee
commit afe80fed7b
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
5 changed files with 167 additions and 164 deletions

View File

@ -230,7 +230,7 @@ const handleAuthorized = () => {
wsCache.clear()
removeToken()
isRelogin.show = false
window.location.href = '/login?redirect=/sso?' + window.location.href.split('?')[1]
window.location.href = window.location.href
})
}
return Promise.reject(t('sys.api.timeoutMessage'))

View File

@ -24,6 +24,7 @@ declare module '@vue/runtime-core' {
DocAlert: typeof import('./../components/DocAlert/index.vue')['default']
Echart: typeof import('./../components/Echart/src/Echart.vue')['default']
Editor: typeof import('./../components/Editor/src/Editor.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElBadge: typeof import('element-plus/es')['ElBadge']
ElButton: typeof import('element-plus/es')['ElButton']
ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup']
@ -54,17 +55,12 @@ declare module '@vue/runtime-core' {
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElImage: typeof import('element-plus/es')['ElImage']
ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
@ -74,6 +70,7 @@ declare module '@vue/runtime-core' {
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTree: typeof import('element-plus/es')['ElTree']
ElUpload: typeof import('element-plus/es')['ElUpload']

View File

@ -1,23 +1,21 @@
<template>
<Dialog title="上传文件" v-model="dialogVisible">
<Dialog v-model="dialogVisible" title="上传文件">
<el-upload
ref="uploadRef"
:action="url"
:data="data"
:headers="uploadHeaders"
v-model:file-list="fileList"
drag
accept=".jpg, .png, .gif"
:limit="1"
:on-success="submitFormSuccess"
:on-exceed="handleExceed"
:on-error="submitFormError"
:on-change="handleFileChange"
:auto-upload="false"
:data="data"
:disabled="formLoading"
:headers="headers"
:limit="1"
:on-change="handleFileChange"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
accept=".jpg, .png, .gif"
drag
>
<i class="el-icon-upload"></i>
<div class="el-upload__text"> 将文件拖到此处 <em>点击上传</em> </div>
<div class="el-upload__text"> 将文件拖到此处 <em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip" style="color: red">
提示仅允许导入 jpgpnggif 格式文件
@ -25,53 +23,50 @@
</template>
</el-upload>
<template #footer>
<el-button @click="submitFileForm" type="primary" :disabled="formLoading"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitFileForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getAccessToken, getTenantId } from '@/utils/auth'
<script lang="ts" setup>
import { Dialog } from '@/components/Dialog'
import { getAccessToken } from '@/utils/auth'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const formLoading = ref(false) //
const formLoading = ref(false) // 12
const url = import.meta.env.VITE_UPLOAD_URL
const uploadHeaders = ref() // Header
const fileList = ref([]) //
const headers = { Authorization: 'Bearer ' + getAccessToken() }
const data = ref({ path: '' })
const uploadRef = ref()
/** 打开弹窗 */
const open = async () => {
dialogVisible.value = true
resetForm()
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
/** 处理上传的文件发生变化 */
const handleFileChange = (file) => {
data.value.path = file.name
}
/** 提交表单 */
/** 处理文件上传中 */
const handleFileUploadProgress = () => {
formLoading.value = true //
}
/** 发起文件上传 */
const submitFileForm = () => {
if (fileList.value.length == 0) {
message.error('请上传文件')
return
}
//
uploadHeaders.value = {
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId()
}
unref(uploadRef)?.submit()
}
/** 文件上传成功处理 */
const emit = defineEmits(['success']) // success
const submitFormSuccess = () => {
const handleFileSuccess = () => {
//
dialogVisible.value = false
formLoading.value = false
@ -80,22 +75,4 @@ const submitFormSuccess = () => {
message.success(t('common.createSuccess'))
emit('success')
}
/** 上传错误提示 */
const submitFormError = (): void => {
message.error('上传失败,请您重新上传!')
formLoading.value = false
}
/** 重置表单 */
const resetForm = () => {
//
formLoading.value = false
uploadRef.value?.clearFiles()
}
/** 文件数超出提示 */
const handleExceed = (): void => {
message.error('最多只能上传一个文件!')
}
</script>

View File

@ -1,45 +1,47 @@
<template>
<doc-alert title="上传下载" url="https://doc.iocoder.cn/file/" />
<!-- 搜索 -->
<ContentWrap>
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form ref="queryFormRef" :inline="true" :model="queryParams" class="-mb-15px">
<el-form-item label="文件路径" prop="path">
<el-input
v-model="queryParams.path"
placeholder="请输入文件路径"
clearable
placeholder="请输入文件路径"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="文件类型" prop="type" width="80">
<el-input
v-model="queryParams.type"
placeholder="请输入文件类型"
clearable
placeholder="请输入文件类型"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
end-placeholder="结束日期"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button type="primary" plain @click="openForm">
<Icon icon="ep:upload" class="mr-5px" /> 上传文件
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
</el-button>
<el-button type="primary" @click="openForm">
<Icon class="mr-5px" icon="ep:upload" />
上传文件
</el-button>
</el-form-item>
</el-form>
@ -48,31 +50,31 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column label="文件名" align="center" prop="name" :show-overflow-tooltip="true" />
<el-table-column label="文件路径" align="center" prop="path" :show-overflow-tooltip="true" />
<el-table-column label="URL" align="center" prop="url" :show-overflow-tooltip="true" />
<el-table-column :show-overflow-tooltip="true" align="center" label="文件名" prop="name" />
<el-table-column :show-overflow-tooltip="true" align="center" label="文件路径" prop="path" />
<el-table-column :show-overflow-tooltip="true" align="center" label="URL" prop="url" />
<el-table-column
label="文件大小"
:formatter="fileSizeFormatter"
align="center"
label="文件大小"
prop="size"
width="120"
:formatter="fileSizeFormatter"
/>
<el-table-column label="文件类型" align="center" prop="type" width="180px" />
<el-table-column align="center" label="文件类型" prop="type" width="180px" />
<el-table-column
label="上传时间"
:formatter="dateFormatter"
align="center"
label="上传时间"
prop="createTime"
width="180"
:formatter="dateFormatter"
/>
<el-table-column label="操作" align="center">
<el-table-column align="center" label="操作">
<template #default="scope">
<el-button
v-hasPermi="['infra:config:delete']"
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['infra:config:delete']"
>
删除
</el-button>
@ -81,9 +83,9 @@
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNo"
:total="total"
@pagination="getList"
/>
</ContentWrap>
@ -91,11 +93,11 @@
<!-- 表单弹窗添加/修改 -->
<FileForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts" name="InfraFile">
<script lang="ts" name="Config" setup>
import { fileSizeFormatter } from '@/utils'
import { dateFormatter } from '@/utils/formatTime'
import * as FileApi from '@/api/infra/file'
import FileForm from './FileForm.vue'
const message = useMessage() //
const { t } = useI18n() //

View File

@ -8,63 +8,72 @@
支持发送视频消息时支持新建视频
-->
<template>
<el-tabs type="border-card" v-model="objDataRef.type" @tab-click="handleClick">
<el-tabs v-model="objDataRef.type" type="border-card" @tab-click="handleClick">
<!-- 类型 1文本 -->
<el-tab-pane name="text">
<template #label>
<el-row align="middle"><Icon icon="ep:document" /> 文本</el-row>
<el-row align="middle">
<icon icon="ep:document" />
文本
</el-row>
</template>
<el-input
type="textarea"
v-model="objDataRef.content"
:rows="5"
placeholder="请输入内容"
v-model="objDataRef.content"
type="textarea"
@input="inputContent"
/>
</el-tab-pane>
<!-- 类型 2图片 -->
<el-tab-pane name="image">
<template #label>
<el-row align="middle"><Icon icon="ep:picture" class="mr-5px" /> 图片</el-row>
<el-row align="middle">
<icon class="mr-5px" icon="ep:picture" />
图片
</el-row>
</template>
<!-- 情况一已经选择好素材或者上传好图片 -->
<div class="select-item" v-if="objDataRef.url">
<img class="material-img" :src="objDataRef.url" />
<p class="item-name" v-if="objDataRef.name">{{ objDataRef.name }}</p>
<el-row class="ope-row" justify="center">
<el-button type="danger" circle @click="deleteObj">
<Icon icon="ep:delete" />
<div v-if="objDataRef.url" class="select-item">
<img :src="objDataRef.url" class="material-img" />
<p v-if="objDataRef.name" class="item-name">{{ objDataRef.name }}</p>
<el-row class="ope-row">
<el-button circle type="danger" @click="deleteObj">
<icon icon="ep:delete" />
</el-button>
</el-row>
</div>
<!-- 情况二未做完上述操作 -->
<el-row v-else style="text-align: center" align="middle">
<el-row v-else align="middle" style="text-align: center">
<!-- 选择素材 -->
<el-col :span="12" class="col-select">
<el-button type="success" @click="openMaterial">
素材库选择 <Icon icon="ep:circle-check" />
素材库选择
<icon icon="ep:circle-check" />
</el-button>
<el-dialog title="选择图片" v-model="dialogImageVisible" width="90%" append-to-body>
<WxMaterialSelect :obj-data="objDataRef" @select-material="selectMaterial" />
<el-dialog v-model="dialogImageVisible" append-to-body title="选择图片" width="90%">
<wx-material-select :obj-data="objDataRef" @selectMaterial="selectMaterial" />
</el-dialog>
</el-col>
<!-- 文件上传 -->
<el-col :span="12" class="col-add">
<el-upload
:action="actionUrl"
:headers="headers"
multiple
:limit="1"
:file-list="fileList"
:data="uploadData"
:before-upload="beforeImageUpload"
:data="uploadData"
:file-list="fileList"
:headers="headers"
:limit="1"
:on-success="handleUploadSuccess"
multiple
>
<el-button type="primary">上传图片</el-button>
<template #tip>
<span>
<div class="el-upload__tip">支持 bmp/png/jpeg/jpg/gif 格式大小不超过 2M</div>
</span>
<div class="el-upload__tip"
>支持 bmp/png/jpeg/jpg/gif 格式大小不超过 2M</div
></span
>
</template>
</el-upload>
</el-col>
@ -73,43 +82,47 @@
<!-- 类型 3语音 -->
<el-tab-pane name="voice">
<template #label>
<el-row align="middle"><Icon icon="ep:phone" /> 语音</el-row>
<el-row align="middle">
<icon icon="ep:phone" />
语音
</el-row>
</template>
<div class="select-item2" v-if="objDataRef.url">
<div v-if="objDataRef.url" class="select-item2">
<p class="item-name">{{ objDataRef.name }}</p>
<div class="item-infos">
<WxVoicePlayer :url="objDataRef.url" />
<wx-voice-player :url="objDataRef.url" />
</div>
<el-row class="ope-row" justify="center">
<el-button type="danger" circle @click="deleteObj"><Icon icon="ep:delete" /></el-button>
<el-row class="ope-row">
<el-button circle icon="el-icon-delete" type="danger" @click="deleteObj" />
</el-row>
</div>
<el-row v-else style="text-align: center">
<!-- 选择素材 -->
<el-col :span="12" class="col-select">
<el-button type="success" @click="openMaterial">
素材库选择<Icon icon="ep:circle-check" />
素材库选择<i class="el-icon-circle-check el-icon--right"></i>
</el-button>
<el-dialog title="选择语音" v-model="dialogVoiceVisible" width="90%" append-to-body>
<WxMaterialSelect :objData="objData" @select-material="selectMaterial" />
<el-dialog v-model="dialogVoiceVisible" append-to-body title="选择语音" width="90%">
<WxMaterialSelect :objData="objData" @selectMaterial="selectMaterial" />
</el-dialog>
</el-col>
<!-- 文件上传 -->
<el-col :span="12" class="col-add">
<el-upload
:action="actionUrl"
:headers="headers"
multiple
:limit="1"
:file-list="fileList"
:data="uploadData"
:before-upload="beforeVoiceUpload"
:data="uploadData"
:file-list="fileList"
:headers="headers"
:limit="1"
:on-success="handleUploadSuccess"
multiple
>
<el-button type="primary">点击上传</el-button>
<template #tip>
<div class="el-upload__tip">
格式支持 mp3/wma/wav/amr文件大小不超过 2M播放长度不超过 60s
<div class="el-upload__tip"
>格式支持 mp3/wma/wav/amr文件大小不超过 2M播放长度不超过 60s
</div>
</template>
</el-upload>
@ -119,7 +132,10 @@
<!-- 类型 4视频 -->
<el-tab-pane name="video">
<template #label>
<el-row align="middle"><Icon icon="ep:share" /> 视频</el-row>
<el-row align="middle">
<icon icon="ep:share" />
视频
</el-row>
</template>
<el-row>
<el-input
@ -129,38 +145,42 @@
@input="inputContent"
/>
<el-input
class="input-margin-bottom"
v-model="objDataRef.description"
class="input-margin-bottom"
placeholder="请输入描述"
@input="inputContent"
/>
<div style="text-align: center">
<WxVideoPlayer v-if="objDataRef.url" :url="objDataRef.url" />
<wx-video-player v-if="objDataRef.url" :url="objDataRef.url" />
</div>
<el-col>
<el-row style="text-align: center" align="middle">
<el-row align="middle" style="text-align: center">
<!-- 选择素材 -->
<el-col :span="12">
<el-button type="success" @click="openMaterial">
素材库选择 <Icon icon="ep:circle-check" />
素材库选择
<icon icon="ep:circle-check" />
</el-button>
<el-dialog title="选择视频" v-model="dialogVideoVisible" width="90%" append-to-body>
<WxMaterialSelect :objData="objDataRef" @select-material="selectMaterial" />
<el-dialog v-model="dialogVideoVisible" append-to-body title="选择视频" width="90%">
<wx-material-select :objData="objDataRef" @selectMaterial="selectMaterial" />
</el-dialog>
</el-col>
<!-- 文件上传 -->
<el-col :span="12">
<el-upload
:action="actionUrl"
:headers="headers"
multiple
:limit="1"
:file-list="fileList"
:data="uploadData"
:before-upload="beforeVideoUpload"
:data="uploadData"
:file-list="fileList"
:headers="headers"
:limit="1"
:on-success="handleUploadSuccess"
multiple
>
<el-button type="primary">新建视频 <Icon icon="ep:upload" /></el-button>
<el-button type="primary"
>新建视频
<icon icon="ep:upload" />
</el-button>
</el-upload>
</el-col>
</el-row>
@ -170,33 +190,36 @@
<!-- 类型 5图文 -->
<el-tab-pane name="news">
<template #label>
<el-row align="middle"><Icon icon="ep:reading" /> 图文</el-row>
<el-row align="middle">
<icon icon="ep:reading" />
图文
</el-row>
</template>
<el-row>
<div class="select-item" v-if="objDataRef.articles?.length > 0">
<WxNews :articles="objDataRef.articles" />
<div v-if="objDataRef.articles.size > 0" class="select-item">
<wx-news :articles="objDataRef.articles" />
<el-col class="ope-row">
<el-button type="danger" circle @click="deleteObj">
<Icon icon="ep:delete" />
<el-button circle type="danger" @click="deleteObj">
<icon icon="ep:delete" />
</el-button>
</el-col>
</div>
<!-- 选择素材 -->
<el-col :span="24" v-if="!objDataRef.content">
<el-row style="text-align: center" align="middle">
<el-col v-if="!objDataRef.content" :span="24">
<el-row align="middle" style="text-align: center">
<el-col :span="24">
<el-button type="success" @click="openMaterial">
{{ newsType === '1' ? '选择已发布图文' : '选择草稿箱图文' }}
<el-button type="success" @click="openMaterial"
>{{ newsType === '1' ? '选择已发布图文' : '选择草稿箱图文' }}
<icon icon="ep:circle-check" />
</el-button>
</el-col>
</el-row>
</el-col>
<el-dialog title="选择图文" v-model="dialogNewsVisible" width="90%" append-to-body>
<WxMaterialSelect
:objData="objDataRef"
@select-material="selectMaterial"
<el-dialog v-model="dialogNewsVisible" append-to-body title="选择图文" width="90%">
<wx-material-select
:newsType="newsType"
:objData="objDataRef"
@selectMaterial="selectMaterial"
/>
</el-dialog>
</el-row>
@ -204,17 +227,20 @@
<!-- 类型 6音乐 -->
<el-tab-pane name="music">
<template #label>
<el-row align="middle"><Icon icon="ep:service" />音乐</el-row>
<el-row align="middle">
<icon icon="ep:service" />
音乐
</el-row>
</template>
<el-row align="middle" justify="center">
<el-col :span="6">
<el-row align="middle" justify="center" class="thumb-div">
<el-row align="middle" class="thumb-div" justify="center">
<el-col :span="24">
<el-row align="middle" justify="center">
<img
style="width: 100px"
v-if="objDataRef.thumbMediaUrl"
:src="objDataRef.thumbMediaUrl"
style="width: 100px"
/>
<icon v-else icon="ep:plus" />
</el-row>
@ -222,29 +248,29 @@
<div class="thumb-but">
<el-upload
:action="actionUrl"
:headers="headers"
multiple
:limit="1"
:file-list="fileList"
:data="uploadData"
:before-upload="beforeThumbImageUpload"
:data="uploadData"
:file-list="fileList"
:headers="headers"
:limit="1"
:on-success="handleUploadSuccess"
multiple
>
<template #trigger>
<el-button type="text">本地上传</el-button>
</template>
<el-button type="text" @click="openMaterial" style="margin-left: 5px">
素材库选择
<el-button style="margin-left: 5px" type="text" @click="openMaterial"
>素材库选择
</el-button>
</el-upload>
</div>
</el-row>
</el-col>
</el-row>
<el-dialog title="选择图片" v-model="dialogThumbVisible" width="80%" append-to-body>
<WxMaterialSelect
<el-dialog v-model="dialogThumbVisible" append-to-body title="选择图片" width="80%">
<wx-material-select
:objData="{ type: 'image', accountId: objDataRef.accountId }"
@select-material="selectMaterial"
@selectMaterial="selectMaterial"
/>
</el-dialog>
</el-col>
@ -269,6 +295,7 @@
</el-tab-pane>
</el-tabs>
</template>
<script lang="ts" name="WxReplySelect">
import WxNews from '@/views/mp/components/wx-news/main.vue'
import WxMaterialSelect from '@/views/mp/components/wx-material-select/main.vue'
@ -455,7 +482,7 @@ export default defineComponent({
// tempObjItem
let tempObjItem = {
type: '',
articles: [],
articles: '',
thumbMediaId: '',
thumbMediaUrl: '',
introduction: '',
@ -533,7 +560,7 @@ export default defineComponent({
}
const deleteObj = () => {
if (objDataRef.type === 'news') {
objDataRef.articles = []
objDataRef.articles = ''
} else if (objDataRef.type === 'image') {
objDataRef.mediaId = null
objDataRef.url = null