index.vue 17 KB

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