step-one.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <div class="step-one-container">
  3. <a-form
  4. :label-col="{ span: 2 }"
  5. :wrapper-col="{ offset: 1, span: 12 }"
  6. :colon="false"
  7. >
  8. <a-form-item label="落地页名称" v-bind="validateInfos.title">
  9. <a-input placeholder="请输入落地页名称" v-model:value="forms.title" />
  10. </a-form-item>
  11. <a-form-item label="公众号" v-bind="validateInfos.gzh_name">
  12. <a-select
  13. placeholder="请选择公众号"
  14. v-model:value="forms.gzh_name"
  15. @change="onGzhChange"
  16. >
  17. <template v-for="official in officials" :key="official.gzh_name">
  18. <a-select-option :value="official.gzh_name">
  19. {{ official.gzh_name }}
  20. </a-select-option>
  21. </template>
  22. </a-select>
  23. </a-form-item>
  24. <a-form-item label="微信号">
  25. <a-input placeholder="请输入微信号" disabled :value="forms.gzh_code" />
  26. </a-form-item>
  27. <a-form-item label="域名" v-bind="validateInfos.domain">
  28. <a-select
  29. placeholder="请选择域名"
  30. v-model:value="forms.domain"
  31. @change="onDomainChange"
  32. >
  33. <template v-for="domain in domains" :key="domain.domain">
  34. <a-select-option :value="domain.domain">
  35. {{ domain.domain }}
  36. </a-select-option>
  37. </template>
  38. </a-select>
  39. </a-form-item>
  40. <a-form-item label="推广书籍" v-bind="validateInfos.bid">
  41. <a-select placeholder="请选择需要推广的书籍" v-model:value="forms.bid">
  42. <template v-for="book in books" :key="book.bid">
  43. <a-select-option :value="book.bid">
  44. {{ book.book_name }}
  45. </a-select-option>
  46. </template>
  47. </a-select>
  48. </a-form-item>
  49. <a-form-item label="公司主体">
  50. <a-input
  51. placeholder="请输入公司主体"
  52. disabled
  53. :value="forms.company_name"
  54. />
  55. <!-- <a-select placeholder="请选择公司主体">
  56. <a-select-option value="1">1</a-select-option>
  57. <a-select-option value="2">2</a-select-option>
  58. </a-select> -->
  59. </a-form-item>
  60. <a-form-item label="渠道" v-bind="validateInfos.link_source">
  61. <a-select placeholder="请选择渠道" v-model:value="forms.link_source">
  62. <a-select-option value="uc">UC</a-select-option>
  63. <a-select-option value="iqiyi">爱奇艺</a-select-option>
  64. <a-select-option value="tiktok">抖音</a-select-option>
  65. <a-select-option value="vivo">Vivo</a-select-option>
  66. <a-select-option value="baidu">百度</a-select-option>
  67. </a-select>
  68. </a-form-item>
  69. <a-form-item label="公众号后缀">
  70. <a-radio-group v-model:value="forms.gzh_suffix_mode">
  71. <a-radio :value="0">无后缀</a-radio>
  72. <a-radio :value="3">官方后缀(推荐)</a-radio>
  73. </a-radio-group>
  74. </a-form-item>
  75. <a-form-item label="跳转类型">
  76. <a-radio-group v-model:value="forms.jump_type">
  77. <a-radio value="copy_name">文本粘贴</a-radio>
  78. <a-radio value="xcx">小程序</a-radio>
  79. </a-radio-group>
  80. </a-form-item>
  81. <a-form-item label="关注图片" v-bind="validateInfos.sub_img">
  82. <image-upload
  83. name="sub_img"
  84. type="关注图片"
  85. :value="forms.sub_img"
  86. @change="onUploadChange"
  87. />
  88. </a-form-item>
  89. <a-form-item label="公众号头像">
  90. <image-upload
  91. name="gzh_img"
  92. type="公众号头像"
  93. :value="forms.gzh_img"
  94. @change="onUploadChange"
  95. />
  96. </a-form-item>
  97. <a-form-item label="简介">
  98. <a-textarea v-model:value="forms.name"></a-textarea>
  99. </a-form-item>
  100. <a-form-item :wrapper-col="{ offset: 3 }">
  101. <a-button @click="onBack" style="margin-right: 10px">返回</a-button>
  102. <a-button type="primary" @click="onNextStep">下一步</a-button>
  103. </a-form-item>
  104. </a-form>
  105. </div>
  106. </template>
  107. <script lang="ts">
  108. import { defineComponent, reactive, ref, toRefs } from "vue";
  109. import { useForm } from "@ant-design-vue/use";
  110. import { useRouter } from "vue-router";
  111. import ImageUpload from "@/components/image-upload/index.vue";
  112. import { getLandingBooks, getLandingDomains, getLandingOfficials } from "@/api";
  113. import { IDomainItem, IGZHItem, IPBookItem } from "@/types/api";
  114. const StepOne = defineComponent({
  115. name: "StepOne",
  116. components: {
  117. ImageUpload,
  118. },
  119. props: {
  120. content: Object,
  121. default() {
  122. return {};
  123. },
  124. },
  125. emits: ["next"],
  126. setup(props, { emit }) {
  127. const router = useRouter();
  128. const state = reactive({
  129. officials: ref<IGZHItem[]>([]),
  130. domains: ref<IDomainItem[]>([]),
  131. books: ref<IPBookItem[]>([]),
  132. forms: {
  133. title: "",
  134. name: "",
  135. gzh_code: "",
  136. gzh_name: "",
  137. bid: "",
  138. domain: "",
  139. company_name: "",
  140. link_source: "uc",
  141. gzh_suffix_mode: 0,
  142. gzh_suffix: "",
  143. jump_type: "copy_name",
  144. sub_img: "",
  145. gzh_img: "",
  146. content: "",
  147. },
  148. });
  149. const formsRules = reactive({
  150. title: [{ required: true, trigger: "blur", message: "请输入落地页名称" }],
  151. gzh_name: [
  152. { required: true, trigger: "change", message: "请选择公众号" },
  153. ],
  154. domain: [
  155. {
  156. required: true,
  157. trigger: "change",
  158. message: "请选择域名",
  159. },
  160. ],
  161. bid: [
  162. {
  163. required: true,
  164. type: "number",
  165. trigger: "change",
  166. message: "请选择推广书籍",
  167. },
  168. ],
  169. link_source: [
  170. {
  171. required: true,
  172. trigger: "change",
  173. message: "请选择渠道",
  174. },
  175. ],
  176. sub_img: [
  177. {
  178. required: true,
  179. message: "请上传关注图片",
  180. },
  181. ],
  182. });
  183. const { validate, validateInfos } = useForm(state.forms, formsRules);
  184. const initConfigData = async () => {
  185. console.log(props);
  186. try {
  187. const [
  188. { data: official },
  189. { data: domains },
  190. { data: books },
  191. ] = await Promise.all([
  192. getLandingOfficials(),
  193. getLandingDomains(),
  194. getLandingBooks(),
  195. ]);
  196. state.officials = official.list;
  197. state.domains = domains.list;
  198. state.books = books.list;
  199. state.forms = Object.assign(state.forms, (props as any)?.content ?? {});
  200. console.log(state.forms)
  201. } catch (error) {
  202. console.log("error happened in initLandingConfig:", error.message);
  203. router.back();
  204. }
  205. };
  206. initConfigData();
  207. const onGzhChange = (name: string) => {
  208. const target = state.officials.find((gzh) => gzh.gzh_name === name);
  209. // state.forms.channel_id = target!.channel_id.toString() ?? "";
  210. state.forms.gzh_img = target!.gzh_img ?? "";
  211. state.forms.sub_img = target!.sub_img ?? "";
  212. state.forms.gzh_code = target!.gzh_code ?? "";
  213. };
  214. const onDomainChange = (domain: string) => {
  215. const target = state.domains.find((item) => item.domain === domain);
  216. state.forms.company_name = target!.company_name ?? "";
  217. };
  218. const onUploadChange = (result: {
  219. url: string;
  220. type: "sub_img" | "gzh_img";
  221. }) => {
  222. state.forms[result.type] = result.url;
  223. //console.log(state.forms);
  224. };
  225. const onBack = () => {
  226. router.replace("/put/landing");
  227. };
  228. const onNextStep = async () => {
  229. try {
  230. await validate();
  231. emit("next", state.forms);
  232. } catch (error) {
  233. console.log(error);
  234. }
  235. };
  236. return {
  237. ...toRefs(state),
  238. validateInfos,
  239. onGzhChange,
  240. onDomainChange,
  241. onUploadChange,
  242. onBack,
  243. onNextStep,
  244. };
  245. },
  246. });
  247. export default StepOne;
  248. </script>