index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. <template>
  2. <div class="m-right-block fr mh576">
  3. <div class="right-block-bd ng-scope" ui-view="myStudyContent" style="position: relative;">
  4. <div class="panel-tit clear">
  5. <p class="fl">推荐课程</p>
  6. </div>
  7. <el-row class="pt-line mt20">
  8. <el-col :span="6" v-for="item in typeList" style="width: 25%;float: left;" :key="item.id" v-if="item.isOpen">
  9. <span :class="{active:item.name==type }" class="nav-btn w220" @click="type=item.name">{{item.name}} </span>
  10. </el-col>
  11. <el-col :span="24" v-if="type=='继续教育' || type=='施工现场专业人员'" class="mt10" >
  12. <p class="tc" style="color: red;font-size: 18px;">
  13. 报名对象为:2020年度及以后由培训单位核发的和2021年度换发的“电子培训合格证”且每年度需参加继续教育人员
  14. </p>
  15. </el-col>
  16. </el-row>
  17. <ul class="m-course-list clear mt10 classlist" v-if="total>0">
  18. <li v-for="(item,index) in list" :key="item.course_id" class="pt-sola mt20 pb10">
  19. <div>
  20. <span v-if="item.isFinish==1" class="p-ico2 ico-passed"></span>
  21. <div class="img">
  22. <img :src="item.tb">
  23. <div class="year-label ng-binding">
  24. <span v-if="item.is_pay==0 && item.buyImg =='' && item.payNo == ''">
  25. 还未购买
  26. </span>
  27. <span v-else-if="item.is_pay==0" style="background-color: orange;">
  28. 等待审核
  29. </span>
  30. <span v-else-if="item.is_pay==2" style="background-color: #78335F;">申请驳回</span>
  31. <span v-else-if="!item.is_pass" style="background-color: blue;padding: 2px;border-radius: 2px;">在学习中</span>
  32. <span v-else style="background-color: green;padding: 2px;border-radius: 2px;">已经完成</span>
  33. </div>
  34. <div class="hover-block">
  35. <div class="mask-bg"></div>
  36. <el-button @click="gotoPlay(item.course_id)" v-if="item.is_pay==1" class="ui-btn">进入学习</el-button>
  37. <el-button @click="goPay(index)" v-else-if="item.is_pay==2 || !!item.buyImg" class="ui-btn btn-o">补充材料</el-button>
  38. <el-button @click="goPay(index)" v-else class="ui-btn btn-o">购买课程</el-button>
  39. </div>
  40. </div>
  41. <div class="tit"><a>{{item.name}}</a></div>
  42. <div class="info">
  43. <p class="w1"><span class="p-ico c1"></span> {{item.type}}</p>
  44. <p class="w2"><span class="p-ico c2"></span>{{item.nd||'2020'}}</p>
  45. <p class="w1">
  46. <span class="p-ico c5"></span> ¥{{item.fee/100}}元
  47. </p>
  48. <p class="w2">
  49. <span class="p-ico c3"></span> {{item.xs/10}}学时
  50. </p>
  51. </div>
  52. </div>
  53. </li>
  54. </ul>
  55. <el-pagination class="m-pages" @current-change="handleCurrentChange" :current-page="page" :page-size="size"
  56. layout="total, prev, pager, next" :total="total">
  57. </el-pagination>
  58. </div>
  59. <el-dialog class="fc tc" :visible.sync="loginDialog" :close-on-click-modal="false" width="500px" @close="loginDialog=false">
  60. <div class="login-dialog m-login">
  61. <un-login @login="login"></un-login>
  62. </div>
  63. </el-dialog>
  64. <el-dialog title="申请开通课程" :visible.sync="buyCourseDialog" :append-to-body="true" width="750px" align="center">
  65. <el-form label-width="80px" label-position="right" :inline="true" :model="buyForm" status-icon :rules="rules" ref="elForm">
  66. <el-row align="left">
  67. <el-col :span="12" class="pl20 pr20">
  68. <el-form-item lable="报考岗位" prop="courseName">
  69. <label slot="label">报考岗位</label>
  70. <el-input v-model="buyForm.courseName" type="text" placeholder="报考岗位" style="width: 220px;"></el-input>
  71. </el-form-item>
  72. </el-col>
  73. <el-col :span="12" class="pl20 pr20">
  74. <el-form-item lable="证书编号" prop="rzCode">
  75. <label slot="label">证书编号</label>
  76. <el-input v-model="buyForm.rzCode" type="text" placeholder="证书编号" style="width: 220px;"></el-input>
  77. </el-form-item>
  78. </el-col>
  79. </el-row>
  80. <el-row>
  81. <el-col :span="24" class="pl20 pr20">
  82. <el-form-item lable="备注信息" prop="marks">
  83. <label slot="label">备注信息</label>
  84. <el-input v-model="buyForm.marks" type="textarea" placeholder="姓名+工种名称,例:张三+土建施工员" style="width: 573px;"></el-input>
  85. </el-form-item>
  86. </el-col>
  87. </el-row>
  88. <el-row>
  89. <h2 class="tc"> 本课程费用:
  90. <strong style="color: red;"> {{buyForm.fee/100}} 元 </strong>
  91. </h2>
  92. <vue-viewer class="preview" width="150" height="150"
  93. :thumb="exampleImg" :full="exampleImg">
  94. </vue-viewer>
  95. </el-row>
  96. <el-row>
  97. <el-form-item>
  98. <img :src="buyForm.buyImg" :onerror="errorImg" class="setting-img" @click="showImg(buyForm.buyImg)">
  99. <do-upload @onFinish="uploadBuyImg" placeholder="上传支付凭证"> </do-upload>
  100. </el-form-item>
  101. </el-row>
  102. <el-row class="tc fc mt20">
  103. <el-form-item >
  104. <el-button @click="buyCourseDialog=false">取 消</el-button>
  105. <el-button @click="buyCourse" type="primary">确 定</el-button>
  106. </el-form-item>
  107. </el-row>
  108. </el-form>
  109. </el-dialog>
  110. <el-dialog title="承诺书" class="fc tc" :visible.sync="commitmentDialog" >
  111. <div>
  112. <div v-if="type=='继续教育'">
  113. <div class="commitment-header"> 致:{{settings.study.username}} </div>
  114. <div class="tl commitment">
  115. {{settings.study.promise}}
  116. </div>
  117. <div class="commitment-footer">
  118. 特此诺书!
  119. </div>
  120. </div>
  121. <div v-else-if="type=='新培'">
  122. <div class="commitment-header"> 致:{{settings.exam.username}} </div>
  123. <div class="tl commitment">
  124. {{settings.exam.promise}}
  125. </div>
  126. </div>
  127. <div class="tl commitment-content mt20 p10">
  128. <el-radio-group v-model="isCommitment">
  129. <el-row class="mt10">
  130. <el-radio :label="true">本人作出上述承诺</el-radio>
  131. </el-row>
  132. <el-row class="mt10">
  133. <el-radio :label="false">本人不作出上述承诺</el-radio>
  134. </el-row>
  135. </el-radio-group>
  136. </div>
  137. <span slot="footer" class="dialog-footer">
  138. <el-button @click="commitmentDialog = false">取 消</el-button>
  139. <el-button type="primary" :disabled="isCommitment?false:true" @click="buyCourseDialog=true">确 定</el-button>
  140. </span>
  141. </div>
  142. </el-dialog>
  143. <el-dialog append-to-body close-on-click-modal :visible.sync="showImgDialog" style="margin-top: 0px;" :width="width">
  144. <img :src="imgUrl" @load="onLoad" alt="" />
  145. </el-dialog>
  146. </div>
  147. </template>
  148. <script>
  149. import {
  150. httpServer
  151. } from "@/components/httpServer/httpServer.js";
  152. import promise from "./promise.js";
  153. import {
  154. MessageBox
  155. } from "element-ui";
  156. import unLogin from "../../login/components/unLogin.vue";
  157. import {
  158. parseTime
  159. } from "@/utils";
  160. import DoUpload from '@/components/upload/index.vue'
  161. import settings from '@/settings.js'
  162. import exampleImg from '@/assets/template.png'
  163. import {mapGetters, mapActions } from "vuex";
  164. export default {
  165. name: "Index",
  166. data() {
  167. return {
  168. page: 1,
  169. size: 9,
  170. total: 0,
  171. stage: 0,
  172. isCompanyPay: 0,
  173. width: "",
  174. type: this.$route.query.type || '',
  175. list: [],
  176. showData: [],
  177. isCommitment: "",
  178. buyCourseDialog: false,
  179. showExample: false,
  180. showImgDialog: false,
  181. exampleImg,
  182. buyForm: {
  183. marks: '',
  184. rzCode: '',
  185. payNo:'',
  186. courseName: ''
  187. },
  188. settings,
  189. promise,
  190. imgUrl: '',
  191. qrcodeUrl: "",
  192. outTradeNo: "",
  193. courseFee: 0,
  194. title: '',
  195. timer: null,
  196. tickCount: 0,
  197. listLoading: false,
  198. loginDialog: false,
  199. isLoginOk: false,
  200. media: {},
  201. commitmentDialog: false,
  202. rules: {
  203. rzCode: [{
  204. required: true,
  205. message: '请输入证书编号'
  206. }],
  207. payNo:[
  208. {
  209. required: true,
  210. message: '请输入订单编号后六位'
  211. }
  212. ],
  213. marks:[
  214. {
  215. required: true,
  216. message: '请输入备注信息'
  217. }
  218. ],
  219. email: [{
  220. required: true,
  221. message: '请输入有效邮箱'
  222. },
  223. {
  224. type: 'string',
  225. message: '邮箱格式不正确',
  226. trigger: 'blur',
  227. transform(value) {
  228. if (!/^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value)) {
  229. return true
  230. } else {}
  231. }
  232. }
  233. ],
  234. courseName: [{
  235. required: true,
  236. message: '请输入报考岗位'
  237. }]
  238. },
  239. errorImg: 'this.src="' + require('../../../assets/images/no-data_hash5abcd2ef62.png') + '"'
  240. };
  241. },
  242. computed: {
  243. ...mapGetters("user", ["typeList", "userInfo"])
  244. },
  245. components: {
  246. unLogin,
  247. DoUpload
  248. },
  249. filters: {
  250. dateFilter(val) {
  251. return parseTime(val, '{y}-{m}-{d}')
  252. }
  253. },
  254. watch: {
  255. type(val) {
  256. this.page = 1
  257. this.getData()
  258. },
  259. isCommitment(val) {
  260. console.log(val)
  261. }
  262. },
  263. beforeMount() {
  264. if (!this.type && this.typeList.length > 0) {
  265. this.type = this.typeList[0].name
  266. this.getData()
  267. }
  268. },
  269. beforeDestroy() {
  270. if (this.timer) window.clearInterval(this.timer);
  271. },
  272. methods: {
  273. showImg(url) {
  274. if (!url) return;
  275. this.imgUrl = url;
  276. this.showImgDialog = true;
  277. },
  278. closeDialog() {
  279. if (this.timer) window.clearInterval(this.timer);
  280. },
  281. onLoad(e) {
  282. const img = e.target;
  283. let width = 0;
  284. if (img.fileSize > 0 || (img.width > 1 && img.height > 1)) {
  285. width = img.width + 40;
  286. }
  287. this.width = width + "px";
  288. },
  289. getData() {
  290. if (!this.type) return;
  291. let param = {
  292. size: this.size,
  293. type: this.type,
  294. from: (this.page - 1) * this.size
  295. }
  296. httpServer("course.getcoursemarket", param).then((res) => {
  297. if (res.code == 200) {
  298. this.list = res.data.list;
  299. this.total = res.data.total;
  300. }
  301. });
  302. },
  303. buyCourse() {
  304. this.$refs["elForm"].validate((valid) => {
  305. if (!valid) return;
  306. let {
  307. marks,
  308. payNo,
  309. course_id,
  310. courseName,
  311. rzCode,
  312. name,
  313. email
  314. } = this.buyForm;
  315. if (courseName != name) {
  316. this.$message.errorMsg("报考岗位有误", 1)
  317. return;
  318. }
  319. let param = {
  320. marks,
  321. payNo,
  322. courseId: course_id,
  323. courseName,
  324. rzCode,
  325. email
  326. }
  327. httpServer("course.buyCourse", param).then((res) => {
  328. if (res.code == 200) {
  329. this.$message.successMsg("申请购买成功", 1);
  330. this.buyForm.temp.buyImg = this.buyForm.buyImg
  331. this.buyForm.temp.marks = this.buyForm.marks
  332. this.buyForm.temp.is_pay = 0
  333. this.buyForm.temp.courseName = this.buyForm.courseName;
  334. this.buyForm.temp.rzCode = this.buyForm.rzCode
  335. this.buyCourseDialog = false
  336. }
  337. });
  338. })
  339. },
  340. gotoDetail(courseId) {
  341. this.$router.push(`/main/course/${courseId}`);
  342. },
  343. uploadBuyImg(url) {
  344. this.buyForm.buyImg = url;
  345. },
  346. goPay(index) {
  347. let item = this.list[index];
  348. this.buyForm = Object.assign({}, item)
  349. this.buyForm.temp = item;
  350. // 绕开检查
  351. this.stage = 2;
  352. this.isCompanyPay = 0;
  353. this.isCommitment=''
  354. this.buyForm.rzCode = item.rzCode;
  355. this.buyForm.courseName = item.courseName;
  356. this.commitmentDialog = true;
  357. // 检查
  358. // httpServer("weixin.docheckpay", {
  359. // courseId: item.course_id
  360. // }).then((res) => {
  361. // if (res.code == 200) {
  362. // this.stage = 2;
  363. // this.isCompanyPay = 0;
  364. // this.isCommitment=''
  365. // this.buyForm.rzCode = res.data.certificateNum;
  366. // this.buyForm.courseName = res.data.positionName;
  367. // this.commitmentDialog = true;
  368. // }
  369. // });
  370. },
  371. gotoPlay(courseId) {
  372. this.$router.push(`/center/class/train`);
  373. },
  374. handleCurrentChange(page) {
  375. this.page = page;
  376. this.getData()
  377. },
  378. login(param) {
  379. httpServer("Auth.LoginStudy", param).then(res => {
  380. if (res.code == 200) {
  381. let {
  382. nickname,
  383. token,
  384. uid
  385. } = res.data;
  386. localStorage.nickname = nickname;
  387. localStorage.token = token;
  388. localStorage.uid = uid
  389. this.user = {
  390. nickname,
  391. token,
  392. uid
  393. };
  394. this.loginOk = true
  395. this.loginDialog = false
  396. }
  397. })
  398. }
  399. },
  400. };
  401. </script>
  402. <style>
  403. @import "../../../assets/css/content.css";
  404. @import "../../../assets/css/course.css";
  405. @import url("./index.css");
  406. .buyForm-title {
  407. width: 90px;
  408. padding: 2px;
  409. text-align: center;
  410. }
  411. .commitment-header {
  412. font-size: 16px;
  413. text-align: left;
  414. }
  415. .commitment {
  416. text-indent: 30px;
  417. margin-top: 20px;
  418. font-size: 16px;
  419. line-height: 200%;
  420. }
  421. .commitment-footer {
  422. margin-top: 30px;
  423. text-indent: 50px;
  424. font-size: 16px;
  425. text-align: left;
  426. }
  427. .commitment-content {
  428. font-size: 16px;
  429. }
  430. </style>