裂变星小程序-25.03.04
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

331 lines
8.3 KiB

  1. <template>
  2. <view class="page">
  3. <navbar title="视频分享" leftClick @leftClick="$utils.navigateBack" />
  4. <view class="content">
  5. <uv-form
  6. ref="form"
  7. :model="form"
  8. :rules="rules"
  9. labelPosition="left"
  10. labelWidth="340rpx"
  11. :labelStyle="{
  12. color: '#1B1B1B',
  13. fontSize: '32rpx',
  14. fontWeight: 'bold',
  15. }"
  16. errorType="toast"
  17. >
  18. <view class="flex upload__view">
  19. <view class="upload upload-cover">
  20. <uv-form-item labelWidth="0" prop="indexImage">
  21. <formUpload v-model="form.indexImage">
  22. <template v-slot="{ value }">
  23. <!-- todo: 默认 -->
  24. <image
  25. :src="value"
  26. mode="aspectFill"
  27. style="width: 344rpx; height: 344rpx;"
  28. radius="14rpx"
  29. />
  30. </template>
  31. </formUpload>
  32. <view class="upload-cover-text flex">设置封面</view>
  33. </uv-form-item>
  34. </view>
  35. <view class="upload upload-video">
  36. <uv-form-item labelWidth="0" prop="vio">
  37. <formUpload v-model="form.vio" accept="video">
  38. <template v-slot="{ value }">
  39. <video v-if="value"
  40. :src="form.vio"
  41. style="width: 344rpx; height: 344rpx;"
  42. radius="14rpx"
  43. :controls="false"
  44. :autoplay="false"
  45. :show-center-play-btn="false"
  46. ></video>
  47. <view v-else class="flex flex-column" style="width: 344rpx; height: 344rpx;">
  48. <uv-icon name="camera" color="#000000" size="129rpx"></uv-icon>
  49. <text class="upload-video-text">上传视频</text>
  50. </view>
  51. </template>
  52. </formUpload>
  53. </uv-form-item>
  54. </view>
  55. </view>
  56. <view class="form-item">
  57. <uv-form-item label="标题" labelWidth="84rpx" prop="headTitle">
  58. <view class="form-item-content">
  59. <formInput v-model="form.headTitle" placeholder="请输入你的视频名称" width="584rpx"></formInput>
  60. </view>
  61. </uv-form-item>
  62. </view>
  63. <view class="form-item">
  64. <uv-form-item label="设置广告弹出时间(s)" prop="timeNum">
  65. <view class="form-item-content">
  66. <formNumberBox v-model="form.timeNum" ></formNumberBox>
  67. </view>
  68. </uv-form-item>
  69. </view>
  70. <view class="form-item">
  71. <uv-form-item label="设置转发次数(次)" prop="num">
  72. <view class="form-item-content">
  73. <formNumberBox v-model="form.num" ></formNumberBox>
  74. </view>
  75. </uv-form-item>
  76. </view>
  77. <view class="form-item">
  78. <uv-form-item label="选择二维码" prop="wxCodeImage">
  79. <view class="form-item-content">
  80. <formUpload v-model="form.wxCodeImage">
  81. <template v-slot="{ value }">
  82. <view class="flex" style="min-width: 93rpx; height: 45rpx;">
  83. <image
  84. :src="value"
  85. mode="aspectFill"
  86. style="width: 45rpx; height: 45rpx;"
  87. radius="14rpx"
  88. />
  89. <uv-icon style="margin-left: 20rpx" name="arrow-right" color="#000000" size="28rpx"></uv-icon>
  90. </view>
  91. </template>
  92. </formUpload>
  93. </view>
  94. </uv-form-item>
  95. </view>
  96. <view class="form-item">
  97. <uv-form-item label="视频描述" prop="textDetails" labelPosition="top">
  98. <view style="margin-top: 32rpx;">
  99. <formTextarea
  100. v-model="form.textDetails"
  101. placeholder="请描述你的视频"
  102. ></formTextarea>
  103. </view>
  104. </uv-form-item>
  105. </view>
  106. </uv-form>
  107. </view>
  108. <!-- 审核通过 -->
  109. <button v-if="status === 1" class="button-submit" open-type="share">
  110. 发布
  111. </button>
  112. <!-- 不是 审核中 已发布 -> 创建分享 审核不通过 -->
  113. <button v-else-if="![0,1].includes(status)" class="button-submit" @click="onSubmit">
  114. 提交审核
  115. </button>
  116. </view>
  117. </template>
  118. <script>
  119. import formUpload from '../components/formUpload.vue'
  120. import formInput from '../components/formInput.vue'
  121. import formNumberBox from '../components/formNumberBox.vue'
  122. import formTextarea from '../components/formTextarea.vue'
  123. export default {
  124. components: {
  125. formUpload,
  126. formInput,
  127. formNumberBox,
  128. formTextarea,
  129. },
  130. data() {
  131. return {
  132. id: null,
  133. status: null,
  134. form: {
  135. headTitle: null,
  136. indexImage: null,
  137. vio: null,
  138. timeNum: 10,
  139. num: 10,
  140. wxCodeImage: null,
  141. textDetails: null,
  142. },
  143. rules: {
  144. 'indexImage': {
  145. type: 'string',
  146. required: true,
  147. message: '请设置封面',
  148. },
  149. 'vio': {
  150. type: 'string',
  151. required: true,
  152. message: '请上传视频',
  153. },
  154. 'headTitle': {
  155. type: 'string',
  156. required: true,
  157. message: '请输入你的视频名称',
  158. },
  159. 'timeNum': {
  160. type: 'number',
  161. required: true,
  162. message: '请设置广告弹出时间',
  163. },
  164. 'num': {
  165. type: 'number',
  166. required: true,
  167. message: '请设置转发次数',
  168. },
  169. 'wxCodeImage': {
  170. type: 'string',
  171. required: true,
  172. message: '请选择二维码',
  173. },
  174. 'textDetails': {
  175. type: 'string',
  176. required: true,
  177. message: '请描述你的视频',
  178. },
  179. },
  180. }
  181. },
  182. onLoad(option) {
  183. const { id } = option
  184. if (!id) {
  185. return
  186. }
  187. this.id = id
  188. this.fetchDetails(id)
  189. },
  190. onShareAppMessage(res) {
  191. const {
  192. headTitle,
  193. indexImage,
  194. } = this.form
  195. let o = {
  196. title : headTitle,
  197. imageUrl: indexImage,
  198. path: `/pages_order/sharing/video?id=${this.id}`
  199. }
  200. // todo: get times and check is unlocked
  201. this.isLocked = false
  202. return o
  203. },
  204. methods: {
  205. async fetchDetails(id) {
  206. try {
  207. const result = await this.$fetch('getVideoShareInfo', { id })
  208. const {
  209. headTitle,
  210. indexImage,
  211. vio,
  212. timeNum,
  213. num,
  214. wxCodeImage,
  215. textDetails,
  216. status,
  217. } = result || {}
  218. this.form = {
  219. headTitle,
  220. indexImage,
  221. vio,
  222. timeNum,
  223. num,
  224. wxCodeImage,
  225. textDetails,
  226. }
  227. this.status = status
  228. } catch (err) {
  229. }
  230. },
  231. async onSubmit() {
  232. try {
  233. await this.$refs.form.validate()
  234. const {
  235. headTitle,
  236. indexImage,
  237. vio,
  238. timeNum,
  239. num,
  240. wxCodeImage,
  241. textDetails,
  242. } = this.form
  243. const params = {
  244. id: this.id,
  245. headTitle,
  246. indexImage,
  247. vio,
  248. timeNum,
  249. num,
  250. wxCodeImage,
  251. textDetails,
  252. }
  253. await this.$fetch('saveOrUpdateVideoShare', params)
  254. uni.showToast({
  255. title: '提交成功',
  256. icon: 'none'
  257. })
  258. setTimeout(uni.navigateBack, 1000, -1)
  259. } catch (err) {
  260. }
  261. },
  262. onPublish() {
  263. // todo
  264. },
  265. }
  266. }
  267. </script>
  268. <style scoped lang="scss">
  269. @import '../styles/pageForm.scss';
  270. .upload__view {
  271. justify-content: space-between;
  272. margin-bottom: 20rpx;
  273. }
  274. .upload {
  275. background-color: $uni-fg-color;
  276. border-radius: 12rpx;
  277. overflow: hidden;
  278. /deep/ .uv-form-item__body {
  279. padding: 0 !important;
  280. }
  281. }
  282. .upload-video {
  283. &-text {
  284. color: #1B1B1B;
  285. font-size: 32rpx;
  286. }
  287. }
  288. .upload-cover {
  289. position: relative;
  290. &-text {
  291. position: absolute;
  292. bottom: 0;
  293. width: 100%;
  294. background-color: rgba($color: #000000, $alpha: 0.6);
  295. color: #FFFFFF;
  296. padding: 21rpx 0;
  297. }
  298. }
  299. </style>