edit.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <template>
  2. <component
  3. is="a-modal"
  4. :width="tool.getDevice() == 'mobile' ? '100%' : '600px'"
  5. v-model:visible="visible"
  6. :title="title"
  7. :mask-closable="false"
  8. :ok-loading="loading"
  9. @cancel="close"
  10. @before-ok="submit"
  11. >
  12. <!-- 表单信息 start -->
  13. <a-form
  14. ref="formRef"
  15. :model="formData"
  16. :rules="rules"
  17. :auto-label-width="true"
  18. >
  19. <a-form-item label="主包归属" field="main_id">
  20. <a-select
  21. v-model="formData.main_id"
  22. :options="mainGameOptions"
  23. placeholder="请选择主包归属"
  24. allow-clear
  25. />
  26. </a-form-item>
  27. <a-form-item label="游戏名称" field="name">
  28. <a-input v-model="formData.name" placeholder="请输入游戏名称" />
  29. </a-form-item>
  30. <a-form-item label="游戏平台" field="os">
  31. <sa-select
  32. v-model="formData.os"
  33. dict="os"
  34. placeholder="请选择平台"
  35. allow-clear
  36. />
  37. </a-form-item>
  38. <a-form-item label="分成比例" field="divide">
  39. <a-input-number
  40. v-model="formData.divide"
  41. placeholder="请输入分成比例"
  42. />
  43. </a-form-item>
  44. <a-form-item
  45. label="内购分成比例"
  46. field="ios_divide"
  47. v-if="formData.os == '2'"
  48. >
  49. <a-input-number
  50. v-model="formData.ios_divide"
  51. placeholder="请输入苹果内购分成比例"
  52. />
  53. </a-form-item>
  54. <a-form-item label="游戏实名" field="realname_switch">
  55. <sa-select
  56. v-model="formData.realname_switch"
  57. dict="realname_switch"
  58. placeholder="请选择游戏实名"
  59. allow-clear
  60. />
  61. </a-form-item>
  62. <a-divider />
  63. <a-form-item label="游戏KEY" field="main_game_id">
  64. <a-select
  65. v-model="formData.main_game_id"
  66. :options="gameOptions"
  67. placeholder="请选择主游戏"
  68. allow-clear
  69. @change="handleMainGameChange"
  70. />
  71. </a-form-item>
  72. <a-form-item label="游戏发货规则" field="cp_callback_type" hidden>
  73. <sa-radio v-model="formData.cp_callback_type" dict="cp_callback_type" />
  74. </a-form-item>
  75. <a-form-item label="游戏包名" field="package_name">
  76. <a-input
  77. v-model="formData.package_name"
  78. placeholder="安装包的包名,IOS与过包技术确认后填写"
  79. />
  80. <template #extra>
  81. <div>格式:com.gamename.newname</div>
  82. </template>
  83. </a-form-item>
  84. <a-form-item
  85. label="分包参数"
  86. field="wxgamepro"
  87. v-if="formData.os == '3' || formData.os == '4'"
  88. >
  89. <a-input
  90. v-model="formData.wxgamepro"
  91. placeholder="请输入小游戏分包参数"
  92. />
  93. <template #extra>
  94. <div>格式:wxgamepro=PkgCBgAAoxxxx</div>
  95. </template>
  96. </a-form-item>
  97. <a-form-item
  98. label="iOS线上版本"
  99. field="online_version"
  100. v-if="formData.os == '2'"
  101. >
  102. <a-input
  103. v-model="formData.online_version"
  104. placeholder="请输入线上版本"
  105. />
  106. <template #extra>
  107. <div>iOS包内传参大于该版本则接口会返回审核服</div>
  108. </template>
  109. </a-form-item>
  110. <a-form-item label="充值回调" field="cp_callback_url">
  111. <a-input
  112. v-model="formData.cp_callback_url"
  113. placeholder="研发发货地址提供"
  114. />
  115. </a-form-item>
  116. <a-form-item
  117. label="研发登录地址"
  118. field="cp_h5_url"
  119. v-if="formData.os == '5'"
  120. >
  121. <a-input v-model="formData.cp_h5_url" placeholder="研发H5登录地址" />
  122. <template #extra>
  123. <div>H5或iOS-H5壳包必填</div>
  124. </template>
  125. </a-form-item>
  126. <a-form-item label="状态" field="status">
  127. <sa-switch v-model="formData.status" />
  128. </a-form-item>
  129. <!-- <a-form-item label="排序" field="sort">
  130. <a-input v-model="formData.sort" placeholder="请输入排序" />
  131. </a-form-item>
  132. <a-form-item label="描述" field="remark">
  133. <a-input v-model="formData.remark" placeholder="请输入描述" />
  134. </a-form-item> -->
  135. </a-form>
  136. <!-- 表单信息 end -->
  137. </component>
  138. </template>
  139. <script setup>
  140. import { ref, reactive, computed } from "vue";
  141. import tool from "@/utils/tool";
  142. import { Message, Modal } from "@arco-design/web-vue";
  143. import api from "../../api/game";
  144. import centerCommonApi from "../../api/common";
  145. const emit = defineEmits(["success"]);
  146. // 引用定义
  147. const visible = ref(false);
  148. const loading = ref(false);
  149. const formRef = ref();
  150. const mode = ref("");
  151. const mainGameOptions = ref([]);
  152. const gameOptions = ref([]);
  153. let title = computed(() => {
  154. return "游戏列表" + (mode.value == "add" ? "-新增" : "-编辑");
  155. });
  156. // 表单初始值
  157. const initialFormData = {
  158. id: null,
  159. main_id: null,
  160. name: "",
  161. os: 1,
  162. cp_h5_url: "",
  163. divide: "50",
  164. ios_divide: "50",
  165. main_game_id: "",
  166. cp_callback_type: 0,
  167. wxgamepro: "",
  168. online_version: "",
  169. status: 1,
  170. sort: null,
  171. remark: "",
  172. package_name: "",
  173. cp_callback_url: "",
  174. realname_switch: 2,
  175. };
  176. // 表单信息
  177. const formData = reactive({ ...initialFormData });
  178. // 验证规则
  179. const rules = {
  180. main_id: [{ required: true, message: "主包归属必需填写" }],
  181. name: [{ required: true, message: "游戏名称必需填写" }],
  182. os: [{ required: true, message: "平台必需选择" }],
  183. divide: [{ required: true, message: "分成比例必需填写" }],
  184. cp_callback_type: [{ required: true, message: "游戏发货规则必需选择" }],
  185. realname_switch: [{ required: true, message: "游戏实名必需选择" }],
  186. };
  187. // 打开弹框
  188. const open = async (type = "add") => {
  189. mode.value = type;
  190. // 重置表单数据
  191. Object.assign(formData, initialFormData);
  192. formRef.value.clearValidate();
  193. visible.value = true;
  194. await initPage();
  195. };
  196. // 初始化页面数据
  197. const initPage = async () => {
  198. await getMainGameOptionsList();
  199. await getGameOptionsList();
  200. };
  201. // 获取主游戏列表
  202. const getMainGameOptionsList = async () => {
  203. const { data } = await centerCommonApi.getMainGameOptionsApi();
  204. mainGameOptions.value = data;
  205. };
  206. // 获取子游戏列表
  207. const getGameOptionsList = async () => {
  208. const { data } = await centerCommonApi.getGameOptionsApi();
  209. console.log(formData.name);
  210. const newData = data.filter((item) => {
  211. return item.label !== formData.name;
  212. });
  213. newData.unshift({
  214. label: "默认生成独立key",
  215. value: 0,
  216. });
  217. gameOptions.value = newData;
  218. };
  219. // 设置数据
  220. const setFormData = async (data) => {
  221. for (const key in formData) {
  222. if (data[key] != null && data[key] != undefined) {
  223. formData[key] = data[key];
  224. }
  225. }
  226. };
  227. // 数据保存
  228. const submit = async (done) => {
  229. const validate = await formRef.value?.validate();
  230. if (!validate) {
  231. loading.value = true;
  232. let data = {
  233. ...formData,
  234. realname_switch: Number(formData.realname_switch),
  235. };
  236. let result = {};
  237. if (mode.value == "add") {
  238. // 添加数据
  239. data.id = undefined;
  240. result = await api.save(data);
  241. } else {
  242. // 修改数据
  243. result = await api.update(data.id, data);
  244. }
  245. if (result.code == 200) {
  246. Message.success("操作成功");
  247. emit("success");
  248. done(true);
  249. }
  250. // 防止连续点击提交
  251. setTimeout(() => {
  252. loading.value = false;
  253. }, 500);
  254. }
  255. done(false);
  256. };
  257. // handleMainGameChange
  258. const handleMainGameChange = (value) => {
  259. console.log(value);
  260. if (value == "") {
  261. formData.cp_callback_type = "0";
  262. } else {
  263. formData.cp_callback_type = "1";
  264. }
  265. };
  266. // 关闭弹窗
  267. const close = () => (visible.value = false);
  268. defineExpose({ open, setFormData });
  269. </script>