完善问题单

This commit is contained in:
龙运模 2024-11-28 23:14:45 +08:00
parent 03a7c3ceaf
commit 1c6d8e34c9
21 changed files with 578 additions and 128 deletions

View File

@ -2,7 +2,7 @@
NODE_ENV = development NODE_ENV = development
# 标题 # 标题
VUE_APP_TITLE = 姿集团 VUE_APP_TITLE = 姿集团
# 象纬云科 # 象纬云科
# 接口地址 # 接口地址

View File

@ -5,15 +5,15 @@ NODE_ENV = production
VUE_APP_TITLE = 象纬云科 VUE_APP_TITLE = 象纬云科
# 测试环境 # 测试环境
# VUE_APP_API_BASEURL = https://dev.api.linkwing.com/api/v1 VUE_APP_API_BASEURL = https://dev.api.linkwing.com/api/v1
# VUE_APP_API_DEV = https://dev.api.linkwing.com/api/v1 VUE_APP_API_DEV = https://dev.api.linkwing.com/api/v1
# VUE_APP_WS_URL = wss://dev.api.linkwing.com/wss VUE_APP_WS_URL = wss://dev.api.linkwing.com/wss
# VUE_APP_WSS_URL = wss://dev.api.linkwing.com/wss VUE_APP_WSS_URL = wss://dev.api.linkwing.com/wss
# 线上环境 # 线上环境
# 接口地址 # WS地址 # 接口地址 # WS地址
VUE_APP_API_BASEURL = https://prod.api.linkwing.com/api/v1 # VUE_APP_API_BASEURL = https://prod.api.linkwing.com/api/v1
VUE_APP_API_DEV = https://prod.api.linkwing.com/api/v1 # VUE_APP_API_DEV = https://prod.api.linkwing.com/api/v1
VUE_APP_WS_URL = wss://prod.api.linkwing.com/wss # VUE_APP_WS_URL = wss://prod.api.linkwing.com/wss
VUE_APP_WSS_URL = wss://prod.api.linkwing.com/wss # VUE_APP_WSS_URL = wss://prod.api.linkwing.com/wss

View File

@ -103,9 +103,17 @@ export default {
}, },
orderMyList:{ orderMyList:{
url: `${config.API_URL}/customer.work.order.my.list`, url: `${config.API_URL}/customer.work.order.my.list`,
name: "我的工单", name: "我的问题工单",
post: async function(data){
return await http.post(this.url, data);
}
},
workOrderInfo:{
url: `${config.API_URL}/customer.work.order.info`,
name: "问题工单详情",
post: async function(data){ post: async function(data){
return await http.post(this.url, data); return await http.post(this.url, data);
} }
} }
} }

View File

@ -378,7 +378,7 @@ export default {
const wrap = this.$refs.scrollbar; const wrap = this.$refs.scrollbar;
if(wrap){ if(wrap){
const e = wrap.$el.querySelector('.el-scrollbar__wrap') const e = wrap.$el.querySelector('.el-scrollbar__wrap')
if(e && e.scrollTop){ if(e){
e.scrollTop = e.scrollHeight; e.scrollTop = e.scrollHeight;
} }
} }

View File

@ -64,6 +64,7 @@ export default {
this.num = val; this.num = val;
} }
}, },
immediate: true,
deep:true deep:true
} }
}, },

View File

@ -4,8 +4,8 @@ import http from "@/utils/request";
export default { export default {
successCode: 200, //请求完成代码 successCode: 200, //请求完成代码
pageSize: 30, //表格每一页条数 pageSize: 100, //表格每一页条数
pageSizes: [10, 20, 30, 40, 50], //表格可设置的一页条数 pageSizes: [30, 50, 100, 150, 200, 300], //表格可设置的一页条数
paginationLayout: "total, sizes, prev, pager, next, jumper", //表格分页布局,可设置"total, sizes, prev, pager, next, jumper" paginationLayout: "total, sizes, prev, pager, next, jumper", //表格分页布局,可设置"total, sizes, prev, pager, next, jumper"
parseData: function (res) { //数据分析 parseData: function (res) { //数据分析
return { return {

View File

@ -54,7 +54,7 @@
</el-container> </el-container>
</el-drawer> </el-drawer>
</div> </div>
<el-dropdown class="user panel-item" trigger="click" @command="handleUser"> <el-dropdown class="user userDropdown panel-item" trigger="click" @command="handleUser">
<div class="user-avatar"> <div class="user-avatar">
<el-avatar :size="22" shape="circle" :src="this.$store.state.global.login_avatar"><span class="userName">{{ userNameF }}</span></el-avatar> <el-avatar :size="22" shape="circle" :src="this.$store.state.global.login_avatar"><span class="userName">{{ userNameF }}</span></el-avatar>
<label>{{ userName }}</label> <label>{{ userName }}</label>
@ -81,10 +81,10 @@
<div class="text">{{userInfo.company_info && userInfo.company_info.full_name?userInfo.company_info.full_name:''}}</div> <div class="text">{{userInfo.company_info && userInfo.company_info.full_name?userInfo.company_info.full_name:''}}</div>
</div> </div>
</div> </div>
<el-dropdown-menu> <div class="menuRow">
<el-dropdown-item icon="sc-icon-AccountNumber" command="uc">帐号信息</el-dropdown-item> <div class="itemCol" @click="linkUser"><el-icon size="16"><sc-icon-AccountNumber/></el-icon><span class="name"></span></div>
<el-dropdown-item icon="sc-icon-ClearCache" command="clearCache">清除缓存</el-dropdown-item> <div class="itemCol" @click="clearCache"><el-icon size="16"><sc-icon-ClearCache/></el-icon><span class="name"></span></div>
</el-dropdown-menu> </div>
<div class="loginOut"> <div class="loginOut">
<el-button class="btn" style="width: 100%" @click="loginOut">退出登录</el-button> <el-button class="btn" style="width: 100%" @click="loginOut">退出登录</el-button>
</div> </div>
@ -152,30 +152,30 @@
methods: { methods: {
// //
handleUser(command) { handleUser(command) {
if (command == "uc") {
this.$router.push({ path: '/user/center' });
}
if (command == "cmd") { if (command == "cmd") {
this.$router.push({ path: '/cmd' }); this.$router.push({ path: '/cmd' });
} }
if (command == "clearCache") { },
this.$confirm('清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?', '警告', { linkUser(){
type: 'warning', this.$router.push({ path: '/user/center' });
}).then(async () => { },
const loading = this.$loading() clearCache(){
const res = await this.$API.system.user.logout.post(); this.$confirm('清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?', '警告', {
if (res.code == 200) { type: 'warning',
this.$TOOL.data.clear() }).then(async () => {
this.$router.replace({path: '/login'}); const loading = this.$loading()
setTimeout(() => { const res = await this.$API.system.user.logout.post();
loading.close() if (res.code == 200) {
location.reload() this.$TOOL.data.clear()
}, 1000) this.$router.replace({path: '/login'});
} setTimeout(() => {
}).catch(() => { loading.close()
// location.reload()
}) }, 1000)
} }
}).catch(() => {
//
})
}, },
loginOut(){ loginOut(){
this.$confirm('确认是否退出当前用户?', '警告', { this.$confirm('确认是否退出当前用户?', '警告', {
@ -244,7 +244,7 @@
} }
</script> </script>
<style scoped lang="scss"> <style lang="scss">
.badge{ .badge{
display: flex; display: flex;
align-items: center; align-items: center;
@ -366,9 +366,29 @@
} }
} }
} }
.menuRow{
padding: 10px;
.itemCol{
padding: 6px;
border-radius: 3px;
display: flex;
align-items: center;
color: #888;
border: 1px solid #fff;
.name{
margin-left: 10px;
}
}
.itemCol:hover{
background: #e7eff8;
border-color:#b8d1ec;
color: #1367C1; // #626266
cursor: pointer;
}
}
.loginOut{ .loginOut{
border-top: 1px solid #EBEEF5; border-top: 1px solid #EBEEF5;
padding: 16px; padding: 16px 10px;
.btn{ .btn{
font-weight: inherit; font-weight: inherit;
} }
@ -399,4 +419,8 @@
.dark .msg-list li a:hover { .dark .msg-list li a:hover {
background: #383838; background: #383838;
} }
.el-popper.is-light>.el-popper__arrow::before{
background: #F5F7FA;
}
</style> </style>

View File

@ -51,14 +51,6 @@ const routes = [
title: "重置密码" title: "重置密码"
} }
}, },
{
path: "/serve",
component: () => import(/* webpackChunkName: "serveView" */ '@/views/serveView'),
meta: {
title: "信息服务"
},
tokenShow:true
},
{ {
path: "/maintenance", path: "/maintenance",
component: () => import(/* webpackChunkName: "serveView" */ '@/views/maintenance'), component: () => import(/* webpackChunkName: "serveView" */ '@/views/maintenance'),
@ -67,14 +59,6 @@ const routes = [
}, },
tokenShow:true tokenShow:true
}, },
{
path: "/personalCenter",
component: () => import(/* webpackChunkName: "personalCenter" */ '@/views/personalCenter'),
meta: {
title: "个人中心"
},
tokenShow:true
},
] ]
export default routes; export default routes;

View File

@ -121,3 +121,4 @@ a,button,input,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing: bo
} }
/*定宽页面*/ /*定宽页面*/
.sc-page {width: 1230px;margin: 0 auto;} .sc-page {width: 1230px;margin: 0 auto;}

View File

@ -6,15 +6,16 @@
<keep-alive :include="['mainView', 'serveView', 'personalCenter']"> <keep-alive :include="['mainView', 'serveView', 'personalCenter']">
<component :is="componentName" /> <component :is="componentName" />
</keep-alive> </keep-alive>
<footerPage></footerPage>
</el-scrollbar> </el-scrollbar>
</el-main> </el-main>
<!--客服-->
<scCustomer />
</div> </div>
</template> </template>
<script> <script>
import commonPage from "@/views/serveView/components/commonPage"; import commonPage from "@/views/serveView/components/commonPage";
import footerPage from "@/views/serveView/components/footerPage";
import mainView from './mainView'; import mainView from './mainView';
import serveView from '@/views/serveView/index'; import serveView from '@/views/serveView/index';
import personalCenter from '@/views/personalCenter/index'; import personalCenter from '@/views/personalCenter/index';
@ -24,7 +25,6 @@ export default {
name: "index", name: "index",
components:{ components:{
commonPage, commonPage,
footerPage,
mainView, mainView,
serveView, serveView,
personalCenter, personalCenter,
@ -35,7 +35,6 @@ export default {
} }
}, },
created() { created() {
console.log('创建了')
let token = this.$TOOL.cookie.get('TOKEN'); let token = this.$TOOL.cookie.get('TOKEN');
if (token && token != null) { if (token && token != null) {
// ws // ws
@ -47,7 +46,7 @@ export default {
eventBus.$on('headerRouterBack', this.getRouterBack); eventBus.$on('headerRouterBack', this.getRouterBack);
}, },
beforeUnmount() { beforeUnmount() {
console.log('我要离开了')
}, },
unmounted() { unmounted() {
eventBus.$off('headerRouterBack', this.getRouterBack); eventBus.$off('headerRouterBack', this.getRouterBack);

View File

@ -30,15 +30,17 @@
<div class="viewItem" v-for="(item,index) in historyList" :key="index">{{item.name}}</div> <div class="viewItem" v-for="(item,index) in historyList" :key="index">{{item.name}}</div>
</div> </div>
</div> </div>
<footerPage></footerPage>
</div> </div>
<!--客服-->
<scCustomer />
</template> </template>
<script> <script>
import footerPage from "@/views/serveView/components/footerPage";
export default { export default {
name: "mainView", name: "mainView",
components:{
footerPage
},
data(){ data(){
return{ return{
list:[ list:[
@ -139,7 +141,7 @@ export default {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 0 20px; padding: 0 20px;
min-height: 800px; //min-height: 800px;
.rowView{ .rowView{
height: 240px; height: 240px;
padding: 20px 0; padding: 20px 0;
@ -177,6 +179,14 @@ export default {
display: none; display: none;
} }
} }
.colItem:first-child{
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
}
.colItem:last-child{
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
.colItem:hover{ .colItem:hover{
border-top-color: var(--el-color-primary); border-top-color: var(--el-color-primary);
border-bottom-color: var(--el-color-primary); border-bottom-color: var(--el-color-primary);
@ -220,6 +230,7 @@ export default {
max-width: 1200px; max-width: 1200px;
margin: 0 auto; margin: 0 auto;
background: #F8F8F8; background: #F8F8F8;
border-radius: 4px;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
flex-wrap: wrap; flex-wrap: wrap;

View File

@ -1,15 +1,140 @@
<template> <template>
<div> <el-container>
我的反馈 <el-header class="serveTitle">
</div> <div class="serveView">
<span v-for="(item,index) in title" :key="index" @click="linkDetail(item)">
<span class="name">{{item.name}}</span>
<span class="solid" v-if="index+1 < title.length">/</span>
</span>
</div>
</el-header>
<el-main class="serveMain" v-if="routerText===1">
<scTable v-loading="tableLoading" element-loading-text="加载中..." height="100%" ref="table" :data="list.data" :size="size" hideDo>
<el-table-column type="index" label="序号"></el-table-column>
<template v-for="(item,index) in list.column" :key="index">
<el-table-column :label="item.label" :prop="item.prop" :width="item.width" show-overflow-tooltip>
<template #default="scope">
<span v-if="item.prop === 'type'">
<span v-for="(em,ind) in setMap.typeList" :key="ind">
<span v-if="em.value === scope.row[item.prop]">{{em.label}}</span>
</span>
</span>
<span v-else-if="item.prop === 'attachment'">
<span v-for="(em,ind) in scope.row[item.prop]" :key="ind">
<el-image :src="em" preview-teleported :preview-src-list="[em]" style="width: 22px;height: 22px;margin: 0 4px;border-radius: 3px;"></el-image>
</span>
</span>
<span v-else>{{scope.row[item.prop]}}</span>
</template>
</el-table-column>
</template>
<el-table-column label="操作" fixed="right" align="center" width="150">
<template #default="scope">
<el-button type="primary" link @click="table_show(scope.row, 'see')" :size="size">查看</el-button>
<el-button type="danger" link @click="table_del(scope.row, 'delete')" :size="size">删除</el-button>
</template>
</el-table-column>
</scTable>
</el-main>
<el-main class="serveMain" v-if="routerText===2">
<feedbackDetail></feedbackDetail>
</el-main>
</el-container>
</template> </template>
<script> <script>
import feedbackDetail from "@/views/personalCenter/components/feedbackDetail";
export default { export default {
name: "feedback" name: "feedback",
components: {
feedbackDetail
},
data(){
return{
title:[
{name:"我的反馈",value:1},
],
routerText:1,
size:"small",
setMap:{
typeList:[],
},
tableLoading:false,
list:{
column:[
{label:'创建时间',prop:'created_at',width:160,show: true},
{label:'机器序列号',prop:'serial_number',width:200,show: true},
{label:'问题类型',prop:'type',width:180,show: true},
{label:'购买时间',prop:'purchase_time',width:160,show: true},
{label:'附件',prop:'attachment',width:120,show: true},
{label:'提交账号',prop:'creator_name',width:160,show: true},
{label:'备注',prop:'remark',show: true},
],
data:[]
},
routerParams:{}
}
},
mounted() {
this.getTypeList();
this.getMyList();
},
methods:{
async getTypeList() {
const res = await this.$API.customer.serviceTypeList.post();
if(res.code == 200){
this.setMap.typeList = res.data;
}
},
async getMyList() {
this.tableLoading = true;
const res = await this.$API.customer.orderMyList.post();
this.tableLoading = false;
if(res.code == 200){
this.list.data = res.data.rows;
}
},
linkDetail(item){
this.routerText = item.value;
const result = this.title.slice(0,this.title.findIndex(em=> em.value === item.value)+1);
this.title = result;
},
table_show(row){
this.routerParams = row;
this.routerText = 2;
const valueS = this.title.map(em=>em.value);
if(valueS.indexOf(2) ===-1){
this.title.push({name:"反馈详情",value:2})
}
},
table_del(row){
let params = {
ids:[row.id]
}
this.$confirm(`确定删除序列号 ${row.serial_number} 吗?`, '提示', {
type: 'warning'
}).then(async () => {
const res = await this.$API.customer.orderDelete.post(params);
if(res.code == 200){
this.$message.success("删除成功");
await this.getMyList();
}
}).catch(()=>{})
}
}
} }
</script> </script>
<style scoped> <style scoped lang="scss">
.serveView{
.name{
cursor: pointer;
}
.solid{
margin: 0 6px;
color: #888;
}
}
</style> </style>

View File

@ -0,0 +1,114 @@
<template>
<div class="serveMain">
<div class="feedHeader">
<span class="name">问题描述</span>
<span class="date">2024-10-23 11:02:44</span>
</div>
<div class="describe">这是一个问题描述这是一个问题描述这是一个问题描述</div>
<div class="attachment">
<span class="imgView">
<el-image class="img" src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"></el-image>
</span>
<span class="imgView">
<el-image class="img" src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"></el-image>
</span>
</div>
<div class="intelligenceCustomer formInputText">
<div class="title">问题回复</div>
<div class="cardView">
<div class="avatar">
<el-avatar src="https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png"></el-avatar>
</div>
<div class="rightView">
<div class="userHeader">
<span class="name">AA工程师</span>
<span class="time">2024-10-23 11:02:44</span>
</div>
<div class="text">问题回复一次问题回复一次已为您分配工程师问题回复一次</div>
</div>
</div>
</div>
<div class="operateView">
<div class="uploadList">
<uploadListFile></uploadListFile>
</div>
<el-input class="formInputText" type="textarea" :rows="3" placeholder="请描述您的问题"></el-input>
</div>
<div class="saveView">
<el-button :size="size" type="primary">{{saveShow?'提交':'继续提问'}}</el-button>
</div>
</div>
</template>
<script>
import uploadListFile from "@/views/personalCenter/components/uploadListFile";
export default {
name: "feedbackDetail",
components:{
uploadListFile
},
data(){
return{
size:"small",
saveShow:false,
}
},
mounted() {
},
methods:{
}
}
</script>
<style scoped lang="scss">
.serveMain{
.feedHeader{
display: flex;
align-items: center;
.name{color: #333;font-weight: 500;}
.date{margin-left: 10px;font-size: 12px;color: #888}
}
.describe{
margin: 10px 0;
}
.attachment{
.imgView{
.img{width: 80px;height: 80px;border-radius: 4px;margin: 0 4px 4px 0;}
}
}
.intelligenceCustomer{
background: #f5f5f5;
border-radius: 4px;
padding: 10px;
margin: 10px 0;
.title{color: #333;font-weight: 500;margin-bottom: 10px;}
.cardView{
display: flex;
align-items: center;
.rightView{
margin-left: 10px;
.userHeader{
margin-bottom: 5px;font-size: 12px;color: #888;
.time{margin-left: 5px;}
}
}
}
}
.operateView{
margin-top: 15px;
margin-bottom: 10px;
.uploadList{
margin-bottom: 10px;
}
}
.saveView{
margin-top: 15px;
}
}
.formInputText{
width: 800px;
}
</style>

View File

@ -14,6 +14,10 @@
<el-form-item label="购买时间" prop="purchase_time" label-position="top"> <el-form-item label="购买时间" prop="purchase_time" label-position="top">
<el-date-picker v-model="form.purchase_time" :size="size" value-format="YYYY-MM-DD" class="formInput" placeholder="请选择您的购买时间"></el-date-picker> <el-date-picker v-model="form.purchase_time" :size="size" value-format="YYYY-MM-DD" class="formInput" placeholder="请选择您的购买时间"></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="上传附件" prop="attachment" label-position="top">
<ossImgListUpload :list="form.attachment" :length="20" @parentParams="faultParentParams" />
<p class="el-form-item-msg">请将图片拖到此处或点击上传PNGJPEG</p>
</el-form-item>
<el-form-item label="备注" label-position="top"> <el-form-item label="备注" label-position="top">
<el-input v-model="form.remark" class="formInputText" :size="size" type="textarea" :rows="4" resize="none" :autosize="false" placeholder="请详细的描述您的问题"></el-input> <el-input v-model="form.remark" class="formInputText" :size="size" type="textarea" :rows="4" resize="none" :autosize="false" placeholder="请详细的描述您的问题"></el-input>
</el-form-item> </el-form-item>
@ -37,7 +41,7 @@ export default {
type:"", type:"",
serial_number:"", serial_number:"",
purchase_time:"", purchase_time:"",
attachment:"", attachment:[],
remark:"" remark:""
}, },
rules:{ rules:{
@ -63,6 +67,9 @@ export default {
this.typeList = res.data; this.typeList = res.data;
} }
}, },
faultParentParams(item){
this.form.attachment = item;
},
save(){ save(){
this.$refs.form.validate(async (valid) => { this.$refs.form.validate(async (valid) => {
if (valid) { if (valid) {
@ -75,9 +82,10 @@ export default {
type:"", type:"",
serial_number:"", serial_number:"",
purchase_time:"", purchase_time:"",
attachment:"", attachment:[],
remark:"" remark:""
} }
this.$refs.form.resetFields();
} }
}else{ }else{
return false; return false;

View File

@ -0,0 +1,150 @@
<template>
<div class="fileUpload">
<div class="importBody">
<el-upload
class="upload"
:action="oss.host"
:data="upload_data"
:show-file-list="false"
:on-success="handleSuccess"
:before-upload="beforeUpload"
:on-error="handleError"
:drag="false"
multiple
>
<div class="el-upload-size">
<el-button type="primary" :size="size" icon="el-icon-Plus">上传附件</el-button>
</div>
</el-upload>
<div class="fileList">
<div class="fileItem" v-for="(item,index) in imageList" :key="index">
<fileType size="22px" :fileType="item.type" />
{{item.name}}
<span class="btnView" @click="deleteClick(item)"><el-icon size="14"><el-icon-Close/></el-icon></span>
</div>
</div>
</div>
</div>
</template>
<script>
import fileType from "@/views/docsManager/fileType"
export default {
name: "uploadListFile",
components:{
fileType
},
emits: ['closed', "uploadFileSuccess"],
props:{
list:{
type:Array,
},
length:{
type:Number,
}
},
data(){
return{
size:'small',
imageList:[
{name:'测试文件.png',type:'png'},
{name:'测试文件.doc',type:'png'},
{name:'测试文件.doc',type:'png'},
{name:'测试文件.doc',type:'doc'},
{name:'测试文件.doc',type:'doc'},
{name:'测试文件.doc',type:'doc'},
],
oss:{
host:''
},
upload_data:{},
parentParams:{},
}
},
mounted() {
},
methods:{
//
importFile(params){
this.parentParams = params;
},
//
beforeUpload(file){
return new Promise((resolve)=>{
setTimeout(async ()=>{
let params = {
dir:"serve/file/"
}
const res = await this.$API.oss.ossGet.post(params);
this.oss = res.data;
this.upload_data = {
name: new Date().getTime() + file.name,
key: this.oss.dir +file.name,
policy: this.oss.policy,
OSSAccessKeyId: this.oss.accessid,
success_action_status: "200",
callback: this.oss.callback,
signature: this.oss.signature,
"Cache-Control": this.oss.cache_control,
};
resolve()
},100)
})
},
//
handleSuccess(file){
let fileName = file.data.filename.split('/')[1];
let fileType = fileName.split('.')[1];
let imageUrl = {
url:this.oss.host+'/'+file.data.filename,
name:fileName,
type:fileType
};
console.log(imageUrl,799)
this.imageList.push(imageUrl)
this.$emit('uploadFileSuccess',this.imageList);
},
//
handleError(){
this.$message.warning('上传失败请重新上传');
},
deleteClick(item){
console.log(item,233)
}
}
}
</script>
<style scoped lang="scss">
.fileList{
margin-top: 8px;
display: flex;
align-items: center;
flex-wrap: wrap;
width: 800px;
.fileItem{
display: flex;
align-items: center;
margin:0 10px 8px 0;
background: #F6F6F6;
padding: 4px 30px 4px 10px;
border-radius: 4px;
color: #888888;
position: relative;
height: 35px;
.btnView{
position: absolute;
top: 0;
right: 0;
z-index: 10;
padding: 4px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
}
}
</style>

View File

@ -108,6 +108,7 @@ export default {
} }
.pageRight{ .pageRight{
flex: 1; flex: 1;
overflow: hidden;
} }
} }
</style> </style>

View File

@ -33,7 +33,7 @@
<el-icon><sc-icon-User /></el-icon> <el-icon><sc-icon-User /></el-icon>
</div> </div>
<div class="panel-item" v-if="userId"> <div class="panel-item" v-if="userId">
<el-dropdown trigger="click" @command="handleUser" placement="bottom-start"> <el-dropdown trigger="click" placement="bottom-start" ref="userDropdown">
<div class="user-avatar el-dropdown-link"> <div class="user-avatar el-dropdown-link">
<el-avatar :size="22" shape="circle" :src="this.$store.state.global.login_avatar"><span class="userName">{{ userNameF }}</span></el-avatar> <el-avatar :size="22" shape="circle" :src="this.$store.state.global.login_avatar"><span class="userName">{{ userNameF }}</span></el-avatar>
<label class="userName">{{ userName?userName:"匿名" }}</label> <label class="userName">{{ userName?userName:"匿名" }}</label>
@ -56,10 +56,10 @@
<div class="text">{{userInfo.mobile}}</div> <div class="text">{{userInfo.mobile}}</div>
</div> </div>
</div> </div>
<el-dropdown-menu> <div class="menuRow">
<el-dropdown-item icon="sc-icon-AccountNumber" command="uc">帐号信息</el-dropdown-item> <div class="itemCol" @click="linkUser"><el-icon size="16"><sc-icon-AccountNumber/></el-icon><span class="name"></span></div>
<el-dropdown-item icon="sc-icon-ClearCache" command="clearCache">清除缓存</el-dropdown-item> <div class="itemCol" @click="clearCache"><el-icon size="16"><sc-icon-ClearCache/></el-icon><span class="name"></span></div>
</el-dropdown-menu> </div>
<div class="loginOut"> <div class="loginOut">
<el-button class="btn" style="width: 100%" @click="loginOut">退出登录</el-button> <el-button class="btn" style="width: 100%" @click="loginOut">退出登录</el-button>
</div> </div>
@ -110,30 +110,6 @@ export default {
}, },
methods:{ methods:{
//
handleUser(command) {
if (command == "uc") {
eventBus.$emit('headerRouterBack',{name:'personalCenter'});
}
if (command == "clearCache") {
this.$confirm('清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?', '警告', {
type: 'warning',
}).then(async () => {
const loading = this.$loading()
const res = await this.$API.system.user.logout.post();
if (res.code == 200) {
this.$TOOL.data.clear()
this.$router.replace({path: '/login'});
setTimeout(() => {
loading.close()
location.reload()
}, 1000)
}
}).catch(() => {
//
})
}
},
serverQuery(command){ serverQuery(command){
eventBus.$emit('headerRouterBack',{name:'serveView'}); eventBus.$emit('headerRouterBack',{name:'serveView'});
if (command == "termQuery") { if (command == "termQuery") {
@ -146,6 +122,28 @@ export default {
eventBus.$emit('queryBack',{name:'order'}); eventBus.$emit('queryBack',{name:'order'});
} }
}, },
linkUser(){
this.$refs.userDropdown.handleClose();
eventBus.$emit('headerRouterBack',{name:'personalCenter'});
},
clearCache(){
this.$confirm('清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?', '警告', {
type: 'warning',
}).then(async () => {
const loading = this.$loading()
const res = await this.$API.system.user.logout.post();
if (res.code == 200) {
this.$TOOL.data.clear()
this.$router.replace({path: '/login'});
setTimeout(() => {
loading.close()
location.reload()
}, 1000)
}
}).catch(() => {
//
})
},
loginOut(){ loginOut(){
this.$confirm('确认是否退出当前用户?', '警告', { this.$confirm('确认是否退出当前用户?', '警告', {
type: 'warning', type: 'warning',
@ -169,7 +167,7 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss">
.common-header-left{ .common-header-left{
width: 100%; width: 100%;
display: flex; display: flex;
@ -272,11 +270,35 @@ export default {
} }
} }
} }
.menuRow{
padding: 10px;
.itemCol{
padding: 6px;
border-radius: 3px;
display: flex;
align-items: center;
color: #888;
border: 1px solid #fff;
.name{
margin-left: 10px;
}
}
.itemCol:hover{
background: #e7eff8;
border-color:#b8d1ec;
color: #1367C1;
cursor: pointer;
}
}
.loginOut{ .loginOut{
border-top: 1px solid #EBEEF5; border-top: 1px solid #EBEEF5;
padding: 16px; padding: 16px 10px;
.btn{ .btn{
font-weight: inherit; font-weight: inherit;
} }
} }
.el-popper.is-light>.el-popper__arrow::before{
background: #F5F7FA;
}
</style> </style>

View File

@ -1,24 +1,24 @@
<template> <template>
<div class="serveFooter"> <div class="serveFooter">
<div class="footerView"> <!-- <div class="footerView">-->
<div class="footer-left"> <!-- <div class="footer-left">-->
<div class="common-header-logo"> <!-- <div class="common-header-logo">-->
<img class="logo" src="https://dm-auto.oss-cn-shanghai.aliyuncs.com/xw_cloud/image/login_logo.png"> <!-- <img class="logo" src="https://dm-auto.oss-cn-shanghai.aliyuncs.com/xw_cloud/image/login_logo.png">-->
</div> <!-- </div>-->
</div> <!-- </div>-->
<div class="footer-right"> <!-- <div class="footer-right">-->
<div class="viewUl"> <!-- <div class="viewUl">-->
<div class="line"><span>个人中心</span></div> <!-- <div class="line"><span>个人中心</span></div>-->
<div class="line"><span>关于我们</span></div> <!-- <div class="line"><span>关于我们</span></div>-->
</div> <!-- </div>-->
<div class="viewUl"> <!-- <div class="viewUl">-->
<div class="line"><span>服务支持</span></div> <!-- <div class="line"><span>服务支持</span></div>-->
<div class="line"><span>信息查询</span></div> <!-- <div class="line"><span>信息查询</span></div>-->
<div class="line"><span>自助服务</span></div> <!-- <div class="line"><span>自助服务</span></div>-->
<div class="line"><span>问题单</span></div> <!-- <div class="line"><span>问题单</span></div>-->
</div> <!-- </div>-->
</div> <!-- </div>-->
</div> <!-- </div>-->
<div class="copyright"> <div class="copyright">
<div class="viewUl"> <div class="viewUl">
<div class="line"><span>Copyright @2024象纬云科有限公司</span></div> <div class="line"><span>Copyright @2024象纬云科有限公司</span></div>
@ -66,8 +66,9 @@ export default {
} }
} }
.copyright{ .copyright{
border-top: 1px solid #f6f6f6; padding: 15px 0 0 0;
padding: 15px 20px 0 20px; max-width: 1200px;
margin: 0 auto;
.viewUl{ .viewUl{
margin: 0; margin: 0;
display: flex; display: flex;

View File

@ -108,6 +108,7 @@ export default {
} }
.pageRight{ .pageRight{
flex: 1; flex: 1;
overflow: hidden;
} }
} }
</style> </style>

View File

@ -420,7 +420,7 @@ export default {
const wrap = this.$refs.scrollbar; const wrap = this.$refs.scrollbar;
if(wrap){ if(wrap){
const e = wrap.$el.querySelector('.el-scrollbar__wrap'); const e = wrap.$el.querySelector('.el-scrollbar__wrap');
if(e && e.scrollTop){ if(e){
e.scrollTop = e.scrollHeight; e.scrollTop = e.scrollHeight;
} }
} }

View File

@ -85,7 +85,7 @@ export default {
permission: false permission: false
}, },
list:{ list:{
apiObj: this.$API.system.log.list, apiObj: {},
column:[] column:[]
}, },
selection: [], selection: [],