123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- <template>
- <view class="container">
- <u-cell-group class="form-info" :border="false">
- <u-field label="视频名称" placeholder="请输入视频名称" label-width="180" v-model="videoInfo.videoName">
- <u-button v-if="type == 'edit'" size="mini" slot="right" type="success" @click="goToVideo">预览</u-button>
- </u-field>
- <u-cell-item title="请上传视频" :arrow="false" v-if="type == 'add'">
- <view slot="label">
- <image class="video-img" :src="videoImg" v-show="videoImg" @tap="chooseVideoImage"></image>
- <view class="upload-video" @tap="chooseVideoImage" v-if="!videoImg">
- <u-icon name="plus" size="40" v-if="!videoInfo.mediaFilePath"></u-icon>
- <view class="u-add-tips" style="margin-top: 6px;text-align: center;">{{videoInfo.mediaFilePath ? '上传成功,单击替换视频' : '选择视频'}}</view>
- </view>
- </view>
- </u-cell-item>
- <u-cell-item title="请上传视频海报" :arrow="false" v-if="type == 'add'">
- <view slot="label">
- <u-upload :action="uploadUrl" :file-list="defaultList" :form-data="uploadData" @on-success="uploadSuccess"
- @on-error="uploadError" @on-remove="uploadRemove" max-count="1"></u-upload>
- </view>
- </u-cell-item>
- <u-cell-item title="绑定商品(可多选)" @click="popupShow = true" class="good-arrow">
- <view slot="label">
- <view class="good-card" v-for="(item, index) in goodList.filter(site => site.check)" :key="index">
- <image class="goods-img" :src="item.imgPath"></image>
- <view class="good-info">
- <view class="good-name">{{item.productName}}</view>
- <view class="good-text">销量:{{item.sellCount}}</view>
- <view class="good-price">
- <text class="goods-spec">¥{{item.bizPrice}}/{{item.unit}}</text>
- <text class="goods-original">原价:{{item.originalPrice}}</text>
- </view>
- </view>
- </view>
- </view>
- </u-cell-item>
- </u-cell-group>
- <view class="form-handle">
- <u-button type="success" shape="circle" :ripple="true" @click="submitData" :disabled="getPermit()" class="handle-custom">提交</u-button>
- </view>
- <u-popup v-model="popupShow" mode="bottom" closeable border-radius="30">
- <scroll-view scroll-y="true" class="good-select-box">
- <view class="select-good-row" v-for="(item, index) in goodList" :key="index" @click="setCheck(item)">
- <view class="good-check">
- <view class="iconfont" :class="item.check ? 'iconqueding' : 'iconfeigouxuan'"></view>
- </view>
- <view class="good-card" style="width: calc(100% - 60px);">
- <image class="goods-img" :src="item.imgPath"></image>
- <view class="good-info">
- <view class="good-name">{{item.productName}}</view>
- <view class="good-text">销量:{{item.sellCount}}</view>
- <view class="good-price">
- <text class="goods-spec">¥{{item.bizPrice}}/{{item.unit}}</text>
- <text class="goods-original">原价:{{item.originalPrice}}</text>
- </view>
- </view>
- </view>
- </view>
- </scroll-view>
- <view class="good-select-custom-box">
- <u-button type="success" shape="circle" :ripple="true" @click="popupShow = false" class="good-select-custom">确认</u-button>
- </view>
- </u-popup>
- <u-top-tips ref="uTips"></u-top-tips>
- </view>
- </template>
- <script>
- const NET = require('@/utils/request')
- const API = require('@/config/api')
- export default {
- data() {
- return {
- type: 'add',
- videoId: '',
- videoInfo: {
- videoName: '',
- mediaFilePath: '',
- },
- productIds: '',
- videoImg: '',
- uploadData: {
- folderId: 0,
- },
- uploadUrl: '',
- fileList: [],
- defaultList: [],
- goodList: [],
- popupShow: false,
- }
- },
- onLoad(options) {
- this.uploadUrl = API.uploadFile
- this.type = options.type
- if (this.type == 'edit') {
- this.videoInfo.videoId = options.videoId
- this.getDetail()
- }
- NET.request(API.getVideoGoods, {}, 'GET').then(res => {
- res.data.forEach(site => {
- site.check = this.productIds && this.productIds.indexOf(site.productId) != -1 ? true : false
- })
- this.goodList = res.data
- }).catch(res => {
- this.$refs.uTips.show({
- title: '获取可绑定商品失败',
- type: 'warning',
- })
- })
- },
- onReady() {},
- methods: {
- // 切换选择状态
- setCheck(item) {
- item.check = !item.check
- },
- // 上传视频
- chooseVideoImage() {
- uni.chooseVideo({
- count: 1,
- sourceType: ['camera', 'album'],
- success: (res) => {
- console.log(res)
- this.videoImg = res.thumbTempFilePath
- uni.uploadFile({
- url: API.uploadFile,
- filePath: res.tempFilePath,
- name: 'file',
- formData: this.uploadData,
- success: (uploadFileRes) => {
- let resData = JSON.parse(uploadFileRes.data)
- this.videoInfo.mediaFilePath = resData.data.url
- this.$refs.uTips.show({
- title: '文件上传成功',
- type: 'success',
- })
- }
- });
- }
- });
- },
- // 获取详情
- getDetail() {
- NET.request(API.getVideoDetail, {
- videoId: this.videoInfo.videoId
- }, 'GET').then(res => {
- this.videoInfo.videoName = res.data.videoName
- res.data.products = res.data.products.map(site => {
- return site.productId
- }).join(',')
- if (this.goodList.length && res.data.products) {
- this.goodList.forEach(site => {
- site.check = res.data.products.indexOf(site.productId) != -1
- })
- } else {
- this.productIds = res.data.products ? res.data.products : []
- }
- }).catch(res => {
- this.$refs.uTips.show({
- title: '获取详情失败',
- type: 'warning',
- })
- })
- },
- // 文件上传成功回调
- uploadSuccess(res, index, lists, name) {
- this.fileList.push(res.data.url)
- this.$refs.uTips.show({
- title: '文件上传成功',
- type: 'success',
- })
- return true
- },
- // 文件上传失败回调
- uploadError(res, index, lists, name) {
- this.$refs.uTips.show({
- title: '文件上传失败',
- type: 'warning',
- })
- },
- // 移除文件回调
- uploadRemove(index, lists, name) {
- this.fileList.splice(index, 1)
- },
- // 检查必填项
- getPermit() {
- if (!this.videoInfo.videoName || !this.goodList.filter(site => site.check).length) {
- return true
- }
- if (this.type == 'add' && (!this.videoInfo.mediaFilePath || !this.fileList.length)) {
- return true
- }
- return false
- },
- // 提交
- submitData() {
- if (this.type == 'add') {
- NET.request(API.addVideo, {
- ...this.videoInfo,
- coverFilePath: this.fileList[0],
- coverFileId: 0,
- mediaFileId: 0,
- productIds: this.goodList.filter(site => site.check).map(site => {
- return site.productId
- })
- }, 'POST').then(res => {
- this.$refs.uTips.show({
- title: '新增短视频成功',
- type: 'success',
- })
- setTimeout(() => {
- uni.navigateBack()
- }, 1000)
- }).catch(res => {
- this.$refs.uTips.show({
- title: '新增短视频失败',
- type: 'warning',
- })
- })
- } else {
- NET.request(API.editVideo, {
- ...this.videoInfo,
- productIds: this.goodList.filter(site => site.check).map(site => {
- return site.productId
- })
- }, 'POST').then(res => {
- this.$refs.uTips.show({
- title: '编辑短视频成功',
- type: 'success',
- })
- setTimeout(() => {
- uni.navigateBack()
- }, 1000)
- }).catch(res => {
- this.$refs.uTips.show({
- title: '编辑短视频失败',
- type: 'warning',
- })
- })
- }
- },
- goToVideo() {
- uni.navigateTo({
- url: '/pagesMedia/videoDetail?videoId=' + this.videoInfo.videoId
- });
- }
- },
- }
- </script>
- <style lang="less" scoped>
- page {
- width: 100%;
- height: 100%;
- }
- .container {
- width: 100%;
- height: 100%;
- float: left;
- box-sizing: border-box;
- padding-bottom: 60px;
- overflow-y: auto;
- .form-info {
- width: 100%;
- float: left;
- /deep/.u-label-text {
- color: #333333;
- }
- /deep/.u-cell_title {
- color: #333333;
- }
- .video-img {
- width: 100px;
- height: 100px;
- border-radius: 5px;
- object-fit: cover;
- }
- .upload-video {
- width: 100px;
- height: 100px;
- background: #f4f5f6;
- margin: 5px;
- color: #606266;
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- }
- .good-arrow {
- /deep/.u-cell__right-icon-wrap {
- position: absolute;
- top: 18px;
- right: 10px;
- }
- /deep/.u-cell_title {
- width: calc(100% - 10px) !important;
- }
- }
- }
- .form-handle {
- width: 100%;
- height: 60px;
- position: fixed;
- z-index: 10;
- padding: 10px 15px 20px 15px;
- box-sizing: border-box;
- bottom: 0;
- background-color: #FFFFFF;
- border-top: 1px solid #EEEEEE;
- .handle-custom {
- background-color: #51A539;
- /deep/button {
- background-color: #56a83a;
- }
- /deep/.u-btn--success--disabled {
- background-color: #74bd60 !important;
- }
- }
- }
- .good-select-box {
- width: 100%;
- height: 400px;
- float: left;
- overflow-y: auto;
- padding: 40px 0 10px 0;
- }
- .good-select-custom-box {
- width: calc(100% - 30px);
- margin: 10px 15px;
- float: left;
- .good-select-custom {
- background-color: #51A539;
- /deep/button {
- background-color: #56a83a;
- }
- }
- }
- .select-good-row {
- width: 100%;
- height: 114px;
- float: left;
- }
- .good-check {
- width: 30px;
- height: 104px;
- float: left;
- line-height: 104px;
- margin-right: 10px;
- .iconfont {
- font-size: 40px;
- text-align: right;
- color: #51A539;
- }
- }
- .good-card {
- width: 100%;
- float: left;
- margin: 5px;
- background: #FFFFFF;
- border-radius: 15px;
- box-shadow: 0px 1px 5px 0px rgba(102, 102, 102, 0.43);
- padding: 12px;
- box-sizing: border-box;
- .goods-img {
- width: 80px;
- height: 80px;
- float: left;
- border-radius: 10px;
- object-fit: cover;
- }
- .good-info {
- width: calc(100% - 86px);
- height: 80px;
- float: right;
- .good-name {
- width: 100%;
- height: 40px;
- float: left;
- font-size: 15px;
- font-family: PingFang SC;
- color: #333333;
- line-height: 20px;
- overflow: hidden;
- text-overflow: ellipsis;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- word-wrap: break-word;
- }
- .good-price {
- width: 100%;
- height: 20px;
- float: left;
- line-height: 20px;
- font-family: PingFang SC;
- white-space: nowrap;
- margin: 3px 0 3px 0;
- .goods-spec {
- font-size: 15px;
- color: #52A63A;
- margin-right: 6px;
- }
- .goods-original {
- font-size: 12px;
- text-decoration: line-through;
- color: #A67954;
- }
- }
- }
- }
- }
- </style>
|