提交 d11b1f60 作者: 毛细亚

Merge branch '6.7' into 6.8

<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9"/><title>企微侧边栏</title><script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script><script defer="defer" src="static/js/runtime.2425ceee.js"></script><script defer="defer" src="static/js/chunk-elementUI.d0bcf3c3.js"></script><script defer="defer" src="static/js/chunk-libs.c6681081.js"></script><script defer="defer" src="static/js/app.7a46872f.js"></script><link href="static/css/chunk-elementUI.dd5abb38.css" rel="stylesheet"><link href="static/css/app.083a1f55.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but company_app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html> <!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9"/><title>企微侧边栏</title><script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script><script defer="defer" src="static/js/runtime.2425ceee.js"></script><script defer="defer" src="static/js/chunk-elementUI.d0bcf3c3.js"></script><script defer="defer" src="static/js/chunk-libs.c6681081.js"></script><script defer="defer" src="static/js/app.efa1f6f4.js"></script><link href="static/css/chunk-elementUI.dd5abb38.css" rel="stylesheet"><link href="static/css/app.335f0f65.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but company_app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
\ No newline at end of file \ No newline at end of file
/*
* @Author: maoxiya 937667504@qq.com
* @Date: 2025-05-27 11:32:14
* @LastEditors: maoxiya 937667504@qq.com
* @LastEditTime: 2025-09-01 16:17:04
* @FilePath: /company_app/src/utils/auth.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import store from '@/store/index' import store from '@/store/index'
const TokenKey = 'token' const TokenKey = 'token'
......
...@@ -2,39 +2,32 @@ ...@@ -2,39 +2,32 @@
<div class="detailsErrorHandle columnFlex"> <div class="detailsErrorHandle columnFlex">
<div class="detailsErrorHandleContent" v-scroll="requestOrderList"> <div class="detailsErrorHandleContent" v-scroll="requestOrderList">
<div class="addApply rowFlex spaceBetween"> <div class="addApply rowFlex spaceBetween">
<span></span> <span></span>
<el-button <el-button type="primary" size="small" icon="el-icon-plus"
type="primary" @click="showAddErrorHandle = true, info = null">新增误操作</el-button>
size="small"
icon="el-icon-plus"
@click="showAddErrorHandle = true,info = null"
>新增误操作</el-button>
</div> </div>
<el-form class="filterList" label-position="top" size="small"> <el-form class="filterList" label-position="top" size="small">
<el-form-item label="角色名称" style="margin-bottom:15px;"> <el-form-item label="角色名称" style="margin-bottom:15px;">
<searchSelect :account-change="accountChange" style="width:100%;" placeholder="请输入角色名称" @result="selectResult" /> <searchSelect :account-change="accountChange" style="width:100%;" placeholder="请输入角色名称"
@result="selectResult" />
</el-form-item> </el-form-item>
<el-form-item label="状态" style="margin-bottom:15px;"> <el-form-item label="状态" style="margin-bottom:15px;">
<el-select v-model="pay_type" clearable placeholder="状态" style="width:100%;" @change="payTypeResult"> <el-select v-model="pay_type" clearable placeholder="状态" style="width:100%;" @change="payTypeResult">
<el-option <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value">
v-for="item in statusList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="创建时间" style="margin-bottom:15px;"> <el-form-item label="创建时间" style="margin-bottom:15px;">
<el-date-picker v-model="searchDate" type="daterange" clearable style="width:100%;" value-format="yyyy-MM-dd" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期" @change="dateResult"> </el-date-picker> <el-date-picker v-model="searchDate" type="daterange" clearable style="width:100%;" value-format="yyyy-MM-dd"
range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期" @change="dateResult"> </el-date-picker>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="list"> <div class="list">
<!-- 过滤条件 --> <!-- 过滤条件 -->
<!-- 订单列表 --> <!-- 订单列表 -->
<div class="orderDetailsScroll"> <div class="orderDetailsScroll">
<div v-if="orderList.length>0" class="orderDetailsScrollContent"> <div v-if="orderList.length > 0" class="orderDetailsScrollContent">
<div v-for="(item,index) in orderList" :key="index" class="orderDetails"> <div v-for="(item, index) in orderList" :key="index" class="orderDetails">
<div class="orderDetailsList"> <div class="orderDetailsList">
<el-collapse v-model="collapseValue" @change="handleChange"> <el-collapse v-model="collapseValue" @change="handleChange">
<el-collapse-item :name="item.order_id"> <el-collapse-item :name="item.order_id">
...@@ -61,18 +54,26 @@ ...@@ -61,18 +54,26 @@
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex"> <div class="rowFlex">
<span class="label">状态</span> <span class="label">状态</span>
<p v-if="item.approval_status==1" class="unhandle" style="margin-left:10px;">{{ item.approval_status_text }}</p> <p v-if="item.approval_status == 1" class="unhandle" style="margin-left:10px;">{{
<p v-else-if="item.approval_status==2" style="margin-left:10px;" class="noSend">{{ item.approval_status_text }}</p> item.approval_status_text }}</p>
<p v-else-if="item.approval_status==3" style="margin-left:10px;" class="sended">{{ item.approval_status_text }}</p> <p v-else-if="item.approval_status == 2" style="margin-left:10px;" class="noSend">{{
<p v-else-if="item.approval_status==4" style="margin-left:10px;" class="sendFail">{{ item.approval_status_text }}</p> item.approval_status_text }}</p>
<p v-else-if="item.approval_status==5" style="margin-left:10px;" class="handled">{{ item.approval_status_text }}</p> <p v-else-if="item.approval_status == 3" style="margin-left:10px;" class="sended">{{
item.approval_status_text }}</p>
<p v-else-if="item.approval_status == 4" style="margin-left:10px;" class="sendFail">{{
item.approval_status_text }}
</p>
<p v-else-if="item.approval_status == 5" style="margin-left:10px;" class="handled">{{
item.approval_status_text }}</p>
</div> </div>
</div> </div>
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex"> <div class="rowFlex">
<span class="label">补发道具</span> <span class="label">补发道具</span>
<div v-if="item.reissue_prop.length" style="width:75%;"> <div v-if="item.reissue_prop.length" style="width:75%;">
<p v-for="(items,indexs) in item.reissue_prop" :key="indexs" class="text">{{ items.name }}{{ `(${items.num})` }}</p> <p v-for="(items, indexs) in item.reissue_prop" :key="indexs" class="text">{{ items.name }}{{
`(${items.num})` }}
</p>
</div> </div>
</div> </div>
</div> </div>
...@@ -80,7 +81,9 @@ ...@@ -80,7 +81,9 @@
<div class="rowFlex"> <div class="rowFlex">
<span class="label">返回道具</span> <span class="label">返回道具</span>
<div v-if="item.return_prop.length" style="width:75%;"> <div v-if="item.return_prop.length" style="width:75%;">
<p v-for="(items,indexs) in item.return_prop" :key="indexs" class="text">{{ items.name }}{{ `(${items.num})` }}</p> <p v-for="(items, indexs) in item.return_prop" :key="indexs" class="text">{{ items.name }}{{
`(${items.num})` }}
</p>
</div> </div>
</div> </div>
</div> </div>
...@@ -97,7 +100,8 @@ ...@@ -97,7 +100,8 @@
</div> </div>
<!-- 编辑误操作 --> <!-- 编辑误操作 -->
<addErrorHandle v-if="showAddErrorHandle" :show.sync="showAddErrorHandle" :info="info" title="玩家误操作" width="320px" @updateList="updateList" /> <addErrorHandle v-if="showAddErrorHandle" :show.sync="showAddErrorHandle" :info="info" title="玩家误操作" width="320px"
@updateList="updateList" />
</div> </div>
</template> </template>
...@@ -288,8 +292,8 @@ export default { ...@@ -288,8 +292,8 @@ export default {
this.orderList.map(item => { this.orderList.map(item => {
!item.remarks || item.remarks.length === 0 ? item.remarks = [{ remark: '' }] : '' !item.remarks || item.remarks.length === 0 ? item.remarks = [{ remark: '' }] : ''
}) })
if (res.status_code == 1 && msg) { if (res.status_code == 1 && !msg) {
this.$message.success(res.msg) // this.$message.success(res.msg)
} }
}) })
} }
...@@ -298,298 +302,343 @@ export default { ...@@ -298,298 +302,343 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.detailsErrorHandle { .detailsErrorHandle {
width: 100%;
height: 100%;
background: #fff;
margin-left: 2px;
position: relative;
.detailsTitle {
width: 100%;
padding: 0 10px;
height: 60px;
font-size: 18px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
border-bottom: 1px solid #ebeef5;
border-left: 1px solid #ebeef5;
p {
color: #333333;
}
}
.detailsErrorHandleContent {
width: 100%; width: 100%;
height: 100%; height: 100%;
background: #fff; padding: 20px 10px;
margin-left: 2px; overflow: auto;
position: relative; overflow-x: hidden;
.detailsTitle {
.tabSelect {
width: 100%; width: 100%;
padding: 0 10px;
height: 60px; height: 60px;
font-size: 18px; border-bottom: 1px solid #EBEEF5;
font-family: PingFangSC-Medium, PingFang SC; cursor: pointer;
font-weight: 500;
color: #333333; .tabSelectItem {
border-bottom: 1px solid #ebeef5; font-size: 18px;
border-left: 1px solid #ebeef5; font-family: PingFangSC-Medium, PingFang SC;
p { font-weight: 500;
color: #333333; color: #333333;
padding-top: 10px;
line-height: 47px;
cursor: pointer;
}
.tabSelectItemActive {
color: #409EFF;
border-bottom: 2px solid #409EFF;
}
}
.list {
width: 100%;
height: auto;
}
.contentItem {
position: relative;
.title {
position: absolute;
left: 10px;
top: 14px;
font-size: 14px;
color: #999999;
} }
} }
.detailsErrorHandleContent {
.item {
width: 100%; width: 100%;
height:100%; height: auto;
padding: 20px 10px; font-size: 14px;
overflow: auto; font-weight: 400;
overflow-x: hidden; color: #333333;
.tabSelect{ padding: 6px 0;
transition: all 0.5s;
position: relative;
padding-left: 10px;
cursor: pointer;
div {
width: 100%; width: 100%;
height: 60px; }
border-bottom: 1px solid #EBEEF5;
cursor: pointer; .remark {
.tabSelectItem{ ::v-deep .el-textarea__inner {
font-size: 18px; height: 80px;
}
}
.tableImage {
width: 40px;
height: 40px;
border-radius: 6px;
margin-right: 10px;
}
.label {
color: #999999;
}
.text {
color: #333333;
margin-left: 10px;
word-break: break-all;
max-width: 80%;
}
.icon {
display: none;
position: absolute;
right: 0;
top: 12px;
}
.dianFail {
display: inline-block;
width: 8px;
height: 8px;
background: #F45454;
border-radius: 5px;
}
.dian {
display: inline-block;
width: 8px;
height: 8px;
background: #409EFF;
border-radius: 5px;
}
.dian2 {
display: inline-block;
width: 8px;
height: 8px;
background: #FF9D02;
border-radius: 5px;
}
}
.orderMoney {
width: calc(100% + 40px);
height: 80px;
// margin-left: -20px;
padding: 10px 0;
.orderMoneyItem {
width: 50%;
text-align: center;
margin-top: 5px;
span {
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC; font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500; font-weight: 500;
color: #333333; color: #333333;
padding-top: 10px;
line-height: 47px;
cursor: pointer;
} }
.tabSelectItemActive{
p {
font-size: 22px;
color: #409EFF; color: #409EFF;
border-bottom: 2px solid #409EFF;
} }
} }
.list{ }
width: 100%;
height: auto; .filterList {
margin-bottom: 10px;
.filterListInput {
width: 60%;
margin-left: 15px;
margin-bottom: 10px;
} }
.contentItem{
position: relative; .filterListDate {
.title{ width: 150px;
position: absolute; margin-bottom: 10px;
left: 10px;
top: 14px;
font-size: 14px;
color: #999999;
}
} }
.item {
width: 100%; ::v-deep .search-item .item-label {
height: auto; margin-right: 20px;
font-size: 14px; }
font-weight: 400; }
color: #333333;
padding: 6px 0; .orderDetailsScroll {
transition: all 0.5s; width: 100%;
position: relative;
padding-left: 10px; .orderDetailsScrollContent {
cursor: pointer; margin-bottom: 50px;
div{ }
width: 100%; }
}
.remark{ .orderDetails {
::v-deep .el-textarea__inner{ width: 100%;
height: 80px; height: auto;
} margin-bottom: 10px;
} position: relative;
.tableImage {
width: 40px; .bridgeMain {
height: 40px; position: absolute;
border-radius: 6px; top: 0px;
margin-right: 10px; right: 0px;
} width: 50px;
.label { height: 50px;
color: #999999;
}
.text { .text {
color: #333333; font-size: 8px;
margin-left: 10px; font-family: PingFangSC-Regular, PingFang SC;
word-break: break-all; font-weight: 400;
max-width: 80%; color: #FF9D02;
} transform: rotate(48deg);
.icon { z-index: 100;
display: none;
position: absolute; position: absolute;
right: 0; right: -6px;
top: 12px; top: 10px;
} width: 50px;
.dianFail{
display: inline-block;
width: 8px;
height: 8px;
background: #F45454;
border-radius: 5px;
}
.dian{
display: inline-block;
width: 8px;
height: 8px;
background: #409EFF;
border-radius: 5px;
}
.dian2{
display: inline-block;
width: 8px;
height: 8px;
background: #FF9D02;
border-radius: 5px;
}
}
.orderMoney{
width: calc(100% + 40px);
height: 80px;
// margin-left: -20px;
padding: 10px 0;
.orderMoneyItem{
width: 50%;
text-align: center; text-align: center;
margin-top:5px;
span{
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
}
p{
font-size: 22px;
color: #409EFF;
}
}
}
.filterList{
margin-bottom: 10px;
.filterListInput{
width: 60%;
margin-left: 15px;
margin-bottom:10px;
}
.filterListDate{
width:150px;
margin-bottom:10px;
}
::v-deep .search-item .item-label{
margin-right: 20px;
} }
}
.orderDetailsScroll{ .bridge {
width: 100%; font-size: 50px;
.orderDetailsScrollContent{ position: absolute;
margin-bottom: 50px; top: 0;
right: 0;
} }
} }
.orderDetails{
.orderDetailsTitle {
width: 100%; width: 100%;
height: auto; background: #F9FAFF;
margin-bottom: 10px;
position: relative; .money {
.bridgeMain{ width: 100%;
position: absolute; height: auto;
top: 0px; padding-left: 10px;
right:0px;
width:50px; .btns {
height:50px; padding-right: 40px;
.text{ }
font-size: 8px;
.btn {
background: #fff;
border-radius: 4px;
padding: 2px 5px;
margin-left: 10px;
font-size: 12px;
border: 1px solid rgba(0, 0, 0, 0.15);
color: #333333;
cursor: pointer;
}
.btnnot {
background: #FFDDDD;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #FF9D02; color: #F56C6C;
transform: rotate(48deg); border: none;
z-index: 100;
position: absolute;
right:-6px;
top: 10px;
width: 50px;
text-align: center;
} }
.bridge{
font-size: 50px; .btnsuccess {
position: absolute; background: #E1FFF0;
top: 0; font-family: PingFangSC-Regular, PingFang SC;
right: 0; font-weight: 400;
color: #409EFF;
border: none;
} }
}
.orderDetailsTitle{ .sended {
width: 100%; padding: 0 8px;
background: #F9FAFF; height: 20px;
.money{ line-height: 20px;
width: 100%; background: #E1FFF0;
height: auto; border-radius: 4px;
padding-left: 10px; font-size: 12px;
.btns{ font-family: PingFangSC-Regular, PingFang SC;
padding-right: 40px; font-weight: 400;
} color: #409EFF;
.btn{
background: #fff;
border-radius: 4px;
padding: 2px 5px;
margin-left: 10px;
font-size: 12px;
border: 1px solid rgba(0, 0, 0, 0.15);
color: #333333;
cursor: pointer;
}
.btnnot{
background: #FFDDDD;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #F56C6C;
border: none;
}
.btnsuccess{
background: #E1FFF0;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #409EFF;
border: none;
}
.sended{
padding: 0 8px;
height: 20px;
line-height: 20px;
background: #E1FFF0;
border-radius: 4px;
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #409EFF;
}
.noSend{
padding: 0 8px;
height: 20px;
line-height: 20px;
background: #FFFAE0;
border-radius: 4px;
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #FFA81D;
}
} }
.text{
font-size: 14px; .noSend {
padding: 0 8px;
height: 20px;
line-height: 20px;
background: #FFFAE0;
border-radius: 4px;
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #333333; color: #FFA81D;
max-width: 200px;
overflow: hidden;
white-space: nowrap; /* 防止文字换行 */
text-overflow: ellipsis; /* 超出部分显示省略号 */
} }
} }
.orderDetailsList{
width: 100%; .text {
height: auto; font-size: 14px;
background: #FFFFFF; font-family: PingFangSC-Regular, PingFang SC;
border: 1px solid #EBEEF5; font-weight: 400;
position: relative; color: #333333;
.titleFix{ max-width: 200px;
position: absolute; overflow: hidden;
left:10px; white-space: nowrap;
top: 20px; /* 防止文字换行 */
color: #999999; text-overflow: ellipsis;
} /* 超出部分显示省略号 */
} }
} }
} .orderDetailsList {
::v-deep .el-tabs__item{ width: 100%;
line-height: 26px; height: auto;
font-size: 16px; background: #FFFFFF;
font-weight: 500; border: 1px solid #EBEEF5;
position: relative;
.titleFix {
position: absolute;
left: 10px;
top: 20px;
color: #999999;
}
}
} }
/* 已移除局部 el-collapse 样式,使用全局样式 */ }
.noContent{ ::v-deep .el-tabs__item {
width: 100%; line-height: 26px;
height: 100%; font-size: 16px;
font-size: 300px; font-weight: 500;
} }
/* 已移除局部 el-collapse 样式,使用全局样式 */
.noContent {
width: 100%;
height: 100%;
font-size: 300px;
} }
}
</style> </style>
\ No newline at end of file
<template> <template>
<div class="info-tab-content"> <div class="info-tab-content">
<div <div class="userDetailsPanel columnFlex">
class="userDetailsPanel columnFlex" <div class="content" v-loading="viewLoading">
> <div v-if="chatUserDetails.is_phishing_account == 1" class="warnText">
<div class="content" v-loading="viewLoading"> <p>高风险玩家,请立即通知组长!!!!</p>
<div v-if="chatUserDetails.is_phishing_account==1" class="warnText"> <p>①千万不能推转游!!不要发送违禁词汇!!不要发送礼包和告知任何礼包信息!!</p>
<p>高风险玩家,请立即通知组长!!!!</p> <p>②不能以任何形式推送APP/网页链接,也不可承认有APP/网页端口!!</p>
<p>①千万不能推转游!!不要发送违禁词汇!!不要发送礼包和告知任何礼包信息!!</p>
<p>②不能以任何形式推送APP/网页链接,也不可承认有APP/网页端口!!</p>
</div>
<div
v-if="change_appraisal"
class="warnText"
>
<p> 钓鱼号 禁止转端通知组长!</p>
</div>
<div
v-else-if="gameUserInfo.exp_ip"
class="warnText"
>
<p>高风险用户,禁止转端 !!!</p>
</div>
<div class="cser_info">
<div class="cser_name">
<span>当前客服:{{ `${cser_name}(${clientStatusText})` }}</span>
</div> </div>
<!-- 添加客服状态显示及按钮 --> <div v-if="change_appraisal" class="warnText">
<div class="cser_status"> <p> 钓鱼号 禁止转端通知组长!</p>
<div class="status-actions">
<el-button type="danger" v-if="clientStatus !== 'offline'" style="margin-left: 0px;" size="mini" @click="logout">下线</el-button>
<!-- 休息中状态显示结束休息按钮 -->
<el-button v-if="clientStatus === 'rest'" type="primary" size="mini" @click="handleFinishRest">结束休息</el-button>
<!-- 在线状态显示开始休息按钮 -->
<el-tooltip v-if="clientStatus === 'online'" content="午休或者临时有事可点击休息" placement="top">
<el-button type="warning" size="mini" @click="handleStartRest" >开始休息</el-button>
</el-tooltip>
<!-- 发送评价按钮 -->
<el-button type="primary" style="margin-left: 0px;" size="mini" @click="handleSendComment">发送评价</el-button>
</div>
</div> </div>
</div> <div v-else-if="gameUserInfo.exp_ip" class="warnText">
<!-- 会话内容存档状态 --> <p>高风险用户,禁止转端 !!!</p>
<div class="archive-status" v-if="agreeStatus!=='Agree' || !hasPermit"> </div>
<p v-if="agreeStatus!=='Agree'">当前微信用户未开启会话内容存档</p> <div class="cser_info">
<p v-if="!hasPermit">当前客服号未授权开启会话内容存档</p> <div class="cser_name">
</div> <span>当前客服:{{ `${cser_name}(${clientStatusText})` }}</span>
<div class="item rowFlex">
<!-- 公共的信息 -->
<el-image
fit="fill"
draggable="false"
style="-webkit-user-drag: none"
:src="chatUserDetails.avatar"
class="tableImage"
></el-image>
<div class="columnFlex">
<div
class="rowFlex"
style="margin-bottom: 3px"
>
<p
class="text"
style="font-weight: 600"
>
{{ chatUserDetails.name }}
</p>
<span v-if="chatUserDetails.add_way_text" style="color: #09b159; margin-left: 10px">@{{ chatUserDetails.add_way_text }}</span>
</div> </div>
<!-- 游戏模块特有 --> <!-- 添加客服状态显示及按钮 -->
<div <div class="cser_status">
v-if="accountSelect && accountSelect !== ''" <div class="status-actions">
style="margin-top: 3px" <el-button type="danger" v-if="clientStatus !== 'offline'" style="margin-left: 0px;" size="mini"
> @click="logout">下线</el-button>
<el-button-group> <!-- 休息中状态显示结束休息按钮 -->
<el-button size="mini" @click="zyouUnBindConfirm">解绑</el-button> <el-button v-if="clientStatus === 'rest'" type="primary" size="mini"
<!-- <el-button size="mini" @click="autoResetPassword">修改密码</el-button> @click="handleFinishRest">结束休息</el-button>
<!-- 在线状态显示开始休息按钮 -->
<el-tooltip v-if="clientStatus === 'online'" content="午休或者临时有事可点击休息" placement="top">
<el-button type="warning" size="mini" @click="handleStartRest">开始休息</el-button>
</el-tooltip>
<!-- 发送评价按钮 -->
<el-button type="primary" style="margin-left: 0px;" size="mini"
@click="handleSendComment">发送评价</el-button>
</div>
</div>
</div>
<!-- 会话内容存档状态 -->
<div class="archive-status" v-if="agreeStatus !== 'Agree' || !hasPermit">
<p v-if="agreeStatus !== 'Agree'">当前微信用户未开启会话内容存档</p>
<p v-if="!hasPermit">当前客服号未授权开启会话内容存档</p>
</div>
<div class="item rowFlex">
<!-- 公共的信息 -->
<el-image fit="fill" draggable="false" style="-webkit-user-drag: none" :src="chatUserDetails.avatar"
class="tableImage"></el-image>
<div class="columnFlex">
<div class="rowFlex" style="margin-bottom: 3px">
<p class="text" style="font-weight: 600">
{{ chatUserDetails.name }}
</p>
<span v-if="chatUserDetails.add_way_text" style="color: #09b159; margin-left: 10px">@{{
chatUserDetails.add_way_text }}</span>
</div>
<!-- 游戏模块特有 -->
<div v-if="accountSelect && accountSelect !== ''" style="margin-top: 3px">
<el-button-group>
<el-button size="mini" @click="zyouUnBindConfirm">解绑</el-button>
<!-- <el-button size="mini" @click="autoResetPassword">修改密码</el-button>
<el-button size="mini" @click="changePhoneClick">修改手机号</el-button> --> <el-button size="mini" @click="changePhoneClick">修改手机号</el-button> -->
<el-button v-if="!chatUserDetails.bind_cser" size="mini" @click="relationKfh">关联客服</el-button> <el-button v-if="!chatUserDetails.bind_cser" size="mini" @click="relationKfh">关联客服</el-button>
<el-button size="mini" v-if="false" @click="errorHandle">误操作</el-button> <el-button size="mini" v-if="false" @click="errorHandle">误操作</el-button>
</el-button-group> </el-button-group>
</div>
</div> </div>
</div> </div>
</div> <div class="item rowFlex columnCenter">
<div class="item rowFlex columnCenter"> <div class="rowFlex columnCenter">
<div class="rowFlex columnCenter"> <span class="label" style="min-width: 45px;">备注:</span>
<span class="label" style="min-width: 45px;">备注:</span> <p v-if="!showInputRemark" class="text" style="max-width: 170px;">
<p {{
v-if="!showInputRemark" chatUserDetails.remark && chatUserDetails.remark != ""
class="text" ? chatUserDetails.remark
style="max-width: 170px;" : chatUserDetails.name
> }}
{{ </p>
chatUserDetails.remark && chatUserDetails.remark != "" </div>
? chatUserDetails.remark <el-input v-if="showInputRemark" v-model="showInputRemarkValue" class="showInputRemarkInput" type="textarea"
: chatUserDetails.name @change="handleInputRemark" @blur="showInputRemark = false"></el-input>
}} <i class="el-icon-edit icon" style="font-size: 14px" @click="editRemark"></i>
</p>
</div> </div>
<el-input <div>
v-if="showInputRemark" <!-- 自定义列 -->
v-model="showInputRemarkValue" <!-- <div v-if="false">
class="showInputRemarkInput"
type="textarea"
@change="handleInputRemark"
@blur="showInputRemark = false"
></el-input>
<i class="el-icon-edit icon" style="font-size: 14px"
@click="editRemark"></i>
</div>
<div>
<!-- 自定义列 -->
<!-- <div v-if="false">
<div <div
v-for="(item, index) in chatUserDetails.self_defined_columns" v-for="(item, index) in chatUserDetails.self_defined_columns"
:key="index" :key="index"
...@@ -137,162 +108,129 @@ ...@@ -137,162 +108,129 @@
@click="inputShow(item, index)"></i> @click="inputShow(item, index)"></i>
</div> </div>
</div> --> </div> -->
<!-- 游戏业务的账号信息 --> <!-- 游戏业务的账号信息 -->
<gameDetails <gameDetails v-if="gameUserInfo.username && !viewLoading" :chat-user-details="chatUserDetails"
v-if="gameUserInfo.username && !viewLoading" :game-user-info="gameUserInfo" @changeAppraisal="changeAppraisal" />
:chat-user-details="chatUserDetails"
:game-user-info="gameUserInfo" <!-- 游戏标签 -->
@changeAppraisal="changeAppraisal" <div class="item rowFlex columnCenter spaceBetween tagsLost">
/> <div class="rowFlex">
<span class="label">关联标签:</span>
<!-- 游戏标签 --> <div v-if="
<div
class="item rowFlex columnCenter spaceBetween tagsLost"
>
<div class="rowFlex">
<span class="label">关联标签:</span>
<div
v-if="
chatUserDetails.tag_group && chatUserDetails.tag_group &&
chatUserDetails.tag_group.length > 0 chatUserDetails.tag_group.length > 0
" ">
> <!-- 第一个标签组的所有标签 -->
<!-- 第一个标签组的所有标签 --> <el-tag v-for="(items, indexs) in chatUserDetails.tag_group[0].tag" :key="indexs">{{ items.name
<el-tag }}</el-tag>
v-for="(items, indexs) in chatUserDetails.tag_group[0].tag" <!-- 如果有多个标签组,显示+n -->
:key="indexs" <el-popover v-if="chatUserDetails.tag_group.length > 1" placement="top" trigger="hover"
>{{ items.name }}</el-tag> popper-class="tag-popover">
<!-- 如果有多个标签组,显示+n --> <div class="groups-popover-content" style="max-height: 600px;overflow-y: auto;">
<el-popover <div v-for="(group, groupIndex) in chatUserDetails.tag_group.slice(1)" :key="groupIndex"
v-if="chatUserDetails.tag_group.length > 1" class="group-item">
placement="top" <el-tag v-for="(tagItem, tagIndex) in group.tag" :key="tagIndex" style="margin-right: 10px;">{{
trigger="hover" tagItem.name }}</el-tag>
popper-class="tag-popover" </div>
>
<div class="groups-popover-content" style="max-height: 600px;overflow-y: auto;">
<div
v-for="(group, groupIndex) in chatUserDetails.tag_group.slice(1)"
:key="groupIndex"
class="group-item"
>
<el-tag
v-for="(tagItem, tagIndex) in group.tag"
:key="tagIndex"
style="margin-right: 10px;"
>{{ tagItem.name }}</el-tag>
</div> </div>
</div> <span slot="reference" class="tag-more">+{{ chatUserDetails.tag_group.length - 1 }}</span>
<span </el-popover>
slot="reference" </div>
class="tag-more"
>+{{ chatUserDetails.tag_group.length - 1 }}</span>
</el-popover>
</div> </div>
<i class="el-icon-edit icon" style="font-size: 14px;margin-right: 10px;" @click="editTags"></i>
</div> </div>
<i class="el-icon-edit icon" style="font-size: 14px;margin-right: 10px;" <!-- 共享信息 -->
@click="editTags"></i> <shareInfo :chat-user-details="chatUserDetails" />
</div> </div>
<!-- 共享信息 -->
<shareInfo :chat-user-details="chatUserDetails" />
</div> </div>
</div> </div>
</div> <!-- 修改手机号 -->
<!-- 修改手机号 --> <changePhone :show.sync="changePhone" :phone.sync="gameUserInfo.mobile" title="修改手机号" width="350px" />
<changePhone
:show.sync="changePhone"
:phone.sync="gameUserInfo.mobile"
title="修改手机号"
width="350px"
/>
<!-- 修改标签 --> <!-- 修改标签 -->
<selectTag <selectTag v-if="showTag" :show.sync="showTag" :checkbox="true" :check-list="chatUserDetails.tag_group || []"
v-if="showTag" @submit="selectTags" />
:show.sync="showTag" </div>
:checkbox="true" </template>
:check-list="chatUserDetails.tag_group || []" <script>
@submit="selectTags" import { mapState, mapMutations, mapActions } from 'vuex'
/> import gameDetails from './gameInfo/gameUserInfo.vue'
</div> import shareInfo from './shareInfo.vue'
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex'
import gameDetails from './gameInfo/gameUserInfo.vue'
import shareInfo from './shareInfo.vue'
import changePhone from './changePhone.vue' import changePhone from './changePhone.vue'
import watchMember from '@/mixins/watchMember' import watchMember from '@/mixins/watchMember'
import { autoResetPassword,bindUserSelfAdd } from '@/api/game' import { autoResetPassword, bindUserSelfAdd } from '@/api/game'
import { memberBindCser,editUser,zyouUnBind } from '@/api/works' import { memberBindCser, editUser, zyouUnBind } from '@/api/works'
import selectTag from '@/components/selectTag.vue' import selectTag from '@/components/selectTag.vue'
import { getClientStatus, remarkSessionIntelTag, finishRest, client_session_rest, checkSingleAgree, checkUserPermit, sendComment, logout } from '@/api/user.js' import { getClientStatus, remarkSessionIntelTag, finishRest, client_session_rest, checkSingleAgree, checkUserPermit, sendComment, logout } from '@/api/user.js'
import { sendChatMessage } from '@/utils/index.js' import { sendChatMessage } from '@/utils/index.js'
import { getToken,removeToken } from '@/utils/auth' import { getToken, removeToken } from '@/utils/auth'
export default { import Cookies from 'js-cookie'
name: 'info', export default {
components: { name: 'info',
gameDetails, components: {
gameDetails,
changePhone, changePhone,
shareInfo, shareInfo,
selectTag selectTag
}, },
props: { props: {
// 用户详情 // 用户详情
chatUserDetails: { chatUserDetails: {
type: Object, type: Object,
default: () => ({}) default: () => ({})
}, },
}, },
data() { data() {
return { return {
// 备注相关 // 备注相关
showInputRemark: false, showInputRemark: false,
showInputRemarkValue: '', showInputRemarkValue: '',
change_appraisal:false, change_appraisal: false,
// 自定义列相关 // 自定义列相关
showInput: false, showInput: false,
showInputValue: '', showInputValue: '',
inputIndex: -1, inputIndex: -1,
changePhone:false, changePhone: false,
showTag:false, showTag: false,
// 新增状态数据 // 新增状态数据
agreeStatus: '', // 用户是否同意聊天内容存档:Agreen同意 Disagree不同意 agreeStatus: '', // 用户是否同意聊天内容存档:Agreen同意 Disagree不同意
hasPermit: false, // 客服号是否开启会话内容存档权限 hasPermit: false, // 客服号是否开启会话内容存档权限
} }
}, },
computed: { computed: {
...mapState('game', [ ...mapState('game', [
'accountSelect', 'accountSelect',
'gameUserInfo', 'gameUserInfo',
'bindGameUserList', 'bindGameUserList',
'viewLoading' 'viewLoading'
]), ]),
...mapState('user', ['cser_info', 'cser_id', 'cser_name', 'corp_id', 'external_userid', 'userid', 'client_online_status','token']), ...mapState('user', ['cser_info', 'cser_id', 'cser_name', 'corp_id', 'external_userid', 'userid', 'client_online_status', 'token']),
// 客服状态文本 // 客服状态文本
clientStatusText() { clientStatusText() {
const statusMap = { const statusMap = {
'online': '在线', 'online': '在线',
'offline': '离线', 'offline': '离线',
'rest': '休息中' 'rest': '休息中'
} }
return statusMap[this.client_online_status] || '未知' return statusMap[this.client_online_status] || '未知'
}, },
// 客服休息状态:online上线 offline下线 rest休息中 // 客服休息状态:online上线 offline下线 rest休息中
clientStatus() { clientStatus() {
return this.client_online_status return this.client_online_status
}, },
}, },
mixins: [watchMember], mixins: [watchMember],
mounted() { mounted() {
// 初始化企业微信SDK // 初始化企业微信SDK
this.initializeWecom() this.initializeWecom()
// 获取客服状态和相关信息 // 获取客服状态和相关信息
if(this.cser_id && this.token){ if (this.cser_id && this.token) {
this.getInitialData() this.getInitialData()
} }
}, },
methods: { methods: {
...mapMutations('game', ['set_accountSelect']), ...mapMutations('game', ['set_accountSelect']),
...mapActions('user', ['initWecom']), ...mapActions('user', ['initWecom']),
// 初始化企业微信SDK // 初始化企业微信SDK
async initializeWecom() { async initializeWecom() {
try { try {
...@@ -303,8 +241,8 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -303,8 +241,8 @@ import { getToken,removeToken } from '@/utils/auth'
console.error('❌ 企业微信 SDK 初始化失败:', error) console.error('❌ 企业微信 SDK 初始化失败:', error)
} }
}, },
logout(){ logout() {
if(this.client_online_status === 'rest'){ if (this.client_online_status === 'rest') {
this.$message({ this.$message({
type: 'error', type: 'error',
message: '当前客服号处于休息状态,不能下线' message: '当前客服号处于休息状态,不能下线'
...@@ -318,58 +256,62 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -318,58 +256,62 @@ import { getToken,removeToken } from '@/utils/auth'
}).then(() => { }).then(() => {
this.userLogout() this.userLogout()
}).catch(() => { }).catch(() => {
this.$message({ this.$message({
type: 'info', type: 'info',
message: '已取消' message: '已取消'
})
}) })
})
}, },
async userLogout(){ async userLogout() {
const data = { const data = {
userid: this.userid, userid: this.userid,
} }
const res = await logout(data) const res = await logout(data)
if(res.status_code === 1){ if (res.status_code === 1) {
this.$message({ this.$message({
type: 'success', type: 'success',
message: '下线成功' message: '下线成功'
}) })
removeToken() removeToken()
window.location.href = window.location.origin +'/company_app/index.html?corp_id='+this.corp_id Cookies.remove('external_userid')
}else{ Cookies.remove('userid')
window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + this.corp_id
} else {
this.$message({ this.$message({
type: 'error', type: 'error',
message: '下线失败' message: '下线失败'
}) })
} }
}, },
// 获取初始数据 // 获取初始数据
async getInitialData() { async getInitialData() {
try { try {
// 1. 获取客服休息状态 // 1. 获取客服休息状态
const statusRes = await getClientStatus() const statusRes = await getClientStatus()
if (statusRes.status_code === 1) { if (statusRes.status_code === 1) {
if(statusRes.data.client_online_status === 'offline'){ if (statusRes.data.client_online_status === 'offline') {
removeToken() removeToken()
window.location.href = window.location.origin +'/company_app/index.html?corp_id='+this.corp_id window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + this.corp_id
} }
this.$store.commit('user/set_client_online_status', statusRes.data.client_online_status) this.$store.commit('user/set_client_online_status', statusRes.data.client_online_status)
} }
// 2. 同步智能标签 // 2. 同步智能标签
this.syncIntelligentTags() this.syncIntelligentTags()
// 3. 检查用户是否同意聊天内容存档 // 3. 检查用户是否同意聊天内容存档
this.checkAgreeStatus() this.checkAgreeStatus()
// 4. 检查客服号是否开启会话内容存档 // 4. 检查客服号是否开启会话内容存档
this.checkPermitStatus() this.checkPermitStatus()
} catch (error) { } catch (error) {
console.error('获取初始数据失败:', error) console.error('获取初始数据失败:', error)
} }
}, },
// 同步智能标签 // 同步智能标签
async syncIntelligentTags() { async syncIntelligentTags() {
try { try {
...@@ -383,7 +325,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -383,7 +325,7 @@ import { getToken,removeToken } from '@/utils/auth'
console.error('智能标签同步失败:', error) console.error('智能标签同步失败:', error)
} }
}, },
// 检查用户是否同意聊天内容存档 // 检查用户是否同意聊天内容存档
async checkAgreeStatus() { async checkAgreeStatus() {
try { try {
...@@ -398,7 +340,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -398,7 +340,7 @@ import { getToken,removeToken } from '@/utils/auth'
console.error('检查用户同意状态失败:', error) console.error('检查用户同意状态失败:', error)
} }
}, },
// 检查客服号是否开启会话内容存档 // 检查客服号是否开启会话内容存档
async checkPermitStatus() { async checkPermitStatus() {
try { try {
...@@ -412,7 +354,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -412,7 +354,7 @@ import { getToken,removeToken } from '@/utils/auth'
console.error('检查客服权限失败:', error) console.error('检查客服权限失败:', error)
} }
}, },
// 开始休息 // 开始休息
async handleStartRest() { async handleStartRest() {
try { try {
...@@ -428,7 +370,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -428,7 +370,7 @@ import { getToken,removeToken } from '@/utils/auth'
this.$message.error('开始休息失败') this.$message.error('开始休息失败')
} }
}, },
// 结束休息 // 结束休息
async handleFinishRest() { async handleFinishRest() {
try { try {
...@@ -444,7 +386,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -444,7 +386,7 @@ import { getToken,removeToken } from '@/utils/auth'
this.$message.error('结束休息失败') this.$message.error('结束休息失败')
} }
}, },
// 发送评价 // 发送评价
async handleSendComment() { async handleSendComment() {
try { try {
...@@ -453,7 +395,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -453,7 +395,7 @@ import { getToken,removeToken } from '@/utils/auth'
external_userid: this.external_userid, external_userid: this.external_userid,
userid: this.userid userid: this.userid
}) })
if (res.status_code === 1 && res.data.news) { if (res.status_code === 1 && res.data.news) {
// 使用企业微信JSSDK发送评价 // 使用企业微信JSSDK发送评价
const result = await sendChatMessage(res.data.news, 'link') const result = await sendChatMessage(res.data.news, 'link')
...@@ -470,12 +412,12 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -470,12 +412,12 @@ import { getToken,removeToken } from '@/utils/auth'
this.$message.error('发送评价失败') this.$message.error('发送评价失败')
} }
}, },
memberChange() { memberChange() {
this.requestBindUser() this.requestBindUser()
}, },
// 解绑确认 // 解绑确认
zyouUnBindConfirm() { zyouUnBindConfirm() {
this.$confirm('确定要解绑当前账号么?', '确认提示', { this.$confirm('确定要解绑当前账号么?', '确认提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
...@@ -514,12 +456,12 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -514,12 +456,12 @@ import { getToken,removeToken } from '@/utils/auth'
if (res.status_code == 1) { if (res.status_code == 1) {
this.$message.success(res.msg) this.$message.success(res.msg)
const index = this.bindGameUserList.findIndex(item => item.member_id == this.accountSelect) const index = this.bindGameUserList.findIndex(item => item.member_id == this.accountSelect)
this.bindGameUserList.splice(index,1) this.bindGameUserList.splice(index, 1)
this.set_accountSelect(this.bindGameUserList[0].member_id) this.set_accountSelect(this.bindGameUserList[0].member_id)
} }
}) })
}, },
// 修改密码 之前是客服手动设置密码 现在改成系统自动设置密码 // 修改密码 之前是客服手动设置密码 现在改成系统自动设置密码
autoResetPassword() { autoResetPassword() {
this.$confirm('确认重置密码吗?密码重置后玩家将无法登录,请谨慎操作!', '重置密码', { this.$confirm('确认重置密码吗?密码重置后玩家将无法登录,请谨慎操作!', '重置密码', {
confirmButtonText: '确定', confirmButtonText: '确定',
...@@ -542,12 +484,12 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -542,12 +484,12 @@ import { getToken,removeToken } from '@/utils/auth'
}) })
}) })
}, },
// 修改手机号 // 修改手机号
changePhoneClick() { changePhoneClick() {
this.changePhone = true this.changePhone = true
}, },
// 关联客服 // 关联客服
relationKfh() { relationKfh() {
const username = this.bindGameUserList.find( const username = this.bindGameUserList.find(
(item) => item.value == this.accountSelect (item) => item.value == this.accountSelect
) )
...@@ -564,20 +506,20 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -564,20 +506,20 @@ import { getToken,removeToken } from '@/utils/auth'
} }
}) })
}, },
// 误操作处理 // 误操作处理
errorHandle() { errorHandle() {
this.$emit('error-handle') this.$emit('error-handle')
}, },
// 编辑备注 // 编辑备注
editRemark() { editRemark() {
this.showInputRemark = true this.showInputRemark = true
this.showInputRemarkValue = this.chatUserDetails.remark || this.chatUserDetails.name this.showInputRemarkValue = this.chatUserDetails.remark || this.chatUserDetails.name
this.$nextTick(() => { this.$nextTick(() => {
// document.querySelector('.showInputRemarkInput input').focus() // document.querySelector('.showInputRemarkInput input').focus()
}) })
}, },
// 处理备注输入 // 处理备注输入
handleInputRemark(val) { handleInputRemark(val) {
this.showInputRemark = false this.showInputRemark = false
this.chatUserDetails.remark = this.showInputRemarkValue this.chatUserDetails.remark = this.showInputRemarkValue
const data = { const data = {
...@@ -599,33 +541,33 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -599,33 +541,33 @@ import { getToken,removeToken } from '@/utils/auth'
} }
}) })
}, },
// 显示自定义列输入 // 显示自定义列输入
inputShow(item, index) { inputShow(item, index) {
this.showInput = true this.showInput = true
this.inputIndex = index this.inputIndex = index
this.showInputValue = item.value this.showInputValue = item.value
this.$nextTick(() => { this.$nextTick(() => {
document.querySelectorAll('input')[0].focus() document.querySelectorAll('input')[0].focus()
}) })
}, },
// 处理自定义列输入 // 处理自定义列输入
handleInput(item, index) { handleInput(item, index) {
this.$emit('update-custom-column', { this.$emit('update-custom-column', {
item, item,
index, index,
value: this.showInputValue value: this.showInputValue
}) })
this.showInput = false this.showInput = false
}, },
// 编辑标签 // 编辑标签
editTags() { editTags() {
this.showTag = true this.showTag = true
}, },
// 处理评估变更 // 处理评估变更
changeAppraisal(val) { changeAppraisal(val) {
this.change_appraisal = val this.change_appraisal = val
}, },
// 选择的标签 // 选择的标签
selectTags(data, is_tag_sync) { selectTags(data, is_tag_sync) {
this.chatUserDetails.tag_group = data this.chatUserDetails.tag_group = data
const params = { const params = {
...@@ -638,75 +580,86 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -638,75 +580,86 @@ import { getToken,removeToken } from '@/utils/auth'
} }
this.editUserInfo(params) this.editUserInfo(params)
}, },
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.info-tab-content{ .info-tab-content {
width: 100%; width: 100%;
height: 100%; height: 100%;
background: #fff; background: #fff;
} }
.userDetailsPanel { .userDetailsPanel {
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: #fff; background-color: #fff;
border-radius: 4px; border-radius: 4px;
overflow: hidden; overflow: hidden;
.warnText{
width:100%; .warnText {
height:auto; width: 100%;
height: auto;
font-weight: 600; font-weight: 600;
font-size: 18px; font-size: 18px;
p{
p {
color: #F56C6C; color: #F56C6C;
line-height: 25px; line-height: 25px;
} }
} }
.cser_name{
.cser_name {
font-size: 14px; font-size: 14px;
margin-bottom: 10px; margin-bottom: 10px;
} }
.cser_status { .cser_status {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
margin-bottom: 10px; margin-bottom: 10px;
font-size: 14px; font-size: 14px;
.status-actions { .status-actions {
display: flex; display: flex;
gap: 10px; gap: 10px;
} }
} }
.archive-status { .archive-status {
margin-bottom: 15px; margin-bottom: 15px;
padding: 8px; padding: 8px;
background-color: #f8f8f8; background-color: #f8f8f8;
border-radius: 4px; border-radius: 4px;
font-size: 14px; font-size: 14px;
p { p {
margin: 5px 0; margin: 5px 0;
color: #F56C6C; color: #F56C6C;
font-weight: 600; font-weight: 600;
} }
} }
.detailsTitle { .detailsTitle {
height: 50px; height: 50px;
padding: 0 20px; padding: 0 20px;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
p { p {
font-size: 16px; font-size: 16px;
font-weight: 600; font-weight: 600;
} }
} }
.warnText{
width:100%; .warnText {
height:auto; width: 100%;
height: auto;
font-weight: 600; font-weight: 600;
font-size: 18px; font-size: 18px;
margin-bottom: 10px; margin-bottom: 10px;
p{
p {
color: #F56C6C; color: #F56C6C;
line-height: 25px; line-height: 25px;
} }
...@@ -717,6 +670,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -717,6 +670,7 @@ import { getToken,removeToken } from '@/utils/auth'
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
.item { .item {
margin-bottom: 15px; margin-bottom: 15px;
position: relative; position: relative;
...@@ -740,10 +694,11 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -740,10 +694,11 @@ import { getToken,removeToken } from '@/utils/auth'
} }
.noBind { .noBind {
color: #3491FA ; color: #3491FA;
cursor: pointer; cursor: pointer;
margin-right: 10px; margin-right: 10px;
} }
.icon { .icon {
cursor: pointer; cursor: pointer;
margin-left: 10px; margin-left: 10px;
...@@ -753,8 +708,10 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -753,8 +708,10 @@ import { getToken,removeToken } from '@/utils/auth'
.tags { .tags {
max-width: 200px; max-width: 200px;
.tagsItem { .tagsItem {
margin-bottom: 5px; margin-bottom: 5px;
.tag { .tag {
background-color: #f5f5f5; background-color: #f5f5f5;
color: #666; color: #666;
...@@ -767,6 +724,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -767,6 +724,7 @@ import { getToken,removeToken } from '@/utils/auth'
} }
} }
} }
.item:hover .icon { .item:hover .icon {
display: block; display: block;
} }
...@@ -820,7 +778,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -820,7 +778,7 @@ import { getToken,removeToken } from '@/utils/auth'
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
max-width: 200px; max-width: 200px;
.tag-item { .tag-item {
background-color: #f5f5f5; background-color: #f5f5f5;
color: #666; color: #666;
...@@ -836,19 +794,20 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -836,19 +794,20 @@ import { getToken,removeToken } from '@/utils/auth'
display: flex; display: flex;
flex-direction: column; flex-direction: column;
max-width: 300px; max-width: 300px;
.group-item { .group-item {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
margin-bottom: 8px; margin-bottom: 8px;
padding-bottom: 8px; padding-bottom: 8px;
border-bottom: 1px dashed #eee; border-bottom: 1px dashed #eee;
&:last-child { &:last-child {
margin-bottom: 0; margin-bottom: 0;
padding-bottom: 0; padding-bottom: 0;
border-bottom: none; border-bottom: none;
} }
.tag-item { .tag-item {
background-color: #f5f5f5; background-color: #f5f5f5;
color: #666; color: #666;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论