index.vue 19 KB

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