裂变星小程序-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.

363 lines
9.1 KiB

1 week ago
1 week ago
1 week ago
  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>
  39. <video v-if="form.vio"
  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. <image src="../static/record/icon-camera.png" style="width: 130rpx; height: 105rpx;" ></image>
  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 { mapState } from 'vuex'
  120. import formUpload from '../components/formUpload.vue'
  121. import formInput from '../components/formInput.vue'
  122. import formNumberBox from '../components/formNumberBox.vue'
  123. import formTextarea from '../components/formTextarea.vue'
  124. export default {
  125. components: {
  126. formUpload,
  127. formInput,
  128. formNumberBox,
  129. formTextarea,
  130. },
  131. data() {
  132. return {
  133. id: null,
  134. status: null,
  135. form: {
  136. headTitle: null,
  137. indexImage: null,
  138. vio: null,
  139. timeNum: 0,
  140. num: 0,
  141. wxCodeImage: null,
  142. textDetails: null,
  143. },
  144. rules: {
  145. 'indexImage': {
  146. type: 'string',
  147. required: true,
  148. message: '请设置封面',
  149. },
  150. 'vio': {
  151. type: 'string',
  152. required: true,
  153. message: '请上传视频',
  154. },
  155. 'headTitle': {
  156. type: 'string',
  157. required: true,
  158. message: '请输入你的视频名称',
  159. },
  160. 'timeNum': {
  161. type: 'number',
  162. required: true,
  163. message: '请设置广告弹出时间(大于1)',
  164. validator: (rule, value, callback) => {
  165. if (value > 1) {
  166. return true
  167. }
  168. return false;
  169. },
  170. },
  171. 'num': {
  172. type: 'number',
  173. required: true,
  174. message: '请设置转发次数(大于0)',
  175. validator: (rule, value, callback) => {
  176. if (value > 0) {
  177. return true
  178. }
  179. return false;
  180. },
  181. },
  182. 'wxCodeImage': {
  183. type: 'string',
  184. required: true,
  185. message: '请选择二维码',
  186. },
  187. 'textDetails': {
  188. type: 'string',
  189. required: true,
  190. message: '请描述你的视频',
  191. },
  192. },
  193. }
  194. },
  195. computed: {
  196. ...mapState(['userInfo']),
  197. },
  198. onLoad(option) {
  199. const { id } = option
  200. if (!id) {
  201. return
  202. }
  203. this.id = id
  204. this.fetchDetails(id)
  205. },
  206. onReady() {
  207. this.$refs.form.setRules(this.rules);
  208. },
  209. onShareAppMessage(res) {
  210. const {
  211. headTitle,
  212. indexImage,
  213. } = this.form
  214. let o = {
  215. title : headTitle,
  216. imageUrl: indexImage,
  217. path: `/pages_order/sharing/video?id=${this.id}&state=1&shareId=${this.userInfo.id}`
  218. }
  219. //调用增加分享次数的方法
  220. const params = {
  221. id:this.id,
  222. state:"1",
  223. }
  224. this.$fetch('addLogShareInfo', params)
  225. // todo: get times and check is unlocked
  226. this.isLocked = false
  227. return o
  228. },
  229. methods: {
  230. async fetchDetails(id) {
  231. try {
  232. const result = await this.$fetch('getVideoShareInfo', { id })
  233. const {
  234. headTitle,
  235. indexImage,
  236. vio,
  237. timeNum,
  238. num,
  239. wxCodeImage,
  240. textDetails,
  241. status,
  242. } = result || {}
  243. this.form = {
  244. headTitle,
  245. indexImage,
  246. vio,
  247. timeNum,
  248. num,
  249. wxCodeImage,
  250. textDetails,
  251. }
  252. this.status = status
  253. } catch (err) {
  254. }
  255. },
  256. async onSubmit() {
  257. try {
  258. await this.$refs.form.validate()
  259. const {
  260. headTitle,
  261. indexImage,
  262. vio,
  263. timeNum,
  264. num,
  265. wxCodeImage,
  266. textDetails,
  267. } = this.form
  268. const params = {
  269. headTitle,
  270. indexImage,
  271. vio,
  272. timeNum,
  273. num,
  274. wxCodeImage,
  275. textDetails,
  276. }
  277. if (this.id) {
  278. params.id = this.id
  279. }
  280. await this.$fetch('saveOrUpdateVideoShare', params)
  281. uni.showToast({
  282. title: '提交成功',
  283. icon: 'none'
  284. })
  285. setTimeout(uni.navigateBack, 1000, -1)
  286. } catch (err) {
  287. }
  288. },
  289. onPublish() {
  290. // todo
  291. },
  292. }
  293. }
  294. </script>
  295. <style scoped lang="scss">
  296. @import '../styles/pageForm.scss';
  297. .upload__view {
  298. justify-content: space-between;
  299. margin-bottom: 20rpx;
  300. }
  301. .upload {
  302. background-color: $uni-fg-color;
  303. border-radius: 12rpx;
  304. overflow: hidden;
  305. /deep/ .uv-form-item__body {
  306. padding: 0 !important;
  307. }
  308. }
  309. .upload-video {
  310. &-text {
  311. color: #1B1B1B;
  312. font-size: 32rpx;
  313. font-weight: 700;
  314. margin-top: 35rpx;
  315. }
  316. }
  317. .upload-cover {
  318. position: relative;
  319. &-text {
  320. position: absolute;
  321. bottom: 0;
  322. width: 100%;
  323. background-color: rgba($color: #000000, $alpha: 0.6);
  324. color: #FFFFFF;
  325. padding: 21rpx 0;
  326. }
  327. }
  328. </style>