create.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. <template>
  2. <div class="create-consult-wrapper">
  3. <div class="create-consult-title">创建话题</div>
  4. <div class="form-wrapper">
  5. <!-- 标题 -->
  6. <div class="title-field">
  7. <div class="field-name"><span class="required">*</span> 话题标题</div>
  8. <el-input
  9. class="title-input"
  10. v-model="title"
  11. placeholder="请输入话题"></el-input>
  12. </div>
  13. <!-- 描述 -->
  14. <div class="content-field">
  15. <div class="content-field-name">
  16. <div><span class="required">*</span> 话题描述</div>
  17. <a class="example" :href="`/c/${exampleUid}?from=example`" target="_blank">查看示例</a>
  18. </div>
  19. <el-input
  20. class="content-input"
  21. type="textarea"
  22. :rows="8"
  23. :autosize="{ minRows: 8 }"
  24. placeholder="请输入话题描述"
  25. v-model="content"></el-input>
  26. </div>
  27. <!-- 价格、分类 -->
  28. <div class="price-field">
  29. <div class="price-wrapper">
  30. <div class="field-name"><span class="required">*</span> 话题价格</div>
  31. <el-input
  32. class="price-input"
  33. type="number"
  34. placeholder="请输入价格"
  35. v-model="price"></el-input>
  36. <span class="append">元</span>
  37. </div>
  38. <div class="cate-wrapper">
  39. <div class="field-name"><span class="required">*</span> 话题类别</div>
  40. <el-cascader
  41. class="cate-cascader"
  42. v-model="selectedConsultCate"
  43. :options="consultCate"
  44. :props="{ expandTrigger: 'hover' }"
  45. placeholder="请选择类别"></el-cascader>
  46. </div>
  47. </div>
  48. <!-- 咨询时间 -->
  49. <div class="week-field">
  50. <div class="week-field-name"><span class="required">*</span> 咨询时间:</div>
  51. <el-radio-group class="week-checkbox" v-model="week">
  52. <el-radio-button label="0">周一</el-radio-button>
  53. <el-radio-button label="1">周二</el-radio-button>
  54. <el-radio-button label="2">周三</el-radio-button>
  55. <el-radio-button label="3">周四</el-radio-button>
  56. <el-radio-button label="4">周五</el-radio-button>
  57. <el-radio-button label="5">周六</el-radio-button>
  58. <el-radio-button label="6">周日</el-radio-button>
  59. </el-radio-group>
  60. </div>
  61. <!-- 开放时间 -->
  62. <div class="time-field">
  63. <div class="time-field-name"><span class="required">*</span> 开放时间:</div>
  64. <div class="time-field-content">
  65. <div class="time-field-cards">
  66. <div
  67. class="time-card"
  68. v-for="(item, index) in savedTime"
  69. :key="`time-card-${index}`">
  70. <div class="time-card-title">
  71. <div>{{ item.week }}</div>
  72. <img
  73. src="@/assets/img/consult/close-icon@2x.png"
  74. @click="handleDeleteSavedTime(index)"
  75. class="close-icon"
  76. alt="">
  77. </div>
  78. <div class="time-card-time">{{ item.showTime }}</div>
  79. </div>
  80. </div>
  81. <div
  82. class="time-item"
  83. v-for="(item, index) in time"
  84. :key="index"
  85. v-show="week == index">
  86. <el-time-select
  87. placeholder="起始时间"
  88. style="width: 200px;"
  89. :class="{ 'is-error': item.sError }"
  90. value-format="HH:mm"
  91. :editable="false"
  92. v-model="item.stime"
  93. :picker-options="{
  94. start: '00:00',
  95. end: '22:00',
  96. step: '00:30'
  97. }">
  98. </el-time-select>
  99. <el-time-select
  100. placeholder="结束时间"
  101. style="width: 200px;"
  102. :class="{ 'is-error': item.eError }"
  103. value-format="HH:mm"
  104. :editable="false"
  105. v-model="item.etime"
  106. :picker-options="{
  107. start: '00:00',
  108. end: '24:00',
  109. step: '00:30',
  110. minTime: minEtime[index]
  111. }">
  112. </el-time-select>
  113. <el-button
  114. class="time-save-btn"
  115. type="text"
  116. @click="handleSaveTime(index)">保存</el-button>
  117. </div>
  118. <div
  119. class="time-error"
  120. v-for="(item, index) in time"
  121. :key="`error-${index}`"
  122. v-show="week == index && item.error.length">
  123. {{ item.error }}
  124. </div>
  125. </div>
  126. </div>
  127. <!-- 图片 -->
  128. <div class="image-field">
  129. <div class="field-name"><span class="required">*</span> 话题介绍图</div>
  130. <multi-uploader
  131. class="consult-image-uploader"
  132. :showTips="false"
  133. :limit="1"
  134. v-model="imageList"></multi-uploader>
  135. <div class="upload-tips">请上传话题介绍图,至多一张
  136. 建议比例16:9(如:1920*1080、800*450)支持J(E)PG、PNG格式,小于5MB
  137. </div>
  138. </div>
  139. <!-- 按钮 -->
  140. <div class="actions-wrapper">
  141. <el-button
  142. class="create-btn"
  143. :loading="publishIsLoading"
  144. :disabled="pcreateIsLoading"
  145. @click="handleCreate">提交审核</el-button>
  146. <el-button
  147. class="pcreate-btn"
  148. :loading="pcreateIsLoading"
  149. :disabled="publishIsLoading"
  150. @click="handlePcreate">存草稿</el-button>
  151. </div>
  152. </div>
  153. </div>
  154. </template>
  155. <script>
  156. import { mapState } from "vuex";
  157. import editor from "@/components/editor";
  158. import multiUploader from '@/components/multi-uploader';
  159. export default {
  160. head: {
  161. title: '新建咨询服务'
  162. },
  163. components: {
  164. editor,
  165. multiUploader
  166. },
  167. data () {
  168. return {
  169. sale_id: '', // 编辑时的 id
  170. title: '', // 标题
  171. selectedConsultCate: [], // 选中的技能分类
  172. consultCate: [], // 技能分类数据源
  173. content: '', // 话题描述
  174. contentText: '', // 话题描述文字
  175. defaultContent: '', // 默认的话题描述
  176. price: '', // 价格
  177. week: '0', // 当前接受咨询的星期几
  178. time: [ // 接受咨询的时间范围
  179. { stime: '', etime: '', sError: false, eError: false, error: '' },
  180. { stime: '', etime: '', sError: false, eError: false, error: '' },
  181. { stime: '', etime: '', sError: false, eError: false, error: '' },
  182. { stime: '', etime: '', sError: false, eError: false, error: '' },
  183. { stime: '', etime: '', sError: false, eError: false, error: '' },
  184. { stime: '', etime: '', sError: false, eError: false, error: '' },
  185. { stime: '', etime: '', sError: false, eError: false, error: '' }
  186. ],
  187. savedTime: [],
  188. // savedTime: {
  189. // monday: [{ stime: '00:00', etime: '00:00', week: '', showTime: '', isShow: false }],
  190. // tuesday: [{ stime: '00:00', etime: '00:00', week: '', showTime: '', isShow: false }],
  191. // wednesday: [{ stime: '00:00', etime: '00:00', week: '', showTime: '', isShow: false }],
  192. // thursday: [{ stime: '00:00', etime: '00:00', week: '', showTime: '', isShow: false }],
  193. // friday: [{ stime: '00:00', etime: '00:00', week: '', showTime: '', isShow: false }],
  194. // saturday: [{ stime: '00:00', etime: '00:00', week: '', showTime: '', isShow: false }],
  195. // sunday: [{ stime: '00:00', etime: '00:00', week: '', showTime: '', isShow: false }]
  196. // },
  197. imageList: [], // 用户上传的图片
  198. publishIsLoading: false,
  199. pcreateIsLoading: false
  200. }
  201. },
  202. computed: {
  203. // 接受咨询的时间范围
  204. minEtime () {
  205. let minEtime = []
  206. this.time.forEach(item => {
  207. if (item.stime) {
  208. let res = item.stime.split(':')
  209. if (res.length && res.length === 2) {
  210. let eHour = Number(res[0])
  211. let eMin = Number(res[1])
  212. if (eMin == 0) {
  213. eHour += 0
  214. eMin = 29
  215. } else {
  216. eHour += 0
  217. eMin = 59
  218. }
  219. if (eHour < 10) {
  220. eHour = "0" + eHour
  221. }
  222. minEtime.push(`${eHour}:${eMin}`)
  223. } else {
  224. minEtime.push('00:00')
  225. }
  226. } else {
  227. minEtime.push('00:00')
  228. }
  229. })
  230. return minEtime
  231. },
  232. // 查看示例 uid
  233. exampleUid () {
  234. let uid = ''
  235. if (process.env.NODE_ENV == "development") {
  236. uid = '680581'
  237. } else {
  238. uid = '583073'
  239. }
  240. return uid
  241. }
  242. },
  243. mounted () {
  244. this.needLogin()
  245. this._getConsultCate()
  246. this.sale_id = this.$route.query.sale_id || ''
  247. if (this.sale_id) {
  248. this._getConsultDetail()
  249. }
  250. },
  251. methods: {
  252. /** 获取咨询分类 */
  253. _getConsultCate () {
  254. this.$axios.$post('/api/sale/cateListYes', { type: 3, point: 1 }).then(res => {
  255. if (res.status === 1) {
  256. let consultCate = res.data || []
  257. this.consultCate = consultCate.map(item => {
  258. let children = item.child_list.map(child => {
  259. return {
  260. value: child.category_id,
  261. label: child.name
  262. }
  263. })
  264. return {
  265. value: item.category_id,
  266. label: item.name,
  267. children: children
  268. }
  269. })
  270. }
  271. }).catch(err => {
  272. console.log('get consult cate error: ', err)
  273. })
  274. },
  275. /** 获取咨询服务详情 */
  276. _getConsultDetail () {
  277. const self = this
  278. this.$axios.$post('/api/sale/saleInfo', { sale_id: this.sale_id }).then(res => {
  279. if (res.status === 1) {
  280. console.log('获取技能详情成功', res.data)
  281. self.title = res.data.title || ""
  282. self.price = res.data.price || ""
  283. self.content = res.data.content || self.defaultContent
  284. if (res.data.cate_id_one && res.data.cate_id_two) {
  285. self.selectedConsultCate = [res.data.cate_id_one, res.data.cate_id_two]
  286. }
  287. if (res.data.image) {
  288. self._setConsultImages(res.data)
  289. }
  290. let time = [
  291. { stime: '', etime: '', sError: false, eError: false, error: '' },
  292. { stime: '', etime: '', sError: false, eError: false, error: '' },
  293. { stime: '', etime: '', sError: false, eError: false, error: '' },
  294. { stime: '', etime: '', sError: false, eError: false, error: '' },
  295. { stime: '', etime: '', sError: false, eError: false, error: '' },
  296. { stime: '', etime: '', sError: false, eError: false, error: '' },
  297. { stime: '', etime: '', sError: false, eError: false, error: '' }
  298. ]
  299. let timeJson = JSON.parse(res.data.time_json || '')
  300. for (let key in timeJson) {
  301. let times = timeJson[key][0]
  302. // console.log(key, times)
  303. if (!(times.stime == '00:00' && times.etime == '00:00')) {
  304. // console.log(key, times)
  305. let timeItem = {
  306. stime: times.stime,
  307. etime: times.etime,
  308. sError: false,
  309. eError: false,
  310. error: ''
  311. }
  312. let savedTimeItem = {
  313. key: key,
  314. stime: times.stime,
  315. etime: times.etime,
  316. week: '',
  317. showTime: `${times.stime}~${times.etime}`
  318. }
  319. if (key == 'monday') {
  320. time[0] = timeItem
  321. savedTimeItem.week = '周一'
  322. this.savedTime.push(savedTimeItem)
  323. } else if (key == 'tuesday') {
  324. time[1] = timeItem
  325. savedTimeItem.week = '周二'
  326. this.savedTime.push(savedTimeItem)
  327. } else if (key == 'wednesday') {
  328. time[2] = timeItem
  329. savedTimeItem.week = '周三'
  330. this.savedTime.push(savedTimeItem)
  331. } else if (key == 'thursday') {
  332. time[3] = timeItem
  333. savedTimeItem.week = '周四'
  334. this.savedTime.push(savedTimeItem)
  335. } else if (key == 'friday') {
  336. time[4] = timeItem
  337. savedTimeItem.week = '周五'
  338. this.savedTime.push(savedTimeItem)
  339. } else if (key == 'saturday') {
  340. time[5] = timeItem
  341. savedTimeItem.week = '周六'
  342. this.savedTime.push(savedTimeItem)
  343. } else if (key == 'sunday') {
  344. time[6] = timeItem
  345. savedTimeItem.week = '周日'
  346. this.savedTime.push(savedTimeItem)
  347. }
  348. }
  349. }
  350. this.time = time
  351. }
  352. })
  353. },
  354. /** 编辑时初始化图片列表 */
  355. _setConsultImages (data) {
  356. let images = data.image.split(',')
  357. if (images && images.length > 0) {
  358. images.forEach((image, index) => {
  359. let imageName = this._getImageName(image);
  360. console.log("imageName", imageName);
  361. this.imageList.push({ name: imageName + index, url: image });
  362. })
  363. }
  364. },
  365. /** 通过 image url 获取名字 */
  366. _getImageName (url) {
  367. if (url) {
  368. try {
  369. const lastquotaIndex = url.lastIndexOf("/");
  370. const lastDotIndex = url.lastIndexOf('.');
  371. return url.substring(lastquotaIndex + 1, lastDotIndex);
  372. } catch (e) {
  373. console.log(e);
  374. }
  375. }
  376. return ""
  377. },
  378. /** 创建、编辑咨询服务 */
  379. _publishConsultData (actType) {
  380. const self = this
  381. let timeJson = {
  382. monday: [{ stime: '00:00', etime: '00:00' }],
  383. tuesday: [{ stime: '00:00', etime: '00:00' }],
  384. wednesday: [{ stime: '00:00', etime: '00:00' }],
  385. thursday: [{ stime: '00:00', etime: '00:00' }],
  386. friday: [{ stime: '00:00', etime: '00:00' }],
  387. saturday: [{ stime: '00:00', etime: '00:00' }],
  388. sunday: [{ stime: '00:00', etime: '00:00' }]
  389. }
  390. this.savedTime.forEach((item) => {
  391. if (item.key === 'monday') {
  392. timeJson.monday = [{ stime: item.stime, etime: item.etime }]
  393. } else if (item.key === 'tuesday') {
  394. timeJson.tuesday = [{ stime: item.stime, etime: item.etime }]
  395. } else if (item.key === 'wednesday') {
  396. timeJson.wednesday = [{ stime: item.stime, etime: item.etime }]
  397. } else if (item.key === 'thursday') {
  398. timeJson.thursday = [{ stime: item.stime, etime: item.etime }]
  399. } else if (item.key === 'friday') {
  400. timeJson.friday = [{ stime: item.stime, etime: item.etime }]
  401. } else if (item.key === 'saturday') {
  402. timeJson.saturday = [{ stime: item.stime, etime: item.etime }]
  403. } else if (item.key === 'sunday') {
  404. timeJson.sunday = [{ stime: item.stime, etime: item.etime }]
  405. }
  406. })
  407. // this.time.forEach((item, index) => {
  408. // if (item.stime && item.etime) {
  409. // if (index == 0) {
  410. // timeJson.monday = [{ stime: item.stime, etime: item.etime }]
  411. // } else if (index == 1) {
  412. // timeJson.tuesday = [{ stime: item.stime, etime: item.etime }]
  413. // } else if (index == 2) {
  414. // timeJson.wednesday = [{ stime: item.stime, etime: item.etime }]
  415. // } else if (index == 3) {
  416. // timeJson.thursday = [{ stime: item.stime, etime: item.etime }]
  417. // } else if (index == 4) {
  418. // timeJson.friday = [{ stime: item.stime, etime: item.etime }]
  419. // } else if (index == 5) {
  420. // timeJson.saturday = [{ stime: item.stime, etime: item.etime }]
  421. // } else if (index == 6) {
  422. // timeJson.sunday = [{ stime: item.stime, etime: item.etime }]
  423. // }
  424. // }
  425. // })
  426. const data = {
  427. title: this.title,
  428. price: this.price,
  429. content: this.content,
  430. img: this.imageList.map((it) => it.url).join(","),
  431. type: 2,
  432. cate_id_one: this.selectedConsultCate[0],
  433. cate_id_two: this.selectedConsultCate[1],
  434. act: actType,
  435. sale_id: this.sale_id || '',
  436. time_json: JSON.stringify(timeJson)
  437. }
  438. if (actType === 'pcreate') {
  439. this.pcreateIsLoading = true
  440. } else {
  441. this.publishIsLoading = true
  442. }
  443. this.$axios.$post('/api/sale/create', data).then(res => {
  444. if (res.status === 1) {
  445. // self.$message.success(`${self.sale_id ? '编辑' : '创建'}技能成功!`)
  446. if (actType === 'pcreate') {
  447. self.$message.success('保存草稿成功')
  448. } else {
  449. self.$message.success('您已成功提交咨询服务审核,平台将在1-3个工作日内完成审核,并通过短信、邮件通知您')
  450. }
  451. setTimeout(() => {
  452. window.location.href = '/workbench/consult/index'
  453. }, 1200)
  454. } else {
  455. console.error('保存失败')
  456. // self.$message.error('保存失败')
  457. }
  458. }).then(() => {
  459. setTimeout(() => {
  460. self.pcreateIsLoading = false
  461. self.publishIsLoading = false
  462. }, 800)
  463. })
  464. },
  465. /** 验证提交的数据 */
  466. _validateConsultData () {
  467. if (this.title === '') {
  468. this.$message.error('请输入话题标题')
  469. return false
  470. }
  471. if (this.title.length < 5) {
  472. this.$message.error('话题标题不可少于5字符')
  473. return false
  474. }
  475. if (this.title.length > 30) {
  476. this.$message.error('话题标题不可超过50字符,请删减')
  477. return false
  478. }
  479. if (this.content.length < 50) {
  480. this.$message.error('话题描述不可少于50字符')
  481. return false
  482. }
  483. if (this.content.length > 5000) {
  484. this.$message.error('话题描述不可超过5000字符,请删减')
  485. return false
  486. }
  487. if (this.price < 1 || this.price > 100000) {
  488. this.$message.error('请输入1-100000元的整数价格')
  489. return false
  490. }
  491. if (String(this.price).indexOf('.') > -1) {
  492. if (parseInt(this.price) != Number(this.price)) {
  493. this.$message.error('价格只能为整数')
  494. return false
  495. }
  496. }
  497. if (this.selectedConsultCate.length !== 2 ||
  498. (!this.selectedConsultCate[0] || !this.selectedConsultCate[1])) {
  499. this.$message.error('请选择话题类别')
  500. return false
  501. }
  502. // 开放时间的校验逻辑放到保存时间时了
  503. if (this.savedTime.length === 0) {
  504. this.$message.error('请至少选择并保存一天开放时间')
  505. return false
  506. }
  507. // 校验开放时间:结束时间 - 起始时间 > 两小时 || 起始、结束时间均为空
  508. // let validateTimeResult = ''
  509. // let emptyCount = 0
  510. // let week = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  511. // for (let i = 0; i < this.time.length; i++) {
  512. // if (this.time[i].stime == '00:00' && this.time[i].etime == '00:00') {
  513. // // 均为 0
  514. // emptyCount++
  515. // continue
  516. // } else if (!this.time[i].stime && !this.time[i].etime) {
  517. // // 均为空
  518. // emptyCount++
  519. // continue
  520. // } else if ((this.time[i].stime && !this.time[i].etime) ||
  521. // (!this.time[i].stime && this.time[i].etime)) {
  522. // validateTimeResult = `请补充完成${week[i]}的开放时间`
  523. // break
  524. // } else if (this.time[i].stime && this.time[i].stime.indexOf(':') > -1 &&
  525. // this.time[i].etime && this.time[i].etime.indexOf(':') > -1) {
  526. // let stime = this.time[i].stime.split(':')
  527. // let etime = this.time[i].etime.split(':')
  528. // let sHour = Number(stime[0]) || 0
  529. // let sMin = Number(stime[1]) || 0
  530. // let eHour = Number(etime[0]) || 0
  531. // let eMin = Number(etime[1]) || 0
  532. // if (sMin == eMin) {
  533. // if (eHour <= sHour) {
  534. // validateTimeResult = `${week[i]}的结束时间应大于起始时间`
  535. // break
  536. // }
  537. // } else if (sMin > eMin) {
  538. // // sMin: 30,eMin: 0;
  539. // if (eHour < sHour + 1) {
  540. // validateTimeResult = `${week[i]}的结束时间应大于起始时间`
  541. // break
  542. // }
  543. // } else {
  544. // // sMin: 0,eMin: 30;
  545. // if (eHour < sHour) {
  546. // validateTimeResult = `${week[i]}的结束时间应大于起始时间`
  547. // break
  548. // }
  549. // }
  550. // }
  551. // }
  552. // if (validateTimeResult != '') {
  553. // this.$message.error(validateTimeResult)
  554. // return false
  555. // }
  556. // if (emptyCount == 7) {
  557. // this.$message.error('请至少选择一天开放时间')
  558. // return false
  559. // }
  560. if (!this.imageList.length) {
  561. this.$message.error('请上传话题介绍图')
  562. return false
  563. }
  564. return true
  565. },
  566. /** 技能描述内容改变时 */
  567. handleChange (val) {
  568. this.content = val
  569. },
  570. /** 技能描述内容改变时,获取输入的 text */
  571. handleChangeText (val) {
  572. this.contentText = val
  573. },
  574. /** 点击提交审核时 */
  575. handleCreate () {
  576. if (this._validateConsultData()) {
  577. this._publishConsultData(this.sale_id ? 'update' : 'create')
  578. }
  579. },
  580. /** 点击存草稿时 */
  581. handlePcreate () {
  582. if (this._validateConsultData()) {
  583. this._publishConsultData('pcreate')
  584. }
  585. },
  586. /** 点击保存时间时 */
  587. handleSaveTime (index) {
  588. this.time[index].sError = false
  589. this.time[index].eError = false
  590. this.time[index].error = ''
  591. if (!this.time[index].stime && !this.time[index].etime) {
  592. // 均为空
  593. this.time[index].sError = true
  594. this.time[index].eError = true
  595. this.time[index].error = '请设置开放时间'
  596. return
  597. }
  598. if (!this.time[index].stime) {
  599. // 起始时间为空
  600. this.time[index].sError = true
  601. this.time[index].error = '请设置起始时间'
  602. return
  603. }
  604. if (!this.time[index].etime) {
  605. // 结束时间为空
  606. this.time[index].eError = true
  607. this.time[index].error = '请设置结束时间'
  608. return
  609. }
  610. let week = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  611. let weekEn = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
  612. let stime = this.time[index].stime.split(':')
  613. let etime = this.time[index].etime.split(':')
  614. let sHour = Number(stime[0]) || 0
  615. let sMin = Number(stime[1]) || 0
  616. let eHour = Number(etime[0]) || 0
  617. let eMin = Number(etime[1]) || 0
  618. if (sMin == eMin) {
  619. if (eHour <= sHour) {
  620. this.time[index].eError = true
  621. this.time[index].error = '结束时间应大于起始时间'
  622. return
  623. }
  624. } else if (sMin > eMin) {
  625. // sMin: 30,eMin: 0;
  626. if (eHour < sHour + 1) {
  627. this.time[index].eError = true
  628. this.time[index].error = '结束时间应大于起始时间'
  629. return
  630. }
  631. } else {
  632. // sMin: 0,eMin: 30;
  633. if (eHour < sHour) {
  634. this.time[index].eError = true
  635. this.time[index].error = '结束时间应大于起始时间'
  636. return
  637. }
  638. }
  639. // 校验成功,保存数据
  640. let savedTimeItem = {
  641. key: weekEn[index],
  642. stime: this.time[index].stime,
  643. etime: this.time[index].etime,
  644. week: week[index],
  645. showTime: `${this.time[index].stime}~${this.time[index].etime}`
  646. }
  647. let timeItemIndex = -1
  648. this.savedTime.forEach((item, itemIndex) => {
  649. if (item.key == savedTimeItem.key) {
  650. timeItemIndex = itemIndex
  651. }
  652. })
  653. if (timeItemIndex > -1) {
  654. this.savedTime.splice(timeItemIndex, 1, savedTimeItem)
  655. } else {
  656. this.savedTime.push(savedTimeItem)
  657. }
  658. // if (index === 0) {
  659. // this.savedTime.monday.splice(0, 1, savedTimeItem)
  660. // } else if (index === 1) {
  661. // this.savedTime.tuesday.splice(0, 1, savedTimeItem)
  662. // } else if (index === 2) {
  663. // this.savedTime.wednesday.splice(0, 1, savedTimeItem)
  664. // } else if (index === 3) {
  665. // this.savedTime.thursday.splice(0, 1, savedTimeItem)
  666. // } else if (index === 4) {
  667. // this.savedTime.friday.splice(0, 1, savedTimeItem)
  668. // } else if (index === 5) {
  669. // this.savedTime.saturday.splice(0, 1, savedTimeItem)
  670. // } else if (index === 6) {
  671. // this.savedTime.sunday.splice(0, 1, savedTimeItem)
  672. // }
  673. },
  674. /** 删除时间卡片 */
  675. handleDeleteSavedTime (index) {
  676. this.savedTime.splice(index, 1)
  677. this.time.splice(index, 1, { stime: '', etime: '', sError: false, eError: false, error: '' })
  678. }
  679. }
  680. }
  681. </script>
  682. <style scope lang="scss">
  683. @import "@/assets/css/consult/create.scss";
  684. </style>
  685. <style>
  686. input::-webkit-outer-spin-button,
  687. input::-webkit-inner-spin-button {
  688. -webkit-appearance: none !important;
  689. }
  690. input[type="number"]{
  691. -moz-appearance: textfield !important;
  692. }
  693. </style>
  694. <style lang="scss">
  695. // 编辑器样式
  696. .content-editor {
  697. .my-editor {
  698. .ql-snow {
  699. border: 1px solid #d7dfe8 !important;
  700. border-radius: 3px 3px 0 0 !important;
  701. }
  702. .quill-editor {
  703. border-width: 1px !important;
  704. border-top: 0 !important;
  705. border-color: #d7dfe8 !important;
  706. border-radius: 0 0 3px 3px !important;
  707. }
  708. }
  709. }
  710. // 图片上传器样式
  711. .consult-image-uploader {
  712. .el-upload-list__item {
  713. width: 300px !important;
  714. height: 168.75px !important;
  715. line-height: 168.75px !important;
  716. }
  717. .el-upload--picture-card {
  718. width: 300px !important;
  719. height: 168.75px !important;
  720. line-height: 168.75px !important;
  721. .el-upload-list__item-thumbnail {
  722. object-fit: scale-down !important;
  723. }
  724. }
  725. .el-upload-list--picture-card {
  726. .el-upload-list__item-thumbnail {
  727. object-fit: scale-down !important;
  728. }
  729. }
  730. }
  731. </style>