adSet.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. <template>
  2. <div class="advert-form-page">
  3. <!-- 头部导航 -->
  4. <s-header :name="pageTitle" :noback="false" />
  5. <!-- 表单内容 -->
  6. <div class="form-container">
  7. <van-form @submit="updateAdFun" class="advert-form">
  8. <!-- 基本信息部分 -->
  9. <div class="form-section">
  10. <div class="section-title">{{ $t("advertManage.basicInfo") }}</div>
  11. <van-field
  12. required
  13. v-model="adInfo.name"
  14. name="name"
  15. :label="`${$t('advertManage.advertisingNameLabel')}`"
  16. :placeholder="$t('advertManage.advertisingNamePlaceholder')"
  17. :rules="[
  18. {
  19. required: true,
  20. message: $t('advertManage.advertisingNamePlaceholder'),
  21. },
  22. ]"
  23. />
  24. <van-field
  25. v-model="adInfo.adminId"
  26. name="adminId"
  27. :label="`${$t('advertManage.affiliatedMerchantsLabel')}`"
  28. :placeholder="$t('advertManage.affiliatedMerchantsPlaceholder')"
  29. />
  30. <van-field
  31. v-model="adInfo.orders"
  32. name="orders"
  33. type="number"
  34. :label="`${$t('advertManage.advertisingOrderLabel')}`"
  35. :placeholder="$t('advertManage.advertisingOrderPlaceholder')"
  36. />
  37. <van-field
  38. required
  39. readonly
  40. v-model="adInfo.equipmentType"
  41. name="equipmentType"
  42. :label="`${$t('advertManage.machineType')}`"
  43. :placeholder="$t('advertManage.machineTypePlace')"
  44. :rules="[
  45. { required: true, message: $t('advertManage.machineTypePlace') },
  46. ]"
  47. @click="busiInpClk"
  48. >
  49. <template #right-icon>
  50. <van-icon name="arrow-down" />
  51. </template>
  52. </van-field>
  53. </div>
  54. <!-- 播放设置部分 -->
  55. <div class="form-section">
  56. <div class="section-title">{{ $t("advertManage.playSettings") }}</div>
  57. <van-field
  58. v-model="adInfo.duration"
  59. name="duration"
  60. type="number"
  61. :label="`${$t('advertManage.advertisingDurationLabel')}`"
  62. :placeholder="$t('advertManage.advertisingDurationPlaceholder')"
  63. />
  64. <van-field
  65. v-model="adInfo.plays"
  66. name="plays"
  67. type="number"
  68. :label="`${$t('advertManage.playbackTimesLabel')}`"
  69. :placeholder="$t('advertManage.playbackTimesPlaceholder')"
  70. />
  71. <div class="radio-group">
  72. <div class="group-label">
  73. {{ $t("advertManage.playTimeStatus") }}
  74. </div>
  75. <van-radio-group v-model="adInfo.playTimeStatus">
  76. <van-radio name="0">{{ $t("advertManage.acquiesce") }}</van-radio>
  77. <van-radio name="1">{{ $t("advertManage.standby") }}</van-radio>
  78. <van-radio name="2">{{ $t("advertManage.work") }}</van-radio>
  79. </van-radio-group>
  80. </div>
  81. </div>
  82. <!-- 广告设置部分 -->
  83. <div class="form-section">
  84. <div class="section-title">{{ $t("advertManage.adSettings") }}</div>
  85. <div class="radio-group">
  86. <div class="group-label">
  87. {{ $t("advertManage.advertisingPosition") }}
  88. </div>
  89. <van-radio-group v-model="adInfo.screenType">
  90. <van-radio name="0">{{ $t("advertManage.screenA") }}</van-radio>
  91. <van-radio name="1">{{ $t("advertManage.screenB") }}</van-radio>
  92. </van-radio-group>
  93. </div>
  94. <div class="radio-group">
  95. <div class="group-label">
  96. {{ $t("advertManage.locationType") }}
  97. </div>
  98. <van-radio-group v-model="adInfo.locationType">
  99. <van-radio name="0">{{
  100. $t("advertManage.advertising")
  101. }}</van-radio>
  102. <van-radio name="1">{{
  103. $t("advertManage.externalAdvertising")
  104. }}</van-radio>
  105. </van-radio-group>
  106. </div>
  107. <div class="radio-group">
  108. <div class="group-label">
  109. {{ $t("advertManage.defaultDownload") }}
  110. </div>
  111. <van-radio-group v-model="adInfo.type">
  112. <van-radio name="0">{{
  113. $t("advertManage.defaultDownload")
  114. }}</van-radio>
  115. <van-radio name="1">{{
  116. $t("advertManage.doNotDownloadByDefault")
  117. }}</van-radio>
  118. </van-radio-group>
  119. </div>
  120. <div class="radio-group">
  121. <div class="group-label">
  122. {{ $t("advertManage.advertisingType") }}
  123. </div>
  124. <van-radio-group v-model="adInfo.adType">
  125. <van-radio name="0">{{ $t("advertManage.picture") }}</van-radio>
  126. <van-radio name="1">{{ $t("advertManage.video") }}</van-radio>
  127. </van-radio-group>
  128. </div>
  129. </div>
  130. <!-- 媒体内容部分 -->
  131. <div class="form-section">
  132. <div class="section-title">{{ $t("advertManage.mediaContent") }}</div>
  133. <!-- 图片广告内容 -->
  134. <div v-if="adInfo.adType === '0'" class="media-content">
  135. <van-field
  136. required
  137. v-model="adInfo.url"
  138. name="url"
  139. :label="`${$t('advertManage.pictureAddressLabel')}`"
  140. :placeholder="$t('advertManage.pictureAddressPlaceholder')"
  141. :rules="[
  142. {
  143. required: true,
  144. message: $t('advertManage.pictureAddressPlaceholder'),
  145. },
  146. ]"
  147. />
  148. <div class="preview-area" v-if="adInfo.url">
  149. <div class="preview-label">预览</div>
  150. <img :src="adInfo.url" class="image-preview" alt="广告图片预览" />
  151. </div>
  152. </div>
  153. <!-- 视频广告内容 -->
  154. <div v-if="adInfo.adType === '1'" class="media-content">
  155. <van-field
  156. v-model="adInfo.mediaPreview"
  157. name="mediaPreview"
  158. :label="`${$t('advertManage.thumbnailAddressLabel')}`"
  159. :placeholder="$t('advertManage.thumbnailAddressPlaceholder')"
  160. />
  161. <van-field
  162. required
  163. v-model="adInfo.url"
  164. name="url"
  165. :label="`${$t('advertManage.videoLinkLabel')}`"
  166. :placeholder="$t('advertManage.videoLinkPlaceholder')"
  167. :rules="[
  168. {
  169. required: true,
  170. message: $t('advertManage.videoLinkPlaceholder'),
  171. },
  172. ]"
  173. />
  174. <div class="preview-area" v-if="adInfo.url">
  175. <div class="preview-label">预览</div>
  176. <video :src="adInfo.url" class="video-preview" controls></video>
  177. </div>
  178. </div>
  179. </div>
  180. <!-- 提交按钮 -->
  181. <div class="submit-section">
  182. <van-button
  183. round
  184. block
  185. type="primary"
  186. native-type="submit"
  187. class="submit-button"
  188. >
  189. {{ $t("advertManage.submit") }}
  190. </van-button>
  191. </div>
  192. </van-form>
  193. </div>
  194. <!-- 机器类型选择弹窗 -->
  195. <van-popup v-model:show="busiPopShow" position="bottom" round>
  196. <van-picker
  197. v-model="busiDefaIdx"
  198. :title="$t('advertManage.machineTypePlace')"
  199. :columns="busiPopList"
  200. :columns-field-names="busiPopFieldName"
  201. @confirm="busiPopConfirm"
  202. @cancel="busiPopShow = false"
  203. />
  204. </van-popup>
  205. </div>
  206. </template>
  207. <script>
  208. import { onMounted, ref, reactive } from "vue";
  209. import sHeader from "../../components/SimpleHeader";
  210. import { addAdInfo, updateAdInfo } from "../../service/advertManage";
  211. import { useRouter } from "vue-router";
  212. import { showFailToast, showSuccessToast } from "vant";
  213. import { useI18n } from "vue-i18n";
  214. import { styleUrl } from "../../common/js/utils";
  215. export default {
  216. components: { sHeader },
  217. setup() {
  218. // 点击机器类型
  219. const busiInpClk = () => {
  220. busiPopShow.value = true;
  221. };
  222. // 机器类型
  223. const busiPopShow = ref(false);
  224. const busiDefaIdx = ref(["280"]);
  225. const busiPopList = reactive([
  226. {
  227. name: "280",
  228. id: "280",
  229. },
  230. {
  231. name: "280en",
  232. id: "280en",
  233. },
  234. {
  235. name: "301",
  236. id: "301",
  237. },
  238. {
  239. name: "301en",
  240. id: "301en",
  241. },
  242. {
  243. name: "320",
  244. id: "320",
  245. },
  246. {
  247. name: "320en",
  248. id: "320en",
  249. },
  250. {
  251. name: "330",
  252. id: "330",
  253. },
  254. {
  255. name: "330en",
  256. id: "330en",
  257. },
  258. {
  259. name: "P10",
  260. id: "P10",
  261. },
  262. {
  263. name: "P10en",
  264. id: "P10en",
  265. },
  266. {
  267. name: "P20",
  268. id: "P20",
  269. },
  270. {
  271. name: "P20en",
  272. id: "P20en",
  273. },
  274. {
  275. name: "P30",
  276. id: "P30",
  277. },
  278. {
  279. name: "P30en",
  280. id: "P30en",
  281. },
  282. {
  283. name: "SI320",
  284. id: "SI320",
  285. },
  286. {
  287. name: "SI320en",
  288. id: "SI320en",
  289. },
  290. {
  291. name: "SBC320",
  292. id: "SBC320",
  293. },
  294. {
  295. name: "SBC320en",
  296. id: "SBC320en",
  297. },
  298. {
  299. name: "SBM10ch",
  300. id: "SBM10ch",
  301. },
  302. {
  303. name: "SBM10en",
  304. id: "SBM10en",
  305. },
  306. {
  307. name: "EF210ch",
  308. id: "EF210ch",
  309. },
  310. {
  311. name: "EF210en",
  312. id: "EF210en",
  313. },
  314. ]);
  315. const busiPopFieldName = reactive({
  316. text: "name",
  317. value: "id",
  318. });
  319. // 点击机器类型的弹窗确定
  320. const busiPopConfirm = ({ selectedOptions }) => {
  321. adInfo.value.equipmentType = selectedOptions[0].id;
  322. busiPopShow.value = false;
  323. };
  324. const { t } = useI18n();
  325. const router = useRouter();
  326. const adInfo = ref({
  327. adminId: "",
  328. username: null,
  329. name: "",
  330. orders: "",
  331. duration: "",
  332. plays: "",
  333. status: "推送中",
  334. screenType: "0",
  335. locationType: "0",
  336. type: "0",
  337. adType: "0",
  338. url: "",
  339. mediaPreview: "",
  340. equipmentType: "",
  341. playTimeStatus: "0",
  342. });
  343. const pageTitle = ref("");
  344. onMounted(async () => {
  345. // 加载样式
  346. styleUrl("advertManage");
  347. let adverInfo = localStorage.getItem("adverInfo");
  348. if (adverInfo) {
  349. pageTitle.value = t("advertManage.modifyAdvertisement");
  350. adverInfo = JSON.parse(adverInfo);
  351. adInfo.value.id = adverInfo.id;
  352. adInfo.value.adminId = adverInfo.adminId;
  353. adInfo.value.username = adverInfo.username;
  354. adInfo.value.name = adverInfo.name;
  355. adInfo.value.orders = adverInfo.orders;
  356. adInfo.value.duration = adverInfo.duration;
  357. adInfo.value.plays = adverInfo.plays;
  358. adInfo.value.screenType =
  359. typeof adverInfo.screenType === "object"
  360. ? "0"
  361. : adverInfo.screenType.toString();
  362. adInfo.value.locationType =
  363. typeof adverInfo.locationType === "object"
  364. ? "0"
  365. : adverInfo.locationType.toString();
  366. adInfo.value.type =
  367. typeof adverInfo.type === "object" ? "0" : adverInfo.type.toString();
  368. adInfo.value.adType =
  369. typeof adverInfo.adType === "object"
  370. ? "0"
  371. : adverInfo.adType.toString();
  372. adInfo.value.url = adverInfo.url;
  373. adInfo.value.mediaPreview = adverInfo.mediaPreview;
  374. adInfo.value.equipmentType = adverInfo.equipmentType;
  375. // 找到机器类型的下标
  376. // busiPopList.forEach((item, index) => {
  377. // console.log(item, index);
  378. // console.log(adverInfo.equipmentType);
  379. // if (item.id == adverInfo.equipmentType) {
  380. // busiDefaIdx.value = index;
  381. // }
  382. // });
  383. busiDefaIdx.value = [adverInfo.equipmentType];
  384. // console.log(adInfo.value);
  385. } else {
  386. pageTitle.value = t("advertManage.addAds");
  387. }
  388. });
  389. const updateAdFun = async () => {
  390. if (pageTitle.value === t("advertManage.modifyAdvertisement")) {
  391. const params = Object.assign({}, adInfo.value);
  392. const { data } = await updateAdInfo(params);
  393. if (data.code === "00000") {
  394. showSuccessToast(
  395. t("advertManage.successfullyModifiedTheAdvertisement")
  396. );
  397. router.push({ path: "advertManage" });
  398. } else {
  399. showFailToast(data.message);
  400. }
  401. console.log("updateAdFun", data);
  402. } else {
  403. const params = Object.assign({}, adInfo.value);
  404. const { data } = await addAdInfo(params);
  405. if (data.code === "00000") {
  406. showSuccessToast(t("advertManage.advertisementAddedSuccessfully"));
  407. router.push({ path: "advertManage" });
  408. } else {
  409. showFailToast(data.message);
  410. }
  411. }
  412. };
  413. return {
  414. pageTitle,
  415. adInfo,
  416. updateAdFun,
  417. busiPopShow,
  418. busiDefaIdx,
  419. busiPopList,
  420. busiPopFieldName,
  421. busiPopConfirm,
  422. busiInpClk,
  423. };
  424. },
  425. };
  426. </script>
  427. <style lang="less" scoped>
  428. @primary-color: #4d6add;
  429. .advert-form-page {
  430. display: flex;
  431. flex-direction: column;
  432. height: 100vh;
  433. background-color: #f5f7fa;
  434. }
  435. .form-container {
  436. flex: 1;
  437. overflow-y: auto;
  438. padding: 16px;
  439. }
  440. .advert-form {
  441. background-color: white;
  442. border-radius: 12px;
  443. padding: 16px;
  444. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
  445. }
  446. .form-section {
  447. margin-bottom: 24px;
  448. padding-bottom: 16px;
  449. border-bottom: 1px solid #f0f0f0;
  450. &:last-child {
  451. margin-bottom: 0;
  452. padding-bottom: 0;
  453. border-bottom: none;
  454. }
  455. }
  456. .section-title {
  457. font-size: 16px;
  458. font-weight: 600;
  459. color: #333;
  460. margin-bottom: 16px;
  461. padding-left: 8px;
  462. position: relative;
  463. &::before {
  464. content: "";
  465. position: absolute;
  466. left: 0;
  467. top: 50%;
  468. transform: translateY(-50%);
  469. width: 3px;
  470. height: 16px;
  471. background-color: @primary-color;
  472. border-radius: 2px;
  473. }
  474. }
  475. .radio-group {
  476. margin: 10px;
  477. .group-label {
  478. font-size: 13px;
  479. color: #404d74;
  480. margin-bottom: 8px;
  481. }
  482. .van-radio-group {
  483. display: flex;
  484. flex-wrap: wrap;
  485. gap: 8px;
  486. }
  487. .van-radio {
  488. background-color: #f5f7fa;
  489. border-radius: 16px;
  490. padding: 6px 16px;
  491. margin-right: 8px;
  492. :deep(.van-radio__label) {
  493. font-size: 13px;
  494. }
  495. }
  496. }
  497. .media-content {
  498. .preview-area {
  499. margin-top: 16px;
  500. .preview-label {
  501. font-size: 14px;
  502. color: #666;
  503. margin-bottom: 8px;
  504. }
  505. .image-preview {
  506. width: 100%;
  507. max-height: 200px;
  508. object-fit: contain;
  509. border-radius: 8px;
  510. border: 1px solid #eee;
  511. }
  512. .video-preview {
  513. width: 100%;
  514. height: 180px;
  515. border-radius: 8px;
  516. background-color: #000;
  517. }
  518. }
  519. }
  520. .submit-section {
  521. margin-top: 24px;
  522. .submit-button {
  523. height: 44px;
  524. font-size: 16px;
  525. font-weight: 500;
  526. }
  527. }
  528. @media (max-width: 480px) {
  529. .form-container {
  530. padding: 12px;
  531. }
  532. .advert-form {
  533. padding: 12px;
  534. }
  535. .section-title {
  536. font-size: 15px;
  537. }
  538. .radio-group {
  539. .van-radio-group {
  540. gap: 5px;
  541. }
  542. .van-radio {
  543. padding: 6px 12px;
  544. margin-right: 6px;
  545. }
  546. }
  547. }
  548. </style>