index.vue 21 KB

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