소스 검색

完善游戏管理

ith5 6 달 전
부모
커밋
18b493316b
5개의 변경된 파일378개의 추가작업 그리고 211개의 파일을 삭제
  1. 232 204
      src/utils/tool.js
  2. 2 2
      src/views/v1/api/center/game.js
  3. 92 0
      src/views/v1/center/game/cp-info.vue
  4. 22 1
      src/views/v1/center/game/edit.vue
  5. 30 4
      src/views/v1/center/game/index.vue

+ 232 - 204
src/utils/tool.js

@@ -1,84 +1,84 @@
-import CryptoJS from 'crypto-js'
-import CityLinkageJson from '@/components/ma-cityLinkage/lib/city.json'
+import CryptoJS from "crypto-js";
+import CityLinkageJson from "@/components/ma-cityLinkage/lib/city.json";
 
 /**
  * 根据类型获取颜色
  */
-const typeColor = (type = 'default') => {
-  let color = ''
+const typeColor = (type = "default") => {
+  let color = "";
   switch (type) {
-    case 'default':
-      color = '#35495E'
-      break
-    case 'primary':
-      color = '#3488ff'
-      break
-    case 'success':
-      color = '#43B883'
-      break
-    case 'warning':
-      color = '#e6a23c'
-      break
-    case 'danger':
-      color = '#f56c6c'
-      break
+    case "default":
+      color = "#35495E";
+      break;
+    case "primary":
+      color = "#3488ff";
+      break;
+    case "success":
+      color = "#43B883";
+      break;
+    case "warning":
+      color = "#e6a23c";
+      break;
+    case "danger":
+      color = "#f56c6c";
+      break;
     default:
-      break
+      break;
   }
-  return color
-}
+  return color;
+};
 
-const tool = {}
+const tool = {};
 
 /**
  * LocalStorage
  */
 tool.local = {
   set(table, settings) {
-    let _set = JSON.stringify(settings)
-    return localStorage.setItem(table, _set)
+    let _set = JSON.stringify(settings);
+    return localStorage.setItem(table, _set);
   },
   get(table) {
-    let data = localStorage.getItem(table)
+    let data = localStorage.getItem(table);
     try {
-      data = JSON.parse(data)
+      data = JSON.parse(data);
     } catch (err) {
-      return null
+      return null;
     }
-    return data
+    return data;
   },
   remove(table) {
-    return localStorage.removeItem(table)
+    return localStorage.removeItem(table);
   },
   clear() {
-    return localStorage.clear()
-  }
-}
+    return localStorage.clear();
+  },
+};
 
 /**
  * SessionStorage
  */
 tool.session = {
   set(table, settings) {
-    let _set = JSON.stringify(settings)
-    return sessionStorage.setItem(table, _set)
+    let _set = JSON.stringify(settings);
+    return sessionStorage.setItem(table, _set);
   },
   get(table) {
-    let data = sessionStorage.getItem(table)
+    let data = sessionStorage.getItem(table);
     try {
-      data = JSON.parse(data)
+      data = JSON.parse(data);
     } catch (err) {
-      return null
+      return null;
     }
-    return data
+    return data;
   },
   remove(table) {
-    return sessionStorage.removeItem(table)
+    return sessionStorage.removeItem(table);
   },
   clear() {
-    return sessionStorage.clear()
-  }
-}
+    return sessionStorage.clear();
+  },
+};
 
 /**
  * CookieStorage
@@ -91,38 +91,38 @@ tool.cookie = {
       domain: null,
       secure: false,
       httpOnly: false,
-      ...config
-    }
-    var cookieStr = `${name}=${escape(value)}`
+      ...config,
+    };
+    var cookieStr = `${name}=${escape(value)}`;
     if (cfg.expires) {
-      var exp = new Date()
-      exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000)
-      cookieStr += `;expires=${exp.toGMTString()}`
+      var exp = new Date();
+      exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000);
+      cookieStr += `;expires=${exp.toGMTString()}`;
     }
     if (cfg.path) {
-      cookieStr += `;path=${cfg.path}`
+      cookieStr += `;path=${cfg.path}`;
     }
     if (cfg.domain) {
-      cookieStr += `;domain=${cfg.domain}`
+      cookieStr += `;domain=${cfg.domain}`;
     }
-    document.cookie = cookieStr
+    document.cookie = cookieStr;
   },
   get(name) {
     var arr = document.cookie.match(
-      new RegExp('(^| )' + name + '=([^;]*)(;|$)')
-    )
+      new RegExp("(^| )" + name + "=([^;]*)(;|$)")
+    );
     if (arr != null) {
-      return unescape(arr[2])
+      return unescape(arr[2]);
     } else {
-      return null
+      return null;
     }
   },
   remove(name) {
-    var exp = new Date()
-    exp.setTime(exp.getTime() - 1)
-    document.cookie = `${name}=;expires=${exp.toGMTString()}`
-  }
-}
+    var exp = new Date();
+    exp.setTime(exp.getTime() - 1);
+    document.cookie = `${name}=;expires=${exp.toGMTString()}`;
+  },
+};
 
 /**
  * 全屏操作
@@ -133,62 +133,62 @@ tool.screen = (element) => {
     document.mozFullScreen ||
     document.msFullscreenElement ||
     document.fullscreenElement
-  )
+  );
   if (isFull) {
     if (document.exitFullscreen) {
-      document.exitFullscreen()
+      document.exitFullscreen();
     } else if (document.msExitFullscreen) {
-      document.msExitFullscreen()
+      document.msExitFullscreen();
     } else if (document.mozCancelFullScreen) {
-      document.mozCancelFullScreen()
+      document.mozCancelFullScreen();
     } else if (document.webkitExitFullscreen) {
-      document.webkitExitFullscreen()
+      document.webkitExitFullscreen();
     }
   } else {
     if (element.requestFullscreen) {
-      element.requestFullscreen()
+      element.requestFullscreen();
     } else if (element.msRequestFullscreen) {
-      element.msRequestFullscreen()
+      element.msRequestFullscreen();
     } else if (element.mozRequestFullScreen) {
-      element.mozRequestFullScreen()
+      element.mozRequestFullScreen();
     } else if (element.webkitRequestFullscreen) {
-      element.webkitRequestFullscreen()
+      element.webkitRequestFullscreen();
     }
   }
-}
+};
 
 /**
  * 获取设备信息
  */
 tool.getDevice = function () {
   const hasTouchScreen =
-    'ontouchstart' in window || navigator.maxTouchPoints > 0
-  const isSmallScreen = window.innerWidth < 768
+    "ontouchstart" in window || navigator.maxTouchPoints > 0;
+  const isSmallScreen = window.innerWidth < 768;
 
   if (hasTouchScreen && isSmallScreen) {
-    return 'mobile'
+    return "mobile";
   } else {
-    return 'desktop'
+    return "desktop";
   }
-}
+};
 
 /**
  * 处理图片
  */
 tool.parseImage = (url) => {
   if (url === undefined) {
-    return import.meta.env.VITE_APP_BASE + 'not-image.png'
+    return import.meta.env.VITE_APP_BASE + "not-image.png";
   }
-  if (typeof url === 'string' && url !== null) {
-    return url
+  if (typeof url === "string" && url !== null) {
+    return url;
   } else {
     if (url !== null) {
-      return url[0]
+      return url[0];
     } else {
-      return import.meta.env.VITE_APP_BASE + 'not-image.png'
+      return import.meta.env.VITE_APP_BASE + "not-image.png";
     }
   }
-}
+};
 
 /**
  * 城市代码翻译成名称
@@ -197,37 +197,37 @@ tool.cityToCode = function (
   province,
   city = undefined,
   area = undefined,
-  split = ' / '
+  split = " / "
 ) {
   try {
     let provinceData = CityLinkageJson.filter(
       (item) => province == item.code
-    )[0]
+    )[0];
     if (!city) {
-      return provinceData.name
+      return provinceData.name;
     }
-    let cityData = provinceData.children.filter((item) => city == item.code)[0]
+    let cityData = provinceData.children.filter((item) => city == item.code)[0];
 
     if (!area) {
-      return [provinceData.name, cityData.name].join(split)
+      return [provinceData.name, cityData.name].join(split);
     }
-    let areaData = cityData.children.filter((item) => area == item.code)[0]
+    let areaData = cityData.children.filter((item) => area == item.code)[0];
 
-    return [provinceData.name, cityData.name, areaData.name].join(split)
+    return [provinceData.name, cityData.name, areaData.name].join(split);
   } catch (e) {
-    return ''
+    return "";
   }
-}
+};
 
 /**
  * 复制对象
  */
 tool.objCopy = (obj) => {
   if (obj === undefined) {
-    return undefined
+    return undefined;
   }
-  return JSON.parse(JSON.stringify(obj))
-}
+  return JSON.parse(JSON.stringify(obj));
+};
 
 /**
  * 生车随机id
@@ -235,80 +235,80 @@ tool.objCopy = (obj) => {
 tool.generateId = function () {
   return Math.floor(
     Math.random() * 100000 + Math.random() * 20000 + Math.random() * 5000
-  )
-}
+  );
+};
 
 /**
  * 日期格式化
  */
-tool.dateFormat = (date, fmt = 'yyyy-MM-dd hh:mm:ss', isDefault = '-') => {
+tool.dateFormat = (date, fmt = "yyyy-MM-dd hh:mm:ss", isDefault = "-") => {
   if (date.toString().length == 10) {
-    date = date * 1000
+    date = date * 1000;
   }
-  date = new Date(date)
+  date = new Date(date);
 
   if (date.valueOf() < 1) {
-    return isDefault
+    return isDefault;
   }
   let o = {
-    'M+': date.getMonth() + 1, //月份
-    'd+': date.getDate(), //日
-    'h+': date.getHours(), //小时
-    'm+': date.getMinutes(), //分
-    's+': date.getSeconds(), //秒
-    'q+': Math.floor((date.getMonth() + 3) / 3), //季度
-    S: date.getMilliseconds() //毫秒
-  }
+    "M+": date.getMonth() + 1, //月份
+    "d+": date.getDate(), //日
+    "h+": date.getHours(), //小时
+    "m+": date.getMinutes(), //分
+    "s+": date.getSeconds(), //秒
+    "q+": Math.floor((date.getMonth() + 3) / 3), //季度
+    S: date.getMilliseconds(), //毫秒
+  };
   if (/(y+)/.test(fmt)) {
     fmt = fmt.replace(
       RegExp.$1,
-      (date.getFullYear() + '').substr(4 - RegExp.$1.length)
-    )
+      (date.getFullYear() + "").substr(4 - RegExp.$1.length)
+    );
   }
   for (let k in o) {
-    if (new RegExp('(' + k + ')').test(fmt)) {
+    if (new RegExp("(" + k + ")").test(fmt)) {
       fmt = fmt.replace(
         RegExp.$1,
-        RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
-      )
+        RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
+      );
     }
   }
-  return fmt
-}
+  return fmt;
+};
 
 /**
  * 千分符
  */
 tool.groupSeparator = (num) => {
-  num = num + ''
-  if (!num.includes('.')) {
-    num += '.'
+  num = num + "";
+  if (!num.includes(".")) {
+    num += ".";
   }
   return num
     .replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
-      return $1 + ','
+      return $1 + ",";
     })
-    .replace(/\.$/, '')
-}
+    .replace(/\.$/, "");
+};
 
 /**
  * md5加密
  */
 tool.md5 = (str) => {
-  return CryptoJS.MD5(str).toString()
-}
+  return CryptoJS.MD5(str).toString();
+};
 
 /**
  * Base64加密解密
  */
 tool.base64 = {
   encode(data) {
-    return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data))
+    return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data));
   },
   decode(cipher) {
-    return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8)
-  }
-}
+    return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8);
+  },
+};
 
 /**
  * AES加密解密
@@ -320,10 +320,10 @@ tool.aes = {
       CryptoJS.enc.Utf8.parse(secretKey),
       {
         mode: CryptoJS.mode.ECB,
-        padding: CryptoJS.pad.Pkcs7
+        padding: CryptoJS.pad.Pkcs7,
       }
-    )
-    return result.toString()
+    );
+    return result.toString();
   },
   decode(cipher, secretKey) {
     const result = CryptoJS.AES.decrypt(
@@ -331,72 +331,72 @@ tool.aes = {
       CryptoJS.enc.Utf8.parse(secretKey),
       {
         mode: CryptoJS.mode.ECB,
-        padding: CryptoJS.pad.Pkcs7
+        padding: CryptoJS.pad.Pkcs7,
       }
-    )
-    return CryptoJS.enc.Utf8.stringify(result)
-  }
-}
+    );
+    return CryptoJS.enc.Utf8.stringify(result);
+  },
+};
 
 /**
  * 打印信息
  */
-tool.capsule = (title, info, type = 'primary') => {
+tool.capsule = (title, info, type = "primary") => {
   console.log(
     `%c ${title} %c ${info} %c`,
-    'background:#35495E; padding: 1px; border-radius: 3px 0 0 3px; color: #fff;',
+    "background:#35495E; padding: 1px; border-radius: 3px 0 0 3px; color: #fff;",
     `background:${typeColor(
       type
     )}; padding: 1px; border-radius: 0 3px 3px 0;  color: #fff;`,
-    'background:transparent'
-  )
-}
+    "background:transparent"
+  );
+};
 
 /**
  * 文件大小单位处理
  */
 tool.formatSize = (size) => {
-  if (typeof size == 'undefined') {
-    return '0'
+  if (typeof size == "undefined") {
+    return "0";
   }
-  let units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
-  let index = 0
+  let units = ["B", "KB", "MB", "GB", "TB", "PB"];
+  let index = 0;
   for (let i = 0; size >= 1024 && i < 5; i++) {
-    size /= 1024
-    index = i
+    size /= 1024;
+    index = i;
   }
-  return Math.round(size, 2) + units[index]
-}
+  return Math.round(size, 2) + units[index];
+};
 
 /**
  * 下载资源
  */
-tool.download = (res, downName = '') => {
-  const aLink = document.createElement('a')
-  let fileName = downName
-  let blob = res //第三方请求返回blob对象
+tool.download = (res, downName = "") => {
+  const aLink = document.createElement("a");
+  let fileName = downName;
+  let blob = res; //第三方请求返回blob对象
 
   //通过后端接口返回
   if (res.headers && res.data) {
     blob = new Blob([res.data], {
-      type: res.headers['content-type'].replace(';charset=utf8', '')
-    })
+      type: res.headers["content-type"].replace(";charset=utf8", ""),
+    });
     if (!downName) {
-      const contentDisposition = decodeURI(res.headers['content-disposition'])
-      const result = contentDisposition.match(/filename=\"(.+)/gi)
-      fileName = result[0].replace(/filename=\"/gi, '')
-      fileName = fileName.replace('"', '')
+      const contentDisposition = decodeURI(res.headers["content-disposition"]);
+      const result = contentDisposition.match(/filename=\"(.+)/gi);
+      fileName = result[0].replace(/filename=\"/gi, "");
+      fileName = fileName.replace('"', "");
     }
   }
 
-  aLink.href = URL.createObjectURL(blob)
+  aLink.href = URL.createObjectURL(blob);
   // 设置下载文件名称
-  aLink.setAttribute('download', fileName)
-  document.body.appendChild(aLink)
-  aLink.click()
-  document.body.removeChild(aLink)
-  URL.revokeObjectURL(aLink.href)
-}
+  aLink.setAttribute("download", fileName);
+  document.body.appendChild(aLink);
+  aLink.click();
+  document.body.removeChild(aLink);
+  URL.revokeObjectURL(aLink.href);
+};
 
 /**
  * 对象转url参数
@@ -404,97 +404,125 @@ tool.download = (res, downName = '') => {
  * @param {*} isPrefix
  */
 tool.httpBuild = (data, isPrefix = false) => {
-  let prefix = isPrefix ? '?' : ''
-  let _result = []
+  let prefix = isPrefix ? "?" : "";
+  let _result = [];
   for (let key in data) {
-    let value = data[key]
+    let value = data[key];
     // 去掉为空的参数
-    if (['', undefined, null].includes(value)) {
-      continue
+    if (["", undefined, null].includes(value)) {
+      continue;
     }
     if (value.constructor === Array) {
       value.forEach((_value) => {
         _result.push(
-          encodeURIComponent(key) + '[]=' + encodeURIComponent(_value)
-        )
-      })
+          encodeURIComponent(key) + "[]=" + encodeURIComponent(_value)
+        );
+      });
     } else {
-      _result.push(encodeURIComponent(key) + '=' + encodeURIComponent(value))
+      _result.push(encodeURIComponent(key) + "=" + encodeURIComponent(value));
     }
   }
 
-  return _result.length ? prefix + _result.join('&') : ''
-}
+  return _result.length ? prefix + _result.join("&") : "";
+};
 
 /**
  * 获取URL请求参数
  */
 tool.getRequestParams = (url) => {
-  const theRequest = new Object()
-  if (url.indexOf('?') != -1) {
-    const params = url.split('?')[1].split('&')
+  const theRequest = new Object();
+  if (url.indexOf("?") != -1) {
+    const params = url.split("?")[1].split("&");
     for (let i = 0; i < params.length; i++) {
-      const param = params[i].split('=')
-      theRequest[param[0]] = decodeURIComponent(param[1])
+      const param = params[i].split("=");
+      theRequest[param[0]] = decodeURIComponent(param[1]);
     }
   }
-  return theRequest
-}
+  return theRequest;
+};
 
 tool.attachUrl = (path) => {
   // 非完整url地址在此处理
-  return path
-}
+  return path;
+};
 
 tool.viewImage = (path) => {
   // 非完整url地址在此处理
-  return path
-}
+  return path;
+};
 
 tool.showFile = (path) => {
   // 非完整url地址在此处理
-  return path
-}
+  return path;
+};
 
 /**
  * 获取token
  */
 tool.getToken = () => {
-  return tool.local.get(import.meta.env.VITE_APP_TOKEN_PREFIX)
-}
+  return tool.local.get(import.meta.env.VITE_APP_TOKEN_PREFIX);
+};
 
 /**
  * 转Unix时间戳
  */
 tool.toUnixTime = (date) => {
-  return Math.floor(new Date(date).getTime() / 1000)
-}
+  return Math.floor(new Date(date).getTime() / 1000);
+};
 
 /**
  * 通过value获取颜色
  */
 tool.getColor = (value, data, colors = []) => {
   if (!data) {
-    return ''
+    return "";
   }
   if (colors && colors.length > 0) {
-    const index = data.findIndex((item) => item.value == value)
-    return colors[index] ?? ''
+    const index = data.findIndex((item) => item.value == value);
+    return colors[index] ?? "";
   } else {
-    const item = data.find((item) => item.value == value)
-    return item?.color ?? ''
+    const item = data.find((item) => item.value == value);
+    return item?.color ?? "";
   }
-}
+};
 
 /**
  * 通过value获取label
  */
 tool.getLabel = (value, data) => {
   if (!data) {
-    return ''
+    return "";
+  }
+  const item = data.find((item) => item.value == value);
+  return item?.label ?? "";
+};
+
+/**
+ * 复制文本到剪贴板
+ */
+tool.copy = (text) => {
+  if (navigator.clipboard && window.isSecureContext) {
+    // 现代浏览器支持 navigator.clipboard API
+    return navigator.clipboard.writeText(text);
+  } else {
+    // 兼容旧浏览器
+    const textArea = document.createElement("textarea");
+    textArea.value = text;
+    textArea.style.position = "fixed";
+    textArea.style.left = "-999999px";
+    textArea.style.top = "-999999px";
+    document.body.appendChild(textArea);
+    textArea.focus();
+    textArea.select();
+    return new Promise((resolve, reject) => {
+      if (document.execCommand("copy")) {
+        resolve();
+      } else {
+        reject();
+      }
+      document.body.removeChild(textArea);
+    });
   }
-  const item = data.find((item) => item.value == value)
-  return item?.label ?? ''
-}
+};
 
-export default tool
+export default tool;

+ 2 - 2
src/views/v1/api/center/game.js

@@ -22,7 +22,7 @@ export default {
    */
   save(params = {}) {
     return request({
-      url: "/v1/center/Game/save",
+      url: "/v1/center/Game/addGame",
       method: "post",
       data: params,
     });
@@ -34,7 +34,7 @@ export default {
    */
   update(id, data = {}) {
     return request({
-      url: "/v1/center/Game/update?id=" + id,
+      url: "/v1/center/Game/updateGame?id=" + id,
       method: "put",
       data,
     });

+ 92 - 0
src/views/v1/center/game/cp-info.vue

@@ -0,0 +1,92 @@
+<template>
+  <component
+    is="a-modal"
+    :width="tool.getDevice() === 'mobile' ? '100%' : '600px'"
+    v-model:visible="visible"
+    title="CP对接信息"
+    :mask-closable="false"
+    @before-ok="handleOk"
+    okText="复制"
+    cancelText="关闭"
+    @cancel="close"
+  >
+    <a-space direction="vertical" fill>
+      <a-form>
+        <a-form-item label="游戏名称">
+          <a-input v-model="cp_info.name" readonly />
+        </a-form-item>
+        <a-form-item label="appid">
+          <a-input v-model="cp_info.appid" readonly />
+        </a-form-item>
+        <a-form-item label="appkey">
+          <a-input v-model="cp_info.appkey" readonly />
+        </a-form-item>
+        <a-form-item label="login_key">
+          <a-input v-model="cp_info.login_key" readonly />
+        </a-form-item>
+        <a-form-item label="pay_key">
+          <a-input v-model="cp_info.pay_key" readonly />
+        </a-form-item>
+      </a-form>
+    </a-space>
+  </component>
+</template>
+
+<script setup>
+import { ref } from "vue";
+import tool from "@/utils/tool";
+import { Modal, Message } from "@arco-design/web-vue";
+// 引用定义
+const visible = ref(false);
+const cp_info = ref({});
+
+const emit = defineEmits(["success"]);
+
+// 打开弹框
+const open = async () => {
+  visible.value = true;
+  await initPage();
+};
+
+// 设置表单数据
+const setFormData = (data) => {
+  cp_info.value = data;
+};
+
+// 初始化页面数据
+const initPage = async () => {};
+
+// 确定
+const handleOk = async () => {
+  // 复制
+  const copyText = `游戏名称:${cp_info.value.name}
+appid:${cp_info.value.appid}
+appkey:${cp_info.value.appkey}
+login_key:${cp_info.value.login_key}
+pay_key:${cp_info.value.pay_key}`;
+
+  try {
+    await tool.copy(copyText);
+    Message.success({
+      title: "提示",
+      content: "复制成功",
+    });
+  } catch (error) {
+    Message.error({
+      title: "提示",
+      content: "复制失败,请手动复制",
+    });
+    console.error("复制失败:", error);
+  }
+
+  close();
+  emit("success");
+};
+
+// 关闭弹窗
+const close = () => {
+  visible.value = false;
+};
+
+defineExpose({ open, setFormData });
+</script>

+ 22 - 1
src/views/v1/center/game/edit.vue

@@ -26,6 +26,9 @@
       </a-form-item>
       <a-form-item label="游戏名称" field="name">
         <a-input v-model="formData.name" placeholder="请输入游戏名称" />
+        <template #extra>
+          <div>末尾加备注的括号请用英文字符</div>
+        </template>
       </a-form-item>
       <a-form-item label="平台" field="os">
         <sa-select
@@ -66,13 +69,28 @@
         <sa-radio v-model="formData.cp_callback_type" dict="cp_callback_type" />
       </a-form-item>
       <a-form-item label="包名" field="package_name">
-        <a-input v-model="formData.package_name" placeholder="请输入包名" />
+        <a-input
+          v-model="formData.package_name"
+          placeholder="安装包的包名,IOS与过包技术确认后填写"
+        />
+        <template #extra>
+          <div>格式: com.yfgame.gamename.newname</div>
+        </template>
       </a-form-item>
       <a-form-item label="小游戏分包参数" field="wxgamepro">
         <a-input
           v-model="formData.wxgamepro"
           placeholder="请输入小游戏分包参数"
         />
+        <template #extra>
+          <div>格式: wxgamepro=PkgCBgAAoxxxx</div>
+        </template>
+      </a-form-item>
+      <a-form-item label="充值回调地址" field="cp_callback_url">
+        <a-input
+          v-model="formData.cp_callback_url"
+          placeholder="元宝发放地址,研发提供"
+        />
       </a-form-item>
       <a-form-item label="线上版本" field="online_version">
         <a-input
@@ -130,6 +148,8 @@ const initialFormData = {
   status: 1,
   sort: null,
   remark: "",
+  package_name: "",
+  cp_callback_url: "",
 };
 
 // 表单信息
@@ -140,6 +160,7 @@ const rules = {
   main_id: [{ required: true, message: "主包归属必需填写" }],
   name: [{ required: true, message: "游戏名称必需填写" }],
   os: [{ required: true, message: "平台必需选择" }],
+  package_name: [{ required: true, message: "包名必需填写" }],
   divide: [{ required: true, message: "分成比例必需填写" }],
   cp_callback_type: [{ required: true, message: "游戏发货规则必需选择" }],
   online_version: [{ required: true, message: "线上版本必需填写" }],

+ 30 - 4
src/views/v1/center/game/index.vue

@@ -55,10 +55,17 @@
           {{ record.status === 1 ? "正常" : "停用" }}
         </a-tag>
       </template>
+      <template #operationBeforeExtend="{ record }">
+        <a-button type="text" @click="checkCpInfo(record)"
+          ><icon-thunderbolt /> cp对接信息</a-button
+        >
+      </template>
     </sa-table>
 
     <!-- 编辑表单 -->
     <edit-form ref="editRef" @success="refresh" />
+    <!-- 查看CP对接信息 -->
+    <cp-info ref="cpInfoRef" @success="refresh" />
   </div>
 </template>
 
@@ -66,6 +73,7 @@
 import { onMounted, ref, reactive } from "vue";
 import { Message } from "@arco-design/web-vue";
 import EditForm from "./edit.vue";
+import CpInfo from "./cp-info.vue";
 import api from "../../api/center/game";
 import apiCommon from "../../api/center/common";
 
@@ -73,6 +81,7 @@ import apiCommon from "../../api/center/common";
 const crudRef = ref();
 const editRef = ref();
 const viewRef = ref();
+const cpInfoRef = ref();
 const mainGameOptions = ref([]);
 
 // 搜索表单
@@ -88,6 +97,7 @@ const searchForm = ref({
 const options = reactive({
   api: api.getPageList,
   rowSelection: { showCheckedAll: true },
+  operationColumnWidth: 280,
   add: {
     show: true,
     auth: ["/v1/center/Game/save"],
@@ -99,6 +109,7 @@ const options = reactive({
     show: true,
     auth: ["/v1/center/Game/update"],
     func: async (record) => {
+      console.log(record);
       editRef.value?.open("edit");
       editRef.value?.setFormData(record);
     },
@@ -120,18 +131,19 @@ const options = reactive({
 const columns = reactive([
   { title: "主包归属", dataIndex: "main_game_name", width: 130 },
   { title: "游戏名称", dataIndex: "name", width: 130 },
+  { title: "包名", dataIndex: "package_name", width: 130 },
   {
     title: "平台",
     dataIndex: "os",
     type: "dict",
     dict: "os",
-    width: 80,
+    width: 120,
   },
 
-  { title: "分成比例", dataIndex: "divide", width: 120 },
-
   { title: "状态", dataIndex: "status", width: 80 },
-  { title: "h5游戏地址", dataIndex: "cp_h5_url", width: 180 },
+
+  { title: "充值回调地址", dataIndex: "cp_callback_url", width: 180 },
+  { title: "分成比例", dataIndex: "divide", width: 120 },
   { title: "创建时间", dataIndex: "create_time", width: 180 },
   { title: "修改时间", dataIndex: "update_time", width: 180 },
 ]);
@@ -163,6 +175,20 @@ const refresh = async () => {
   crudRef.value?.refresh();
 };
 
+// 查看CP对接信息
+const checkCpInfo = async (record) => {
+  let { appkey, login_key, pay_key, name, id } = record;
+  let cp_info = {
+    name: name,
+    appid: id,
+    appkey: appkey,
+    login_key: login_key,
+    pay_key: pay_key,
+  };
+  cpInfoRef.value?.open();
+  cpInfoRef.value?.setFormData(cp_info);
+};
+
 // 页面加载完成执行
 onMounted(async () => {
   initPage();