watchReward.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. <template >
  2. <div v-loading="loading">
  3. <!-- 提示信息 -->
  4. <div class="tip-message" >
  5. 设置观看奖励,用户达到直播观看时长后可领取奖励
  6. </div>
  7. <!-- 开启观看奖励开关 -->
  8. <div class="reward-switch">
  9. <span class="switch-label">开启观看奖励</span>
  10. <el-switch v-model="watchRewardForm.enabled"></el-switch>
  11. </div>
  12. <!-- 观看奖励设置 -->
  13. <div v-if="watchRewardForm.enabled" class="section-block">
  14. <div class="section-title">观看奖励设置</div>
  15. <!-- 表单内容 -->
  16. <el-form
  17. :model="watchRewardForm"
  18. :rules="rules"
  19. ref="watchRewardForm"
  20. label-width="130px"
  21. >
  22. <!-- 参与条件 -->
  23. <el-form-item label="参与条件" prop="participateCondition">
  24. <el-radio-group v-model="watchRewardForm.participateCondition">
  25. <el-radio label="1">达到指定观看时长发积分</el-radio>
  26. <el-radio label="2" v-if="this.projectFrom!=='颐安心'">启用完课积分</el-radio>
  27. <el-radio label="3">启动直播完课奖励</el-radio>
  28. </el-radio-group>
  29. </el-form-item>
  30. <!-- 观看时长 -->
  31. <el-form-item label="观看时长" prop="watchDuration" v-if="watchRewardForm.participateCondition === '1'">
  32. <el-input v-model="watchRewardForm.watchDuration" placeholder="请输入观看时长" class="duration-input">
  33. <template #append>分钟</template>
  34. </el-input>
  35. </el-form-item>
  36. <!-- 完课率要求 -->
  37. <el-form-item label="完课率要求" prop="completionRate" v-if="watchRewardForm.participateCondition === '2' || watchRewardForm.participateCondition === '3'">
  38. <el-input-number
  39. v-model="watchRewardForm.completionRate"
  40. :min="1"
  41. :max="100"
  42. :precision="0"
  43. placeholder="请输入完课率"
  44. style="width: 200px;"
  45. ></el-input-number>
  46. <span style="margin-left: 10px; color: #909399;">%(观看时长占直播总时长的比例)</span>
  47. </el-form-item>
  48. <!-- 连续完课积分配置 -->
  49. <el-form-item label="连续完课积分" prop="pointsConfig" v-if="watchRewardForm.participateCondition === '2'">
  50. <div style="display: flex; flex-direction: column; gap: 10px;">
  51. <div v-for="(point, index) in watchRewardForm.pointsConfig" :key="index" style="display: flex; align-items: center;">
  52. <span style="width: 80px;">第{{ index + 1 }}天:</span>
  53. <el-input-number
  54. v-model="watchRewardForm.pointsConfig[index]"
  55. :min="0"
  56. :precision="0"
  57. placeholder="请输入积分值"
  58. style="width: 200px;"
  59. ></el-input-number>
  60. <span style="margin-left: 10px; color: #909399;">积分</span>
  61. </div>
  62. </div>
  63. </el-form-item>
  64. <!-- 实施动作(仅在达到指定观看时长时显示) -->
  65. <el-form-item label="实施动作" prop="action" v-if="watchRewardForm.participateCondition === '1'">
  66. <el-select v-model="watchRewardForm.action" placeholder="请选择实施动作" style="width: 300px;">
  67. <el-option
  68. v-for="item in actionOptions"
  69. :key="item.value"
  70. :label="item.label"
  71. :value="item.value"
  72. ></el-option>
  73. </el-select>
  74. </el-form-item>
  75. <!-- 领取提示语 -->
  76. <!-- <el-form-item label="领取提示语" prop="receivePrompt">-->
  77. <!-- <el-input v-model="watchRewardForm.receivePrompt" placeholder="请输入领取提示语"></el-input>-->
  78. <!-- </el-form-item>-->
  79. <div v-if="watchRewardForm.participateCondition === '3'">
  80. <div class="section-title">直播红包设置</div>
  81. <!-- 红包金额 -->
  82. <el-form-item label="红包金额" prop="redPacketAmount" v-if="watchRewardForm.participateCondition === '3'">
  83. <el-input-number v-model="watchRewardForm.redPacketAmount" :min="0.1" :max="10" :step="0.1"></el-input-number>
  84. </el-form-item>
  85. <!-- 红包余额是否扣减开关 -->
  86. <el-form-item label="红包余额是否扣减开关">
  87. <el-radio-group v-model="watchRewardForm.isRedPackageBalanceDeduction">
  88. <el-radio label="1">开</el-radio>
  89. <el-radio label="2">关</el-radio>
  90. </el-radio-group>
  91. </el-form-item>
  92. </div>
  93. <div v-if="watchRewardForm.participateCondition === '3'">
  94. <div class="section-title">录播奖励设置</div>
  95. <!-- 是否录播可领取奖励 -->
  96. <el-form-item label="录播可领取奖励">
  97. <el-switch v-model="watchRewardForm.recordRedPacketEnabled"></el-switch>
  98. </el-form-item>
  99. <!-- 录播奖励配置列表 -->
  100. <div v-if="watchRewardForm.recordRedPacketEnabled">
  101. <div v-for="(item, index) in watchRewardForm.recordTimeRanges" :key="index" class="record-reward-item">
  102. <el-time-picker
  103. is-range
  104. v-model="item.range"
  105. range-separator="至"
  106. start-placeholder="开始时间"
  107. end-placeholder="结束时间"
  108. format="HH:mm"
  109. value-format="HH:mm"
  110. style="width: 280px;"
  111. @change="onTimeRangeChange(index)"
  112. ></el-time-picker>
  113. <el-radio-group v-model="item.rewardType" style="margin-left: 15px;">
  114. <el-radio label="1">红包</el-radio>
  115. <el-radio label="2">积分</el-radio>
  116. </el-radio-group>
  117. <el-input-number v-if="item.rewardType === '1'" v-model="item.redPacketAmount" :min="0.1" :max="10" :step="0.1" style="width: 140px; margin-left: 15px;"></el-input-number>
  118. <el-input v-if="item.rewardType === '2'" v-model="item.scoreAmount" placeholder="积分值" style="width: 140px; margin-left: 15px;"></el-input>
  119. <el-button type="danger" icon="el-icon-delete" circle style="margin-left: 10px;" @click="removeRecordTimeRange(index)" v-if="watchRewardForm.recordTimeRanges.length > 1"></el-button>
  120. </div>
  121. <div v-if="timeRangeOverlap" style="color: #F56C6C; font-size: 12px; margin-top: -5px; margin-bottom: 10px;">时间段之间存在重叠,请重新选择</div>
  122. <el-button type="primary" icon="el-icon-plus" size="small" @click="addRecordTimeRange">添加时间段</el-button>
  123. </div>
  124. </div>
  125. <!-- 红包设置(仅在达到指定观看时长时显示) -->
  126. <div v-if="watchRewardForm.participateCondition === '1'">
  127. <div class="section-title">红包设置</div>
  128. <!-- 根据实施动作类型显示不同的表单内容 -->
  129. <template v-if="watchRewardForm.action === '1'">
  130. <!-- 现金红包设置 -->
  131. <!-- 红包发放方式 1固定金额 2随机金额 -->
  132. <el-form-item label="红包发放方式" prop="redPacketType">
  133. <el-radio-group v-model="watchRewardForm.redPacketType">
  134. <el-radio label="1">固定金额</el-radio>
  135. <el-radio label="2">随机金额</el-radio>
  136. </el-radio-group>
  137. </el-form-item>
  138. <!-- 红包金额 -->
  139. <el-form-item label="红包金额" prop="redPacketAmount">
  140. <el-input v-model="watchRewardForm.redPacketAmount" placeholder="请输入红包金额"></el-input>
  141. </el-form-item>
  142. <!-- 红包发放数量 -->
  143. <el-form-item label="红包发放数量" prop="redPacketCount">
  144. <el-input v-model="watchRewardForm.redPacketCount" placeholder="红包数量+28888人数"></el-input>
  145. </el-form-item>
  146. <!-- 红包领取方式 1二维码核销 2微信提现 -->
  147. <el-form-item label="红包领取方式" prop="receiveMethod">
  148. <el-radio-group v-model="watchRewardForm.receiveMethod">
  149. <el-radio label="1">二维码领取</el-radio>
  150. <el-radio label="2">微信发放</el-radio>
  151. </el-radio-group>
  152. </el-form-item>
  153. </template>
  154. <template v-else>
  155. <!-- 积分红包设置 -->
  156. <!-- 积分值 -->
  157. <el-form-item label="积分值" prop="scoreAmount">
  158. <el-input
  159. v-model="watchRewardForm.scoreAmount"
  160. placeholder="请输入积分值" style="width: 300px;"
  161. ></el-input>
  162. </el-form-item>
  163. <!-- 最大领取人数 -->
  164. <!-- <el-form-item label="最大领取人数" prop="maxReceivers">-->
  165. <!-- <el-input-->
  166. <!-- v-model="watchRewardForm.maxReceivers"-->
  167. <!-- placeholder="请输入最大领取人数" style="width: 300px;"-->
  168. <!-- ></el-input>-->
  169. <!-- </el-form-item>-->
  170. </template>
  171. </div>
  172. <!-- 其他设置(仅在达到指定观看时长时显示) -->
  173. <div v-if="watchRewardForm.participateCondition === '1'">
  174. <div class="section-title">其他设置</div>
  175. <template v-if="watchRewardForm.action === '1'">
  176. <!-- 客服引导 1跟进企业微信 2不设置 -->
  177. <el-form-item label="客服引导" prop="showGuide">
  178. <el-radio-group v-model="watchRewardForm.showGuide">
  179. <el-radio label="1">跟进企业微信</el-radio>
  180. <el-radio label="2">不设置</el-radio>
  181. </el-radio-group>
  182. </el-form-item>
  183. <!-- 客服引导语 -->
  184. <el-form-item label="客服引导语" prop="guideText">
  185. <el-input
  186. v-model="watchRewardForm.guideText"
  187. placeholder="请输入客服引导语" style="width: 300px;"
  188. ></el-input>
  189. </el-form-item>
  190. </template>
  191. <template v-else>
  192. <!-- 积分使用引导语 -->
  193. <el-form-item label="积分使用引导语" prop="scoreGuideText">
  194. <el-input
  195. v-model="watchRewardForm.scoreGuideText"
  196. placeholder="请输入积分使用引导语" style="width: 300px;"
  197. ></el-input>
  198. </el-form-item>
  199. <!-- 积分使用引导链接 -->
  200. <el-form-item label="积分使用引导链接" prop="scoreGuideLink">
  201. <el-input
  202. v-model="watchRewardForm.scoreGuideLink"
  203. placeholder="请输入积分使用引导链接" style="width: 300px;"
  204. ></el-input>
  205. </el-form-item>
  206. <!-- 引导语 -->
  207. <!-- <el-form-item label="引导语" prop="guideText">-->
  208. <!-- <el-input-->
  209. <!-- v-model="watchRewardForm.guideText"-->
  210. <!-- placeholder="请输入引导语" style="width: 300px;"-->
  211. <!-- ></el-input>-->
  212. <!-- </el-form-item>-->
  213. </template>
  214. </div>
  215. <!-- 保存按钮 -->
  216. <div class="form-actions">
  217. <el-button type="primary" @click="saveWatchReward">保存</el-button>
  218. </div>
  219. </el-form>
  220. </div>
  221. </div>
  222. </template>
  223. <script>
  224. import {addConfig, getConfig, updateConfig} from "@/api/live/liveQuestionLive";
  225. export default {
  226. data() {
  227. return {
  228. projectFrom:process.env.VUE_APP_TITLE_INDEX,
  229. loading: true,
  230. liveId: null,
  231. watchRewardForm: {
  232. id: null,
  233. liveId: null,
  234. // 是否启用观看奖励
  235. enabled: false,
  236. // 参与条件 1:达到指定观看时长 2:启用完课积分
  237. participateCondition: '1',
  238. // 观看时长
  239. watchDuration: '',
  240. // 实施动作
  241. action: '2',
  242. // 领取提示语
  243. receivePrompt: '',
  244. // 红包发放方式(固定金额/随机金额)
  245. redPacketType: '1',
  246. // 红包金额
  247. redPacketAmount: '',
  248. //是否开启红包扣减
  249. isRedPackageBalanceDeduction: '2',
  250. // 红包发放数量
  251. redPacketCount: '',
  252. // 红包领取方式
  253. receiveMethod: '1',
  254. // 是否显示客服引导
  255. showGuide: '1',
  256. // 客服引导语
  257. guideText: '',
  258. // 积分值
  259. scoreAmount: '',
  260. // 是否录播可领取奖励
  261. recordRedPacketEnabled: false,
  262. // 录播奖励配置列表(前端展示用)
  263. recordTimeRanges: [{ range: null, rewardType: '1', redPacketAmount: '', scoreAmount: '' }],
  264. // 录播奖励配置字符串(提交后端用)
  265. recordTimeRangeStr: '',
  266. // // 最大领取人数
  267. // maxReceivers: '',
  268. // 积分使用引导语
  269. scoreGuideText: '',
  270. // 积分使用引导链接
  271. scoreGuideLink: '',
  272. // 完课积分相关配置(participateCondition为2时使用)
  273. // 完课率要求(1-100)
  274. completionRate: 90,
  275. // 连续完课积分配置(第1-10天)
  276. pointsConfig: [100, 110, 120, 130, 140, 150, 160, 170, 180, 200]
  277. },
  278. rules:{
  279. participateCondition:[
  280. { required: true, message: '请选择参与条件', trigger: 'change'}
  281. ],
  282. watchDuration:[
  283. {
  284. validator: (rule, value, callback) => {
  285. if (this.watchRewardForm.participateCondition === '1') {
  286. if (!value) {
  287. callback(new Error('请输入观看时长'));
  288. } else {
  289. callback();
  290. }
  291. } else {
  292. callback();
  293. }
  294. },
  295. trigger: 'blur'
  296. }
  297. ],
  298. completionRate:[
  299. {
  300. validator: (rule, value, callback) => {
  301. if (this.watchRewardForm.participateCondition === '2') {
  302. if (!value && value !== 0) {
  303. callback(new Error('请输入完课率要求'));
  304. } else if (value < 1 || value > 100) {
  305. callback(new Error('完课率要求范围为1-100'));
  306. } else {
  307. callback();
  308. }
  309. } else {
  310. callback();
  311. }
  312. },
  313. trigger: 'blur'
  314. }
  315. ],
  316. action:[
  317. {
  318. validator: (rule, value, callback) => {
  319. if (this.watchRewardForm.participateCondition === '1') {
  320. if (!value) {
  321. callback(new Error('请选择实施动作'));
  322. } else {
  323. callback();
  324. }
  325. } else {
  326. callback();
  327. }
  328. },
  329. trigger: 'change'
  330. }
  331. ],
  332. // receivePrompt:[
  333. // { required: true, message: '请输入领取提示语', trigger: 'blur'}
  334. // ],
  335. redPacketType:[
  336. { required: true, message: '请选择红包发放方式', trigger: 'blur'}
  337. ],
  338. redPacketAmount:[
  339. { required: true, message: '请输入红包金额', trigger: 'blur'}
  340. ],
  341. scoreAmount:[
  342. { required: true, message: '请输入积分数量', trigger: 'blur'}
  343. ],
  344. receiveMethod:[
  345. { required: true, message: '请选择红包领取方式', trigger: 'blur'}
  346. ],
  347. // guideText:[
  348. // { required: true, message: '请输入客服引导语', trigger: 'blur'}
  349. // ],
  350. showGuide:[
  351. { required: true, message: '请选择是否显示客服引导', trigger: 'blur'}
  352. ]
  353. },
  354. // 添加实施动作选项
  355. actionOptions: [
  356. // {
  357. // label: '现金红包',
  358. // value: '1'
  359. // },
  360. {
  361. label: '积分红包',
  362. value: '2'
  363. }
  364. ],
  365. timeRangeOverlap: false,
  366. };
  367. },
  368. watch: {
  369. // 监听路由的 query 参数变化
  370. '$route.query': {
  371. handler(newQuery) {
  372. this.liveId = this.$route.params.liveId
  373. this.watchRewardForm.liveId = this.liveId
  374. if(this.liveId == null) {
  375. return;
  376. }
  377. this.getLiveConfig();
  378. },
  379. // 初始化时立即执行一次
  380. immediate: true
  381. },
  382. // 监听开启观看奖励开关变化
  383. 'watchRewardForm.enabled': {
  384. handler(newValue, oldValue) {
  385. // 只有当关闭开关时才自动保存(从 true 变为 false)
  386. if (oldValue === true && newValue === false && this.liveId) {
  387. this.autoSaveEnabled();
  388. }
  389. }
  390. }
  391. },
  392. created() {
  393. },
  394. methods: {
  395. addRecordTimeRange() {
  396. this.watchRewardForm.recordTimeRanges.push({ range: null, rewardType: '1', redPacketAmount: '', scoreAmount: '' })
  397. },
  398. removeRecordTimeRange(index) {
  399. this.watchRewardForm.recordTimeRanges.splice(index, 1)
  400. this.checkOverlap()
  401. },
  402. onTimeRangeChange(currentIndex) {
  403. const current = this.watchRewardForm.recordTimeRanges[currentIndex]
  404. if (!current || !current.range || current.range.length !== 2) {
  405. this.checkOverlap()
  406. return
  407. }
  408. const currentStart = this.timeToMinutes(current.range[0])
  409. const currentEnd = this.timeToMinutes(current.range[1])
  410. const others = this.watchRewardForm.recordTimeRanges
  411. .filter((item, i) => i !== currentIndex && item.range && item.range.length === 2)
  412. .map(item => ({
  413. start: this.timeToMinutes(item.range[0]),
  414. end: this.timeToMinutes(item.range[1])
  415. }))
  416. let overlap = false
  417. for (const other of others) {
  418. if (currentStart < other.end && other.start < currentEnd) {
  419. overlap = true
  420. break
  421. }
  422. }
  423. if (overlap) {
  424. this.$set(current, 'range', null)
  425. this.$message.error('时间重叠,请重新选择')
  426. }
  427. this.checkOverlap()
  428. },
  429. checkOverlap() {
  430. const ranges = this.watchRewardForm.recordTimeRanges
  431. .filter(item => item.range && item.range.length === 2)
  432. .map(item => ({
  433. start: this.timeToMinutes(item.range[0]),
  434. end: this.timeToMinutes(item.range[1])
  435. }))
  436. for (let i = 0; i < ranges.length; i++) {
  437. for (let j = i + 1; j < ranges.length; j++) {
  438. if (ranges[i].start < ranges[j].end && ranges[j].start < ranges[i].end) {
  439. this.timeRangeOverlap = true
  440. return
  441. }
  442. }
  443. }
  444. this.timeRangeOverlap = false
  445. },
  446. timeToMinutes(timeStr) {
  447. if (!timeStr) return 0
  448. const parts = timeStr.split(':')
  449. return parseInt(parts[0]) * 60 + parseInt(parts[1])
  450. },
  451. minutesToTime(minutes) {
  452. const h = Math.floor(minutes / 60).toString().padStart(2, '0')
  453. const m = (minutes % 60).toString().padStart(2, '0')
  454. return h + ':' + m
  455. },
  456. getLiveConfig(){
  457. getConfig(this.liveId).then(response => {
  458. if(response.code === 200 && response.data != null && response.data.length > 0){
  459. const serverData = JSON.parse(response.data)
  460. this.watchRewardForm = Object.assign({}, this.watchRewardForm, serverData)
  461. if (this.watchRewardForm.recordTimeRangeStr) {
  462. this.watchRewardForm.recordTimeRanges = this.watchRewardForm.recordTimeRangeStr.split(',').map(item => {
  463. const parts = item.split('-')
  464. return { range: [parts[0], parts[1]], rewardType: parts[2] || '1', redPacketAmount: parts[3] || '', scoreAmount: parts[4] || '' }
  465. })
  466. } else {
  467. this.watchRewardForm.recordTimeRanges = [{ range: null, rewardType: '1', redPacketAmount: '', scoreAmount: '' }]
  468. }
  469. if(this.watchRewardForm.isRedPackageBalanceDeduction == null){
  470. this.watchRewardForm.isRedPackageBalanceDeduction = '1'
  471. } else {
  472. this.watchRewardForm.isRedPackageBalanceDeduction = String(this.watchRewardForm.isRedPackageBalanceDeduction)
  473. }
  474. }
  475. this.loading = false
  476. })
  477. },
  478. // 自动保存开关状态
  479. autoSaveEnabled() {
  480. const submitData = Object.assign({}, this.watchRewardForm)
  481. if (submitData.recordTimeRanges && submitData.recordTimeRanges.length > 0) {
  482. submitData.recordTimeRangeStr = submitData.recordTimeRanges
  483. .filter(item => item.range && item.range.length === 2)
  484. .map(item => item.range[0] + '-' + item.range[1] + '-' + item.rewardType + '-' + (item.rewardType === '1' ? item.redPacketAmount : '') + '-' + (item.rewardType === '2' ? item.scoreAmount : ''))
  485. .join(',')
  486. } else {
  487. submitData.recordTimeRangeStr = ''
  488. }
  489. delete submitData.recordTimeRanges
  490. if (this.watchRewardForm.id == null) {
  491. addConfig(submitData, this.liveId).then(res => {
  492. if (res.code == 200) {
  493. this.msgSuccess("已关闭观看奖励");
  494. // 更新 id,下次修改时使用 update
  495. if (res.data && res.data.id) {
  496. this.watchRewardForm.id = res.data.id;
  497. }
  498. }
  499. }).catch(() => {
  500. // 如果保存失败,恢复开关状态
  501. this.watchRewardForm.enabled = true;
  502. });
  503. } else {
  504. updateConfig(submitData, this.liveId).then(response => {
  505. if (response.code == 200) {
  506. this.msgSuccess("已关闭观看奖励");
  507. }
  508. }).catch(() => {
  509. // 如果保存失败,恢复开关状态
  510. this.watchRewardForm.enabled = true;
  511. });
  512. }
  513. },
  514. saveWatchReward() {
  515. this.$refs["watchRewardForm"].validate(valid => {
  516. console.log(valid)
  517. if (valid) {
  518. if (this.timeRangeOverlap) {
  519. this.$message.error('时间段之间存在重叠,请重新选择')
  520. return
  521. }
  522. const submitData = Object.assign({}, this.watchRewardForm)
  523. if (submitData.recordTimeRanges && submitData.recordTimeRanges.length > 0) {
  524. submitData.recordTimeRangeStr = submitData.recordTimeRanges
  525. .filter(item => item.range && item.range.length === 2)
  526. .map(item => item.range[0] + '-' + item.range[1] + '-' + item.rewardType + '-' + (item.rewardType === '1' ? item.redPacketAmount : '') + '-' + (item.rewardType === '2' ? item.scoreAmount : ''))
  527. .join(',')
  528. } else {
  529. submitData.recordTimeRangeStr = ''
  530. }
  531. delete submitData.recordTimeRanges
  532. if (this.watchRewardForm.id == null) {
  533. addConfig(submitData,this.liveId).then(res => {
  534. if (res.code == 200) {
  535. this.msgSuccess("修改成功");
  536. }
  537. })
  538. } else {
  539. updateConfig(submitData,this.liveId).then(response => {
  540. this.msgSuccess("修改成功");
  541. });
  542. }
  543. }
  544. })
  545. },
  546. }
  547. };
  548. </script>
  549. <style scoped>
  550. /* 录播奖励配置项样式 */
  551. .record-reward-item {
  552. display: flex;
  553. align-items: center;
  554. margin-bottom: 10px;
  555. padding: 10px 0;
  556. border-top: 1px dashed #dcdfe6;
  557. }
  558. .record-reward-item:first-child {
  559. border-top: none;
  560. padding-top: 0;
  561. }
  562. /* 提示信息样式 */
  563. .tip-message {
  564. padding: 12px 16px;
  565. background-color: #FFF6F2;
  566. border-radius: 4px;
  567. color: #666;
  568. font-size: 14px;
  569. margin-bottom: 20px;
  570. }
  571. /* 开关容器样式 */
  572. .reward-switch {
  573. margin-left: 200px;
  574. margin-bottom: 20px;
  575. padding: 20px;
  576. background-color: #fff;
  577. border-radius: 4px;
  578. display: flex;
  579. align-items: center;
  580. }
  581. /* 开关标签样式 */
  582. .reward-switch .switch-label {
  583. margin-right: 10px;
  584. font-size: 14px;
  585. color: #333;
  586. margin-left: 50px;
  587. }
  588. /* 表单区块样式 */
  589. .section-block {
  590. width: 50%;
  591. background-color: #fff;
  592. padding: 20px;
  593. border-radius: 4px;
  594. margin-left: 50px;
  595. margin-bottom: 20px;
  596. }
  597. /* 标题样式 */
  598. .section-block .section-title {
  599. font-size: 14px;
  600. color: #333;
  601. margin-bottom: 20px;
  602. border-left: 4px solid #409EFF;
  603. padding-left: 10px;
  604. line-height: 1;
  605. }
  606. /* 表单样式 */
  607. .reward-form {
  608. margin-top: 20px;
  609. }
  610. /* 表单项样式 */
  611. .reward-form .el-form-item {
  612. margin-bottom: 22px;
  613. padding-left: 50px;
  614. }
  615. .reward-form .el-form-item:last-child {
  616. margin-bottom: 0;
  617. }
  618. /* 表单标签样式 */
  619. .reward-form .el-form-item .el-form-item__label {
  620. color: #606266;
  621. }
  622. /* 输入框统一宽度 */
  623. .reward-form .el-form-item .el-input {
  624. width: 300px;
  625. }
  626. /* 必填项星号样式 */
  627. .reward-form .el-form-item.is-required .el-form-item__label:before {
  628. color: #F56C6C;
  629. }
  630. /* 观看时长输入框样式 */
  631. .reward-form .el-form-item .duration-input {
  632. width: 300px;
  633. }
  634. .reward-form .el-form-item .duration-input .el-input__inner {
  635. text-align: left;
  636. }
  637. /* 保存按钮样式 */
  638. .form-actions {
  639. width: 600px;
  640. text-align: center;
  641. margin-top: 30px;
  642. }
  643. .form-actions .el-button {
  644. padding: 8px 20px;
  645. font-size: 13px;
  646. }
  647. </style>