diff --git a/src/api/mall/promotion/point/index.ts b/src/api/mall/promotion/point/index.ts
new file mode 100644
index 00000000..f74d104e
--- /dev/null
+++ b/src/api/mall/promotion/point/index.ts
@@ -0,0 +1,78 @@
+import request from '@/config/axios'
+import { Sku, Spu } from '@/api/mall/product/spu'
+
+// 积分商城活动 VO
+export interface PointActivityVO {
+ id: number // 积分商城活动编号
+ spuId: number // 积分商城活动商品
+ status: number // 活动状态
+ remark?: string // 备注
+ sort: number // 排序
+ createTime: string // 创建时间
+ products: PointProductVO[] // 积分商城商品
+
+ // ========== 商品字段 ==========
+ spuName: string // 商品名称
+ picUrl: string // 商品主图
+ marketPrice: number // 商品市场价,单位:分
+
+ //======================= 显示所需兑换积分最少的 sku 信息 =======================
+ maxCount: number // 可兑换数量
+ point: number // 兑换积分
+ price: number // 兑换金额,单位:分
+}
+
+// 秒杀活动所需属性
+export interface PointProductVO {
+ id?: number // 积分商城商品编号
+ activityId?: number // 积分商城活动 id
+ spuId?: number // 商品 SPU 编号
+ skuId: number // 商品 SKU 编号
+ count: number // 可兑换数量
+ point: number // 兑换积分
+ price: number // 兑换金额,单位:分
+ stock: number // 积分商城商品库存
+ activityStatus?: number // 积分商城商品状态
+}
+
+// 扩展 Sku 配置
+export type SkuExtension = Sku & {
+ productConfig: PointProductVO
+}
+
+export interface SpuExtension extends Spu {
+ skus: SkuExtension[] // 重写类型
+}
+
+// 积分商城活动 API
+export const PointActivityApi = {
+ // 查询积分商城活动分页
+ getPointActivityPage: async (params: any) => {
+ return await request.get({ url: `/promotion/point-activity/page`, params })
+ },
+
+ // 查询积分商城活动详情
+ getPointActivity: async (id: number) => {
+ return await request.get({ url: `/promotion/point-activity/get?id=` + id })
+ },
+
+ // 新增积分商城活动
+ createPointActivity: async (data: PointActivityVO) => {
+ return await request.post({ url: `/promotion/point-activity/create`, data })
+ },
+
+ // 修改积分商城活动
+ updatePointActivity: async (data: PointActivityVO) => {
+ return await request.put({ url: `/promotion/point-activity/update`, data })
+ },
+
+ // 删除积分商城活动
+ deletePointActivity: async (id: number) => {
+ return await request.delete({ url: `/promotion/point-activity/delete?id=` + id })
+ },
+
+ // 关闭秒杀活动
+ closePointActivity: async (id: number) => {
+ return await request.put({ url: '/promotion/point-activity/close?id=' + id })
+ }
+}
diff --git a/src/views/mall/promotion/point/activity/PointActivityForm.vue b/src/views/mall/promotion/point/activity/PointActivityForm.vue
new file mode 100644
index 00000000..28411642
--- /dev/null
+++ b/src/views/mall/promotion/point/activity/PointActivityForm.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
diff --git a/src/views/mall/promotion/point/activity/index.vue b/src/views/mall/promotion/point/activity/index.vue
new file mode 100644
index 00000000..dc5295b5
--- /dev/null
+++ b/src/views/mall/promotion/point/activity/index.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 关闭
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/mall/promotion/point/activity/pointActivity.data.ts b/src/views/mall/promotion/point/activity/pointActivity.data.ts
new file mode 100644
index 00000000..a3334eac
--- /dev/null
+++ b/src/views/mall/promotion/point/activity/pointActivity.data.ts
@@ -0,0 +1,55 @@
+import type { CrudSchema } from '@/hooks/web/useCrudSchemas'
+
+// 表单校验
+export const rules = reactive({
+ spuId: [required],
+ sort: [required]
+})
+
+// CrudSchema https://doc.iocoder.cn/vue3/crud-schema/
+const crudSchemas = reactive([
+ {
+ label: '排序',
+ field: 'sort',
+ form: {
+ component: 'InputNumber',
+ value: 0
+ },
+ table: {
+ width: 80
+ }
+ },
+ {
+ label: '积分商城活动商品',
+ field: 'spuId',
+ isTable: true,
+ isSearch: false,
+ form: {
+ colProps: {
+ span: 24
+ }
+ },
+ table: {
+ width: 300
+ }
+ },
+ {
+ label: '备注',
+ field: 'remark',
+ isSearch: false,
+ form: {
+ component: 'Input',
+ componentProps: {
+ type: 'textarea',
+ rows: 4
+ },
+ colProps: {
+ span: 24
+ }
+ },
+ table: {
+ width: 300
+ }
+ }
+])
+export const { allSchemas } = useCrudSchemas(crudSchemas)