index.vue 16 KB

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