This commit is contained in:
Double-_-Z 2024-12-18 14:30:37 +08:00
parent 76b4122f1c
commit 016a01ba8d
12 changed files with 100 additions and 16 deletions

View File

@ -6,11 +6,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta <meta
name="keywords" name="keywords"
content="vue-next-adminvue-prev-adminvue-admin-wonderful后台管理系统一站式平台模板希望可以帮你完成快速开发。vue2.xvue2.0vue2vue3vue3.xvue3.0CompositionAPItypescriptelement pluselementplusadminwonderfulwonderful-nextvue-next-adminvitevite-admin快速,高效,后台模板,后台系统,管理系统" content="pixel-admin是系统管理pixel.ai展示平台的后台管理系统。vue3vue3.xvue3.0CompositionAPItypescriptelement-pluselementplusadminwonderfulwonderful-nextvite快速高效后台系统管理系统"
/> />
<meta <meta
name="description" name="description"
content="vue-next-admin基于 vue3 + CompositionAPI + typescript + vite + element plus适配手机、平板、pc 的后台开源免费管理系统模板vue-prev-admin基于 vue2 + element ui适配手机、平板、pc 的后台开源免费管理系统模板" content="pixel-admin是基于 vue3 + CompositionAPI + typescript + vite + element-plus适配手机、平板、pc 的ai制图后台管理系统"
/> />
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<title>vue-next-admin</title> <title>vue-next-admin</title>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,2 +1,3 @@
export const baseUrlHost = "/vueAdminApi"; // export const baseUrlHost = "/vueAdminApi";
export const baseUrlHost = "/pixelApi";
export const pixelUrlHost = "/pixelApi"; export const pixelUrlHost = "/pixelApi";

View File

@ -1,4 +1,5 @@
import axios from "axios"; import axios from "axios";
import { ElMessage } from "element-plus";
const downloadPhoto = (imgSrc:any) => { const downloadPhoto = (imgSrc:any) => {
axios({ axios({
@ -15,8 +16,9 @@ const downloadPhoto = (imgSrc:any) => {
a.click(); a.click();
document.body.removeChild(a); document.body.removeChild(a);
window.URL.revokeObjectURL(url); window.URL.revokeObjectURL(url);
ElMessage({message: '图片下载成功!',type: 'success',});
}).catch(error => { }).catch(error => {
console.error('Download error:', error); ElMessage({message: '图片下载失败!',type: 'error',});
}); });
}; };

View File

@ -25,5 +25,12 @@ export function messageApi() {
method: 'get', method: 'get',
}); });
}, },
updateMessage: (data: object) => {
return request({
url: baseUrlHost + '/cpMessage',
method: 'put',
data,
})
},
}; };
} }

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="layout-logo" v-if="setShowLogo" @click="onThemeConfigChange"> <div class="layout-logo" v-if="setShowLogo" @click="onThemeConfigChange">
<img :src="themeConfig.logoMini||logoMini" class="layout-logo-medium-img" /> <img :src="themeConfig.logoMini||logoMini" class="layout-logo-medium-img" />
<!-- <span>{{ themeConfig.globalTitle }}</span> --> <span>{{ themeConfig.globalTitle }}</span>
</div> </div>
<div class="layout-logo-size" v-else @click="onThemeConfigChange"> <div class="layout-logo-size" v-else @click="onThemeConfigChange">
<img :src="themeConfig.logoMini||logoMini" class="layout-logo-size-img" /> <img :src="themeConfig.logoMini||logoMini" class="layout-logo-size-img" />

View File

@ -44,9 +44,10 @@ service.interceptors.response.use(
ElMessageBox.alert('你已被登出,请重新登录', '提示', {}) ElMessageBox.alert('你已被登出,请重新登录', '提示', {})
.then(() => {}) .then(() => {})
.catch(() => {}); .catch(() => {});
}else if(res.code === 502 && res.errorMsg){
return res;
} }
// else if(res.code === 502 && res.errorMsg){
// return res;
// }
return Promise.reject(service.interceptors.response); return Promise.reject(service.interceptors.response);
} else { } else {
return res; return res;

View File

@ -1,13 +1,13 @@
<template> <template>
<div class="login-container flex"> <div class="login-container flex">
<div class="login-left"> <div class="login-left">
<!-- <div class="login-left-logo"> <div class="login-left-logo">
<img :src="logoMini" /> <img :src="logoMini" />
<div class="login-left-logo-text"> <div class="login-left-logo-text">
<span>{{ getThemeConfig.globalTitle }}</span> <span>{{ getThemeConfig.globalTitle }}</span>
<span class="login-left-logo-text-msg">{{ getThemeConfig.globalViceTitleMsg }}</span> <span class="login-left-logo-text-msg">{{ getThemeConfig.globalViceTitleMsg }}</span>
</div> </div>
</div> --> </div>
<div class="login-left-img"> <div class="login-left-img">
<img :src="loginMain" /> <img :src="loginMain" />
</div> </div>

View File

@ -16,6 +16,9 @@
</el-form-item> </el-form-item>
<el-form-item label="留言:"> <el-form-item label="留言:">
{{ state.ruleForm.message }} {{ state.ruleForm.message }}
</el-form-item>
<el-form-item label="回复:" v-if="state.ruleForm.replay">
{{ state.ruleForm.replay }}
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -41,7 +44,8 @@ const state = reactive({
phone: "", phone: "",
type: "", type: "",
message: "", message: "",
createtime: [] createtime: [],
replay: null
}, },
dialog: { dialog: {
isShowDialog: false, isShowDialog: false,

View File

@ -28,7 +28,7 @@
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
<template #default="scope"> <template #default="scope">
<el-button size="small" text type="primary" @click="toShowDetail(scope.row.id)">查看详情</el-button> <el-button size="small" text type="primary" @click="toShowDetail(scope.row.id)">查看详情</el-button>
<el-button size="small" text type="primary">回复</el-button> <el-button size="small" text type="primary" @click="replay(scope.row)">回复</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -47,6 +47,24 @@
</el-pagination> </el-pagination>
</el-card> </el-card>
<MessageDialog ref="messageDialogRef" /> <MessageDialog ref="messageDialogRef" />
<!-- 回复弹窗 -->
<el-dialog style="height: 300px;" :title="state.replayDialog.title" v-model="state.replayDialog.show" width="400px">
<div class="dialog-content">
<el-form ref="replayFormRef" v-loading="state.replayDialog.loading" label-width="80px" :model="state.replayDialog.form" :rules="state.replayDialog.rules">
<el-form-item label="留言:">
{{ state.replayDialog.message }}
</el-form-item>
<el-form-item label="回复:" label-width="80px" style="margin-top: 20px;flex: 1;" prop="replay">
<el-input v-model="state.replayDialog.form.replay" type="textarea" :rows="4" placeholder="请输入回复内容"
show-word-limit maxlength="200" resize="none"/>
</el-form-item>
<div class="dialog-footer">
<el-button @click="state.replayDialog.show = false">取消</el-button>
<el-button type="primary" @click="commitReplay">确定</el-button>
</div>
</el-form>
</div>
</el-dialog>
</div> </div>
</template> </template>
@ -71,6 +89,19 @@ const state = reactive({
size: 10, size: 10,
}, },
}, },
replayDialog: {
loading: false,
form: {
id: '',
replay: '',
},
show: false,
title: '回复',
message: '',
rules: {
replay: { required: true, message: '回复内容不能为空', trigger: 'blur' }
}
}
}); });
// //
@ -111,6 +142,37 @@ const toShowDetail = (id: any) => {
messageDialogRef.value.openDialog(id); messageDialogRef.value.openDialog(id);
} }
const replayFormRef = ref();
//
const replay = (row: any) => {
state.replayDialog.message = row.message;
state.replayDialog.form.id = row.id;
state.replayDialog.show = true;
}
//
const commitReplay = () => {
try {
state.replayDialog.loading = true;
replayFormRef.value.validate(async(valid: boolean) => {
if (valid){
let res = await mesApi.updateMessage(state.replayDialog.form);
if(res?.success){
ElMessage.success('回复成功!');
state.replayDialog.show = false;
}else{ElMessage.error('回复失败!');}
}else{
ElMessage.error('请完善信息!');
}
});
} catch (error) {
ElMessage.error('回复失败!');
}finally{
state.replayDialog.loading = false;
}
}
// //
const dateFormatter = (row: any, column: TableColumnCtx<String>) => { const dateFormatter = (row: any, column: TableColumnCtx<String>) => {
if(row.createtime === null) return '暂无'; if(row.createtime === null) return '暂无';
@ -148,4 +210,14 @@ onMounted(() => {
} }
} }
} }
.dialog-content{
padding: 0;
display: flex;
flex-direction: column;
}
.dialog-footer{
margin-top: 20px;
display: flex;
justify-content: flex-end;
}
</style> </style>

View File

@ -463,11 +463,6 @@ const download = async(row:any) =>{
newPath = newPath.includes('http://localhost:8888/') ? newPath : viteUrl + newPath newPath = newPath.includes('http://localhost:8888/') ? newPath : viteUrl + newPath
try{ try{
await downloadPhoto(newPath); await downloadPhoto(newPath);
ElMessage({
message: '图片下载成功!',
type: 'success',
});
}catch(error){ }catch(error){
console.error(error); console.error(error);
ElMessage.error('图片下载失败!') ElMessage.error('图片下载失败!')

View File

@ -95,6 +95,8 @@ import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
// //
const viteUrl = import.meta.env.VITE_API_URL; const viteUrl = import.meta.env.VITE_API_URL;
console.log('viteUrl:',viteUrl);
// upload/Attachment/20241207/0fb6372ed5cd4fb9be68315301093f57.png // upload/Attachment/20241207/0fb6372ed5cd4fb9be68315301093f57.png
const defaultIcon:string = 'static/pixel/home/default-work.png'; const defaultIcon:string = 'static/pixel/home/default-work.png';