edit.vue 8.0 KB

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