feat(manage): 添加功能

- 新增活动管理相关的 API 接口和页面组件
- 实现活动列表查询、详情查看、添加、修改和删除功能- 添加活动管理页面的样式和布局
This commit is contained in:
liweijia 2024-12-16 10:14:07 +08:00
parent 1bc5f32806
commit 7ff3303cfd
31 changed files with 4387 additions and 14 deletions

View File

@ -98,14 +98,3 @@ export function getInfo(): AxiosPromise<UserInfo> {
method: 'get'
});
}
// 获取租户列表
export function getTenantList(): AxiosPromise<TenantInfo> {
return request({
url: '/auth/tenant/list',
headers: {
isToken: false
},
method: 'get'
});
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { ActivityVO, ActivityForm, ActivityQuery } from '@/api/manage/activity/types';
/**
*
* @param query
* @returns {*}
*/
export const listActivity = (query?: ActivityQuery): AxiosPromise<ActivityVO[]> => {
return request({
url: '/manage/activity/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getActivity = (id: string | number): AxiosPromise<ActivityVO> => {
return request({
url: '/manage/activity/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addActivity = (data: ActivityForm) => {
return request({
url: '/manage/activity',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateActivity = (data: ActivityForm) => {
return request({
url: '/manage/activity',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delActivity = (id: string | number | Array<string | number>) => {
return request({
url: '/manage/activity/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,226 @@
export interface ActivityVO {
/**
* ID
*/
id: string | number;
/**
*
*/
activityName: string;
/**
*
*/
activityDescription: string;
/**
*
*/
sortNum: number;
/**
*
*/
activityUserCount: number;
/**
*
*/
registrationCount: number;
/**
* 0- 1-
*/
isSelected: string;
/**
*
*/
activityTime: string;
/**
*
*/
registrationDeadline: string;
/**
*
*/
publisherAddress: string;
/**
*
*/
activityLocation: string;
/**
* 0- 1-
*/
paymentMethod: string;
/**
* 0- 1- 2-
*/
status: string;
/**
*
*/
createBy: number;
/**
*
*/
createTime: string;
/**
*
*/
updateBy: number;
/**
*
*/
updateTime: string;
}
export interface ActivityForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
*
*/
activityName?: string;
/**
*
*/
activityDescription?: string;
/**
*
*/
sortNum?: number;
/**
*
*/
activityUserCount?: number;
/**
*
*/
registrationCount?: number;
/**
* 0- 1-
*/
isSelected?: string;
/**
*
*/
activityTime?: string;
/**
*
*/
registrationDeadline?: string;
/**
*
*/
publisherAddress?: string;
/**
*
*/
activityLocation?: string;
/**
* 0- 1-
*/
paymentMethod?: string;
/**
* 0- 1- 2-
*/
status?: string;
}
export interface ActivityQuery extends PageQuery {
/**
*
*/
activityName?: string;
/**
*
*/
activityDescription?: string;
/**
*
*/
sortNum?: number;
/**
*
*/
activityUserCount?: number;
/**
*
*/
registrationCount?: number;
/**
* 0- 1-
*/
isSelected?: string;
/**
*
*/
activityTime?: string;
/**
*
*/
registrationDeadline?: string;
/**
*
*/
publisherAddress?: string;
/**
*
*/
activityLocation?: string;
/**
* 0- 1-
*/
paymentMethod?: string;
/**
* 0- 1- 2-
*/
status?: string;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { BannedVO, BannedForm, BannedQuery } from '@/api/manage/banned/types';
/**
*
* @param query
* @returns {*}
*/
export const listBanned = (query?: BannedQuery): AxiosPromise<BannedVO[]> => {
return request({
url: '/manage/banned/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getBanned = (id: string | number): AxiosPromise<BannedVO> => {
return request({
url: '/manage/banned/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addBanned = (data: BannedForm) => {
return request({
url: '/manage/banned',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateBanned = (data: BannedForm) => {
return request({
url: '/manage/banned',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delBanned = (id: string | number | Array<string | number>) => {
return request({
url: '/manage/banned/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,186 @@
export interface BannedVO {
/**
* ID
*/
id: string | number;
/**
* id
*/
contentId: string | number;
/**
* ID
*/
reportUserId: string | number;
/**
*
*/
reportReason: string;
/**
*
*/
reportDetails: string;
/**
* id
*/
informerUserId: string | number;
/**
*
*/
banReason: string;
/**
*
*/
banDays: number;
/**
* (0=,1=)
*/
handlingMethod: number;
/**
* (0=,1=)
*/
handlingStatus: number;
/**
* 1=,2=,3=,4=
*/
classify: number;
/**
*
*/
createTime: string;
/**
*
*/
updateBy: number;
/**
*
*/
updateTime: string;
}
export interface BannedForm extends BaseEntity {
/**
* id
*/
contentId?: string | number;
/**
* ID
*/
reportUserId?: string | number;
/**
*
*/
reportReason?: string;
/**
*
*/
reportDetails?: string;
/**
* id
*/
informerUserId?: string | number;
/**
*
*/
banReason?: string;
/**
*
*/
banDays?: number;
/**
* (0=,1=)
*/
handlingMethod?: number;
/**
* (0=,1=)
*/
handlingStatus?: number;
/**
* 1=,2=,3=,4=
*/
classify?: number;
}
export interface BannedQuery extends PageQuery {
/**
* id
*/
contentId?: string | number;
/**
* ID
*/
reportUserId?: string | number;
/**
*
*/
reportReason?: string;
/**
*
*/
reportDetails?: string;
/**
* id
*/
informerUserId?: string | number;
/**
*
*/
banReason?: string;
/**
*
*/
banDays?: number;
/**
* (0=,1=)
*/
handlingMethod?: number;
/**
* (0=,1=)
*/
handlingStatus?: number;
/**
* 1=,2=,3=,4=
*/
classify?: number;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { FeedbackVO, FeedbackForm, FeedbackQuery } from '@/api/manage/feedback/types';
/**
* App反馈列表
* @param query
* @returns {*}
*/
export const listFeedback = (query?: FeedbackQuery): AxiosPromise<FeedbackVO[]> => {
return request({
url: '/manage/feedback/list',
method: 'get',
params: query
});
};
/**
* App反馈详细
* @param id
*/
export const getFeedback = (id: string | number): AxiosPromise<FeedbackVO> => {
return request({
url: '/manage/feedback/' + id,
method: 'get'
});
};
/**
* App反馈
* @param data
*/
export const addFeedback = (data: FeedbackForm) => {
return request({
url: '/manage/feedback',
method: 'post',
data: data
});
};
/**
* App反馈
* @param data
*/
export const updateFeedback = (data: FeedbackForm) => {
return request({
url: '/manage/feedback',
method: 'put',
data: data
});
};
/**
* App反馈
* @param id
*/
export const delFeedback = (id: string | number | Array<string | number>) => {
return request({
url: '/manage/feedback/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,71 @@
export interface FeedbackVO {
/**
* ID
*/
id: string | number;
/**
* id
*/
userId: string | number;
/**
*
*/
remark: string;
/**
*
*/
contact: string;
/**
*
*/
createTime: string;
}
export interface FeedbackForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* id
*/
userId?: string | number;
/**
*
*/
remark?: string;
/**
*
*/
contact?: string;
}
export interface FeedbackQuery extends PageQuery {
/**
* id
*/
userId?: string | number;
/**
*
*/
contact?: string;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { IpImageVO, IpImageForm, IpImageQuery } from '@/api/manage/ipImage/types';
/**
* IP形象列表
* @param query
* @returns {*}
*/
export const listIpImage = (query?: IpImageQuery): AxiosPromise<IpImageVO[]> => {
return request({
url: '/manage/ipImage/list',
method: 'get',
params: query
});
};
/**
* IP形象详细
* @param id
*/
export const getIpImage = (id: string | number): AxiosPromise<IpImageVO> => {
return request({
url: '/manage/ipImage/' + id,
method: 'get'
});
};
/**
* IP形象
* @param data
*/
export const addIpImage = (data: IpImageForm) => {
return request({
url: '/manage/ipImage',
method: 'post',
data: data
});
};
/**
* IP形象
* @param data
*/
export const updateIpImage = (data: IpImageForm) => {
return request({
url: '/manage/ipImage',
method: 'put',
data: data
});
};
/**
* IP形象
* @param id
*/
export const delIpImage = (id: string | number | Array<string | number>) => {
return request({
url: '/manage/ipImage/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,66 @@
export interface IpImageVO {
/**
* ID
*/
id: string | number;
/**
* ip形象名称
*/
ipName: string;
/**
*
*/
shor: number;
/**
*
*/
createBy: number;
/**
*
*/
createTime: string;
}
export interface IpImageForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* ip形象名称
*/
ipName?: string;
/**
*
*/
shor?: number;
}
export interface IpImageQuery extends PageQuery {
/**
* ip形象名称
*/
ipName?: string;
/**
*
*/
shor?: number;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { OrdersVO, OrdersForm, OrdersQuery } from '@/api/manage/orders/types';
/**
*
* @param query
* @returns {*}
*/
export const listOrders = (query?: OrdersQuery): AxiosPromise<OrdersVO[]> => {
return request({
url: '/manage/orders/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getOrders = (id: string | number): AxiosPromise<OrdersVO> => {
return request({
url: '/manage/orders/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addOrders = (data: OrdersForm) => {
return request({
url: '/manage/orders',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateOrders = (data: OrdersForm) => {
return request({
url: '/manage/orders',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delOrders = (id: string | number | Array<string | number>) => {
return request({
url: '/manage/orders/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,240 @@
export interface OrdersVO {
/**
* ID
*/
id: string | number;
/**
*
*/
orderNumber: string;
/**
*
*/
source: string;
/**
*
*/
productName: string;
/**
*
*/
productImage: string;
/**
* Url
*/
productImageUrl: string;
/**
*
*/
productType: string;
/**
* id
*/
vendorId: string | number;
/**
*
*/
userNickname: string;
/**
*
*/
userAvatar: string;
/**
*
*/
userPhoneNumber: string;
/**
*
*/
shippingAddress: string;
/**
*
*/
orderStatus: number;
/**
*
*/
logisticsName: string;
/**
*
*/
logisticsNumber: string;
/**
*
*/
createTime: string;
/**
*
*/
remark: string;
}
export interface OrdersForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
*
*/
orderNumber?: string;
/**
*
*/
source?: string;
/**
*
*/
productName?: string;
/**
*
*/
productImage?: string;
/**
*
*/
productType?: string;
/**
* id
*/
vendorId?: string | number;
/**
*
*/
userNickname?: string;
/**
*
*/
userAvatar?: string;
/**
*
*/
userPhoneNumber?: string;
/**
*
*/
shippingAddress?: string;
/**
*
*/
orderStatus?: number;
/**
*
*/
logisticsName?: string;
/**
*
*/
logisticsNumber?: string;
/**
*
*/
remark?: string;
}
export interface OrdersQuery extends PageQuery {
/**
*
*/
orderNumber?: string;
/**
*
*/
source?: string;
/**
*
*/
productName?: string;
/**
*
*/
productImage?: string;
/**
*
*/
productType?: string;
/**
* id
*/
vendorId?: string | number;
/**
*
*/
userNickname?: string;
/**
*
*/
userAvatar?: string;
/**
*
*/
userPhoneNumber?: string;
/**
*
*/
shippingAddress?: string;
/**
*
*/
orderStatus?: number;
/**
*
*/
logisticsName?: string;
/**
*
*/
logisticsNumber?: string;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { ProductVO, ProductForm, ProductQuery } from '@/api/manage/product/types';
/**
*
* @param query
* @returns {*}
*/
export const listProduct = (query?: ProductQuery): AxiosPromise<ProductVO[]> => {
return request({
url: '/manage/product/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getProduct = (id: string | number): AxiosPromise<ProductVO> => {
return request({
url: '/manage/product/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addProduct = (data: ProductForm) => {
return request({
url: '/manage/product',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateProduct = (data: ProductForm) => {
return request({
url: '/manage/product',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delProduct = (id: string | number | Array<string | number>) => {
return request({
url: '/manage/product/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,155 @@
export interface ProductVO {
/**
* ID
*/
id: string | number;
/**
* id
*/
categoryId: string | number;
/**
*
*/
productName: string;
/**
*
*/
productImage: string;
/**
* Url
*/
productImageUrl: string;
/**
*
*/
productShows: string;
/**
* id
*/
vendorId: string | number;
/**
*
*/
sortOrder: number;
/**
*
*/
productStatus: string;
/**
*
*/
updateBy: number;
/**
*
*/
updateTime: string;
/**
*
*/
remark: string;
}
export interface ProductForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* id
*/
categoryId?: string | number;
/**
*
*/
productName?: string;
/**
*
*/
productImage?: string;
/**
*
*/
productShows?: string;
/**
* id
*/
vendorId?: string | number;
/**
*
*/
sortOrder?: number;
/**
*
*/
productStatus?: string;
/**
*
*/
remark?: string;
}
export interface ProductQuery extends PageQuery {
/**
* id
*/
categoryId?: string | number;
/**
*
*/
productName?: string;
/**
*
*/
productImage?: string;
/**
*
*/
productShows?: string;
/**
* id
*/
vendorId?: string | number;
/**
*
*/
sortOrder?: number;
/**
*
*/
productStatus?: string;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { ProductCategoryVO, ProductCategoryForm, ProductCategoryQuery } from '@/api/manage/productCategory/types';
/**
*
* @param query
* @returns {*}
*/
export const listProductCategory = (query?: ProductCategoryQuery): AxiosPromise<ProductCategoryVO[]> => {
return request({
url: '/manage/productCategory/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getProductCategory = (id: string | number): AxiosPromise<ProductCategoryVO> => {
return request({
url: '/manage/productCategory/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addProductCategory = (data: ProductCategoryForm) => {
return request({
url: '/manage/productCategory',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateProductCategory = (data: ProductCategoryForm) => {
return request({
url: '/manage/productCategory',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delProductCategory = (id: string | number | Array<string | number>) => {
return request({
url: '/manage/productCategory/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,76 @@
export interface ProductCategoryVO {
/**
* ID
*/
id: string | number;
/**
*
*/
category: string;
/**
*
*/
firstLevelCategoryOrder: number;
/**
*
*/
updateBy: number;
/**
*
*/
updateTime: string;
/**
*
*/
remark: string;
}
export interface ProductCategoryForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
*
*/
category?: string;
/**
*
*/
firstLevelCategoryOrder?: number;
/**
*
*/
remark?: string;
}
export interface ProductCategoryQuery extends PageQuery {
/**
*
*/
category?: string;
/**
*
*/
firstLevelCategoryOrder?: number;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { UserScoreVO, UserScoreForm, UserScoreQuery } from '@/api/manage/userScore/types';
/**
*
* @param query
* @returns {*}
*/
export const listUserScore = (query?: UserScoreQuery): AxiosPromise<UserScoreVO[]> => {
return request({
url: '/manage/userScore/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getUserScore = (id: string | number): AxiosPromise<UserScoreVO> => {
return request({
url: '/manage/userScore/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addUserScore = (data: UserScoreForm) => {
return request({
url: '/manage/userScore',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateUserScore = (data: UserScoreForm) => {
return request({
url: '/manage/userScore',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delUserScore = (id: string | number | Array<string | number>) => {
return request({
url: '/manage/userScore/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,86 @@
export interface UserScoreVO {
/**
* ID
*/
id: string | number;
/**
* ID
*/
userId: string | number;
/**
* id
*/
sourceId: string | number;
/**
* (0= 1= 2= 3= 4= 5= 6= 7=)
*/
source: number;
/**
*
*/
score: number;
}
export interface UserScoreForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* ID
*/
userId?: string | number;
/**
* id
*/
sourceId?: string | number;
/**
* (0= 1= 2= 3= 4= 5= 6= 7=)
*/
source?: number;
/**
*
*/
score?: number;
}
export interface UserScoreQuery extends PageQuery {
/**
* ID
*/
userId?: string | number;
/**
* id
*/
sourceId?: string | number;
/**
* (0= 1= 2= 3= 4= 5= 6= 7=)
*/
source?: number;
/**
*
*/
score?: number;
/**
*
*/
params?: any;
}

63
src/api/manage/vendor/index.ts vendored Normal file
View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { VendorVO, VendorForm, VendorQuery } from '@/api/manage/vendor/types';
/**
*
* @param query
* @returns {*}
*/
export const listVendor = (query?: VendorQuery): AxiosPromise<VendorVO[]> => {
return request({
url: '/manage/vendor/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getVendor = (id: string | number): AxiosPromise<VendorVO> => {
return request({
url: '/manage/vendor/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addVendor = (data: VendorForm) => {
return request({
url: '/manage/vendor',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateVendor = (data: VendorForm) => {
return request({
url: '/manage/vendor',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delVendor = (id: string | number | Array<string | number>) => {
return request({
url: '/manage/vendor/' + id,
method: 'delete'
});
};

91
src/api/manage/vendor/types.ts vendored Normal file
View File

@ -0,0 +1,91 @@
export interface VendorVO {
/**
* ID
*/
id: string | number;
/**
* id
*/
categoryId: string | number;
/**
*
*/
vendorName: string;
/**
*
*/
sort: number;
/**
*
*/
updateBy: number;
/**
*
*/
updateTime: string;
/**
*
*/
remark: string;
}
export interface VendorForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* id
*/
categoryId?: string | number;
/**
*
*/
vendorName?: string;
/**
*
*/
sort?: number;
/**
*
*/
remark?: string;
}
export interface VendorQuery extends PageQuery {
/**
* id
*/
categoryId?: string | number;
/**
*
*/
vendorName?: string;
/**
*
*/
sort?: number;
/**
*
*/
params?: any;
}

View File

@ -94,7 +94,6 @@ import useAppStore from '@/store/modules/app';
import useUserStore from '@/store/modules/user';
import useSettingsStore from '@/store/modules/settings';
import useNoticeStore from '@/store/modules/notice';
import { getTenantList } from '@/api/login';
import { dynamicClear, dynamicTenant } from '@/api/system/tenant';
import { TenantVO } from '@/api/types';
import notice from './notice/index.vue';

View File

@ -62,7 +62,7 @@
</template>
<script setup lang="ts">
import { getCodeImg, getTenantList } from '@/api/login';
import { getCodeImg } from '@/api/login';
import { authBinding } from '@/api/system/social/auth';
import { useUserStore } from '@/store/modules/user';
import { LoginData, TenantVO } from '@/api/types';

View File

@ -0,0 +1,380 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="活动名称" prop="activityName">
<el-input v-model="queryParams.activityName" placeholder="请输入活动名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="活动描述" prop="activityDescription">
<el-input v-model="queryParams.activityDescription" placeholder="请输入活动描述" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="排序顺序" prop="sortNum">
<el-input v-model="queryParams.sortNum" placeholder="请输入排序顺序" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="活动人数" prop="activityUserCount">
<el-input v-model="queryParams.activityUserCount" placeholder="请输入活动人数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="报名人数" prop="registrationCount">
<el-input v-model="queryParams.registrationCount" placeholder="请输入报名人数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="挑选玩友 0-不挑选 1-挑选" prop="isSelected">
<el-input v-model="queryParams.isSelected" placeholder="请输入挑选玩友 0-不挑选 1-挑选" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="活动时间" prop="activityTime">
<el-date-picker clearable
v-model="queryParams.activityTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择活动时间"
/>
</el-form-item>
<el-form-item label="报名截止时间" prop="registrationDeadline">
<el-date-picker clearable
v-model="queryParams.registrationDeadline"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择报名截止时间"
/>
</el-form-item>
<el-form-item label="发布者地址" prop="publisherAddress">
<el-input v-model="queryParams.publisherAddress" placeholder="请输入发布者地址" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="活动地点" prop="activityLocation">
<el-input v-model="queryParams.activityLocation" placeholder="请输入活动地点" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收费方式 0-免费 1-发起人收款" prop="paymentMethod">
<el-input v-model="queryParams.paymentMethod" placeholder="请输入收费方式 0-免费 1-发起人收款" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:activity:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:activity:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:activity:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:activity:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="activityList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="唯一标识ID" align="center" prop="id" v-if="true" />
<el-table-column label="活动名称" align="center" prop="activityName" />
<el-table-column label="活动描述" align="center" prop="activityDescription" />
<el-table-column label="排序顺序" align="center" prop="sortNum" />
<el-table-column label="活动人数" align="center" prop="activityUserCount" />
<el-table-column label="报名人数" align="center" prop="registrationCount" />
<el-table-column label="挑选玩友 0-不挑选 1-挑选" align="center" prop="isSelected" />
<el-table-column label="活动时间" align="center" prop="activityTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.activityTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="报名截止时间" align="center" prop="registrationDeadline" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.registrationDeadline, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="发布者地址" align="center" prop="publisherAddress" />
<el-table-column label="活动地点" align="center" prop="activityLocation" />
<el-table-column label="收费方式 0-免费 1-发起人收款" align="center" prop="paymentMethod" />
<el-table-column label="发布状态 0-未发布 1-审核中 2-发布" align="center" prop="status" />
<el-table-column label="发布者" align="center" prop="createBy" />
<el-table-column label="发布时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作者" align="center" prop="updateBy" />
<el-table-column label="操作时间" align="center" prop="updateTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:activity:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:activity:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改活动信息对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="activityFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="活动名称" prop="activityName">
<el-input v-model="form.activityName" placeholder="请输入活动名称" />
</el-form-item>
<el-form-item label="活动描述" prop="activityDescription">
<el-input v-model="form.activityDescription" placeholder="请输入活动描述" />
</el-form-item>
<el-form-item label="排序顺序" prop="sortNum">
<el-input v-model="form.sortNum" placeholder="请输入排序顺序" />
</el-form-item>
<el-form-item label="活动人数" prop="activityUserCount">
<el-input v-model="form.activityUserCount" placeholder="请输入活动人数" />
</el-form-item>
<el-form-item label="报名人数" prop="registrationCount">
<el-input v-model="form.registrationCount" placeholder="请输入报名人数" />
</el-form-item>
<el-form-item label="挑选玩友 0-不挑选 1-挑选" prop="isSelected">
<el-input v-model="form.isSelected" placeholder="请输入挑选玩友 0-不挑选 1-挑选" />
</el-form-item>
<el-form-item label="活动时间" prop="activityTime">
<el-date-picker clearable
v-model="form.activityTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择活动时间">
</el-date-picker>
</el-form-item>
<el-form-item label="报名截止时间" prop="registrationDeadline">
<el-date-picker clearable
v-model="form.registrationDeadline"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择报名截止时间">
</el-date-picker>
</el-form-item>
<el-form-item label="发布者地址" prop="publisherAddress">
<el-input v-model="form.publisherAddress" placeholder="请输入发布者地址" />
</el-form-item>
<el-form-item label="活动地点" prop="activityLocation">
<el-input v-model="form.activityLocation" placeholder="请输入活动地点" />
</el-form-item>
<el-form-item label="收费方式 0-免费 1-发起人收款" prop="paymentMethod">
<el-input v-model="form.paymentMethod" placeholder="请输入收费方式 0-免费 1-发起人收款" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Activity" lang="ts">
import { listActivity, getActivity, delActivity, addActivity, updateActivity } from '@/api/manage/activity';
import { ActivityVO, ActivityQuery, ActivityForm } from '@/api/manage/activity/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const activityList = ref<ActivityVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const activityFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: ActivityForm = {
id: undefined,
activityName: undefined,
activityDescription: undefined,
sortNum: undefined,
activityUserCount: undefined,
registrationCount: undefined,
isSelected: undefined,
activityTime: undefined,
registrationDeadline: undefined,
publisherAddress: undefined,
activityLocation: undefined,
paymentMethod: undefined,
status: undefined,
}
const data = reactive<PageData<ActivityForm, ActivityQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
activityName: undefined,
activityDescription: undefined,
sortNum: undefined,
activityUserCount: undefined,
registrationCount: undefined,
isSelected: undefined,
activityTime: undefined,
registrationDeadline: undefined,
publisherAddress: undefined,
activityLocation: undefined,
paymentMethod: undefined,
status: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "唯一标识ID不能为空", trigger: "blur" }
],
activityName: [
{ required: true, message: "活动名称不能为空", trigger: "blur" }
],
activityDescription: [
{ required: true, message: "活动描述不能为空", trigger: "blur" }
],
sortNum: [
{ required: true, message: "排序顺序不能为空", trigger: "blur" }
],
activityUserCount: [
{ required: true, message: "活动人数不能为空", trigger: "blur" }
],
registrationCount: [
{ required: true, message: "报名人数不能为空", trigger: "blur" }
],
isSelected: [
{ required: true, message: "挑选玩友 0-不挑选 1-挑选不能为空", trigger: "blur" }
],
activityTime: [
{ required: true, message: "活动时间不能为空", trigger: "blur" }
],
registrationDeadline: [
{ required: true, message: "报名截止时间不能为空", trigger: "blur" }
],
publisherAddress: [
{ required: true, message: "发布者地址不能为空", trigger: "blur" }
],
activityLocation: [
{ required: true, message: "活动地点不能为空", trigger: "blur" }
],
paymentMethod: [
{ required: true, message: "收费方式 0-免费 1-发起人收款不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "发布状态 0-未发布 1-审核中 2-发布不能为空", trigger: "change" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询活动信息列表 */
const getList = async () => {
loading.value = true;
const res = await listActivity(queryParams.value);
activityList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
activityFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: ActivityVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加活动信息";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: ActivityVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getActivity(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改活动信息";
}
/** 提交按钮 */
const submitForm = () => {
activityFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateActivity(form.value).finally(() => buttonLoading.value = false);
} else {
await addActivity(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: ActivityVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除活动信息编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delActivity(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/activity/export', {
...queryParams.value
}, `activity_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,354 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="被举报内容id" prop="contentId">
<el-input v-model="queryParams.contentId" placeholder="请输入被举报内容id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="被举报用户ID" prop="reportUserId">
<el-input v-model="queryParams.reportUserId" placeholder="请输入被举报用户ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="举报理由" prop="reportReason">
<el-input v-model="queryParams.reportReason" placeholder="请输入举报理由" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="举报详细信息" prop="reportDetails">
<el-input v-model="queryParams.reportDetails" placeholder="请输入举报详细信息" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="举报人id" prop="informerUserId">
<el-input v-model="queryParams.informerUserId" placeholder="请输入举报人id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="封禁理由" prop="banReason">
<el-input v-model="queryParams.banReason" placeholder="请输入封禁理由" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="封禁天数" prop="banDays">
<el-input v-model="queryParams.banDays" placeholder="请输入封禁天数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="处理方式(0=未处理,1=已下架)" prop="handlingMethod">
<el-select v-model="queryParams.handlingMethod" placeholder="请选择处理方式(0=未处理,1=已下架)" clearable >
<el-option v-for="dict in dy_banned_handling_method" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="状态(0=已发布,1=已下架)" prop="handlingStatus">
<el-select v-model="queryParams.handlingStatus" placeholder="请选择状态(0=已发布,1=已下架)" clearable >
<el-option v-for="dict in dy_banned_handling_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="1=用户,2=笔记,3=活动,4=评论" prop="classify">
<el-input v-model="queryParams.classify" placeholder="请输入1=用户,2=笔记,3=活动,4=评论" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:banned:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:banned:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:banned:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:banned:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="bannedList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="唯一标识ID" align="center" prop="id" v-if="true" />
<el-table-column label="被举报内容id" align="center" prop="contentId" />
<el-table-column label="被举报用户ID" align="center" prop="reportUserId" />
<el-table-column label="举报理由" align="center" prop="reportReason" />
<el-table-column label="举报详细信息" align="center" prop="reportDetails" />
<el-table-column label="举报人id" align="center" prop="informerUserId" />
<el-table-column label="封禁理由" align="center" prop="banReason" />
<el-table-column label="封禁天数" align="center" prop="banDays" />
<el-table-column label="处理方式(0=未处理,1=已下架)" align="center" prop="handlingMethod">
<template #default="scope">
<dict-tag :options="dy_banned_handling_method" :value="scope.row.handlingMethod"/>
</template>
</el-table-column>
<el-table-column label="状态(0=已发布,1=已下架)" align="center" prop="handlingStatus">
<template #default="scope">
<dict-tag :options="dy_banned_handling_status" :value="scope.row.handlingStatus"/>
</template>
</el-table-column>
<el-table-column label="1=用户,2=笔记,3=活动,4=评论" align="center" prop="classify" />
<el-table-column label="举报时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作人" align="center" prop="updateBy" />
<el-table-column label="操作时间" align="center" prop="updateTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:banned:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:banned:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改举报对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="bannedFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="被举报内容id" prop="contentId">
<el-input v-model="form.contentId" placeholder="请输入被举报内容id" />
</el-form-item>
<el-form-item label="被举报用户ID" prop="reportUserId">
<el-input v-model="form.reportUserId" placeholder="请输入被举报用户ID" />
</el-form-item>
<el-form-item label="举报理由" prop="reportReason">
<el-input v-model="form.reportReason" placeholder="请输入举报理由" />
</el-form-item>
<el-form-item label="举报详细信息" prop="reportDetails">
<el-input v-model="form.reportDetails" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="举报人id" prop="informerUserId">
<el-input v-model="form.informerUserId" placeholder="请输入举报人id" />
</el-form-item>
<el-form-item label="封禁理由" prop="banReason">
<el-input v-model="form.banReason" placeholder="请输入封禁理由" />
</el-form-item>
<el-form-item label="封禁天数" prop="banDays">
<el-input v-model="form.banDays" placeholder="请输入封禁天数" />
</el-form-item>
<el-form-item label="处理方式(0=未处理,1=已下架)" prop="handlingMethod">
<el-radio-group v-model="form.handlingMethod">
<el-radio
v-for="dict in dy_banned_handling_method"
:key="dict.value"
:value="parseInt(dict.value)"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="状态(0=已发布,1=已下架)" prop="handlingStatus">
<el-radio-group v-model="form.handlingStatus">
<el-radio
v-for="dict in dy_banned_handling_status"
:key="dict.value"
:value="parseInt(dict.value)"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="1=用户,2=笔记,3=活动,4=评论" prop="classify">
<el-input v-model="form.classify" placeholder="请输入1=用户,2=笔记,3=活动,4=评论" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Banned" lang="ts">
import { listBanned, getBanned, delBanned, addBanned, updateBanned } from '@/api/manage/banned';
import { BannedVO, BannedQuery, BannedForm } from '@/api/manage/banned/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { dy_banned_handling_method, dy_banned_handling_status } = toRefs<any>(proxy?.useDict('dy_banned_handling_method', 'dy_banned_handling_status'));
const bannedList = ref<BannedVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const bannedFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: BannedForm = {
contentId: undefined,
reportUserId: undefined,
reportReason: undefined,
reportDetails: undefined,
informerUserId: undefined,
banReason: undefined,
banDays: undefined,
handlingMethod: undefined,
handlingStatus: undefined,
classify: undefined,
}
const data = reactive<PageData<BannedForm, BannedQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
contentId: undefined,
reportUserId: undefined,
reportReason: undefined,
reportDetails: undefined,
informerUserId: undefined,
banReason: undefined,
banDays: undefined,
handlingMethod: undefined,
handlingStatus: undefined,
classify: undefined,
params: {
}
},
rules: {
contentId: [
{ required: true, message: "被举报内容id不能为空", trigger: "blur" }
],
reportUserId: [
{ required: true, message: "被举报用户ID不能为空", trigger: "blur" }
],
reportReason: [
{ required: true, message: "举报理由不能为空", trigger: "blur" }
],
reportDetails: [
{ required: true, message: "举报详细信息不能为空", trigger: "blur" }
],
informerUserId: [
{ required: true, message: "举报人id不能为空", trigger: "blur" }
],
banReason: [
{ required: true, message: "封禁理由不能为空", trigger: "blur" }
],
banDays: [
{ required: true, message: "封禁天数不能为空", trigger: "blur" }
],
handlingMethod: [
{ required: true, message: "处理方式(0=未处理,1=已下架)不能为空", trigger: "change" }
],
handlingStatus: [
{ required: true, message: "状态(0=已发布,1=已下架)不能为空", trigger: "change" }
],
classify: [
{ required: true, message: "1=用户,2=笔记,3=活动,4=评论不能为空", trigger: "blur" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询举报列表 */
const getList = async () => {
loading.value = true;
const res = await listBanned(queryParams.value);
bannedList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
bannedFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: BannedVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加举报";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: BannedVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getBanned(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改举报";
}
/** 提交按钮 */
const submitForm = () => {
bannedFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateBanned(form.value).finally(() => buttonLoading.value = false);
} else {
await addBanned(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: BannedVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除举报编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delBanned(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/banned/export', {
...queryParams.value
}, `banned_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,239 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户id" prop="userId">
<el-input v-model="queryParams.userId" placeholder="请输入用户id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="联系方式" prop="contact">
<el-input v-model="queryParams.contact" placeholder="请输入联系方式" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:feedback:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:feedback:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:feedback:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:feedback:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="feedbackList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" v-if="true" />
<el-table-column label="用户id" align="center" prop="userId" />
<el-table-column label="反馈内容" align="center" prop="remark" />
<el-table-column label="联系方式" align="center" prop="contact" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:feedback:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:feedback:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改App反馈对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="feedbackFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户id" prop="userId">
<el-input v-model="form.userId" placeholder="请输入用户id" />
</el-form-item>
<el-form-item label="反馈内容" prop="remark">
<el-input v-model="form.remark" placeholder="请输入反馈内容" />
</el-form-item>
<el-form-item label="联系方式" prop="contact">
<el-input v-model="form.contact" placeholder="请输入联系方式" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Feedback" lang="ts">
import { listFeedback, getFeedback, delFeedback, addFeedback, updateFeedback } from '@/api/manage/feedback';
import { FeedbackVO, FeedbackQuery, FeedbackForm } from '@/api/manage/feedback/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const feedbackList = ref<FeedbackVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const feedbackFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: FeedbackForm = {
id: undefined,
userId: undefined,
remark: undefined,
contact: undefined,
}
const data = reactive<PageData<FeedbackForm, FeedbackQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
userId: undefined,
contact: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
userId: [
{ required: true, message: "用户id不能为空", trigger: "blur" }
],
remark: [
{ required: true, message: "反馈内容不能为空", trigger: "blur" }
],
contact: [
{ required: true, message: "联系方式不能为空", trigger: "blur" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询App反馈列表 */
const getList = async () => {
loading.value = true;
const res = await listFeedback(queryParams.value);
feedbackList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
feedbackFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: FeedbackVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加App反馈";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: FeedbackVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getFeedback(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改App反馈";
}
/** 提交按钮 */
const submitForm = () => {
feedbackFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateFeedback(form.value).finally(() => buttonLoading.value = false);
} else {
await addFeedback(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: FeedbackVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除App反馈编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delFeedback(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/feedback/export', {
...queryParams.value
}, `feedback_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,232 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="ip形象名称" prop="ipName">
<el-input v-model="queryParams.ipName" placeholder="请输入ip形象名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="排序" prop="shor">
<el-input v-model="queryParams.shor" placeholder="请输入排序" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:ipImage:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:ipImage:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:ipImage:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:ipImage:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="ipImageList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" v-if="true" />
<el-table-column label="ip形象名称" align="center" prop="ipName" />
<el-table-column label="排序" align="center" prop="shor" />
<el-table-column label="创建者" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:ipImage:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:ipImage:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改IP形象对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="ipImageFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="ip形象名称" prop="ipName">
<el-input v-model="form.ipName" placeholder="请输入ip形象名称" />
</el-form-item>
<el-form-item label="排序" prop="shor">
<el-input v-model="form.shor" placeholder="请输入排序" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="IpImage" lang="ts">
import { listIpImage, getIpImage, delIpImage, addIpImage, updateIpImage } from '@/api/manage/ipImage';
import { IpImageVO, IpImageQuery, IpImageForm } from '@/api/manage/ipImage/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const ipImageList = ref<IpImageVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const ipImageFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: IpImageForm = {
id: undefined,
ipName: undefined,
shor: undefined,
}
const data = reactive<PageData<IpImageForm, IpImageQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
ipName: undefined,
shor: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
ipName: [
{ required: true, message: "ip形象名称不能为空", trigger: "blur" }
],
shor: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询IP形象列表 */
const getList = async () => {
loading.value = true;
const res = await listIpImage(queryParams.value);
ipImageList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
ipImageFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: IpImageVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加IP形象";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: IpImageVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getIpImage(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改IP形象";
}
/** 提交按钮 */
const submitForm = () => {
ipImageFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateIpImage(form.value).finally(() => buttonLoading.value = false);
} else {
await addIpImage(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: IpImageVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除IP形象编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delIpImage(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/ipImage/export', {
...queryParams.value
}, `ipImage_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,379 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="订单号" prop="orderNumber">
<el-input v-model="queryParams.orderNumber" placeholder="请输入订单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="来源" prop="source">
<el-input v-model="queryParams.source" placeholder="请输入来源" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="商品名称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入商品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="供应商id" prop="vendorId">
<el-input v-model="queryParams.vendorId" placeholder="请输入供应商id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="用户昵称" prop="userNickname">
<el-input v-model="queryParams.userNickname" placeholder="请输入用户昵称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="用户头像路径" prop="userAvatar">
<el-input v-model="queryParams.userAvatar" placeholder="请输入用户头像路径" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="用户手机号" prop="userPhoneNumber">
<el-input v-model="queryParams.userPhoneNumber" placeholder="请输入用户手机号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货地址" prop="shippingAddress">
<el-input v-model="queryParams.shippingAddress" placeholder="请输入收货地址" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="订单状态" prop="orderStatus">
<el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable >
<el-option v-for="dict in dy_order_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="物流名称" prop="logisticsName">
<el-input v-model="queryParams.logisticsName" placeholder="请输入物流名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="物流单号" prop="logisticsNumber">
<el-input v-model="queryParams.logisticsNumber" placeholder="请输入物流单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:orders:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:orders:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:orders:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:orders:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="ordersList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="唯一标识ID" align="center" prop="id" v-if="true" />
<el-table-column label="订单号" align="center" prop="orderNumber" />
<el-table-column label="来源" align="center" prop="source" />
<el-table-column label="商品名称" align="center" prop="productName" />
<el-table-column label="商品图片路径" align="center" prop="productImageUrl" width="100">
<template #default="scope">
<image-preview :src="scope.row.productImageUrl" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="商品类型" align="center" prop="productType" />
<el-table-column label="供应商id" align="center" prop="vendorId" />
<el-table-column label="用户昵称" align="center" prop="userNickname" />
<el-table-column label="用户头像路径" align="center" prop="userAvatar" />
<el-table-column label="用户手机号" align="center" prop="userPhoneNumber" />
<el-table-column label="收货地址" align="center" prop="shippingAddress" />
<el-table-column label="订单状态" align="center" prop="orderStatus">
<template #default="scope">
<dict-tag :options="dy_order_status" :value="scope.row.orderStatus"/>
</template>
</el-table-column>
<el-table-column label="物流名称" align="center" prop="logisticsName" />
<el-table-column label="物流单号" align="center" prop="logisticsNumber" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:orders:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:orders:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改订单信息对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="ordersFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="订单号" prop="orderNumber">
<el-input v-model="form.orderNumber" placeholder="请输入订单号" />
</el-form-item>
<el-form-item label="来源" prop="source">
<el-input v-model="form.source" placeholder="请输入来源" />
</el-form-item>
<el-form-item label="商品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入商品名称" />
</el-form-item>
<el-form-item label="商品图片路径" prop="productImage">
<image-upload v-model="form.productImage"/>
</el-form-item>
<el-form-item label="供应商id" prop="vendorId">
<el-input v-model="form.vendorId" placeholder="请输入供应商id" />
</el-form-item>
<el-form-item label="用户昵称" prop="userNickname">
<el-input v-model="form.userNickname" placeholder="请输入用户昵称" />
</el-form-item>
<el-form-item label="用户头像路径" prop="userAvatar">
<el-input v-model="form.userAvatar" placeholder="请输入用户头像路径" />
</el-form-item>
<el-form-item label="用户手机号" prop="userPhoneNumber">
<el-input v-model="form.userPhoneNumber" placeholder="请输入用户手机号" />
</el-form-item>
<el-form-item label="收货地址" prop="shippingAddress">
<el-input v-model="form.shippingAddress" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="订单状态" prop="orderStatus">
<el-radio-group v-model="form.orderStatus">
<el-radio
v-for="dict in dy_order_status"
:key="dict.value"
:value="parseInt(dict.value)"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="物流名称" prop="logisticsName">
<el-input v-model="form.logisticsName" placeholder="请输入物流名称" />
</el-form-item>
<el-form-item label="物流单号" prop="logisticsNumber">
<el-input v-model="form.logisticsNumber" placeholder="请输入物流单号" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Orders" lang="ts">
import { listOrders, getOrders, delOrders, addOrders, updateOrders } from '@/api/manage/orders';
import { OrdersVO, OrdersQuery, OrdersForm } from '@/api/manage/orders/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { dy_order_status } = toRefs<any>(proxy?.useDict('dy_order_status'));
const ordersList = ref<OrdersVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const ordersFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: OrdersForm = {
id: undefined,
orderNumber: undefined,
source: undefined,
productName: undefined,
productImage: undefined,
productType: undefined,
vendorId: undefined,
userNickname: undefined,
userAvatar: undefined,
userPhoneNumber: undefined,
shippingAddress: undefined,
orderStatus: undefined,
logisticsName: undefined,
logisticsNumber: undefined,
remark: undefined
}
const data = reactive<PageData<OrdersForm, OrdersQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
orderNumber: undefined,
source: undefined,
productName: undefined,
productImage: undefined,
productType: undefined,
vendorId: undefined,
userNickname: undefined,
userAvatar: undefined,
userPhoneNumber: undefined,
shippingAddress: undefined,
orderStatus: undefined,
logisticsName: undefined,
logisticsNumber: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "唯一标识ID不能为空", trigger: "blur" }
],
orderNumber: [
{ required: true, message: "订单号不能为空", trigger: "blur" }
],
source: [
{ required: true, message: "来源不能为空", trigger: "blur" }
],
productName: [
{ required: true, message: "商品名称不能为空", trigger: "blur" }
],
productImage: [
{ required: true, message: "商品图片路径不能为空", trigger: "blur" }
],
productType: [
{ required: true, message: "商品类型不能为空", trigger: "change" }
],
vendorId: [
{ required: true, message: "供应商id不能为空", trigger: "blur" }
],
userNickname: [
{ required: true, message: "用户昵称不能为空", trigger: "blur" }
],
userAvatar: [
{ required: true, message: "用户头像路径不能为空", trigger: "blur" }
],
userPhoneNumber: [
{ required: true, message: "用户手机号不能为空", trigger: "blur" }
],
shippingAddress: [
{ required: true, message: "收货地址不能为空", trigger: "blur" }
],
orderStatus: [
{ required: true, message: "订单状态不能为空", trigger: "change" }
],
logisticsName: [
{ required: true, message: "物流名称不能为空", trigger: "blur" }
],
logisticsNumber: [
{ required: true, message: "物流单号不能为空", trigger: "blur" }
],
remark: [
{ required: true, message: "备注不能为空", trigger: "blur" }
]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询订单信息列表 */
const getList = async () => {
loading.value = true;
const res = await listOrders(queryParams.value);
ordersList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
ordersFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: OrdersVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加订单信息";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: OrdersVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getOrders(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改订单信息";
}
/** 提交按钮 */
const submitForm = () => {
ordersFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateOrders(form.value).finally(() => buttonLoading.value = false);
} else {
await addOrders(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: OrdersVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除订单信息编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delOrders(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/orders/export', {
...queryParams.value
}, `orders_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,295 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="商品类别id" prop="categoryId">
<el-input v-model="queryParams.categoryId" placeholder="请输入商品类别id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="商品名称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入商品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="商品说明" prop="productShows">
<el-input v-model="queryParams.productShows" placeholder="请输入商品说明" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="供应商id" prop="vendorId">
<el-input v-model="queryParams.vendorId" placeholder="请输入供应商id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="排序" prop="sortOrder">
<el-input v-model="queryParams.sortOrder" placeholder="请输入排序" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:product:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:product:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:product:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:product:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="productList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" v-if="true" />
<el-table-column label="商品类别id" align="center" prop="categoryId" />
<el-table-column label="商品名称" align="center" prop="productName" />
<el-table-column label="商品图片" align="center" prop="productImageUrl" width="100">
<template #default="scope">
<image-preview :src="scope.row.productImageUrl" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="商品说明" align="center" prop="productShows" />
<el-table-column label="供应商id" align="center" prop="vendorId" />
<el-table-column label="排序" align="center" prop="sortOrder" />
<el-table-column label="商品状态" align="center" prop="productStatus" />
<el-table-column label="更新者" align="center" prop="updateBy" />
<el-table-column label="更新时间" align="center" prop="updateTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:product:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:product:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改商品信息对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="productFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="商品类别id" prop="categoryId">
<el-input v-model="form.categoryId" placeholder="请输入商品类别id" />
</el-form-item>
<el-form-item label="商品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入商品名称" />
</el-form-item>
<el-form-item label="商品图片" prop="productImage">
<image-upload v-model="form.productImage"/>
</el-form-item>
<el-form-item label="商品说明" prop="productShows">
<el-input v-model="form.productShows" placeholder="请输入商品说明" />
</el-form-item>
<el-form-item label="供应商id" prop="vendorId">
<el-input v-model="form.vendorId" placeholder="请输入供应商id" />
</el-form-item>
<el-form-item label="排序" prop="sortOrder">
<el-input v-model="form.sortOrder" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Product" lang="ts">
import { listProduct, getProduct, delProduct, addProduct, updateProduct } from '@/api/manage/product';
import { ProductVO, ProductQuery, ProductForm } from '@/api/manage/product/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const productList = ref<ProductVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const productFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: ProductForm = {
id: undefined,
categoryId: undefined,
productName: undefined,
productImage: undefined,
productShows: undefined,
vendorId: undefined,
sortOrder: undefined,
productStatus: undefined,
remark: undefined
}
const data = reactive<PageData<ProductForm, ProductQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
categoryId: undefined,
productName: undefined,
productImage: undefined,
productShows: undefined,
vendorId: undefined,
sortOrder: undefined,
productStatus: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
categoryId: [
{ required: true, message: "商品类别id不能为空", trigger: "blur" }
],
productName: [
{ required: true, message: "商品名称不能为空", trigger: "blur" }
],
productImage: [
{ required: true, message: "商品图片不能为空", trigger: "blur" }
],
productShows: [
{ required: true, message: "商品说明不能为空", trigger: "blur" }
],
vendorId: [
{ required: true, message: "供应商id不能为空", trigger: "blur" }
],
sortOrder: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
productStatus: [
{ required: true, message: "商品状态不能为空", trigger: "change" }
],
remark: [
{ required: true, message: "备注不能为空", trigger: "blur" }
]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询商品信息列表 */
const getList = async () => {
loading.value = true;
const res = await listProduct(queryParams.value);
productList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
productFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: ProductVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加商品信息";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: ProductVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getProduct(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改商品信息";
}
/** 提交按钮 */
const submitForm = () => {
productFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateProduct(form.value).finally(() => buttonLoading.value = false);
} else {
await addProduct(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: ProductVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除商品信息编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delProduct(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/product/export', {
...queryParams.value
}, `product_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,240 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="类别" prop="category">
<el-input v-model="queryParams.category" placeholder="请输入类别" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="排序" prop="firstLevelCategoryOrder">
<el-input v-model="queryParams.firstLevelCategoryOrder" placeholder="请输入排序" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:productCategory:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:productCategory:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:productCategory:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:productCategory:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="productCategoryList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="唯一标识ID" align="center" prop="id" v-if="true" />
<el-table-column label="类别" align="center" prop="category" />
<el-table-column label="排序" align="center" prop="firstLevelCategoryOrder" />
<el-table-column label="更新者" align="center" prop="updateBy" />
<el-table-column label="更新时间" align="center" prop="updateTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:productCategory:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:productCategory:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改商品类别对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="productCategoryFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="类别" prop="category">
<el-input v-model="form.category" placeholder="请输入类别" />
</el-form-item>
<el-form-item label="排序" prop="firstLevelCategoryOrder">
<el-input v-model="form.firstLevelCategoryOrder" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="ProductCategory" lang="ts">
import { listProductCategory, getProductCategory, delProductCategory, addProductCategory, updateProductCategory } from '@/api/manage/productCategory';
import { ProductCategoryVO, ProductCategoryQuery, ProductCategoryForm } from '@/api/manage/productCategory/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const productCategoryList = ref<ProductCategoryVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const productCategoryFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: ProductCategoryForm = {
id: undefined,
category: undefined,
firstLevelCategoryOrder: undefined,
remark: undefined
}
const data = reactive<PageData<ProductCategoryForm, ProductCategoryQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
category: undefined,
firstLevelCategoryOrder: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "唯一标识ID不能为空", trigger: "blur" }
],
category: [
{ required: true, message: "类别不能为空", trigger: "blur" }
],
firstLevelCategoryOrder: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
remark: [
{ required: true, message: "备注不能为空", trigger: "blur" }
]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询商品类别列表 */
const getList = async () => {
loading.value = true;
const res = await listProductCategory(queryParams.value);
productCategoryList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
productCategoryFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: ProductCategoryVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加商品类别";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: ProductCategoryVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getProductCategory(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改商品类别";
}
/** 提交按钮 */
const submitForm = () => {
productCategoryFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateProductCategory(form.value).finally(() => buttonLoading.value = false);
} else {
await addProductCategory(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: ProductCategoryVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除商品类别编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delProductCategory(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/productCategory/export', {
...queryParams.value
}, `productCategory_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,250 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户ID" prop="userId">
<el-input v-model="queryParams.userId" placeholder="请输入用户ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="业务id" prop="sourceId">
<el-input v-model="queryParams.sourceId" placeholder="请输入业务id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="来源类型(0=签到 1=发笔记 2=扔瓶子 3=评论 4=点赞 5=分享 6=收藏 7=地图点亮) " prop="source">
<el-input v-model="queryParams.source" placeholder="请输入来源类型(0=签到 1=发笔记 2=扔瓶子 3=评论 4=点赞 5=分享 6=收藏 7=地图点亮) " clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="积分" prop="score">
<el-input v-model="queryParams.score" placeholder="请输入积分" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:userScore:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:userScore:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:userScore:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:userScore:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="userScoreList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" v-if="true" />
<el-table-column label="用户ID" align="center" prop="userId" />
<el-table-column label="业务id" align="center" prop="sourceId" />
<el-table-column label="来源类型(0=签到 1=发笔记 2=扔瓶子 3=评论 4=点赞 5=分享 6=收藏 7=地图点亮) " align="center" prop="source" />
<el-table-column label="积分" align="center" prop="score" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:userScore:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:userScore:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改积分记录对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="userScoreFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户ID" prop="userId">
<el-input v-model="form.userId" placeholder="请输入用户ID" />
</el-form-item>
<el-form-item label="业务id" prop="sourceId">
<el-input v-model="form.sourceId" placeholder="请输入业务id" />
</el-form-item>
<el-form-item label="来源类型(0=签到 1=发笔记 2=扔瓶子 3=评论 4=点赞 5=分享 6=收藏 7=地图点亮) " prop="source">
<el-input v-model="form.source" placeholder="请输入来源类型(0=签到 1=发笔记 2=扔瓶子 3=评论 4=点赞 5=分享 6=收藏 7=地图点亮) " />
</el-form-item>
<el-form-item label="积分" prop="score">
<el-input v-model="form.score" placeholder="请输入积分" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="UserScore" lang="ts">
import { listUserScore, getUserScore, delUserScore, addUserScore, updateUserScore } from '@/api/manage/userScore';
import { UserScoreVO, UserScoreQuery, UserScoreForm } from '@/api/manage/userScore/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const userScoreList = ref<UserScoreVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const userScoreFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: UserScoreForm = {
id: undefined,
userId: undefined,
sourceId: undefined,
source: undefined,
score: undefined,
}
const data = reactive<PageData<UserScoreForm, UserScoreQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
userId: undefined,
sourceId: undefined,
source: undefined,
score: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
userId: [
{ required: true, message: "用户ID不能为空", trigger: "blur" }
],
sourceId: [
{ required: true, message: "业务id不能为空", trigger: "blur" }
],
source: [
{ required: true, message: "来源类型(0=签到 1=发笔记 2=扔瓶子 3=评论 4=点赞 5=分享 6=收藏 7=地图点亮) 不能为空", trigger: "blur" }
],
score: [
{ required: true, message: "积分不能为空", trigger: "blur" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询积分记录列表 */
const getList = async () => {
loading.value = true;
const res = await listUserScore(queryParams.value);
userScoreList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
userScoreFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: UserScoreVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加积分记录";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: UserScoreVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getUserScore(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改积分记录";
}
/** 提交按钮 */
const submitForm = () => {
userScoreFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateUserScore(form.value).finally(() => buttonLoading.value = false);
} else {
await addUserScore(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: UserScoreVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除积分记录编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delUserScore(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/userScore/export', {
...queryParams.value
}, `userScore_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

252
src/views/manage/vendor/index.vue vendored Normal file
View File

@ -0,0 +1,252 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="商品类别id" prop="categoryId">
<el-input v-model="queryParams.categoryId" placeholder="请输入商品类别id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="商品名称" prop="vendorName">
<el-input v-model="queryParams.vendorName" placeholder="请输入商品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="queryParams.sort" placeholder="请输入排序" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:vendor:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:vendor:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:vendor:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:vendor:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="vendorList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" v-if="true" />
<el-table-column label="商品类别id" align="center" prop="categoryId" />
<el-table-column label="商品名称" align="center" prop="vendorName" />
<el-table-column label="排序" align="center" prop="sort" />
<el-table-column label="更新者" align="center" prop="updateBy" />
<el-table-column label="更新时间" align="center" prop="updateTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:vendor:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:vendor:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改供应商对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="vendorFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="商品类别id" prop="categoryId">
<el-input v-model="form.categoryId" placeholder="请输入商品类别id" />
</el-form-item>
<el-form-item label="商品名称" prop="vendorName">
<el-input v-model="form.vendorName" placeholder="请输入商品名称" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Vendor" lang="ts">
import { listVendor, getVendor, delVendor, addVendor, updateVendor } from '@/api/manage/vendor';
import { VendorVO, VendorQuery, VendorForm } from '@/api/manage/vendor/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const vendorList = ref<VendorVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const vendorFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: VendorForm = {
id: undefined,
categoryId: undefined,
vendorName: undefined,
sort: undefined,
remark: undefined
}
const data = reactive<PageData<VendorForm, VendorQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
categoryId: undefined,
vendorName: undefined,
sort: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
categoryId: [
{ required: true, message: "商品类别id不能为空", trigger: "blur" }
],
vendorName: [
{ required: true, message: "商品名称不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "排序不能为空", trigger: "blur" }
],
remark: [
{ required: true, message: "备注不能为空", trigger: "blur" }
]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询供应商列表 */
const getList = async () => {
loading.value = true;
const res = await listVendor(queryParams.value);
vendorList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
vendorFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: VendorVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加供应商";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: VendorVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getVendor(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改供应商";
}
/** 提交按钮 */
const submitForm = () => {
vendorFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateVendor(form.value).finally(() => buttonLoading.value = false);
} else {
await addVendor(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: VendorVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除供应商编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delVendor(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/vendor/export', {
...queryParams.value
}, `vendor_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>

View File

@ -56,7 +56,7 @@
</template>
<script setup lang="ts">
import { getCodeImg, register, getTenantList } from '@/api/login';
import { getCodeImg, register } from '@/api/login';
import { RegisterForm, TenantVO } from '@/api/types';
import { to } from 'await-to-js';