edit.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  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="iOS线上版本"
  100. field="online_version"
  101. v-if="formData.os == '2'"
  102. >
  103. <a-input
  104. v-model="formData.online_version"
  105. placeholder="请输入线上版本"
  106. />
  107. <template #extra>
  108. <div>iOS包内传参大于该版本则接口会返回审核服</div>
  109. </template>
  110. </a-form-item>
  111. <a-form-item label="充值回调" field="cp_callback_url">
  112. <a-input
  113. v-model="formData.cp_callback_url"
  114. placeholder="研发发货地址提供"
  115. />
  116. </a-form-item>
  117. <a-form-item
  118. label="研发登录地址"
  119. field="cp_h5_url"
  120. v-if="formData.os == '5'"
  121. >
  122. <a-input v-model="formData.cp_h5_url" placeholder="研发H5登录地址" />
  123. <template #extra>
  124. <div>H5或iOS-H5壳包必填</div>
  125. </template>
  126. </a-form-item>
  127. <a-form-item label="状态" field="status">
  128. <sa-switch v-model="formData.status" />
  129. </a-form-item>
  130. <!-- <a-form-item label="排序" field="sort">
  131. <a-input v-model="formData.sort" placeholder="请输入排序" />
  132. </a-form-item>
  133. <a-form-item label="描述" field="remark">
  134. <a-input v-model="formData.remark" placeholder="请输入描述" />
  135. </a-form-item> -->
  136. </a-form>
  137. <!-- 表单信息 end -->
  138. </component>
  139. </template>
  140. <script setup>
  141. import { ref, reactive, computed } from "vue";
  142. import tool from "@/utils/tool";
  143. import { Message, Modal } from "@arco-design/web-vue";
  144. import api from "../../api/center/game";
  145. import centerCommonApi from "../../api/center/common";
  146. const emit = defineEmits(["success"]);
  147. // 引用定义
  148. const visible = ref(false);
  149. const loading = ref(false);
  150. const formRef = ref();
  151. const mode = ref("");
  152. const mainGameOptions = ref([]);
  153. const gameOptions = ref([]);
  154. let title = computed(() => {
  155. return "游戏列表" + (mode.value == "add" ? "-新增" : "-编辑");
  156. });
  157. // 表单初始值
  158. const initialFormData = {
  159. id: null,
  160. main_id: null,
  161. name: "",
  162. os: 1,
  163. cp_h5_url: "",
  164. divide: "50",
  165. ios_divide: "50",
  166. main_game_id: "",
  167. cp_callback_type: 0,
  168. wxgamepro: "",
  169. online_version: "",
  170. status: 1,
  171. sort: null,
  172. remark: "",
  173. package_name: "",
  174. cp_callback_url: "",
  175. realname_switch: 2,
  176. };
  177. // 表单信息
  178. const formData = reactive({ ...initialFormData });
  179. // 验证规则
  180. const rules = {
  181. main_id: [{ required: true, message: "主包归属必需填写" }],
  182. name: [{ required: true, message: "游戏名称必需填写" }],
  183. os: [{ required: true, message: "平台必需选择" }],
  184. divide: [{ required: true, message: "分成比例必需填写" }],
  185. cp_callback_type: [{ required: true, message: "游戏发货规则必需选择" }],
  186. realname_switch: [{ required: true, message: "游戏实名必需选择" }],
  187. };
  188. // 打开弹框
  189. const open = async (type = "add") => {
  190. mode.value = type;
  191. // 重置表单数据
  192. Object.assign(formData, initialFormData);
  193. formRef.value.clearValidate();
  194. visible.value = true;
  195. await initPage();
  196. };
  197. // 初始化页面数据
  198. const initPage = async () => {
  199. await getMainGameOptionsList();
  200. await getGameOptionsList();
  201. };
  202. // 获取主游戏列表
  203. const getMainGameOptionsList = async () => {
  204. const { data } = await centerCommonApi.getMainGameOptionsApi();
  205. mainGameOptions.value = data;
  206. };
  207. // 获取子游戏列表
  208. const getGameOptionsList = async () => {
  209. const { data } = await centerCommonApi.getGameOptionsApi();
  210. console.log(formData.name);
  211. const newData = data.filter((item) => {
  212. return item.label !== formData.name;
  213. });
  214. newData.unshift({
  215. label: "默认生成独立key",
  216. value: 0,
  217. });
  218. gameOptions.value = newData;
  219. };
  220. // 设置数据
  221. const setFormData = async (data) => {
  222. for (const key in formData) {
  223. if (data[key] != null && data[key] != undefined) {
  224. formData[key] = data[key];
  225. }
  226. }
  227. };
  228. // 数据保存
  229. const submit = async (done) => {
  230. const validate = await formRef.value?.validate();
  231. if (!validate) {
  232. loading.value = true;
  233. let data = {
  234. ...formData,
  235. realname_switch: Number(formData.realname_switch),
  236. };
  237. let result = {};
  238. if (mode.value == "add") {
  239. // 添加数据
  240. data.id = undefined;
  241. result = await api.save(data);
  242. } else {
  243. // 修改数据
  244. result = await api.update(data.id, data);
  245. }
  246. if (result.code == 200) {
  247. Message.success("操作成功");
  248. emit("success");
  249. done(true);
  250. }
  251. // 防止连续点击提交
  252. setTimeout(() => {
  253. loading.value = false;
  254. }, 500);
  255. }
  256. done(false);
  257. };
  258. // handleMainGameChange
  259. const handleMainGameChange = (value) => {
  260. console.log(value);
  261. if (value == "") {
  262. formData.cp_callback_type = "0";
  263. } else {
  264. formData.cp_callback_type = "1";
  265. }
  266. };
  267. // 关闭弹窗
  268. const close = () => (visible.value = false);
  269. defineExpose({ open, setFormData });
  270. </script>