提交 0bf8a3b6 作者: 施汉文

合并分支 'release' 到 'master'

Release

查看合并请求 !68
---
alwaysApply: true
---
必须简洁明了,一眼能看出完成或修改或优化的内容,不要写详细描述,不要超过50个字符。
......@@ -211,13 +211,13 @@ export default {
// 页面刷新时从 Cookie 恢复 token 到 store
// Cookies.set(
// "token",
// "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOjQwOTAsImRhdGEiOnsiY3Nlcl9pZCI6NDA5MCwiY3Nlcl9uYW1lIjoi5q-b57uG5LqaIn0sImlhdCI6MTc2ODU0Mjk0MiwiZXhwIjoxNzcxMTM0OTQyLCJuYmYiOjE3Njg1NDI5NDIsInN1YiI6InRva2Vu6K6k6K-BIiwianRpIjoiMjU0Zjg3OGQ3NzMyNWUyMzMyNDAwZTEwZWJkMjFkY2YifQ.3hHc6iQP-Xkz9Q5rMIOFENDdh5P-NSaRs4Y4ffbJcMg"
// ""
// );
// Cookies.set("corp_id", "wweaefe716636df3d1");
// Cookies.set("userid", "maoxiya");
// Cookies.set("cser_name", "毛细亚");
// Cookies.set("external_userid", "wm5rUgMgAAG_vfF4AHClsrS1S6MImVsQ");
// Cookies.set("cser_id", 4090);
// Cookies.set("userid", "ShanYi");
// Cookies.set("cser_name", "张妍妍");
// Cookies.set("external_userid", "wm5rUgMgAAj_YnkyHU1lVfYDT7QACqWg");
// Cookies.set("cser_id", 12386);
// Cookies.set("weixin_blongs_id", 2862);
const cookieToken = Cookies.get("token");
if (cookieToken && !this.token) {
......
......@@ -689,7 +689,20 @@ export function reportAdd(data) {
});
});
}
// 获取当前合服生态运营人员
export function currUserList(data) {
return new Promise((resolve, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/server/currUserList',
params: data
}).then((res) => {
resolve(res)
}).catch((error) => {
reject(error)
})
})
}
// 申诉列表
export function appealList(data) {
data.zw_user_id = getZwUserId();
......
import Vue from 'vue'
import AsyncDialog from './index.vue'
let instance = null
let mountNode = null
function createInstance() {
if (instance && !instance._isDestroyed) {
return instance
}
const ComponentConstructor = Vue.extend(AsyncDialog)
mountNode = document.createElement('div')
document.body.appendChild(mountNode)
instance = new ComponentConstructor()
instance.$mount(mountNode)
return instance
}
export function getAsyncDialogInstance() {
return createInstance()
}
export function openAsyncDialog(options = {}) {
return createInstance().open(options)
}
export function closeAsyncDialog(action = 'close') {
if (!instance || instance._isDestroyed) {
return
}
instance.close(action)
}
export function destroyAsyncDialog() {
if (!instance) {
return
}
instance.$destroy()
if (instance.$el && instance.$el.parentNode) {
instance.$el.parentNode.removeChild(instance.$el)
}
if (mountNode && mountNode.parentNode) {
mountNode.parentNode.removeChild(mountNode)
}
instance = null
mountNode = null
}
export default openAsyncDialog
<template>
<el-drawer
:visible="visible"
:title="title"
:size="size"
:append-to-body="true"
@close="$emit('close')"
:show-close="false"
>
<template #title>
<div class="flex items-center">
<svg-icon
@click="$emit('close')"
svgName="icon-fanhui"
class="mr-[8px] w-[20px] text-[20px] cursor-pointer"
></svg-icon>
<span class="text-[13px] text-[#131920] leading-[13px]">{{
title
}}</span>
</div>
</template>
<slot></slot>
<span class="dialog-footer rowFlex">
<slot name="footer">
<el-button class="btn" size="small" @click="$emit('close')">
取 消
</el-button>
<el-button
class="btn"
type="primary"
size="small"
:disabled="okDisabled"
@click="$emit('ok')"
>
确 定
</el-button>
</slot>
</span>
</el-drawer>
</template>
<script>
export default {
name: "Ui-Drawer",
props: ["visible", "size", "title", "okDisabled"],
};
</script>
<style scoped>
::v-deep .el-drawer__header {
padding: 12px 0px;
margin: 0 12px;
}
.dialog-footer {
width: 100%;
position: absolute;
bottom: 0;
padding-top: 20px;
padding-bottom: 20px;
border-top: 0;
justify-content: flex-end;
background: #fff;
z-index: 10;
.btn {
width: 60px;
height: 32px;
border-radius: 6px;
}
}
</style>
......@@ -2,6 +2,7 @@
<!-- 简单版的图文编辑器 可以上传 截图上传图片 能实现简单的图文编辑功能 -->
<div class="textEditor">
<div
v-if="showViewImage"
class="rowFlex columnCenter textEditorTitle"
@click.stop="watchImage"
>
......@@ -46,7 +47,24 @@
import { base64toFile } from '@/utils/index'
export default {
name: 'textEditor',
props: ['remark', 'contenteditable', 'domid'], // remark 原来的图文内容 contenteditable 是否可编辑 domid 编辑器的 DomId resultReamrk 方法吐出最后的编辑好的内容
props: {
remark: {
type: String,
default: ''
},
contenteditable: {
type: Boolean,
default: false
},
domid: {
type: String,
default: ''
},
showViewImage: {
type: Boolean,
default: true
}
}, // remark 原来的图文内容 contenteditable 是否可编辑 domid 编辑器的 DomId resultReamrk 方法吐出最后的编辑好的内容
data() {
return {
srcList: [],
......@@ -59,7 +77,9 @@
mounted() {
this.$nextTick(() => {
this.chatMessage = document.getElementById(`${this.domid}`)
this.remark && this.remark.length > 0 && this.contenteditable ? this.chatMessage.innerHTML = this.remark : ''
if (this.remark && this.remark.length > 0 && this.contenteditable && this.chatMessage) {
this.chatMessage.innerHTML = this.remark
}
})
},
methods: {
......@@ -71,9 +91,17 @@
},
async watchImage() {
if (this.remark.trim().length > 0) {
if (!this.chatMessage) {
this.chatMessage = document.getElementById(`${this.domid}`)
}
if (this.chatMessage) {
this.chatMessage.innerHTML = this.remark
}
this.srcList = []
const imgList = this.chatMessage.querySelectorAll('img')
// 使用临时 div 来解析图片,而不依赖 DOM 元素
const tempDiv = document.createElement('div')
tempDiv.innerHTML = this.remark
const imgList = tempDiv.querySelectorAll('img')
if (imgList && imgList.length > 0) {
for (let index = 0; index < imgList.length; index++) {
this.srcList.push(imgList[index].src)
......
<template>
<div class="violationRecord">
<el-form v-loading="loading" class="violationRecordContent" label-width="90px">
<div class="flex justify-end">
<el-button type="primary" size="small" @click="reportPopupShow = true">举报</el-button>
</div>
<div v-if="violationList.length > 0">
<div v-for="(item, index) in violationList" :key="index" class="contentItem">
<el-form-item label="违规时间:">
......@@ -96,6 +99,7 @@
<el-dialog title="查看大图" :visible.sync="imageLayer" width="320px" center append-to-body @close="imageLayer = false">
<div v-html="imageSrc" class="layerImage"></div>
</el-dialog>
<reportPopup :show.sync="reportPopupShow" />
</div>
</template>
......@@ -105,11 +109,12 @@ import { violationList } from "@/api/game";
import noContent from "@/components/noContent.vue";
import { debounce } from '@/utils'
import watchMember from '@/mixins/watchMember'
import reportPopup from '@/views/popup/reportPopup/index.vue'
export default {
name: 'ViolationRecord',
components: {
noContent,
reportPopup,
},
mixins: [watchMember],
data() {
......@@ -118,6 +123,7 @@ export default {
violationList: [],
loading: false,
imageLayer: false,
reportPopupShow: false,
};
},
computed: {
......@@ -202,7 +208,7 @@ export default {
.violationRecordContent {
width: 100%;
padding: 20px;
// padding: 0 20px;
height: auto;
}
......
<template>
<el-drawer :lock-scroll="true" :title="title" :visible="show" size="300px" :append-to-body="true" @close="close">
<el-drawer :lock-scroll="true" :title="title" :visible="show" size="360px" :append-to-body="true" @close="close">
<div class="errorHandleContent">
<el-form
ref="ruleForm"
......@@ -27,6 +27,65 @@
</el-option>
</el-select>
</el-form-item>
<!-- 退回道具 -->
<el-form-item label="退回道具名称">
<div class="return-prop-container">
<!-- 道具行 -->
<div
v-for="(item, index) in ruleForm.return_prop"
:key="index"
class="prop-item"
>
<!-- 道具名称选择器 -->
<div>
<el-select
v-model="item.code"
filterable
remote
reserve-keyword
:remote-method="remoteMethod"
placeholder="请输入道具名称"
style="width: 120px;"
@change="returnPropChange(item, index)"
>
<el-option
v-for="prop in codeList"
:key="prop.value"
:label="prop.label"
:value="prop.value"
></el-option>
</el-select>
<!-- 数量输入框 -->
<el-input
v-model="item.num"
type="number"
min="1"
step="1"
placeholder="数量"
class="prop-num-input"
style="width: 80px; margin-left: 8px;"
@blur="normalizeReturnPropNum(item)"
/>
</div>
<!-- 删除按钮 -->
<i
class="el-icon-remove-outline icon"
@click="removeReturnProp(item, index)"
></i>
</div>
<!-- 添加按钮 -->
<el-button
size="small"
style="width: 80px;"
icon="el-icon-plus"
@click="addReturnProp"
>
添加
</el-button>
</div>
</el-form-item>
<el-form-item label="玩家反馈时间" prop="feedback_time">
<el-date-picker
v-model="ruleForm.feedback_time"
......@@ -58,8 +117,9 @@
</el-drawer>
</template>
<script type="text/javascript">
import { refundRequest } from '@/api/game'
import { refundRequest,selectSearch } from '@/api/game'
import textEditor from '@/components/textEditor.vue'
import { debounce } from '@/utils'
export default {
name: 'orderRefund',
components: { textEditor },
......@@ -67,9 +127,11 @@
data() {
return {
searchLoading: false,
number: 1,
reasonList: [
{ label: '充值未到账', value: 1 } // 掌微只有一个原因
],
codeList: [],
ruleForm: {
reason: 1,
feedback_time: '',
......@@ -80,7 +142,8 @@
remark: '',
extra_attribution: [],
user_name: '',
user_id: ''
user_id: '',
return_prop: []
},
rules: {
'orders.order_id': [
......@@ -112,7 +175,8 @@
remark: '',
extra_attribution: [],
user_name: '',
user_id: ''
user_id: '',
return_prop: []
}
this.ruleForm.remark = ''
this.ruleForm.orders.order_id = this.info.order_id
......@@ -121,8 +185,9 @@
}
}
},
mounted() {
created() {
// 创建防抖搜索函数
this.debouncedSearch = debounce(this.searchProps, 500)
},
methods: {
resultReamrk(html) {
......@@ -132,12 +197,90 @@
resultUpload(value) {
this.ruleForm.extra_attribution = value
},
// 添加退回道具
addReturnProp() {
if (this.ruleForm.return_prop.length >= 10) {
this.$message.warning('最多添加 10 个道具')
return
}
this.ruleForm.return_prop.push({
code: '',
num: 1
})
},
// 删除退回道具
removeReturnProp(item, index) {
this.ruleForm.return_prop.splice(index, 1)
},
// 道具选择变化
returnPropChange(item, index) {
const selectedProp = this.codeList.find(prop => prop.value === item.code)
// 使用 $set 确保 Vue 能检测到变化
this.$set(this.ruleForm.return_prop, index, {
...item,
name: selectedProp ? selectedProp.label : ''
})
},
// 搜索道具(实际执行的方法)
async searchProps(query) {
if (!this.info.main_game_id) {
this.$message.warning('缺少游戏信息,无法搜索道具')
return
}
const trimmedQuery = query.trim()
if (!trimmedQuery) {
this.codeList = []
return
}
try {
const data = {
type: 'misoperation_code',
value: trimmedQuery,
main_game_id: this.info.main_game_id
}
const res = await selectSearch(data)
if (res.status_code === 1) {
this.codeList = res.data.data || []
}
} catch (error) {
console.error('搜索道具失败:', error)
this.$message.error('搜索道具失败')
}
},
// 远程搜索方法(防抖后的方法)
remoteMethod(query) {
this.debouncedSearch(query)
},
// 数量输入框失焦后规范为整数且不小于 1(type=number 时 v-model 可能为字符串)
normalizeReturnPropNum(item) {
const raw = item.num
const n = parseInt(String(raw).trim(), 10)
if (raw === '' || raw === null || Number.isNaN(n) || n < 1) {
this.$set(item, 'num', 1)
} else {
this.$set(item, 'num', n)
}
},
close() {
this.$emit('update:show', false)
},
async submit() {
this.$refs.ruleForm.validate(async (valid) => {
if (valid) {
// 过滤掉未选择道具的项
const validReturnProp = this.ruleForm.return_prop.filter(
item => item.code && item.num > 0
)
// 验证退回道具数据
const invalidProp = this.ruleForm.return_prop.find(item =>
(item.code && !item.num) || (!item.code && item.num)
)
if (invalidProp) {
this.$message.warning('请完善退回道具信息')
return
}
this.ruleForm.orders.refund_amount = this.info.amount
this.searchLoading = true
const { reason, feedback_time, orders, remark, extra_attribution } = this.ruleForm
......@@ -149,18 +292,22 @@
remark,
extra_attribution,
user_name: username,
user_id: id
user_id: id,
return_prop: validReturnProp
}
try {
const res = await refundRequest(data)
if (res.status_code === 1) {
this.$message.success(res.msg)
}
this.searchLoading = false
this.close()
} catch (error) {
}
}catch (error) {
console.error('提交退款申请失败:', error)
this.$message.error('提交失败,请重试')
} finally {
this.searchLoading = false
}
} else {
return false
}
......@@ -220,5 +367,80 @@
margin-bottom: 20px;
}
}
.return-prop-container {
display: flex;
flex-direction: column;
gap: 8px;
width: 100%;
}
.prop-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 16px;
background: #f7f8fa;
border-radius: 4px;
height: 48px;
.el-select {
::v-deep .el-input__inner {
height: 32px;
line-height: 32px;
font-size: 13px;
font-family: 'PingFang SC', sans-serif;
color: #323335;
background: white;
border: 1px solid #d9d9d9;
border-radius: 4px;
padding: 4px 12px;
&::placeholder {
color: #c9cdd4;
font-size: 13px;
}
}
}
.prop-num-input {
::v-deep .el-input__inner {
height: 32px;
line-height: 32px;
font-size: 13px;
font-family: 'PingFang SC', sans-serif;
color: #323335;
text-align: center;
background: #fff;
border: 1px solid #d9d9d9;
border-radius: 4px;
padding: 4px 12px;
box-sizing: border-box;
appearance: textfield;
-moz-appearance: textfield;
}
}
.icon {
font-size: 18px;
color: #00BF8A;
cursor: pointer;
transition: color 0.2s;
&:hover {
color: #409eff;
}
}
}
.icon {
font-size: 18px;
color: #409eff;
cursor: pointer;
transition: color 0.2s;
&:hover {
color: #66b1ff;
}
}
</style>
\ No newline at end of file
......@@ -463,6 +463,7 @@ import {
getLandingPageConfig,
getMemberTransStatus,
memberRegGameCloneLink,
getMemberLabel,
} from '@/api/game';
import {
getRecentSendLog,
......@@ -483,6 +484,7 @@ import sendSelectChannel from './sendGame/sendSelectChannel.vue';
import gameLogMixin from '@/mixins/gameLogMixin';
import { sendChatMessage } from '@/utils/index';
import QrcodeVue from 'qrcode.vue';
import { openAsyncDialog } from '@/components/AsyncDialog';
export default {
name: 'sendGame',
mixins: [gameLogMixin],
......@@ -532,6 +534,11 @@ export default {
h5CloneGameInfo: {},
qrCodeValue: '', // 二维码内容
qrCodeSize: 200, // 二维码大小
transRiskMemberId: '',
transRiskInfo: {
isHighRisk: false,
isPhishing: false,
},
};
},
mounted() {
......@@ -553,6 +560,11 @@ export default {
accountSelect(newVal, oldVal) {
// 切换 w 账号的时候清空 conversionGameList 数据
this.conversionGameList = [];
this.transRiskMemberId = '';
this.transRiskInfo = {
isHighRisk: false,
isPhishing: false,
};
this.getMemberTransStatus();
if (newVal && newVal !== '' && this.bindGameUserList.length > 0) {
this.disabled = false;
......@@ -883,8 +895,9 @@ export default {
'2441',
'2442',
'2443',
'2595',
];
// 过滤掉 game_name 为"破日开天"的数据 英雄霸业 741:独步天龙 912:神权之战 繁华梦/2274 黑夜传奇/685 深海花园/2326
// 过滤掉 game_name 为"破日开天"的数据 英雄霸业 741:独步天龙 912:神权之战 繁华梦/2274 黑夜传奇/685 深海花园/2326 种花-内部直播专用/2595
const filteredChildren = item.children.filter((child) => {
return (
child.game_name !== '破日开天' &&
......@@ -1049,11 +1062,102 @@ export default {
return false;
}
},
sendLink: throttle(function (item, type) {
isTruthyFlag(value) {
return value === true || value === 1 || value === '1';
},
async getTransRiskInfo() {
const localRiskInfo = {
isHighRisk:
Boolean(this.gameUserInfo && this.gameUserInfo.exp_ip) ||
this.isTruthyFlag(this.gameUserInfo && this.gameUserInfo.change_risk),
isPhishing:
this.isTruthyFlag(
this.chatUserInfo && this.chatUserInfo.is_phishing_account,
) ||
this.isTruthyFlag(
this.chatUserInfo && this.chatUserInfo.change_appraisal,
) ||
this.isTruthyFlag(
this.gameUserInfo && this.gameUserInfo.change_appraisal,
),
};
if (!this.accountSelect) {
return localRiskInfo;
}
if (this.transRiskMemberId === this.accountSelect) {
return {
isHighRisk:
localRiskInfo.isHighRisk || this.transRiskInfo.isHighRisk,
isPhishing:
localRiskInfo.isPhishing || this.transRiskInfo.isPhishing,
};
}
try {
const res = await getMemberLabel({
member_id: this.accountSelect,
label_type: [4, 6],
});
const memberLabelList = res?.data?.data || [];
const riskLabel = memberLabelList.find(
(item) => item.label_type == 4,
);
const phishingLabel = memberLabelList.find(
(item) => item.label_type == 6,
);
this.transRiskMemberId = this.accountSelect;
this.transRiskInfo = {
isHighRisk: this.isTruthyFlag(riskLabel && riskLabel.label_value),
isPhishing: this.isTruthyFlag(
phishingLabel && phishingLabel.label_value,
),
};
} catch (error) {
console.log(error);
this.transRiskMemberId = this.accountSelect;
this.transRiskInfo = {
isHighRisk: false,
isPhishing: false,
};
}
return {
isHighRisk: localRiskInfo.isHighRisk || this.transRiskInfo.isHighRisk,
isPhishing: localRiskInfo.isPhishing || this.transRiskInfo.isPhishing,
};
},
async confirmTransRiskBeforeSend() {
const riskInfo = await this.getTransRiskInfo();
if (!riskInfo.isHighRisk && !riskInfo.isPhishing) {
return true;
}
try {
await openAsyncDialog({
title: '确认发送',
message:
'当前用户为钓鱼号/高风险用户,请与组长确认是否发送转端链接',
countdown: 3,
confirmText: '确 定',
cancelText: '取 消',
});
return true;
} catch (error) {
return false;
}
},
sendLink: throttle(async function (item, type) {
if (!this.transMemberStatus) {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理');
return;
}
if (!(await this.confirmTransRiskBeforeSend())) {
return;
}
console.log(item, '转端发送仅发送链接');
const result = this.handleAccount();
if (!result) {
......@@ -1077,11 +1181,14 @@ export default {
item.type = 1;
this.sendGameLog(item);
}, 500),
sendPassword: throttle(function (item, type) {
sendPassword: throttle(async function (item, type) {
if (!this.transMemberStatus) {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理');
return;
}
if (!(await this.confirmTransRiskBeforeSend())) {
return;
}
console.log(item, '转端仅发送账号密码');
const result = this.handleAccount();
if (!result) {
......@@ -1110,11 +1217,14 @@ export default {
console.log(err);
});
}, 500),
sendMessage: throttle(function (item, type) {
sendMessage: throttle(async function (item, type) {
if (!this.transMemberStatus) {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理');
return;
}
if (!(await this.confirmTransRiskBeforeSend())) {
return;
}
const result = this.handleAccount();
if (!result) {
this.$message.warning('请稍后再试');
......@@ -1170,11 +1280,14 @@ export default {
this.getMediaId(value, 'image');
},
// 转端发送落地页面
sendDownLoadPage: throttleStart(function (items, type, index) {
sendDownLoadPage: throttleStart(async function (items, type, index) {
if (!this.transMemberStatus) {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理');
return;
}
if (!(await this.confirmTransRiskBeforeSend())) {
return;
}
this.$set(
this.conversionGameList[index],
'send_trans_page_id',
......@@ -1184,6 +1297,13 @@ export default {
}, 500),
// 转端发送游戏分身包 h5 安卓游戏 IOS游戏 发送分身包
async sendTransferCloneGame(type, items) {
if (!this.transMemberStatus) {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理');
return;
}
if (!(await this.confirmTransRiskBeforeSend())) {
return;
}
if (!this.h5CloneGameInfo?.data?.h5_download_url) {
this.h5CloneGameInfo =
(await memberRegGameCloneLink({
......@@ -1239,6 +1359,9 @@ export default {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理');
return;
}
if (!(await this.confirmTransRiskBeforeSend())) {
return;
}
const result = this.handleAccount();
if (!result) {
this.$message.warning('请稍后再试');
......
......@@ -65,7 +65,9 @@
<div v-for="(item, index) in orderList" :key="index" class="orderDetails">
<div class="bridgeMain">
<p class="text">{{ item.pay_type_text || item.pay_type }}</p>
<img :src="sanjiaoxing" class="bridge" />
<span class="bridge">
<svg-icon icon-class="sanjiaoxing" />
</span>
</div>
<div class="orderDetailsTitle">
<!-- || item.pay_type=='抖音支付'去掉抖音支付补单操作 -->
......@@ -174,7 +176,6 @@ import searchSelect from './components/order/searchUser.vue'
import orderRefund from './components/order/orderRefund.vue'
import refundLog from './components/order/refundLog.vue'
import { throttle } from '@/utils'
import sanjiaoxing from '@/assets/icon/svg/sanjiaoxing.svg'
import noContent from '@/components/noContent.vue'
export default {
name: 'orderList',
......@@ -188,7 +189,6 @@ export default {
},
data() {
return {
sanjiaoxing,
loading: false,
activeType: 2,
activeTypeStr: '2',
......@@ -687,6 +687,7 @@ export default {
position: absolute;
top: 0;
right: 0;
color: #ffe59a;
}
}
......
......@@ -68,30 +68,69 @@ export default {
height: 100%;
.el-tabs__header {
margin: 0;
padding: 0 15px;
// margin: 0px 15px 10px 15px !important;
padding: 2px !important;
background: #F5F6F7 !important;
border-radius: 4px !important;
box-sizing: border-box !important;
height: auto !important;
overflow: visible !important;
border: none !important;
}
.el-tabs__nav-wrap {
overflow: visible !important;
height: auto !important;
padding: 0 !important;
margin: 0 !important;
&::after {
display: none !important;
}
}
.el-tabs__nav {
width: 100% !important;
display: flex !important;
border: none !important;
height: auto !important;
margin: 0 !important;
padding: 0 !important;
gap: 2px !important;
}
.el-tabs__item {
height: 40px;
line-height: 40px;
font-size: 16px;
color: #333333;
flex: 1 !important;
height: 22px !important;
line-height: 22px !important;
padding: 0 !important;
margin: 0 !important;
font-family: 'PingFang SC', sans-serif !important;
font-size: 13px !important;
font-weight: 400 !important;
color: #6D7176 !important;
text-align: center !important;
border-radius: 2px !important;
border: none !important;
transition: all 0.2s !important;
white-space: nowrap !important;
overflow: visible !important;
text-overflow: unset !important;
&.is-active {
color: #3491fa;
}
background: #FFFFFF !important;
color: #131920 !important;
box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.05) !important;
}
.el-tabs__active-bar {
background-color: #3491fa;
height: 3px;
border-radius: 1.5px;
&:first-child,
&:last-child {
margin: 0 !important;
}
}
.el-tabs__nav-wrap::after {
height: 1px;
background-color: #e4e7ed;
.el-tabs__active-bar {
display: none !important;
}
.el-tab-pane {
......@@ -100,8 +139,8 @@ export default {
}
.el-tabs__content {
height: calc(100% - 40px);
padding: 0 5px 5px;
height: calc(100% - 46px);
padding: 0;
}
}
}
......
......@@ -96,7 +96,7 @@ export default {
::v-deep .el-tabs__header {
margin-bottom: 15px;
padding: 0 10px;
padding: 0;
}
::v-deep .el-tabs__nav-wrap::after {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论