Răsfoiți Sursa

游戏支付渠道

ith5 6 luni în urmă
părinte
comite
e973fb6e3b

+ 2 - 2
src/views/v1/advert/agentSite/index.vue

@@ -91,8 +91,8 @@
       </template>
 
       <template #operationAfterExtend="{ record }">
-        <a-button size="mini" type="primary" @click="addLinkDebug(record)"
-          >联调</a-button
+        <a-button size="mini" type="text" @click="addLinkDebug(record)"
+          ><icon-bug />联调</a-button
         >
       </template>
       <!-- Table 自定义渲染 -->

+ 101 - 0
src/views/v1/advert/callbackPushLog/edit.vue

@@ -0,0 +1,101 @@
+<template>
+  <component
+    is="a-modal"
+    :width="tool.getDevice() === 'mobile' ? '100%' : '600px'"
+    v-model:visible="visible"
+    :title="title"
+    :mask-closable="false"
+    :ok-loading="loading"
+    @cancel="close"
+    @before-ok="submit">
+    <!-- 表单信息 start -->
+    <a-form ref="formRef" :model="formData" :rules="rules" :auto-label-width="true">
+    </a-form>
+    <!-- 表单信息 end -->
+  </component>
+</template>
+
+<script setup>
+import { ref, reactive, computed } from 'vue'
+import tool from '@/utils/tool'
+import { Message, Modal } from '@arco-design/web-vue'
+import api from '../../api/advert/callbackPushLog'
+
+const emit = defineEmits(['success'])
+// 引用定义
+const visible = ref(false)
+const loading = ref(false)
+const formRef = ref()
+const mode = ref('')
+
+let title = computed(() => {
+  return '媒体上报日志' + (mode.value == 'add' ? '-新增' : '-编辑')
+})
+
+// 表单初始值
+const initialFormData = {
+  id: null,
+}
+
+// 表单信息
+const formData = reactive({ ...initialFormData })
+
+// 验证规则
+const rules = {
+}
+
+// 打开弹框
+const open = async (type = 'add') => {
+  mode.value = type
+  // 重置表单数据
+  Object.assign(formData, initialFormData)
+  formRef.value.clearValidate()
+  visible.value = true
+  await initPage()
+}
+
+// 初始化页面数据
+const initPage = async () => {}
+
+// 设置数据
+const setFormData = async (data) => {
+  for (const key in formData) {
+    if (data[key] != null && data[key] != undefined) {
+      formData[key] = data[key]
+    }
+  }
+}
+
+// 数据保存
+const submit = async (done) => {
+  const validate = await formRef.value?.validate()
+  if (!validate) {
+    loading.value = true
+    let data = { ...formData }
+    let result = {}
+    if (mode.value === 'add') {
+      // 添加数据
+      data.id = undefined
+      result = await api.save(data)
+    } else {
+      // 修改数据
+      result = await api.update(data.id, data)
+    }
+    if (result.code === 200) {
+      Message.success('操作成功')
+      emit('success')
+      done(true)
+    }
+    // 防止连续点击提交
+    setTimeout(() => {
+      loading.value = false
+    }, 500)
+  }
+  done(false)
+}
+
+// 关闭弹窗
+const close = () => (visible.value = false)
+
+defineExpose({ open, setFormData })
+</script>

+ 165 - 0
src/views/v1/advert/callbackPushLog/index.vue

@@ -0,0 +1,165 @@
+<template>
+  <div class="ma-content-block">
+    <sa-table
+      ref="crudRef"
+      :options="options"
+      :columns="columns"
+      :searchForm="searchForm"
+    >
+      <!-- 搜索区 tableSearch -->
+      <template #tableSearch>
+        <a-col :sm="8" :xs="24">
+          <a-form-item label="用户名" field="user_name">
+            <a-input
+              v-model="searchForm.user_name"
+              placeholder="请输入用户名"
+              allow-clear
+            />
+          </a-form-item>
+        </a-col>
+        <a-col :sm="8" :xs="24">
+          <a-form-item label="渠道ID" field="agent_id">
+            <a-input
+              v-model="searchForm.agent_id"
+              placeholder="请输入渠道ID"
+              allow-clear
+            />
+          </a-form-item>
+        </a-col>
+        <a-col :sm="8" :xs="24">
+          <a-form-item label="广告位ID" field="site_id">
+            <a-input
+              v-model="searchForm.site_id"
+              placeholder="请输入广告位ID"
+              allow-clear
+            />
+          </a-form-item>
+        </a-col>
+        <a-col :sm="8" :xs="24">
+          <a-form-item label="注册时间" field="reg_time">
+            <a-range-picker
+              class="w-full"
+              v-model="searchForm.reg_time"
+              :show-time="true"
+              mode="date"
+            />
+          </a-form-item>
+        </a-col>
+        <a-col :sm="8" :xs="24">
+          <a-form-item label="上报时间" field="add_time">
+            <a-range-picker
+              class="w-full"
+              v-model="searchForm.add_time"
+              :show-time="true"
+              mode="date"
+            />
+          </a-form-item>
+        </a-col>
+        <a-col :sm="8" :xs="24">
+          <a-form-item label="上报类型" field="step">
+            <sa-select
+              v-model="searchForm.step"
+              dict="callback_step"
+              placeholder="请选择上报类型"
+              allow-clear
+            />
+          </a-form-item>
+        </a-col>
+        <a-col :sm="8" :xs="24">
+          <a-form-item label="媒体类型" field="media_id">
+            <a-input
+              v-model="searchForm.media_id"
+              placeholder="请输入媒体类型"
+              allow-clear
+            />
+          </a-form-item>
+        </a-col>
+      </template>
+
+      <!-- Table 自定义渲染 -->
+    </sa-table>
+
+    <!-- 编辑表单 -->
+    <edit-form ref="editRef" @success="refresh" />
+  </div>
+</template>
+
+<script setup>
+import { onMounted, ref, reactive } from "vue";
+import { Message } from "@arco-design/web-vue";
+import EditForm from "./edit.vue";
+import api from "../../api/advert/callbackPushLog";
+
+// 引用定义
+const crudRef = ref();
+const editRef = ref();
+const viewRef = ref();
+
+// 搜索表单
+const searchForm = ref({
+  user_name: "",
+  agent_id: "",
+  site_id: "",
+  reg_time: [],
+  add_time: [],
+  step: "",
+  media_id: "",
+});
+
+// SaTable 基础配置
+const options = reactive({
+  api: api.getPageList,
+  rowSelection: { showCheckedAll: true },
+  operationColumn: false,
+});
+
+// SaTable 列配置
+const columns = reactive([
+  {
+    title: "类型",
+    dataIndex: "step",
+    type: "dict",
+    dict: "callback_step",
+    width: 120,
+  },
+  { title: "用户名", dataIndex: "user_name", width: 120 },
+  { title: "上报游戏", dataIndex: "game_id", width: 120 },
+  { title: "上报渠道", dataIndex: "agent_id", width: 120 },
+  { title: "上报广告位", dataIndex: "site_id", width: 120 },
+  { title: "上报时间", dataIndex: "add_time", width: 120 },
+
+  { title: "注册游戏", dataIndex: "reg_game_id", width: 120 },
+  { title: "注册渠道", dataIndex: "reg_agent_id", width: 120 },
+  { title: "注册广告位", dataIndex: "reg_site_id", width: 120 },
+  { title: "注册时间", dataIndex: "reg_time", width: 120 },
+
+  { title: "上报金额", dataIndex: "money", width: 180 },
+  { title: "上报设备号", dataIndex: "imei", width: 280 },
+  { title: "上报IP", dataIndex: "ip", width: 180 },
+
+  { title: "系统版本", dataIndex: "system_version", width: 120 },
+  { title: "sdk版本", dataIndex: "sdk_version", width: 120 },
+  { title: "包名", dataIndex: "packname", width: 120 },
+  {
+    title: "接口",
+    dataIndex: "media_type",
+    type: "dict",
+    dict: "callback_media_type",
+    width: 120,
+  },
+]);
+
+// 页面数据初始化
+const initPage = async () => {};
+
+// SaTable 数据请求
+const refresh = async () => {
+  crudRef.value?.refresh();
+};
+
+// 页面加载完成执行
+onMounted(async () => {
+  initPage();
+  refresh();
+});
+</script>

+ 67 - 0
src/views/v1/api/advert/callbackPushLog.js

@@ -0,0 +1,67 @@
+import { request } from '@/utils/request.js'
+
+/**
+ * 媒体上报日志 API接口
+ */
+export default {
+
+  /**
+   * 数据列表
+   * @returns
+   */
+  getPageList(params = {}) {
+    return request({
+      url: '/v1/advert/CallbackPushLog/index',
+      method: 'get',
+      params
+    })
+  },
+
+  /**
+   * 添加数据
+   * @returns
+   */
+  save(params = {}) {
+    return request({
+      url: '/v1/advert/CallbackPushLog/save',
+      method: 'post',
+      data: params
+    })
+  },
+
+  /**
+   * 更新数据
+   * @returns
+   */
+  update(id, data = {}) {
+    return request({
+      url: '/v1/advert/CallbackPushLog/update?id=' + id,
+      method: 'put',
+      data
+    })
+  },
+
+  /**
+   * 读取数据
+   * @returns
+   */
+  read(id) {
+    return request({
+      url: '/v1/advert/CallbackPushLog/read?id=' + id,
+      method: 'get'
+    })
+  },
+
+  /**
+   * 删除数据
+   * @returns
+   */
+  destroy(data) {
+    return request({
+      url: '/v1/advert/CallbackPushLog/destroy',
+      method: 'delete',
+      data
+    })
+  },
+
+}

+ 76 - 0
src/views/v1/api/center/gamePayChannel.js

@@ -0,0 +1,76 @@
+import { request } from "@/utils/request.js";
+
+/**
+ * 游戏支付渠道 API接口
+ */
+export default {
+  /**
+   * 数据列表
+   * @returns
+   */
+  getPageList(params = {}) {
+    return request({
+      url: "/v1/center/GamePayChannel/index",
+      method: "get",
+      params,
+    });
+  },
+
+  /**
+   * 添加数据
+   * @returns
+   */
+  save(params = {}) {
+    return request({
+      url: "/v1/center/GamePayChannel/save",
+      method: "post",
+      data: params,
+    });
+  },
+
+  /**
+   * 更新数据
+   * @returns
+   */
+  update(id, data = {}) {
+    return request({
+      url: "/v1/center/GamePayChannel/update?id=" + id,
+      method: "put",
+      data,
+    });
+  },
+
+  /**
+   * 读取数据
+   * @returns
+   */
+  read(id) {
+    return request({
+      url: "/v1/center/GamePayChannel/read?id=" + id,
+      method: "get",
+    });
+  },
+
+  /**
+   * 删除数据
+   * @returns
+   */
+  destroy(data) {
+    return request({
+      url: "/v1/center/GamePayChannel/destroy",
+      method: "delete",
+      data,
+    });
+  },
+
+  /**
+   * 获取支付主体
+   * @returns
+   */
+  getPaySubjectApi() {
+    return request({
+      url: "/v1/center/GamePayChannel/getPaySubject",
+      method: "get",
+    });
+  },
+};

+ 261 - 0
src/views/v1/center/gamePayChannel/edit.vue

@@ -0,0 +1,261 @@
+<template>
+  <component
+    is="a-modal"
+    :width="tool.getDevice() === 'mobile' ? '100%' : '600px'"
+    v-model:visible="visible"
+    :title="title"
+    :mask-closable="false"
+    :ok-loading="loading"
+    @cancel="close"
+    @before-ok="submit"
+  >
+    <!-- 表单信息 start -->
+    <a-form
+      ref="formRef"
+      :model="formData"
+      :rules="rules"
+      :auto-label-width="true"
+    >
+      <a-form-item label="游戏" field="game_id">
+        <a-tree-select
+          v-model="formData.game_id"
+          :data="gameList"
+          placeholder="请选择游戏"
+          allow-clear
+          :field-names="{ title: 'name', key: 'id' }"
+          allow-search
+          tree-checked-strategy="child"
+          :tree-checkable="false"
+          :max-tag-count="1"
+          @change="handleGameChange"
+        />
+      </a-form-item>
+      <a-form-item v-if="os == 2" label="内购" field="inapp">
+        <a-select v-model="formData.inapp" placeholder="请选择内购" allow-clear>
+          <a-option
+            v-for="item in paySubjectList"
+            v-show="item.pay_type == 'apple'"
+            :key="item.id"
+            :value="item.id"
+            >{{ item.name }}</a-option
+          >
+        </a-select>
+      </a-form-item>
+      <a-form-item v-if="os == 3" label="内购" field="inapp">
+        <a-select v-model="formData.inapp" placeholder="请选择内购" allow-clear>
+          <a-option
+            v-for="item in paySubjectList"
+            v-show="item.pay_type == 'wechat' && item.sub_pay_type == 'inapp'"
+            :key="item.id"
+            :value="item.id"
+            >{{ item.name }}</a-option
+          >
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        v-if="os == 2 || os == 1 || os == 5"
+        label="微信wap"
+        field="wechat_wap"
+      >
+        <a-select
+          v-model="formData.wechat_wap"
+          placeholder="请选择微信wap"
+          allow-clear
+        >
+          <a-option
+            v-for="item in paySubjectList"
+            v-show="item.pay_type == 'wechat' && item.sub_pay_type == 'wap'"
+            :key="item.id"
+            :value="item.id"
+            >{{ item.name }}</a-option
+          >
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        v-if="os == 2 || os == 1 || os == 5"
+        label="支付宝wap"
+        field="alipay_wap"
+      >
+        <a-select
+          v-model="formData.alipay_wap"
+          placeholder="请选择支付宝wap"
+          allow-clear
+        >
+          <a-option
+            v-for="item in paySubjectList"
+            v-show="item.pay_type == 'alipay' && item.sub_pay_type == 'wap'"
+            :key="item.id"
+            :value="item.id"
+            >{{ item.name }}</a-option
+          >
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        label="微信扫码"
+        v-if="os == 1 || os == 5"
+        field="wechat_scan"
+      >
+        <a-select
+          v-model="formData.wechat_scan"
+          placeholder="请选择微信扫码"
+          allow-clear
+        >
+          <a-option
+            v-for="item in paySubjectList"
+            v-show="item.pay_type == 'wechat' && item.sub_pay_type == 'scan'"
+            :key="item.id"
+            :value="item.id"
+            >{{ item.name }}</a-option
+          >
+        </a-select>
+      </a-form-item>
+      <a-form-item label="微信公众号" v-if="os == 4" field="wechat_jsapi">
+        <a-select
+          v-model="formData.wechat_jsapi"
+          placeholder="请选择微信公众号"
+          allow-clear
+        >
+          <a-option
+            v-for="item in paySubjectList"
+            v-show="item.pay_type == 'wechat' && item.sub_pay_type == 'jsapi'"
+            :key="item.id"
+            :value="item.id"
+            >{{ item.name }}</a-option
+          >
+        </a-select>
+      </a-form-item>
+    </a-form>
+    <!-- 表单信息 end -->
+  </component>
+</template>
+
+<script setup>
+import { ref, reactive, computed, watchEffect } from "vue";
+import tool from "@/utils/tool";
+import { Message, Modal } from "@arco-design/web-vue";
+import api from "../../api/center/gamePayChannel";
+import commonApi from "../../api/common";
+import centerGameApi from "../../api/center/game";
+
+const emit = defineEmits(["success"]);
+// 引用定义
+const visible = ref(false);
+const loading = ref(false);
+const formRef = ref();
+const mode = ref("");
+const paySubjectList = ref([]);
+const gameList = ref([]);
+const os = ref("");
+
+let title = computed(() => {
+  return "游戏支付渠道" + (mode.value == "add" ? "-新增" : "-编辑");
+});
+
+// 表单初始值
+const initialFormData = {
+  id: null,
+  game_id: null,
+  inapp: null,
+  wechat_wap: null,
+  alipay_wap: null,
+  wechat_scan: null,
+  wechat_jsapi: null,
+};
+
+// 表单信息
+const formData = reactive({ ...initialFormData });
+
+// 验证规则
+const rules = {
+  game_id: [{ required: true, message: "游戏必需填写" }],
+};
+
+// 获取游戏列表
+const getGameList = async () => {
+  const res = await commonApi.getGameListTreeNoAuthApi({ single: true });
+  if (res.code === 200) {
+    gameList.value = res.data;
+  }
+};
+
+// 获取支付主体
+const getPaySubject = async () => {
+  const res = await api.getPaySubjectApi();
+  if (res.code === 200) {
+    paySubjectList.value = res.data;
+  }
+};
+
+// 游戏选择
+const handleGameChange = async (value) => {
+  const res = await centerGameApi.read(value);
+  if (res.code === 200) {
+    os.value = res.data.os;
+    formData.inapp = null;
+    formData.wechat_wap = null;
+    formData.alipay_wap = null;
+    formData.wechat_scan = null;
+    formData.wechat_jsapi = null;
+  }
+};
+
+// 打开弹框
+const open = async (type = "add") => {
+  mode.value = type;
+  // 重置表单数据
+  Object.assign(formData, initialFormData);
+
+  formRef.value.clearValidate();
+  visible.value = true;
+  await initPage();
+};
+
+// 初始化页面数据
+const initPage = async () => {
+  await getGameList();
+  await getPaySubject();
+};
+
+// 设置数据
+const setFormData = async (data) => {
+  for (const key in formData) {
+    if (data[key] != null && data[key] != undefined) {
+      formData[key] = data[key];
+    }
+  }
+  os.value = data.game_os;
+};
+
+// 数据保存
+const submit = async (done) => {
+  const validate = await formRef.value?.validate();
+  if (!validate) {
+    loading.value = true;
+    let data = { ...formData };
+    let result = {};
+    if (mode.value === "add") {
+      // 添加数据
+      data.id = undefined;
+      result = await api.save(data);
+    } else {
+      // 修改数据
+      result = await api.update(data.id, data);
+    }
+    if (result.code === 200) {
+      Message.success("操作成功");
+      emit("success");
+      done(true);
+    }
+    // 防止连续点击提交
+    setTimeout(() => {
+      loading.value = false;
+    }, 500);
+  }
+  done(false);
+};
+
+// 关闭弹窗
+const close = () => (visible.value = false);
+
+defineExpose({ open, setFormData });
+</script>

+ 95 - 0
src/views/v1/center/gamePayChannel/index.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="ma-content-block">
+    <sa-table
+      ref="crudRef"
+      :options="options"
+      :columns="columns"
+      :searchForm="searchForm"
+    >
+      <!-- 搜索区 tableSearch -->
+      <template #tableSearch>
+        <a-col :sm="8" :xs="24">
+          <a-form-item label="游戏" field="game_id">
+            <a-select
+              v-model="searchForm.game_id"
+              :options="[]"
+              placeholder="请选择游戏"
+              allow-clear
+            />
+          </a-form-item>
+        </a-col>
+      </template>
+
+      <template #game_id="{ record }">
+        {{ record.game_id }}:{{ record.game_name }}
+      </template>
+
+      <!-- Table 自定义渲染 -->
+    </sa-table>
+
+    <!-- 编辑表单 -->
+    <edit-form ref="editRef" @success="refresh" />
+  </div>
+</template>
+
+<script setup>
+import { onMounted, ref, reactive } from "vue";
+import { Message } from "@arco-design/web-vue";
+import EditForm from "./edit.vue";
+import api from "../../api/center/gamePayChannel";
+
+// 引用定义
+const crudRef = ref();
+const editRef = ref();
+const viewRef = ref();
+
+// 搜索表单
+const searchForm = ref({
+  game_id: "",
+});
+
+// SaTable 基础配置
+const options = reactive({
+  api: api.getPageList,
+  rowSelection: { showCheckedAll: true },
+  add: {
+    show: true,
+    auth: ["/v1/center/GamePayChannel/save"],
+    func: async () => {
+      editRef.value?.open();
+    },
+  },
+  edit: {
+    show: true,
+    auth: ["/v1/center/GamePayChannel/update"],
+    func: async (record) => {
+      editRef.value?.open("edit");
+      editRef.value?.setFormData(record);
+    },
+  },
+});
+
+// SaTable 列配置
+const columns = reactive([
+  { title: "游戏", dataIndex: "game_id", width: 180 },
+  { title: "内购", dataIndex: "inapp_name", width: 180 },
+  { title: "微信wap", dataIndex: "wechat_wap_name", width: 180 },
+  { title: "支付宝wap", dataIndex: "alipay_wap_name", width: 180 },
+  { title: "微信扫码", dataIndex: "wechat_scan_name", width: 180 },
+  { title: "微信公众号", dataIndex: "wechat_jsapi_name", width: 180 },
+]);
+
+// 页面数据初始化
+const initPage = async () => {};
+
+// SaTable 数据请求
+const refresh = async () => {
+  crudRef.value?.refresh();
+};
+
+// 页面加载完成执行
+onMounted(async () => {
+  initPage();
+  refresh();
+});
+</script>