From dee9014b7fe406a241d396737649f3c3f9a0df05 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期二, 30 九月 2025 16:09:53 +0800
Subject: [PATCH] 店铺绑定抽奖活动

---
 manager/src/api/prize-store.js                   |   29 +
 manager/src/views/activity-prize/prize-store.vue |  845 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 874 insertions(+), 0 deletions(-)

diff --git a/manager/src/api/prize-store.js b/manager/src/api/prize-store.js
new file mode 100644
index 0000000..abde40d
--- /dev/null
+++ b/manager/src/api/prize-store.js
@@ -0,0 +1,29 @@
+import service from "../libs/axios";
+
+export const getPage = (params) =>{
+  return service({
+    url: "/lmk/scan-prize/page",
+    method: "GET",
+    params: params
+  })
+}
+
+export const add = (params) =>{
+  return service({
+    url: "/lmk/scan-prize",
+    method: "POST",
+    data: params
+  })
+}
+export const changeStatus = (params) =>{
+  return service({
+    url: "/lmk/scan-prize/changeStatus/" +params,
+    method: "POST",
+  })
+}
+export const generateStorePrize = (params) =>{
+  return service({
+    url: "/lmk/scan-prize/generateStorePrize/" +params,
+    method: "POST",
+  })
+}
diff --git a/manager/src/views/activity-prize/prize-store.vue b/manager/src/views/activity-prize/prize-store.vue
new file mode 100644
index 0000000..5bc9f20
--- /dev/null
+++ b/manager/src/views/activity-prize/prize-store.vue
@@ -0,0 +1,845 @@
+<template>
+  <div class="coupon-management">
+    <!-- 鎼滅储鍖哄煙 -->
+    <Card class="filter-container">
+      <div class="filter-header">
+        <Icon type="ios-search" size="18" />
+        <span class="filter-title">绛涢�夋悳绱�</span>
+        <div class="filter-actions">
+          <Button type="primary" @click="getList" size="small">鏌ヨ鎼滅储</Button>
+          <Button @click="handleResetSearch" size="small" style="margin-left: 10px;">閲嶇疆</Button>
+        </div>
+      </div>
+      <div class="filter-content">
+        <Form
+          :model="listQuery"
+          :label-width="90"
+          class="search-form"
+          inline
+        >
+          <FormItem label="搴楅摵">
+            <Select
+              v-model="listQuery.storeId"
+              placeholder="璇烽�夋嫨"
+              clearable
+              style="width: 160px"
+              filterable
+            >
+              <Option
+                v-for="store in storeSelectList"
+                :key="store.id"
+                :label="store.label"
+                :value="store.id"
+              >
+                {{ store.label }}
+              </Option>
+            </Select>
+          </FormItem>
+          <FormItem label="鐢熸垚鐘舵��:">
+            <Select
+              v-model="listQuery.generateStatus"
+              placeholder="鍏ㄩ儴鐘舵��"
+              clearable
+              style="width: 180px"
+            >
+              <Option value="NOT_GENERATE">娌℃湁鐢熸垚</Option>
+              <Option value="GENERATE">鐢熸垚</Option>
+            </Select>
+          </FormItem>
+          <FormItem label="鍚敤鐘舵��:">
+            <Select
+              v-model="listQuery.status"
+              placeholder="鍏ㄩ儴鐘舵��"
+              clearable
+              style="width: 180px"
+            >
+              <Option value="ENABLE">鍚敤</Option>
+              <Option value="DISABLE">绂佺敤</Option>
+            </Select>
+          </FormItem>
+        </Form>
+      </div>
+    </Card>
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="operation-container">
+      <Button
+        @click="handleAdd"
+        type="primary"
+        icon="md-add"
+        class="add-btn"
+      >鏂板</Button>
+    </div>
+
+    <!-- 琛ㄦ牸鍖哄煙 -->
+    <Card class="table-container">
+      <Table
+        :loading="listLoading"
+        border
+        :columns="tableColumns"
+        :data="list"
+        ref="table"
+        class="coupon-table"
+      >
+        <!-- 鐢熸垚鐘舵�佸垪 -->
+        <template slot-scope="{ row }" slot="generateStatus">
+          <Tag :color="getStatusColor(row.generateStatus)">
+            {{ formatGenerateStatus(row.generateStatus) }}
+          </Tag>
+        </template>
+
+        <!-- 鍚敤鐘舵�佸垪 -->
+        <template slot-scope="{ row }" slot="status">
+          <i-switch
+            v-model="row.status"
+            true-value="ENABLE"
+            false-value="DISABLE"
+            @on-change="(status) => handleStatusChange(row, status)"
+          >
+            <span slot="open">鍚敤</span>
+            <span slot="close">绂佺敤</span>
+          </i-switch>
+        </template>
+
+        <template slot-scope="{ row }" slot="action">
+          <Button
+            @click="generalStorePrize(row)"
+            type="primary"
+            class="add-btn"
+            v-if="row.generateStatus ==='NOT_GENERATE'"
+          >鐢熸垚浼樻儬鍗�</Button>
+          <Button
+            @click="detail(row)"
+            style="margin-left: 10px;"
+            type="primary"
+            class="add-btn"
+            :disabled="row.generateStatus === 'NOT_GENERATE'"
+          >鏌ョ湅</Button>
+        </template>
+      </Table>
+    </Card>
+
+    <!-- 鍒嗛〉鍖哄煙 -->
+    <div class="pagination-container">
+      <Page
+        :current="listQuery.pageNumber"
+        :page-size="listQuery.pageSize"
+        :total="total"
+        :page-size-opts="[10, 20, 30, 50]"
+        show-elevator
+        show-sizer
+        show-total
+        @on-change="handleCurrentChange"
+        @on-page-size-change="handleSizeChange"
+      />
+    </div>
+    <Modal
+      v-model="showGeneralQrCode"
+      title="浜岀淮鐮�"
+      width="800"
+      :mask-closable="false"
+      :loading="codeLoading"
+    >
+      <vue-qr
+        :text="QRCodeUrl"
+        :margin="0"
+        colorDark="#000"
+        colorLight="#fff"
+        :size="150"
+      ></vue-qr>
+      <div slot="footer">
+        <Button type="text" @click="closeGeneralQrCode">鍏抽棴</Button>
+        <!--          <Button type="primary" @click="generalQrCode">纭</Button>-->
+      </div>
+    </Modal>
+
+    <Modal
+      v-model="showCouponStore"
+      width="1200"
+      :mask-closable="false"
+      @on-cancel="handleCancelCouponStore"
+    >
+      <Table
+        :loading="couponStoreLoading"
+        border
+        :columns="couponStoreColumns"
+        :data="couponStoreData"
+        ref="table"
+      >
+        <template slot-scope="{ row }" slot="action">
+          <Button
+            @click="generalQrCode(row)"
+            type="primary"
+            class="add-btn"
+            v-if="row.claimStatus === 'NOT_CLAIM'"
+          >鏌ョ湅浜岀淮鐮�</Button>
+        </template>
+      </Table>
+      <Row type="flex" justify="center" class="mt_10">
+        <Page
+          :current="storeCouponSingleQuery.pageNumber"
+          :total="couponStoreTotal"
+          :page-size="storeCouponSingleQuery.pageSize"
+          @on-change="couponStoreChangePage"
+          @on-page-size-change="couponStoreChangePageSize"
+          :page-size-opts="[10, 20, 50]"
+          size="small"
+          show-total
+          show-elevator
+          show-sizer
+        ></Page>
+      </Row>
+    </Modal>
+
+
+
+    <!-- 娣诲姞/缂栬緫寮圭獥 -->
+    <Modal
+      v-model="dialogVisible"
+      :title="dialogTitle"
+      width="1200"
+      :mask-closable="false"
+      @on-cancel="handleCancel"
+    >
+      <Form
+        ref="dataForm"
+        :model="temp"
+        :label-width="100"
+        :rules="formRules"
+      >
+        <Form-item label="搴楅摵" prop="storeId">
+          <Select
+            v-model="temp.storeId"
+            placeholder="璇烽�夋嫨"
+            clearable
+            style="width: 160px"
+            filterable
+            @on-change="handleStoreChange"
+          >
+            <Option
+              v-for="store in storeSelectList"
+              :key="store.id"
+              :label="store.label"
+              :value="store.id"
+            >
+              {{ store.label }}
+            </Option>
+          </Select>
+        </Form-item>
+        <FormItem label="宸查�夋娊濂栨椿鍔�" prop="couponId"  style="margin-bottom: 20px">
+          <Input :disabled="true" style="width: 30%;margin-bottom: 20px" v-model="showActivityPrize" placeholder="璇风偣鍑婚�夋嫨琛ㄦ牸鍐呮娊濂栨椿鍔�"></Input>
+
+        </FormItem>
+        <Table
+          :loading="activityPrizeLoading"
+          border
+          :columns="activityPrizeColumns"
+          :data="activityPrizeData"
+          ref="table"
+          @on-current-change="handleRowClick"
+          highlight-row
+        ></Table>
+        <Row type="flex" justify="center" class="mt_10">
+          <Page
+            :current="activityPrizeSearchForm.pageNumber"
+            :total="activityPrizeTotal"
+            :page-size="activityPrizeSearchForm.pageSize"
+            @on-change="activityPrizeChangePage"
+            @on-page-size-change="activityPrizeChangePageSize"
+            :page-size-opts="[10, 20, 50]"
+            size="small"
+            show-total
+            show-elevator
+            show-sizer
+          ></Page>
+        </Row>
+        <FormItem label="鐢熸垚鏁伴噺" prop="couponNum">
+          <InputNumber
+            v-model="temp.generateNum"
+            :min="1"
+            :max="99999"
+            placeholder="璇疯緭鍏ョ敓鎴愭暟閲�"
+            style="width: 100%"
+          ></InputNumber>
+        </FormItem>
+
+      </Form>
+      <div slot="footer">
+        <Button @click="dialogVisible = false">鍙栨秷</Button>
+        <Button type="primary" @click="handleSubmit" :loading="submitLoading">纭畾</Button>
+      </div>
+    </Modal>
+  </div>
+</template>
+
+<script>
+import vueQr from "vue-qr";
+import { getPage,add,changeStatus,generateStorePrize} from "@/api/prize-store.js"
+import * as API_Activity_Prize from "@/api/activity-prize.js"
+
+import * as API_Order from "@/api/order";
+import {promotionsScopeTypeRender, promotionsStatusRender} from "../../utils/promotions";
+export default {
+  components:{
+    "vue-qr": vueQr,
+  },
+  name: 'CouponManagement',
+  data() {
+    return {
+      QRCodeUrl:"",
+      showGeneralQrCode:false,
+      codeLoading:false,
+
+      codeUrl: this.QRcodeBaseUrl+ '/scanpage/couponStore',
+
+      showCouponStore:false,
+      couponStoreTotal:0,
+      couponStoreData:[],
+      couponStoreLoading:false,
+      couponStoreColumns: [
+        {
+          title: "浼樻儬鍒稿悕绉�",
+          key: "couponName",
+          width: 200,
+          align: "center",
+          tooltip: true
+        },
+        {
+          title: "浼樻儬鍒哥紪鍙�",
+          key: "couponNo",
+          width: 200,
+          align: "center",
+          tooltip: true
+        },
+        {
+          title: "棰嗗彇鐘舵��",
+          key: "claimStatus",
+          width: 200,
+          align: "center",
+          tooltip: true,
+          render: (h, params) => {
+            const status = params.row.claimStatus;
+            const color = status === 'CLAIM' ? 'success' : status === 'NOT_CLAIM' ? 'default' : 'warning';
+            const text = status === 'CLAIM' ? '宸查鍙�' : status === 'NOT_CLAIM' ? '鏈鍙�' : '鏈煡';
+
+            return h('Tag', {
+              props: {
+                color: color
+              }
+            }, text);
+          }
+        },
+        {
+          title: "鎿嶄綔",
+          slot: "action",
+          align: "center",
+          width: 200,
+          fixed: "right"
+        }
+      ],
+      activityPrizeSearchForm:{
+        pageSize:10,
+        pageNumber:1,
+        activityName:'',
+        endTime:'',
+        beginTime:'',
+        enableStatus:'ON',
+        popup:true
+      },
+      storeSelectList:[],
+      showActivityPrize:'',
+      selectedRowId:'',
+      activityPrizeTotal:0,
+      activityPrizeData:[],
+      activityPrizeLoading:false,
+      activityPrizeColumns:[
+        {
+          title: '娲诲姩鍚嶇О',
+          key: 'activityName',
+          minWidth: 100,
+        },
+        {
+          title: '娲诲姩鎻忚堪',
+          key: 'activityDes',
+          minWidth: 100,
+        },
+        {
+          title: '寮�濮嬫椂闂�',
+          key: 'beginTime',
+          minWidth: 100,
+          render: (h, params) => {
+            return h('div', [
+              h('div', this.formatDate(params.row.beginTime)),
+            ])
+          }
+        },
+        {
+          title: '缁撴潫鏃堕棿',
+          key: 'endTime',
+          minWidth: 100,
+          render: (h, params) => {
+            return h('div', [
+              h('div', this.formatDate(params.row.endTime)),
+            ])
+          }
+        },
+        {
+          title: '姣忔棩鏈�澶ф娊濂栦笂闄�',
+          key: 'maxPrize',
+          minWidth: 100,
+        },
+        {
+          title: '鍒濆鍖栨娊濂栨鏁�',
+          key: 'prizeNum',
+          minWidth: 100,
+        },
+        {
+          title: '鏄惁寮�鍚椿鍔�',
+          key: 'enableStatus',
+          minWidth: 100,
+          render: (h, params) => {
+            return h('Tag', {
+              props: {
+                color: params.row.enableStatus  === 'ON' ? 'green' : 'default'
+              }
+            }, params.row.enableStatus === 'ON' ? '寮�鍚�' : '鍏抽棴')
+          }
+        },
+      ],
+      list: [],
+      total: 0,
+      listLoading: false,
+      submitLoading: false,
+      storeCouponSingleQuery:{
+        pageNumber: 1,
+        pageSize: 10,
+        refId:""
+      },
+
+      listQuery: {
+        pageNumber: 1,
+        pageSize: 10,
+        storeId: "",
+        generateStatus: "",
+        status: ""
+      },
+      temp: {
+        storeId: '',
+        storeName: '',
+        prizeActivityId: '',
+        generateNum: 1,
+        prizeActivityName: '',
+      },
+      dialogVisible: false,
+      dialogStatus: '',
+      dialogTitle: '',
+
+      // 琛ㄥ崟楠岃瘉瑙勫垯
+      formRules: {
+        storeId: [
+          { required: true, message: '搴楅摵涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        storeName: [
+          { required: true, message: '搴楅摵鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        prizeActivityId: [
+          { required: true, message: '鎶藉娲诲姩Id涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        prizeActivityName: [
+          { required: true, message: '鎶藉娲诲姩鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        generateNum: [
+          { required: true, type: 'number', message: '鐢熸垚鏁伴噺涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+      },
+
+      // 琛ㄥご閰嶇疆
+      tableColumns: [
+        {
+          type: 'selection',
+          width: 60,
+          align: 'center'
+        },
+        {
+          title: '搴楅摵鍚嶇О',
+          key: 'storeName',
+          align: 'center',
+          ellipsis: true,
+          tooltip: true
+        },
+        {
+          title: '鎶藉娲诲姩鍚嶇О鍚嶇О',
+          key: 'prizeActivityName',
+          align: 'center',
+          ellipsis: true,
+          tooltip: true
+        },
+        {
+          title: '鐢熸垚鏁伴噺',
+          key: 'generateNum',
+          width: 100,
+          align: 'center'
+        },
+        {
+          title: '宸查鍙栨暟閲�',
+          key: 'claimNum',
+          width: 120,
+          align: 'center'
+        },
+        {
+          title: '鐢熸垚鐘舵��',
+          slot: 'generateStatus',
+          width: 120,
+          align: 'center'
+        },
+        {
+          title: '鍚敤鐘舵��',
+          slot: 'status',
+          width: 120,
+          align: 'center'
+        },
+        {
+          title: '鎿嶄綔',
+          slot: 'action',
+          width: 200,
+          align: 'center'
+        },
+      ]
+    }
+  },
+  methods: {
+    closeGeneralQrCode(){
+      this.showGeneralQrCode = false;
+      this.QRCodeUrl = '';
+    },
+    generalQrCode(row){
+      this.QRCodeUrl = '';
+      this.showGeneralQrCode = true
+      this.codeLoading = true;
+
+      this.QRCodeUrl = this.codeUrl + "?id="+ row.id;
+
+    },
+    detail(row){
+      console.log(row)
+      this.showCouponStore = true;
+      this.storeCouponSingleQuery.refId = row.id
+      this.storeCouponSingleQuery.pageSize = 10
+      this.storeCouponSingleQuery.pageNumber = 1
+      this.getCouponStoreDataList();
+    },
+    generalStorePrize(row){
+      generateStorePrize(row.id).then(response => {
+        this.getList();
+      })
+    },
+    handleStoreChange(storeId) {
+      if (storeId) {
+        const selectedStore = this.storeSelectList.find(store => store.id === storeId);
+        if (selectedStore) {
+          this.temp.storeName = selectedStore.label;
+        }
+      } else {
+        this.temp.storeName = '';
+      }
+      console.log('褰撳墠閫夋嫨:', this.temp.storeId, this.temp.storeName);
+    },
+    activityPrizeChangePage(v) {
+      // 鏀瑰彉椤电爜
+      this.activityPrizeSearchForm.pageNumber = v;
+      this.getActivityPrizeDataList();
+    },
+    activityPrizeChangePageSize(v) {
+      // 鏀瑰彉椤垫暟
+      this.activityPrizeSearchForm.pageNumber = 1;
+      this.activityPrizeSearchForm.pageSize = v;
+      this.getActivityPrizeDataList();
+    },
+
+    couponStoreChangePage(v) {
+      // 鏀瑰彉椤电爜
+      this.storeCouponSingleQuery.pageNumber = v;
+      this.getCouponStoreDataList();
+    },
+    couponStoreChangePageSize(v) {
+      // 鏀瑰彉椤垫暟
+      this.storeCouponSingleQuery.pageNumber = 1;
+      this.storeCouponSingleQuery.pageSize = v;
+      this.getCouponStoreDataList();
+    },
+    handleRowClick(currentRow ,oldCurrentRow){
+      console.log(currentRow)
+      this.temp.prizeActivityId = currentRow.id;
+      this.temp.prizeActivityName = currentRow.activityName;
+      this.showActivityPrize = currentRow.activityName;
+
+      console.log(this.temp.couponId)
+    },
+
+    getCouponStoreDataList(){
+      this.couponStoreLoading = true;
+      // API_Activity_Prize(this.storeCouponSingleQuery).then((res) =>{
+      //   this.couponStoreLoading =false;
+      //   if (res.code === 200){
+      //     this.couponStoreData = res.data;
+      //     this.couponStoreTotal = res.total;
+      //   }
+      // })
+
+    },
+    getActivityPrizeDataList() {
+      // 鑾峰彇鏁版嵁
+      this.activityPrizeLoading = true;
+      API_Activity_Prize.getPage(this.activityPrizeSearchForm).then((res) => {
+        this.activityPrizeLoading = false;
+        if (res.code === 200) {
+          this.activityPrizeData = res.data;
+          this.activityPrizeTotal = res.total;
+        }
+      });
+      this.activityPrizeTotal = this.activityPrizeData.length;
+      this.activityPrizeLoading = false;
+    },
+
+    getStoreSelect(){
+      API_Order.getStoreSelect().then(res =>{
+        if (res.result){
+          this.storeSelectList = res.result;
+        }
+      })
+    },
+    // 鑾峰彇鍒楄〃鏁版嵁
+    getList() {
+      this.listLoading = true;
+      getPage(this.listQuery).then(res =>{
+        this.listLoading = false;
+        this.list = res.data;
+        this.total = res.total;
+      })
+    },
+
+    // 閲嶇疆鎼滅储鏉′欢
+    handleResetSearch() {
+      this.listQuery = {
+        pageNumber: 1,
+        pageSize: 10,
+        storeName: "",
+        couponName: "",
+        generateStatus: "",
+        status: ""
+      };
+      this.getList();
+    },
+
+    // 鍒嗛〉澶у皬鏀瑰彉
+    handleSizeChange(size) {
+      this.listQuery.pageSize = size;
+      this.listQuery.pageNumber = 1;
+      this.getList();
+    },
+
+    // 褰撳墠椤电爜鏀瑰彉
+    handleCurrentChange(pageNumber) {
+      this.listQuery.pageNumber = pageNumber;
+      this.getList();
+    },
+
+    // 娣诲姞浼樻儬鍒�
+    handleAdd() {
+      this.dialogStatus = 'create';
+      this.dialogTitle = '娣诲姞鍟嗗簵璧犻�佹椿鍔�';
+      this.dialogVisible = true;
+      this.showActivityPrize="";
+      this.temp = {
+        storeId: '',
+        storeName: '',
+        couponId: '',
+        couponNum: 1,
+        couponName: '',
+      };
+      this.getActivityPrizeDataList();
+
+      this.$nextTick(() => {
+        this.$refs.dataForm.resetFields();
+      });
+    },
+
+    // 鐘舵�佹敼鍙�
+    handleStatusChange(row, status) {
+      const action = status === 'ENABLE' ? '鍚敤' : '绂佺敤';
+      changeStatus(row.id).then(response => {
+        this.getList();
+        this.$Message.success(`宸�${action}搴楅摵娲诲姩璧犻��"${row.prizeActivityName}"`);
+      })
+      // 杩欓噷鍙互娣诲姞API璋冪敤
+    },
+
+    // 鏍煎紡鍖栫敓鎴愮姸鎬�
+    formatGenerateStatus(status) {
+      const statusMap = {
+        'NOT_GENERATE': '娌℃湁鐢熸垚',
+        'GENERATE': '鐢熸垚',
+      };
+      return statusMap[status] || '鏈煡鐘舵��';
+    },
+
+    // 鑾峰彇鐘舵�侀鑹�
+    getStatusColor(status) {
+      const colorMap = {
+        'GENERATE': 'success',
+        'NOT_GENERATE': 'warning'
+      };
+      return colorMap[status] || 'default';
+    },
+    handleCancelCouponStore(){
+      this.showCouponStore = false;
+    },
+    // 寮圭獥鍙栨秷
+    handleCancel() {
+      this.dialogVisible = false;
+    },
+
+    // 鎻愪氦琛ㄥ崟
+    handleSubmit() {
+      this.$refs.dataForm.validate((valid) => {
+        if (valid) {
+          let form = {...this.temp};
+          add(form).then(res=>{
+            if (res.code === 200 ){
+              this.$Message.success(res.msg)
+            }
+            this.dialogVisible = false;
+            this.getList();
+          })
+
+        }
+      });
+    }
+  },
+  mounted() {
+    this.getStoreSelect();
+    this.getList();
+  }
+}
+</script>
+
+<style scoped lang="less">
+.coupon-management {
+  padding: 16px;
+  background: #f5f7f9;
+  min-height: 100vh;
+}
+
+.filter-container {
+  margin-bottom: 16px;
+
+  .filter-header {
+    display: flex;
+    align-items: center;
+    margin-bottom: 16px;
+
+    .filter-title {
+      margin-left: 8px;
+      font-weight: 600;
+      font-size: 16px;
+    }
+
+    .filter-actions {
+      margin-left: auto;
+    }
+  }
+
+  .filter-content {
+    .search-form {
+      /deep/ .ivu-form-item {
+        margin-bottom: 16px;
+        margin-right: 16px;
+      }
+    }
+  }
+}
+
+.operation-container {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 16px;
+  padding: 12px 16px;
+  background: #fff;
+  border-radius: 4px;
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+
+  .operation-info {
+    color: #999;
+    font-size: 14px;
+  }
+}
+
+.table-container {
+  margin-bottom: 16px;
+
+  .coupon-table {
+    /deep/ .ivu-table-cell {
+      padding: 8px 12px;
+    }
+
+    .action-btns {
+      display: flex;
+      justify-content: center;
+
+      button {
+        margin: 0 2px;
+      }
+    }
+  }
+}
+
+.pagination-container {
+  display: flex;
+  justify-content: flex-end;
+  background: #fff;
+  padding: 12px 16px;
+  border-radius: 4px;
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+
+// 鍝嶅簲寮忚皟鏁�
+@media (max-width: 768px) {
+  .coupon-management {
+    padding: 8px;
+  }
+
+  .filter-content .search-form {
+    /deep/ .ivu-form-item {
+      width: 100%;
+      margin-right: 0;
+
+      .ivu-form-item-content {
+        width: 100%;
+
+        .ivu-input, .ivu-select {
+          width: 100% !important;
+        }
+      }
+    }
+  }
+
+  .operation-container {
+    flex-direction: column;
+    align-items: flex-start;
+
+    .add-btn {
+      margin-bottom: 8px;
+    }
+  }
+
+  .action-btns {
+    flex-direction: column;
+
+    button {
+      margin: 2px 0 !important;
+      width: 100%;
+    }
+  }
+}
+</style>

--
Gitblit v1.8.0