调整
This commit is contained in:
parent
76b4122f1c
commit
016a01ba8d
@ -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-admin,vue-prev-admin,vue-admin-wonderful,后台管理系统一站式平台模板,希望可以帮你完成快速开发。vue2.x,vue2.0,vue2,vue3,vue3.x,vue3.0,CompositionAPI,typescript,element plus,element,plus,admin,wonderful,wonderful-next,vue-next-admin,vite,vite-admin,快速,高效,后台模板,后台系统,管理系统"
|
content="pixel-admin是系统管理pixel.ai展示平台的后台管理系统。vue3,vue3.x,vue3.0,CompositionAPI,typescript,element-plus,element,plus,admin,wonderful,wonderful-next,vite,快速,高效,后台系统,管理系统"
|
||||||
/>
|
/>
|
||||||
<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 |
@ -1,2 +1,3 @@
|
|||||||
export const baseUrlHost = "/vueAdminApi";
|
// export const baseUrlHost = "/vueAdminApi";
|
||||||
|
export const baseUrlHost = "/pixelApi";
|
||||||
export const pixelUrlHost = "/pixelApi";
|
export const pixelUrlHost = "/pixelApi";
|
@ -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',});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -25,5 +25,12 @@ export function messageApi() {
|
|||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
updateMessage: (data: object) => {
|
||||||
|
return request({
|
||||||
|
url: baseUrlHost + '/cpMessage',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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" />
|
||||||
|
@ -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;
|
||||||
|
@ -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>
|
||||||
|
@ -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,
|
||||||
|
@ -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>
|
@ -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('图片下载失败!')
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user