mirror of
https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git
synced 2026-09-20 20:02:05 +08:00
feat(distribution): 优化分销提现页面功能
fix(setting): 更新海报和邀请卡背景图尺寸说明 style(table): 统一全局表格表头样式 refactor(home): 优化首页待办事项点击跳转 refactor(main): 优化主布局侧边栏收起动画 chore(menu): 优化菜单导航结构 docs(readme): 更新项目文档信息 feat(task): 新增定时任务管理页面
This commit is contained in:
92
README.md
92
README.md
@@ -1,34 +1,14 @@
|
|||||||
# Lilishop(PickMall) 开源商城系统
|
# Lilishop(PickMall) 开源商城系统
|
||||||
|
|
||||||
[](https://github.com/hongyehuicheng/lilishop)
|
[](https://github.com/lilishop/lilishop)
|
||||||
[](https://gitee.com/beijing_hongye_huicheng/lilishop)
|
[](https://gitee.com/beijing_hongye_huicheng/lilishop)
|
||||||
|
[](./LICENSE)
|
||||||
|
[](https://vuejs.org/)
|
||||||
|
|
||||||
<p align="right">
|
<p align="right">
|
||||||
简体中文 | <a href="./README.en.md">English</a>
|
简体中文 | <a href="./README.en.md">English</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## All-In-One 一键启动
|
|
||||||
|
|
||||||
如果只是想快速体验完整商城,不需要分别部署后端、PC、商家端、运营端、IM Web、H5、MySQL 和 Redis。安装 Docker Desktop 后,可以直接下载 `docker` 仓库 `allinone-lite-mysql-redis` 分支的一键安装脚本,按提示输入 IP/域名、端口、密码和数据目录,即可启动单镜像单容器体验环境。
|
|
||||||
|
|
||||||
macOS / Linux:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -fsSL https://gitee.com/beijing_hongye_huicheng/docker/raw/allinone-lite-mysql-redis/install/install-lilishop.sh -o install-lilishop.sh
|
|
||||||
chmod +x install-lilishop.sh
|
|
||||||
./install-lilishop.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Windows PowerShell:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Invoke-WebRequest -Uri "https://gitee.com/beijing_hongye_huicheng/docker/raw/allinone-lite-mysql-redis/install/install-lilishop.ps1" -OutFile "install-lilishop.ps1"
|
|
||||||
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
|
|
||||||
.\install-lilishop.ps1
|
|
||||||
```
|
|
||||||
|
|
||||||
默认镜像:`ccr.ccs.tencentyun.com/lilishop/lilishop-all-in-one:lite`。启动后可访问买家 PC、商家端、运营端、IM Web 会话/消息页、uniapp H5 和后端 API。更多说明见 [docker/all-in-one 文档](https://gitee.com/beijing_hongye_huicheng/docker/tree/allinone-lite-mysql-redis/all-in-one)。
|
|
||||||
|
|
||||||
All-In-One `lite` 是本地体验和演示形态:一个容器内包含应用、前端资源、H5、MariaDB、Redis 和本地文件存储。它不是生产高可用架构,也不内置 Elasticsearch、RocketMQ、XXL-Job、Kibana、Logstash 或 RocketMQ Dashboard;搜索、消息和定时任务逻辑在 lite 环境中使用 MySQL / Redis / 本地调度兼容实现。
|
|
||||||
|
|
||||||
LILISHOP 是基于 Spring Boot / Spring Cloud / Vue / Uniapp 开发的 Java 开源商城系统,支持 B2B2C 多商户商城、小程序商城、微服务商城、直播电商、分销返佣、秒杀活动、Docker 私有化部署。
|
LILISHOP 是基于 Spring Boot / Spring Cloud / Vue / Uniapp 开发的 Java 开源商城系统,支持 B2B2C 多商户商城、小程序商城、微服务商城、直播电商、分销返佣、秒杀活动、Docker 私有化部署。
|
||||||
|
|
||||||
@@ -36,7 +16,7 @@ LILISHOP 是基于 Spring Boot / Spring Cloud / Vue / Uniapp 开发的 Java 开
|
|||||||
|
|
||||||
- Java商城系统
|
- Java商城系统
|
||||||
- 开源商城系统
|
- 开源商城系统
|
||||||
- SpringBoot商城系统
|
- Spring Boot 4商城系统
|
||||||
- SpringCloud微服务商城
|
- SpringCloud微服务商城
|
||||||
- B2B2C商城源码
|
- B2B2C商城源码
|
||||||
- 多商户商城系统
|
- 多商户商城系统
|
||||||
@@ -58,14 +38,15 @@ LILISHOP 是基于 Spring Boot / Spring Cloud / Vue / Uniapp 开发的 Java 开
|
|||||||
### 1. 项目简介
|
### 1. 项目简介
|
||||||
|
|
||||||
**Lilishop** 是一款功能完善的B2B2C多商户商城系统,采用前后端分离架构,全端代码开源。
|
**Lilishop** 是一款功能完善的B2B2C多商户商城系统,采用前后端分离架构,全端代码开源。
|
||||||
后端基于 **SpringBoot3** 构建,具备高内聚、低耦合的特性,支持分布式部署。
|
后端基于 **Spring Boot 4**(Java 21)构建,具备高内聚、低耦合的特性,支持分布式部署。
|
||||||
前端覆盖PC、H5、小程序和APP,基于 **Vue** 和 **uni-app** 开发。
|
前端覆盖PC、H5、小程序和APP,基于 **Vue** 和 **uni-app** 开发。
|
||||||
|
|
||||||
- **官方网站**: <https://pickmall.cn>
|
- **官方网站**: <https://pickmall.cn>
|
||||||
- **官方文档**: <https://docs.pickmall.cn>
|
- **官方文档**: <https://docs.pickmall.cn>
|
||||||
- **Gitee 仓库**: <https://gitee.com/beijing_hongye_huicheng/lilishop>
|
- **Gitee 仓库**: <https://gitee.com/beijing_hongye_huicheng/lilishop-ui>
|
||||||
- **GitHub 仓库**: <https://github.com/lilishop/lilishop>
|
- **GitHub 仓库**: <https://github.com/lilishop/lilishop>
|
||||||
|
|
||||||
|
本仓库为 **PC / 商家端 / 运营端 / IM Web** 源码(`lilishop-ui`)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -103,30 +84,10 @@ LILISHOP 是基于 Spring Boot / Spring Cloud / Vue / Uniapp 开发的 Java 开
|
|||||||
[**部署文档 -> 环境准备**](https://docs.pickmall.cn/deply/deply.html)
|
[**部署文档 -> 环境准备**](https://docs.pickmall.cn/deply/deply.html)
|
||||||
|
|
||||||
#### 数据库初始化
|
#### 数据库初始化
|
||||||
- **推荐方式**: 使用 [`docker`](https://gitee.com/beijing_hongye_huicheng/docker) 仓库中的 `docker-compose`,可自动完成 **MySQL、Redis** 等中间件的部署与初始化。
|
- **推荐方式**: 使用项目提供的 `docker-compose` 配置,可自动完成数据库(MySQL、Redis 等)的部署与初始化。
|
||||||
- **手动方式**: 如果您选择手动部署,SQL脚本位于以下地址。请确保获取与您代码版本一致的SQL文件。
|
- **手动方式**: 如果您选择手动部署,SQL脚本位于以下地址。请确保获取与您代码版本一致的SQL文件。
|
||||||
[**数据库脚本 (Gitee)**](https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql)
|
[**数据库脚本 (Gitee)**](https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql)
|
||||||
|
|
||||||
#### 后端服务与端口(`vue3` 分支)
|
|
||||||
|
|
||||||
| 服务 | 端口 | 说明 |
|
|
||||||
| :--- | :--- | :--- |
|
|
||||||
| buyer-api | 8888 | 买家端 API |
|
|
||||||
| manager-api | 8887 | 平台 + 商家 API(`/manager/**`、`/store/**`) |
|
|
||||||
| im-api | 8885 | 客服 IM / WebSocket |
|
|
||||||
|
|
||||||
运行依赖:**MySQL + Redis**。商品搜索使用 MySQL;异步消息使用 Redis 队列;定时任务使用 Spring `@Scheduled`(内嵌在 manager-api)。
|
|
||||||
|
|
||||||
#### 前端 API 路径约定
|
|
||||||
|
|
||||||
| 端 | 公共接口前缀 |
|
|
||||||
| :--- | :--- |
|
|
||||||
| 买家 PC/H5 | `{buyerUrl}/buyer/common/*` |
|
|
||||||
| 商家端 | `{sellerUrl}/store/common/*` |
|
|
||||||
| 平台端 | `{managerUrl}/manager/common/*` |
|
|
||||||
|
|
||||||
`common-api` 已下线,请勿再使用 `/common/common/*` 旧路径。
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 5. 架构文档边界
|
### 5. 架构文档边界
|
||||||
@@ -140,10 +101,13 @@ LILISHOP 是基于 Spring Boot / Spring Cloud / Vue / Uniapp 开发的 Java 开
|
|||||||
- H5 / 小程序 / APP:`lilishop-uniapp`
|
- H5 / 小程序 / APP:`lilishop-uniapp`
|
||||||
- 部署、SQL、镜像与启动脚本:`docker`
|
- 部署、SQL、镜像与启动脚本:`docker`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### 6. 功能列表
|
### 6. 功能列表
|
||||||
|
|
||||||
[功能清单](https://bdwx2tfwwt.feishu.cn/sheets/FFQKscQKDhUx60to1k9cbMngnYb?from=from_copylink)
|
[功能清单](https://bdwx2tfwwt.feishu.cn/sheets/FFQKscQKDhUx60to1k9cbMngnYb?from=from_copylink)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### 7. 开源与授权
|
### 7. 开源与授权
|
||||||
|
|
||||||
@@ -160,6 +124,34 @@ LILISHOP 是基于 Spring Boot / Spring Cloud / Vue / Uniapp 开发的 Java 开
|
|||||||
我们欢迎任何形式的交流与贡献。在提问前,请先查阅 [官方文档](https://docs.pickmall.cn/) ,并参考 [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md) 以便高效沟通。
|
我们欢迎任何形式的交流与贡献。在提问前,请先查阅 [官方文档](https://docs.pickmall.cn/) ,并参考 [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md) 以便高效沟通。
|
||||||
|
|
||||||
- **[在线客服](https://work.weixin.qq.com/kfid/kfc4d8dc24a73c15f44)**
|
- **[在线客服](https://work.weixin.qq.com/kfid/kfc4d8dc24a73c15f44)**
|
||||||
- **微信交流1群(已满)**
|
- **微信交流群**:
|
||||||
- **微信交流2群**:
|
|
||||||

|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 9. 升级计划
|
||||||
|
|
||||||
|
以下功能将陆续在后续版本中发布:✅ 已完成 · 🔜 规划中
|
||||||
|
|
||||||
|
- ✅ 商品定时上下架
|
||||||
|
- ✅ 商品分组
|
||||||
|
- ✅ 会员分组
|
||||||
|
- ✅ 商品虚拟销量
|
||||||
|
- ✅ 专用发票(发票上传)
|
||||||
|
- ✅ 置顶评论
|
||||||
|
- ✅ 客户等级
|
||||||
|
- ✅ 购物卡
|
||||||
|
- ✅ 腾讯云-云直播
|
||||||
|
- ✅ 统计:营业概况、商品概况、会员概况、积分分析、储值分析、营销概况、分销统计
|
||||||
|
- ✅ 经营报表(店铺业绩报表、商品同比环比报表、销售订单明细报表、商品销售汇总报表)
|
||||||
|
- ✅ 卡密商品
|
||||||
|
- ✅ 二级分销
|
||||||
|
- ✅ 定时任务管理
|
||||||
|
- 🔜 主题色管理
|
||||||
|
- 🔜 店铺结算汇总
|
||||||
|
- 🔜 支付方式汇总
|
||||||
|
- 🔜 结算台账
|
||||||
|
- 🔜 钱包流水
|
||||||
|
- 🔜 财务汇总
|
||||||
|
- 🔜 微信小店对接
|
||||||
|
- 🔜 抖店对接
|
||||||
|
|||||||
11
manager/src/api/timedTask.js
Normal file
11
manager/src/api/timedTask.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { managerApiUrl, getRequest, postRequest } from '@/libs/axios';
|
||||||
|
|
||||||
|
// 获取定时任务列表
|
||||||
|
export const getTimedTaskList = () => {
|
||||||
|
return getRequest(`${managerApiUrl}/manager/setting/timed-task`);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 手动触发定时任务
|
||||||
|
export const triggerTimedTask = (type) => {
|
||||||
|
return postRequest(`${managerApiUrl}/manager/setting/timed-task/trigger/${type}`);
|
||||||
|
};
|
||||||
@@ -333,8 +333,8 @@ util.initAllMenuData = function(constRoutes, data) {
|
|||||||
util.initMenuData = function(vm, data) {
|
util.initMenuData = function(vm, data) {
|
||||||
const menuRoutes = [];
|
const menuRoutes = [];
|
||||||
let menuData = data;
|
let menuData = data;
|
||||||
// 顶部菜单
|
// 顶部菜单 —— 首页固定置顶
|
||||||
let navList = [];
|
let navList = [{ name: 'home_index', title: '首页' }];
|
||||||
menuData.forEach(e => {
|
menuData.forEach(e => {
|
||||||
let nav = {
|
let nav = {
|
||||||
name: e.name,
|
name: e.name,
|
||||||
@@ -357,11 +357,16 @@ util.initMenuData = function(vm, data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 默认第一个
|
// 默认首页
|
||||||
currNav = navList[0].name;
|
currNav = 'home_index';
|
||||||
vm.$store.commit("setCurrNavTitle", navList[0].title);
|
vm.$store.commit("setCurrNavTitle", '首页');
|
||||||
}
|
}
|
||||||
vm.$store.commit("setCurrNav", currNav);
|
vm.$store.commit("setCurrNav", currNav);
|
||||||
|
// 首页不需要二级菜单
|
||||||
|
if (currNav === 'home_index') {
|
||||||
|
vm.$store.commit("updateMenulist", []);
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (let item of menuData) {
|
for (let item of menuData) {
|
||||||
if (item.name == currNav) {
|
if (item.name == currNav) {
|
||||||
// 过滤
|
// 过滤
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
@import "./main.scss";
|
@import "./main.scss";
|
||||||
</style>
|
</style>
|
||||||
<template>
|
<template>
|
||||||
<div class="main">
|
<div class="main" :class="{ 'home-only': !menuList.length }">
|
||||||
<div class="sidebar-menu-con menu-bar">
|
<div class="sidebar-menu-con menu-bar">
|
||||||
<shrinkable-menu />
|
<shrinkable-menu />
|
||||||
</div>
|
</div>
|
||||||
@@ -113,6 +113,9 @@ export default {
|
|||||||
loading() {
|
loading() {
|
||||||
return this.$store.state.app.loading;
|
return this.$store.state.app.loading;
|
||||||
},
|
},
|
||||||
|
menuList() {
|
||||||
|
return this.$store.state.app.menuList || [];
|
||||||
|
},
|
||||||
pageTagsList() {
|
pageTagsList() {
|
||||||
return this.$store.state.app.pageOpenedList;
|
return this.$store.state.app.pageOpenedList;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -7,10 +7,10 @@
|
|||||||
class="search-form"
|
class="search-form"
|
||||||
@keyup.enter="handleSearch"
|
@keyup.enter="handleSearch"
|
||||||
>
|
>
|
||||||
<el-form-item label="会员名称" class="flex" prop="memberName">
|
<el-form-item label="分销员名称" class="flex" prop="memberName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="searchForm.memberName"
|
v-model="searchForm.memberName"
|
||||||
placeholder="请输入会员名称"
|
placeholder="请输入分销员名称"
|
||||||
clearable
|
clearable
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
/>
|
/>
|
||||||
@@ -23,16 +23,6 @@
|
|||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" style="width: 240px">
|
|
||||||
<el-select v-model="searchForm.distributionCashStatus" clearable style="width: 150px">
|
|
||||||
<el-option
|
|
||||||
v-for="item in cashStatusList"
|
|
||||||
:key="item.value"
|
|
||||||
:value="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleSearch">搜索</el-button>
|
<el-button type="primary" @click="handleSearch">搜索</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -40,6 +30,13 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<el-card>
|
<el-card>
|
||||||
|
<el-tabs v-model="tabStatus" @tab-change="handleTabChange">
|
||||||
|
<el-tab-pane label="全部" name="" />
|
||||||
|
<el-tab-pane :label="applyCountLabel" name="APPLY" />
|
||||||
|
<el-tab-pane label="已通过" name="VIA_AUDITING" />
|
||||||
|
<el-tab-pane label="已拒绝" name="FAIL_AUDITING" />
|
||||||
|
</el-tabs>
|
||||||
|
|
||||||
<el-table
|
<el-table
|
||||||
ref="table"
|
ref="table"
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
@@ -49,18 +46,14 @@
|
|||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
>
|
>
|
||||||
<el-table-column prop="sn" label="编号" min-width="200" />
|
<el-table-column prop="sn" label="编号" min-width="200" />
|
||||||
<el-table-column prop="distributionName" label="会员名称" min-width="120" />
|
<el-table-column prop="distributionId" label="分销员ID" min-width="180" />
|
||||||
|
<el-table-column prop="distributionName" label="分销员名称" min-width="120" />
|
||||||
<el-table-column label="申请金额" min-width="90">
|
<el-table-column label="申请金额" min-width="90">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<priceColorScheme v-if="row" :value="row.price" :color="$mainColor" />
|
<priceColorScheme v-if="row" :value="row.price" :color="$mainColor" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="createTime" label="申请时间" min-width="130" />
|
<el-table-column prop="createTime" label="申请时间" min-width="130" />
|
||||||
<el-table-column prop="name" label="姓名" min-width="100" />
|
|
||||||
<el-table-column prop="idNumber" label="身份证号" min-width="120" />
|
|
||||||
<el-table-column prop="settlementBankAccountName" label="结算银行开户行名称" min-width="120" />
|
|
||||||
<el-table-column prop="settlementBankAccountNum" label="结算银行开户账号" min-width="120" />
|
|
||||||
<el-table-column prop="settlementBankBranchName" label="结算银行开户支行名称" min-width="120" />
|
|
||||||
<el-table-column prop="updateTime" label="处理时间" min-width="130" />
|
<el-table-column prop="updateTime" label="处理时间" min-width="130" />
|
||||||
<el-table-column label="状态" min-width="100">
|
<el-table-column label="状态" min-width="100">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
@@ -95,51 +88,104 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<el-dialog
|
<el-drawer
|
||||||
v-model="modalVisible"
|
v-model="drawerVisible"
|
||||||
:title="modalTitle"
|
:title="drawerTitle"
|
||||||
width="500px"
|
size="560px"
|
||||||
:close-on-click-modal="false"
|
direction="rtl"
|
||||||
|
:close-on-click-modal="true"
|
||||||
|
append-to-body
|
||||||
destroy-on-close
|
destroy-on-close
|
||||||
|
class="cash-detail-drawer"
|
||||||
>
|
>
|
||||||
<el-form ref="form" :model="form" label-width="100px">
|
<div class="detail-body">
|
||||||
<el-form-item label="编号">
|
<div class="detail-section-title">申请信息</div>
|
||||||
<el-input v-model="form.sn" disabled clearable style="width: 100%" />
|
<div class="detail-meta">
|
||||||
</el-form-item>
|
<div class="detail-meta-row">
|
||||||
<el-form-item label="会员名称">
|
<span class="detail-meta-label">编号</span>
|
||||||
<el-input v-model="form.distributionName" disabled clearable style="width: 100%" />
|
<span class="detail-meta-value">{{ form.sn || '-' }}</span>
|
||||||
</el-form-item>
|
</div>
|
||||||
<el-form-item label="金额">
|
<div class="detail-meta-row">
|
||||||
<el-input v-model="form.price" disabled clearable style="width: 100%" />
|
<span class="detail-meta-label">分销员ID</span>
|
||||||
</el-form-item>
|
<span class="detail-meta-value">{{ form.distributionId || '-' }}</span>
|
||||||
<el-form-item v-if="handleStatus == 'edit'" label="是否通过" prop="result">
|
</div>
|
||||||
<el-radio-group v-model="result">
|
<div class="detail-meta-row">
|
||||||
<el-radio-button value="VIA_AUDITING">通过</el-radio-button>
|
<span class="detail-meta-label">分销员名称</span>
|
||||||
<el-radio-button value="FAIL_AUDITING">拒绝</el-radio-button>
|
<span class="detail-meta-value">{{ form.distributionName || '-' }}</span>
|
||||||
</el-radio-group>
|
</div>
|
||||||
</el-form-item>
|
<div class="detail-meta-row">
|
||||||
</el-form>
|
<span class="detail-meta-label">申请金额(元)</span>
|
||||||
<template v-if="handleStatus == 'edit'" #footer>
|
<span class="detail-meta-value detail-meta-price">{{ form.price != null ? Number(form.price).toFixed(2) : '-' }}</span>
|
||||||
<el-button @click="modalVisible = false">取消</el-button>
|
</div>
|
||||||
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">提交</el-button>
|
<div class="detail-meta-row">
|
||||||
|
<span class="detail-meta-label">状态</span>
|
||||||
|
<span class="detail-meta-value">
|
||||||
|
<span v-if="form.distributionCashStatus === 'APPLY'">待处理</span>
|
||||||
|
<span v-else-if="form.distributionCashStatus === 'VIA_AUDITING'">已通过</span>
|
||||||
|
<span v-else-if="form.distributionCashStatus === 'FAIL_AUDITING'">已拒绝</span>
|
||||||
|
<span v-else>-</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="detail-meta-row">
|
||||||
|
<span class="detail-meta-label">申请时间</span>
|
||||||
|
<span class="detail-meta-value">{{ form.createTime || '-' }}</span>
|
||||||
|
</div>
|
||||||
|
<div v-if="form.updateTime && form.distributionCashStatus !== 'APPLY'" class="detail-meta-row">
|
||||||
|
<span class="detail-meta-label">处理时间</span>
|
||||||
|
<span class="detail-meta-value">{{ form.updateTime || '-' }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="detail-section-title">银行卡信息</div>
|
||||||
|
<div class="detail-meta">
|
||||||
|
<div class="detail-meta-row">
|
||||||
|
<span class="detail-meta-label">持卡人</span>
|
||||||
|
<span class="detail-meta-value">{{ form.name || '-' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="detail-meta-row">
|
||||||
|
<span class="detail-meta-label">银行</span>
|
||||||
|
<span class="detail-meta-value">{{ form.settlementBankAccountName || '-' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="detail-meta-row">
|
||||||
|
<span class="detail-meta-label">银行卡号</span>
|
||||||
|
<span class="detail-meta-value">{{ form.settlementBankAccountNum || '-' }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template v-if="handleStatus === 'edit'">
|
||||||
|
<div class="detail-section-title">审核操作</div>
|
||||||
|
<div class="audit-action">
|
||||||
|
<el-radio-group v-model="result">
|
||||||
|
<el-radio-button value="VIA_AUDITING">通过</el-radio-button>
|
||||||
|
<el-radio-button value="FAIL_AUDITING">拒绝</el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template v-if="handleStatus === 'edit'" #footer>
|
||||||
|
<div class="drawer-footer">
|
||||||
|
<el-button @click="drawerVisible = false">取消</el-button>
|
||||||
|
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">提交审核</el-button>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-drawer>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { auditDistributionCash, getDistributionCash } from "@/api/distribution";
|
import { auditDistributionCash, getDistributionCash } from "@/api/distribution";
|
||||||
import { cashStatusList } from "./dataJson";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "distributionCash",
|
name: "distributionCash",
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
cashStatusList,
|
tabStatus: "",
|
||||||
|
applyCount: 0,
|
||||||
loading: true,
|
loading: true,
|
||||||
modalVisible: false,
|
drawerVisible: false,
|
||||||
modalTitle: "",
|
drawerTitle: "",
|
||||||
result: "FAIL_AUDITING",
|
result: "VIA_AUDITING",
|
||||||
searchForm: {
|
searchForm: {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 20,
|
pageSize: 20,
|
||||||
@@ -149,17 +195,38 @@ export default {
|
|||||||
handleStatus: "edit",
|
handleStatus: "edit",
|
||||||
form: {
|
form: {
|
||||||
sn: "",
|
sn: "",
|
||||||
memberName: "",
|
distributionId: "",
|
||||||
|
distributionName: "",
|
||||||
price: "",
|
price: "",
|
||||||
|
name: "",
|
||||||
|
settlementBankAccountName: "",
|
||||||
|
settlementBankAccountNum: "",
|
||||||
},
|
},
|
||||||
submitLoading: false,
|
submitLoading: false,
|
||||||
data: [],
|
data: [],
|
||||||
total: 0,
|
total: 0,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
applyCountLabel() {
|
||||||
|
return this.applyCount > 0 ? `待处理(${this.applyCount})` : "待处理";
|
||||||
|
},
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
init() {
|
init() {
|
||||||
this.getDataList();
|
this.getDataList();
|
||||||
|
this.loadApplyCount();
|
||||||
|
},
|
||||||
|
loadApplyCount() {
|
||||||
|
getDistributionCash({
|
||||||
|
distributionCashStatus: "APPLY",
|
||||||
|
pageSize: 1,
|
||||||
|
pageNumber: 1,
|
||||||
|
}).then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
this.applyCount = res.result.total || 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
changePage() {
|
changePage() {
|
||||||
this.getDataList();
|
this.getDataList();
|
||||||
@@ -175,7 +242,11 @@ export default {
|
|||||||
},
|
},
|
||||||
getDataList() {
|
getDataList() {
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
getDistributionCash(this.searchForm).then((res) => {
|
const params = { ...this.searchForm };
|
||||||
|
if (this.tabStatus) {
|
||||||
|
params.distributionCashStatus = this.tabStatus;
|
||||||
|
}
|
||||||
|
getDistributionCash(params).then((res) => {
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
this.data = res.result.records;
|
this.data = res.result.records;
|
||||||
@@ -183,61 +254,60 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
handleTabChange(name) {
|
||||||
|
this.tabStatus = name;
|
||||||
|
this.searchForm.pageNumber = 1;
|
||||||
|
this.getDataList();
|
||||||
|
},
|
||||||
handleSubmit() {
|
handleSubmit() {
|
||||||
let result = "拒绝";
|
let result = this.result == "VIA_AUDITING" ? "通过" : "拒绝";
|
||||||
if (this.result == "VIA_AUDITING") {
|
this.$Modal.confirm({
|
||||||
result = "通过";
|
title: "确认审核",
|
||||||
}
|
content: "您确认要审核" + result + "么?",
|
||||||
this.$refs.form.validate((valid) => {
|
loading: true,
|
||||||
if (valid) {
|
onOk: () => {
|
||||||
this.$Modal.confirm({
|
auditDistributionCash(this.form.id, { result: this.result }).then((res) => {
|
||||||
title: "确认审核",
|
if (res.success) {
|
||||||
content: "您确认要审核" + result + "么?",
|
this.$Modal.remove();
|
||||||
loading: true,
|
this.$Message.success("审核成功");
|
||||||
onOk: () => {
|
this.drawerVisible = false;
|
||||||
auditDistributionCash(this.form.id, { result: this.result }).then((res) => {
|
this.getDataList();
|
||||||
if (res.success) {
|
this.loadApplyCount();
|
||||||
this.$Modal.remove();
|
} else {
|
||||||
this.$Message.success("审核成功");
|
this.$Modal.remove();
|
||||||
this.getDataList();
|
}
|
||||||
this.modalVisible = false;
|
|
||||||
} else {
|
|
||||||
this.modalVisible = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
edit(v) {
|
edit(v) {
|
||||||
this.modalTitle = "审核";
|
this.drawerTitle = "审核";
|
||||||
this.handleStatus = "edit";
|
this.handleStatus = "edit";
|
||||||
this.$refs.form?.resetFields();
|
this.result = "VIA_AUDITING";
|
||||||
|
const data = {};
|
||||||
for (let attr in v) {
|
for (let attr in v) {
|
||||||
if (v[attr] === null) {
|
data[attr] = v[attr] === null ? "" : v[attr];
|
||||||
v[attr] = "";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.form = JSON.parse(JSON.stringify(v));
|
this.form = data;
|
||||||
this.modalVisible = true;
|
this.drawerVisible = true;
|
||||||
},
|
},
|
||||||
view(v) {
|
view(v) {
|
||||||
this.modalTitle = "查看";
|
this.drawerTitle = "查看";
|
||||||
this.handleStatus = "view";
|
this.handleStatus = "view";
|
||||||
this.$refs.form?.resetFields();
|
const data = {};
|
||||||
for (let attr in v) {
|
for (let attr in v) {
|
||||||
if (v[attr] === null) {
|
data[attr] = v[attr] === null ? "" : v[attr];
|
||||||
v[attr] = "";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
let str = JSON.stringify(v);
|
|
||||||
let data = JSON.parse(str);
|
|
||||||
this.form = data;
|
this.form = data;
|
||||||
this.modalVisible = true;
|
this.drawerVisible = true;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
// 处理路由参数,自动跳转到指定标签页
|
||||||
|
const tabStatus = this.$route.query.tabStatus;
|
||||||
|
if (tabStatus) {
|
||||||
|
this.tabStatus = tabStatus;
|
||||||
|
}
|
||||||
this.init();
|
this.init();
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -253,4 +323,71 @@ export default {
|
|||||||
margin: 0 8px;
|
margin: 0 8px;
|
||||||
color: #dcdee2;
|
color: #dcdee2;
|
||||||
}
|
}
|
||||||
|
.audit-action {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
.drawer-footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.cash-detail-drawer {
|
||||||
|
.el-drawer__header {
|
||||||
|
margin-bottom: 0;
|
||||||
|
padding: 16px 24px;
|
||||||
|
border-bottom: 1px solid #e8eaec;
|
||||||
|
}
|
||||||
|
.el-drawer__body {
|
||||||
|
padding: 20px 24px 0;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
.el-drawer__footer {
|
||||||
|
padding: 12px 24px;
|
||||||
|
border-top: 1px solid #e8eaec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.cash-detail-drawer .detail-body {
|
||||||
|
min-height: 200px;
|
||||||
|
}
|
||||||
|
.cash-detail-drawer .detail-section-title {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #17233d;
|
||||||
|
margin: 20px 0 12px;
|
||||||
|
&:first-child { margin-top: 0; }
|
||||||
|
}
|
||||||
|
.cash-detail-drawer .detail-meta {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
background: #f8f8f9;
|
||||||
|
border: 1px solid #e8eaec;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 14px 16px;
|
||||||
|
}
|
||||||
|
.cash-detail-drawer .detail-meta-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 22px;
|
||||||
|
}
|
||||||
|
.cash-detail-drawer .detail-meta-label {
|
||||||
|
color: #808695;
|
||||||
|
min-width: 110px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.cash-detail-drawer .detail-meta-value {
|
||||||
|
color: #515a6e;
|
||||||
|
flex: 1;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
.cash-detail-drawer .detail-meta-price {
|
||||||
|
font-weight: 600;
|
||||||
|
color: #f56c6c;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -160,7 +160,7 @@
|
|||||||
<img :src="posterForm.backgroundImage" alt="平台海报背景" class="poster-bg-thumb" />
|
<img :src="posterForm.backgroundImage" alt="平台海报背景" class="poster-bg-thumb" />
|
||||||
</div>
|
</div>
|
||||||
<upload-pic-input v-model="posterForm.backgroundImage" :show-input="false" />
|
<upload-pic-input v-model="posterForm.backgroundImage" :show-input="false" />
|
||||||
<div class="form-desc">建议上传竖版图片,用于平台海报背景。</div>
|
<div class="form-desc">建议尺寸:与邀请卡预览画布一致 630×1000 像素(端上海报若用其它比例,将以封面填充居中裁剪)。预览区样式与「邀请卡」页一致,便于对照效果。</div>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="推荐语">
|
<el-form-item label="推荐语">
|
||||||
@@ -208,7 +208,7 @@
|
|||||||
<img :src="inviteCardForm.backgroundImage" alt="邀请卡背景" class="poster-bg-thumb" />
|
<img :src="inviteCardForm.backgroundImage" alt="邀请卡背景" class="poster-bg-thumb" />
|
||||||
</div>
|
</div>
|
||||||
<upload-pic-input v-model="inviteCardForm.backgroundImage" :show-input="false" />
|
<upload-pic-input v-model="inviteCardForm.backgroundImage" :show-input="false" />
|
||||||
<div class="form-desc">建议上传竖版图片,用于邀请卡背景。</div>
|
<div class="form-desc">建议尺寸:630×1000 像素(端上若用其它比例,将以封面填充居中裁剪)。</div>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="推荐语">
|
<el-form-item label="推荐语">
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
<div class="counts">{{ $store.state.notices.refund || 0 }}</div>
|
<div class="counts">{{ $store.state.notices.refund || 0 }}</div>
|
||||||
<div>待审核售后</div>
|
<div>待审核售后</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="todo-item">
|
<div class="todo-item" @click="goDistributionCash">
|
||||||
<div class="counts">
|
<div class="counts">
|
||||||
{{ $store.state.notices.distributionCash || 0 }}
|
{{ $store.state.notices.distributionCash || 0 }}
|
||||||
</div>
|
</div>
|
||||||
@@ -243,6 +243,13 @@ export default {
|
|||||||
name,
|
name,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
// 跳转到分销提现,并打开待处理标签页
|
||||||
|
goDistributionCash() {
|
||||||
|
this.$router.push({
|
||||||
|
name: 'distributionCash',
|
||||||
|
query: { tabStatus: 'APPLY' }
|
||||||
|
});
|
||||||
|
},
|
||||||
// top10热卖商品
|
// top10热卖商品
|
||||||
async toHotGoods() {
|
async toHotGoods() {
|
||||||
let res = await hotGoods(this.params);
|
let res = await hotGoods(this.params);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="shrinkable-menu">
|
<div class="shrinkable-menu" :class="{ 'no-sub-menu': !menuList.length }">
|
||||||
<el-menu
|
<el-menu
|
||||||
class="nav-menu-dark"
|
class="nav-menu-dark"
|
||||||
:default-active="currNav"
|
:default-active="currNav"
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
</el-menu-item>
|
</el-menu-item>
|
||||||
</el-menu>
|
</el-menu>
|
||||||
<el-menu
|
<el-menu
|
||||||
|
v-if="menuList.length"
|
||||||
:key="`${currNav}-${activeMenuName}`"
|
:key="`${currNav}-${activeMenuName}`"
|
||||||
class="sub-menu"
|
class="sub-menu"
|
||||||
:default-active="activeMenuName"
|
:default-active="activeMenuName"
|
||||||
@@ -104,6 +105,11 @@ export default {
|
|||||||
selectNav(name) {
|
selectNav(name) {
|
||||||
this.$store.commit("setCurrNav", name);
|
this.$store.commit("setCurrNav", name);
|
||||||
this.setStore("currNav", name);
|
this.setStore("currNav", name);
|
||||||
|
if (name === 'home_index') {
|
||||||
|
this.$store.commit("updateMenulist", []);
|
||||||
|
this.$router.push({ name: 'home_index' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
util.initRouter(this);
|
util.initRouter(this);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -115,6 +121,11 @@ export default {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
transition: width 0.3s;
|
||||||
|
|
||||||
|
&.no-sub-menu {
|
||||||
|
width: 80px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-menu-dark {
|
.nav-menu-dark {
|
||||||
|
|||||||
@@ -89,6 +89,7 @@
|
|||||||
z-index: -1;
|
z-index: -1;
|
||||||
margin-left: 200px;
|
margin-left: 200px;
|
||||||
width: calc(100% - 200px);
|
width: calc(100% - 200px);
|
||||||
|
transition: margin-left 0.3s, width 0.3s;
|
||||||
background: #f0f0f0;
|
background: #f0f0f0;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -249,7 +250,7 @@
|
|||||||
overflow: auto;
|
overflow: auto;
|
||||||
background-color: #f0f0f0;
|
background-color: #f0f0f0;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
transition: left 0.3s;
|
transition: left 0.3s, width 0.3s;
|
||||||
|
|
||||||
.single-page {
|
.single-page {
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -290,6 +291,19 @@
|
|||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 首页:无二级菜单时,内容区跟随侧边栏收缩 */
|
||||||
|
.main.home-only {
|
||||||
|
.single-page-con {
|
||||||
|
left: 80px;
|
||||||
|
width: calc(100% - 80px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tags-con {
|
||||||
|
margin-left: 80px;
|
||||||
|
width: calc(100% - 80px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.nav-item {
|
.nav-item {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|||||||
91
manager/src/views/sys/timed-task/index.vue
Normal file
91
manager/src/views/sys/timed-task/index.vue
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-card>
|
||||||
|
<el-tabs v-model="activeTab">
|
||||||
|
<el-tab-pane label="每日任务" name="每日任务" />
|
||||||
|
<el-tab-pane label="每小时任务" name="每小时" />
|
||||||
|
<el-tab-pane label="每分钟任务" name="每分钟" />
|
||||||
|
</el-tabs>
|
||||||
|
|
||||||
|
<el-table v-loading="loading" :data="currentTasks" border style="width: 100%; margin-top: 12px">
|
||||||
|
<el-table-column prop="name" label="任务名称" width="220" />
|
||||||
|
<el-table-column prop="cron" label="Cron表达式" width="140" />
|
||||||
|
<el-table-column label="操作" width="120" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
:loading="row.triggering"
|
||||||
|
@click="handleTrigger(row)"
|
||||||
|
>
|
||||||
|
手动触发
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
|
import { getTimedTaskList, triggerTimedTask } from "@/api/timedTask.js";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "timed-task-manage",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loading: false,
|
||||||
|
activeTab: "每日任务",
|
||||||
|
taskList: [],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
currentTasks() {
|
||||||
|
return this.taskList.filter((t) => t.group === this.activeTab);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
init() {
|
||||||
|
this.loading = true;
|
||||||
|
getTimedTaskList()
|
||||||
|
.then((res) => {
|
||||||
|
this.loading = false;
|
||||||
|
if (res.success) {
|
||||||
|
this.taskList = res.result.map((t) => ({ ...t, triggering: false }));
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleTrigger(row) {
|
||||||
|
ElMessageBox.confirm(`确认要手动触发 "${row.name}" 吗?`, "提示", {
|
||||||
|
confirmButtonText: "确认",
|
||||||
|
cancelButtonText: "取消",
|
||||||
|
type: "warning",
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
row.triggering = true;
|
||||||
|
triggerTimedTask(row.id)
|
||||||
|
.then((res) => {
|
||||||
|
row.triggering = false;
|
||||||
|
if (res.success) {
|
||||||
|
ElMessage.success(`"${row.name}" 已触发执行`);
|
||||||
|
} else {
|
||||||
|
ElMessage.error(res.message || "触发失败");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
row.triggering = false;
|
||||||
|
ElMessage.error("触发失败");
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(() => {});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.init();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@@ -46,6 +46,20 @@
|
|||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 全局表格表头 */
|
||||||
|
.el-table {
|
||||||
|
.el-table__header th.el-table__cell {
|
||||||
|
background: var(--el-color-primary-light-9, #ecf5ff);
|
||||||
|
color: #303133;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__header th.el-table__cell .cell {
|
||||||
|
color: #303133;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.link-text {
|
.link-text {
|
||||||
color: #409eff;
|
color: #409eff;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|||||||
Reference in New Issue
Block a user