update:接口对接

This commit is contained in:
ltx 2026-03-09 03:35:18 +08:00
parent 70366175f5
commit 7db1e9cdd2
10 changed files with 937 additions and 331 deletions

View File

@ -0,0 +1,156 @@
import { BaseApi } from '../baseApi';
import { http } from '../../utils/request';
// ==================== 证书模板管理 ====================
/**
* 上传DOC模板
* @param {FormData} formData - 表单数据
* @param {File} formData.templatefile - 模板文件 (Word文档)
* @returns {Promise<{
* templateId: number,
* templateUrl: string,
* detectedPlaceholders: Array<{
* placeholderKey: string,
* placeholderType: string,
* isValid: boolean,
* validationMessage: string,
* suggestedDisplayName: string
* }>,
* totalPlaceholders: number,
* validPlaceholders: number
* }>}
*/
export const certificatetemplateUploaddoctemplatePost = (formData) => {
return http.post('/certificatetemplate/uploaddoctemplate', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
};
/**
* 更新DOC模板
* @param {Object} data - 模板信息
* @param {number} data.id - 模板ID
* @param {number} data.version - 版本号
* @param {string} data.templateFile - 模板文件(Base64编码)
* @param {number} [data.width] - 宽度 (默认5000)
* @param {number} [data.height] - 高度 (默认5000)
* @param {boolean} [data.isActive] - 是否激活
* @returns {Promise<{
* templateId: number,
* templateUrl: string,
* detectedPlaceholders: Array<{
* placeholderKey: string,
* placeholderType: string,
* isValid: boolean,
* validationMessage: string,
* suggestedDisplayName: string
* }>,
* totalPlaceholders: number,
* validPlaceholders: number
* }>}
*/
export const certificatetemplateDoctemplatePut = (data) => {
return http.put('/certificatetemplate/doctemplate', data);
};
/**
* 获取模板详情
* @param {Object} data - 请求参数
* @param {number} data.id - 模板ID
* @returns {Promise<{
* id: number,
* version: number,
* templateType: string,
* docxTemplateUrl: string,
* isActive: boolean,
* status: string,
* createdTime: string,
* placeholders: Array<{
* id: number,
* templateId: number,
* placeholderKey: string,
* displayName: string,
* placeholderType: string,
* defaultValue: string,
* isRequired: boolean,
* validationRule: string,
* description: string,
* sort: number
* }>
* }>}
*/
export const certificatetemplateGet = (data) => {
return http.get('/certificatetemplate', { params: data });
};
/**
* 检测DOC模板占位符
* @param {Object} data - 请求参数
* @param {string} data.templateFile - 模板文件(Base64编码)
* @returns {Promise<{
* placeholders: Array<{
* placeholderKey: string,
* placeholderType: string,
* isValid: boolean,
* validationMessage: string,
* suggestedDisplayName: string
* }>,
* totalCount: number,
* validCount: number,
* invalidCount: number
* }>}
*/
export const certificatetemplateDetectplaceholdersPost = (data) => {
return http.post('/certificatetemplate/detectplaceholders', data);
};
/**
* 保存占位符配置
* @param {Object} data - 占位符配置
* @param {number} data.templateId - 模板ID
* @param {Array<Object>} data.placeholders - 占位符列表
* @param {string} data.placeholders[].placeholderKey - 占位符键名
* @param {string} data.placeholders[].displayName - 显示名称
* @param {string} data.placeholders[].placeholderType - 占位符类型 (Text, Number, Date, Image等)
* @param {string} [data.placeholders[].defaultValue] - 默认值
* @param {boolean} data.placeholders[].isRequired - 是否必填
* @param {string} [data.placeholders[].validationRule] - 验证规则
* @param {string} [data.placeholders[].description] - 描述说明
* @param {number} data.placeholders[].sort - 排序
*/
export const certificatetemplateSaveplaceholdersPost = (data) => {
return http.post('/certificatetemplate/saveplaceholders', data);
};
/**
* 获取模板占位符列表
* @param {Object} data - 请求参数
* @param {number} data.id - 模板ID
* @returns {Promise<Array<{
* id: number,
* templateId: number,
* placeholderKey: string,
* displayName: string,
* placeholderType: string,
* defaultValue: string,
* isRequired: boolean,
* validationRule: string,
* description: string,
* sort: number
* }>>}
*/
export const certificatetemplateTemplateplaceholdersGet = (data) => {
return http.get('/certificatetemplate/templateplaceholders', { params: data });
};
/**
* 删除模板(支持批量)
* @param {Object} data - 删除参数
* @param {Array<number>} data.ids - 模板ID数组
*/
export const certificatetemplateTemplateDelete = (data) => {
return http.delete('/certificatetemplate/template', { data });
};

View File

@ -0,0 +1,130 @@
import { BaseApi } from '../baseApi';
import { http } from '../../utils/request';
// ==================== 证书管理 ====================
/**
* 证书分页查询
* @param {Object} data - 查询参数
* @param {number} [data.pageNo] - 当前页码
* @param {number} [data.pageSize] - 每页条数
* @param {string} [data.name] - 证书名称 (模糊查询)
* @param {string} [data.code] - 证书编码
* @param {string} [data.status] - 状态 (Enable=启用, Disable=禁用)
* @returns {Promise<{
* pageNo: number,
* pageSize: number,
* pages: number,
* total: number,
* rows: Array<{
* id: number,
* name: string,
* code: string,
* templateId: number,
* remark: string,
* status: string,
* sort: number,
* createdTime: string
* }>
* }>}
*/
export const certificatePageGet = (data) => {
return http.post('/certificate/page', data);
};
/**
* 添加证书
* @param {Object} data - 证书信息
* @param {string} data.name - 证书名称
* @param {string} data.code - 证书编码
* @param {number} data.templateId - 模板ID
* @param {string} [data.remark] - 备注说明
* @param {string} [data.status] - 状态 (Enable=启用, Disable=禁用,默认Enable)
* @param {number} [data.sort] - 排序号
*/
export const certificateAddPost = (data) => {
return http.post('/certificate', data);
};
/**
* 更新证书
* @param {Object} data - 证书信息
* @param {number} data.id - 证书ID
* @param {string} data.name - 证书名称
* @param {string} data.code - 证书编码
* @param {number} data.templateId - 模板ID
* @param {string} [data.remark] - 备注说明
* @param {string} [data.status] - 状态 (Enable=启用, Disable=禁用)
* @param {number} [data.sort] - 排序号
*/
export const certificateEditPut = (data) => {
return http.put('/certificate', data);
};
/**
* 批量删除证书
* @param {Object} data - 删除参数
* @param {Array<number>} data.ids - 证书ID数组
*/
export const certificateDelete = (data) => {
return http.delete('/certificate', { data });
};
/**
* 获取证书详情
* @param {Object} data - 请求参数
* @param {number} data.id - 证书ID
* @returns {Promise<{
* id: number,
* name: string,
* code: string,
* templateId: number,
* remark: string,
* status: string,
* sort: number,
* createdTime: string,
* template: {
* id: number,
* version: number,
* templateType: string,
* docxTemplateUrl: string,
* isActive: boolean,
* status: string,
* createdTime: string,
* placeholders: Array<{
* id: number,
* templateId: number,
* placeholderKey: string,
* displayName: string,
* placeholderType: string,
* defaultValue: string,
* isRequired: boolean,
* validationRule: string,
* description: string,
* sort: number
* }>
* }
* }>}
*/
export const certificateDetailPost = (data) => {
return http.post('/certificate/detail', data);
};
/**
* 删除单个证书
* @param {Object} data - 删除参数
* @param {number} data.id - 证书ID
*/
export const certificateDeleteDelete = (data) => {
return http.delete('/certificate/delete', { data });
};
/**
* 修改证书状态
* @param {Object} data - 状态参数
* @param {number} data.id - 证书ID
* @param {string} data.status - 状态 (Enable=启用, Disable=禁用)
*/
export const certificateSetstatusPatch = (data) => {
return http.patch('/certificate/setstatus', data);
};

116
src/api/match/coupon.js Normal file
View File

@ -0,0 +1,116 @@
import { BaseApi } from '../baseApi';
import { http } from '../../utils/request';
// ==================== 优惠券管理 ====================
/**
* 优惠券分页查询
* @param {Object} data - 查询参数
* @param {number} [data.pageNo] - 当前页码
* @param {number} [data.pageSize] - 每页条数
* @param {string} [data.name] - 优惠券名称 (模糊查询)
* @param {number} [data.type] - 优惠券类型 (1:满减券, 2:折扣券, 3:代金券)
* @returns {Promise<{
* pageNo: number,
* pageSize: number,
* pages: number,
* total: number,
* rows: Array<{
* id: number,
* name: string,
* type: number,
* value: number,
* startTime: string,
* endTime: string,
* eventNames: string,
* eventIds: Array<number>,
* redemptionCode: string,
* totalQuantity: number,
* claimedQuantity: number,
* usedQuantity: number,
* createdTime: string
* }>,
* totalPage: number
* }>}
*/
export const couponPage = (data) => {
return http.post('/coupon/page', data);
};
/**
* 添加优惠券
* @param {Object} data - 优惠券信息
* @param {string} data.name - 优惠券名称
* @param {number} data.type - 优惠券类型 (1:满减券, 2:折扣券, 3:代金券)
* @param {number} data.value - 优惠券面值
* @param {string} data.startTime - 开始时间 (格式:2026-03-08T18:23:19.664Z)
* @param {string} data.endTime - 结束时间 (格式:2026-03-08T18:23:19.664Z)
* @param {Array<number>} data.eventIds - 适用赛事ID列表
* @param {number} data.totalQuantity - 总数量
*/
export const couponAdd = (data) => {
return http.post('/coupon', data);
};
/**
* 更新优惠券
* @param {Object} data - 优惠券信息
* @param {number} data.id - 优惠券ID
* @param {string} data.name - 优惠券名称
* @param {number} data.type - 优惠券类型 (1:满减券, 2:折扣券, 3:代金券)
* @param {number} data.value - 优惠券面值
* @param {string} data.startTime - 开始时间 (格式:2026-03-08T18:23:19.665Z)
* @param {string} data.endTime - 结束时间 (格式:2026-03-08T18:23:19.665Z)
* @param {Array<number>} data.eventIds - 适用赛事ID列表
* @param {number} data.totalQuantity - 总数量
*/
export const couponEdit = (data) => {
return http.put('/coupon', data);
};
/**
* 批量删除优惠券
* @param {Array<number>} data - 优惠券ID数组
*/
export const couponDelete = (data) => {
return http.delete('/coupon', { data });
};
/**
* 生成兑换码
* @param {number} id - 优惠券ID (路径参数)
* @returns {Promise<string>} - 生成的兑换码
*/
export const couponGeneratecodePost = (id) => {
return http.post(`/coupon/generatecode/${id}`);
};
/**
* 获取赛事列表(下拉选择用)
* @returns {Promise<Array<{
* id: number,
* name: string
* }>>}
*/
export const couponEventlistGet = () => {
return http.get('/coupon/eventlist');
};
/**
* 删除单个优惠券
* @param {Object} data - 删除参数
* @param {number} data.id - 优惠券ID
*/
export const couponDeleteDelete = (data) => {
return http.delete('/coupon/delete', { data });
};
/**
* 修改优惠券状态
* @param {Object} data - 状态参数
* @param {number} data.id - 优惠券ID
* @param {string} data.status - 状态 (Enable=启用, Disable=禁用)
*/
export const couponSetstatusPatch = (data) => {
return http.patch('/coupon/setstatus', data);
};

106
src/api/match/merchant.js Normal file
View File

@ -0,0 +1,106 @@
import { BaseApi } from '../baseApi';
import { http } from '../../utils/request';
// ==================== 商户管理 ====================
/**
* 商户分页查询
* @param {Object} params - 查询参数
* @param {string} [params.MerchantName] - 商户名称
* @param {string} [params.ContactPhone] - 联系电话
* @param {string} [params.AuditStatus] - 审核状态 (PendingSubmission=待提交, PendingAudit=待审核, Approved=审核通过, Rejected=驳回)
* @param {string} [params.StartTime] - 开始时间
* @param {string} [params.EndTime] - 结束时间
* @param {number} [params.PageNo] - 页码
* @param {number} [params.PageSize] - 每页条数
*/
export const merchantPageGet = (params) => {
return http.get('/merchant/page', {params});
};
/**
* 添加商户
* @param {Object} data - 商户信息
* @param {string} data.merchantName - 商户名称
* @param {string} data.creditCode - 统一信用代码
* @param {string} data.bankName - 开户银行
* @param {string} data.accountNumber - 银行账号
* @param {string} data.businessLicenseUrl - 营业执照URL
* @param {string} data.contactPhone - 联系电话
*/
export const merchantAddPost = (data) => {
return http.post('/merchant/add', data);
};
/**
* 更新商户
* @param {Object} data - 商户信息
* @param {string} data.merchantName - 商户名称
* @param {string} data.creditCode - 统一信用代码
* @param {string} data.bankName - 开户银行
* @param {string} data.accountNumber - 银行账号
* @param {string} data.businessLicenseUrl - 营业执照URL
* @param {string} data.contactPhone - 联系电话
* @param {number} data.id - 商户ID
*/
export const merchantEditPut = (data) => {
return http.put('/merchant/edit', data);
};
/**
* 删除商户(支持批量)
* @param {Array<number>} data - 商户ID数组
*/
export const merchantDeletePost = (data) => {
return http.post('/merchant/delete', data);
};
/**
* 删除商户
* @param {Object} data - 删除参数
* @param {number} data.id - 商户ID
*/
export const merchantDeleteDelete = (data) => {
return http.delete('/merchant/delete', { data });
};
/**
* 获取商户详情
* @param {Object} params - 查询参数
* @param {number} params.id - 商户ID
*/
export const merchantDetailGet = (params) => {
return http.get('/merchant/detail', params);
};
/**
* 审核商户
* @param {Object} data - 审核参数
* @param {Array<number>} data.ids - 商户ID数组
* @param {string} data.status - 审核状态 (PendingSubmission=待提交, PendingAudit=待审核, Approved=审核通过, Rejected=驳回)
* @param {string} [data.remark] - 审核备注
*/
export const merchantAuditPost = (data) => {
return http.post('/merchant/audit', data);
};
/**
* 发放优惠券
* @param {Object} data - 发放参数
* @param {Array<number>} data.merchantIds - 商户ID数组
* @param {number} data.couponId - 优惠券ID
* @param {number} data.count - 发放数量
*/
export const merchantIssuecouponPost = (data) => {
return http.post('/merchant/issuecoupon', data);
};
/**
* 修改状态
* @param {Object} data - 状态参数
* @param {number} data.id - 商户ID
* @param {string} data.status - 状态 (Enable=启用, Disable=禁用)
*/
export const merchantSetstatusPatch = (data) => {
return http.patch('/merchant/setstatus', data);
};

98
src/api/match/project.js Normal file
View File

@ -0,0 +1,98 @@
import { BaseApi } from '../baseApi';
import { http } from '../../utils/request';
// ==================== 项目管理 ====================
/**
* 项目分页查询
* @param {Object} params - 查询参数
* @param {number} [params.EventId] - 赛事ID
* @param {string} [params.ProjectName] - 项目名称 (模糊查询)
* @param {number} [params.ProjectTypeId] - 项目类型ID
* @param {number} [params.PageNo] - 当前页码
* @param {number} [params.PageSize] - 页码容量
*/
export const projectPageGet = (params) => {
return http.post('/project/page', {params});
};
/**
* 添加项目
* @param {Object} data - 项目信息
* @param {number} data.eventId - 赛事ID
* @param {string} data.name - 项目名称
* @param {number} data.projectTypeId - 项目类型ID
* @param {number} data.completionCount - 完成人数
* @param {number} data.fee - 费用
* @param {number} data.durationMinutes - 时长(分钟)
* @param {number} data.durationSeconds - 时长(秒)
* @param {number} data.venueCount - 场地数量
* @param {number} data.sortIndex - 排序索引
* @param {Array<Object>} data.groups - 组别信息列表
* @param {string} data.groups[].groupName - 组别名称
* @param {string} data.groups[].birthDateStart - 出生日期开始 (格式:2026-03-08T16:08:27.652Z)
* @param {string} data.groups[].birthDateEnd - 出生日期结束 (格式:2026-03-08T16:08:27.652Z)
* @param {string} data.groups[].gender - 性别 (Male=男, Female=女, Mixed=混合)
*/
export const projectAddPost = (data) => {
return http.post('/project/add', data);
};
/**
* 更新项目
* @param {Object} data - 项目信息
* @param {number} data.id - 项目ID
* @param {number} data.eventId - 赛事ID
* @param {string} data.name - 项目名称
* @param {number} data.projectTypeId - 项目类型ID
* @param {number} data.completionCount - 完成次数/达标次数
* @param {number} data.fee - 费用
* @param {number} data.durationMinutes - 时长(分钟)
* @param {number} data.durationSeconds - 时长(秒)
* @param {number} data.venueCount - 场地数量
* @param {number} data.sortIndex - 排序索引
* @param {Array<Object>} data.groups - 组别信息列表
* @param {string} data.groups[].groupName - 组别名称
* @param {string} data.groups[].birthDateStart - 出生日期开始 (格式:2026-03-08T16:08:27.653Z)
* @param {string} data.groups[].birthDateEnd - 出生日期结束 (格式:2026-03-08T16:08:27.653Z)
* @param {string} data.groups[].gender - 性别 (Male=男, Female=女, Mixed=混合)
*/
export const projectEditPut = (data) => {
return http.put('/project/edit', data);
};
/**
* 删除项目(支持批量)
* @param {Array<number>} data - 项目ID数组
*/
export const projectDeletePost = (data) => {
return http.post('/project/delete', data);
};
/**
* 删除项目
* @param {Object} data - 删除参数
* @param {number} data.id - 项目ID
*/
export const projectDeleteDelete = (data) => {
return http.delete('/project/delete', { data });
};
/**
* 获取项目详情
* @param {Object} params - 查询参数
* @param {number} params.id - 项目ID
*/
export const projectDetailGet = (params) => {
return http.get('/project/detail', params);
};
/**
* 修改项目状态
* @param {Object} data - 状态参数
* @param {number} data.id - 项目ID
* @param {string} data.status - 状态 (Enable=启用, Disable=禁用)
*/
export const projectSetstatusPatch = (data) => {
return http.patch('/project/setstatus', data);
};

View File

@ -61,8 +61,13 @@ export const useTable = (
if (!api) return;
try {
state.loading = true;
// 先把初始化参数和分页参数放到总参数里面
Object.assign(state.totalParam, initParam, isPageable ? pageParam.value : {});
// console.log('我是分页参数', pageParam.value);
// console.log('我是总参数', state.totalParam);
// console.log('我是查询参数', state.searchParam);
let { data } = await api({ ...state.searchInitParam, ...state.totalParam });
dataCallBack && (data = dataCallBack(data));
state.tableData = isPageable ? data.rows ?? data.items : data;

View File

@ -1,29 +1,27 @@
<template>
<div class="system-menu-container layout-padding">
<ProTable ref="tableRef" :request-api="SysMenuApi.page" :columns="columns" :pagination="false"
<ProTable ref="tableRef" :request-api="certificatePageGet" :columns="columns" :pagination="true"
:tool-button="false">
<template #tools>
<el-button v-auth="'sysmenu:add'" type="primary" icon="ele-Plus" @click="onOpenMenu"> 新增 </el-button>
<el-button v-auth="'certificate:add'" type="primary" icon="ele-Plus" @click="onOpenMenu"> 新增 </el-button>
</template>
<template #index="scope">
{{ scope.$index + 1 }}
</template>
<template #name="scope">
<span class="ml10">{{ $t(scope.row.name) }}</span>
<template #remark="scope">
<img :src="scope.row.remark" style="width: 100px;" />
</template>
<template #img="scope">
<img :src="scope.row.img" class="img" />
</template>
<template #status="scope">
<!-- <template #status="scope">
<el-tag :type="scope.row.status === 0 ? 'success' : 'danger'"> {{ scope.row.status === 0 ? '启用' : '禁用'
}}</el-tag>
</template>
</template> -->
<template #action="scope">
<el-button v-auth="'sysmenu:edit'" icon="ele-Edit" size="small" text type="primary"
<el-button v-auth="'certificate:edit'" icon="ele-Edit" size="small" text type="primary"
@click="onOpenMenu(scope.row.id)"> 编辑 </el-button>
<el-popconfirm title="确认删除吗?" @confirm="onDeleteMenu(scope.row.id)">
<template #reference>
<el-button v-auth="'sysmenu:delete'" icon="ele-Delete" size="small" text type="danger"> 删除
<el-button v-auth="'certificate:delete'" icon="ele-Delete" size="small" text type="danger"> 删除
</el-button>
</template>
</el-popconfirm>
@ -36,16 +34,16 @@
style="width: 80%;margin-bottom: 30px;max-width: 600px" v-if="isShowDialog">
<!-- 证书名称 -->
<el-form-item label="证书名称" prop="projectName" >
<el-input v-model="formData.projectName" placeholder="请输入项目名称"></el-input>
<el-form-item label="证书名称" prop="name" >
<el-input v-model="formData.name" placeholder="请输入证书名称"></el-input>
</el-form-item>
<!-- 证书模板 -->
<el-form-item label="证书模板" prop="fee">
<el-upload class="avatar-uploader" action=""
<el-form-item label="证书模板" prop="remark">
<el-upload class="avatar-uploader" action="/api/file/upload"
:show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="formData.fee" :src="formData.fee" class="avatar" />
<img v-if="formData.remark" :src="formData.remark" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
@ -70,25 +68,21 @@ import { ElMessage, ElForm } from 'element-plus';
import SysMenuApi from '/@/api/SysMenuApi';
import { auths } from '/@/utils/authFunction';
import ProTable from '/@/components/ProTable/index.vue';
import { certificatePageGet, certificateAddPost ,certificateEditPut ,certificateDeleteDelete} from '/@/api/match/certificate';
// 定义表单引用类型
const formRef = ref();
const formData = ref({
projectName: '30秒单摇',
projectType: 'personal_speed',
participantCount: '',
description: '',
fee: '100',
durationMinutes: '',
phone: '30'
name: '',
remark: '',
})
const formRules = ref({
projectName: [
name: [
{ required: true, message: '请输入证书名称', trigger: 'blur' }
],
fee: [
remark: [
{ required: true, message: '请上传证书模版', trigger: 'blur' }
],
@ -108,8 +102,8 @@ const columns = ref([
el: 'input',
},
},
{ prop: 'img', label: '证书' },
{ prop: 'action', label: '操作', align: 'center', fixed: 'right', isShow: auths(['sysmenu:delete', 'sysmenu:edit']) },
{ prop: 'remark', label: '证书' },
{ prop: 'action', label: '操作', align: 'center', fixed: 'right', isShow: auths(['certificate:delete', 'certificate:edit']) },
]);
const isShowDialog = ref(false);
@ -118,13 +112,8 @@ const dialogTitle = ref('新增');
const onOpenMenu = (id) => {
dialogTitle.value = id ? '编辑' : '新增';
formData.value = {
projectName: '',
projectType: '',
participantCount: '',
description: '',
fee: '',
durationMinutes: '',
phone: ''
name: '',
remark: '',
};
isShowDialog.value = true;
};
@ -139,9 +128,8 @@ const onDeleteMenu = async (id) => {
}
};
const handleAvatarSuccess = ( response,
uploadFile) => {
formData.value.fee = URL.createObjectURL(uploadFile.raw)
const handleAvatarSuccess = (response,uploadFile) => {
formData.value.remark = response[0].url;
}
const beforeAvatarUpload = () => {
@ -163,23 +151,23 @@ const onSubmit = () => {
formRef.value.validate(async (valid) => {
if (!valid) return;
// try {
// let res;
// if (formData.value.id) {
// res = await SysMenuApi.add(formData.value);
// } else {
// res = await SysMenuApi.add(formData.value);
// }
try {
let res;
if (formData.value.id) {
res = await certificateEditPut(formData.value);
} else {
res = await certificateAddPost(formData.value);
}
// if (res.succeeded) {
// ElMessage.success(dialogTitle.value + '成功');
// isShowDialog.value = false;
// } else {
// ElMessage.error(res.errors);
// }
// } catch (error) {
// console.error(error);
// }
if (res.succeeded) {
ElMessage.success(dialogTitle.value + '成功');
isShowDialog.value = false;
} else {
ElMessage.error(res.errors);
}
} catch (error) {
console.error(error);
}
});
};

View File

@ -1,9 +1,8 @@
<template>
<div class="system-menu-container layout-padding">
<ProTable ref="tableRef" :request-api="SysMenuApi.page" :columns="columns" :pagination="false"
:tool-button="false">
<ProTable ref="tableRef" :request-api="couponPage" :columns="columns" :pagination="true" :tool-button="false" :initParam="initParam">
<template #tools>
<el-button v-auth="'sysmenu:add'" type="primary" icon="ele-Plus" @click="onOpenMenu"> 新增 </el-button>
<el-button v-auth="'coupon:add'" type="primary" icon="ele-Plus" @click="onOpenMenu()"> 新增 </el-button>
</template>
<template #index="scope">
{{ scope.$index + 1 }}
@ -13,63 +12,72 @@
<span class="ml10">{{ $t(scope.row.name) }}</span>
</template>
<template #type="scope">
<el-tag :type="scope.row.type === 0 ? '' : scope.row.type === 1 ? 'success' : 'danger'">
{{ scope.row.type === 0 ? '目录' : scope.row.type === 1 ? '菜单' : '按钮' }}</el-tag>
{{ scope.row.type == 1 ? '折扣券' : '代金券' }}
</template>
<template #status="scope">
<el-tag :type="scope.row.status === 0 ? 'success' : 'danger'"> {{ scope.row.status === 0 ? '启用' : '禁用'
}}</el-tag>
<template #startTime="scope">
{{ scope.row.startTime }} - {{ scope.row.endTime }}
</template>
<template #action="scope">
<el-button v-auth="'sysmenu:edit'" icon="ele-Edit" size="small" text type="primary"
@click="onOpenMenu(scope.row.id)"> 编辑 </el-button>
<el-button v-auth="'coupon:edit'" icon="ele-Edit" size="small" text type="primary"
@click="onOpenMenu(scope.row)"> 编辑 </el-button>
<el-popconfirm title="确认删除吗?" @confirm="onDeleteMenu(scope.row.id)">
<template #reference>
<el-button v-auth="'sysmenu:delete'" icon="ele-Delete" size="small" text type="danger"> 删除
<el-button v-auth="'coupon:delete'" icon="ele-Delete" size="small" text type="danger"> 删除
</el-button>
</template>
</el-popconfirm>
<el-button size="small" text type="primary" @click="getSdk(scope.row.id)"> 生成兑换码 </el-button>
</template>
</ProTable>
<!-- 弹窗 -->
<el-dialog title="新增" v-model="isShowDialog">
<el-dialog :title="dialogTitle" v-model="isShowDialog">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="150px"
style="max-width: 600px;margin-bottom: 30px;" v-if="isShowDialog">
<!-- 商户名称 -->
<el-form-item label="优惠券名称" prop="projectName">
<el-input v-model="formData.projectName" placeholder="请输入项目名称"></el-input>
<el-form-item label="优惠券名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入优惠券名称"></el-input>
</el-form-item>
<!-- 优惠券类型 -->
<el-form-item label="优惠券类型" prop="projectType">
<el-select v-model="formData.projectType" placeholder="请选择优惠券类型">
<el-option label="折扣" value="discount"></el-option>
<el-option label="定价" value="fixed"></el-option>
<el-form-item label="优惠券类型" prop="type">
<el-select v-model="formData.type" placeholder="请选择优惠券类型">
<el-option label="折扣" value="1"></el-option>
<el-option label="定价" value="2"></el-option>
</el-select>
</el-form-item>
<!-- 填写折扣 -->
<el-form-item label="填写折扣" prop="participantCount" v-if="formData.projectType === 'discount'">
<el-input v-model="formData.participantCount" placeholder="请输入折扣百分比">
<el-form-item label="填写折扣" prop="value" v-if="formData.type === '1'">
<el-input v-model="formData.value" placeholder="请输入折扣百分比">
<template #append>%</template>
</el-input>
</el-form-item>
<!-- 填写优惠金额 -->
<el-form-item label="填写优惠金额" prop="description" v-if="formData.projectType === 'fixed'">
<el-input v-model="formData.description" placeholder="请输入优惠金额" class="fee-input">
<el-form-item label="填写优惠金额" prop="value" v-if="formData.type === '2'">
<el-input v-model="formData.value" placeholder="请输入优惠金额" class="fee-input">
<template #append>元</template>
</el-input>
</el-form-item>
<!-- 选择有效期 -->
<el-form-item label="选择有效期" prop="startTime">
<el-date-picker type="daterange" v-model="formData.time" start-placeholder="开始日期"
end-placeholder="结束日期" style="width: 100%;" value-format="YYYY-MM-DD" @change="(val) => {
console.log('选择的日期范围:', val);
formData.startTime = val[0];
formData.endTime = val[1];
}"></el-date-picker>
</el-form-item>
<!-- 可用赛事 -->
<el-form-item label="可用赛事" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入费用" class="fee-input">
<template slot="append">元</template>
</el-input>
<el-select v-model="formData.eventIds" placeholder="请选择项目类型" multiple style="width: 100%;">
<el-option v-for="item in eventList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-form>
@ -89,32 +97,39 @@ import { ElMessage, ElForm } from 'element-plus';
import SysMenuApi from '/@/api/SysMenuApi';
import { auths } from '/@/utils/authFunction';
import ProTable from '/@/components/ProTable/index.vue';
import { couponPage, couponAdd, couponEdit, couponDelete, couponEventlistGet } from '/@/api/match/coupon';
// 定义表单引用类型
const formRef = ref();
const eventList = ref([]);
const formData = ref({
projectName: '30秒单摇',
projectType: 'discount',
participantCount: '',
description: '',
fee: '100',
durationMinutes: '',
phone: '30'
name: '',
type: '',
value: '',
startTime: '',
endTime: '',
eventIds: [],
totalQuantity: '',
time: '',
})
const initParam = ref(true)
const formRules = ref({
projectName: [
name: [
{ required: true, message: '请输入优惠券名称', trigger: 'blur' }
],
projectType: [
type: [
{ required: true, message: '请选择优惠券类型', trigger: 'change' }
],
participantCount: [
{ required: true, message: '请输入折扣百分比', trigger: 'blur' }
value: [
{ required: true, message: '请输入优惠额度', trigger: 'blur' }
],
description: [
{ required: true, message: '请输入优惠金额', trigger: 'blur' }
// description: [
// { required: true, message: '请输入优惠金额', trigger: 'blur' }
// ],
startTime: [
{ required: true, message: '请选择有效期', trigger: 'change' }
],
endTime: [
{ required: true, message: '请选择有效期', trigger: 'change' }
],
});
@ -132,28 +147,41 @@ const columns = ref([
el: 'input',
},
},
{prop: 'type',label: '优惠券类型',search: { el: 'select',},enum: [ { label: '全部', value: 0 }, { label: '折扣', value: 1 }, { label: '定价', value: 2 },]},
{prop: 'money',label: '详情',},
{ prop: 'code', label: '有效期' },
{ prop: 'img', label: '可用赛事' },
{ prop: 'type', label: '优惠券类型', search: { el: 'select', }, enum: [{ label: '全部', value: '' }, { label: '折扣', value: 1 }, { label: '定价', value: 2 },] },
{ prop: 'value', label: '详情', },
{ prop: 'startTime', label: '有效期' },
{ prop: 'eventNames', label: '可用赛事' },
{ prop: 'action', label: '操作', align: 'center', fixed: 'right', isShow: auths(['sysmenu:delete', 'sysmenu:edit']) },
{ prop: 'action', label: '操作', align: 'center', fixed: 'right', isShow: auths(['coupon:delete', 'coupon:edit']) },
]);
const isShowDialog = ref(false);
const dialogTitle = ref('新增');
const onOpenMenu = (id) => {
dialogTitle.value = id ? '编辑' : '新增';
formData.value = {
projectName: '',
projectType: '',
participantCount: '',
description: '',
fee: '',
durationMinutes: '',
phone: ''
};
const onOpenMenu = async (row) => {
console.log('打开菜单,数据:', row);
if (eventList.value.length === 0) {
const { data } = await couponEventlistGet();
eventList.value = data;
}
dialogTitle.value = row ? '编辑' : '新增';
if (row) {
// const { data } = await couponEdit(row.id);
formData.value = row;
formData.value.time = [row.startTime.slice(0,10) , row.endTime.slice(0,10)];
} else {
formData.value = {
name: '',
type: '',
value: '',
startTime: '',
endTime: '',
eventIds: [],
totalQuantity: '',
time: ''
};
}
isShowDialog.value = true;
};
@ -167,23 +195,6 @@ const onDeleteMenu = async (id) => {
}
};
const handleAvatarSuccess = ( response,
uploadFile) => {
formData.value.fee = URL.createObjectURL(uploadFile.raw)
}
const beforeAvatarUpload = () => {
// if (rawFile.type !== 'image/jpeg') {
// ElMessage.error('Avatar picture must be JPG format!')
// return false
// } else if (rawFile.size / 1024 / 1024 > 2) {
// ElMessage.error('Avatar picture size can not exceed 2MB!')
// return false
// }
return true
}
// 表单提交
const onSubmit = () => {
if (!formRef.value) return;
@ -191,23 +202,24 @@ const onSubmit = () => {
formRef.value.validate(async (valid) => {
if (!valid) return;
// try {
// let res;
// if (formData.value.id) {
// res = await SysMenuApi.add(formData.value);
// } else {
// res = await SysMenuApi.add(formData.value);
// }
try {
let res;
if (formData.value.id) {
res = await couponEdit(formData.value);
} else {
res = await couponAdd(formData.value);
}
// if (res.succeeded) {
// ElMessage.success(dialogTitle.value + '成功');
// isShowDialog.value = false;
// } else {
// ElMessage.error(res.errors);
// }
// } catch (error) {
// console.error(error);
// }
if (res.succeeded) {
initParam.value = !initParam.value;
ElMessage.success(dialogTitle.value + '成功');
isShowDialog.value = false;
} else {
ElMessage.error(res.errors);
}
} catch (error) {
console.error(error);
}
});
};
@ -241,29 +253,27 @@ const onCancel = () => {
color: #909399;
font-size: 14px;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
text-align: center;
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
text-align: center;
}
</style>

View File

@ -1,36 +1,29 @@
<template>
<div class="system-menu-container layout-padding">
<ProTable ref="tableRef" :request-api="SysMenuApi.page" :columns="columns" :pagination="false"
<ProTable ref="tableRef" :request-api="projectPageGet" :columns="columns" :pagination="true"
:tool-button="false">
<template #tools>
<el-button v-auth="'sysmenu:add'" type="primary" icon="ele-Plus" @click="onOpenMenu"> 新增 </el-button>
<el-button v-auth="'project:add'" type="primary" icon="ele-Plus" @click="onOpenMenu"> 新增 </el-button>
</template>
<template #index="scope">
{{ scope.$index + 1 }}
</template>
<template #name="scope">
<SvgIcon :name="scope.row.icon" />
<span class="ml10">{{ $t(scope.row.name) }}</span>
</template>
<template #type="scope">
<el-tag :type="scope.row.type === 0 ? '' : scope.row.type === 1 ? 'success' : 'danger'">
{{ scope.row.type === 0 ? '目录' : scope.row.type === 1 ? '菜单' : '按钮' }}</el-tag>
</template>
<template #status="scope">
<el-tag :type="scope.row.status === 0 ? 'success' : 'danger'"> {{ scope.row.status === 0 ? '启用' : '禁用'
}}</el-tag>
<template #projectTypeId="scope">
{{ scope.row.projectTypeName }}
</template>
<template #action="scope">
<el-button v-auth="'sysmenu:edit'" icon="ele-Edit" size="small" text type="primary"
<el-button v-auth="'project:edit'" icon="ele-Edit" size="small" text type="primary"
@click="onOpenMenu(scope.row.id)"> 编辑 </el-button>
<el-popconfirm title="确认删除吗?" @confirm="onDeleteMenu(scope.row.id)">
<template #reference>
<el-button v-auth="'sysmenu:delete'" icon="ele-Delete" size="small" text type="danger"> 删除
<el-button v-auth="'project:delete'" icon="ele-Delete" size="small" text type="danger"> 删除
</el-button>
</template>
</el-popconfirm>
<el-button v-auth="'sysmenu:add'" size="small" text type="primary" @click="onOpenMenu(scope.row.id)">
<el-button v-auth="'project:detail'" size="small" text type="primary" @click="onOpenMenu(scope.row.id)">
查看详情 </el-button>
</template>
</ProTable>
@ -41,28 +34,23 @@
style="width: 70%;margin-bottom: 30px;" v-if="isShowDialog">
<!-- 项目名称 -->
<el-form-item label="项目名称:" prop="projectName">
<el-input v-model="formData.projectName" placeholder="请输入项目名称"></el-input>
<el-form-item label="项目名称:" prop="name">
<el-input v-model="formData.name" placeholder="请输入项目名称"></el-input>
</el-form-item>
<!-- 项目类型 -->
<el-form-item label="项目类型:" prop="projectType">
<el-select v-model="formData.projectType" placeholder="请选择项目类型" style="width: 100%;">
<el-option label="个人速度" value="personal_speed"></el-option>
<el-option label="个人花样" value="personal_endurance"></el-option>
<el-option label="团队速度" value="team_speed"></el-option>
<el-option label="团队花样" value="team_cooperation"></el-option>
<el-form-item label="项目类型:" prop="projectTypeId">
<el-select v-model="formData.projectTypeId" placeholder="请选择项目类型" style="width: 100%;">
<el-option label="个人速度" value="1003"></el-option>
<el-option label="个人花样" value="1004"></el-option>
<el-option label="团队速度" value="1001"></el-option>
<el-option label="团队花样" value="1002"></el-option>
</el-select>
</el-form-item>
<!-- 完成人数 -->
<el-form-item label="完成人数:" prop="participantCount">
<el-input v-model="formData.participantCount" placeholder="请输入完成人数"></el-input>
</el-form-item>
<!-- 项目描述(根据图片中的模糊区域推断) -->
<el-form-item label="项目描述:" prop="description">
<el-input type="textarea" v-model="formData.description" :rows="4" placeholder="请输入项目描述"></el-input>
<el-form-item label="完成人数:" prop="completionCount" v-if="formData.projectTypeId == 1001 || formData.projectTypeId == 1002">
<el-input v-model="formData.completionCount" placeholder="请输入完成人数"></el-input>
</el-form-item>
<!-- 费用 -->
@ -94,35 +82,36 @@
</div>
</template>
<script setup lang="ts" name="sysMenu">
<script setup name="project">
import { defineAsyncComponent, ref, reactive } from 'vue';
import { ElMessage, ElForm } from 'element-plus';
import SysMenuApi from '/@/api/SysMenuApi';
import { auths } from '/@/utils/authFunction';
import ProTable from '/@/components/ProTable/index.vue';
import { ColumnProps } from '/@/components/ProTable/interface';
import { projectPageGet, projectAddPost ,projectEditPut ,projectDeleteDelete} from '/@/api/match/project';
// 定义表单引用类型
const formRef = ref<InstanceType<typeof ElForm>>();
const formRef = ref();
const formData = ref({
projectName: '30秒单摇',
projectType: 'personal_speed',
participantCount: '',
description: '',
fee: '100',
durationMinutes: '',
durationSeconds: '30'
name: '',
projectTypeId: '',
completionCount: '',
fee: '',
durationMinutes: '0',
durationSeconds: '0'
})
const formRules = ref({
projectName: [
name: [
{ required: true, message: '请输入项目名称', trigger: 'blur' }
],
projectType: [
projectTypeId: [
{ required: true, message: '请选择项目类型', trigger: 'change' }
],
participantCount: [
completionCount: [
{ required: true, message: '请输入完成人数', trigger: 'blur' }
],
description: [
@ -139,7 +128,7 @@ const formRules = ref({
]
});
const columns = ref<ColumnProps[]>([
const columns = ref([
{
prop: 'index',
label: '序号',
@ -154,36 +143,38 @@ const columns = ref<ColumnProps[]>([
},
},
{
prop: 'type',
prop: 'projectTypeId',
label: '项目类型',
search: {
el: 'select',
},
enum: [
{ label: '全部', value: 0 },
{ label: '线上', value: 1 },
{ label: '线下', value: 2 },
{ label: '团队速度', value: 1001 },
{ label: '团队花样', value: 1002 },
{ label: '个人速度', value: 1003 },
{ label: '个人花样', value: 1004 },
],
},
{
prop: 'path',
prop: 'completionCount',
label: '完成人数',
},
{ prop: 'code', label: '费用' },
{ prop: 'fee', label: '费用(元)' },
{ prop: 'action', label: '操作', align: 'center', fixed: 'right', isShow: auths(['sysmenu:delete', 'sysmenu:edit', 'sysmenu:add']) },
{ prop: 'action', label: '操作', align: 'center', fixed: 'right', isShow: auths(['project:delete', 'project:edit', 'project:add']) },
]);
const isShowDialog = ref(false);
const dialogTitle = ref('新增');
const onOpenMenu = (id: number = 0) => {
const onOpenMenu = (id) => {
dialogTitle.value = id ? '编辑' : '新增';
formData.value = {
projectName: '',
projectType: '',
participantCount: '',
projectTypeId: '',
completionCount: '',
description: '',
fee: '',
durationMinutes: '',
@ -193,8 +184,8 @@ const onOpenMenu = (id: number = 0) => {
};
//删除菜单
const onDeleteMenu = async (id: number) => {
const { succeeded, errors } = await SysMenuApi.delete({ id });
const onDeleteMenu = async (id) => {
const { succeeded, errors } = await merchantDeleteDelete({ id });
if (succeeded) {
ElMessage.success('删除成功');
} else {
@ -209,23 +200,23 @@ const onSubmit = () => {
formRef.value.validate(async (valid) => {
if (!valid) return;
// try {
// let res;
// if (formData.value.id) {
// res = await SysMenuApi.add(formData.value);
// } else {
// res = await SysMenuApi.add(formData.value);
// }
try {
let res;
if (formData.value.id) {
res = await projectEditPut(formData.value);
} else {
res = await projectAddPost(formData.value);
}
// if (res.succeeded) {
// ElMessage.success(dialogTitle.value + '成功');
// isShowDialog.value = false;
// } else {
// ElMessage.error(res.errors);
// }
// } catch (error) {
// console.error(error);
// }
if (res.succeeded) {
ElMessage.success(dialogTitle.value + '成功');
isShowDialog.value = false;
} else {
ElMessage.error(res.errors);
}
} catch (error) {
console.error(error);
}
});
};

View File

@ -1,31 +1,26 @@
<template>
<div class="system-menu-container layout-padding">
<ProTable ref="tableRef" :request-api="SysMenuApi.page" :columns="columns" :pagination="false"
<ProTable ref="tableRef" :request-api="merchantPageGet" :columns="columns" :pagination="true" :initParam="initParam"
:tool-button="false">
<template #tools>
<el-button v-auth="'sysmenu:add'" type="primary" icon="ele-Plus" @click="onOpenMenu"> 新增 </el-button>
<el-button v-auth="'merchant:add'" type="primary" icon="ele-Plus" @click="onOpenMenu()"> 新增 </el-button>
</template>
<template #index="scope">
{{ scope.$index + 1 }}
</template>
<template #name="scope">
<SvgIcon :name="scope.row.icon" />
<span class="ml10">{{ $t(scope.row.name) }}</span>
</template>
<template #type="scope">
<el-tag :type="scope.row.type === 0 ? '' : scope.row.type === 1 ? 'success' : 'danger'">
{{ scope.row.type === 0 ? '目录' : scope.row.type === 1 ? '菜单' : '按钮' }}</el-tag>
<template #businessLicenseUrl="scope">
<el-image :src="scope.row.businessLicenseUrl" style="width: 100px;" fit="cover" />
</template>
<template #status="scope">
<el-tag :type="scope.row.status === 0 ? 'success' : 'danger'"> {{ scope.row.status === 0 ? '启用' : '禁用'
}}</el-tag>
</template>
<template #action="scope">
<el-button v-auth="'sysmenu:edit'" icon="ele-Edit" size="small" text type="primary"
@click="onOpenMenu(scope.row.id)"> 编辑 </el-button>
<el-button v-auth="'merchant:edit'" icon="ele-Edit" size="small" text type="primary"
@click="onOpenMenu(scope.row)"> 编辑 </el-button>
<el-popconfirm title="确认删除吗?" @confirm="onDeleteMenu(scope.row.id)">
<template #reference>
<el-button v-auth="'sysmenu:delete'" icon="ele-Delete" size="small" text type="danger"> 删除
<el-button v-auth="'merchant:delete'" icon="ele-Delete" size="small" text type="danger"> 删除
</el-button>
</template>
</el-popconfirm>
@ -33,44 +28,44 @@
</ProTable>
<!-- 弹窗 -->
<el-dialog title="新增" v-model="isShowDialog">
<el-dialog :title="dialogTitle" v-model="isShowDialog">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="200px"
style="max-width: 600px;margin-bottom: 30px;" v-if="isShowDialog">
<!-- 商户名称 -->
<el-form-item label="商户名称" prop="projectName">
<el-input v-model="formData.projectName" placeholder="请输入项目名称"></el-input>
<el-form-item label="商户名称" prop="merchantName">
<el-input v-model="formData.merchantName" placeholder="请输入商户名称"></el-input>
</el-form-item>
<!-- 统一社会信用代码 -->
<el-form-item label="统一社会信用代码" prop="projectType">
<el-input v-model="formData.projectType" placeholder="请输入项目名称"></el-input>
<el-form-item label="统一社会信用代码" prop="creditCode">
<el-input v-model="formData.creditCode" placeholder="请输入统一社会信用代码"></el-input>
</el-form-item>
<!-- 开户行 -->
<el-form-item label="开户行" prop="participantCount">
<el-input v-model="formData.participantCount" placeholder="请输入完成人数"></el-input>
<el-form-item label="开户行" prop="bankName">
<el-input v-model="formData.bankName" placeholder="请输入开户行"></el-input>
</el-form-item>
<!-- 账号 -->
<el-form-item label="账号" prop="description">
<el-input v-model="formData.description" placeholder="请输入项目描述"></el-input>
<el-form-item label="账号" prop="accountNumber">
<el-input v-model="formData.accountNumber" placeholder="请输入账号"></el-input>
</el-form-item>
<!-- 营业执照 -->
<el-form-item label="营业执照" prop="fee">
<el-upload class="avatar-uploader" action=""
:show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="formData.fee" :src="formData.fee" class="avatar" />
<el-form-item label="营业执照" prop="businessLicenseUrl">
<el-upload class="avatar-uploader" action="/api/file/upload" :show-file-list="false"
:on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="formData.businessLicenseUrl" :src="formData.businessLicenseUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
<Plus />
</el-icon>
</el-upload>
</el-form-item>
<!-- 费用 -->
<el-form-item label="联系电话" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入费用" class="fee-input">
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="formData.contactPhone" placeholder="请输入联系电话" class="fee-input">
<template slot="append">元</template>
</el-input>
</el-form-item>
@ -89,37 +84,40 @@
<script setup name="sysMenu">
import { defineAsyncComponent, ref, reactive } from 'vue';
import { ElMessage, ElForm } from 'element-plus';
import SysMenuApi from '/@/api/SysMenuApi';
import { merchantPageGet, merchantAddPost ,merchantEditPut ,merchantDeleteDelete} from '/@/api/match/merchant';
import { auths } from '/@/utils/authFunction';
import ProTable from '/@/components/ProTable/index.vue';
// 定义表单引用类型
const formRef = ref();
const initParam = ref({
refresh: false,
});
const formData = ref({
projectName: '30秒单摇',
projectType: 'personal_speed',
participantCount: '',
description: '',
fee: '100',
merchantName: '',
creditCode: '',
bankName: '',
accountNumber: '',
businessLicenseUrl: '',
durationMinutes: '',
phone: '30'
contactPhone: ''
})
const formRules = ref({
projectName: [
merchantName: [
{ required: true, message: '请输入商户名称', trigger: 'blur' }
],
projectType: [
{ required: true, message: '请选择统一社会信用代码', trigger: 'change' }
creditCode: [
{ required: true, message: '请选择统一社会信用代码', trigger: 'blur' }
],
participantCount: [
bankName: [
{ required: true, message: '请输入开户行', trigger: 'blur' }
],
description: [
accountNumber: [
{ required: true, message: '请输入账号', trigger: 'blur' }
],
fee: [
businessLicenseUrl: [
{ required: true, message: '请上传营业执照', trigger: 'blur' }
],
@ -132,90 +130,96 @@ const columns = ref([
align: 'center',
},
{
prop: 'name',
prop: 'merchantName',
label: '商户名称',
align: 'center',
search: {
el: 'input',
},
},
{prop: 'type',label: '统一社会信用代码',},
{prop: 'path',label: '开户行',},
{ prop: 'code', label: '账号' },
{ prop: 'img', label: '营业执照' },
{ prop: 'phone', label: '联系电话' },
{ prop: 'creditCode', label: '统一社会信用代码', },
{ prop: 'bankName', label: '开户行', },
{ prop: 'accountNumber', label: '账号' },
{ prop: 'businessLicenseUrl', label: '营业执照' },
{ prop: 'contactPhone', label: '联系电话' },
{ prop: 'action', label: '操作', align: 'center', fixed: 'right', isShow: auths(['sysmenu:delete', 'sysmenu:edit']) },
{ prop: 'action', label: '操作', align: 'center', fixed: 'right', isShow: auths(['merchant:delete', 'merchant:edit']) },
]);
const isShowDialog = ref(false);
const dialogTitle = ref('新增');
const onOpenMenu = (id) => {
dialogTitle.value = id ? '编辑' : '新增';
formData.value = {
projectName: '',
projectType: '',
participantCount: '',
description: '',
fee: '',
durationMinutes: '',
phone: ''
};
const onOpenMenu = (data) => {
console.log(data)
dialogTitle.value = data ? '编辑' : '新增';
if (data) {
formData.value = data;
} else {
formData.value = {
merchantName: '',
creditCode: '',
bankName: '',
accountNumber: '',
businessLicenseUrl: '',
phone: ''
};
}
isShowDialog.value = true;
};
//删除菜单
const onDeleteMenu = async (id) => {
const { succeeded, errors } = await SysMenuApi.delete({ id });
const { succeeded, errors } = await merchantDeleteDelete({ id });
if (succeeded) {
ElMessage.success('删除成功');
initParam.value.refresh = !initParam.value.refresh;
} else {
ElMessage.error(errors);
}
};
const handleAvatarSuccess = ( response,
uploadFile) => {
formData.value.fee = URL.createObjectURL(uploadFile.raw)
const handleAvatarSuccess = (response, uploadFile) => {
formData.value.businessLicenseUrl = response[0].url;
console.log(response, uploadFile)
}
const beforeAvatarUpload = () => {
// if (rawFile.type !== 'image/jpeg') {
// ElMessage.error('Avatar picture must be JPG format!')
// return false
// } else if (rawFile.size / 1024 / 1024 > 2) {
// ElMessage.error('Avatar picture size can not exceed 2MB!')
// return false
// }
return true
// if (rawFile.type !== 'image/jpeg') {
// ElMessage.error('Avatar picture must be JPG format!')
// return false
// } else if (rawFile.size / 1024 / 1024 > 2) {
// ElMessage.error('Avatar picture size can not exceed 2MB!')
// return false
// }
return true
}
// 表单提交
const onSubmit = () => {
console.log(formData.value)
if (!formRef.value) return;
formRef.value.validate(async (valid) => {
if (!valid) return;
try {
let res;
if (formData.value.id) {
res = await merchantEditPut(formData.value);
} else {
res = await merchantAddPost(formData.value);
}
// try {
// let res;
// if (formData.value.id) {
// res = await SysMenuApi.add(formData.value);
// } else {
// res = await SysMenuApi.add(formData.value);
// }
// if (res.succeeded) {
// ElMessage.success(dialogTitle.value + '成功');
// isShowDialog.value = false;
// } else {
// ElMessage.error(res.errors);
// }
// } catch (error) {
// console.error(error);
// }
if (res.succeeded) {
initParam.value.refresh = !initParam.value.refresh;
ElMessage.success(dialogTitle.value + '成功');
isShowDialog.value = false;
} else {
ElMessage.error(res.errors);
}
} catch (error) {
console.error(error);
}
});
};
@ -250,28 +254,30 @@ const onCancel = () => {
font-size: 14px;
}
.avatar {
width: 350px;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
text-align: center;
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
text-align: center;
}
</style>