This commit is contained in:
ping 2025-09-23 14:25:39 +08:00
commit 53094c0a44
15 changed files with 922 additions and 653 deletions

View File

@ -1,23 +1,15 @@
<template>
<div class="navbar"
style="height: 48px;background-color: white;color: white!important;">
<div class="navbar" style="height: 48px;background-color: white;color: white!important;">
<div class="logo" v-if="isShowKbossCharge">
<img @click="$router.push('/product/productHome')" src="./img/img.png" alt=""
class="img">
<img @click="$router.push('/product/productHome')" src="./img/img.png" alt="" class="img">
<span style="color: #423f3f;font-size: 20px;margin-left: 15px">平台充值中心</span>
</div>
<!-- v-show="!role.includes('客户')" -->
<!-- v-if="!isShowKbossCharge&&!role.includes('客户')||isMobileScreen"-->
<hamburger
v-if="false"
style="display: flex;justify-content: center;align-items: center;color: white!important;"
id="hamburger-container" :is-active="sidebar.opened"
class="hamburger-container"
@toggleClick="toggleSideBar"/>
<hamburger v-if="false" style="display: flex;justify-content: center;align-items: center;color: white!important;"
id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb style="color:white!important;display: flex;justify-content: center;align-items: center;height: 100%;"
id="breadcrumb-container"
class="breadcrumb-container"/>
id="breadcrumb-container" class="breadcrumb-container" />
<div class="right-menu"
style="display:flex;justify-content: center!important;align-items: center!important;margin-right: 10px;">
<template style="justify-content: center;align-items: center;transform: translate(0,-30px)!important;">
@ -32,8 +24,7 @@
<el-tooltip v-if="role.includes('客户')" class="item" effect="dark" content="查询产品" placement="bottom">
<span class="right-menu-item hover-effect"
style="font-size: 26px;display: flex;justify-content: center;align-items: center">
<i style="color: #262626;font-weight: bold;font-size: 16px" class="el-icon-search"
@click="showSearch"/>
<i style="color: #262626;font-weight: bold;font-size: 16px" class="el-icon-search" @click="showSearch" />
</span>
</el-tooltip>
<!-- <el-tooltip class="item " effect="dark" content="购物车" placement="bottom" v-if="org_type==2||org_type==3">-->
@ -58,8 +49,7 @@
<el-tooltip v-if="!role.includes('客户')" class="item" effect="dark" content="可视化大屏" placement="bottom">
<span class="right-menu-item hover-effect"
style="font-size: 26px;display: flex;justify-content: center;align-items: center">
<i style="color: #262626;font-weight: bold;font-size: 16px" class="el-icon-s-data"
@click="goScreen"/>
<i style="color: #262626;font-weight: bold;font-size: 16px" class="el-icon-s-data" @click="goScreen" />
</span>
</el-tooltip>
@ -69,8 +59,7 @@
</template>
<!-- <el-tooltip class="item" effect="dark" content="操作" placement="bottom"> -->
<el-dropdown @visible-change="handleShow" class="avatar-container right-menu-item hover-effect nick-name-style"
style="margin-right: 0"
trigger="click">
style="margin-right: 0" trigger="click">
<div class="avatar-wrapper">
<!-- <img :src="avatar + '?imageView2/1/w/80/h/80'" class="user-avatar" /> -->
<i
@ -84,26 +73,17 @@
<!-- <div class="block"><el-avatar shape="square" size=small :src="squareUrl"></el-avatar></div> -->
</div>
<el-dropdown-menu slot="dropdown" style="width: 230px;font-size: 16px;" divided>
<div
style="display: flex;flex-direction: column;padding:15px 15px;background-color: #f0f2f5">
<div style="display: flex;flex-direction: column;padding:15px 15px;background-color: #f0f2f5">
<span style="font-weight: bold;font-size: 20px;margin-bottom: 5px;color: #333333">{{ nick_name }}</span>
<span
style="font-size: 12px;color:#666;display: flex;justify-content:flex-start;align-items: center"> ID: <span
ref="contentToCopy">
<span style="font-size: 12px;color:#666;display: flex;justify-content:flex-start;align-items: center"> ID:
<span ref="contentToCopy">
{{
userId
}}
</span>
<svg
@click="copyBtn"
class="copy-btn"
viewBox="0 0 1024 1024"
xmlns="http://www.w3.org/2000/svg"
width="12"
height="12"
style="fill: #1019ab;"
>
<svg @click="copyBtn" class="copy-btn" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"
width="12" height="12" style="fill: #1019ab;">
<path
d="M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z"
p-id="1521"></path>
@ -111,12 +91,11 @@
</span>
</div>
<el-divider style="margin: 0!important;"></el-divider>
<div
v-if="role.includes('客户')"
<div v-if="role.includes('客户')"
style="padding: 0 18px; width: 100%;height: 60px;display: flex;justify-content: space-between;align-items: center">
<span style="color:#666;display: block;font-size: 14px;"
class="moneyNow"><span style="display: block;margin-bottom: 5px">余额</span>{{
<span style="color:#666;display: block;font-size: 14px;" class="moneyNow"><span
style="display: block;margin-bottom: 5px">余额</span>{{
mybalance ? mybalance : initMybalance()
}} </span>
<el-button v-if="!isShowKbossCharge" type="primary" @click="$router.push('/kbossCharge')" plain
@ -124,8 +103,7 @@
充值
</el-button>
</div>
<el-dropdown-item v-if="role.includes('客户')"
@click.native="$router.push('/customer/customerInformation')">
<el-dropdown-item v-if="role.includes('客户')" @click.native="$router.push('/customer/customerInformation')">
<span style="display: block">个人中心</span>
</el-dropdown-item>
<!-- channelManagementShow=true-->
@ -204,8 +182,8 @@
<el-button size="mini" type="danger" @click="delMessage">删除</el-button>
</div>
<el-table :header-cell-style="rowClass" @row-click="expandChangeHandler1" class="table" ref="table"
@expand-change="expandChangeHandler" :row-class-name="rowStyle" :data="unreadMessageList"
height="680" tooltip-effect="dark" @selection-change="handleSelectionChange">
@expand-change="expandChangeHandler" :row-class-name="rowStyle" :data="unreadMessageList" height="680"
tooltip-effect="dark" @selection-change="handleSelectionChange">
<el-table-column type="expand" width="30px">
<template slot-scope="props">
<div class="msgtext">
@ -335,7 +313,7 @@
<!-- 修改密码弹窗 -->
<el-dialog title="修改密码" :visible.sync="passwordDialog" width="45%" :before-close="handleClose1"
style="width: 80%">
custom-class="password-dialog" class="password-dialog-wrapper">
<el-form ref="passwordForm" :model="passwordForm" label-width="120px" style="width: 80%" :rules="rules">
<el-form-item label="旧密码:" prop="password">
<el-input v-model="passwordForm.password" placeholder="请输入旧密码" show-password></el-input>
@ -425,11 +403,9 @@
</el-dialog>
<!-- 渠道管理-->
<el-dialog
title="渠道管理信息提示"
:visible.sync="channelManagementShow"
custom-class="channel-dialog-style">
<span class="indent">开元云公司作为一级分销商面对直接客户售出设备产品产品由供应商上传平台设置产品价格配置及设备账号密码等配置信息开元云进行审核审核通过产品上线客户可直接购买开元云可以将产品分配给各供应商销售分配时配置给供应商的折扣供应商得到产品及开元云的折扣后设置折扣面向客户客户通过kboss进行购买分销商的客户如自己上传产品也可以成为开元云的供应商</span>
<el-dialog title="渠道管理信息提示" :visible.sync="channelManagementShow" custom-class="channel-dialog-style">
<span
class="indent">开元云公司作为一级分销商面对直接客户售出设备产品产品由供应商上传平台设置产品价格配置及设备账号密码等配置信息开元云进行审核审核通过产品上线客户可直接购买开元云可以将产品分配给各供应商销售分配时配置给供应商的折扣供应商得到产品及开元云的折扣后设置折扣面向客户客户通过kboss进行购买分销商的客户如自己上传产品也可以成为开元云的供应商</span>
<span slot="footer" class="dialog-footer">
<el-button @click="channelManagementShow = false"> </el-button>
<el-button type="primary" @click="ChannelConfirmBtn">我已知晓并进行后续操作</el-button>
@ -438,11 +414,7 @@
<!-- searhcDiaolog-->
<el-dialog
title="全站搜索"
:visible.sync="searchDialogVisible"
width="800px"
:close-on-click-modal="false"
<el-dialog title="全站搜索" :visible.sync="searchDialogVisible" width="800px" :close-on-click-modal="false"
:before-close="handleClose">
<el-input placeholder="请输入搜索关键字" v-model="searchValue" class="input-with-select">
<el-button @click="searchBtn" :loading="searchLoading" slot="append" icon="el-icon-search"></el-button>
@ -450,14 +422,11 @@
<ul v-loading="searchLoading" class="searchUl" v-if="searchResultList.length > 0">
<li v-for="(item, index) in searchResultList" :key="index">
<span class="title" @click="goProductPage(item)"><div style="margin-right: 5px">{{ item.product_name }}</div> <img
v-if="item.type=='jd'"
src="./images/京东云.svg"
alt="">
<img
v-else-if="item.type=='bd'"
src="./images/百度智能云.svg"
alt=""></span>
<span class="title" @click="goProductPage(item)">
<div style="margin-right: 5px">{{ item.product_name }}</div> <img v-if="item.type == 'jd'"
src="./images/京东云.svg" alt="">
<img v-else-if="item.type == 'bd'" src="./images/百度智能云.svg" alt="">
</span>
<span class="description">{{ item.description }}</span>
<!-- <span class="tags">123</span>-->
</li>
@ -468,13 +437,8 @@
<span slot="footer" class="dialog-footer">
</span>
</el-dialog>
<el-drawer
direction="ltr"
style="z-index: 1000;width: 1205px"
title=""
custom-class="myDrawer"
:visible.sync="drawerPro"
:with-header="false">
<el-drawer direction="ltr" style="z-index: 1000;width: 1205px" title="" custom-class="myDrawer"
:visible.sync="drawerPro" :with-header="false">
<div style="width: 100%;height: 100%;background: white">
<ul class="allProStyle">
<li @click="goHomePage"><img src="./img/a.svg" alt=""> 阿里云</li>
@ -1318,6 +1282,41 @@ export default {
};
</script>
<style lang="less">
::v-deep .password-dialog {
display: flex;
align-items: center;
justify-content: center;
.el-dialog {
margin: 0 auto !important;
position: relative;
top: 0;
@media screen and (max-width: 1200px) {
width: 70% !important;
}
@media screen and (max-width: 768px) {
width: 90% !important;
}
}
.el-dialog__header {
text-align: center;
}
.el-dialog__body {
padding: 20px;
}
}
.password-dialog-wrapper {
::v-deep .el-dialog {
margin-top: 0 !important;
top: 50%;
transform: translateY(-50%);
}
}
.channel-dialog-style {
position: relative;
width: 700px;
@ -1335,8 +1334,10 @@ export default {
}
.indent {
display: block; /* 将 span 元素转换为块级元素 */
text-indent: 2em; /* 设置首行缩进的大小为 2 个字符 */
display: block;
/* 将 span 元素转换为块级元素 */
text-indent: 2em;
/* 设置首行缩进的大小为 2 个字符 */
line-height: 25px;
}
@ -1650,6 +1651,7 @@ export default {
.logo {
display: none;
}
.hamburger-container {
display: block;
}
@ -1667,7 +1669,8 @@ export default {
border-bottom-color: #255fd5 !important;
}
.searchUl, .searchEmpty {
.searchUl,
.searchEmpty {
height: 250px;
width: 100%;
@ -1723,7 +1726,6 @@ export default {
}
}
}
</style>
<style>
.cuxiao-style {

View File

@ -4,21 +4,27 @@
<!-- <div style="color:#fff;height:30px;">1232</div> -->
<!-- <el-row :gutter="20">
<el-col :span="6">
<img src="../../../../public/logo
s/logo_rgba/noWhite/kkyLogoNoWhiteNoText.png" alt="">
<img src="../../../../public/logos/logo_rgba/noWhite/kkyLogoNoWhiteNoText.png" alt="">
</el-col>
<el-col :span="18">
<img src="../../../../public/logos/logo_rgba/noWhite/kkyLogoNoWhiteText.png.png" alt="">
</el-col>
</el-row> -->
<!-- </div> -->
<div :class="{ 'has-logo': showLogo }">
<div :class="{ 'has-logo': showLogo }" class="sidebar-container">
<logo @click="$router.push('/homePage/index')" v-if="showLogo" :collapse="isCollapse"/>
<happy-scroll color="rgba(0,0,0,0.5)" size="5">
<el-menu :collapse="isCollapse" :background-color="variables.menuBg" :text-color="variables.menuText"
:unique-opened="true" :active-text-color="variables.menuActiveText" :collapse-transition="false"
:default-active="$route.path" mode="vertical"
style="overflow-y: auto;height: 100vh ;"
<!-- happy-scroll 移到 el-menu 外层并移除 el-menu 上的固定高度 -->
<happy-scroll color="rgba(0,0,0,0.5)" size="5" class="menu-scroll-container">
<el-menu
:collapse="isCollapse"
:background-color="variables.menuBg"
:text-color="variables.menuText"
:unique-opened="true"
:active-text-color="variables.menuActiveText"
:collapse-transition="false"
:default-active="$route.path"
mode="vertical"
class="el-menu-vertical"
>
<sidebar-item v-for="(route, index) in permission_routes" :key="index" :item="route" :base-path="route.path"/>
</el-menu>
@ -30,7 +36,7 @@
<script>
import {mapGetters} from "vuex";
import Logo from "./Logo";
import SidebarItem from "./SidebarItem";
import SidebarItem from "./SidebarItem.vue";
import variables from "../../../styles/variables.scss";
export default {
@ -41,17 +47,7 @@ export default {
},
components: {SidebarItem, Logo},
computed: {
...mapGetters(["permission_routes", "sidebar"]),
// activeMenu() {
// const route = this.$route
// const { meta, path } = route
// // if set path, the sidebar will highlight the path you set
// if (meta.activeMenu) {
// return meta.activeMenu
// }
// return path
// },
showLogo() {
return true
},
@ -69,25 +65,78 @@ export default {
};
</script>
<style lang="scss" scoped>
/* stylelint-disable */
.index {
//margin-top: 50px;
width: 100%; // 100%
height: 100%; //
position: relative; //
.log {
width: 100%;
height: 80px;
}
height: 80px; // Logo
flex-shrink: 0; // Flex
}
::v-deep .happy-scroll {
overflow-x: hidden;
.sidebar-container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
box-sizing: border-box; // padding/borderwidth
}
.happy-scroll-container {
width: 100% !important;
.menu-scroll-container {
flex: 1; //
width: 100%;
overflow-x: hidden; //
::v-deep .happy-scroll-container {
width: 100% !important; // 100%
// min-width
min-width: unset !important;
.happy-scroll-content {
width: 100%;
min-width: unset !important; //
box-sizing: border-box; // padding/borderwidth
}
}
}
::v-deep .el-menu-vertical {
border: none; //
height: 100%; //
width: 100% !important; // 100%
min-width: 100% !important; // 100%
box-sizing: border-box; // padding/borderwidth
//
.el-submenu__title,
.el-menu-item {
white-space: nowrap; //
overflow: hidden; //
text-overflow: ellipsis; //
}
}
//
::v-deep .el-menu--collapse {
// Element UI 64px
width: 64px !important; //
min-width: 64px !important;
//
.el-submenu__title,
.el-menu-item {
text-overflow: clip; //
justify-content: center; //
}
}
}
/* stylelint-enable */
</style>

View File

@ -51,11 +51,10 @@ import App from './App'
import store from './store'
import router from './router'
// import 'default-passive-events'
import './icons' // icon
import './permission' // permission control
// import './utils/error-log' // error log
import index from '@/styles/index.css'
import { v4 as uuidv4 } from 'uuid';//引入uuid
// uuidv4();

View File

@ -1554,8 +1554,6 @@ export const asyncRoutes = [
// fullPath: "/operation/approval/approveBusinessConfig"
// }
// },
{
path: "approvalConfig",
component: () => import("@/views/operation/approval/approvalConfig"),

View File

@ -0,0 +1,22 @@
.backgroundColor{
background-color: #fff;
height: calc(100vh - 80px);
padding: 10px;
}
.bf{
background-color: #fff;
}
.p10{
padding: 10px;
}
.h100{
height: calc(100vh - 100px);
}
.p0{
padding: 0;
}
.flex{
display: flex;
justify-content: center;
align-items: center;
}

View File

@ -1,4 +1,4 @@
// base color
// / base color
$blue: #324157;
$light-blue: #3A71A8;
$red: #C03639;
@ -10,16 +10,18 @@ $panGreen: #30B08F;
// sidebar
$menuText: #000;
$menuActiveText: #1b14d9; //当前子菜单的字体颜色
$subMenuActiveText: #100101; // https://github.com/ElemeFE/element/issues/12951
$menuActiveText: #1b14d9; // 当前激活菜单项的文字颜色
$subMenuActiveText: #100101; // 当前激活子菜单项的文字颜色
$menuBg: #fff; // 整体背景颜色
$menuHover: #f7f7f7; //鼠标浮动一级菜单背景
$menuHover: #f0f0f0; // 鼠标悬浮一级菜单背景色 (轻微变化更友好)
$subMenuBg: #f7f7f7; // 子菜单背景色
$subMenuHover: #eaeaea; // 鼠标悬浮子菜单背景色 (轻微变化更友好)
$subMenuBg: #f7f7f7; //子菜单下拉
$subMenuHover: #0177f8; //鼠标浮动子菜单背景
$sideBarWidth: 230px; // 侧边栏宽度
$sideBarWidth: 230px;
// Element UI 默认折叠宽度为 64px
// $sideBarCollapseWidth: 64px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
@ -32,5 +34,9 @@ $sideBarWidth: 230px;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
// sideBarCollapseWidth: $sideBarCollapseWidth;
}

View File

@ -1,5 +1,5 @@
<template>
<div>
<div class="backgroundColor">
<qualificationBox :approveInfo="approveInfo"></qualificationBox>
</div>
@ -23,6 +23,4 @@ export default {
},
}
</script>
<style scoped>
</style>
<style scoped></style>

View File

@ -1,5 +1,5 @@
<template>
<div>
<div class="backgroundColor">
<qualificationBox :approveInfo="approveInfo"></qualificationBox>
</div>

View File

@ -1,5 +1,5 @@
<template>
<div class="leftTable">
<div class="leftTable backgroundColor">
<div class="findButtonMobile" v-if="isMobile">
<el-row class="searchOne">
<el-col :span="24" class="colOne">

View File

@ -1,5 +1,5 @@
<template>
<div>
<div class="backgroundColor">
<el-button size="small" style="margin-bottom: 5px;" type="primary" @click="getTableData('1')">
<i class="el-icon-upload2"> </i>
全部导出</el-button>

View File

@ -7,36 +7,40 @@
<el-table-column prop="orgname" label="客户名称"></el-table-column>
<el-table-column label="联系方式" prop="contactor_phone"></el-table-column>
<el-table-column prop="address" label="地址" show-overflow-tooltip></el-table-column>
1
</el-table>
<div style="margin-top: 20px; display:flex;">
<el-button @click="selectSales()" size="small" type="primary">选择销售</el-button>
<el-button @click="cancelSelection()" size="small" type="primary">取消选择</el-button>
<div class="button-container">
<el-button @click="selectSales()" size="small" type="primary" :disabled="!hasSelection" class="action-button">
选择销售
</el-button>
<el-button @click="cancelSelection()" size="small" type="primary" :disabled="!hasSelection"
class="action-button">
取消选择
</el-button>
</div>
</el-card>
<el-dialog class="myDialog" title="选择销售人员" :visible.sync="isShow" width="30%" :before-close="handleClose">
<el-form ref="form" :model="form" label-width="130px">
<el-form-item label="请选择销售人员:" style="width: 80%;" prop="sales">
<!-- 添加一个容器来应用滚动样式 -->
<div class="radio-group-container">
<el-radio-group v-model="form.id">
<div class="radio">
<el-radio :label="item.id" v-for="(item,index) in salesData" :key="index">{{ item.username }}</el-radio>
<div class="radio" v-for="(item, index) in salesData" :key="index">
<el-radio :label="item.id">{{ item.username }}</el-radio>
</div>
</el-radio-group>
</div>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer" style=" display:flex;">
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="cancel()"> </el-button>
<el-button size="small" type="primary" @click="salesSubmit()"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {getNoinvitationcodeAPI, getSalesAPI, addUserCustomerAPI} from "@/api/sales/sales"
import { getNoinvitationcodeAPI, getSalesAPI, addUserCustomerAPI } from "@/api/sales/sales";
export default {
data() {
@ -54,111 +58,160 @@ export default {
children: "children",
label: "username",
},
// salesId:'',//id
customerid: [], // id
isSlected: false,
hasSelection: false, //
userId: sessionStorage.getItem("userId"),
orgid: sessionStorage.getItem("orgid"),
}
};
},
created() {
this.loading = true
this.getNoinvitationcode()
this.loading = true;
this.getNoinvitationcode();
},
methods: {
getNoinvitationcode() { //
getNoinvitationcodeAPI({ orgid: this.orgid }).then(res => {
this.loading = false
this.tableData = res.data.rows
this.loading = false;
this.tableData = res.data.rows;
// console.log(res);
})
});
},
getSales() { //
getSalesAPI({ role: "销售", userid: this.userId }).then(res => {
// console.log(res);
if (res.data.length > 0) {
this.salesData = res.data.map((item) => {
let mySales = {
return {
username: item.username,
id: item.id,
};
return mySales;
});
this.form.id = this.salesData.id
//
//
// this.form.id = this.salesData[0]?.id || '';
}
})
});
},
selectSales() {
this.getSales()
this.isShow = true
this.getSales();
this.isShow = true;
},
handleSelectionChange(val) {
// console.log(val);
this.customerid = [];
val.forEach(item => {
this.customerid.push(item.id)
})
// console.log(this.customerid)
// ID
this.customerid = val.map(item => item.id); //
//
this.hasSelection = this.customerid.length > 0;
// console.log(this.customerid);
},
cancelSelection() {
this.$refs.table.clearSelection();
// clearSelection handleSelectionChange
this.hasSelection = false;
this.customerid = [];
},
handleClose() {
this.isShow = false
this.isShow = false;
},
salesSubmit() {
let params = {
customerid: this.customerid,//
salemanid: this.form.id//
//
if (this.customerid.length === 0) {
this.$message({
message: '请至少选择一个客户!',
type: 'warning'
});
return;
}
if (!this.form.id) {
this.$message({
message: '请选择销售人员!',
type: 'warning'
});
return;
}
let formData = new FormData();
// API customerid JSON
formData.append('customerid', JSON.stringify(this.customerid));
formData.append('salemanid', this.form.id);
// const fromdata = this.getFormData(params);
addUserCustomerAPI(formData).then(res => {
if (res.status == true) {
this.isShow = false
this.getNoinvitationcode()
this.isShow = false;
this.getNoinvitationcode(); //
//
this.$refs.table.clearSelection();
this.hasSelection = false;
this.customerid = [];
this.form.id = ''; //
this.$message({
message: '分配成功!',
type: 'success'
})
});
} else {
this.$message({
message: res.message || '分配失败!',
type: 'error'
});
}
})
}).catch(error => {
this.$message({
message: '分配请求出错: ' + error.message,
type: 'error'
});
});
},
cancel() {
this.isShow = false
this.isShow = false;
},
getFormData(object) {//formdata
const formData = new FormData();
Object.keys(object).forEach(key => {
const value = object[key];
if (Array.isArray(value)) {
value.forEach((subValue, i) => {
formData.append(key + `[${i}]`, subValue)
})
} else {
formData.append(key, object[key])
}
})
return formData;
},
}
// getFormData(object) { // formdata - 使
// const formData = new FormData();
// Object.keys(object).forEach(key => {
// const value = object[key];
// if (Array.isArray(value)) {
// value.forEach((subValue, i) => {
// formData.append(key + `[${i}]`, subValue)
// })
// } else {
// formData.append(key, object[key])
// }
// })
// return formData;
// },
}
};
</script>
<style lang="scss" scoped>
.container {
.myDialog {
.radio {
.button-container {
margin-top: 20px;
display: flex;
flex-direction: column;
height: 200px;
width: 200px;
overflow: hidden;
overflow-y: scroll;
gap: 10px; //
}
.action-button {
padding: 8px 16px; //
font-size: 14px; //
border-radius: 4px; //
}
.myDialog {
.radio-group-container {
//
max-height: 200px;
overflow-y: auto;
border: 1px solid #e4e7ed; //
border-radius: 4px; //
padding: 5px; //
}
.radio {
//
margin-bottom: 5px; //
&:last-child {
margin-bottom: 0; //
}
}
.dialog-footer {

View File

@ -1,5 +1,5 @@
<template>
<div class="box">
<div class="box backgroundColor">
<div class="footer" style="background-color: white">
<el-button size="small" type="success" @click="addSupp">添加供应商</el-button>
</div>
@ -8,43 +8,53 @@
:row-key="getRowKeys" border @expand-change="expandChangeHandler" v-loading="loading">
<el-table-column type="expand">
<template slot-scope="props">
<el-form label-position="left" inline class="demo-table-expand" style="display: flex;flex-wrap: wrap">
<el-form-item style="display: flex;justify-content: flex-start" label="供应商名称:">
<span>{{ props.row.orgname }}</span>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="起效日期:">
<span>{{ props.row.start_date }}</span>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="描述:">
<span>{{ props.row.description }}</span>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="失效日期:">
<span>{{ props.row.end_date }}</span>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="联系人电话:">
<span>{{ props.row.contactor_phone }}</span>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="协议修改:">
<div class="details-container">
<div class="details-header">
<h3>供应商详细信息</h3>
</div>
<div class="details-content">
<div class="details-row">
<div class="details-item">
<span class="details-label">供应商名称</span>
<span class="details-value">{{ props.row.orgname }}</span>
</div>
<div class="details-item">
<span class="details-label">起效日期</span>
<span class="details-value">{{ props.row.start_date }}</span>
</div>
<div class="details-item">
<span class="details-label">描述</span>
<span class="details-value">{{ props.row.description }}</span>
</div>
<div class="details-item">
<span class="details-label">失效日期</span>
<span class="details-value">{{ props.row.end_date }}</span>
</div>
<div class="details-item">
<span class="details-label">联系人电话</span>
<span class="details-value">{{ props.row.contactor_phone }}</span>
</div>
<div class="details-item">
<span class="details-label">邮箱</span>
<span class="details-value">{{ props.row.emailaddress }}</span>
</div>
<div class="details-item">
<span class="details-label">联系地址</span>
<span class="details-value">{{ props.row.address }}</span>
</div>
<div class="details-item">
<span class="details-label">主营业务描述</span>
<span class="details-value">{{ props.row.main_business }}</span>
</div>
</div>
<div class="details-actions">
<el-button type="primary" @click="updateProtocol(props.row)" size="mini">修改协议</el-button>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="邮箱:">
<span>{{ props.row.emailaddress }}</span>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="联系地址:">
<span>{{ props.row.address }}</span>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="主营业务描述:">
<span>{{ props.row.main_business }}</span>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="回佣设置:"
v-if="props.row.salemode == 1">
<el-button type="primary" @click="rpRebateCtlDialogVisibleTrue(props.row)" size="mini">添加回佣
</el-button>
</el-form-item>
<el-form-item style="display: flex;justify-content: flex-start" label="产品导入:">
<el-button type="primary" size="mini" @click="addProductExcel(props.row)">批量导入产品</el-button>
</el-form-item>
</el-form>
<el-button type="primary" @click="addProductExcel(props.row)" size="mini">批量导入产品</el-button>
<el-button v-if="props.row.salemode == 1" type="primary" @click="rpRebateCtlDialogVisibleTrue(props.row)" size="mini">添加回佣</el-button>
</div>
</div>
</div>
<el-tabs type="border-card" @tab-click="handleClick" v-if="props.row.salemode == '1'">
<el-tab-pane label="周结" name="first" v-if="oldRpRebate[0]">
<el-table :data="oldRpRebate[0]" style="width: 100%">
@ -264,7 +274,8 @@
<el-upload class="avatar-uploader" action="#" :show-file-list="false" :auto-upload="false"
:on-change="handleAvatarSuccess" :on-remove="handleRemove">
<img v-if="imageUrl" :src="imageUrl" class="avatar"/>
<i style="
<!-- 修改仅在没有图片时显示加号 -->
<i v-else style="
font-size: 60px;
border: 1px solid #aaa;
padding: 10px;
@ -1119,6 +1130,8 @@ export default {
},
handleRemove(file) { //
// imageUrl
this.imageUrl = "";
},
handleAvatarSuccess(file, fileList) {
this.imageUrl = URL.createObjectURL(file.raw);
@ -1392,4 +1405,73 @@ export default {
align-items: center;
}
/* 优化详情布局样式 */
.details-container {
padding: 20px;
background-color: #f5f7fa;
border-radius: 4px;
margin-bottom: 20px;
}
.details-header {
border-bottom: 1px solid #ebeef5;
padding-bottom: 15px;
margin-bottom: 15px;
}
.details-header h3 {
margin: 0;
color: #303133;
}
.details-content {
display: flex;
flex-direction: column;
}
.details-row {
display: flex;
flex-wrap: wrap;
margin: 0 -10px;
}
.details-item {
flex: 0 0 50%;
padding: 0 10px;
margin-bottom: 15px;
box-sizing: border-box;
}
.details-label {
display: inline-block;
width: 120px;
color: #909399;
font-weight: 400;
text-align: right;
vertical-align: middle;
font-size: 14px;
margin-right: 12px;
}
.details-value {
color: #606266;
font-size: 14px;
}
.details-actions {
display: flex;
justify-content: center;
gap: 10px;
padding-top: 20px;
border-top: 1px solid #ebeef5;
}
@media (max-width: 768px) {
.details-item {
flex: 0 0 100%;
}
}
</style>

View File

@ -1,93 +1,97 @@
<template>
<div class="mainBox">
<div class="leftBox">
<div class="section">
<div class="bigTitle">快捷导航</div>
<ul class="recUl">
<li v-for="(item,index) in navList" :key="index" @click="goBaidu(item)">{{ item.name }}</li>
<li v-for="(item,index) in navList" :key="index" @click="goBaidu(item)">
<i :class="item.icon || 'el-icon-link'"></i>
{{ item.name }}
</li>
</ul>
</div>
<div class="section">
<div class="bigTitle">资源概览</div>
<ul class="recUl overView">
<li v-for="(item, index) in viewList" :key="index">
<div class="overview-item">
<span class="title">{{ item.name }}</span>
<span class="number">{{ item.count }}</span>
</div>
</li>
</ul>
</div>
<div class="section">
<div class="bigTitle">到期预警</div>
<el-table
height="250px"
border
:data="tableData"
style="width: 100%">
<el-table-column
prop="name"
label="名称"
width="180">
style="width: 100%"
header-cell-class-name="table-header"
cell-class-name="table-cell">
<el-table-column prop="name" label="名称" width="180"></el-table-column>
<el-table-column prop="instanceid" label="资源id" width="180"></el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
<el-tag :type="scope.row.status === '即将到期' ? 'warning' : 'danger'">
{{ scope.row.status }}
</el-tag>
</template>
</el-table-column>
<el-table-column
prop="instanceid"
label="资源id"
width="180">
</el-table-column>
<el-table-column
prop="status"
label="状态">
</el-table-column>
<el-table-column
prop="days"
label="剩余天数">
<el-table-column prop="days" label="剩余天数">
<template slot-scope="scope">
<span :class="scope.row.days < 3 ? 'critical' : ''">{{ scope.row.days }}</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="rightBox">
<div class="user">
<!-- 用户信息 -->
<div class="user card">
<div class="userImg">
<div class="imgUser">{{ userInfo.username.charAt(0) }}</div>
</div>
<div class="userBox">
<h3>{{ userInfo.username }}</h3>
<div class="user-info">
<p><i class="el-icon-user"></i> ID: {{ userInfo.id }}</p>
<p><i class="el-icon-phone"></i> 手机号: {{ userInfo.mobile }}</p>
<p><i class="el-icon-message"></i> 邮箱: {{ userInfo.email }}</p>
</div>
</div>
</div>
</div>
<div class="rightBox">
<ul class="userUl">
<li>
<span>用户名</span>
<span class="content">{{ userInfo.username }}</span>
</li>
<li>
<span>ID</span>
<span class="content">{{ userInfo.id }}</span>
</li>
<li>
<span>手机号</span>
<span class="content">{{ userInfo.mobile }}</span>
</li>
<li>
<span>邮箱</span>
<span class="content">{{ userInfo.email }}</span>
</li>
</ul>
</div>
</div>
<div v-show="false" class="price">
<div class="price card">
<div class="title">账户余额</div>
<div class="content">
<span>{{ initMybalance() }}</span>
<el-button
size="mini"
type="primary"
@click="$router.push('/kbossCharge')">充值
<span class="balance">{{ initMybalance() }}</span>
<el-button size="mini" type="primary" @click="$router.push('/kbossCharge')">
立即充值
</el-button>
</div>
</div>
<div class="announcements card">
<div class="title">系统公告</div>
<ul class="announcement-list">
<li v-for="i in 3" :key="i">
<i class="el-icon-bell"></i>
<span>这是第{{ i }}条系统公告内容...</span>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
import Vue from 'vue'
import {mapGetters, mapState} from "vuex";
import { mapState } from "vuex";
import { reqNewHomeResource, reqNewHomeResourceWarning, reqQuickNav } from "@/api/newHome";
export default Vue.extend({
@ -110,8 +114,7 @@ export default Vue.extend({
reqQuickNav().then(res => {
this.navList = res.data
})
this.userInfo = JSON.parse(JSON.parse(JSON.stringify(localStorage.getItem("user_info")) || "{}"));
localStorage.setItem('price', this.mybalance)
this.userInfo = JSON.parse(localStorage.getItem("user_info") || "{}");
reqNewHomeResource().then(res => {
if (res.status) {
this.viewList = res.data || [];
@ -129,8 +132,6 @@ export default Vue.extend({
},
methods: {
goBaidu(item) {
console.log(item.listUrl)
console.log(item.url)
this.$store.commit('setRedirectUrl', item.url)
localStorage.setItem('redirectUrl', item.url)
localStorage.setItem('userRescourseUrl', item.listUrl)
@ -143,174 +144,231 @@ export default Vue.extend({
})
},
initMybalance() {
return sessionStorage.getItem('mybalance')
return sessionStorage.getItem('mybalance') || '0.00'
},
}, computed: {
},
computed: {
...mapState({
mybalance: state => state.user.mybalance,
})
},
})
</script>
<style scoped lang="scss">
<style lang="less" scoped>
.mainBox {
background: #f6f6f6;
background: #f5f7fa;
width: 100%;
height: calc(100vh - 80px);
display: flex;
justify-content: space-between;
padding: 10px;
box-sizing: border-box;
gap: 20px;
}
.leftBox {
padding-left: 15px;
width: 60%;
width: 65%;
display: flex;
flex-direction: column;
gap: 20px;
.section {
background: white;
border-radius: 10px;
padding: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
}
.rightBox {
width: 35%;
display: flex;
flex-direction: column;
gap: 20px;
}
.card {
background: white;
border-radius: 10px;
padding: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.recUl {
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 15px;
list-style: none;
padding: 0;
margin: 0;
li {
margin-right: 5px;
border-radius: 12px;
margin-bottom: 10px;
width: 24%;
padding: 15px 30px;
padding: 15px;
cursor: pointer;
transition: all .3s ease-in-out;
border: 2px solid #f1ebeb;
background: white;
transition: all 0.3s ease;
border: 1px solid #ebeef5;
border-radius: 8px;
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
i {
font-size: 24px;
margin-bottom: 10px;
color: #409eff;
}
&:hover {
color: #171b4a;
background: #d1caca;
transform: translateY(-3px);
box-shadow: 0 4px 12px rgba(64, 158, 255, 0.2);
border-color: #409eff;
}
}
}
.overView {
li {
border-radius: 0 !important;
grid-template-columns: repeat(2, 1fr);
&:hover {
li {
cursor: default;
background: white !important;
&:hover {
transform: none;
box-shadow: none;
border-color: #ebeef5;
}
}
.overview-item {
display: flex;
justify-content: space-between;
width: 100%;
.title {
font-size: 14px;
color: #333;
margin-right: 10px;
font-size: 16px;
color: #606266;
}
.number {
font-size: 18px;
color: #0e0b0b;
font-size: 20px;
font-weight: bold;
color: #303133;
}
}
}
}
.rightBox {
width: 40%;
padding: 0 15px;
}
.bigTitle {
color: #4c5a7e;
margin: 15px 0;
font-size: 20px;
color: #303133;
margin-bottom: 20px;
font-size: 18px;
font-weight: bold;
padding-bottom: 10px;
border-bottom: 2px solid #409eff;
display: inline-block;
}
.user {
margin-top: 15px;
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
background: white;
height: 300px;
border-radius: 4px;
.rightBox {
padding: 40px;
padding-left: 0;
width: calc(100% - 150px);
.userUl {
li {
margin-bottom: 35px;
font-size: 18px;
.content {
color: #78787c;
}
}
}
}
.userImg {
margin-right: 20px;
width: 150px;
// height: 150px;
display: flex;
justify-content: center;
align-items: center;
img {
.imgUser {
width: 80px;
height: 80px;
border-radius: 50%;
background: linear-gradient(135deg, #409eff, #64b5f6);
font-size: 36px;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
}
}
.userBox {
width: calc(100% - 100px);
h3 {
margin-top: 0;
margin-bottom: 15px;
color: #303133;
}
.user-info {
p {
margin: 8px 0;
color: #606266;
i {
margin-right: 8px;
color: #409eff;
}
}
}
}
}
.price {
margin-top: 15px;
width: 100%;
height: 150px;
padding: 15px;
background: white;
.content {
margin-top: 15px;
font-size: 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.title {
font-size: 18px;
.balance {
font-size: 28px;
font-weight: bold;
color: #4c5a7e;
color: #e6a23c;
}
}
}
.chargeStyle {
padding: 5px 20px;
border-radius: 8px;
font-size: 16px;
.announcements {
.announcement-list {
list-style: none;
padding: 0;
margin: 0;
li {
padding: 10px 0;
border-bottom: 1px solid #eee;
display: flex;
align-items: center;
&:last-child {
border-bottom: none;
}
i {
color: #e6a23c;
margin-right: 10px;
}
span {
color: #606266;
}
}
}
}
.critical {
color: #f56c6c;
font-weight: bold;
color: #4c5a7e;
}
.imgUser {
text-align: center;
line-height: 80px;
width: 80px;
height: 80px;
border-radius: 50%;
background: #081020;
font-size: 48px;
color: white;
.table-header {
background-color: #f5f7fa !important;
color: #606266;
font-weight: bold;
}
.table-cell {
padding: 8px 0 !important;
}
</style>

View File

@ -23,7 +23,8 @@
<div class="configStyle">
<span>数据盘3.84T U.2 NVMe SSD * 1</span>
<span>GPUNVIDIA GeForce RTX 4090 * 8</span>
<span>光速网卡Mellanox ConnectX-5 Lx 25G SFP28 2-port</span></div>
<span>光速网卡Mellanox ConnectX-5 Lx 25G SFP28 2-port</span>
</div>
<div class="butBox">
<span class="buyBtn" @click="dialogVisibleMy = true"> 立即购买</span>
</div>
@ -53,10 +54,10 @@
<div class="dsPcPad">
<span class="hmc1icon" style="position: relative;height: 150px">
<div class="aniIcon"
style="background-image: url('https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_2.png'); background-position-y: 0;position: absolute;top: 0;left: -20px"></div>
style="background-image: url('https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_2.png'); background-position-y: 0;position: absolute;top: 0;left: -20px">
</div>
<div class="hmc3nico"><img height="180"
src="https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_2.png"
width="180"></div>
src="https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_2.png" width="180"></div>
</span>
</div>
<!-- <div class="dsPhone">-->
@ -74,20 +75,17 @@
</span>
</a>
</li>
<li :class="{ activeTagStyle: currentTag === '1' }" style="width: 250px;"
@click=" clickTag('1') ">
<li :class="{ activeTagStyle: currentTag === '1' }" style="width: 250px;" @click=" clickTag('1')">
<a class="hmc1a aniIconBtn">
<div class="dsPcPad">
<span class="hmc1icon"
style="position: relative;height: 150px">
<span class="hmc1icon" style="position: relative;height: 150px">
<div class="aniIcon"
style="background-image: url('https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_1.png'); background-position-y: 0;position: absolute;top: 0;left: -20px"></div>
style="background-image: url('https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_1.png'); background-position-y: 0;position: absolute;top: 0;left: -20px">
</div>
<div class="hmc3nico"><img height="180"
src="https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_1.png"
width="180"></div>
src="https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_1.png" width="180"></div>
</span>
</div>
<!-- <div class="dsPhone">-->
@ -111,12 +109,12 @@
<div class="dsPcPad">
<span class="hmc1icon" style="position: relative;height: 150px">
<div class="aniIcon"
style="background-image: url('https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_3.png'); background-position-y: 0;position: absolute;top: 0;left: -20px"></div>
style="background-image: url('https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_3.png'); background-position-y: 0;position: absolute;top: 0;left: -20px">
</div>
<div class="hmc3nico"><img height="180"
src="https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_3.png"
width="180"></div>
src="https://www.opencomputing.cn/dev/idfile?path=svg_data/n3d_3.png" width="180"></div>
</span>
</div>
<strong style="margin-top:25px">公有云</strong>
@ -145,9 +143,8 @@
</div>
<div class="new-nav">
<ul class="nav-ul">
<li
:class="{ navLi: item.name === currentTitle }"
@click="mouseOver($event,item)" v-for="(item,index) in menuArr" :key="item.name">
<li :class="{ navLi: item.name === currentTitle }" @click="mouseOver($event, item)"
v-for="(item, index) in menuArr" :key="item.name">
<div>
{{ item.name }}
</div>
@ -168,16 +165,17 @@
<div class="content-r">
<ul class="bottom-ul" style="display: flex;flex-wrap: wrap;justify-content: center;"
>
<ul class="bottom-ul" style="display: flex;flex-wrap: wrap;justify-content: center;">
<li @click="goTwo(item)" v-for="(item, index) in currentData" :key="index"
style="width: 300px;margin: 0 15px 10px 15px">
<a class="sq6Wd6jr">
<div class="__9uUkOV59"><h3><span class="LLZ9Q8FX">{{ item.product_name }} </span></h3>
<p class="xQ1YIHP8">{{ item.description }}</p></div>
<div class="__9uUkOV59">
<h3><span class="LLZ9Q8FX">{{ item.product_name }} </span></h3>
<p class="xQ1YIHP8">{{ item.description }}</p>
</div>
<div class="PfF8K5ib">
<div v-for="(itemOne,index) in JSON.parse(JSON.stringify(item.tags))" :key="index"
class="_dDwK_qk"><span>{{
<div v-for="(itemOne, index) in JSON.parse(JSON.stringify(item.tags))" :key="index" class="_dDwK_qk">
<span>{{
itemOne
}}</span>
</div>
@ -186,8 +184,7 @@
style="display: flex;justify-content: flex-start;align-items: center">
<span class="__1wQVatn_ vh___DYU PEZeG2zA"
style="display: inline-block;align-self: flex-end">折扣</span>
<span class="__1wQVatn_ cB_ePAPu XeaRmkQC"
style="display:inline-block;margin: 0 3px">{{
<span class="__1wQVatn_ cB_ePAPu XeaRmkQC" style="display:inline-block;margin: 0 3px">{{
item.discount
}} </span>
<span class="__1wQVatn_ cB_ePAPu XeaRmkQC"
@ -1054,9 +1051,7 @@ export default {
background-color: white;
}
.all-cloud {
}
.all-cloud {}
.cloud-header {
display: flex;
@ -1070,9 +1065,7 @@ export default {
flex-direction: column;
}
.jd-box {
}
.jd-box {}
.all-cloud-item {
display: flex;
@ -1163,20 +1156,23 @@ export default {
.new-nav {
overflow-x: auto;
}
.main-box {
}
.main-box {}
.cloud-header {
margin: 0 0 15px 0 !important;
}
.mobile-banner {
display: none;
}
.all-cloud-item {
display: flex;
flex-direction: column;
}
.other-product-ul {
li {
@ -1257,6 +1253,7 @@ export default {
position: relative;
font-weight: bold;
z-index: 1;
//padding: 10px 0 0 10px;
&:first-child {
height: 60px;
@ -1327,7 +1324,8 @@ export default {
display: -webkit-box;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
-webkit-line-clamp: 2; /* 控制最大行数 */
-webkit-line-clamp: 2;
/* 控制最大行数 */
}
* {
@ -1444,6 +1442,7 @@ a:hover {
.myDivider {
display: none;
}
.new-nav {
padding: 0 !important;
display: flex;
@ -1467,9 +1466,12 @@ a:hover {
padding: 0 10px;
display: grid !important;
grid-template-columns: 1fr 1fr !important; /* 两列等宽 */
grid-template-columns: 1fr 1fr !important;
/* 两列等宽 */
//justify-content: space-around !important;
gap: 10px; /* 上下左右间距 */
gap: 10px;
/* 上下左右间距 */
li {
margin-right: 0 !important;
margin-left: 0 !important;