Sfoglia il codice sorgente

Merge branch 'dev' of http://124.70.149.18:10880/lianghj/queenshow into dev

bianjiang 1 anno fa
parent
commit
43048fb7db

+ 20 - 0
src/assets/icons/components/IconScan.tsx

@@ -0,0 +1,20 @@
+
+import { createIcon } from '@queenjs/icons';
+export const IconScan = createIcon(<svg viewBox="0 0 22 22">
+  <g transform="translate(-757 -851)">
+    <rect fill="none" width="22" height="22" transform="translate(757 851)" />
+    <g transform="translate(157.32 5.635)">
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9543.957,852.641v-4.93h5.383"
+        transform="translate(-8942)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9543.957,847.711v4.93h5.383"
+        transform="translate(-8942 12.379)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px"
+        d="M9549.342,852.641v-4.93h-5.384"
+        transform="translate(-8929.939)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9549.342,847.711v4.93h-5.384"
+        transform="translate(-8929.939 12.379)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9555.5,873.878h10.224"
+        transform="translate(-8949.879 -17.861)" />
+    </g>
+  </g>
+</svg>)

+ 15 - 0
src/assets/icons/components/IconTransfer.tsx

@@ -0,0 +1,15 @@
+
+import { createIcon } from '@queenjs/icons';
+export const IconTransfer = createIcon(<svg viewBox="0 0 22 22">
+  <g transform="translate(-757 -923)">
+    <g transform="translate(0 72)">
+      <rect fill="none" width="22" height="22" transform="translate(757 851)" />
+    </g>
+    <g transform="translate(-0.616 0.623)">
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9446.08,854.948l4.189,4.19h-16.032"
+        transform="translate(-8674.537 71.43)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9438.427,859.137l-4.189-4.19h16.032"
+        transform="translate(-8672.737 81.826)" />
+    </g>
+  </g>
+</svg>)

+ 2 - 0
src/assets/icons/index.ts

@@ -25,6 +25,8 @@ export * from "./components/IconResizeY";
 export * from "./components/IconRight";
 export * from "./components/IconRotate";
 export * from "./components/IconSave";
+export * from "./components/IconScan";
 export * from "./components/IconText";
+export * from "./components/IconTransfer";
 export * from "./components/IconVideo";
 export * from "./components/IconWechat";

+ 18 - 0
src/assets/icons/svg/scan.svg

@@ -0,0 +1,18 @@
+<svg viewBox="0 0 22 22">
+  <g transform="translate(-757 -851)">
+    <rect fill="none" width="22" height="22" transform="translate(757 851)" />
+    <g transform="translate(157.32 5.635)">
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9543.957,852.641v-4.93h5.383"
+        transform="translate(-8942)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9543.957,847.711v4.93h5.383"
+        transform="translate(-8942 12.379)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px"
+        d="M9549.342,852.641v-4.93h-5.384"
+        transform="translate(-8929.939)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9549.342,847.711v4.93h-5.384"
+        transform="translate(-8929.939 12.379)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9555.5,873.878h10.224"
+        transform="translate(-8949.879 -17.861)" />
+    </g>
+  </g>
+</svg>

+ 13 - 0
src/assets/icons/svg/transfer.svg

@@ -0,0 +1,13 @@
+<svg viewBox="0 0 22 22">
+  <g transform="translate(-757 -923)">
+    <g transform="translate(0 72)">
+      <rect fill="none" width="22" height="22" transform="translate(757 851)" />
+    </g>
+    <g transform="translate(-0.616 0.623)">
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9446.08,854.948l4.189,4.19h-16.032"
+        transform="translate(-8674.537 71.43)" />
+      <path fill="none" stroke="currentColor" stroke-width="1.5px" d="M9438.427,859.137l-4.189-4.19h16.032"
+        transform="translate(-8672.737 81.826)" />
+    </g>
+  </g>
+</svg>

+ 26 - 0
src/controllers/TimeController.ts

@@ -0,0 +1,26 @@
+export class TimeController {
+  delayTime: number;
+  durationTime: number;
+  _action: any;
+  _timer: any;
+  constructor(options?: { delayTime?: number; durationTime?: number }) {
+    this.delayTime = options?.delayTime || 0;
+    this.durationTime = options?.durationTime || 0;
+  }
+  setLoop(action: () => any) {
+    this._action = action;
+    return this;
+  }
+  start() {
+    this._timer = setTimeout(() => {
+      this._action();
+      this._timer = setInterval(() => {
+        this._action();
+      }, this.durationTime);
+    }, this.delayTime);
+  }
+  stop() {
+    clearTimeout(this._timer);
+    clearInterval(this._timer);
+  }
+}

+ 10 - 1
src/modules/editor/components/Viewport/Header/ShareBox.tsx

@@ -1,5 +1,6 @@
 import { useEditor } from "@/modules/editor";
 import { clipboard } from "@/utils";
+import { useAuth } from "@queenjs-modules/auth";
 import { useQRCode } from "@vueuse/integrations/useQRCode";
 import { Button } from "ant-design-vue";
 import { defineComponent } from "vue";
@@ -7,7 +8,15 @@ import { defineComponent } from "vue";
 export const ShareBox = defineComponent({
   setup() {
     const { store } = useEditor();
-    let shareLink = location.origin + "/share.html?id=" + store.designData._id;
+    const auth = useAuth();
+    const userInfo: any = auth.store.userInfo;
+    const isSys = userInfo.roles?.includes("system") ? true : false;
+    let shareLink =
+      location.origin +
+      "/share.html?id=" +
+      store.designData._id +
+      "&isSys=" +
+      isSys;
     // if (location.host == "www.infish.cn") {
     //   shareLink =
     //     location.origin +

+ 25 - 0
src/modules/payment/actions.ts

@@ -5,4 +5,29 @@ export const actions = PaymentModule.action({
     const { result } = await this.https.getPayPoinits();
     this.store.setPayPoints(result);
   },
+
+  async createOrder(
+    payMod: number,
+    data: {
+      productKey: string;
+      amount: number;
+      number: number;
+      quantity: number;
+    }
+  ) {
+    const currPayPoint = this.store.payPoints.find(
+      (d) => d.productKey === data.productKey
+    )!;
+    const orderData = {
+      ...data,
+      price: currPayPoint.price,
+      pointId: currPayPoint._id,
+    };
+    const { result: orderId } = await this.https.createOrder(orderData);
+    const { result: link } = await this.https.createOrderQr({
+      orderId: orderId,
+      payMod,
+    });
+    return { orderId, link };
+  },
 });

+ 5 - 9
src/modules/payment/https.ts

@@ -9,14 +9,10 @@ export const https = PaymentModule.http({
       },
     });
   },
-  getPayAmount(params: {
-    productKey: string;
-    quantity: number;
-    number: number;
-  }) {
-    return this.request("/pay/points", {
-      method: "GET",
-      params,
+  getPayAmount(data: { productKey: string; quantity: number; number: number }) {
+    return this.request("/pay/point/amount", {
+      method: "POST",
+      data,
     });
   },
   createOrder(data) {
@@ -31,7 +27,7 @@ export const https = PaymentModule.http({
       data,
     });
   },
-  getOrderDetail(params) {
+  getOrderDetail(params: { id: string }) {
     return this.request("/pay/order/detail", {
       method: "GET",
       params,

+ 1 - 1
src/pages/editor/EditPage/index.tsx

@@ -17,7 +17,7 @@ export default defineComponent(() => {
   auth.actions.on("getUserInfo:success", () => {
     if (prodId) {
       const userInfo: any = auth.store.userInfo;
-      const isSys = userInfo.roles?.includes("system");
+      const isSys = userInfo.roles?.includes("system") ? true : false;
       editor.actions.initDesign(prodId, isSys);
     } else {
       editor.jumpIndexHtml();

+ 2 - 1
src/pages/h5/share/Promotion.tsx

@@ -6,11 +6,12 @@ export default defineComponent(() => {
   const editor = initEditor();
   const params = new URLSearchParams(location.href.split("?")[1]);
   const id = params.get("id");
+  const isSys = params.get("isSys");
 
   editor.actions.switchMode("preview");
 
   if (id) {
-    editor.actions.initDesign(id);
+    editor.actions.initDesign(id, isSys?.split("#")[0]);
     editor.controls.wxCtrl.setup(window.location.href);
 
     editor.actions.on("initDesign:success", () => {

+ 25 - 0
src/pages/website/Payment/PayQrcode.tsx

@@ -0,0 +1,25 @@
+import { IconClose } from "@queenjs/icons";
+import { useQRCode } from "@vueuse/integrations/useQRCode";
+import { useModal } from "queenjs";
+import { defineComponent } from "vue";
+import { string } from "vue-types";
+
+export default defineComponent({
+  props: {
+    orderId: string().isRequired,
+    link: string().isRequired,
+  },
+  setup(props) {
+    const modal = useModal();
+    const qrUrl = useQRCode(props.link);
+    return () => (
+      <div class="-m-24px ">
+        <div class="relative p-20px bg-white">
+          <IconClose class="absolute top-10px right-10px text-30px !text-[#666] cursor-pointer" onClick={() => modal.cancel()}/>
+          <img class="w-200px" src={qrUrl.value} />
+          <div class="text-[#666] text-center">扫码支付</div>
+        </div>
+      </div>
+    );
+  },
+});

+ 290 - 48
src/pages/website/Payment/index.tsx

@@ -1,20 +1,30 @@
+import { TimeController } from "@/controllers/TimeController";
 import { initPayment } from "@/modules/payment";
 import { css } from "@linaria/core";
 import { useAuth } from "@queenjs-modules/auth";
-import { Button, Input } from "ant-design-vue";
+import { InputNumber } from "ant-design-vue";
+import { queenApi } from "queenjs";
+import Modal from "queenjs/adapter/vue/components/modal";
 import { defineComponent, reactive } from "vue";
+import PayQrcode from "./PayQrcode";
+import { IconScan, IconTransfer } from "@/assets/icons";
 
 export default defineComponent({
   setup() {
     const auth = useAuth();
-    const { store, actions } = initPayment({
+    const payment = initPayment({
       config: { project: "queenshow" },
     });
+    const { store, https, actions } = payment;
 
     const payVersions = [
       {
         label: "个人",
-        children: ["queenshow_person_year", "queenshow_person_month"],
+        children: [
+          "queenshow_person_year",
+          "queenshow_person_month",
+          // "queenshow_point_test",
+        ],
       },
       {
         label: "团队",
@@ -26,54 +36,199 @@ export default defineComponent({
       },
     ];
 
-    const payPointsInfo = {
+    const payWays = [
+      {
+        label: "快捷支付",
+        icon: IconScan,
+      },
+      {
+        label: "对公转账",
+        icon: IconTransfer,
+      },
+    ];
+
+    const payMethods: Record<string, { label: string; icon: string }> = {
+      wechatPay: {
+        label: "微信支付",
+        icon: require("@/assets/imgs/icon-wx.png"),
+      },
+      aliPay: {
+        label: "支付宝支付",
+        icon: require("@/assets/imgs/icon-zfb.png"),
+      },
+    };
+
+    const payPointsInfo: Record<
+      string,
+      {
+        name: string;
+        desc: string;
+        default: { quantity: number; number: number };
+        quantityProps?: any;
+        numberProps?: any;
+        quantityUnit?: string;
+        priceTip?: string;
+      }
+    > = {
+      // queenshow_point_test: {
+      //   name: "测试",
+      //   desc: "xxxx",
+      //   default: {
+      //     quantity: 1,
+      //     number: 1,
+      //   },
+      // },
       queenshow_person_year: {
         name: "一年VIP",
         desc: "高性价比之选",
+        default: {
+          quantity: 1,
+          number: 1,
+        },
       },
       queenshow_person_month: {
         name: "月度VIP",
         desc: "续费价199.0元",
+        default: {
+          quantity: 1,
+          number: 1,
+        },
+        quantityProps: {
+          min: 1,
+        },
+        quantityUnit: "月",
       },
       queenshow_team_15month: {
         name: "15个月/人",
         desc: "鲲舞精心之选",
+        priceTip: "团购30人以上",
+        default: {
+          quantity: 1,
+          number: 30,
+        },
+        numberProps: {
+          min: 30,
+        },
       },
       queenshow_team_year: {
         name: "年VIP/人",
         desc: "高性价比之选",
+        default: {
+          quantity: 1,
+          number: 1,
+        },
+        numberProps: {
+          min: 1,
+        },
       },
       queenshow_team_month: {
         name: "月VIP/人",
         desc: "续费价199.0元",
+        default: {
+          quantity: 1,
+          number: 1,
+        },
+        numberProps: {
+          min: 1,
+        },
+        quantityProps: {
+          min: 1,
+        },
+        quantityUnit: "月",
       },
     };
 
     const state = reactive({
       versionIdx: 0,
+      payWayIdx: 0,
       orderInfo: {
         productKey: "",
-        price: 0,
-        quantity: 1,
-        number: 1,
+        quantity: 0,
+        number: 0,
       },
       amountPrice: 0,
     });
 
+    function changeVersion(idx: number) {
+      state.versionIdx = idx;
+      initOrderInfo(payVersions[idx].children[0]);
+    }
+
+    function initOrderInfo(productKey: string) {
+      state.orderInfo = {
+        productKey,
+        ...payPointsInfo[productKey].default,
+      };
+    }
+
     function changeOrderInfo(
       type: keyof (typeof state)["orderInfo"],
       value: any
     ) {
       (state.orderInfo as any)[type] = value;
+      if (type === "productKey") {
+        initOrderInfo(value);
+      }
       updateOrderAmount();
     }
 
     function updateOrderAmount() {
-      //
+      https.getPayAmount(state.orderInfo).then((ret) => {
+        state.amountPrice = ret.result;
+      });
     }
 
+    async function createOrderQrcode(payMod: number) {
+      queenApi.showLoading("加载中");
+      try {
+        // const orderId = "64b764473d1915628fe24045";
+        // const link = "64b764473d1915628fe24045";
+        const { orderId, link } = await actions.createOrder(payMod, {
+          ...state.orderInfo,
+          amount: state.amountPrice,
+        });
+
+        const orderStatusCtrl = new TimeController({
+          delayTime: 8000,
+          durationTime: 3000,
+        });
+        orderStatusCtrl
+          .setLoop(async () => {
+            const { result } = await https.getOrderDetail({ id: orderId });
+            if (result.status === 2) {
+              orderStatusCtrl.stop();
+              Modal.clear();
+              auth.actions.getUserInfo();
+            }
+          })
+          .start();
+
+        queenApi
+          .dialog(
+            <PayQrcode orderId={orderId} link={link} />,
+            {
+              closable: false,
+            },
+            { payment }
+          )
+          .catch(() => {
+            orderStatusCtrl.stop();
+          });
+      } catch (error: any) {
+        queenApi.messageError(error.toString());
+      } finally {
+        queenApi.hideLoading();
+      }
+    }
+
+    changeOrderInfo("productKey", payVersions[state.versionIdx].children[0]);
+
     return () => {
       const { saas } = auth.store.userInfo as any;
+      const currPayInfo = payPointsInfo[state.orderInfo.productKey];
+      const currPayPoint = store.payPoints.find(
+        (d) => d.productKey === state.orderInfo.productKey
+      );
       return (
         <div class={rootCls}>
           <header class="p-0.24rem">
@@ -112,10 +267,6 @@ export default defineComponent({
               </ul>
             </section>
             <div class="flex-1 space-y-0.18rem">
-              {/* <section>
-                <label>购买版本</label>
-                <span class="checkbox checked">{payConf.versionName}</span>
-              </section> */}
               <section>
                 <label class="">购买版本</label>
                 {payVersions.map((d, i) => {
@@ -123,7 +274,7 @@ export default defineComponent({
                     <span
                       key={i}
                       class={["checkbox", i === state.versionIdx && "checked"]}
-                      onClick={() => (state.versionIdx = i)}
+                      onClick={() => changeVersion(i)}
                     >
                       {d.label}
                     </span>
@@ -138,8 +289,6 @@ export default defineComponent({
                     const price =
                       store.payPoints.find((p) => p.productKey === d)?.price ||
                       0;
-
-                    console.log(price, d);
                     return (
                       <div
                         key={i}
@@ -149,6 +298,9 @@ export default defineComponent({
                         ]}
                         onClick={() => changeOrderInfo("productKey", d)}
                       >
+                        {item.priceTip && (
+                          <div class="priceTip">{item.priceTip}</div>
+                        )}
                         <div class="text-0.16rem font-bold text-[#666] pt-0.16rem ">
                           {item.name}
                         </div>
@@ -163,45 +315,101 @@ export default defineComponent({
                     );
                   })}
                 </div>
-                <div class="mt-0.28rem">
-                  <span class="text-0.16rem text-[#111] font-bold">
-                    人数选择:
-                  </span>
-                  <Input class="w-1.8rem mx-0.16rem !border-[#c9c9c9]" />
-                  <span class="text-0.16rem text-[#666]">人</span>
-                  <span class="text-0.16rem text-[#111] font-bold ml-0.85rem">
-                    时长设置:
-                  </span>
-                  <Input class="w-1.8rem mx-0.16rem !border-[#c9c9c9]" />
-                  <span class="text-0.16rem text-[#666]">年</span>
+                <div class="mt-0.28rem text-[#111]">
+                  {currPayInfo.numberProps && (
+                    <>
+                      <span class="text-0.16rem font-bold">人数选择:</span>
+                      <InputNumber
+                        class="inputNum"
+                        value={state.orderInfo.number}
+                        onChange={(v) => changeOrderInfo("number", v)}
+                        {...currPayInfo.numberProps}
+                      />
+                      <span class="text-0.16rem text-[#666] mr-0.85rem">
+                        人
+                      </span>
+                    </>
+                  )}
+                  {currPayInfo.quantityProps && (
+                    <>
+                      <span class="text-0.16rem font-bold">时长设置:</span>
+                      <InputNumber
+                        class="inputNum"
+                        value={state.orderInfo.quantity}
+                        onChange={(v) => changeOrderInfo("quantity", v)}
+                        {...currPayInfo.quantityProps}
+                      />
+                      <span class="text-0.16rem text-[#666]">
+                        {currPayInfo.quantityUnit}
+                      </span>
+                    </>
+                  )}
                 </div>
               </section>
               <section>
                 <label class="">支付订单</label>
-                <div class="payMethod">
-                  <div class="text-0.16rem font-bold my-0.3rem">
-                    <span>实付款:</span>
-                    <span class="text-0.3rem text-[#D34D39]">
-                      {state.amountPrice}
-                    </span>
-                    <span class="text-[#D34D39]">元</span>
+                <div class="payMethod flex">
+                  <div class="py-0.24rem space-y-0.14rem">
+                    {payWays.map((d, i) => {
+                      return (
+                        <div
+                          class={[
+                            "payTabItem",
+                            state.payWayIdx === i && "checked",
+                          ]}
+                          key={i}
+                          onClick={() => (state.payWayIdx = i)}
+                        >
+                          <d.icon class="mr-0.08rem" />
+                          {d.label}
+                        </div>
+                      );
+                    })}
                   </div>
-                  <div>
-                    <div class="payBtn">
-                      <img
-                        class="h-0.2rem mr-0.1rem"
-                        src={require("@/assets/imgs/icon-wx.png")}
-                      />
-                      微信支付
-                    </div>
-                    <span class="mx-0.1rem align-text-bottom">或</span>
-                    <div class="payBtn">
-                      <img
-                        class="h-0.2rem mr-0.1rem"
-                        src={require("@/assets/imgs/icon-zfb.png")}
-                      />
-                      支付宝支付
+
+                  <div class="flex-1 ml-0.3rem">
+                    <div class="text-0.16rem font-bold my-0.3rem">
+                      <span>实付款:</span>
+                      <span class="text-0.3rem text-[#D34D39]">
+                        {state.amountPrice.toFixed(1)}
+                      </span>
+                      <span class="text-[#D34D39]">元</span>
                     </div>
+                    {state.payWayIdx === 0 && (
+                      <div>
+                        {currPayPoint?.payMethods.map((d, i) => {
+                          const item = payMethods[d.Key];
+                          const isLast =
+                            currPayPoint.payMethods.length === i + 1;
+                          return (
+                            <>
+                              <div
+                                class="payBtn"
+                                key={d.Key}
+                                onClick={() => createOrderQrcode(d.Value)}
+                              >
+                                <img
+                                  class="h-0.2rem mr-0.1rem"
+                                  src={item.icon}
+                                />
+                                {item.label}
+                              </div>
+                              {!isLast && (
+                                <span class="mx-0.1rem align-text-bottom">
+                                  或
+                                </span>
+                              )}
+                            </>
+                          );
+                        })}
+                      </div>
+                    )}
+                    {state.payWayIdx === 1 && (
+                      <div class="text-0.2rem">
+                        请咨询:
+                        <tel class="text-[#DB8F32]">138 0804 4500</tel>
+                      </div>
+                    )}
                   </div>
                 </div>
               </section>
@@ -250,6 +458,7 @@ const rootCls = css`
     cursor: pointer;
 
     &.priceBox {
+      position: relative;
       display: inline-flex;
       flex-direction: column;
       justify-content: space-between;
@@ -267,12 +476,41 @@ const rootCls = css`
         color: #885428;
       }
     }
+
+    .priceTip {
+      position: absolute;
+      top: 0;
+      right: 0;
+      padding: 0.06rem 0.1rem;
+      font-size: 0.12rem;
+      line-height: 1;
+      background-color: #93643d;
+      color: #fff7e8;
+      border-top-right-radius: 0.04rem;
+      border-bottom-left-radius: 0.04rem;
+    }
   }
 
   .splitline {
     border-bottom: 1px solid #e0e0e0;
   }
 
+  .payTabItem {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 1.58rem;
+    height: 0.58rem;
+    color: #666;
+    border-radius: 0.06rem;
+    cursor: pointer;
+
+    &.checked {
+      background-color: #f1f2f4;
+      color: #333;
+    }
+  }
+
   .payMethod {
     margin-top: 0.24rem;
     border-top: 1px solid #e0e0e0;
@@ -288,4 +526,8 @@ const rootCls = css`
     border-radius: 0.06rem;
     cursor: pointer;
   }
+
+  .inputNum {
+    @apply w-1.8rem mx-0.16rem border-[#c9c9c9] text-[#111];
+  }
 `;

+ 10 - 1
src/pages/website/Promotion2/components/ShareModal.tsx

@@ -1,6 +1,7 @@
 import { IconWechat } from "@/assets/icons";
 import { PromotionController } from "@/modules/resource/controllers/PromotionController";
 import { clipboard } from "@/utils";
+import { useAuth } from "@queenjs-modules/auth";
 import { Image } from "@queenjs/ui";
 import { useQRCode } from "@vueuse/integrations/useQRCode";
 import { Button, Divider, Input } from "ant-design-vue";
@@ -13,7 +14,15 @@ export default defineComponent({
     controller: any<PromotionController>().isRequired,
   },
   setup(props, { slots }) {
-    let shareLink = location.origin + "/share.html?id=" + props.record._id;
+    const auth = useAuth();
+    const userInfo: any = auth.store.userInfo;
+    const isSys = userInfo.roles?.includes("system") ? true : false;
+    let shareLink =
+      location.origin +
+      "/share.html?id=" +
+      props.record._id +
+      "&isSys=" +
+      isSys;
     // if (location.host == "www.infish.cn") {
     //   shareLink =
     //     location.origin +

+ 1 - 1
src/pages/website/Promotion2/controller.tsx

@@ -37,7 +37,7 @@ export function createPromotinController(
 
   async function sharePromotion(record: any) {
     const userInfo: any = auth.store.userInfo;
-    const isSys = userInfo.roles?.includes("system");
+    const isSys = userInfo.roles?.includes("system") ? true : false;
     await editor.actions.initDesign(record._id, isSys);
     editor.actions.switchMode("preview");
     resource.showModal(

+ 1 - 1
vue.config.js

@@ -18,7 +18,7 @@ module.exports = defineConfig({
     index: "src/pages/website/index.ts",
     editor: "src/pages/editor/index.ts",
     share: "src/pages/h5/share/index.ts",
-    // stat: "src/pages/h5/statistics/index.ts",
+    stat: "src/pages/h5/statistics/index.ts",
     treeapi: "src/pages/queentree/index.ts",
   },
   publicPath: publicPath,