Compare commits

..

2 Commits

Author SHA1 Message Date
19fa389986 附件管理bug修复 2025-01-12 11:39:54 +08:00
3d9b804f62 业务管理-推荐管理 2025-01-11 11:28:24 +08:00
11 changed files with 352 additions and 15 deletions

View File

@ -6,6 +6,7 @@ import { pixelUrlHost } from '/@/api/baseUrlHost';
* get请求时paramsdata
*
* api接口集合
* @method getApplyList
* @method getServicesList
* @method getApplyDetail
* @method saveApply
@ -15,6 +16,12 @@ import { pixelUrlHost } from '/@/api/baseUrlHost';
export function applyApi() {
return {
getAllServices: () => {
return request({
url: pixelUrlHost + '/paServices/all',
method: 'get',
});
},
getServicesList: (params: object) => {
return request({
url: pixelUrlHost + '/paServices',

View File

@ -0,0 +1,22 @@
import request from '/@/utils/request';
import { pixelUrlHost } from '/@/api/baseUrlHost';
/**
* request.post(xxx) post params data
* get请求时paramsdata
*
* api接口集合
* @method getRecommendList
*/
export function recommendApi() {
return {
getRecommendList: (params: object) => {
return request({
url: pixelUrlHost + '/paRecommend',
method: 'get',
params,
});
},
};
}

View File

@ -107,6 +107,7 @@ export default {
apply: 'apply',
shares: 'shares',
recommend: 'recommend',
/**
* end

View File

@ -110,6 +110,7 @@ export default {
apply: '应用管理',
shares: '发布管理',
recommend: '推荐管理',
/**
* end

View File

@ -107,6 +107,7 @@ export default {
apply: '應用管理',
shares: '發佈管理',
recommend: '推薦管理',
/**
* end

View File

@ -290,6 +290,22 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
icon: 'ele-Upload',
},
},
// 推荐管理
{
path: '/recommend',
name: 'recommend',
component: () => import('/@/views/service/recommend/index.vue'),
meta: {
title: 'message.router.recommend',
isLink: '',
isHide: false,
isKeepAlive: true,
isAffix: false,
isIframe: false,
roles: ['admin', 'user'],
icon: 'ele-Upload',
},
},
/**
* end

View File

@ -151,7 +151,7 @@ export const useThemeConfig = defineStore('themeConfig', {
// 默认全局组件大小,可选值"<large|'default'|small>",默认 'large'
globalComponentSize: 'large',
// 网站logo
logoMini: '/@/assets/logo.png',
logoMini: '@/assets/logo.png',
},
}),
actions: {

View File

@ -5,17 +5,17 @@
<el-row :gutter="35">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="模块名称:">
{{ state.data.moduleName }}
{{ state.data.moduleName || '暂无' }}
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="标签名称:">
{{ state.data.labelName }}
{{ state.data.labelName || '暂无' }}
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="附件名称:">
{{ state.data.name }}
{{ state.data.name || '暂无' }}
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
@ -30,8 +30,9 @@
</video>
</div>
<div v-else-if="fileType === 'image'">
<img
:src="encodeURI(viteUrl + state.data.path)"
<el-image
:preview-src-list="[jpgFormatter(state)]"
:src="jpgFormatter(state)"
alt="附件图片"
style="width: 100%; height: auto; border-radius: 4px"
/>
@ -105,14 +106,16 @@ const textContent = ref<string>('');
const determineFileType = async () => {
console.log(state.data);
if (!state.data.path) return;
const normalizedPath = state.data.path.replace(/\\/g, '/'); //
const extension = normalizedPath.split('.').pop()?.toLowerCase();
const normalizedPath = encodeURI(state.data.path); //
// const extension = normalizedPath.split('.').pop()?.toLowerCase();
const extension = normalizedPath?.toLowerCase();
console.log(extension);
if (['mp4', 'avi', 'mov'].includes(extension || '')) {
if (/\.(mp4|avi|mov)/.test(extension)) {
fileType.value = 'video';
} else if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(extension || '')) {
} else if (/\.(jpg|jpeg|png|gif|bmp)/.test(extension)) {
fileType.value = 'image';
} else if (['txt', 'log', 'md'].includes(extension || '')) {
} else if (/\.(txt|log|md)/.test(extension)) {
fileType.value = 'text';
try {
const response = await fetch(viteUrl + normalizedPath);
@ -166,6 +169,14 @@ const getAttachmentDetailById = async (id: number) => {
}
};
//
const jpgFormatter = (row: any) => {
let newPath = row?.data ? row.data.path : row.path;
newPath = newPath.includes('://')?newPath : encodeURI(newPath);
return `${newPath}`;
}
//
const getModuleList = async () => {
try {

View File

@ -43,10 +43,10 @@
ref="tableRef"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="name" label="附件名称" show-overflow-tooltip></el-table-column>
<el-table-column prop="moduleName" label="模块" show-overflow-tooltip></el-table-column>
<el-table-column prop="labelName" label="标签" show-overflow-tooltip></el-table-column>
<el-table-column prop="name" label="上传者" show-overflow-tooltip></el-table-column>
<el-table-column prop="name" label="附件名称" :formatter="dateCommonFormatter" show-overflow-tooltip></el-table-column>
<el-table-column prop="moduleName" label="模块" :formatter="dateCommonFormatter" show-overflow-tooltip></el-table-column>
<el-table-column prop="labelName" label="标签" :formatter="dateCommonFormatter" show-overflow-tooltip></el-table-column>
<el-table-column prop="uploadName" label="上传者" :formatter="dateCommonFormatter" show-overflow-tooltip></el-table-column>
<el-table-column prop="createtime" label="创建时间" :formatter="dateFormatter" show-overflow-tooltip></el-table-column>
<el-table-column label="操作">
<template #default="scope">
@ -194,6 +194,11 @@ const toShowDetail = (row: any) => {
router.push({ path: '/attachment/detail', query: { id: row.id, moduleName: row.moduleName, labelName: row.labelName } });
};
//
const dateCommonFormatter = (row: any, column: TableColumnCtx<String>) => {
return row[column.property] || '暂无';
};
//
const dateFormatter = (row: any, column: TableColumnCtx<String>) => {
let date = new Date(row.createtime);

View File

@ -0,0 +1,243 @@
<template>
<div class="system-dept-container layout-padding">
<el-card shadow="hover" class="layout-padding-auto">
<div class="system-dept-search mb15">
<!-- 发布者<el-input size="default" placeholder="请输入发布用户名称" v-model="state.tableData.param.userName"
class="ml10 mr10" style="max-width: 180px" clearable></el-input> -->
作品类型<el-select size="default" v-model="state.tableData.param.serviceId" placeholder="请选择作品类型"
clearable class="ml10 mr10" style="max-width: 180px">
<el-option v-for="(item,index) in state.special.data" :key="index" :label="item.name" :value="item.id"></el-option>
</el-select>
<el-button @click="getTableData" size="default" type="primary" class="ml10">
<el-icon>
<ele-Search />
</el-icon>
查询
</el-button>
<el-button @click="reset" size="default" type="primary" class="ml10">
<el-icon>
<ele-RefreshRight />
</el-icon>
重置
</el-button>
</div>
<el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%">
<el-table-column align="center" type="index" label="序号" width="100"/>
<el-table-column align="center" prop="name" label="作品">
<template #default="scope">
<el-image :src="scope.row.path" lazy
preview-teleported="true" :preview-src-list="[scope.row.path]"/>
</template>
</el-table-column>
<el-table-column prop="serviceName" align="center" label="服务名" show-overflow-tooltip></el-table-column>
<el-table-column prop="createtime" align="center" label="时间" :formatter="dateFormatter" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="200" align="center">
<template #default="scope">
<!-- <el-button size="small" text type="primary" @click="toShowDetail(scope.row.id)">查看详情</el-button> -->
<el-button size="small" text type="danger" @click="toPublic(scope.row)">取消推荐</el-button>
<!-- <el-button size="small" v-else text type="primary" @click="audit(scope.row)">重新审核</el-button> -->
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="onHandleSizeChange"
@current-change="onHandleCurrentChange"
class="mt15"
:pager-count="5"
:page-sizes="[10, 20, 30]"
v-model:current-page="state.tableData.param.current"
background
v-model:page-size="state.tableData.param.size"
layout="total, sizes, prev, pager, next, jumper"
:total="state.tableData.total"
>
</el-pagination>
</el-card>
<!-- 回复弹窗 -->
<el-dialog style="height: 200px;" :title="state.auditDialog.title" v-model="state.auditDialog.show" width="400px">
<div class="dialog-content">
<el-form ref="replayFormRef" v-loading="state.auditDialog.loading" label-width="80px" :model="state.auditDialog.form">
<el-radio-group class="dialog-radio" v-model="state.auditDialog.form.status">
<el-radio :value="2">通过</el-radio>
<el-radio :value="3">不通过</el-radio>
</el-radio-group>
<div class="dialog-footer">
<el-button @click="state.auditDialog.show = false">取消</el-button>
<el-button type="primary">确定</el-button>
</div>
</el-form>
</div>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="shares">
import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
import { recommendApi } from '/@/api/service/recommend';
import { applyApi } from '/@/api/service/apply';
import { ElMessage, ElMessageBox, TableColumnCtx } from 'element-plus';
//
const state = reactive<any>({
tableData: {
data: [],
total: 0,
loading: false,
param: {
current: 1,
size: 10,
serviceId: ''
},
},
special: {
data: [],
},
auditDialog: {
loading: false,
form: {
id: '',
status: 2
},
show: false,
title: '作品审核',
message: '',
}
});
// api
const redApi = recommendApi();
const aplApi = applyApi();
//
const getSpecialList = async() => {
try {
state.tableData.loading = true;
let res = await aplApi.getAllServices();
if(res?.success){
state.special.data = res.data;
}else{
ElMessage.error('专题列表获取失败!');
}
} catch (error) {
} finally {
state.tableData.loading = false;
}
};
//
const getTableData = async() => {
try {
state.tableData.loading = true;
let res = await redApi.getRecommendList(state.tableData.param);
if(res?.success){
state.tableData.data = res.data.records;
state.tableData.total = res.data.total;
}else{
ElMessage.error('推荐作品列表获取失败!');
}
} catch (error) {
} finally {
state.tableData.loading = false;
}
};
//
const reset = () =>{
state.tableData.param = {
current: 1,
size: 10,
serviceId: ''
}
getTableData();
}
const replayFormRef = ref();
//
const toPublic = (row: any) => {
ElMessageBox.confirm('确定要取消该作品推荐吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async() => {
try {
state.tableData.loading = true;
// let res = await shareApi.saveRelease({ creationId: row.creationId });
// if(res?.success){
// await getTableData();
// ElMessage.success('');
ElMessage.warning('功能暂未开放!');
// } else ElMessage.error('');
} catch(e) {
ElMessage.error('处理失败!');
} finally {
state.tableData.loading = false;
}
})
}
//
const dateFormatter = (row: any, column: TableColumnCtx<String>) => {
if(row.createtime === null) return '暂无';
let mount = row.createtime[1];
let day = row.createtime[2];
let hour = row.createtime[3];
let minute = row.createtime[4];
let second = row.createtime[5];
return `${row.createtime[0]}-${mount < 10 ? '0' : ''}${mount}-${day < 10 ? '0' : ''}${day} ${hour < 10 ? '0' : ''}${hour}:${minute < 10 ? '0' : ''}${minute}:${second < 10 ? '0' : ''}${second}`;
}
//
const onHandleSizeChange = (val: number) => {
state.tableData.param.size = val;
getTableData();
};
//
const onHandleCurrentChange = (val: number) => {
state.tableData.param.current = val;
getTableData();
};
onMounted(() => {
getSpecialList();
getTableData();
})
</script>
<style scoped lang="scss">
.system-dept-container {
:deep(.el-card__body) {
display: flex;
flex-direction: column;
flex: 1;
overflow: auto;
.el-table {
flex: 1;
}
}
}
.dialog-content{
padding: 0;
display: flex;
flex-direction: column;
}
.dialog-radio{
display: flex;
justify-content: center;
}
.dialog-footer{
margin-top: 20px;
display: flex;
justify-content: center;
}
::v-deep .el-image {
width: 75px; //
height: 75px; //
object-fit: cover; //
// display: block;
}
</style>

View File

@ -47,6 +47,7 @@
<el-button size="small" v-if="scope.row.reviewStatus === 1" text type="primary" @click="audit(scope.row)">审核</el-button>
<el-button size="small" v-else-if="scope.row.reviewStatus === null||scope.row.reviewStatus === 0" text type="primary" @click="toPublic(scope.row)">发布</el-button>
<el-button size="small" v-else text type="primary" @click="audit(scope.row)">重新审核</el-button>
<!-- <el-button size="small" v-if="scope.row.reviewStatus === 2" text type="primary" @click="toPublicHome(scope.row)">首页推荐</el-button> -->
</template>
</el-table-column>
</el-table>
@ -184,6 +185,35 @@ const toPublic = (row: any) => {
})
}
//
const toPublicHome = (row: any) => {
ElMessageBox.confirm('确定要推荐该作品吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async() => {
try {
state.tableData.loading = true;
const form = {
labelName: '首页推荐',
moduleName: '首页推荐',
path: row.path
}
console.log(form);
// let res = await shareApi.saveRelease({ creationId: row.creationId });
// if(res?.success){
// ElMessage.success('');
// } else ElMessage.error('');
} catch(e) {
ElMessage.error('处理失败!');
} finally {
state.tableData.loading = false;
}
})
}
//
const audit = (row: any) => {
state.auditDialog.form.id = row.id;