edit.vue 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. <template>
  2. <div class="subPage">
  3. <form class="mainForm">
  4. <ul>
  5. <li class="flex-h">
  6. <span>对应案场:</span>
  7. <div class="flex-item">
  8. <div style="width:50%">
  9. <el-select v-model="CaseId" placeholder="请选择" @change="caseChange">
  10. <el-option
  11. v-for="item in caseList"
  12. :key="item.CaseId"
  13. :label="item.CaseName"
  14. :value="item.CaseId">
  15. </el-option>
  16. </el-select>
  17. </div>
  18. </div>
  19. </li>
  20. <li class="flex-h">
  21. <span>名称:</span>
  22. <div class="flex-item">
  23. <div style="width:50%">
  24. <el-input
  25. placeholder="请输入名称"
  26. v-model="detail.Name"
  27. clearable>
  28. </el-input>
  29. </div>
  30. </div>
  31. </li>
  32. <li class="flex-h">
  33. <span>标题:</span>
  34. <div class="flex-item">
  35. <div style="width:50%">
  36. <el-input
  37. placeholder="请输入标题"
  38. v-model="detail.Title"
  39. clearable>
  40. </el-input>
  41. </div>
  42. </div>
  43. </li>
  44. <li class="flex-h">
  45. <span>图片:</span>
  46. <div class="flex-item">
  47. <!-- <el-upload
  48. action='string'
  49. :http-request="toolClass.upload"
  50. list-type="picture-card"
  51. :limit='limit'
  52. :file-list='imgsArr'
  53. :on-success="handlePictureCardPreview"
  54. :on-remove="handleRemove"
  55. :on-exceed="exceed">
  56. <i class="el-icon-plus"></i>
  57. </el-upload> -->
  58. <!-- 单选 -->
  59. <el-upload
  60. class="avatar-uploader"
  61. action='string'
  62. :http-request="toolClass.upload"
  63. :show-file-list="false"
  64. :on-success="handleImgSuccess">
  65. <img v-if="imgShow" :src="imgShow" class="avatar">
  66. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  67. </el-upload>
  68. </div>
  69. </li>
  70. <li class="flex-h">
  71. <span>详细图片:</span>
  72. <div class="flex-item">
  73. <!-- <el-upload
  74. action='string'
  75. :http-request="toolClass.upload"
  76. list-type="picture-card"
  77. :limit='limit'
  78. :file-list='detailimgsArr'
  79. :on-success="handlePictureCardPreviewDetail"
  80. :on-remove="handleRemoveDetail"
  81. :on-exceed="exceed">
  82. <i class="el-icon-plus"></i>
  83. </el-upload> -->
  84. <!-- 单选 -->
  85. <el-upload
  86. class="avatar-uploader"
  87. action='string'
  88. :http-request="toolClass.upload"
  89. :show-file-list="false"
  90. :on-success="handleDetailImgSuccess">
  91. <img v-if="detailImgShow" :src="detailImgShow" class="avatar">
  92. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  93. </el-upload>
  94. </div>
  95. </li>
  96. <li class="flex-h">
  97. <span>专题简介:</span>
  98. <div class="flex-item">
  99. <div style="width:50%">
  100. <el-input
  101. placeholder="请输入专题简介"
  102. v-model="detail.DetailContent"
  103. type='textarea'
  104. :autosize="{ minRows: 3, maxRows: 5}"
  105. clearable>
  106. </el-input>
  107. </div>
  108. </div>
  109. </li>
  110. <li class="flex-h">
  111. <span>展示课程:</span>
  112. <div class="flex-item">
  113. <div style="width:50%" class="radio">
  114. <el-radio v-model="detail.IsAllCourse" :label='1' >全部课程</el-radio>
  115. <el-radio v-model="detail.IsAllCourse" :label='0' >指定课程</el-radio>
  116. </div>
  117. </div>
  118. </li>
  119. <li class="flex-h" v-if="detail.IsAllCourse === 0">
  120. <el-table
  121. :data="detail.Courses"
  122. stripe
  123. style="width: 100%">
  124. <el-table-column
  125. prop="CourseName"
  126. label="课程名称">
  127. </el-table-column>
  128. <el-table-column
  129. prop="BeginDate"
  130. label="课程开始时间">
  131. <template slot-scope="scope">
  132. <label>{{toolClass.dateFormat(scope.row.BeginDate,'yyyy-MM-dd')}}</label>
  133. </template>
  134. </el-table-column>
  135. <el-table-column
  136. prop="EndDate"
  137. label="课程结束时间">
  138. <template slot-scope="scope">
  139. <label>{{toolClass.dateFormat(scope.row.EndDate,'yyyy-MM-dd')}}</label>
  140. </template>
  141. </el-table-column>
  142. <el-table-column label="操作" width="450">
  143. <template slot-scope="scope">
  144. <el-button
  145. size="mini"
  146. type="danger"
  147. @click="deleteItem(scope.row)">删除</el-button>
  148. </template>
  149. </el-table-column>
  150. </el-table>
  151. <el-button type="primary" size="mini" @click="coursesShow">新增</el-button>
  152. </li>
  153. <li class="flex-h">
  154. <span>是否前台展示:</span>
  155. <div class="flex-item">
  156. <div style="width:50%" class="radio">
  157. <el-radio v-model="detail.Status" :label='1' >是</el-radio>
  158. <el-radio v-model="detail.Status" :label='0' >否</el-radio>
  159. </div>
  160. </div>
  161. </li>
  162. <li style="text-align:center">
  163. <el-button type="primary" size="mini" @click="submit">保存</el-button>
  164. <el-button type="danger" size="mini" @click="cancel">取消</el-button>
  165. </li>
  166. </ul>
  167. </form>
  168. <el-dialog
  169. title="选择课程"
  170. :visible.sync="selCourseVisible"
  171. width="500px"
  172. center>
  173. <div>
  174. <el-table
  175. ref="courseTable"
  176. :data="coursesList"
  177. tooltip-effect="dark"
  178. stripe
  179. @selection-change="handleSelectionChange"
  180. style="width: 100%">
  181. <el-table-column
  182. type="selection"
  183. width="55">
  184. </el-table-column>
  185. <el-table-column
  186. prop="CourseName"
  187. label="课程名称">
  188. </el-table-column>
  189. <el-table-column
  190. prop="BeginDate"
  191. label="课程开始时间">
  192. <template slot-scope="scope">
  193. <label>{{toolClass.dateFormat(scope.row.BeginDate,'yyyy-MM-dd')}}</label>
  194. </template>
  195. </el-table-column>
  196. <el-table-column
  197. prop="EndDate"
  198. label="课程结束时间">
  199. <template slot-scope="scope">
  200. <label>{{toolClass.dateFormat(scope.row.EndDate,'yyyy-MM-dd')}}</label>
  201. </template>
  202. </el-table-column>
  203. </el-table>
  204. </div>
  205. <span slot="footer" class="dialog-footer">
  206. <el-button @click="selCourseVisible = false">取 消</el-button>
  207. <el-button type="primary" @click="addCourseOk">确 定</el-button>
  208. </span>
  209. </el-dialog>
  210. </div>
  211. </template>
  212. <script>
  213. import { createNamespacedHelpers, mapState } from 'vuex'
  214. const { mapState: mapCaseState, mapActions: mapCaseActions } = createNamespacedHelpers('cmscase')
  215. const { mapState: mapCourseState, mapActions: mapCourseActions } = createNamespacedHelpers('course')
  216. export default {
  217. name: '',
  218. data () {
  219. return {
  220. id: '',
  221. limit: 1,
  222. // imgs: null,
  223. // detailimgs: null,
  224. img: '',
  225. detailimg: '',
  226. selCourseVisible: false,
  227. selCourseList: [],
  228. }
  229. },
  230. components: {},
  231. computed: {
  232. ...mapState({
  233. caseList: x => x.app.cases.list,
  234. defaultCaseId: x => x.app.cases.default,
  235. OrgId: x => x.app.user.OrgId
  236. }),
  237. ...mapCaseState({
  238. detail: x => x.caseInfo,
  239. }),
  240. ...mapCourseState({
  241. courses: x => x.courseList,
  242. }),
  243. CaseId: {
  244. get () {
  245. return this.detail.CaseId || this.caseid
  246. },
  247. set (val) {
  248. this.UpdateInfo({ ...this.detail, CaseId: val })
  249. this.getCourse()
  250. }
  251. },
  252. imgShow () {
  253. return this.img || ((this.detail.CmsCaseImgs || []).filter(x => x.ImageType === 'cover')[0] || {}).CaseImageUrl
  254. },
  255. detailImgShow () {
  256. return this.detailimg || ((this.detail.CmsCaseImgs || []).filter(x => x.ImageType === 'detail')[0] || {}).CaseImageUrl
  257. },
  258. coursesList () {
  259. return (this.courses.list || []).map(x => {
  260. return {
  261. CourseId: x.CourseId,
  262. CourseName: x.CourseName,
  263. BeginDate: x.BeginDate,
  264. EndDate: x.BeginDate
  265. }
  266. })
  267. },
  268. },
  269. methods: {
  270. ...mapCaseActions([
  271. 'GetCaseInfo',
  272. 'AddCaseInfo',
  273. 'SetNull',
  274. 'UpdateInfo',
  275. ]),
  276. ...mapCourseActions([
  277. 'GetCourseList',
  278. ]),
  279. caseChange () {
  280. this.selCourseList = []
  281. this.detail.Courses = []
  282. },
  283. submit () {
  284. const courseids = (this.detail.Courses || []).map(x => x.CourseId).join(',')
  285. if (this.id === '') {
  286. this.detail.OrgId = this.OrgId
  287. this.AddCaseInfo({...this.detail, OrgId: this.OrgId, imgs: this.imgShow, detailimgs: this.detailImgShow, courseids}).then(res => {
  288. this.afterSave()
  289. })
  290. } else {
  291. this.AddCaseInfo({...this.detail, imgs: this.imgShow, detailimgs: this.detailImgShow, courseids}).then(res => {
  292. this.afterSave()
  293. })
  294. }
  295. },
  296. afterSave () {
  297. this.$message({
  298. message: '保存成功',
  299. type: 'success',
  300. duration: 1000
  301. })
  302. setTimeout(() => {
  303. this.$router.push({ name: 'indexCase' })
  304. }, 1000)
  305. },
  306. cancel () {
  307. this.$router.go(-1)
  308. },
  309. getDetail () {
  310. this.GetCaseInfo({ id: this.id })
  311. },
  312. getCourse () {
  313. this.GetCourseList({caseid: this.CaseId, page: 1, pagesize: 100, status: 1})
  314. },
  315. toggleSelection (rows) {
  316. if (rows) {
  317. rows.forEach(row => {
  318. this.$refs.courseTable.toggleRowSelection(row)
  319. })
  320. } else {
  321. this.$refs.courseTable.clearSelection()
  322. }
  323. },
  324. addCourse () {
  325. this.GetCourseList({ caseid: this.CaseId, page: 1, pagesize: 100, callback: this.coursesShow })
  326. },
  327. coursesShow () {
  328. this.selCourseList = this.detail.Courses || []
  329. this.selCourseVisible = true
  330. setTimeout(() => {
  331. this.toggleSelection(this.coursesList.filter(x => (this.selCourseList || []).filter(y => y.CourseId === x.CourseId).length > 0))
  332. }, 30)
  333. },
  334. handleSelectionChange (val) {
  335. this.selCourseList = val
  336. },
  337. addCourseOk () {
  338. this.UpdateInfo({ ...this.detail, Courses: this.selCourseList })
  339. this.selCourseVisible = false
  340. },
  341. deleteItem (row) {
  342. this.UpdateInfo({ ...this.detail, Courses: this.detail.Courses.filter(x => x.CourseId !== row.CourseId) })
  343. },
  344. handleImgSuccess (res, file) {
  345. this.img = res.result.url
  346. },
  347. handleDetailImgSuccess (res, file) {
  348. this.detailimg = res.result.url
  349. }
  350. },
  351. mounted () {
  352. this.getCourse()
  353. const { id } = this.$route.query
  354. this.id = id
  355. if (id && id !== '') {
  356. this.getDetail()
  357. } else {
  358. this.SetNull()
  359. }
  360. }
  361. }
  362. </script>
  363. <!-- Add "scoped" attribute to limit CSS to this component only -->
  364. <style lang="scss" scoped>
  365. </style>