Your Name hai 1 ano
achega
8fe611fe2a
Modificáronse 62 ficheiros con 23003 adicións e 0 borrados
  1. 11 0
      .gitignore
  2. 2 0
      .vscode/settings.json
  3. 29 0
      README.md
  4. 5 0
      babel.config.js
  5. 15169 0
      package-lock.json
  6. 72 0
      package.json
  7. BIN=BIN
      public/favicon.ico
  8. 17 0
      public/index.html
  9. 12 0
      src/App.vue
  10. 312 0
      src/api.js
  11. BIN=BIN
      src/assets/bg.png
  12. BIN=BIN
      src/assets/logo.png
  13. 247 0
      src/components/ClassUser.vue
  14. 80 0
      src/components/MulSubject.vue
  15. 49 0
      src/components/Page.vue
  16. 95 0
      src/components/Subject.vue
  17. 45 0
      src/components/SubjectTree.vue
  18. 145 0
      src/components/fuEditor/index.vue
  19. BIN=BIN
      src/images/curstom.png
  20. BIN=BIN
      src/images/logo.png
  21. BIN=BIN
      src/images/msg.png
  22. BIN=BIN
      src/images/ysjt.png
  23. BIN=BIN
      src/images/个人中心@2x.png
  24. BIN=BIN
      src/images/系统设置@2x.png
  25. 25 0
      src/main.js
  26. 199 0
      src/router.js
  27. 16 0
      src/store.js
  28. 25 0
      src/style/_base.scss
  29. 6 0
      src/style/_style.scss
  30. 269 0
      src/style/home.scss
  31. 34 0
      src/style/login.scss
  32. 5 0
      src/views/About.vue
  33. 146 0
      src/views/Home.vue
  34. 112 0
      src/views/Index.vue
  35. 143 0
      src/views/Login.vue
  36. 876 0
      src/views/apply/Change.vue
  37. 248 0
      src/views/apply/Detail.vue
  38. 208 0
      src/views/apply/Edit.vue
  39. 873 0
      src/views/apply/New.vue
  40. 876 0
      src/views/apply/Update.vue
  41. 140 0
      src/views/classes/Add.vue
  42. 226 0
      src/views/classes/Index.vue
  43. 115 0
      src/views/content/Article.vue
  44. 91 0
      src/views/content/Index.vue
  45. 258 0
      src/views/content/addArticle.vue
  46. 80 0
      src/views/content/addContent.vue
  47. 115 0
      src/views/docs/Add.vue
  48. 127 0
      src/views/docs/Index.vue
  49. 15 0
      src/views/online/Test.vue
  50. 15 0
      src/views/online/Video.vue
  51. 76 0
      src/views/paper/Detail.vue
  52. 169 0
      src/views/paper/Index.vue
  53. 303 0
      src/views/project/Index.vue
  54. 112 0
      src/views/system/AddAccount.vue
  55. 113 0
      src/views/system/Index.vue
  56. 77 0
      src/views/system/ResetPwd.vue
  57. 60 0
      src/views/user/Add.vue
  58. 137 0
      src/views/user/Detail.vue
  59. 140 0
      src/views/user/Index.vue
  60. 136 0
      src/views/videos/Add.vue
  61. 136 0
      src/views/videos/Index.vue
  62. 11 0
      vue.config.js

+ 11 - 0
.gitignore

@@ -0,0 +1,11 @@
+*.pyc
+*.bak
+.DS_Store
+
+dist/
+node_modules/
+npm-debug.log
+.editorconfig
+
+.idea/
+

+ 2 - 0
.vscode/settings.json

@@ -0,0 +1,2 @@
+{
+}

+ 29 - 0
README.md

@@ -0,0 +1,29 @@
+# admin
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your tests
+```
+npm run test
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/app'
+  ]
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 15169 - 0
package-lock.json


+ 72 - 0
package.json

@@ -0,0 +1,72 @@
+{
+  "name": "admin",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve --open",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "ali-oss": "^6.2.1",
+    "cos-js-sdk-v5": "^0.5.20",
+    "echarts": "^4.6.0",
+    "el-cascader-multi": "^1.1.8",
+    "element-ui": "^2.7.2",
+    "font-awesome": "^4.7.0",
+    "js-base64": "^2.5.2",
+    "qrcode.vue": "^1.7.0",
+    "url-search-params-polyfill": "^8.0.0",
+    "vue": "^2.6.6",
+    "vue-baidu-map": "^0.21.22",
+    "vue-router": "^3.0.1",
+    "vuex": "^3.0.1",
+    "wangeditor": "^3.1.1"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.1.0",
+    "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
+    "@babel/plugin-transform-runtime": "^7.1.0",
+    "@babel/preset-env": "^7.1.0",
+    "@babel/preset-react": "^7.0.0",
+    "@vue/cli-plugin-babel": "^3.5.0",
+    "@vue/cli-plugin-eslint": "^3.5.0",
+    "@vue/cli-service": "^3.5.0",
+    "axios": "^0.18.0",
+    "babel-loader": "^8.0.2",
+    "babel-polyfill": "^6.26.0",
+    "es6-promise": "^4.2.8",
+    "eslint": "^5.8.0",
+    "eslint-plugin-vue": "^5.0.0",
+    "node-sass": "^4.11.0",
+    "sass-loader": "^7.1.0",
+    "vue-cropper": "^0.4.9",
+    "vue-template-compiler": "^2.5.21"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "eslint:recommended"
+    ],
+    "rules": {
+      "no-console": "off"
+    },
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "postcss": {
+    "plugins": {
+      "autoprefixer": {}
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

BIN=BIN
public/favicon.ico


+ 17 - 0
public/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title>admin</title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but admin doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 12 - 0
src/App.vue

@@ -0,0 +1,12 @@
+<template>
+  <div id="app">
+    <transition name="fade"
+		            mode="out-in">
+			<router-view></router-view>
+		</transition>
+  </div>
+</template>
+
+<style lang='scss'>
+
+</style>

+ 312 - 0
src/api.js

@@ -0,0 +1,312 @@
+import axios from 'axios';
+// var baseURL='https://www.scxjc.club'
+var baseURL = ''
+// axios.defaults.headers.get['Content-Type']='application/json;charset=utf-8';
+axios.interceptors.request.use(
+	config => {
+		// const token = localStorage.getItem('token');
+		// if (config.url.indexOf('downloadzip') >= 0) {
+		// 	if (token) { // 判断是否存在token,如果存在的话,则每个http header都加上token                      
+		// 		config.headers.Authorization = `jwt ${token}`;   
+		// 	} else {
+		// 		//未登录
+		// 		window.location.hash = "/login";
+		// 	}
+		// } 
+		return config;
+	},
+	err => {
+		return Promise.reject(err);
+	});
+axios.interceptors.response.use(function (response) {
+	// IE 8-9 
+	if (response.data == null && response.config.responseType === 'json' && response.request.responseText != null) {
+		try {
+			// eslint-disable-next-line no-param-reassign
+			response.data = JSON.parse(response.request.responseText);
+		} catch (e) {
+			// ignored
+		}
+	}
+	// 对响应数据做点什么
+	if (response.data.code == 401) {
+		window.location.hash = "/login";
+	}
+	if (response.data.code == 305) {
+		window.location.hash = "/";
+	}
+	return response;
+}, function (error) {
+	// 对响应错误做点什么
+	if (error.request.status == 403) {
+		window.location.hash = "/login";
+	}
+	// console.log(Object.getOwnPropertyNames(error))
+	// console.log(error.request,error.message)
+	return Promise.reject(error);
+});
+export default {
+	//登录
+	login: params => {
+		return axios.post(`${baseURL}/api/account/login`, params);
+	},
+	logout: params => {
+		return axios.post(`${baseURL}/api/account/logout`, params);
+	},
+	getInfo: params => {
+		return axios.get(`${baseURL}/api/account/info`)
+	},
+	resetPwd: params => {
+		return axios.put(`${baseURL}/api/account/pwd/reset`,params)
+	},
+	uploadFile: params => {
+		return axios.post(`${baseURL}/api/admin/uploadfile`, params);
+	},
+	//获取验证码
+	getCode: params => {
+		return axios.get(`${baseURL}/api/account/imgcode`)
+	},
+	//科目
+	// getSubList: params => {
+	// 	return axios.get(`${baseURL}/api/admin/subject/list?subject_id=1`)
+	// },
+	getSubList: params => {
+		return axios.get(`${baseURL}/api/admin/subject/list`,{params:params})
+	},
+	saveSub: params => {
+		return axios.post(`${baseURL}/api/admin/subject`, params);
+	},
+	updateSub: params => {
+		return axios.put(`${baseURL}/api/admin/subject`, params);
+	},
+	deleteSub: params => {
+		return axios.delete(`${baseURL}/api/admin/subject`, {params:params});
+	},
+	//报名信息
+	getSignList: params => {
+		return axios.get(`${baseURL}/api/admin/signup/list`, {
+			params: params
+		})
+	},
+	getSign: params => {
+		return axios.get(`${baseURL}/api/admin/signup`, {
+			params: params
+		})
+	},
+	rotateImg: params => {
+		return axios.post(`${baseURL}/api/admin/img/rotate`, params)
+	},
+	updateSign: params => {
+		return axios.put(`${baseURL}/api/admin/signup`, params);
+	},
+	updateSignStu: params => {
+		return axios.put(`${baseURL}/api/admin/signup/upstate`, params);
+	},
+	deleteSign: params => {
+		return axios.delete(`${baseURL}/api/admin/signup`, {params:params});
+	},
+	downloadzip: params => {
+		return axios.get(`${baseURL}/api/admin/signup/downloadzip`, {
+			params: params,
+			responseType:'blob'
+		})
+	},
+	
+	//班级
+	getClass: params => {
+		return axios.get(`${baseURL}/api/admin/class/list`, {
+			params: params
+		})
+	},
+	downloadClassUser: params => {
+		return axios.get(`${baseURL}/api/admin/class/downloadstu`, {
+			params: params,
+			responseType:'blob'
+		})
+	},
+	getaClass: params => {
+		return axios.get(`${baseURL}/api/admin/class`, {
+			params: params
+		})
+	},
+	saveClass: params => {
+		return axios.post(`${baseURL}/api/admin/class`, params);
+	},
+	putClass: params => {
+		return axios.put(`${baseURL}/api/admin/class`, params);
+	},
+	deleteClass: params => {
+		return axios.delete(`${baseURL}/api/admin/class`, {
+			params: params
+		})
+	},
+	//用户管理
+	getUserList: params => {
+		return axios.get(`${baseURL}/api/admin/user/list`, {
+			params: params
+		})
+	},
+	getUser: params => {
+		return axios.get(`${baseURL}/api/admin/user`, {
+			params: params
+		})
+	},
+	//试卷
+	getPaperList: params => {
+		return axios.get(`${baseURL}/api/admin/paper/list`, {
+			params: params
+		})
+	},
+	deletePaper: params => {
+		return axios.delete(`${baseURL}/api/admin/paper`, {
+			params: params
+		})
+	},
+	getPaper: params => {
+		return axios.get(`${baseURL}/api/admin/paper`, {
+			params: params
+		})
+	},
+	uploadPaper: params => {
+		return axios.post(`${baseURL}/api/admin/paper/upload`, params);
+	},
+	getPerList: params => {
+		return axios.get(`${baseURL}/api/admin/permission/list`, {
+			params: params
+		})
+	},
+	//视频
+	getVideoList: params => {
+		return axios.get(`${baseURL}/api/admin/video/list`, {
+			params: params
+		})
+	},
+	getVideo: params => {
+		return axios.get(`${baseURL}/api/admin/video`, {
+			params: params
+		})
+	},
+	saveVideo: params => {
+		return axios.post(`${baseURL}/api/admin/video`, params);
+	},
+	putVideo: params => {
+		return axios.put(`${baseURL}/api/admin/video`, params);
+	},
+	deleteVideo: params => {
+		return axios.delete(`${baseURL}/api/admin/video`, {
+			params: params
+		})
+	},
+	//资料
+	getDocsList: params => {
+		return axios.get(`${baseURL}/api/admin/docs/list`, {
+			params: params
+		})
+	},
+	getDocs: params => {
+		return axios.get(`${baseURL}/api/admin/docs`, {
+			params: params
+		})
+	},
+	saveDocs: params => {
+		return axios.post(`${baseURL}/api/admin/docs`, params);
+	},
+	putDocs: params => {
+		return axios.put(`${baseURL}/api/admin/docs`, params);
+	},
+	deleteDocs: params => {
+		return axios.delete(`${baseURL}/api/admin/docs`, {
+			params: params
+		})
+	},
+	
+	// 内容管理
+	// 栏目列表
+	getContentList: params => {
+		return axios.get(`${baseURL}/api/admin/category/list`, {
+			params: params
+		})
+	},
+	// 新增栏目
+	addContent: params => {
+		return axios.post(`${baseURL}/api/admin/category`, params)
+	},
+	// 编辑栏目
+	editContent: params => {
+		return axios.put(`${baseURL}/api/admin/category`, params)
+	},
+	// 删除栏目
+	delContent: params => {
+		return axios.delete(`${baseURL}/api/admin/category`, {
+			params: params
+		})
+	},
+	// 获取栏目详情
+	getContentById: params => {
+		return axios.get(`${baseURL}/api/admin/category`, {
+			params: params
+		})
+	},
+	// 文章列表
+	getArticleList: params => {
+		return axios.get(`${baseURL}/api/admin/article/list`, {
+			params: params
+		})
+	},
+	// 文章详情
+	getArticleById: params => {
+		return axios.get(`${baseURL}/api/admin/article`, {
+			params: params
+		})
+	},
+	// 新增文章
+	addArticle: params => {
+		return axios.post(`${baseURL}/api/admin/article`, params)
+	},
+	// 编辑文章
+	editArticle: params => {
+		return axios.put(`${baseURL}/api/admin/article`,params)
+	},
+	// 删除文章
+	delArticle: params => {
+		return axios.delete(`${baseURL}/api/admin/article`, {
+			params: params
+		})
+	},
+
+	//系统管理
+	//账号管理列表
+	getAccountList: params => {
+		return axios.get(`${baseURL}/api/admin/account/list`, {
+			params: params
+		})
+	},
+	//账号详情
+	getAccountById: params => {
+		return axios.get(`${baseURL}/api/admin/account`, {
+			params: params
+		})
+	},
+	//新增账号
+	addAccount: params => {
+		return axios.post(`${baseURL}/api/admin/account`, params)
+	},
+	//编辑账号
+	editAccount: params => {
+		return axios.put(`${baseURL}/api/admin/account`, params)
+	},
+	//删除账号
+	delAccount: params => {
+		return axios.delete(`${baseURL}/api/admin/account`, {
+			params: params
+		})
+	},
+	//获取首页数据
+	getIndexData: params => {
+		return axios.get(`${baseURL}/api/admin/index`, params)
+	},
+	// 学员分班
+	allocationClass: params => {
+		return axios.put(`${baseURL}/api/admin/signup/allocation`, params)
+	},
+}

BIN=BIN
src/assets/bg.png


BIN=BIN
src/assets/logo.png


+ 247 - 0
src/components/ClassUser.vue

@@ -0,0 +1,247 @@
+<template>
+    <section class="apply">
+        <!-- 查看已报名学员 -->
+        <el-dialog title="已报名学员信息" :visible.sync="dialogVisible" width="80%">
+            <div>
+                <div>
+                    <el-button type="success">开班短信</el-button>
+                    <el-button type="primary">报考短信</el-button>
+                    <el-button type="warning">培训短信</el-button>
+                    <el-button type="success">理论考试短信</el-button>
+                    <el-button type="success">实操考试短信</el-button>
+                    <el-button type="success">补考短信</el-button>
+                </div>
+                <el-table :data="signupList" style="width: 100%">
+                    <el-table-column type="selection" fixed="left" width="45">
+                    </el-table-column>
+                    <el-table-column prop="name" label="姓名" width="100px">
+                    </el-table-column>
+                    <el-table-column prop="phone" label="联系电话"> </el-table-column>
+                    <el-table-column prop="order_status_1" label="状态">
+                    </el-table-column>
+                    <el-table-column prop="pay_status_1" label="支付状态"> </el-table-column>
+                    <el-table-column prop="price" label="支付金额"> </el-table-column>
+                    <el-table-column prop="admin_remark" label="管理员备注"> </el-table-column>
+                    <el-table-column prop="subject_item0" label="报名类型"> </el-table-column>
+                    <el-table-column prop="subject_item1" label="作业类别"> </el-table-column>
+                    <el-table-column prop="subject_item2" label="准操项目"> </el-table-column>
+                    <el-table-column prop="train_type" label="培训类型"> </el-table-column>
+                    <el-table-column prop="zip" width="220" fixed="right" label="操作">
+                        <template slot-scope="scope">
+                            <el-button @click="
+                      goTo({ path: '/sign/detail', query: { id: scope.row.id } })
+                    " size="mini" type="success">详情</el-button>
+                            <el-button @click="
+                      goTo({ path: '/sign/edit', query: { id: scope.row.id } })
+                    " size="mini" type="warning">编辑</el-button>
+                            <el-button @click="mark(scope.row.id, scope.row.admin_remark)" size="mini" type="primary">备注
+                            </el-button>
+                            <el-button @click="del(scope.row.id)" size="mini" type="danger" disabled>删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+            <div slot="footer">
+                <el-button @click="dialogVisible = false">取 消</el-button>
+                <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
+            </div>
+        </el-dialog>
+    </section>
+</template>
+<script>
+    import Page from "./Page";
+    import Subject from "./Subject";
+    export default {
+        components: {
+            Page,
+            Subject,
+        },
+        props:{
+            dialogVisible:false
+        },
+        data() {
+            return {
+                form: {
+                    name: "",
+                    page: 1,
+                    page_size: 20
+                },
+                activeName: "1",
+                total: 1,
+                list: [],
+                loading: false,
+                dialogVisible: false,
+                signupList: [],
+            };
+        },
+        methods: {
+            goTo(path) {
+                let url = this.$router.resolve(path);
+                window.open(url.href, "_blank");
+            },
+            gopage(size) {
+                if (size) {
+                    this.form.page_size = size;
+                }
+                this.form.page = this.$refs.pageButton.page;
+                this.getData();
+            },
+            getData() {
+                var parm = this.form;
+                this.loading = true;
+                this.$api.getClass(parm).then((res) => {
+                    this.list = res.data.data.list;
+                    this.total = res.data.data.total;
+                    this.loading = false;
+                });
+            },
+            subChange(data) {
+                this.form.subject_item = data.join("|");
+            },
+            del(id) {
+                this.$confirm("确定删除吗", "提示", {
+                    type: "warning",
+                }).then(() => {
+                    this.$api.deleteClass({
+                        id: id
+                    }).then((res) => {
+                        this.$message({
+                            message: "删除成功",
+                            type: "success",
+                        });
+                        this.getData();
+                    });
+                });
+            },
+            mark(id, val) {
+                this.$prompt("", "管理员备注", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    inputValue: val,
+                }).then(({
+                    value
+                }) => {
+                    this.$api.updateSign({
+                        id: id,
+                        admin_remark: value
+                    }).then((res) => {
+                        if (res.data.code == 0) {
+                            this.$message({
+                                message: "备注成功!",
+                                type: "success"
+                            });
+                            this.getData();
+                        } else {
+                            this.$message.error(res.data.message);
+                        }
+                    });
+                });
+            },
+            download(id) {
+                this.$api.downloadClassUser({
+                    id: id
+                }).then((res) => {
+                    var elink = document.createElement("a");
+                    let blob = new Blob([res.data], {
+                        type: "application/vnd.ms-excel"
+                    });
+                    let objUrl = URL.createObjectURL(blob);
+                    let file_name = res.headers["content-disposition"].split("=")[1];
+                    elink.download = file_name;
+                    elink.style.display = "none";
+                    elink.href = objUrl;
+                    document.body.appendChild(elink);
+                    elink.click();
+                    document.body.removeChild(elink);
+                });
+            },
+            showSignupUser(row) {
+                this.$api.getSignList({
+                    class_id: row.id
+                }).then((res) => {
+                    let data = res.data.data.list;
+                    for (let i = 0; i < data.length; i++) {
+                        let item = data[i],
+                            status = "",
+                            pay_status = "",
+                            verify = "",
+                            bill_type = "";
+                        if (item.pay_status) {
+                            pay_status = "已支付";
+                        } else {
+                            pay_status = "未支付";
+                        }
+                        if (item.verify) {
+                            verify = "已认证";
+                        } else {
+                            verify = "未认证";
+                        }
+                        if (item.bill_type == 0) bill_type = "不需要发票";
+                        if (item.bill_type == 1) bill_type = "个人发票";
+                        if (item.bill_type == 2) bill_type = "公司发票";
+                        if (item.order_status == -2) status = "审核未通过";
+                        if (item.order_status == -1) status = "待提交资料";
+                        if (item.order_status == 0) status = "待审核";
+                        if (item.order_status == 1) status = "已审核,待付款";
+                        if (item.order_status == 2) status = "已付款,待培训";
+                        if (item.order_status == 3) status = "已培训,待考试";
+                        if (item.order_status == 7) status = "考试完成";
+                        if (item.order_status == 9) status = "已取消";
+                        item.order_status_1 = status;
+                        item.pay_status_1 = pay_status;
+                        item.verify_1 = verify;
+                        item.bill_type_1 = bill_type;
+                        if (!item.pay_status) {
+                            item.price = "";
+                        }
+                    }
+                    this.signupList = res.data.data.list;
+                    this.total = res.data.data.total;
+                    this.dialogVisible = true;
+                });
+            },
+        },
+        created() {
+            this.getData();
+        },
+    };
+</script>
+
+<style lang="scss">
+    .apply {
+        .filter {
+            background: #fff;
+            padding: 20px 20px 10px;
+            border: 1px solid #ededed;
+            border-radius: 2px;
+            margin-bottom: 10px;
+            margin-top: 10px;
+
+            .el-form-item {
+                margin-bottom: 10px;
+            }
+
+            .el-input,
+            .el-select {
+                width: 150px;
+            }
+        }
+
+        thead {
+            th {
+                background: #eee;
+            }
+        }
+    }
+
+    .table {
+        button {
+            padding: 6px;
+        }
+    }
+
+    .el-table__fixed-right::before,
+    .el-table__fixed::before {
+        background: none;
+    }
+</style>

+ 80 - 0
src/components/MulSubject.vue

@@ -0,0 +1,80 @@
+<style lang="scss">
+ @import '../style/style.scss';
+    .sub{
+        .el-input{
+            width: 300px !important;
+        }
+    }
+</style>
+
+<template>  
+    <el-cascader-multi v-model="value2" :data="data" @change="valChange" value="value2"> </el-cascader-multi>
+</template>   
+<script>
+export default {
+    data(){
+        return{
+            data:[],
+            checkList:[[1,32,38]],
+            value1:[],
+            props2:{
+                label:'name',
+                checkStrictly:true,
+                value:'id'
+            },
+            // value2:[[1,32,38]],
+            props1:{
+                label:'name',
+                checkStrictly:true,
+                value:'name'
+            }
+        }
+    },
+    props: {
+        subvalue:'',
+        subject_id:'',
+        value2:{
+                    type:Array,
+                    default:[]
+                }
+    },
+    methods:{
+        getData(type){
+            this.$api.getSubList().then(res=>{
+                let data=res.data.data;
+                if(this.subject_id){
+                    for(let i=0;i<data.length;i++){
+                        if(data[i].id == this.subject_id){
+                            this.data=data[i].children
+                        }
+                    }
+                }else{
+                    this.data=res.data.data
+                }
+                // this.value2 = [[1,32,38]]              
+          })
+        },
+        handleChange(value) {
+            var id='',that=this;
+            if(value.length>=3&&isNaN(value[0])){
+                var item1=this.data.filter(item=>item.name==value[0]),
+                    item2=item1[0].children.filter(item=>item.name==value[1]),
+                    item3=item2[0].children.filter(item=>item.name==value[2])
+                    id=item3[0].id;
+            }
+            setTimeout(function(){
+                let values=document.querySelector('.el-input__inner').value;
+                let items=values.split(' / ');
+                console.log(values)
+                that.$emit('subChange',items,id,value)
+            },100)
+            
+            
+        }
+    },
+    created(){
+        this.getData()
+        console.log(this.value2)
+    }
+}
+</script>

+ 49 - 0
src/components/Page.vue

@@ -0,0 +1,49 @@
+<style lang="scss">
+ @import '../style/style.scss';
+    .el-pagination{
+        li,button{
+            border: 1px solid #CACACA !important;
+            background-color: #fff !important;
+        }
+        .active{
+            border:none !important;
+            background: $mainColor !important;
+        }
+    }
+</style>
+<template>
+    <el-pagination
+    @current-change="getData"
+    background :page-size='20'
+    @size-change="handleSizeChange"
+    :page-sizes="[20, 30, 40, 50,60,70,80,90,100]"
+    layout="sizes,total,prev, pager, next"
+    :total="total">
+    </el-pagination>
+</template>
+<script>
+export default {
+    data(){
+        return{
+            page:1
+        }
+    },
+    props: {
+        total:'',
+    },
+    methods:{
+        getData(type){
+            // if(type == 1){
+            //     this.data.pageNumber=this.data.pageNumber-1
+            // }else if(type == 2){
+            //     this.data.pageNumber=this.data.pageNumber+1
+            // }
+             this.page=type
+            this.$emit('pageChange')
+        },
+        handleSizeChange(val){
+            this.$emit('pageChange',val)
+        }
+    }
+}
+</script>

+ 95 - 0
src/components/Subject.vue

@@ -0,0 +1,95 @@
+<style lang="scss">
+ @import '../style/style.scss';
+    .sub{
+        .el-input{
+            width: 300px !important;
+        }
+    }
+</style>
+<template>
+    <span v-if='!subject_id'>
+        <el-cascader v-if='value' class="sub" :props='props' 
+        placeholder="请选择培训科目 / 作业类别 / 准操项目"
+        v-model="value1" @change="handleChange"
+        :options="data"></el-cascader>
+        <el-cascader v-else class="sub" :props='props1' clearable
+        placeholder="请选择培训科目 / 作业类别 / 准操项目"
+        v-model="value1" @change="handleChange"
+        :options="data"></el-cascader>
+    </span>
+    <span v-else>
+        <el-cascader class="sub" :props='props1' clearable
+        placeholder="请选择作业类别 / 准操项目"
+        v-model="value1" @change="handleChange"
+        :options="data">
+        </el-cascader>
+    </span>
+</template>   
+<script>
+export default {
+    data(){
+        return{
+            data:[],
+            value1:[],
+            props:{
+                label:'name',
+                checkStrictly:true,
+                value:'id'
+            },
+            props1:{
+                label:'name',
+                checkStrictly:true,
+                value:'name'
+            }
+        }
+    },
+    props: {
+        value:'',
+        subvalue:'',
+        subject_id:''
+    },
+    methods:{
+        getData(type){
+            this.$api.getSubList().then(res=>{
+                let data=res.data.data;
+                if(this.subject_id){
+                    for(let i=0;i<data.length;i++){
+                        if(data[i].id == this.subject_id){
+                            this.data=data[i].children
+                        }
+                    }
+                }else{
+                    this.data=res.data.data
+                }
+              
+          })
+        },
+        handleChange(value) {
+            var id='',that=this;
+            if(value.length>=3&&isNaN(value[0])){
+                var item1=this.data.filter(item=>item.name==value[0]),
+                    item2=item1[0].children.filter(item=>item.name==value[1]),
+                    item3=item2[0].children.filter(item=>item.name==value[2])
+                    id=item3[0].id;
+            }
+            setTimeout(function(){
+                let values=document.querySelector('.el-input__inner').value;
+                let items=values.split(' / ');
+                console.log(values)
+                that.$emit('subChange',items,id,value)
+            },100)
+            
+            
+        }
+    },
+    created(){
+        this.getData()
+        if(this.value){
+            this.value1=this.value   
+        }
+        if(this.subvalue){
+            this.value1=this.subvalue.split('|')
+        }
+    }
+}
+</script>

+ 45 - 0
src/components/SubjectTree.vue

@@ -0,0 +1,45 @@
+<template>
+    <section>
+        <el-tree v-loading="loading" :data="data" node-key="id" :props='props' @node-click="handleNodeClick" :expand-on-click-node="false">
+            <span class="custom-tree-node" slot-scope="{ node, data }"  >
+                <span class="label_name">{{ node.label }}</span>
+            </span>
+        </el-tree>
+    </section>
+</template>   
+<script>
+export default {
+    data(){
+        return{
+            data:[],
+            loading:false,
+            curId:null
+        }
+    },
+    props: {
+    },
+    methods:{
+        getData() {
+            this.loading = true
+            this.$api.getSubList({
+                subject_id: this.id
+            }).then(res => {
+                let data = res.data.data;
+                data.forEach(item => {
+                    item.label = item.label.replace("报名入口","")
+                });
+                console.log(data,22222222222222)
+                this.data = data
+                this.loading = false
+            })
+        },
+        handleNodeClick(node){
+            console.log(node,1111111111111111);
+            this.$emit("subChange",node);
+        }
+    },
+    created(){
+        this.getData();
+    }
+}
+</script>

+ 145 - 0
src/components/fuEditor/index.vue

@@ -0,0 +1,145 @@
+<template lang="html">
+  <div class="editor">
+    <div ref="toolbar" class="toolbar">
+    </div>
+    <div ref="editor" class="text">
+    </div>
+  </div>
+</template>
+
+<script>
+import E from "wangeditor";
+export default {
+  name: "editoritem",
+  data() {
+    return {
+      // uploadPath,
+      editor: null,
+      info_: null
+    };
+  },
+  model: {
+    prop: "value",
+    event: "change"
+  },
+  props: {
+    value: {
+      type: String,
+      default: ""
+    },
+    isClear: {
+      type: Boolean,
+      default: false
+    }
+  },
+  watch: {
+    isClear(val) {
+      // 触发清除文本域内容
+      if (val) {
+        this.editor.txt.clear();
+        this.info_ = null;
+      }
+    },
+    value: function(value) {
+      if (value !== this.editor.txt.html()) {
+        this.editor.txt.html(this.value);
+      }
+    }
+    //value为编辑框输入的内容,这里我监听了一下值,当父组件调用得时候,如果给value赋值了,子组件将会显示父组件赋给的值
+  },
+  mounted() {
+    this.seteditor();
+    this.editor.txt.html(this.value);
+  },
+  methods: {
+    seteditor() {
+
+      // http://192.168.2.125:8080/admin/storage/create
+      this.editor = new E(this.$refs.toolbar, this.$refs.editor);
+      this.editor.customConfig.uploadImgShowBase64 = false; // base 64 存储图片
+      this.editor.customConfig.uploadImgServer =
+        "/api/admin/uploadfile"; // 配置服务器端地址
+      this.editor.customConfig.uploadImgHeaders = {}; // 自定义 header
+      this.editor.customConfig.uploadFileName = "file"; // 后端接受上传文件的参数名
+      this.editor.customConfig.uploadImgMaxSize = 2 * 1024 * 1024; // 将图片大小限制为 2M
+      this.editor.customConfig.uploadImgMaxLength = 6; // 限制一次最多上传 3 张图片
+      this.editor.customConfig.uploadImgTimeout = 3 * 60 * 1000; // 设置超时时间
+
+      // 配置菜单
+      this.editor.customConfig.menus = [
+        "head", // 标题
+        "bold", // 粗体
+        "fontSize", // 字号
+        "fontName", // 字体
+        "italic", // 斜体
+        "underline", // 下划线
+        "strikeThrough", // 删除线
+        "foreColor", // 文字颜色
+        "backColor", // 背景颜色
+        "link", // 插入链接
+        "list", // 列表
+        "justify", // 对齐方式
+        "quote", // 引用
+        "emoticon", // 表情
+        "image", // 插入图片
+        "table", // 表格
+        "video", // 插入视频
+        "code", // 插入代码
+        "undo", // 撤销
+        "redo", // 重复
+        "fullscreen" // 全屏
+      ];
+
+      this.editor.customConfig.uploadImgHooks = {
+        fail: (xhr, editor, result) => {
+          // 插入图片失败回调
+        },
+        success: (xhr, editor, result) => {
+          // 图片上传成功回调
+        },
+        timeout: (xhr, editor) => {
+          // 网络超时的回调
+        },
+        error: (xhr, editor) => {
+          // 图片上传错误的回调
+        },
+        customInsert: (insertImg, result, editor) => {
+          // 图片上传成功,插入图片的回调
+          //result为上传图片成功的时候返回的数据,这里我打印了一下发现后台返回的是data:[{url:"路径的形式"},...]
+          // console.log(result.data[0].url)
+          //insertImg()为插入图片的函数
+          //循环插入图片
+          // for (let i = 0; i < 1; i++) {
+          // console.log(result)
+          let url = result.data.url;
+          console.log(result)
+          insertImg(url);
+          // }
+        }
+      };
+      this.editor.customConfig.onchange = html => {
+        this.info_ = html; // 绑定当前逐渐地值
+        this.$emit("change", this.info_); // 将内容同步到父组件中
+      };
+      // 创建富文本编辑器
+      this.editor.create();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.editor {
+  width: 100%;
+  margin: 0 auto;
+  position: relative;
+  z-index: 0;
+  /deep/ .toolbar {
+    border: 1px solid #ccc;
+  }
+  /deep/ .text {
+    border: 1px solid #ccc;
+    min-height: 500px;
+  }
+}
+</style>

BIN=BIN
src/images/curstom.png


BIN=BIN
src/images/logo.png


BIN=BIN
src/images/msg.png


BIN=BIN
src/images/ysjt.png


BIN=BIN
src/images/个人中心@2x.png


BIN=BIN
src/images/系统设置@2x.png


+ 25 - 0
src/main.js

@@ -0,0 +1,25 @@
+import Vue from 'vue'
+import App from './App.vue'
+import router from './router'
+import store from './store'
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import 'font-awesome/css/font-awesome.css'
+import api from './api';
+
+import BaiduMap from 'vue-baidu-map'
+import elCascaderMulti from "el-cascader-multi";
+Vue.use(BaiduMap, {
+  ak: '1hqg34NFaCw9jcv0xG82cI7uINFaXGGM'
+})
+
+Vue.use(ElementUI);
+Vue.use(elCascaderMulti);
+Vue.prototype.$api = api;
+Vue.config.productionTip = false
+
+new Vue({
+  router,
+  store,
+  render: h => h(App)
+}).$mount('#app')

+ 199 - 0
src/router.js

@@ -0,0 +1,199 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+
+Vue.use(Router)
+
+export default new Router({
+  routes: [{
+      path: '/login',
+      name: 'login',
+      component: () => import('./views/Login.vue'),
+      show: 0
+    },
+    {
+      path: '/',
+      name: '概览',
+      icon: 'el-icon-menu',
+      component: () => import('./views/Home.vue'),
+      show: 1,
+      isLeaf: 1,
+      children: [{
+        path: '/',
+        component: () => import('./views/Index.vue'),
+        name: '系统首页'
+      }, ]
+    },
+    {
+      path: '/',
+      name: '项目管理',
+      change:1,
+      icon: 'el-icon-document-copy',
+      component: () => import('./views/Home.vue'),
+      show: 1,
+      isLeaf: 0,
+      children: [{
+        path: '/subject',
+        component: () => import('./views/project/Index.vue'),
+        name: '培训科目'
+      }, ]
+    },
+
+    {
+      path: '/',
+      name: '报名信息',
+      icon: 'el-icon-document-checked',
+      component: () => import('./views/Home.vue'),
+      show:1,
+      isLeaf:0,
+      children:[
+        { path: '/new/*', component: () => import('./views/apply/New.vue'), name: '新办' },
+        { path: '/update/*', component: () => import('./views/apply/Update.vue'), name: '复审' },
+        { path: '/change/*', component: () => import('./views/apply/Change.vue'), name: '换证' },
+        { path: '/sign/detail',hide:1, component: () => import('./views/apply/Detail.vue'), name: '修改' },
+        { path: '/sign/edit',hide:1, component: () => import('./views/apply/Edit.vue'), name: '修改' },
+      ]
+    },
+    {
+      path: '/',
+      name: '培训计划',
+      icon: 'el-icon-notebook-1',
+      component: () => import('./views/Home.vue'),
+      show: 1,
+      isLeaf: 0,
+      children: [{
+          path: '/classes',
+          component: () => import('./views/classes/Index.vue'),
+          name: '班级管理'
+        },
+        {
+          path: '/classes/add',
+          hide:1,
+          component: () => import('./views/classes/Add.vue'),
+          name: '新增班级'
+        },
+      ]
+    },
+    {
+      path: '/',
+      name: '在线培训',
+      icon: 'el-icon-eleme',
+      component: () => import('./views/Home.vue'),
+      show: 1,
+      isLeaf: 0,
+      children: [{
+          path: '/papers',
+          component: () => import('./views/paper/Index.vue'),
+          name: '试卷管理'
+        },
+        {
+          path: '/papers/detail',
+          hide:1,
+          component: () => import('./views/paper/Detail.vue'),
+          name: '试卷详情'
+        },
+        {
+          path: '/videos',
+          component: () => import('./views/videos/Index.vue'),
+          name: '视频管理'
+        },
+        {
+          path: '/videos/add',
+          hide:1,
+          component: () => import('./views/videos/Add.vue'),
+          name: '新增视频'
+        },
+      ]
+    },
+    {
+      path: '/',
+      name: '用户管理',
+      icon: 'el-icon-user',
+      component: () => import('./views/Home.vue'),
+      show: 1,
+      isLeaf: 0,
+      children: [{
+        path: '/user',
+        component: () => import('./views/user/Index.vue'),
+        name: '用户列表'
+      }, {
+        path: '/user/detail',
+        hide:1,
+        component: () => import('./views/user/Detail.vue'),
+        name: '新增用户'
+      }, ]
+    },
+    {
+      path: '/content',
+      name: '内容管理',
+      icon: 'el-icon-document',
+      component: () => import('./views/Home.vue'),
+      show: 1,
+      isLeaf: 0,
+      children: [{
+          path: '/content',
+          component: () => import('./views/content/Index.vue'),
+          name: '栏目管理'
+        },
+        {
+          path: '/addContent',
+          hide:1,
+          component: () => import('./views/content/addContent.vue'),
+          name: '新增栏目'
+        },
+        {
+          path: '/article',
+          component: () => import('./views/content/Article.vue'),
+          name: '文章管理'
+        },
+        {
+          path: '/addArticle',
+          component: () => import('./views/content/addArticle.vue'),
+          name: '新增文章',
+          hide:1,
+        },
+        {
+          path: '/docs',
+          component: () => import('./views/docs/Index.vue'),
+          name: '资料管理'
+        },
+        {
+          path: '/docs/add',
+          hide:1,
+          component: () => import('./views/docs/Add.vue'),
+          name: '新增资料'
+        },
+      ]
+    },
+    {
+      path: '/system',
+      name: '系统管理',
+      icon: 'el-icon-setting',
+      component: () => import('./views/Home.vue'),
+      show: 1,
+      isLeaf: 0,
+      children: [{
+          path: '/system',
+          component: () => import('./views/system/Index.vue'),
+          name: '账号管理'
+        },
+        {
+          path: '/system/add',
+          hide:1,
+          component: () => import('./views/user/Add.vue'),
+          name: '新增用户',
+        },
+        {
+          path: '/system/addAccount',
+          hide:1,
+          component: () => import('./views/system/AddAccount.vue'),
+          name: '新增账户'
+        },
+        {
+          path: '/resetPwd',
+          component: () => import('./views/system/ResetPwd.vue'),
+          name: '修改密码'
+        },
+      ]
+    }
+  ]
+})

+ 16 - 0
src/store.js

@@ -0,0 +1,16 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+  state: {
+
+  },
+  mutations: {
+
+  },
+  actions: {
+
+  }
+})

+ 25 - 0
src/style/_base.scss

@@ -0,0 +1,25 @@
+*{
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+}
+::-webkit-scrollbar
+{
+   width: 8px;
+   height: 13px;
+   background-color: #F5F5F5;
+}
+
+::-webkit-scrollbar-track
+{
+//    box-shadow: inset 0 0 6px red;
+   border-radius: 10px;
+   background-color: #F5F5F5;
+}
+
+::-webkit-scrollbar-thumb
+{
+   border-radius: 10px;
+   // box-shadow: inset 0 0 6px rgba(0,0,0,.3);
+   background-color: #999;
+}

+ 6 - 0
src/style/_style.scss

@@ -0,0 +1,6 @@
+// $color:#1F315D;
+$color:#183477;
+// $mainColor:#FF6A00;
+$mainColor:#fff;
+$green:#00CC99;
+

+ 269 - 0
src/style/home.scss

@@ -0,0 +1,269 @@
+@import 'style';
+@import 'base';
+$height: 50px;
+.header {
+	background: $color;
+	color: #fff;
+	height: 50px !important;
+	padding: 0 24px;
+	.logo{
+		height: 50px;
+		margin-top: 5px;
+	}
+	h1{
+		font-size: 18px;
+		line-height: 50px;
+		display: inline-block;
+	}
+	.settings{
+		float: right;
+		line-height: 50px;
+		img{
+			position: relative;
+			top: 3px;
+		}
+		span{
+			color: #fff;
+			font-size: 14px;
+			padding: 0 10px;
+			cursor: pointer;
+		}
+	}
+}
+.main {
+	position: relative;
+	height: calc(100vh - 50px);
+	background: #ECF0F5;
+	padding-top: 2px;
+}
+.left-aside {
+	height: 100%;
+	overflow-y: auto;
+	overflow-x: hidden;
+	// background: #fff;
+	background: #09142b;
+	.left-menue {
+		i{
+			color:#fff;
+		}
+		border: none;
+		background: #09142b;
+		.el-menu-item{
+			color:#fff;
+		}
+		.el-menu-item:hover{
+			color:#fff;
+			background-color:$color;
+		}
+		.el-submenu__title{
+			color:white;
+		}
+		.el-submenu__title:hover{
+			color:#fff;
+			background-color:$color;
+		}
+		& > .is-active {
+			background-color:$color !important;
+			position: relative;
+			.iconfont{
+				color: $mainColor;
+			}	
+			&>.el-submenu__title{
+				color: #fff !important;
+				// color:#fff!important;
+			}
+			.is-active {
+				background-color:$color !important;
+				position: relative;
+				.iconfont{
+					color: $mainColor;
+				}		
+			}	
+		}
+		.is-opened{
+			// background-color: #fff !important;
+			background-color: #09142b!important;
+			// color:#fff;
+			.el-menu{
+				background-color: #09142b!important;
+				color:#fff;
+				.el-menu-item{
+					color:#fff;
+				}
+			}
+			&>.el-submenu__title{
+				color: #fff !important;
+			}
+		}
+		.el-menu-item-group__title{
+			padding: 0;
+		}
+		.child{
+			padding-left: 60px !important;
+		}
+		// .el-menu-item{
+		// 	height: 44px;
+		// 	line-height: 44px;
+		// }
+	}
+}
+.el-main {
+	// border: 1px solid red;
+	padding:10px 20px;
+	position: relative;
+	.content{
+		background: #fff;
+		padding: 32px;
+		margin-top: 12px;
+		min-height: calc(100vh - 130px);
+		box-shadow:0px 4px 12px 0px rgba(0,0,0,0.12);
+	}
+	.title_top{
+		
+		.add_btn{
+			width:90px;
+			height:32px;
+			background:$mainColor;
+			border:1px solid rgba(237,237,237,1);
+			border-radius:4px;
+			float: right;
+			text-align: center;
+			line-height: 32px;
+			color: #FFF;
+		}
+	}
+
+    .table_div{
+        background: #fff;
+        border: 1px solid #EDEDED;
+        min-height: calc(100vh - 430px);
+    }
+    .edit_btn{
+        color: #25486A;
+	}
+	.info_btn{
+		background: #ECF0F5;
+		color: #1F2328;
+		border-color: #ECF0F5;
+	}
+	// 分页
+	.el-pagination {
+		// position: absolute;
+		// left: 0;
+		// bottom: 15px;
+		text-align: center;
+		width: 100%;
+		margin-top: 20px;
+	}
+}
+.el-dialog{
+	.el-select{display: block;}
+}
+.main_btn{
+	background: $mainColor;
+	border-color: $mainColor;
+	width: 120px;
+	font-size: 14px;
+}
+.cancel_btn{
+	width: 170px;
+	font-size: 14px;
+	color: #6A737B;
+}
+// 报名列表页面
+.apply{
+	.filter{
+		 background: #fff;
+		 padding: 20px 20px 10px; 
+		 border:1px solid #EDEDED;
+		 border-radius:2px;
+		 margin-bottom: 10px;
+		 margin-top: 10px;
+		 .el-form-item{
+			 margin-bottom: 10px;
+		 }
+		 .el-input,.el-select{
+			 width: 150px;
+		 }
+ 
+	}
+	
+	.el-divider--horizontal{
+		margin: 10px 0 20px;
+	}
+	.divider{
+	 //    margin-bottom: 15px;
+		background: #fff;
+		padding: 10px;
+		.el-button--small, .el-button--small.is-round {
+			 padding: 9px 5px;
+		 }
+		 .el-button+.el-button{
+			 margin-left: 5px;
+		 }
+	}
+	thead{
+		th{
+			background: #eee;
+		}
+	}   
+	.el-button--warning {
+	 color: #FFF;
+	 background-color: #FFB800;
+	 border-color: #FFB800;
+	 }
+	 .el-button--info {
+	 color: #FFF;
+	 background-color: #393D49;
+	 border-color: #393D49;
+	 }  
+	 .checkList{
+		 padding:0 10px;
+		 label{
+			 margin: 5px 0;
+		 }
+	 }
+	 .table{
+		 button{
+			 padding:6px;
+		 }
+	 }
+	 .el-table__fixed-right::before, .el-table__fixed::before{
+		 background: none;
+	 }
+ }
+@media (max-width: 750px) {
+	.left-aside {
+		position: absolute;
+		z-index: 9;
+		height: calc(100vh - 50px);
+		overflow: auto;
+		transition: all 0.3s linear;
+		// left: -220px;
+	}
+	.el-main {
+		padding: 10px;
+	}
+	.el-dialog {
+		width: 98% !important;
+	}
+	.header .fa-navicon,
+	.header .fa-close {
+		width: 16px;
+		display: inline-block;
+	}
+	.main .mask {
+		opacity: 0;
+		transition: opacity 0.3s;
+	}
+	.main.show .mask {
+		opacity: 1;
+		position: absolute;
+		z-index: 8;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+	}
+}

+ 34 - 0
src/style/login.scss

@@ -0,0 +1,34 @@
+@import 'style';
+.login{
+    background: $color;
+    width: 100%;
+    height: 100vh;
+    position: relative;
+    .login-div{
+      width: 350px;
+      height: 420px;
+      background: #fff;
+      position: absolute;
+      top: 0;
+      bottom: 0;
+      left: 0;
+      right: 0;
+      margin: auto;
+      border-radius: 5px;
+      box-shadow: rgba(0, 0, 0, 0.35) 20px 20px 20px;
+      padding: 30px;
+      img{
+        display: block;
+        margin: 0 auto 10px;
+      }
+      h1{
+        color: $color;
+        font-size: 24px;
+        text-align: center;
+        margin-bottom: 20px;
+      }
+      .login-btn{
+        width: 100%;
+      }
+    }
+}

+ 5 - 0
src/views/About.vue

@@ -0,0 +1,5 @@
+<template>
+  <div class="about">
+    <h1>This is an about page</h1>
+  </div>
+</template>

+ 146 - 0
src/views/Home.vue

@@ -0,0 +1,146 @@
+<style lang="scss">
+@import '../style/home.scss';
+.head{
+	width:30px;
+	height:30px;
+	border-radius:50%;
+	float:left;
+	margin:10px;
+}
+</style>
+
+<template>
+	<el-container>
+		<el-header class="header">
+			<h1>巴中逸沣安全培训</h1>
+			<!-- <img class="logo" src="../images/logo.png" alt=""> -->
+			<div class="settings">
+				<el-dropdown>
+					<span class="el-dropdown-link">
+						{{info.name}}<i class="el-icon-arrow-down el-icon--right"></i>
+					</span>
+					<el-dropdown-menu slot="dropdown">
+						<a style="text-decoration:none;" href="#/resetPwd"><el-dropdown-item>修改密码</el-dropdown-item></a>
+					</el-dropdown-menu>
+				</el-dropdown>
+        		<span @click="logout">退出登录</span>
+			</div>
+		</el-header>
+		<el-container class="main">
+			<!-- 左侧菜单 -->
+			<el-aside class="left-aside" width="220px" v-if='info.id'>
+				<el-menu :unique-opened='true'  :default-active="$route.path" router class="left-menue" active-text-color="#ffffff">
+					<template v-for="(item, index) in $router.options.routes">
+						<template v-if="index != 3">
+							<el-menu-item v-if='item.show&&item.isLeaf' :index="item.path"  :key='index' v-show="permission(item.name)">
+								<i :class="item.icon"></i>
+								<span slot="title">{{item.name|ellipsis}}</span>
+							</el-menu-item>
+							<el-submenu v-if='item.show&&!item.isLeaf' v-show="permission(item.name)" :index="'index_'+index"  :key='index'>
+								<template slot="title">
+								<i :class="item.icon"></i>
+								<span>{{item.name|ellipsis}}</span>
+								</template>
+								<el-menu-item-group>
+									<el-menu-item class="child" v-for="(child,idx) in item.children" :key="index+'_'+idx" :index="child.path" v-show='!child.hide'>
+									{{child.name}}
+									</el-menu-item>
+								</el-menu-item-group>
+							</el-submenu>
+						</template>
+						<template v-else>
+							<el-submenu v-for="(sub,id) in menu" v-show="permission(sub.name)" :index="'index_'+index+'_'+id"  :key='index+"_"+id'>
+								<template slot="title">
+								<i :class="sub.icon"></i>
+								<span>{{sub.name|ellipsis}}</span>
+								</template>
+								<el-menu-item-group>
+									<el-menu-item class="child" v-for="(child,idx) in sub.children" :key="index+'_'+idx" :index="child.path">
+									{{child.name}}
+									</el-menu-item>
+								</el-menu-item-group>
+							</el-submenu>
+						</template>
+					</template>
+				</el-menu>
+			</el-aside>
+			<!-- 右侧内容 -->
+			<el-container>
+				<el-main>			
+					<transition name="fade" mode="out-in"><router-view :info='info' :community='community'></router-view></transition>
+				</el-main>
+				<!-- <el-footer>Footer</el-footer> -->
+			</el-container>
+		</el-container>
+	</el-container>
+</template>
+
+<script>
+export default {
+	filters: {
+    	ellipsis (value) {
+		if (!value) return ''
+		if (value.length > 8) {
+			return value.slice(0,8) + '...'
+		}
+		return value
+		}
+	},
+	name: 'home',
+	data() {
+		return {
+			menuList:[],
+			path:'',
+			info:{},
+			community_list:[],
+			community:{},
+			menu:[]
+		};
+	},
+	methods: {
+		logout(){
+			this.$api.logout().then(res=>{
+				this.$router.push({path:'/login'})
+			})
+		},
+		permission(name){
+			let permissions=this.info.permissions||''
+			if(permissions.indexOf(name)<0){
+				return false;
+			}else{
+				return true;
+			}	
+		},
+		getData(){
+			this.$api.getInfo().then(res=>{
+				this.info=res.data.data
+			})
+			this.$api.getSubList().then(res=>{
+			  let data=res.data.data
+			  let routes=this.$route
+			  let path=[]
+			  for(let i=0;i<data.length;i++){
+				  path.push({
+					  	path: '/',
+						name: data[i].name,
+						icon:'el-icon-s-custom',
+						children:[
+							{ path: '/new/'+data[i].id,  name: '新办'},
+							{ path: '/update/'+data[i].id,  name: '复审'},
+							{ path: '/change/'+data[i].id,  name: '换证'},
+						]
+				  })
+			  }
+			  this.menu=path
+          	})
+		},
+		goTo(path){
+			this.$router.push({path:path})
+		}
+	},
+	created(){
+		// console.log(this.$route)
+		this.getData()
+	}
+};
+</script>

+ 112 - 0
src/views/Index.vue

@@ -0,0 +1,112 @@
+<style lang="scss">
+  .index{
+      .title{
+        color: #222;
+        font-size: 18px;
+        margin-bottom: 30px;
+      }
+      .datas{
+        // margin-bottom: 60px;
+        li{
+          list-style: none;
+          display: inline-block;
+          width: 20%;
+          margin-left: 20px;
+          margin-bottom: 20px;
+          padding: 32px;
+          border-radius:6px;
+          border:1px solid rgba(238,238,238,1);
+          text-align: center;
+          color:#222;
+          font-size: 16px;
+          img{
+            display: block;
+            margin: 10px auto;
+            float: left;
+          }
+          p{
+            font-size: 32px;
+          }
+        }
+      }
+  }
+</style>
+<template>
+  <section class="index">
+    <p>首页</p>
+    <div class="content">
+        <h1 class="title">数据概览</h1>
+        <ul class="datas">
+          <li>
+            用户总数
+            <img width="40" src="../images/curstom.png" alt="">
+            <p>{{info.user_count}}</p>
+          </li>
+          <li>
+            报名总数
+            <img width="40" src="../images/curstom.png" alt="">
+            <p>{{info.signup_count}}</p>
+          </li>
+          <li>
+            试卷总数
+            <img width="40" src="../images/curstom.png" alt="">
+            <p>{{info.paper_count}}</p>
+          </li>
+          <li>
+            视频总数
+            <img width="40" src="../images/curstom.png" alt="">
+            <p>{{info.videos_count}}</p>
+          </li>
+        </ul>
+        <h1 class="title">待办事项</h1>
+        <ul class="datas">
+          <li>
+            报名待付款
+            <p>{{info.waiting_pay_count}}</p>
+          </li>
+          <li>
+            待审核
+            <p>{{info.waiting_audit_count}}</p>
+          </li>
+          <li>
+            待考试
+            <p>{{info.waiting_exam_count}}</p>
+          </li>
+        </ul>
+    </div>
+  </section>
+</template>
+<script>
+export default {
+	filters: {
+    	ellipsis (value) {
+		if (!value) return ''
+		if (value.length > 8) {
+			return value.slice(0,8) + '...'
+		}
+		return value
+		}
+	},
+	name: 'home',
+	data() {
+		return {
+			menuList:[],
+			path:'',
+			info:{},
+			community_list:[],
+			community:{},
+      menu:[]
+		};
+	},
+	methods: {
+		getData(){
+			this.$api.getIndexData().then(res=>{
+				this.info=res.data.data
+      })
+    }
+	},
+	created(){
+		this.getData()
+	}
+};
+</script>

+ 143 - 0
src/views/Login.vue

@@ -0,0 +1,143 @@
+<style lang="scss">
+  @import '../style/_base.scss';
+  .login{
+    height: 100vh;
+    min-height: 450px;
+    background: url(../assets/bg.png) 100%;
+    background-position: center bottom; 
+    // background: #1F315D;
+    position: relative;
+    .login-div{
+      width:520px;
+      height:448px;
+      background:#FFFFFF;
+      box-shadow:0px 12px 24px 0px rgba(0,0,0,0.24);
+      border-radius:8px;
+      position: absolute;
+      top: 0;
+      bottom: 0;
+      left: 0;
+      right: 0;
+      margin: auto;
+      padding:48px  75px;
+      h1{
+        text-align: center;
+        margin-bottom: 40px;
+        font-size: 28px;
+      }
+      .input_div{
+        position: relative;
+        margin-bottom: 12px;
+        input{
+          padding-left: 80px;
+          outline: none;
+          background:rgba(242,245,247,1);
+          border-radius:8px;
+          border:1px solid rgba(238,238,238,1);
+          display: block;
+          height: 54px;
+          width: 100%;
+          font-size: 16px;
+        }
+        label{
+          color: #222;
+          font-size: 16px;
+          position: absolute;
+          left: 16px;
+          top:16px;
+          z-index: 99;
+        }
+      }
+      .code{
+        input{
+          width: 250px;
+        }
+        img{
+          width: 108px;
+          height: 54px;
+          float: right;
+          background-origin: 1px solid red;
+        }
+      }
+      
+      .login-btn{
+        background: #066FE6;
+        width: 100%;
+        height: 54px;
+        margin-top: 36px;
+        font-size: 18px;
+        color: #FFF;
+        font-weight: 600;
+        border:none;
+        border-radius: 8px;
+      }
+    }
+  }
+</style>
+
+<template>
+  <div class="login">
+      <div class="login-div">
+        <h1>巴中逸沣安全培训</h1>
+        <form>
+            <div class="input_div">
+              <label>用户名</label>
+              <input type="text" v-model="logindata.username" placeholder="请输入用户名">
+            </div>
+            <div class="input_div">
+              <label>密&nbsp;&nbsp;码</label>
+              <input type="password" v-model="logindata.password" placeholder="请输入密码">
+            </div>
+            <div class="input_div code">
+              <img @click="getCode" :src="code" alt="">
+              <label>图形码</label>
+              <input type="text" v-model="logindata.imgcode" placeholder="请输入验证码">  
+            </div>
+            <el-button @click="login" class="login-btn" type="primary">登  录</el-button>
+        </form>
+      </div>
+  </div>
+</template>
+
+<script>
+// import { Base64 } from 'js-base64';
+export default {
+  name: 'login',
+  data(){
+    return{
+      code:'',
+      logindata:{
+        username:'',
+        password:'',
+        imgcode_id:'',
+        imgcode:''
+      }
+    }
+  },
+  methods:{
+      login(){
+          let parms=this.logindata;   
+            this.$api.login(parms).then((res)=>{
+                let data=res.data
+                  if(res.data.code == 0){
+                      window.location.hash='/';
+                  }else{
+                      this.$message.error(res.data.message);
+                  } 
+            })
+            .catch(err=>{
+              this.$message.error(res.data.message);
+            })
+      },
+      getCode(){
+        this.$api.getCode().then(res=>{
+          this.code=res.data.data.ubase64
+          this.logindata.imgcode_id=res.data.data.captcha_id
+        })
+      }
+    },
+  created(){
+    this.getCode();
+  }
+}
+</script>

+ 876 - 0
src/views/apply/Change.vue

@@ -0,0 +1,876 @@
+<style lang="scss">
+.paydone {
+  color: #67c23a;
+}
+.unpay {
+  color: #ffb800;
+}
+.payprice {
+  color: #409eff;
+}
+.el-table td,
+.el-table th {
+  padding: 5px 0 !important;
+}
+</style>
+<template>
+  <section class="apply">
+    <p>报名列表 > {{ subject_item }} > 换证</p>
+    <div class="filter">
+      <el-form
+        label-width="75px"
+        :inline="true"
+        size="small"
+        style="position: relative"
+      >
+        <!-- <el-divider></el-divider> -->
+        <el-form-item label="培训项目">
+          <Subject
+            v-if="subject_id"
+            @subChange="subChange"
+            :key="key"
+            :subject_id="subject_id"
+          />
+        </el-form-item>
+        <el-form-item label="姓名" label-width="40px">
+          <el-input placeholder="姓名" v-model="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="身份证号" label-width="80px">
+          <el-input placeholder="身份证号" v-model="form.idno"></el-input>
+        </el-form-item>
+        <el-form-item label="联系电话">
+          <el-input placeholder="联系电话" v-model="form.phone"></el-input>
+        </el-form-item>
+        <el-form-item label="公司名称">
+          <el-input placeholder="公司名称" v-model="form.company"></el-input>
+        </el-form-item>
+        <el-form-item label="报名时间" v-if="more_search">
+          <el-date-picker
+            clearable
+            v-model="form.signup_time"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="发票类型" v-if="more_search">
+          <el-select v-model="form.bill_type" placeholder="请选择" clearable>
+            <el-option label="不需要发票" :value="0"></el-option>
+            <el-option label="个人发票" :value="1"></el-option>
+            <el-option label="公司发票" :value="2"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="领证方式" clearable v-if="more_search">
+          <el-select v-model="form.receive_card" placeholder="请选择">
+            <el-option label="邮寄" :value="1"></el-option>
+            <el-option label="自取" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="考试设置" v-if="more_search">
+          <el-select
+            v-model="form.set_exam_time"
+            placeholder="请选择"
+            clearable
+          >
+            <el-option label="已设置考试时间" :value="1"></el-option>
+            <el-option label="未设置考试时间" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="考试时间" v-if="more_search">
+          <el-date-picker
+            clearable
+            v-model="form.exam_time"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            type="datetime"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="培训班级" v-if="more_search">
+          <el-select
+            v-model="form.class_id"
+            placeholder="请选择"
+            clearable
+            @clear="getData"
+          >
+            <el-option
+              v-for="(item, index) in class_list"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="培训时间" v-if="more_search">
+          <el-date-picker
+            clearable
+            v-model="form.train_time1"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <span
+            @click="more_search = !more_search"
+            style="font-size: 12px; color: #999; cursor: pointer"
+          >
+            高级搜索</span
+          >
+          <i
+            v-if="!more_search"
+            @click="more_search = !more_search"
+            class="el-icon-arrow-down"
+          ></i>
+          <i
+            v-else
+            @click="more_search = !more_search"
+            class="el-icon-arrow-up"
+          ></i>
+        </el-form-item>
+        <el-form-item style="">
+          <el-button
+            @click="(list = []), (form.page = 1), getData()"
+            type="primary"
+            icon="el-icon-search"
+            >搜索</el-button
+          >
+        </el-form-item>
+
+        <el-divider></el-divider>
+      </el-form>
+      <el-tabs v-model="order_status" @tab-click="tabClick">
+        <el-tab-pane name="-3" label="报名列表"></el-tab-pane>
+        <el-tab-pane name="-1" label="待上传资料"></el-tab-pane>
+        <el-tab-pane name="0" label="审核中"></el-tab-pane>
+        <el-tab-pane name="-2" label="审核未通过"></el-tab-pane>
+        <el-tab-pane name="1" label="待付款"></el-tab-pane>
+        <el-tab-pane name="2" label="已付款,待培训"></el-tab-pane>
+        <el-tab-pane name="3" label="已培训,待考试"></el-tab-pane>
+        <el-tab-pane name="7" label="考试完成"></el-tab-pane>
+        <el-tab-pane name="9" label="已取消"></el-tab-pane>
+      </el-tabs>
+    </div>
+    <div class="divider">
+      <el-button @click="setStatus(1, '审核通过')" size="small" type="success"
+        >通过审核</el-button
+      >
+      <el-button @click="setStatus(-2, '审核不通过')" size="small" type="info"
+        >审核不通过</el-button
+      >
+      <el-button @click="setStatus(2, '已付款')" size="small" type="primary"
+        >已付款</el-button
+      >
+      <el-button
+        @click="setStatus(3, '已培训,待考试')"
+        size="small"
+        type="warning"
+        >已培训,待考试</el-button
+      >
+      <el-button @click="setStatus(7, '考试完成')" size="small" type="success"
+        >考试完成</el-button
+      >
+      <el-button @click="setStatus(9, '已取消')" size="small" type="danger"
+        >已取消</el-button
+      >
+      <el-divider direction="vertical"></el-divider>
+
+      &nbsp;
+      <el-button
+        style="float: right"
+        @click="print"
+        type="primary"
+        size="mini"
+        plain
+        icon="el-icon-printer"
+      ></el-button>
+      &nbsp;&nbsp;
+      <el-dropdown trigger="click" style="float: right; margin-right: 5px">
+        <el-button type="primary" size="mini" plain icon="el-icon-finished">
+        </el-button>
+        <el-dropdown-menu slot="dropdown">
+          <!-- <el-dropdown-item>姓名</el-dropdown-item> -->
+          <div class="checkList">
+            <p v-for="(item, index) in itemList" :key="index">
+              <el-checkbox
+                v-model="item.checked"
+                :label="item.name"
+              ></el-checkbox>
+            </p>
+          </div>
+        </el-dropdown-menu>
+      </el-dropdown>
+      &nbsp;&nbsp;
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="download('apply')"
+        size="small"
+        type="info"
+        >导出学员申报资料</el-button
+      >
+      &nbsp;&nbsp;
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="download('exam')"
+        size="small"
+        type="success"
+        >导出考勤表与申报考试表</el-button
+      >
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="setTime(2)"
+        size="small"
+        type="primary"
+        >设置考试时间</el-button
+      >
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="setTime(1)"
+        size="small"
+        type="primary"
+        >设置培训时间</el-button
+      >
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="allocation()"
+        size="small"
+        type="success"
+        >学员分班</el-button
+      >
+      <!--<el-button style="float:right;margin-right:5px" @click="setTime(3)" size="small" type="primary" >生成学时证明</el-button>-->
+    </div>
+    <el-table
+      class="table"
+      :fit="true"
+      :data="list"
+      v-loading="loading"
+      @selection-change="handleSelectionChange"
+      border
+      style="width: 100%"
+    >
+      <el-table-column type="selection" fixed="left" width="45">
+      </el-table-column>
+      <template v-for="(item, index) in itemList">
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '支付状态'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <span v-if="scope.row.pay_status" class="paydone">已支付</span>
+            <span v-else class="unpay">未支付</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '支付金额'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <span class="payprice">{{ scope.row.price }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '学时证明'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <a
+              v-if="scope.row.classhour_cert_url"
+              target="_blank"
+              :href="scope.row.classhour_cert_url"
+              >已生成</a
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '状态'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == -2"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == -1"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 0"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 1"
+              type="danger"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 2"
+              type="primary"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 3"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 7"
+              type="success"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 9"
+              type="danger"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="
+            item.checked &&
+            item.name != '状态' &&
+            item.name != '学时证明' &&
+            item.name != '支付状态' &&
+            item.name != '支付金额'
+          "
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+      </template>
+      <el-table-column prop="zip" width="220" fixed="right" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            @click="goTo({ path: '/sign/detail', query: { id: scope.row.id } })"
+            size="mini"
+            type="success"
+            >详情</el-button
+          >
+          <el-button
+            @click="goTo({ path: '/sign/edit', query: { id: scope.row.id } })"
+            size="mini"
+            type="warning"
+            >编辑</el-button
+          >
+          <el-button
+            @click="mark(scope.row.id, scope.row.admin_remark)"
+            size="mini"
+            type="primary"
+            >备注</el-button
+          >
+          <el-button @click="del(scope.row.id)" size="mini" type="danger"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <Page ref="pageButton" :total="total" @pageChange="gopage" />
+
+    <el-dialog :title="text" :visible.sync="dialogVisible" width="30%">
+      <el-date-picker
+        v-model="time1"
+        v-show="date_type == 1"
+        type="daterange"
+        value-format="yyyy-MM-dd"
+        range-separator="至"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期"
+      >
+      </el-date-picker>
+      <el-date-picker
+        v-model="time2"
+        v-show="date_type == 2"
+        type="date"
+        value-format="yyyy-MM-dd"
+      >
+      </el-date-picker>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="save">确 定</el-button>
+      </span>
+    </el-dialog>
+    <!-- 学员分班 -->
+    <el-dialog
+        title="学员分班"
+        :visible.sync="allocationDialogVisible"
+        width="500px">
+        <div>
+            <el-form ref="form" :model="form" label-width="80px">
+                <el-form-item label="培训班级">
+                    <el-select v-model="form.allocation_class_id" placeholder="请选择班级" size="middle">
+                        <el-option
+                            v-for="item in class_list"
+                            :key="item.id"
+                            :label="item.name"
+                            :value="item.id">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+        </div>
+        <div slot="footer">
+            <el-button @click="allocationDialogVisible = false">取 消</el-button>
+            <el-button type="primary" @click="doAllocationClass">确 定</el-button>
+        </div>
+    </el-dialog>
+  </section>
+</template>
+<script>
+import Page from "../../components/Page";
+import Subject from "../../components/Subject";
+// import { Base64 } from 'js-base64';
+export default {
+  components: {
+    Page,
+    Subject,
+  },
+  data() {
+    return {
+      key: 1,
+      checkList: [],
+      class_list: [],
+      itemList: [
+        { name: "姓名", value: "name", checked: true, width: "70px" },
+        { name: "联系电话", value: "phone", checked: true, width: "120px" },
+        {
+          name: "状态",
+          value: "order_status_1",
+          checked: true,
+          width: "115px",
+        },
+        { name: "支付状态", value: "pay_status_1", checked: true },
+        { name: "支付金额", value: "price", checked: true },
+        {
+          name: "管理员备注",
+          value: "admin_remark",
+          checked: true,
+          width: "150px",
+        },
+        {
+          name: "报名类型",
+          value: "subject_item0",
+          checked: true,
+          width: "120px",
+        },
+        {
+          name: "作业类别",
+          value: "subject_item1",
+          checked: true,
+          width: "150px",
+        },
+        {
+          name: "准操项目",
+          value: "subject_item2",
+          checked: true,
+          width: "200px",
+        },
+        { name: "培训类型", value: "train_type", checked: true, width: "90px" },
+        { name: "分班信息", value: "class_name", checked: true, width: "90px" },
+        {
+          name: "学时证明",
+          value: "classhour_cert_url",
+          checked: true,
+          width: "90px",
+        },
+        {
+          name: "培训时间",
+          value: "train_time",
+          checked: true,
+          width: "200px",
+        },
+        { name: "考试时间", value: "exam_time", checked: true, width: "150px" },
+        { name: "更新时间", value: "ctime", checked: true, width: "170px" },
+        {
+          name: "报名时间",
+          value: "signup_time",
+          checked: true,
+          width: "150px",
+        },
+        { name: "公司名称", value: "company", checked: true, width: "200px" },
+        {
+          name: "发票类型",
+          value: "bill_type_1",
+          checked: false,
+          width: "120px",
+        },
+        { name: "领证方式", value: "receive_card", checked: false },
+        { name: "实名认证", value: "verify_1", checked: true },
+        { name: "ID", value: "id", checked: false },
+      ],
+      text: "批量设置培训时间",
+      date_type: 1,
+      time1: null,
+      time2: "",
+      form: {
+        train_type: "换证",
+        subject_item: "",
+        order_status: "",
+        page: 1,
+        page_size: 20,
+      },
+      activeName: "1",
+      total: 1,
+      list: [],
+      order_status: "-3",
+      ids: [],
+      dialogVisible: false,
+      url: "",
+      loading: false,
+      subject_id: "",
+      subject_item: "",
+      download_loading: false,
+      more_search: false,
+      allocationDialogVisible:false
+    };
+  },
+  methods: {
+    goTo(path) {
+      let url = this.$router.resolve(path);
+      window.open(url.href, "_blank");
+    },
+    gopage(size) {
+      if (size) {
+        this.form.page_size = size;
+      }
+      this.form.page = this.$refs.pageButton.page;
+      this.getData();
+    },
+    getData() {
+      var parm = this.form;
+      if (parm.train_time1) {
+        parm.train_time = parm.train_time1.join(",");
+      }
+      this.loading = true;
+      if (this.order_status != "-3") {
+        parm.order_status = this.order_status;
+      } else {
+        parm.order_status = "";
+      }
+      this.$api.getSignList(parm).then((res) => {
+        let data = res.data.data.list;
+        for (let i = 0; i < data.length; i++) {
+          let item = data[i],
+            status = "",
+            pay_status = "",
+            verify = "",
+            bill_type = "";
+          if (item.pay_status) {
+            pay_status = "已支付";
+          } else {
+            pay_status = "未支付";
+          }
+          if (item.verify) {
+            verify = "已认证";
+          } else {
+            verify = "未认证";
+          }
+          if (item.bill_type == 0) bill_type = "不需要发票";
+          if (item.bill_type == 1) bill_type = "个人发票";
+          if (item.bill_type == 2) bill_type = "公司发票";
+          if (item.order_status == -2) status = "审核未通过";
+          if (item.order_status == -1) status = "待提交资料";
+          if (item.order_status == 0) status = "待审核";
+          if (item.order_status == 1) status = "已审核,待付款";
+          if (item.order_status == 2) status = "已付款,待培训";
+          if (item.order_status == 3) status = "已培训,待考试";
+          if (item.order_status == 7) status = "考试完成";
+          if (item.order_status == 9) status = "已取消";
+          item.order_status_1 = status;
+          item.pay_status_1 = pay_status;
+          item.verify_1 = verify;
+          item.bill_type_1 = bill_type;
+          if (!item.pay_status) {
+            item.price = "";
+          }
+        }
+        this.list = res.data.data.list;
+        this.total = res.data.data.total;
+        this.loading = false;
+      });
+    },
+    subChange(data) {
+      console.log(data);
+      this.form.subject_item = this.subject_item + "|" + data.join("|");
+      this.getData();
+    },
+    tabClick(tab) {
+      this.form.order_status = tab.name;
+      this.list = [];
+      this.getData();
+    },
+    del(id) {
+      this.$confirm("确定删除吗", "提示", {
+        type: "warning",
+      }).then(() => {
+        this.$api.deleteSign({ id: id }).then((res) => {
+          if (res.data.code == 0) {
+            this.$message({
+              message: "删除成功",
+              type: "success",
+            });
+            this.getData();
+          }
+        });
+      });
+    },
+    mark(id, val) {
+      this.$prompt("", "管理员备注", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        inputValue: val,
+      }).then(({ value }) => {
+        this.$api.updateSign({ id: id, admin_remark: value }).then((res) => {
+          if (res.data.code == 0) {
+            this.$message({ message: "备注成功!", type: "success" });
+            this.getData();
+          } else {
+            this.$message.error(res.data.message);
+          }
+        });
+      });
+    },
+    handleSelectionChange(val) {
+      this.ids = val;
+      console.log(val);
+    },
+    setStatus(type, text) {
+      var ids = [],
+        val = this.ids;
+      for (let i = 0; i < val.length; i++) {
+        ids.push(val[i].id);
+      }
+      var id = ids.join(",");
+      if (val.length > 0) {
+        this.$confirm("确定修改状态为" + text, "提示", {
+          type: "warning",
+        }).then(() => {
+          this.$api
+            .updateSignStu({ id: id, order_status: type })
+            .then((res) => {
+              if (!res.data.code) {
+                this.$message({
+                  message: "修改成功",
+                  type: "success",
+                });
+                this.getData();
+              } else {
+                this.$message.error(res.data.message);
+              }
+            });
+        });
+      } else {
+        this.$message.error("请选择数据");
+      }
+    },
+    setTime(type) {
+      var ids = [],
+        val = this.ids;
+      for (let i = 0; i < val.length; i++) {
+        ids.push(val[i].id);
+      }
+      var id = ids.join(",");
+      this.select_ids = id;
+      if (val.length > 0) {
+        this.date_type = type;
+        if (type == 1) {
+          this.dialogVisible = true;
+          this.text = "批量设置培训时间";
+        } else if (type == 2) {
+          this.dialogVisible = true;
+          this.text = "批量设置考试时间";
+        } else {
+          this.save();
+        }
+      } else {
+        this.$message.error("请选择数据");
+      }
+    },
+    save() {
+      var parm = { id: this.select_ids };
+      console.log(this.time);
+      if (this.date_type == 1) {
+        parm.train_time = this.time1.join(",");
+      } else if (this.date_type == 2) {
+        parm.exam_time = this.time2;
+      } else {
+        parm.classhour_cert_status = 1;
+      }
+      this.$api.updateSign(parm).then((res) => {
+        if (res.data.code == 0) {
+          this.$message({
+            message: "操作成功",
+            type: "success",
+          });
+          this.dialogVisible = false;
+          this.getData();
+        } else {
+          this.$message.error(res.data.message);
+        }
+      });
+    },
+    print() {
+      var newwindow = window.open("", "");
+      var tr = "",
+        th = "";
+      for (let i = 0; i < this.itemList.length; i++) {
+        let item = this.itemList[i];
+        th += `
+                <td>${item.name}</td>
+            `;
+      }
+      for (let i = 0; i < this.list.length; i++) {
+        let item = this.list[i];
+        let tds = "";
+        for (let j = 0; j < this.itemList.length; j++) {
+          let item_1 = this.itemList[j];
+          tds += `
+                    <td>${item[item_1.value] || " "}</td>
+                `;
+        }
+        tr += `<tr>${tds}</tr>`;
+      }
+      var table = `
+            <style>
+                td{text-align:center;padding:10px 0;color:#666;font-size:12px;}
+            </style>
+            <table style='border-collapse: collapse;border:none;border-color:#d9d9d9;padding:10px;' border='1' cellspacing='0' cellpadding='0' width='100%'>
+                <thead style="text-align:center;">
+                    ${th}
+                </thead>
+                ${tr}
+            </table>
+        `;
+      console.log(table);
+      newwindow.document.write(table);
+      newwindow.window.print();
+    },
+    download(type) {
+      var ids = [],
+        val = this.ids;
+      for (let i = 0; i < val.length; i++) {
+        ids.push(val[i].id);
+      }
+      var id = ids.join(",");
+      var parm = {
+        id: id,
+        type: type,
+      };
+      if (val.length > 0) {
+        this.download_loading = true;
+        this.$api.downloadzip(parm).then((res) => {
+          // if(res.data.code == 0){
+          var elink = document.createElement("a");
+          let blob = new Blob([res.data], { type: "application/zip" });
+          let objUrl = URL.createObjectURL(blob);
+          let file_name = res.headers["content-disposition"].split("=")[1];
+          elink.download = file_name;
+          elink.style.display = "none";
+          elink.href = objUrl;
+          document.body.appendChild(elink);
+          elink.click();
+          document.body.removeChild(elink);
+          this.download_loading = false;
+          // }else{
+          //     this.$message.error(res.data.message);
+          // }
+        });
+      } else {
+        this.$message.error("请选择数据");
+      }
+    },
+    allocation() {
+      if (this.ids.length < 1) {
+        this.$message.error("请选择学员!");
+        return false;
+      }
+      this.allocationDialogVisible = true;
+    },
+    doAllocationClass() {
+      if (!this.form.allocation_class_id) {
+        this.$message.error("请选择班级!");
+        return false;
+      }
+      let order_ids = [];
+      this.ids.forEach((item) => {
+        order_ids.push(item.id);
+      });
+      let params = {
+        ids: order_ids,
+        class_id: this.form.allocation_class_id,
+      };
+      this.$api.allocationClass(params).then((res) => {
+        this.allocationDialogVisible = false;
+        this.getData();
+      });
+    },
+  },
+  watch: {
+    $route(to) {
+      this.subject_id = false;
+      this.$nextTick(() => {
+        this.subject_id = to.path.split("/")[2];
+      });
+      this.$api.getSubList().then((res) => {
+        let data = res.data.data;
+        for (let i = 0; i < data.length; i++) {
+          if (data[i].id == this.subject_id) {
+            this.subject_item = data[i].name;
+            this.form.subject_item = data[i].name;
+          }
+        }
+        this.getData();
+      });
+    },
+  },
+  created() {
+    this.$api.getClass({ page_size: 1000 }).then((res) => {
+      this.class_list = res.data.data.list;
+    });
+    this.subject_id = this.$route.path.split("/")[2];
+    this.$api.getSubList().then((res) => {
+      let data = res.data.data;
+      for (let i = 0; i < data.length; i++) {
+        if (data[i].id == this.subject_id) {
+          this.subject_item = data[i].name;
+          this.form.subject_item = data[i].name;
+        }
+      }
+      this.getData();
+    });
+  },
+};
+</script>

+ 248 - 0
src/views/apply/Detail.vue

@@ -0,0 +1,248 @@
+<style lang="scss">
+    .detail{
+        display: flex;
+        justify-content: space-between;
+        margin-top: 20px;
+        
+        ul{
+            width: 32%;
+            background: #fff;
+            padding: 15px;
+            box-shadow:0px 4px 12px 0px rgba(0,0,0,0.12);
+            li{
+                list-style: none;
+                color: #666;
+                margin: 10px 0;
+                font-size: 14px;
+                border-bottom: 1px solid #d9d9d9;
+                padding: 15px 0;
+                &:last-child{
+                    border:none;
+                }
+                span{
+                    float: right;
+                    color: #222;
+                }
+                .el-icon-refresh-right{
+                    float: right;
+                    font-size: 18px;
+                    color:#409EFF;
+                    cursor: pointer;
+                }
+            }
+            .status{
+                span{
+                    position: relative;
+                    top: -10px;
+                }
+            }
+            .title{
+                font-weight: 600;
+                span{
+                    color:#fff;
+                }
+            }
+        }
+        div{
+            width: 67%;
+            display: flex;
+            justify-content: space-between;
+            flex-wrap: wrap;
+            ul{
+                width: 49%;
+                height: 300px;
+                margin-bottom: 15px;
+                overflow: hidden;
+                img{
+                    max-height: 200px;
+                }
+            }
+        }
+    }
+</style>
+<template>
+    <section class="edit">
+        <p>报名信息  >  报名详情 </p>
+        <div class="detail" v-if='form.id'>   
+           <ul>
+               <li class="title">报名信息 <el-tag size="mini" effect="dark">报</el-tag></li>
+               <li>
+                   管理员备注  <span>{{form.admin_remark}}</span>
+               </li>
+               <li>
+                   学员备注  <span>{{form.remark}}</span>
+               </li>
+               <li class="status">
+                   报名状态  
+                    <el-tag v-if='form.order_status == -2' type="info">审核未通过</el-tag>
+                    <el-tag v-if='form.order_status == -1' >待提交资料</el-tag>
+                    <el-tag v-if='form.order_status == 0' type="warning">待审核</el-tag>
+                    <el-tag v-if='form.order_status == 1' >已审核立即支付</el-tag>
+                    <el-tag v-if='form.order_status == 2' type="warning">学习中</el-tag>
+                    <el-tag v-if='form.order_status == 3' type="success">已培训</el-tag>
+                    <el-tag v-if='form.order_status == 4' type="success">已完成</el-tag>
+               </li>
+               <li>
+                   报名时间  <span>{{form.signup_time}}</span>
+               </li>
+               <li>
+                   考试时间  <span>{{form.exam_time}}</span>
+               </li>
+               <li>
+                   姓名  <span>{{form.name}}</span>
+               </li>
+               <li>
+                   性别  <span>{{form.sex}}</span>
+               </li>
+               <li>
+                   身份证号  <span>{{form.idno}}</span>
+               </li>
+               <li>
+                   手机号  <span>{{form.phone}}</span>
+               </li>
+               <li>
+                   学历  <span>{{form.education}}</span>
+               </li>
+               <li>
+                   报名类型  <span>{{form.train_type}}</span>
+               </li>
+               <li>
+                   作业类别  <span>{{form.subject_items[0]}}</span>
+               </li>
+               <li>
+                   准操项目  <span>{{form.subject_items[1]}}</span>
+               </li>
+               <li>
+                   培训类型  <span>{{form.subject_items[2]}}</span>
+               </li>
+               <li>
+                   发票类型  <span v-if='form.bill_type == 1'>不需要发票</span>
+                   <span v-if='form.bill_type == 2'>个人发票</span>
+                   <span v-if='form.bill_type == 3'>企业发票</span>
+               </li>
+               <li v-if='form.bill_type == 3'>
+                   税号  <span>{{form.bill_no}}</span>
+               </li>
+               <li>
+                   发票抬头  <span>{{form.bill_name}}</span>
+               </li>
+               <li>
+                   公司名称  <span>{{form.company}}</span>
+               </li>
+           </ul>
+           <div>
+                <ul style="height:390px">
+                    <li class="title">证件信息 <el-tag size="mini" type="warning" effect="dark">证</el-tag></li>
+                    <li>
+                        领证时间  <span>{{form.get_card_time}}</span>
+                    </li>
+                    <li>
+                        复审时间  <span>{{form.review_card_time}}</span>
+                    </li>
+                    <li>
+                        换证时间  <span>{{form.change_card_time}}</span>
+                    </li>
+                    <li>
+                        领证方式  <span>{{form.receive_card}}</span>
+                    </li>
+                    <li v-if='form.receive_card=="邮寄"'>
+                        邮寄地址  <span>{{form.area}}{{form.address}}</span>
+                    </li>
+                </ul>
+                <ul style="height:390px">
+                    <li class="title">订单详情 <el-tag size="mini" type="success" effect="dark">订</el-tag></li>
+                    <li>
+                        订单编号  <span>{{form.out_trade_no}}</span>
+                    </li>
+                    <li>
+                        下单时间  <span>{{form.ctime}}</span>
+                    </li>
+                    <li class="status">
+                        支付状态 
+                        <el-tag v-if='form.pay_status' type="success">已支付</el-tag>
+                        <el-tag v-else type="danger">未支付</el-tag>
+                    </li>
+                    <li>
+                        订单总额  <span>{{form.price}}</span>
+                    </li>
+                    <li>
+                        培训金额  <span>{{form.price}}</span>
+                    </li>
+                </ul>
+                <ul>
+                    <li class="title">身份证正面照  <i @click="rotate(form.idnoimg_face,'idnoimg_face')" class="el-icon-refresh-right"></i></li>
+                    <img width="100%" :src="form.idnoimg_face" alt="">
+                </ul>
+                <ul>
+                    <li class="title">身份证反面照 <i @click="rotate(form.idnoimg_back,'idnoimg_back')" class="el-icon-refresh-right"></i></li>
+                    <img width="100%" :src="form.idnoimg_back" alt="">
+                </ul>
+                <ul>
+                    <li class="title">半身照 <i @click="rotate(form.halfbody_img,'halfbody_img')" class="el-icon-refresh-right"></i></li>
+                    <img width="100%" :src="form.halfbody_img" alt="">
+                </ul>
+                <ul>
+                    <li class="title">学历照 <i @click="rotate(form.education_img,'education_img')" class="el-icon-refresh-right"></i></li>
+                    <img width="100%" :src="form.education_img" alt="">
+                </ul>
+                <ul v-if='form.has_healthimg'>
+                    <li class="title">体检表照片 <i @click="rotate(form.health_img,'health_img')" class="el-icon-refresh-right"></i></li>
+                    <img width="100%" :src="form.health_img" alt="">
+                </ul>
+                <ul v-if='form.train_type == "换证"||form.train_type=="复审"'>
+                    <li class="title">原证件照 <i @click="rotate(form.oldcard_img,'oldcard_img')" class="el-icon-refresh-right"></i></li>
+                    <img width="100%" :src="form.oldcard_img" alt="">
+                </ul>
+           </div>
+        </div>
+    </section>
+</template>
+<script>
+export default {
+
+  data(){
+    return{
+      idnoimg_face:"",
+      form:{},
+      radios:1,
+      id:'',
+      edu:["小学", "初中", "高中", "大专", "本科","硕士","博士"]
+    }
+  },
+  methods:{
+      getData(){
+          this.$api.getSign({id:this.id}).then(res=>{
+              this.form=res.data.data
+              this.idnoimg_face = res.data.data.idnoimg_face
+              this.form.subject_items=this.form.subject_item.split('|')
+              this.form.has_healthimg = this.form.subject_item.split('|')[0].indexOf("特种设备")!=-1
+          })
+      },
+      rotate(url,key){
+          this.$api.rotateImg({url:url.split("?")[0],id:this.form.id}).then(res=>{
+              if(res.data.code==0){
+                    let form=this.form;
+                    this.$set(this.form,key,res.data.data.url+"?v="+Date.parse(new Date()));
+                    this.form=form;
+                    this.idnoimg_face = res.data.data.url+"?v="+Date.parse(new Date());
+                    this.$message({message: '旋转成功!',type: 'success'});
+              }else{
+                  this.$message.error(res.data.message);
+              }
+              
+          })
+      }
+  },
+  created(){
+      if(this.$route.query.id){
+            this.id=this.$route.query.id
+            this.getData()
+        }
+  }
+}
+</script>
+
+
+
+
+

+ 208 - 0
src/views/apply/Edit.vue

@@ -0,0 +1,208 @@
+<style lang="scss">
+    .edit{
+        button{
+            position: relative;
+            width: 100%;
+        }
+        .el-input,.el-select,.el-cascader{
+            width: 100% !important;
+            position: relative;
+        }
+        .gou{
+                font-size: 20px;
+                position: absolute;
+                color: red;
+                left: -30px;
+        }
+        .el-form-item__label{
+            font-size: 16px;
+            font-weight: 600;
+            padding-right: 40px;
+        }
+        input[type='file']{
+            position: absolute;
+            width: 100%;
+            height: 100%;
+            left: 0;
+            top: 0;
+            opacity: 0;
+        }
+    }
+</style>
+<template>
+    <section class="edit">
+        <p>报名信息  >  修改信息 </p>
+        <div class="content">
+            <el-form label-width="110px">
+                <el-form-item label="报名身份" v-if="form.subject_item">
+                    <span v-show="form.subject_item" class="gou">✓</span>
+                    <Subject :value='form.subject_id' @subChange='subChange'/>
+                </el-form-item>
+                <el-form-item label="培训类型">
+                    <el-select v-model="form.train_type" placeholder="请选择" clearable>
+                        <el-option  label="新办"  value="新办"></el-option>
+                        <el-option  label="复审"  value="复审"></el-option>
+                        <el-option  label="换证"  value="换证"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="姓名">
+                         <span v-show="form.name" class="gou">✓</span>
+                        <el-input placeholder="姓名" v-model="form.name"></el-input>
+                </el-form-item>
+                <el-form-item label="性别">
+                    <span v-show="form.sex" class="gou">✓</span>
+                    <el-radio-group v-model="form.sex">
+                            <el-radio label="男">男</el-radio>
+                            <el-radio label="女">女</el-radio>
+                    </el-radio-group>
+                </el-form-item>
+                <el-form-item label="身份证">
+                        <span v-show="form.idno" class="gou">✓</span>
+                        <el-input placeholder="身份证" v-model="form.idno"></el-input>
+                </el-form-item>
+                <el-form-item label="手机号">
+                        <span v-show="form.phone" class="gou">✓</span>
+                        <el-input  v-model="form.phone"></el-input>
+                </el-form-item>
+                <el-form-item label="文化程度">
+                    <span v-show="form.education" class="gou">✓</span>
+                    <el-select v-model="form.education" placeholder="请选择">
+                        <el-option v-for="(item,index) in edu" :key='index' :label="item"  :value="item"></el-option>
+                    </el-select>
+                </el-form-item>
+                
+                <el-form-item label="单位全称">
+                    <span v-show="form.company" class="gou">✓</span>
+                        <el-input  v-model="form.company"></el-input>
+                </el-form-item>
+                <el-form-item label="发票类型">
+                    <el-select v-model="form.bill_type" placeholder="请选择" clearable>
+                        <el-option  label="不需要发票"  :value="1"></el-option>
+                        <el-option  label="个人发票"  :value="2"></el-option>
+                        <el-option  label="企业发票"  :value="3"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="发票方式" v-if='form.bill_type != 1'>
+                          <el-radio v-model="form.bill_type" label="1">纸质发票</el-radio>
+                </el-form-item>
+                <el-form-item label="税号" v-if='form.bill_type == 3'>
+                    <span v-show="form.bill_no" class="gou">✓</span>
+                        <el-input  v-model="form.bill_no"></el-input>
+                </el-form-item>
+                <el-form-item label="领证方式">
+                    <el-radio-group v-model="form.receive_card">
+                            <el-radio label="自取">自取</el-radio>
+                            <el-radio label="邮寄">邮寄(将产生邮寄费用)</el-radio>
+                    </el-radio-group>
+                </el-form-item>
+                <el-form-item label="地区" v-if='form.receive_card=="邮寄"'>
+                    <span v-show="form.area" class="gou">✓</span>
+                    <el-select v-model="form.area" placeholder="请选择" clearable>
+                        <el-option  label="重庆"  :value="0"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="详细地址" v-if='form.receive_card=="邮寄"'>
+                    <span v-show="form.address" class="gou">✓</span>
+                        <el-input  v-model="form.address"></el-input>
+                </el-form-item>
+                
+                <el-form-item label="">
+                        <template  v-if="form.idnoimg_face" >
+                            <img width="150" :src="form.idnoimg_face" alt=""> <br>
+                        </template>
+                        <el-button icon="el-icon-upload" type="warning">上传正面照 <input @change="upload('idnoimg_face')" id='idnoimg_face' type="file"> </el-button>
+                </el-form-item>
+                <el-form-item label="">
+                    <template  v-if="form.idnoimg_back" >
+                        <img width="150" :src="form.idnoimg_back" alt=""> <br>
+                    </template>
+                        <el-button icon="el-icon-upload" type="warning">上传反面照 <input @change="upload('idnoimg_back')" id='idnoimg_back' type="file"> </el-button>
+                </el-form-item>
+                <el-form-item label="">
+                        <template  v-if="form.halfbody_img" >
+                            <img width="150" :src="form.halfbody_img" alt=""> <br>
+                        </template>
+                        <el-button icon="el-icon-upload" type="warning">上传上半身照 <input @change="upload('halfbody_img')" id='halfbody_img' type="file"> </el-button>
+                </el-form-item>
+                <el-form-item label="">
+                        <template  v-if="form.education_img" >
+                            <img width="150" :src="form.education_img" alt=""> <br>
+                        </template>
+                        <el-button icon="el-icon-upload" type="warning">上传学历照 <input @change="upload('education_img')" id='education_img' type="file"> </el-button>
+                </el-form-item>
+                <el-form-item label="" v-if='form.train_type == "换证"||form.train_type == "复审"'>
+                        <template  v-if="form.oldcard_img" >
+                            <img width="150" :src="form.oldcard_img" alt=""> <br>
+                        </template>
+                        <el-button icon="el-icon-upload" type="warning">上传换证复审证件照 <input @change="upload('oldcard_img')" id='oldcard_img' type="file"> </el-button>
+                </el-form-item>
+                
+                <el-form-item label=" " >
+                        <el-button @click="save" type="primary">修改报名</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+    </section>
+</template>
+<script>
+import Subject from '../../components/Subject';
+export default {
+    components:{
+        Subject
+    },
+  data(){
+    return{
+      form:{},
+      radios:1,
+      edu:["小学", "初中", "高中", "大专", "本科","硕士","博士"]
+    }
+  },
+  methods:{
+      getData(){
+          this.$api.getSign({id:this.form.id}).then(res=>{
+              this.form=res.data.data
+          })
+      },
+      subChange(data,id,value){
+          this.form.subject_id=value[value.length-1]
+          this.form.subject_item=data.join('|')
+      },
+      upload(type){
+          var file=document.getElementById(type).files;
+          var data=new FormData();
+            data.append("file",file[0])
+          this.$api.uploadFile(data).then(res=>{
+              if(res.data.code==0){
+                      let form=this.form;
+                      this.$set(form,type,res.data.data.url)
+                      this.$message({message: '上传成功!',type: 'success'});
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+          })
+      },
+      save(){
+          var parm=this.form
+          this.$api.updateSign(parm).then(res=>{
+                if(res.data.code==0){
+                      this.$message({message: '修改成功!',type: 'success'});
+                      this.$router.go(-1);
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+          })
+      }
+  },
+  created(){
+      if(this.$route.query.id){
+            this.form.id=this.$route.query.id
+            this.getData()
+        }
+  }
+}
+</script>
+
+
+
+
+

+ 873 - 0
src/views/apply/New.vue

@@ -0,0 +1,873 @@
+<style lang="scss">
+.paydone {
+  color: #67c23a;
+}
+.unpay {
+  color: #ffb800;
+}
+.payprice {
+  color: #409eff;
+}
+.el-table td,
+.el-table th {
+  padding: 2px 2px !important;
+}
+</style>
+<template>
+  <section class="apply" v-loading="download_loading">
+    <p>报名列表 > {{ subject_item }} > 新办</p>
+    <div class="filter">
+      <el-form
+        label-width="75px"
+        :inline="true"
+        size="small"
+        style="position: relative"
+      >
+        <!-- <el-divider></el-divider> -->
+        <el-form-item label="培训项目">
+          <Subject
+            v-if="subject_id"
+            @subChange="subChange"
+            :key="key"
+            :subject_id="subject_id"
+          />
+        </el-form-item>
+        <el-form-item label="姓名" label-width="40px">
+          <el-input placeholder="姓名" v-model="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="身份证号" label-width="80px">
+          <el-input placeholder="身份证号" v-model="form.idno"></el-input>
+        </el-form-item>
+        <el-form-item label="联系电话">
+          <el-input placeholder="联系电话" v-model="form.phone"></el-input>
+        </el-form-item>
+        <el-form-item label="公司名称">
+          <el-input placeholder="公司名称" v-model="form.company"></el-input>
+        </el-form-item>
+        <el-form-item label="报名时间" v-if="more_search">
+          <el-date-picker
+            clearable
+            v-model="form.signup_time"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="发票类型" v-if="more_search">
+          <el-select v-model="form.bill_type" placeholder="请选择" clearable>
+            <el-option label="不需要发票" :value="0"></el-option>
+            <el-option label="个人发票" :value="1"></el-option>
+            <el-option label="公司发票" :value="2"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="领证方式" clearable v-if="more_search">
+          <el-select v-model="form.receive_card" placeholder="请选择">
+            <el-option label="邮寄" :value="1"></el-option>
+            <el-option label="自取" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="考试设置" v-if="more_search">
+          <el-select
+            v-model="form.set_exam_time"
+            placeholder="请选择"
+            clearable
+          >
+            <el-option label="已设置考试时间" :value="1"></el-option>
+            <el-option label="未设置考试时间" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="考试时间" v-if="more_search">
+          <el-date-picker
+            clearable
+            v-model="form.exam_time"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            type="datetime"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="培训班级" v-if="more_search">
+          <el-select
+            v-model="form.class_id"
+            placeholder="请选择"
+            clearable
+            @clear="getData"
+          >
+            <el-option
+              v-for="(item, index) in class_list"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="培训时间" v-if="more_search">
+          <el-date-picker
+            clearable
+            v-model="form.train_time1"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <span
+            @click="more_search = !more_search"
+            style="font-size: 12px; color: #999; cursor: pointer"
+          >
+            高级搜索</span
+          >
+          <i
+            v-if="!more_search"
+            @click="more_search = !more_search"
+            class="el-icon-arrow-down"
+          ></i>
+          <i
+            v-else
+            @click="more_search = !more_search"
+            class="el-icon-arrow-up"
+          ></i>
+        </el-form-item>
+        <el-form-item style="">
+          <el-button
+            @click="(list = []), (form.page = 1), getData()"
+            type="primary"
+            icon="el-icon-search"
+            >搜索</el-button
+          >
+        </el-form-item>
+
+        <el-divider></el-divider>
+      </el-form>
+      <el-tabs v-model="order_status" @tab-click="tabClick">
+        <el-tab-pane name="-3" label="报名列表"></el-tab-pane>
+        <el-tab-pane name="-1" label="待上传资料"></el-tab-pane>
+        <el-tab-pane name="0" label="审核中"></el-tab-pane>
+        <el-tab-pane name="-2" label="审核未通过"></el-tab-pane>
+        <el-tab-pane name="1" label="待付款"></el-tab-pane>
+        <el-tab-pane name="2" label="已付款,待培训"></el-tab-pane>
+        <el-tab-pane name="3" label="已培训,待考试"></el-tab-pane>
+        <el-tab-pane name="7" label="考试完成"></el-tab-pane>
+        <el-tab-pane name="9" label="已取消"></el-tab-pane>
+      </el-tabs>
+    </div>
+    <div class="divider">
+      <el-button @click="setStatus(1, '审核通过')" size="small" type="success"
+        >通过审核</el-button
+      >
+      <el-button @click="setStatus(-2, '审核不通过')" size="small" type="info"
+        >审核不通过</el-button
+      >
+      <el-button @click="setStatus(2, '已付款')" size="small" type="primary"
+        >已付款</el-button
+      >
+      <el-button
+        @click="setStatus(3, '已培训,待考试')"
+        size="small"
+        type="warning"
+        >已培训,待考试</el-button
+      >
+      <el-button @click="setStatus(7, '考试完成')" size="small" type="success"
+        >考试完成</el-button
+      >
+      <el-button @click="setStatus(9, '已取消')" size="small" type="danger"
+        >已取消</el-button
+      >
+      <el-divider direction="vertical"></el-divider>
+
+      &nbsp;
+      <el-button
+        style="float: right"
+        @click="print"
+        type="primary"
+        size="mini"
+        plain
+        icon="el-icon-printer"
+      ></el-button>
+      &nbsp;&nbsp;
+      <el-dropdown trigger="click" style="float: right; margin-right: 5px">
+        <el-button type="primary" size="mini" plain icon="el-icon-finished">
+        </el-button>
+        <el-dropdown-menu slot="dropdown">
+          <!-- <el-dropdown-item>姓名</el-dropdown-item> -->
+          <div class="checkList">
+            <p v-for="(item, index) in itemList" :key="index">
+              <el-checkbox
+                v-model="item.checked"
+                :label="item.name"
+              ></el-checkbox>
+            </p>
+          </div>
+        </el-dropdown-menu>
+      </el-dropdown>
+      &nbsp;&nbsp;
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="download('apply')"
+        size="small"
+        type="info"
+        >导出学员申报资料</el-button
+      >
+      &nbsp;&nbsp;
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="download('exam')"
+        size="small"
+        type="success"
+        >导出考勤表与申报考试表</el-button
+      >
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="setTime(2)"
+        size="small"
+        type="primary"
+        >设置考试时间</el-button
+      >
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="setTime(1)"
+        size="small"
+        type="primary"
+        >设置培训时间</el-button
+      >
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="allocation()"
+        size="small"
+        type="success"
+        >学员分班</el-button
+      >
+      <!--<el-button style="float:right;margin-right:5px" @click="setTime(3)" size="small" type="primary" >生成学时证明</el-button>-->
+    </div>
+    <el-table
+      class="table"
+      :fit="true"
+      :data="list"
+      v-loading="loading"
+      @selection-change="handleSelectionChange"
+      border
+      style="width: 100%"
+    >
+      <el-table-column type="selection" fixed="left" width="45">
+      </el-table-column>
+      <template v-for="(item, index) in itemList">
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '支付状态'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <span v-if="scope.row.pay_status" class="paydone">已支付</span>
+            <span v-else class="unpay">未支付</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '支付金额'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <span class="payprice">{{ scope.row.price }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '学时证明'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <a
+              v-if="scope.row.classhour_cert_url"
+              target="_blank"
+              :href="scope.row.classhour_cert_url"
+              >已生成</a
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '状态'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == -2"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == -1"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 0"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 1"
+              type="danger"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 2"
+              type="primary"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 7"
+              type="success"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 3"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 9"
+              type="danger"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="
+            item.checked &&
+            item.name != '状态' &&
+            item.name != '学时证明' &&
+            item.name != '支付状态' &&
+            item.name != '支付金额'
+          "
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+      </template>
+      <el-table-column prop="zip" width="220" fixed="right" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            @click="goTo({ path: '/sign/detail', query: { id: scope.row.id } })"
+            size="mini"
+            type="success"
+            >详情</el-button
+          >
+          <el-button
+            @click="goTo({ path: '/sign/edit', query: { id: scope.row.id } })"
+            size="mini"
+            type="warning"
+            >编辑</el-button
+          >
+          <el-button
+            @click="mark(scope.row.id, scope.row.admin_remark)"
+            size="mini"
+            type="primary"
+            >备注</el-button
+          >
+          <el-button @click="del(scope.row.id)" size="mini" type="danger"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <Page ref="pageButton" :total="total" @pageChange="gopage" />
+
+    <el-dialog :title="text" :visible.sync="dialogVisible" width="30%">
+      <el-date-picker
+        v-model="time1"
+        v-show="date_type == 1"
+        type="datetimerange"
+        value-format="yyyy-MM-dd HH:mm:ss"
+        range-separator="至"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期"
+      >
+      </el-date-picker>
+      <el-date-picker
+        v-model="time2"
+        v-show="date_type == 2"
+        type="datetime"
+        value-format="yyyy-MM-dd HH:mm:ss"
+      >
+      </el-date-picker>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="save">确 定</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 学员分班 -->
+    <el-dialog
+        title="学员分班"
+        :visible.sync="allocationDialogVisible"
+        width="500px">
+        <div>
+            <el-form ref="form" :model="form" label-width="80px">
+                <el-form-item label="培训班级">
+                    <el-select v-model="form.allocation_class_id" placeholder="请选择班级" size="middle">
+                        <el-option
+                            v-for="item in class_list"
+                            :key="item.id"
+                            :label="item.name"
+                            :value="item.id">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+        </div>
+        <div slot="footer">
+            <el-button @click="allocationDialogVisible = false">取 消</el-button>
+            <el-button type="primary" @click="doAllocationClass">确 定</el-button>
+        </div>
+    </el-dialog>
+  </section>
+</template>
+<script>
+import Page from "../../components/Page";
+import Subject from "../../components/Subject";
+// import { Base64 } from 'js-base64';
+export default {
+  components: {
+    Page,
+    Subject,
+  },
+  data() {
+    return {
+      key: 1,
+      checkList: [],
+      itemList: [
+        { name: "姓名", value: "name", checked: true, width: "70px" },
+        { name: "联系电话", value: "phone", checked: true, width: "120px" },
+        {
+          name: "状态",
+          value: "order_status_1",
+          checked: true,
+          width: "115px",
+        },
+        { name: "支付状态", value: "pay_status_1", checked: true },
+        { name: "支付金额", value: "price", checked: true },
+        {
+          name: "管理员备注",
+          value: "admin_remark",
+          checked: true,
+          width: "150px",
+        },
+        {
+          name: "报名类型",
+          value: "subject_item0",
+          checked: true,
+          width: "120px",
+        },
+        {
+          name: "作业类别",
+          value: "subject_item1",
+          checked: true,
+          width: "150px",
+        },
+        {
+          name: "准操项目",
+          value: "subject_item2",
+          checked: true,
+          width: "200px",
+        },
+        { name: "培训类型", value: "train_type", checked: true, width: "90px" },
+        { name: "分班信息", value: "class_name", checked: true, width: "90px" },
+        {
+          name: "学时证明",
+          value: "classhour_cert_url",
+          checked: true,
+          width: "90px",
+        },
+        {
+          name: "培训时间",
+          value: "train_time",
+          checked: true,
+          width: "200px",
+        },
+        { name: "考试时间", value: "exam_time", checked: true, width: "150px" },
+        {
+          name: "更新时间",
+          value: "update_time",
+          checked: true,
+          width: "170px",
+        },
+        { name: "报名时间", value: "ctime", checked: true, width: "150px" },
+        { name: "公司名称", value: "company", checked: true, width: "200px" },
+        {
+          name: "发票类型",
+          value: "bill_type_1",
+          checked: false,
+          width: "120px",
+        },
+        { name: "领证方式", value: "receive_card", checked: false },
+        { name: "实名认证", value: "verify_1", checked: true },
+        { name: "ID", value: "id", checked: false },
+      ],
+      class_list: [],
+      text: "批量设置培训时间",
+      date_type: 1,
+      time1: null,
+      time2: "",
+      form: {
+        train_type: "新办",
+        subject_item: "",
+        order_status: "",
+        page: 1,
+        page_size: 20,
+      },
+      activeName: "1",
+      total: 1,
+      list: [],
+      order_status: "-3",
+      ids: [],
+      dialogVisible: false,
+      url: "",
+      loading: false,
+      subject_id: "",
+      subject_item: "",
+      download_loading: false,
+      more_search: false,
+      allocationDialogVisible:false
+    };
+  },
+  methods: {
+    goTo(path) {
+      let url = this.$router.resolve(path);
+      window.open(url.href, "_blank");
+    },
+    gopage(size) {
+      if (size) {
+        this.form.page_size = size;
+      }
+      this.form.page = this.$refs.pageButton.page;
+      this.getData();
+    },
+    getData() {
+      var parm = this.form;
+      if (parm.train_time1) {
+        parm.train_time = parm.train_time1.join(",");
+      }
+      this.loading = true;
+      if (this.order_status != "-3") {
+        parm.order_status = this.order_status;
+      } else {
+        parm.order_status = "";
+      }
+      this.$api.getSignList(parm).then((res) => {
+        let data = res.data.data.list;
+        for (let i = 0; i < data.length; i++) {
+          let item = data[i],
+            status = "",
+            pay_status = "",
+            verify = "",
+            bill_type = "";
+          if (item.pay_status) {
+            pay_status = "已支付";
+          } else {
+            pay_status = "未支付";
+          }
+          if (item.verify) {
+            verify = "已认证";
+          } else {
+            verify = "未认证";
+          }
+          if (item.bill_type == 0) bill_type = "不需要发票";
+          if (item.bill_type == 1) bill_type = "个人发票";
+          if (item.bill_type == 2) bill_type = "公司发票";
+          if (item.order_status == -2) status = "审核未通过";
+          if (item.order_status == -1) status = "待提交资料";
+          if (item.order_status == 0) status = "待审核";
+          if (item.order_status == 1) status = "已审核,待付款";
+          if (item.order_status == 2) status = "已付款,待培训";
+          if (item.order_status == 3) status = "已培训,待考试";
+          if (item.order_status == 7) status = "考试完成";
+          if (item.order_status == 9) status = "已取消";
+          item.order_status_1 = status;
+          item.pay_status_1 = pay_status;
+          item.verify_1 = verify;
+          item.bill_type_1 = bill_type;
+          if (!item.pay_status) {
+            item.price = "";
+          }
+        }
+        this.list = res.data.data.list;
+        this.total = res.data.data.total;
+        this.loading = false;
+      });
+    },
+    subChange(data) {
+      this.form.subject_item = this.subject_item + "|" + data.join("|");
+      this.getData();
+    },
+    tabClick(tab) {
+      this.form.order_status = tab.name;
+      this.list = [];
+      this.getData();
+    },
+    del(id) {
+      this.$confirm("确定删除吗", "提示", {
+        type: "warning",
+      }).then(() => {
+        this.$api.deleteSign({ id: id }).then((res) => {
+          if (res.data.code == 0) {
+            this.$message({
+              message: "删除成功",
+              type: "success",
+            });
+            this.getData();
+          }
+        });
+      });
+    },
+    mark(id, val) {
+      this.$prompt("", "管理员备注", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        inputValue: val,
+      }).then(({ value }) => {
+        this.$api.updateSign({ id: id, admin_remark: value }).then((res) => {
+          if (res.data.code == 0) {
+            this.$message({ message: "备注成功!", type: "success" });
+            this.getData();
+          } else {
+            this.$message.error(res.data.message);
+          }
+        });
+      });
+    },
+    handleSelectionChange(val) {
+      this.ids = val;
+    },
+    setStatus(type, text) {
+      var ids = [],
+        val = this.ids;
+      for (let i = 0; i < val.length; i++) {
+        ids.push(val[i].id);
+      }
+      var id = ids.join(",");
+      if (val.length > 0) {
+        this.$confirm("确定修改状态为" + text, "提示", {
+          type: "warning",
+        }).then(() => {
+          this.$api
+            .updateSignStu({ id: id, order_status: type })
+            .then((res) => {
+              if (!res.data.code) {
+                this.$message({
+                  message: "修改成功",
+                  type: "success",
+                });
+                this.getData();
+              } else {
+                this.$message.error(res.data.message);
+              }
+            });
+        });
+      } else {
+        this.$message.error("请选择数据");
+      }
+    },
+    setTime(type) {
+      var ids = [],
+        val = this.ids;
+      for (let i = 0; i < val.length; i++) {
+        ids.push(val[i].id);
+      }
+      var id = ids.join(",");
+      this.select_ids = id;
+      if (val.length > 0) {
+        this.date_type = type;
+        if (type == 1) {
+          this.dialogVisible = true;
+          this.text = "批量设置培训时间";
+        } else if (type == 2) {
+          this.dialogVisible = true;
+          this.text = "批量设置考试时间";
+        } else {
+          this.save();
+        }
+      } else {
+        this.$message.error("请选择数据");
+      }
+    },
+    save() {
+      var parm = { id: this.select_ids };
+      if (this.date_type == 1) {
+        parm.train_time = this.time1.join(",");
+      } else if (this.date_type == 2) {
+        parm.exam_time = this.time2;
+      } else {
+        parm.classhour_cert_status = 1;
+      }
+      this.$api.updateSign(parm).then((res) => {
+        if (res.data.code == 0) {
+          this.$message({
+            message: "操作成功",
+            type: "success",
+          });
+          this.dialogVisible = false;
+          this.getData();
+        } else {
+          this.$message.error(res.data.message);
+        }
+      });
+    },
+    print() {
+      var newwindow = window.open("", "");
+      var tr = "",
+        th = "";
+      for (let i = 0; i < this.itemList.length; i++) {
+        let item = this.itemList[i];
+        th += `
+                <td>${item.name}</td>
+            `;
+      }
+      for (let i = 0; i < this.list.length; i++) {
+        let item = this.list[i];
+        let tds = "";
+        for (let j = 0; j < this.itemList.length; j++) {
+          let item_1 = this.itemList[j];
+          tds += `
+                    <td>${item[item_1.value] || " "}</td>
+                `;
+        }
+        tr += `<tr>${tds}</tr>`;
+      }
+      var table = `
+            <style>
+                td{text-align:center;padding:10px 0;color:#666;font-size:12px;}
+            </style>
+            <table style='border-collapse: collapse;border:none;border-color:#d9d9d9;padding:10px;' border='1' cellspacing='0' cellpadding='0' width='100%'>
+                <thead style="text-align:center;">
+                    ${th}
+                </thead>
+                ${tr}
+            </table>
+        `;
+      newwindow.document.write(table);
+      newwindow.window.print();
+    },
+    download(type) {
+      var ids = [],
+        val = this.ids;
+      for (let i = 0; i < val.length; i++) {
+        ids.push(val[i].id);
+      }
+      var id = ids.join(",");
+      var parm = {
+        id: id,
+        type: type,
+      };
+      if (val.length > 0) {
+        this.download_loading = true;
+        this.$api.downloadzip(parm).then((res) => {
+          // if(res.data.code == 0){
+          var elink = document.createElement("a");
+          let blob = new Blob([res.data], { type: "application/zip" });
+          let objUrl = URL.createObjectURL(blob);
+          let file_name = res.headers["content-disposition"].split("=")[1];
+          elink.download = file_name;
+          elink.style.display = "none";
+          elink.href = objUrl;
+          document.body.appendChild(elink);
+          elink.click();
+          document.body.removeChild(elink);
+          this.download_loading = false;
+          // }else{
+          //     this.$message.error(res.data.message);
+          // }
+        });
+      } else {
+        this.$message.error("请选择数据");
+      }
+    },
+    allocation(){
+        if(this.ids.length<1){
+            this.$message.error("请选择学员!");
+            return false;
+        }   
+        this.allocationDialogVisible = true;
+    },
+    doAllocationClass(){
+        if(!this.form.allocation_class_id){
+            this.$message.error("请选择班级!");
+            return false;
+        }
+        let order_ids = [];
+        this.ids.forEach((item)=>{
+            order_ids.push(item.id);
+        })
+        let params = {
+            ids:order_ids,
+            class_id:this.form.allocation_class_id
+        }
+        this.$api.allocationClass(params).then(res=>{
+            this.allocationDialogVisible = false
+            this.getData();
+        })
+    }
+  },
+  watch: {
+    $route(to) {
+      this.subject_id = false;
+      this.$nextTick(() => {
+        this.subject_id = to.path.split("/")[2];
+      });
+      this.$api.getSubList().then((res) => {
+        let data = res.data.data;
+        for (let i = 0; i < data.length; i++) {
+          if (data[i].id == this.subject_id) {
+            this.subject_item = data[i].name;
+            this.form.subject_item = data[i].name;
+          }
+        }
+        this.getData();
+      });
+    },
+  },
+  created() {
+    this.$api.getClass({ page_size: 1000 }).then((res) => {
+      this.class_list = res.data.data.list;
+    });
+    this.subject_id = this.$route.path.split("/")[2];
+    this.$api.getSubList().then((res) => {
+      let data = res.data.data;
+      for (let i = 0; i < data.length; i++) {
+        if (data[i].id == this.subject_id) {
+          this.subject_item = data[i].name;
+          this.form.subject_item = data[i].name;
+        }
+      }
+      this.getData();
+    });
+  },
+};
+</script>

+ 876 - 0
src/views/apply/Update.vue

@@ -0,0 +1,876 @@
+<style lang="scss">
+.paydone {
+  color: #67c23a;
+}
+.unpay {
+  color: #ffb800;
+}
+.payprice {
+  color: #409eff;
+}
+.el-table td,
+.el-table th {
+  padding: 5px 0 !important;
+}
+</style>
+<template>
+  <section class="apply">
+    <p>报名列表 > {{ subject_item }} > 复审</p>
+    <div class="filter">
+      <el-form
+        label-width="75px"
+        :inline="true"
+        size="small"
+        style="position: relative"
+      >
+        <!-- <el-divider></el-divider> -->
+        <el-form-item label="培训项目">
+          <Subject
+            v-if="subject_id"
+            @subChange="subChange"
+            :key="key"
+            :subject_id="subject_id"
+          />
+        </el-form-item>
+        <el-form-item label="姓名" label-width="40px">
+          <el-input placeholder="姓名" v-model="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="身份证号" label-width="80px">
+          <el-input placeholder="身份证号" v-model="form.idno"></el-input>
+        </el-form-item>
+        <el-form-item label="联系电话">
+          <el-input placeholder="联系电话" v-model="form.phone"></el-input>
+        </el-form-item>
+        <el-form-item label="公司名称">
+          <el-input placeholder="公司名称" v-model="form.company"></el-input>
+        </el-form-item>
+        <el-form-item label="报名时间" v-if="more_search">
+          <el-date-picker
+            clearable
+            v-model="form.signup_time"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="发票类型" v-if="more_search">
+          <el-select v-model="form.bill_type" placeholder="请选择" clearable>
+            <el-option label="不需要发票" :value="0"></el-option>
+            <el-option label="个人发票" :value="1"></el-option>
+            <el-option label="公司发票" :value="2"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="领证方式" clearable v-if="more_search">
+          <el-select v-model="form.receive_card" placeholder="请选择">
+            <el-option label="邮寄" :value="1"></el-option>
+            <el-option label="自取" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="考试设置" v-if="more_search">
+          <el-select
+            v-model="form.set_exam_time"
+            placeholder="请选择"
+            clearable
+          >
+            <el-option label="已设置考试时间" :value="1"></el-option>
+            <el-option label="未设置考试时间" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="考试时间" v-if="more_search">
+          <el-date-picker
+            clearable
+            v-model="form.exam_time"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            type="datetime"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="培训班级" v-if="more_search">
+          <el-select
+            v-model="form.class_id"
+            placeholder="请选择"
+            clearable
+            @clear="getData"
+          >
+            <el-option
+              v-for="(item, index) in class_list"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="培训时间" v-if="more_search">
+          <el-date-picker
+            clearable
+            v-model="form.train_time1"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <span
+            @click="more_search = !more_search"
+            style="font-size: 12px; color: #999; cursor: pointer"
+          >
+            高级搜索</span
+          >
+          <i
+            v-if="!more_search"
+            @click="more_search = !more_search"
+            class="el-icon-arrow-down"
+          ></i>
+          <i
+            v-else
+            @click="more_search = !more_search"
+            class="el-icon-arrow-up"
+          ></i>
+        </el-form-item>
+        <el-form-item style="">
+          <el-button
+            @click="(list = []), (form.page = 1), getData()"
+            type="primary"
+            icon="el-icon-search"
+            >搜索</el-button
+          >
+        </el-form-item>
+
+        <el-divider></el-divider>
+      </el-form>
+      <el-tabs v-model="order_status" @tab-click="tabClick">
+        <el-tab-pane name="-3" label="报名列表"></el-tab-pane>
+        <el-tab-pane name="-1" label="待上传资料"></el-tab-pane>
+        <el-tab-pane name="0" label="审核中"></el-tab-pane>
+        <el-tab-pane name="-2" label="审核未通过"></el-tab-pane>
+        <el-tab-pane name="1" label="待付款"></el-tab-pane>
+        <el-tab-pane name="2" label="已付款,待培训"></el-tab-pane>
+        <el-tab-pane name="7" label="已培训,待考试"></el-tab-pane>
+        <el-tab-pane name="3" label="考试完成"></el-tab-pane>
+        <el-tab-pane name="9" label="已取消"></el-tab-pane>
+      </el-tabs>
+    </div>
+    <div class="divider">
+      <el-button @click="setStatus(1, '审核通过')" size="small" type="success"
+        >通过审核</el-button
+      >
+      <el-button @click="setStatus(-2, '审核不通过')" size="small" type="info"
+        >审核不通过</el-button
+      >
+      <el-button @click="setStatus(2, '已付款')" size="small" type="primary"
+        >已付款</el-button
+      >
+      <el-button
+        @click="setStatus(3, '已培训,待考试')"
+        size="small"
+        type="warning"
+        >已培训,待考试</el-button
+      >
+      <el-button @click="setStatus(7, '考试完成')" size="small" type="success"
+        >考试完成</el-button
+      >
+      <el-button @click="setStatus(9, '已取消')" size="small" type="danger"
+        >已取消</el-button
+      >
+      <el-divider direction="vertical"></el-divider>
+
+      &nbsp;
+      <el-button
+        style="float: right"
+        @click="print"
+        type="primary"
+        size="mini"
+        plain
+        icon="el-icon-printer"
+      ></el-button>
+      &nbsp;&nbsp;
+      <el-dropdown trigger="click" style="float: right; margin-right: 5px">
+        <el-button type="primary" size="mini" plain icon="el-icon-finished">
+        </el-button>
+        <el-dropdown-menu slot="dropdown">
+          <!-- <el-dropdown-item>姓名</el-dropdown-item> -->
+          <div class="checkList">
+            <p v-for="(item, index) in itemList" :key="index">
+              <el-checkbox
+                v-model="item.checked"
+                :label="item.name"
+              ></el-checkbox>
+            </p>
+          </div>
+        </el-dropdown-menu>
+      </el-dropdown>
+      &nbsp;&nbsp;
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="download('apply')"
+        size="small"
+        type="info"
+        >导出学员申报资料</el-button
+      >
+      &nbsp;&nbsp;
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="download('exam')"
+        size="small"
+        type="success"
+        >导出考勤表与申报考试表</el-button
+      >
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="setTime(2)"
+        size="small"
+        type="primary"
+        >设置考试时间</el-button
+      >
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="setTime(1)"
+        size="small"
+        type="primary"
+        >设置培训时间</el-button
+      >
+      <el-button
+        style="float: right; margin-right: 5px"
+        @click="allocation()"
+        size="small"
+        type="success"
+        >学员分班</el-button
+      >
+      <!--<el-button style="float:right;margin-right:5px" @click="setTime(3)" size="small" type="primary" >生成学时证明</el-button>-->
+    </div>
+    <el-table
+      class="table"
+      :fit="true"
+      :data="list"
+      v-loading="loading"
+      @selection-change="handleSelectionChange"
+      border
+      style="width: 100%"
+    >
+      <el-table-column type="selection" fixed="left" width="45">
+      </el-table-column>
+      <template v-for="(item, index) in itemList">
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '支付状态'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <span v-if="scope.row.pay_status" class="paydone">已支付</span>
+            <span v-else class="unpay">未支付</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '支付金额'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <span class="payprice">{{ scope.row.price }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '学时证明'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <a
+              v-if="scope.row.classhour_cert_url"
+              target="_blank"
+              :href="scope.row.classhour_cert_url"
+              >已生成</a
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="item.checked && item.name == '状态'"
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :class-name="item.value"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == -2"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == -1"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 0"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 1"
+              type="danger"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 2"
+              type="primary"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 7"
+              type="success"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 3"
+              type="warning"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+            <el-button
+              size="mini"
+              v-if="scope.row.order_status == 9"
+              type="danger"
+              >{{ scope.row.order_status_1 }}</el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          :key="index"
+          v-if="
+            item.checked &&
+            item.name != '状态' &&
+            item.name != '学时证明' &&
+            item.name != '支付状态' &&
+            item.name != '支付金额'
+          "
+          :width="item.width"
+          :prop="item.value"
+          :label="item.name"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+      </template>
+      <el-table-column prop="zip" width="220" fixed="right" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            @click="goTo({ path: '/sign/detail', query: { id: scope.row.id } })"
+            size="mini"
+            type="success"
+            >详情</el-button
+          >
+          <el-button
+            @click="goTo({ path: '/sign/edit', query: { id: scope.row.id } })"
+            size="mini"
+            type="warning"
+            >编辑</el-button
+          >
+          <el-button
+            @click="mark(scope.row.id, scope.row.admin_remark)"
+            size="mini"
+            type="primary"
+            >备注</el-button
+          >
+          <el-button @click="del(scope.row.id)" size="mini" type="danger"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <Page ref="pageButton" :total="total" @pageChange="gopage" />
+
+    <el-dialog :title="text" :visible.sync="dialogVisible" width="30%">
+      <el-date-picker
+        v-model="time1"
+        v-show="date_type == 1"
+        type="datetimerange"
+        value-format="yyyy-MM-dd HH:mm:ss"
+        range-separator="至"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期"
+      >
+      </el-date-picker>
+      <el-date-picker
+        v-model="time2"
+        v-show="date_type == 2"
+        type="datetime"
+        value-format="yyyy-MM-dd HH:mm:ss"
+      >
+      </el-date-picker>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="save">确 定</el-button>
+      </span>
+    </el-dialog>
+    <!-- 学员分班 -->
+    <el-dialog
+        title="学员分班"
+        :visible.sync="allocationDialogVisible"
+        width="500px">
+        <div>
+            <el-form ref="form" :model="form" label-width="80px">
+                <el-form-item label="培训班级">
+                    <el-select v-model="form.allocation_class_id" placeholder="请选择班级" size="middle">
+                        <el-option
+                            v-for="item in class_list"
+                            :key="item.id"
+                            :label="item.name"
+                            :value="item.id">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+        </div>
+        <div slot="footer">
+            <el-button @click="allocationDialogVisible = false">取 消</el-button>
+            <el-button type="primary" @click="doAllocationClass">确 定</el-button>
+        </div>
+    </el-dialog>
+  </section>
+</template>
+<script>
+import Page from "../../components/Page";
+import Subject from "../../components/Subject";
+// import { Base64 } from 'js-base64';
+export default {
+  components: {
+    Page,
+    Subject,
+  },
+  data() {
+    return {
+      key: 1,
+      checkList: [],
+      class_list: [],
+      itemList: [
+        { name: "姓名", value: "name", checked: true, width: "70px" },
+        { name: "联系电话", value: "phone", checked: true, width: "120px" },
+        {
+          name: "状态",
+          value: "order_status_1",
+          checked: true,
+          width: "115px",
+        },
+        { name: "支付状态", value: "pay_status_1", checked: true },
+        { name: "支付金额", value: "price", checked: true },
+        {
+          name: "管理员备注",
+          value: "admin_remark",
+          checked: true,
+          width: "150px",
+        },
+        {
+          name: "报名类型",
+          value: "subject_item0",
+          checked: true,
+          width: "120px",
+        },
+        {
+          name: "作业类别",
+          value: "subject_item1",
+          checked: true,
+          width: "150px",
+        },
+        {
+          name: "准操项目",
+          value: "subject_item2",
+          checked: true,
+          width: "200px",
+        },
+        { name: "培训类型", value: "train_type", checked: true, width: "90px" },
+        { name: "分班信息", value: "class_name", checked: true, width: "90px" },
+        {
+          name: "学时证明",
+          value: "classhour_cert_url",
+          checked: true,
+          width: "90px",
+        },
+        {
+          name: "培训时间",
+          value: "train_time",
+          checked: true,
+          width: "200px",
+        },
+        { name: "考试时间", value: "exam_time", checked: true, width: "150px" },
+        {
+          name: "更新时间",
+          value: "update_time",
+          checked: true,
+          width: "170px",
+        },
+        { name: "报名时间", value: "ctime", checked: true, width: "150px" },
+        { name: "公司名称", value: "company", checked: true, width: "200px" },
+        {
+          name: "发票类型",
+          value: "bill_type_1",
+          checked: false,
+          width: "120px",
+        },
+        { name: "领证方式", value: "receive_card", checked: false },
+        { name: "实名认证", value: "verify_1", checked: true },
+        { name: "ID", value: "id", checked: false },
+      ],
+      text: "批量设置培训时间",
+      date_type: 1,
+      time1: null,
+      time2: "",
+      form: {
+        train_type: "复审",
+        subject_item: "",
+        order_status: "",
+        page: 1,
+        page_size: 20,
+      },
+      activeName: "1",
+      total: 1,
+      list: [],
+      order_status: "-3",
+      ids: [],
+      dialogVisible: false,
+      url: "",
+      loading: false,
+      subject_id: "",
+      subject_item: "",
+      download_loading: false,
+      more_search: false,
+      allocationDialogVisible:false
+    };
+  },
+  methods: {
+    goTo(path) {
+      let url = this.$router.resolve(path);
+      window.open(url.href, "_blank");
+    },
+    gopage(size) {
+      if (size) {
+        this.form.page_size = size;
+      }
+      this.form.page = this.$refs.pageButton.page;
+      this.getData();
+    },
+    getData() {
+      var parm = this.form;
+      if (parm.train_time1) {
+        parm.train_time = parm.train_time1.join(",");
+      }
+      this.loading = true;
+      if (this.order_status != "-3") {
+        parm.order_status = this.order_status;
+      } else {
+        parm.order_status = "";
+      }
+      this.$api.getSignList(parm).then((res) => {
+        let data = res.data.data.list;
+        for (let i = 0; i < data.length; i++) {
+          let item = data[i],
+            status = "",
+            pay_status = "",
+            verify = "",
+            bill_type = "";
+          if (item.pay_status) {
+            pay_status = "已支付";
+          } else {
+            pay_status = "未支付";
+          }
+          if (item.verify) {
+            verify = "已认证";
+          } else {
+            verify = "未认证";
+          }
+          if (item.bill_type == 0) bill_type = "不需要发票";
+          if (item.bill_type == 1) bill_type = "个人发票";
+          if (item.bill_type == 2) bill_type = "公司发票";
+          if (item.order_status == -2) status = "审核未通过";
+          if (item.order_status == -1) status = "待提交资料";
+          if (item.order_status == 0) status = "待审核";
+          if (item.order_status == 1) status = "已审核,待付款";
+          if (item.order_status == 2) status = "已付款,待培训";
+          if (item.order_status == 3) status = "已培训,待考试";
+          if (item.order_status == 7) status = "考试完成";
+          if (item.order_status == 9) status = "已取消";
+          item.order_status_1 = status;
+          item.pay_status_1 = pay_status;
+          item.verify_1 = verify;
+          item.bill_type_1 = bill_type;
+          if (!item.pay_status) {
+            item.price = "";
+          }
+        }
+        this.list = res.data.data.list;
+        this.total = res.data.data.total;
+        this.loading = false;
+      });
+    },
+    subChange(data) {
+      console.log(data);
+      this.form.subject_item = this.subject_item + "|" + data.join("|");
+      this.getData();
+    },
+    tabClick(tab) {
+      this.form.order_status = tab.name;
+      this.list = [];
+      this.getData();
+    },
+    del(id) {
+      this.$confirm("确定删除吗", "提示", {
+        type: "warning",
+      }).then(() => {
+        this.$api.deleteSign({ id: id }).then((res) => {
+          if (res.data.code == 0) {
+            this.$message({
+              message: "删除成功",
+              type: "success",
+            });
+            this.getData();
+          }
+        });
+      });
+    },
+    mark(id, val) {
+      this.$prompt("", "管理员备注", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        inputValue: val,
+      }).then(({ value }) => {
+        this.$api.updateSign({ id: id, admin_remark: value }).then((res) => {
+          if (res.data.code == 0) {
+            this.$message({ message: "备注成功!", type: "success" });
+            this.getData();
+          } else {
+            this.$message.error(res.data.message);
+          }
+        });
+      });
+    },
+    handleSelectionChange(val) {
+      this.ids = val;
+      console.log(val);
+    },
+    setStatus(type, text) {
+      var ids = [],
+        val = this.ids;
+      for (let i = 0; i < val.length; i++) {
+        ids.push(val[i].id);
+      }
+      var id = ids.join(",");
+      if (val.length > 0) {
+        this.$confirm("确定修改状态为" + text, "提示", {
+          type: "warning",
+        }).then(() => {
+          this.$api
+            .updateSignStu({ id: id, order_status: type })
+            .then((res) => {
+              if (!res.data.code) {
+                this.$message({
+                  message: "修改成功",
+                  type: "success",
+                });
+                this.getData();
+              } else {
+                this.$message.error(res.data.message);
+              }
+            });
+        });
+      } else {
+        this.$message.error("请选择数据");
+      }
+    },
+    setTime(type) {
+      var ids = [],
+        val = this.ids;
+      for (let i = 0; i < val.length; i++) {
+        ids.push(val[i].id);
+      }
+      var id = ids.join(",");
+      this.select_ids = id;
+      if (val.length > 0) {
+        this.date_type = type;
+        if (type == 1) {
+          this.dialogVisible = true;
+          this.text = "批量设置培训时间";
+        } else if (type == 2) {
+          this.dialogVisible = true;
+          this.text = "批量设置考试时间";
+        } else {
+          this.save();
+        }
+      } else {
+        this.$message.error("请选择数据");
+      }
+    },
+    save() {
+      var parm = { id: this.select_ids };
+      console.log(this.time);
+      if (this.date_type == 1) {
+        parm.train_time = this.time1.join(",");
+      } else if (this.date_type == 2) {
+        parm.exam_time = this.time2;
+      } else {
+        parm.classhour_cert_status = 1;
+      }
+      this.$api.updateSign(parm).then((res) => {
+        if (res.data.code == 0) {
+          this.$message({
+            message: "操作成功",
+            type: "success",
+          });
+          this.dialogVisible = false;
+          this.getData();
+        } else {
+          this.$message.error(res.data.message);
+        }
+      });
+    },
+    print() {
+      var newwindow = window.open("", "");
+      var tr = "",
+        th = "";
+      for (let i = 0; i < this.itemList.length; i++) {
+        let item = this.itemList[i];
+        th += `
+                <td>${item.name}</td>
+            `;
+      }
+      for (let i = 0; i < this.list.length; i++) {
+        let item = this.list[i];
+        let tds = "";
+        for (let j = 0; j < this.itemList.length; j++) {
+          let item_1 = this.itemList[j];
+          tds += `
+                    <td>${item[item_1.value] || " "}</td>
+                `;
+        }
+        tr += `<tr>${tds}</tr>`;
+      }
+      var table = `
+            <style>
+                td{text-align:center;padding:10px 0;color:#666;font-size:12px;}
+            </style>
+            <table style='border-collapse: collapse;border:none;border-color:#d9d9d9;padding:10px;' border='1' cellspacing='0' cellpadding='0' width='100%'>
+                <thead style="text-align:center;">
+                    ${th}
+                </thead>
+                ${tr}
+            </table>
+        `;
+      console.log(table);
+      newwindow.document.write(table);
+      newwindow.window.print();
+    },
+    download(type) {
+      var ids = [],
+        val = this.ids;
+      for (let i = 0; i < val.length; i++) {
+        ids.push(val[i].id);
+      }
+      var id = ids.join(",");
+      var parm = {
+        id: id,
+        type: type,
+      };
+      if (val.length > 0) {
+        this.download_loading = true;
+        this.$api.downloadzip(parm).then((res) => {
+          // if(res.data.code == 0){
+          var elink = document.createElement("a");
+          let blob = new Blob([res.data], { type: "application/zip" });
+          let objUrl = URL.createObjectURL(blob);
+          let file_name = res.headers["content-disposition"].split("=")[1];
+          elink.download = file_name;
+          elink.style.display = "none";
+          elink.href = objUrl;
+          document.body.appendChild(elink);
+          elink.click();
+          document.body.removeChild(elink);
+          this.download_loading = false;
+          // }else{
+          //     this.$message.error(res.data.message);
+          // }
+        });
+      } else {
+        this.$message.error("请选择数据");
+      }
+    },
+    allocation() {
+      if (this.ids.length < 1) {
+        this.$message.error("请选择学员!");
+        return false;
+      }
+      this.allocationDialogVisible = true;
+    },
+    doAllocationClass() {
+      if (!this.form.allocation_class_id) {
+        this.$message.error("请选择班级!");
+        return false;
+      }
+      let order_ids = [];
+      this.ids.forEach((item) => {
+        order_ids.push(item.id);
+      });
+      let params = {
+        ids: order_ids,
+        class_id: this.form.allocation_class_id,
+      };
+      this.$api.allocationClass(params).then((res) => {
+        this.allocationDialogVisible = false;
+        this.getData();
+      });
+    },
+  },
+  watch: {
+    $route(to) {
+      this.subject_id = false;
+      this.$nextTick(() => {
+        this.subject_id = to.path.split("/")[2];
+      });
+      this.$api.getSubList().then((res) => {
+        let data = res.data.data;
+        for (let i = 0; i < data.length; i++) {
+          if (data[i].id == this.subject_id) {
+            this.subject_item = data[i].name;
+            this.form.subject_item = data[i].name;
+          }
+        }
+        this.getData();
+      });
+    },
+  },
+  created() {
+    this.$api.getClass({ page_size: 1000 }).then((res) => {
+      this.class_list = res.data.data.list;
+    });
+    this.subject_id = this.$route.path.split("/")[2];
+    this.$api.getSubList().then((res) => {
+      let data = res.data.data;
+      for (let i = 0; i < data.length; i++) {
+        if (data[i].id == this.subject_id) {
+          this.subject_item = data[i].name;
+          this.form.subject_item = data[i].name;
+        }
+      }
+      this.getData();
+    });
+  },
+};
+</script>

+ 140 - 0
src/views/classes/Add.vue

@@ -0,0 +1,140 @@
+<style lang="scss">
+    .addclass{
+        .el-input,button{
+            width: 500px;
+        }
+        .sub .el-input {
+            width: 500px!important;
+        }
+    }
+</style>
+<template>
+    <section class="addclass">
+        <p>培训计划  >  班级管理  >  新增班级</p>
+        <div class="content">
+            <el-form label-width="80px">
+                <!-- <el-form-item label="培训项目" v-if="id!=''">
+                    <Subject v-if='form.signup_limit' :subvalue='form.subject_item' @subChange='subChange'/>
+                </el-form-item>
+                <el-form-item label="培训项目" v-else>
+                    <Subject @subChange='subChange'/>
+                </el-form-item> -->
+                <el-form-item label="培训项目">
+                    <!-- <MulSubject :value2="form.subject_id" @valchange="change"/> -->
+                    <el-cascader-multi :data="data" @change="change" :value="value2" v-model="value2"> </el-cascader-multi>
+                </el-form-item>
+                <el-form-item label="班级名称">
+                        <el-input placeholder="班级名称" v-model="form.name"></el-input>
+                </el-form-item>
+                <el-form-item label="计划人数">
+                        <el-input placeholder="计划人数" v-model="form.signup_limit"></el-input>
+                </el-form-item>
+                <el-form-item label="备注">
+                        <el-input placeholder="备注" v-model="form.remark"></el-input>
+                </el-form-item>
+                <el-form-item label="提醒">
+                        <el-input placeholder="提醒" v-model="form.remind"></el-input>
+                </el-form-item>
+                <el-form-item label=" ">
+                        <el-button @click="save" type="primary">保存</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+    </section>
+</template>
+<script>
+import Subject from '../../components/Subject';
+import MulSubject from '../../components/MulSubject';
+export default {
+    components:{
+        Subject,
+        MulSubject
+    },
+  data(){
+    return{
+      form:{
+          name:'',subject_id:[]},
+      id:'',
+      value2:[],
+      data:[]
+    }
+  },
+  methods:{
+      unique(arr){
+        var res = [];
+        var obj = {};
+        for(var i=0; i<arr.length; i++){
+        if( !obj[arr[i]] ){
+                obj[arr[i]] = 1;
+                res.push(arr[i]);
+            }
+        } 
+        return res;
+      },
+      getSubjects(){
+          //
+          this.$api.getSubList().then(res=>{
+                let data=res.data.data;
+                if(this.subject_id){
+                    for(let i=0;i<data.length;i++){
+                        if(data[i].id == this.subject_id){
+                            this.data=data[i].children
+                        }
+                    }
+                }else{
+                    this.data=res.data.data
+                }
+                // this.value2 = [[1,32,38]]              
+          })
+      },
+      getData(){
+          this.$api.getaClass({id:this.form.id}).then(res=>{
+              this.form=res.data.data
+              this.value2 = res.data.data.subject_id
+          })
+      },
+      subChange(data,id){
+          this.form.subject_id=id
+          this.form.subject_item=data.join('|')
+      },
+      change(val){
+          this.form.subject_id = val
+      },
+      save(){
+          var parm=this.form;
+          if(parm.id){
+              this.$api.putClass(parm).then(res=>{
+                  if(res.data.code==0){
+                      this.$message({message: '修改成功!',type: 'success'});
+                      this.$router.push({path:'/classes'})
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+              })
+          }else{
+              this.$api.saveClass(parm).then(res=>{
+                  if(res.data.code==0){
+                      this.$message({message: '添加成功!',type: 'success'});
+                      this.$router.push({path:'/classes'})
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+              })
+          }
+      }
+  },
+  created(){
+      this.getSubjects()
+      if(this.$route.query.id){
+            this.form.id=this.$route.query.id
+            this.id=this.$route.query.id
+            this.getData()
+        }
+  }
+}
+</script>
+
+
+
+
+

+ 226 - 0
src/views/classes/Index.vue

@@ -0,0 +1,226 @@
+<style lang="scss">
+  .apply {
+    .filter {
+      background: #fff;
+      padding: 20px 20px 10px;
+      border: 1px solid #ededed;
+      border-radius: 2px;
+      margin-bottom: 10px;
+      margin-top: 10px;
+
+      .el-form-item {
+        margin-bottom: 10px;
+      }
+
+      .el-input,
+      .el-select {
+        width: 150px;
+      }
+    }
+
+    thead {
+      th {
+        background: #eee;
+      }
+    }
+  }
+
+  .table {
+    button {
+      padding: 6px;
+    }
+  }
+
+  .el-table__fixed-right::before,
+  .el-table__fixed::before {
+    background: none;
+  }
+</style>
+<template>
+  <section class="apply">
+    <p>培训计划 > 班级管理</p>
+    <div style="display:flex;flex-direction:row;">
+      <div style="width:40%;margin-top:10px;margin-right:10px;background:#fff;">
+        <SubjectTree @subChange = "subChange" />
+      </div>
+      <div style="width:60%;">
+        <div class="filter">
+          <el-form label-width="80px" :inline="true" size="small">
+            <el-form-item label="班级名称">
+              <el-input clearable placeholder="班级名称" v-model="form.name"></el-input>
+            </el-form-item>
+            <!-- <el-form-item label="类别">
+              <Subject @subChange="subChange" />
+            </el-form-item> -->
+            <el-form-item>
+              <el-button @click="(form.page = 1), getData()" type="primary" icon="el-icon-search">搜索</el-button>
+              <el-button @click="$router.push({ path: '/classes/add' })" type="primary">新增</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+        <el-button type="success">2024(12期)</el-button><el-button type="success">2025</el-button>
+        <el-table class="table" :data="list" height="450px" border v-loading="loading" style="width: 100%">
+          <el-table-column
+                type="selection" fixed="left"
+                width="55">
+                </el-table-column>
+                <el-table-column prop="name" width="200" label="培训计划编号"></el-table-column>
+          <el-table-column prop="name" width="200" label="班级名称">
+          </el-table-column>
+          <!-- <el-table-column
+                prop="subject_item" width="300"
+                label="培训项目">
+                </el-table-column> -->
+          <el-table-column prop="signup_limit" width="80" label="计划人数">
+          </el-table-column>
+          <el-table-column prop="signuped_count" width="100" label="已报名人数">
+            <template slot-scope="scope">
+              <el-link type="primary" @click="showSignupUser(scope.row)">{{
+            scope.row.signuped_count
+          }}</el-link>
+            </template>
+          </el-table-column>
+          <el-table-column prop="remark" label="备注"> </el-table-column>
+          <el-table-column prop="remind" label="提醒"> </el-table-column>
+          <el-table-column prop="ctime" width="200" label="创建时间">
+          </el-table-column>
+          <el-table-column fixed="right" prop="zip" width="200" label="操作">
+            <template slot-scope="scope">
+              <el-button @click="download(scope.row.id)" size="mini" type="success">导出档案</el-button>
+              <el-button @click="
+              $router.push({
+                path: '/classes/add',
+                query: { id: scope.row.id },
+              })
+            " size="mini" type="warning">编辑</el-button>
+              <el-button @click="del(scope.row.id)" size="mini" type="danger">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <Page ref="pageButton" :total="total" @pageChange="gopage" />
+      </div>
+    </div>
+    <!-- 查看已报名学员 -->
+    <ClassUser :dialogVisible="dialogVisible" ref="ClassUser" />
+  </section>
+</template>
+<script>
+  import Page from "../../components/Page";
+  import Subject from "../../components/Subject";
+  import ClassUser from "../../components/ClassUser";
+  import SubjectTree from "../../components/SubjectTree";
+  export default {
+    components: {
+      Page,
+      Subject,
+      ClassUser,
+      SubjectTree
+    },
+    data() {
+      return {
+        form: {
+          name: "",
+          page: 1,
+          page_size: 20
+        },
+        activeName: "1",
+        total: 1,
+        list: [],
+        loading: false,
+        dialogVisible: false,
+        signupList: [],
+      };
+    },
+    methods: {
+      goTo(path) {
+        let url = this.$router.resolve(path);
+        window.open(url.href, "_blank");
+      },
+      gopage(size) {
+        if (size) {
+          this.form.page_size = size;
+        }
+        this.form.page = this.$refs.pageButton.page;
+        this.getData();
+      },
+      getData() {
+        var parm = this.form;
+        this.loading = true;
+        this.$api.getClass(parm).then((res) => {
+          this.list = res.data.data.list;
+          this.total = res.data.data.total;
+          this.loading = false;
+        });
+      },
+      subChange(data) {
+        console.log(data,22222222222222222222)
+        this.form.subject_item = data.join("|");
+      },
+      del(id) {
+        this.$confirm("确定删除吗", "提示", {
+          type: "warning",
+        }).then(() => {
+          this.$api.deleteClass({
+            id: id
+          }).then((res) => {
+            this.$message({
+              message: "删除成功",
+              type: "success",
+            });
+            this.getData();
+          });
+        });
+      },
+      mark(id, val) {
+        this.$prompt("", "管理员备注", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          inputValue: val,
+        }).then(({
+          value
+        }) => {
+          this.$api.updateSign({
+            id: id,
+            admin_remark: value
+          }).then((res) => {
+            if (res.data.code == 0) {
+              this.$message({
+                message: "备注成功!",
+                type: "success"
+              });
+              this.getData();
+            } else {
+              this.$message.error(res.data.message);
+            }
+          });
+        });
+      },
+      download(id) {
+        this.$api.downloadClassUser({
+          id: id
+        }).then((res) => {
+          var elink = document.createElement("a");
+          let blob = new Blob([res.data], {
+            type: "application/vnd.ms-excel"
+          });
+          let objUrl = URL.createObjectURL(blob);
+          let file_name = res.headers["content-disposition"].split("=")[1];
+          elink.download = file_name;
+          elink.style.display = "none";
+          elink.href = objUrl;
+          document.body.appendChild(elink);
+          elink.click();
+          document.body.removeChild(elink);
+        });
+      },
+      showSignupUser(row) {
+        console.log(row, 222222222222);
+        this.$refs.ClassUser.showSignupUser(row);
+        this.dialogVisible = true;
+      },
+    },
+    created() {
+      this.getData();
+    },
+  };
+</script>

+ 115 - 0
src/views/content/Article.vue

@@ -0,0 +1,115 @@
+<style lang="scss">
+.apply {
+  .filter {
+    background: #fff;
+    padding: 20px 20px 10px;
+    border: 1px solid #ededed;
+    border-radius: 2px;
+    margin-bottom: 10px;
+    margin-top: 10px;
+    .el-form-item {
+      margin-bottom: 10px;
+    }
+    .el-input,
+    .el-select {
+      width: 150px;
+    }
+  }
+  thead {
+    th {
+      background: #eee;
+    }
+  }
+}
+</style>
+<template>
+  <section class="apply">
+    <p>内容管理 > 文章管理</p>
+    <div class="filter">
+      <el-form label-width="80px" :inline="true" size="small">
+        <el-form-item label="文章标题">
+          <el-input placeholder="请输入文章标题" clearable v-model="form.title"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button @click="getData" type="primary" icon="el-icon-search">搜索</el-button>
+          <el-button @click="$router.push({path:'/addArticle'})" type="primary">新增文章</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <el-table class="table" :data="list" border style="width: 100%" v-loading='loading'>
+      <!-- <el-table-column type="selection" fixed="left" width="55"></el-table-column> -->
+      <el-table-column prop="title" label="文章标题"></el-table-column>
+      <el-table-column prop="ctime" label="创建时间"></el-table-column>
+      <el-table-column prop="zip" width="400" label="操作">
+        <template slot-scope="scope">
+          <!-- <el-button size="mini" type="success">查看</el-button> -->
+          <el-button
+            @click="$router.push({path:'/addArticle',query:{id:scope.row.id}})"
+            size="mini"
+            type="warning"
+          >编辑</el-button>
+          <el-button @click="del(scope.row.id)" size="mini"  type="danger">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <Page ref="pageButton" :total="total" @pageChange="gopage" />
+  </section>
+</template>
+<script>
+import Page from "../../components/Page";
+export default {
+  name: "articles",
+  components: {
+    Page
+  },
+  data() {
+    return {
+      form: { title: "" ,page:1,page_size:20},
+      total: 1,
+      list: [],
+      loading:false,
+    };
+  },
+  methods: {
+    gopage(size){
+          if(size){
+              this.form.page_size=size
+          }
+            this.form.page=this.$refs.pageButton.page
+            this.getData()
+      },
+    getData() {
+      this.loading=true
+      let parm=this.form
+      this.$api.getArticleList(parm).then(res => {
+        this.loading=false
+        if (res.status == 200) {
+          this.list = res.data.data.list;
+          this.total = res.data.data.total;
+        } else {
+          this.$message({
+            message: res.message,
+            type: "error"
+          });
+        }
+      });
+    },
+    del(id){
+            this.$confirm('确定删除吗', '提示', {
+                    type: 'warning'
+                }).then(() => {
+                   this.$api.delArticle({id:id}).then((res)=>{
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        this.getData()
+                })
+            })
+      },
+  },
+  created() {
+    this.getData();
+  }
+};
+</script>

+ 91 - 0
src/views/content/Index.vue

@@ -0,0 +1,91 @@
+<style lang="scss">
+.apply {
+  .filter {
+    background: #fff;
+    padding: 10px;
+    margin: 10px 0;
+  }
+}
+</style>
+<template>
+  <section class="apply">
+    <p>内容管理 > 栏目管理</p>
+    <div class="filter">
+      <el-button size="small" @click="$router.push({path:'/addContent'})" type="primary">新增栏目</el-button>
+    </div>
+    <el-table class="table" :data="list" border style="width: 100%" v-loading='loading'>
+      <!-- <el-table-column type="selection" width="55"></el-table-column> -->
+      <el-table-column prop="name" label="栏目名称"></el-table-column>
+      <el-table-column prop="ctime" label="创建时间"></el-table-column>
+      <el-table-column prop="operation" width="200" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            @click="$router.push({path:'/addContent',query:{id:scope.row.id}})"
+            size="mini"
+            type="warning"
+          >编辑</el-button>
+          <el-button @click="del(scope.row.id)" size="mini" type="danger">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <Page ref="pageButton" :total="total" @pageChange="gopage" />
+  </section>
+</template>
+<script>
+import Page from "../../components/Page";
+export default {
+  name: "contents",
+  components: {
+    Page
+  },
+  data() {
+    return {
+      total: 1,
+      list: [],
+      loading:false,
+      page:1,
+      page_size:20
+    };
+  },
+  methods: {
+    gopage(size){
+          if(size){
+              this.page_size=size
+          }
+            this.page=this.$refs.pageButton.page
+            this.getData()
+      },
+    getData() {
+      this.loading=true
+      this.$api.getContentList({page:this.page,page_size:this.page_size}).then(res => {
+        this.loading=false
+        if (res.status == 200) {
+          this.list = res.data.data.list;
+          this.total = res.data.data.total;
+        } else {
+          this.$message({
+            message: res.message,
+            type: "error"
+          });
+        }
+      });
+    },
+    del(id) {
+      this.$confirm("确定删除吗", "提示", {
+        type: "warning"
+      }).then(() => {
+        this.$api.delContent({ id: id }).then(res => {
+          this.$message({
+            message: "删除成功",
+            type: "success"
+          });
+          this.getData();
+        });
+      });
+    }
+  },
+  created() {
+    this.getData();
+  }
+};
+</script>

+ 258 - 0
src/views/content/addArticle.vue

@@ -0,0 +1,258 @@
+<style lang="scss">
+.add {
+  .el-input,
+  button {
+    width: 300px;
+  }
+  .bm-view {
+    width: 100%;
+  }
+  .avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+  .avatar-uploader .el-upload:hover {
+    border-color: #409eff;
+  }
+  .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 178px;
+    height: 178px;
+    line-height: 178px;
+    text-align: center;
+  }
+  .avatar {
+    width: 178px;
+    height: 178px;
+    display: block;
+  }
+  .imgs{
+    li{
+      display: inline-block;
+      width: 150px;
+      height: 150px;
+      overflow: hidden;
+      margin: 0 10px;
+    }
+    .up_img{
+      border: 1px dashed #999;
+      border-radius: 4px;
+      font-size: 50px;
+      text-align: center;
+      line-height: 150px;
+      color:#999;
+      position: relative;
+      input{
+        position: absolute;
+        width: 100%;
+        height: 100%;
+        left:0;
+        top: 0;
+        opacity: 0;
+      }
+    }
+  }
+}
+</style>
+<template>
+  <section class="add">
+    <p>内容管理 > 新增文章</p>
+    <div class="content">
+      <el-form label-width="80px">
+        <el-form-item label="标题">
+          <el-input placeholder="标题" v-model="form.title"></el-input>
+        </el-form-item>
+        <el-form-item label="栏目">
+           <el-select v-model="form.category_id" placeholder="请选择" clearable>
+                <el-option v-for="(item,index) in list" :key='index' :label="item.name"  :value="item.id"></el-option>
+            </el-select>
+        </el-form-item>
+        <el-form-item label="详情">
+          <fuEditor v-model="form.content" :isClear="isClear" @change="change"></fuEditor>
+        </el-form-item>
+        <el-form-item label="多图上传">
+          <ul class="imgs">
+            <li v-for="(item,index) in form.imgs" :key='index'>
+                <i class="el-icon-delete" @click="form.imgs.splice(index,1)"></i>
+                <img width="100%" :src="item" alt="">
+            </li>
+            <li class="up_img">
+              <i class="el-icon-upload"></i>
+              <input type="file" id='upload_img' @change="upload('upload_img')">
+            </li>
+          </ul>
+        </el-form-item>
+        <el-form-item label="设置定位">
+          <!-- <baidu-map @click="map" class="map bm-view" :center="{lng: 116.404, lat: 39.915}" :zoom="15">
+            <bm-marker :position="point" :dragging="true" animation="BMAP_ANIMATION_BOUNCE">
+            </bm-marker>
+          </baidu-map> -->
+          <el-input style="width:100%" v-model="keyword" placeholder="请输入关键词搜索"></el-input>
+          <p>点击地图添加标记  &nbsp;&nbsp; 当前标记地址:{{form.address}}</p>
+          <baidu-map @click="getClickInfo"   @ready="onBaiduMapReady" class="map bm-view" :center="point.lng||point.lat?point:'巴中'" :zoom="15" :scroll-wheel-zoom="true">
+            <bm-view style="width: 100%; height:300px;"></bm-view>
+            <bm-marker  :position="point" :dragging="true" animation="BMAP_ANIMATION_BOUNCE">
+            </bm-marker>
+            <bm-local-search style="max-height:200px;overflow:auto;border:1px solid #d9d9d9;" :keyword="keyword" :auto-viewport="true"></bm-local-search>
+          </baidu-map>
+        </el-form-item>
+
+        <el-form-item label="联系方式">
+          <el-input placeholder="联系方式" v-model="form.phone"></el-input>
+        </el-form-item>
+        <el-form-item label=" ">
+          <el-button type="primary" @click="save">保存</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </section>
+</template>
+<script>
+import fuEditor from "@/components/fuEditor/index.vue";
+export default {
+  components: {
+    fuEditor
+  },
+  data() {
+    return {
+      test: "",
+      list:[],
+      form: {
+        title: "",
+        category_id: '',
+        content: "",
+        imgs: [],
+        address: "",
+        point: ""
+      },
+      isClear: false,
+      keyword:'',
+      point:{
+        lng:'',
+        lat:''
+      },
+      BMap:null
+    };
+  },
+  methods: {
+    getData() {
+      this.$api.getArticleById({ id: this.form.id }).then(res => {
+        this.form = res.data.data;
+        this.point={
+          lng:this.form.point.split(',')[0],
+          lat:this.form.point.split(',')[1]
+        }
+      });
+    },
+    getContent(){
+      this.$api.getContentList({page:this.page}).then(res => {
+        this.loading=false
+        if (res.status == 200) {
+          this.list = res.data.data.list;
+        } else {
+          this.$message({
+            message: res.message,
+            type: "error"
+          });
+        }
+      });
+    },
+    change(val) {
+      this.form.content = val;
+    },
+    upload(type){
+          var file=document.getElementById(type).files;
+          var data=new FormData();
+            data.append("file",file[0])
+          this.$api.uploadFile(data).then(res=>{
+              if(res.data.code==0){
+                      let imgs=this.form.imgs||[];
+                      imgs.push(res.data.data.url)
+                      this.form.imgs=imgs
+                      // this.$set(form,type,res.data.data.url)
+                      this.$message({message: '上传成功!',type: 'success'});
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+          })
+      },
+    save() {
+      var parm = this.form;
+      parm.point=this.point.lng+','+this.point.lat
+      if (parm.id) {
+        // debugger;
+        this.$api.editArticle(parm).then(res => {
+          if (res.data.code == 0) {
+            this.$message({ message: "修改成功!", type: "success" });
+            this.$router.push({ path: "/article" });
+          } else {
+            this.$message.error(res.data.message);
+          }
+        });
+      } else {
+        this.$api.addArticle(parm).then(res => {
+          if (res.data.code == 0) {
+            this.$message({ message: "添加成功!", type: "success" });
+            this.$router.push({ path: "/article" });
+          } else {
+            this.$message.error(res.data.message);
+          }
+        });
+      }
+    },
+    onBaiduMapReady(e) {
+      // const that = this
+      this.BMap = e.BMap
+    },
+     getClickInfo(e) {
+      // 调整地图中心位置
+      this.point=e.point
+
+      // 此时已经可以获取到BMap类
+      if (this.BMap) {
+        const that = this
+        // Geocoder() 类进行地址解析
+        // 创建地址解析器的实例
+        const geoCoder = new this.BMap.Geocoder()
+        // getLocation() 类--利用坐标获取地址的详细信息
+        // getPoint() 类--获取位置对应的坐标
+        geoCoder.getLocation(e.point, function(res) {
+          const addrComponent = res.addressComponents
+          const surroundingPois = res.surroundingPois
+          const province = addrComponent.province
+          const city = addrComponent.city
+          const district = addrComponent.district
+          let addr = addrComponent.street
+          if (surroundingPois.length > 0 && surroundingPois[0].title) {
+            if (addr) {
+              addr += `-${surroundingPois[0].title}`
+            } else {
+              addr += `${surroundingPois[0].title}`
+            }
+          } else {
+            addr += addrComponent.streetNumber
+          }
+          that.form.address=province+city+district+addr
+        })
+      }
+    },
+  },
+  created() {
+    this.getContent()
+    if (this.$route.query.id) {
+      this.form.id = this.$route.query.id;
+      this.id = this.$route.query.id;
+      this.getData();
+    }
+  }
+};
+</script>
+
+
+
+
+

+ 80 - 0
src/views/content/addContent.vue

@@ -0,0 +1,80 @@
+<style lang="scss">
+.addclass {
+  .el-input,
+  button {
+    width: 500px;
+  }
+}
+</style>
+<template>
+  <section class="addclass">
+    <p>内容管理 > 栏目管理 > 新增栏目</p>
+    <div class="content">
+      <el-form label-width="80px">
+        <el-form-item label="栏目名称">
+          <el-input placeholder="栏目名称" v-model="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="排序字段">
+          <el-input placeholder="排序字段" v-model="form.order"></el-input>
+        </el-form-item>
+        <el-form-item label="说明">
+          <el-input placeholder="栏目说明" v-model="form.desc"></el-input>
+        </el-form-item>
+        <el-form-item label=" ">
+          <el-button @click="save" type="primary">保存</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </section>
+</template>
+<script>
+export default {
+  components: {},
+  data() {
+    return {
+      form: { name: "" }
+    };
+  },
+  methods: {
+    getData() {
+      this.$api.getContentById({ id: this.form.id }).then(res => {
+        this.form = res.data.data;
+      });
+    },
+    save() {
+      var parm = this.form;
+      if (parm.id) {
+        this.$api.editContent(parm).then(res => {
+          if (res.data.code == 0) {
+            this.$message({ message: "修改成功!", type: "success" });
+            this.$router.push({ path: "/content" });
+          } else {
+            this.$message.error(res.data.message);
+          }
+        });
+      } else {
+        this.$api.addContent(parm).then(res => {
+          if (res.data.code == 0) {
+            this.$message({ message: "添加成功!", type: "success" });
+            this.$router.push({ path: "/content" });
+          } else {
+            this.$message.error(res.data.message);
+          }
+        });
+      }
+    }
+  },
+  created() {
+    if (this.$route.query.id) {
+      this.form.id = this.$route.query.id;
+      this.id = this.$route.query.id;
+      this.getData();
+    }
+  }
+};
+</script>
+
+
+
+
+

+ 115 - 0
src/views/docs/Add.vue

@@ -0,0 +1,115 @@
+<style lang="scss">
+    .add{
+        .el-input,button{
+            width: 300px;
+        }
+    }
+</style>
+<template>
+    <section class="add">
+        <p>内容管理  >  资料管理  >  新增资料</p>
+        <div class="content" v-loading.fullscreen.lock="fullscreenLoading">
+            <el-form label-width="80px">
+                <el-form-item label="资料名称">
+                        <el-input placeholder="资料名称" v-model="form.name"></el-input>
+                </el-form-item>
+                <el-form-item label="资料文件">
+                    <a :href="form.url">{{form.url}}</a>
+                    <input type="file" @change="upload('url')" id='url'>
+                </el-form-item>
+                <el-form-item label=" ">
+                        <el-button @click="save" type="primary">保存</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+    </section>
+</template>
+<script>
+import Subject from '../../components/Subject';
+export default {
+  components:{
+        Subject
+    },
+  data(){
+    return{
+      fullscreenLoading:false,
+      form:{},
+      id:''
+    }
+  },
+  methods:{
+      subChange(data,id){
+          this.form.subject_id=id
+          this.form.subject_item=data.join('|')
+      },
+      upload(type){
+          var file=document.getElementById(type).files;
+          var data=new FormData();
+            data.append("file",file[0])
+            this.fullscreenLoading=true
+          this.$api.uploadFile(data).then(res=>{
+              this.fullscreenLoading=false
+              if(res.data.code==0){
+                      let form=this.form;
+                      this.$set(form,type,res.data.data.url)
+                      this.$message({message: '上传成功!',type: 'success'});
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+          })
+      },
+      getData(){
+          this.$api.getDocs({id:this.form.id}).then(res=>{
+              this.form=res.data.data
+          })
+      },
+      save(){
+          var parm=this.form;
+          if(parm.id){
+              this.$api.putDocs(parm).then(res=>{
+                  if(res.data.code==0){
+                      this.$message({message: '修改成功!',type: 'success'});
+                      this.$router.push({path:'/docs'})
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+              })
+          }else{
+              this.$api.saveDocs(parm).then(res=>{
+                  if(res.data.code==0){
+                      this.$message({message: '添加成功!',type: 'success'});
+                      this.$router.push({path:'/docs'})
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+              })
+          }
+      },
+      del(id){
+            this.$confirm('确定删除吗', '提示', {
+                    type: 'warning'
+                }).then(() => {
+                   this.$api.deleteDocs({id:id}).then((res)=>{
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        this.getData()
+                })
+            })
+      },
+  },
+  created(){
+      if(this.$route.query.id){
+            this.form.id=this.$route.query.id
+            this.id=this.$route.query.id
+            this.getData()
+        }
+  }
+}
+</script>
+
+
+
+
+

+ 127 - 0
src/views/docs/Index.vue

@@ -0,0 +1,127 @@
+<style lang="scss">
+    .apply{
+       .filter{
+            background: #fff;
+            padding: 20px 20px 10px; 
+            border:1px solid #EDEDED;
+            border-radius:2px;
+            margin-bottom: 10px;
+            margin-top: 10px;
+            .el-form-item{
+                margin-bottom: 10px;
+            }
+            .el-input,.el-select{
+                width: 150px;
+            }
+    
+       }
+       thead{
+           th{
+               background: #eee;
+           }
+       }
+    }
+</style>
+<template>
+    <section class="apply">
+        <p>内容管理  >  资料管理</p>
+        <div class="filter">
+            <el-form label-width="80px" :inline="true" size="small">
+                <el-form-item label="资料名称">
+                        <el-input placeholder="资料名称" v-model="form.name"></el-input>
+                </el-form-item>
+                <el-form-item>
+                       <el-button @click="getData" type="primary" icon="el-icon-search">搜索</el-button>
+                       <el-button @click="$router.push({path:'/docs/add'})" type="primary">新增</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+
+
+        <el-table
+                class="table"
+                :data="list" height="450px"
+                border  v-loading="loading"
+                style="width: 100%">
+                <el-table-column
+                prop="name"
+                label="资料名称">
+                </el-table-column>
+                <el-table-column
+                prop="title"
+                label="文件">
+                <template slot-scope="scope">
+                    <a :href="scope.row.url"><i style="font-size:16px;" class="el-icon-link">下载</i></a>
+                </template>
+                </el-table-column>
+                <el-table-column
+                prop="ctime"
+                label="创建时间">
+                </el-table-column>
+                <el-table-column
+                prop="zip" width="200"
+                label="操作">
+                <template slot-scope="scope">
+                    <el-button @click="$router.push({path:'/docs/add',query:{id:scope.row.id}})"  size="mini" type="success">编辑</el-button>
+                    <el-button @click="del(scope.row.id)"  size="mini" type="danger">删除</el-button>
+                </template>
+                </el-table-column>
+        </el-table>
+        <Page  ref="pageButton"  :total='total' @pageChange='gopage'/>
+    </section>
+</template>
+<script>
+import Page from '../../components/Page';
+import Subject from '../../components/Subject';
+export default {
+  components:{
+        Page,Subject
+    },
+  data(){
+    return{
+      form:{name:'',page:1,page_size:20},
+      activeName:"1",
+      total:1,
+      list:[],
+      loading:false
+    }
+  },
+  methods:{
+      gopage(size){
+          if(size){
+              this.form.page_size=size
+          }
+            this.form.page=this.$refs.pageButton.page
+            this.getData()
+      },
+      subChange(data){
+          this.form.subject_item=data.join('|')
+      },
+      getData(){
+         var parm=this.form;
+         this.loading=true
+          this.$api.getDocsList(parm).then(res=>{
+              this.list=res.data.data.list
+              this.total=res.data.data.total
+              this.loading=false
+          })
+      },
+      del(id){
+            this.$confirm('确定删除吗', '提示', {
+                    type: 'warning'
+                }).then(() => {
+                   this.$api.deleteDocs({id:id}).then((res)=>{
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        this.getData()
+                })
+            })
+      },
+  },
+  created(){
+      this.getData()
+  }
+}
+</script>

+ 15 - 0
src/views/online/Test.vue

@@ -0,0 +1,15 @@
+<style lang="scss">
+</style>
+<template>
+  <section>试卷管理</section>
+</template>
+<script>
+export default {
+  name: "test",
+  data() {
+    return {};
+  },
+  methods: {},
+  created() {}
+};
+</script>

+ 15 - 0
src/views/online/Video.vue

@@ -0,0 +1,15 @@
+<style lang="scss">
+</style>
+<template>
+  <section>视频管理</section>
+</template>
+<script>
+export default {
+  name: "video",
+  data() {
+    return {};
+  },
+  methods: {},
+  created() {}
+};
+</script>

+ 76 - 0
src/views/paper/Detail.vue

@@ -0,0 +1,76 @@
+<style lang="scss">
+    .paper{
+        h1{
+            text-align: center;
+            font-size: 24px;
+        }
+        .info{
+            text-align: center;
+            padding: 15px;
+            border-bottom: 1px solid #d9d9d9;
+        }
+        .ques{
+            margin: 30px 0;
+            color:#333;
+            h2{
+                font-size: 20px;
+            }
+            p{
+                font-size: 18px;
+                padding: 15px 0;
+            }
+            span{
+                font-size: 16px;
+                display: block;
+            }
+        }
+    }
+</style>
+<template>
+    <section class="paper">
+        <p>在线培训  >  试卷管理 > 试卷详情</p>
+        <div class="content">
+            <h1>{{form.title}}</h1>
+            <p class="info">满分:{{form.total_score}}分   考试时间{{form.total_time}}</p>
+            <div class="ques" v-for="(item,index) in form.questions" :key='index'>
+                <h2>{{item.title}}</h2>
+                <div v-for="(ques,idx) in item.questions" :key='idx+"_"+index'>
+                    <p>{{idx+1}}、{{ques.title}}</p>
+                    <span>
+                        {{ques.options}}
+                    </span>
+                </div>
+            </div>
+        </div>
+    </section>
+</template>
+<script>
+export default {
+  data(){
+    return{
+      form:{}
+    }
+  },
+  methods:{
+      getData(){
+          this.$api.getPaper({id:this.form.id}).then(res=>{
+              this.form=res.data.data
+          })
+      },
+ 
+  
+  },
+  created(){
+      if(this.$route.query.id){
+            this.form.id=this.$route.query.id
+            this.id=this.$route.query.id
+            this.getData()
+        }
+  }
+}
+</script>
+
+
+
+
+

+ 169 - 0
src/views/paper/Index.vue

@@ -0,0 +1,169 @@
+<style lang="scss">
+    .apply{
+       .filter{
+            background: #fff;
+            padding: 20px 20px 10px; 
+            border:1px solid #EDEDED;
+            border-radius:2px;
+            margin-bottom: 10px;
+            margin-top: 10px;
+            .el-form-item{
+                margin-bottom: 10px;
+            }
+            .el-input,.el-select{
+                width: 150px;
+            }
+    
+       }
+       thead{
+           th{
+               background: #eee;
+           }
+       }
+    }
+</style>
+<template>
+    <section class="apply">
+        <p>在线培训  >  试卷管理</p>
+        <div class="filter">
+            <el-form label-width="80px" :inline="true" size="small">
+                <el-form-item label="试卷名称">
+                        <el-input placeholder="试卷名称" v-model="form.title"></el-input>
+                </el-form-item>
+                <el-form-item label="类别">
+                    <Subject @subChange='subChange'/>
+                </el-form-item>
+             
+                <el-form-item>
+                       <el-button @click="getData" type="primary" icon="el-icon-search">搜索</el-button>
+                       <el-button type="primary">新增</el-button>
+                       <el-button @click="dialogVisible=true" type="primary">导入</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+
+
+        <el-table
+                class="table"
+                :data="list" height="450px"
+                border  v-loading="loading"
+                style="width: 100%">
+                <el-table-column
+                prop="title"
+                label="试卷名称">
+                </el-table-column>
+                <el-table-column
+                prop="subject_item"
+                label="培训项目">
+                </el-table-column>
+                <el-table-column
+                prop="total_time"  width="80"
+                label="考试时间">
+                </el-table-column>
+                <el-table-column
+                prop="total_score" width="80"
+                label="满分">
+                </el-table-column>
+                <el-table-column
+                prop="ctime"
+                label="创建时间">
+                </el-table-column>
+                <el-table-column
+                prop="zip" width="250"
+                label="操作">
+                <template slot-scope="scope">
+                    <el-button @click="$router.push({path:'/papers/detail',query:{id:scope.row.id}})"  size="mini" type="success">查看</el-button>
+                    <el-button size="mini" type="warning">编辑</el-button>
+                    <el-button @click="del(scope.row.id)" size="mini"  type="danger">删除</el-button>
+                </template>
+                </el-table-column>
+        </el-table>
+        <Page  ref="pageButton"  :total='total' @pageChange='gopage'/>
+
+        <el-dialog
+        title="导入试卷" center
+        :visible.sync="dialogVisible"
+        width="40%">
+        <p style="text-align:center;">请先下载模板,按模板格式填写好试题数据然后上传。
+            <a style="color:#409eff;" href="https://www.scxjc.club/paper.xlsx">点击下载模板</a> 
+            <br> <br>
+            <input style="width:160px" id='file' type="file">
+        </p>
+       
+        <span slot="footer" class="dialog-footer">
+            <el-button size="small" @click="dialogVisible = false">取 消</el-button>
+            <el-button size="small" type="primary" @click="upload('file')">确 定</el-button>
+        </span>
+        </el-dialog>
+    </section>
+</template>
+<script>
+import Page from '../../components/Page';
+import Subject from '../../components/Subject';
+export default {
+  components:{
+        Page,Subject
+    },
+  data(){
+    return{
+      form:{name:'',page:1,page_size:20},
+      activeName:"1",
+      total:1,
+      list:[],
+      loading:false,
+      dialogVisible:false
+    }
+  },
+  methods:{
+      gopage(size){
+          if(size){
+              this.form.page_size=size
+          }
+            this.form.page=this.$refs.pageButton.page
+            this.getData()
+      },
+      subChange(data){
+          this.form.subject_item=data.join('|')
+      },
+      getData(){
+         var parm=this.form;
+         this.loading=true
+          this.$api.getPaperList(parm).then(res=>{
+              this.list=res.data.data.list
+              this.total=res.data.data.total
+              this.loading=false
+          })
+      },
+      upload(type){
+          var file=document.getElementById(type).files;
+          var data=new FormData();
+            data.append("file",file[0])
+          this.$api.uploadPaper(data).then(res=>{
+              if(res.data.code==0){
+                      this.dialogVisible=false
+                      this.getData();
+                      this.$message({message: '上传成功!',type: 'success'});
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+          })
+      },
+      del(id){
+            this.$confirm('确定删除吗', '提示', {
+                    type: 'warning'
+                }).then(() => {
+                   this.$api.deletePaper({id:id}).then((res)=>{
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        this.getData()
+                })
+            })
+      },
+  },
+  created(){
+      this.getData()
+  }
+}
+</script>

+ 303 - 0
src/views/project/Index.vue

@@ -0,0 +1,303 @@
+<style lang="scss">
+    .subject {
+        .content {
+            display: flex;
+            justify-content: space-between;
+
+            .div_left {
+                width: 42%;
+                box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.24);
+                border-radius: 8px;
+                padding: 20px 10px 20px 0;
+
+                .custom-tree-node {
+                    width: 100%;
+
+                    .el-tree-node__content {
+                        height: 32px;
+                    }
+
+                    .label_name {
+                        font-size: 14px;
+                    }
+
+                    .edit {
+                        float: right;
+
+                        i {
+                            font-weight: bolder;
+                            font-size: 14px;
+                        }
+                    }
+                }
+
+                .top_add {
+                    font-size: 22px;
+                    margin-left: 90%;
+
+                    i {
+                        font-weight: 600;
+                    }
+                }
+            }
+
+            .div_right {
+                width: 55%;
+                box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.24);
+                border-radius: 8px;
+                padding: 20px 30px;
+
+                .form {
+                    label {
+                        font-weight: 600;
+                        font-size: 16px;
+                    }
+
+                    .req {
+                        color: red;
+                        margin-left: 10px;
+                    }
+
+                    .el-input-number,
+                    .el-input,
+                    .el-textarea {
+                        width: 300px;
+                    }
+
+                    .submit {
+                        width: 390px;
+                    }
+
+                    button {
+                        margin-top: 10px;
+                    }
+                }
+            }
+        }
+    }
+</style>
+<template>
+    <section class="subject">
+        <p>项目管理 > 培训科目</p>
+        <div class="content">
+            <div class="div_left">
+                <el-button class="top_add" type="text" size="medium" @click.stop="() => append(data)">
+                    <i class="el-icon-plus"></i>
+                </el-button>
+                <el-tree v-loading="loading" :data="data" node-key="id" :props='props' :expand-on-click-node="false">
+                    <span class="custom-tree-node" slot-scope="{ node, data }" @click.stop="() => edit(data)">
+                        <span class="label_name">{{ node.label }}</span>
+                        <span class="edit">
+                            <el-button type="text" size="mini" @click.stop="() => append(data)">
+                                <i class="el-icon-plus"></i>
+                            </el-button>
+                            <el-button type="text" size="mini" @click="() => edit(data)">
+                                <i class="el-icon-edit"></i>
+                            </el-button>
+                            <el-button type="text" size="mini" @click="() => remove(data)">
+                                <i class="el-icon-delete"></i>
+                            </el-button>
+                        </span>
+                    </span>
+                </el-tree>
+            </div>
+            <div class="div_right">
+                <el-form class="form" label-width="90px" label-position='left' v-show="add">
+                    <el-form-item label="科目名称">
+                        <el-input v-model="form.name"></el-input>
+                        <span class="req">*</span>
+                    </el-form-item>
+                    <el-form-item label="新办价格">
+                        <el-input-number v-model="form.price_new" controls-position="right" :min="0"></el-input-number>
+                        <span class="req">*</span>
+                    </el-form-item>
+                    <el-form-item label="复审价格">
+                        <el-input-number v-model="form.price_re" controls-position="right" :min="0"></el-input-number>
+                        <span class="req">*</span>
+                    </el-form-item>
+                    <el-form-item label="换证价格">
+                        <el-input-number v-model="form.price_change" controls-position="right" :min="0">
+                        </el-input-number>
+                        <span class="req">*</span>
+                    </el-form-item>
+                    <el-form-item label="学时" v-if='form.isleaf'>
+                        <el-input v-model="form.class_hour"></el-input>
+                        <span class="req">*</span>
+                    </el-form-item>
+                    <el-form-item label="复审学时" v-if='form.isleaf'>
+                        <el-input v-model="form.update_class_hour"></el-input>
+                        <span class="req">*</span>
+                    </el-form-item>
+                    <el-form-item label="换证学时" v-if='form.isleaf'>
+                        <el-input v-model="form.change_class_hour"></el-input>
+                        <span class="req">*</span>
+                    </el-form-item>
+                    <el-form-item label="设备种类">
+                        <el-button type="info" plain :key=i v-for="(item,i) in form.device_cats">{{item}}
+                            <i class="el-icon-upload el-icon-close" @click="delDeviceCat(i)"></i>
+                        </el-button>
+                        <el-button @click="dialogFormVisible1=true;newDeiceCat=null">新增<i
+                                class="el-icon-upload el-icon-plus"></i></el-button>
+                    </el-form-item>
+                    <el-form-item label="排序">
+                        <el-input-number v-model="form.order" controls-position="right" :min="0"></el-input-number>
+                    </el-form-item>
+                    <el-form-item label="说明">
+                        <el-input :rows="4" type="textarea" v-model="form.intro"></el-input>
+                    </el-form-item>
+                    <el-button class="submit" @click="save" type="primary">保存</el-button>
+                </el-form>
+            </div>
+        </div>
+        <el-dialog title="新增设备种类" :visible.sync="dialogFormVisible1" width="500px" :close-on-click-modal='false'
+            :close-on-press-escape='false'>
+            <el-form size="small" label-width="80px">
+                <el-form-item label="设备名称">
+                    <el-input clearable v-model="newDeiceCat"></el-input>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button size="small" @click="dialogFormVisible1 = false">取 消</el-button>
+                <el-button size="small" type="primary" @click="addDeviceCat">确 定</el-button>
+            </div>
+        </el-dialog>
+    </section>
+</template>
+<script>
+    // import { Base64 } from 'js-base64';
+    export default {
+        data() {
+            return {
+                data: [],
+                form: {
+                    name: ""
+                },
+                props: {
+                    label: 'name'
+                },
+                add: 0,
+                loading: false,
+                dialogFormVisible1: false,
+                newDeiceCat: null
+            }
+        },
+        methods: {
+            getData() {
+                this.loading = true
+                this.$api.getSubList({
+                    subject_id: this.id
+                }).then(res => {
+                    this.data = res.data.data
+                    this.loading = false
+                })
+            },
+            edit(data) {
+                this.add = 1
+                var parm = {
+                    id: data.id,
+                    name: data.name,
+                    pid: data.pid,
+                    price_change: data.price_change,
+                    price_new: data.price_new,
+                    price_re: data.price_re,
+                    intro: data.intro,
+                    order: 0,
+                    class_hour: data.class_hour,
+                    update_class_hour: data.update_class_hour,
+                    change_class_hour: data.change_class_hour,
+                    device_cats: data.device_cats
+                }
+                if (!data.children || data.children.length <= 0) {
+                    parm.isleaf = 1
+                } else {
+                    parm.isleaf = 0
+                }
+                this.form = parm
+            },
+            append(data) {
+                this.add = 1
+                var parm = {
+                    name: '',
+                    pid: data.id,
+                    price_change: 0,
+                    price_new: 0,
+                    price_re: 0,
+                    intro: '',
+                    order: 0,
+                }
+                if (!data.children || data.children.length <= 0) {
+                    parm.isleaf = 1
+                } else {
+                    parm.isleaf = 0
+                }
+                this.form = parm
+            },
+            remove(data) {
+                console.log(data.id)
+                this.$confirm('确定删除' + data.name + '科目?', '提示', {
+                    type: 'warning'
+                }).then(() => {
+                    this.$api.deleteSub({
+                        id: data.id
+                    }).then(res => {
+                        this.$message({
+                            message: '删除成功!',
+                            type: 'success'
+                        });
+                        this.getData()
+                    })
+                })
+
+            },
+            delDeviceCat(i) {
+                this.form.device_cats.splice(i, 1)
+            },
+            addDeviceCat() {
+                this.form.device_cats.push(this.newDeiceCat);
+                this.dialogFormVisible1 = false
+            },
+            save() {
+                var parm = this.form;
+                if (parm.id) {
+                    this.$api.updateSub(parm).then(res => {
+                        if (res.data.code == 0) {
+                            this.$message({
+                                message: '修改成功!',
+                                type: 'success'
+                            });
+                            this.add = 0
+                            this.getData()
+                        } else {
+                            this.$message.error(res.data.message);
+                        }
+                    })
+                } else {
+                    this.$api.saveSub(parm).then(res => {
+                        if (res.data.code == 0) {
+                            this.$message({
+                                message: '添加成功!',
+                                type: 'success'
+                            });
+                            this.add = 0
+                            this.getData()
+                        } else {
+                            this.$message.error(res.data.message);
+                        }
+                    })
+                }
+            }
+        },
+        watch: {
+            $route() {
+                this.id = this.$route.query.id
+                this.getData()
+            }
+        },
+        created() {
+            if (this.$route.query.id) {
+                this.id = this.$route.query.id
+            }
+            this.getData()
+        }
+    }
+</script>

+ 112 - 0
src/views/system/AddAccount.vue

@@ -0,0 +1,112 @@
+<style lang="scss">
+.add {
+  .el-input,
+  button {
+    width: 300px;
+  }
+}
+</style>
+<template>
+  <section class="add">
+    <p>系统管理 > 新增账户</p>
+    <div class="content">
+      <el-form label-width="80px">
+        <el-form-item label="账号">
+          <el-input placeholder="账号" v-model="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="密码">
+          <el-input type="password" placeholder="密码" v-model="form.password"></el-input>
+        </el-form-item>
+        <el-form-item label="确认密码">
+          <el-input type="password" placeholder="确认密码" v-model="form.repassword"></el-input>
+        </el-form-item>
+        <el-form-item label="姓名">
+          <el-input placeholder="姓名" v-model="form.realname"></el-input>
+        </el-form-item>
+        <el-form-item label="手机">
+          <el-input placeholder="手机" v-model="form.phone"></el-input>
+        </el-form-item>
+        <el-form-item label="权限">
+          <el-select v-model="permission" multiple placeholder="请选择">
+            <el-option
+              v-for="(item,index) in permissions"
+              :key="index"
+              :label="item"
+              :value="item"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="状态">
+          <el-radio v-model="form.status" :label="1">激活</el-radio>
+          <el-radio v-model="form.status" :label="2">禁用</el-radio>
+        </el-form-item>
+        <el-form-item label=" ">
+          <el-button type="primary" @click="save">保存</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </section>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      test: "",
+      form: { name: "", realname: "", password:"",repassword:"",permissions:[],status: 1 },
+      permissions:[],
+      permission:[],
+    }
+  },
+  methods: {
+    getData() {
+      this.$api.getAccountById({ id: this.form.id }).then(res => {
+        this.form = res.data.data;
+        if(res.data.data.permissions){
+          this.permission=res.data.data.permissions.split(',')
+        }
+      });
+
+    },
+    save() {
+      var parm = this.form;
+      parm.permissions=this.permission.join(',')
+      if (parm.id) {
+        // debugger;
+        this.$api.editAccount(parm).then(res => {
+          if (res.data.code == 0) {
+            this.$message({ message: "修改成功!", type: "success" });
+            this.$router.push({ path: "/system" });
+          } else {
+            this.$message.error(res.data.message);
+          }
+        });
+      } else {
+        this.$api.addAccount(parm).then(res => {
+          if (res.data.code == 0) {
+            this.$message({ message: "添加成功!", type: "success" });
+            this.$router.push({ path: "/system" });
+          } else {
+            this.$message.error(res.data.message);
+          }
+        });
+      }
+    }
+  },
+  created() {
+    this.$api.getPerList().then(res=>{
+      this.permissions=res.data.data;
+    })
+    if (this.$route.query.id) {
+      this.form.id = this.$route.query.id;
+      this.id = this.$route.query.id;
+      this.getData();
+    }
+  }
+};
+</script>
+
+
+
+
+

+ 113 - 0
src/views/system/Index.vue

@@ -0,0 +1,113 @@
+<style lang="scss">
+.apply {
+  .filter {
+    background: #fff;
+    padding: 20px 20px 10px;
+    border: 1px solid #ededed;
+    border-radius: 2px;
+    margin-bottom: 10px;
+    margin-top: 10px;
+    .el-form-item {
+      margin-bottom: 10px;
+    }
+    .el-input,
+    .el-select {
+      width: 150px;
+    }
+  }
+  thead {
+    th {
+      background: #eee;
+    }
+  }
+}
+</style>
+<template>
+  <section class="apply">
+    <p>系统管理 > 账号管理</p>
+    <div class="filter">
+      <el-form label-width="60px" :inline="true" size="small">
+        <el-form-item label="用户名">
+          <el-input placeholder="请输入用户/姓名" v-model="form.name"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search">搜索</el-button>
+          <el-button @click="$router.push({path:'/system/addAccount'})" type="primary">新增用户</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <el-table class="table" :data="list" border style="width: 100%" height="450px">
+      <!-- <el-table-column type="selection" fixed="left" width="55"></el-table-column> -->
+      <el-table-column prop="name" label="账号"></el-table-column>
+      <el-table-column prop="realname" label="姓名"></el-table-column>
+      <!-- <el-table-column prop="permissions" label="权限"></el-table-column> -->
+      <el-table-column prop="ctime" label="创建时间"></el-table-column>
+      <el-table-column prop="zip" width="200" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            @click="$router.push({path:'/system/addAccount',query:{id:scope.row.id}})"
+            size="mini"
+            type="warning"
+          >编辑</el-button>
+          <el-button @click="del(scope.row.id)" size="mini" type="danger">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <Page ref="pageButton" :total="total" @pageChange="gopage" />
+  </section>
+</template>
+<script>
+import Page from "../../components/Page";
+export default {
+  name: "account",
+  components: {
+    Page
+  },
+  data() {
+    return {
+      form: { name: "" ,page_size:2,page:1},
+      total: 1,
+      list: []
+    };
+  },
+  methods: {
+    gopage(size){
+          if(size){
+              this.form.page_size=size
+          }
+            this.form.page=this.$refs.pageButton.page
+            this.getData()
+    },
+    getData() {
+      let parm=this.form
+      this.$api.getAccountList(parm).then(res => {
+        if (res.status == 200) {
+          this.list = res.data.data.list;
+          this.total = res.data.data.total;
+        } else {
+          this.$message({
+            message: res.message,
+            type: "error"
+          });
+        }
+      });
+    },
+    del(id){
+            this.$confirm('确定删除吗', '提示', {
+                    type: 'warning'
+                }).then(() => {
+                   this.$api.delAccount({id:id}).then((res)=>{
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        this.getData()
+                })
+            })
+      },
+  },
+  created() {
+    this.getData();
+  }
+};
+</script>

+ 77 - 0
src/views/system/ResetPwd.vue

@@ -0,0 +1,77 @@
+<style lang="scss">
+.add {
+  .el-input,
+  button {
+    width: 300px;
+  }
+}
+</style>
+<template>
+  <section class="add">
+    <p>系统管理 > 修改密码</p>
+    <div class="content">
+      <el-form label-width="80px">
+        <el-form-item label="新密码">
+          <el-input type="password" placeholder="新密码" v-model="form.password"></el-input>
+        </el-form-item>
+        <el-form-item label="确认密码">
+          <el-input type="password" placeholder="确认密码" v-model="form.repassword"></el-input>
+        </el-form-item>
+        <el-form-item label=" ">
+          <el-button type="primary" @click="save">保存</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </section>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      test: "",
+      form: { name: "", realname: "", password:"",repassword:"",permissions:[],status: 1 },
+      permissions:[],
+      permission:[],
+    }
+  },
+  methods: {
+    getData() {
+      this.$api.getAccountById({ id: this.form.id }).then(res => {
+        this.form = res.data.data;
+        if(res.data.data.permissions){
+          this.permission=res.data.data.permissions.split(',')
+        }
+      });
+
+    },
+    save() {
+      var parm = this.form;
+      this.$api.resetPwd(parm).then(res => {
+        if (res.data.code == 0) {
+          this.$message({ message: "修改成功!", type: "success" });
+          this.$api.logout(parm).then(res=>{
+            this.$router.push({ path: "/login" });
+          })
+        } else {
+          this.$message.error(res.data.message);
+        }
+      });
+    }
+  },
+  created() {
+    this.$api.getPerList().then(res=>{
+      this.permissions=res.data.data;
+    })
+    if (this.$route.query.id) {
+      this.form.id = this.$route.query.id;
+      this.id = this.$route.query.id;
+      this.getData();
+    }
+  }
+};
+</script>
+
+
+
+
+

+ 60 - 0
src/views/user/Add.vue

@@ -0,0 +1,60 @@
+<style lang="scss">
+    .add{
+        .el-input,button{
+            width: 300px;
+        }
+    }
+</style>
+<template>
+    <section class="add">
+        <p>系统管理  >  新增用户 </p>
+        <div class="content">
+            <el-form label-width="80px">
+                <el-form-item label="用户名">
+                        <el-input placeholder="用户名" v-model="form.name"></el-input>
+                </el-form-item>
+                <el-form-item label="密码">
+                        <el-input type="password" placeholder="密码" v-model="form.name"></el-input>
+                </el-form-item>
+                <el-form-item label="确认密码">
+                        <el-input type="password"  placeholder="确认密码" v-model="form.name"></el-input>
+                </el-form-item>
+                <el-form-item label="姓名">
+                        <el-input placeholder="用户名" v-model="form.name"></el-input>
+                </el-form-item>
+                <el-form-item label="设置权限">
+                        <el-checkbox-group v-model="test" size="small">
+                        <el-checkbox label="备选项1" border></el-checkbox>
+                        <el-checkbox label="备选项2" border></el-checkbox>
+                        </el-checkbox-group>
+                </el-form-item>
+                <el-form-item label=" ">
+                        <el-button type="primary">保存</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+    </section>
+</template>
+<script>
+
+export default {
+
+  data(){
+    return{
+        test:'',
+        form:{name:1,a:''}
+    }
+  },
+  methods:{
+      gopage(){}
+  },
+  created(){
+  
+  }
+}
+</script>
+
+
+
+
+

+ 137 - 0
src/views/user/Detail.vue

@@ -0,0 +1,137 @@
+<style lang="scss">
+    .detail{
+        display: flex;
+        justify-content: space-between;
+        margin-top: 20px;
+        
+        ul{
+            width: 32%;
+            background: #fff;
+            padding: 15px;
+            box-shadow:0px 4px 12px 0px rgba(0,0,0,0.12);
+            li{
+                list-style: none;
+                color: #666;
+                margin: 10px 0;
+                font-size: 14px;
+                border-bottom: 1px solid #d9d9d9;
+                padding: 15px 0;
+                &:last-child{
+                    border:none;
+                }
+                span{
+                    float: right;
+                    color: #222;
+                }
+            }
+            .status{
+                span{
+                    position: relative;
+                    top: -10px;
+                }
+            }
+            .title{
+                font-weight: 600;
+                span{
+                    color:#fff;
+                }
+            }
+        }
+        div{
+            width: 67%;
+            display: flex;
+            justify-content: space-between;
+            flex-wrap: wrap;
+            ul{
+                width: 49%;
+                height: 300px;
+                margin-bottom: 15px;
+                overflow: hidden;
+                img{
+                    max-height: 200px;
+                }
+            }
+        }
+    }
+</style>
+<template>
+    <section class="edit">
+        <p>实名认证列表  >  认证详情 </p>
+        <div class="detail">   
+           <ul>
+               <li class="title">认证信息 <el-tag size="mini" effect="dark">证</el-tag></li>   
+               <li>
+                   姓名  <span>{{form.name}}</span>
+               </li>
+               <li>
+                   性别  <span>{{form.sex}}</span>
+               </li>
+               <li>
+                   身份证号  <span>{{form.idno}}</span>
+               </li>
+               <li>
+                   手机号  <span>{{form.phone}}</span>
+               </li>
+               <li>
+                   学历  <span>{{form.education}}</span>
+               </li>
+               <li>
+                   单位名称  <span>{{form.company}}</span>
+               </li>
+               <li class="status">
+                   状态  <el-tag   type="success">已通过</el-tag>
+               </li>
+           </ul>
+           <div>
+                <ul>
+                    <li class="title">身份证正面照</li>
+                    <img width="100%" :src="form.idnoimg_face" alt="">
+                </ul>
+                <ul>
+                    <li class="title">身份证反面照</li>
+                    <img width="100%" :src="form.idnoimg_back" alt="">
+                </ul>
+                <ul>
+                    <li class="title">半身照</li>
+                    <img width="100%" :src="form.halfbody_img" alt="">
+                </ul>
+                <ul>
+                    <li class="title">学历照</li>
+                    <img width="100%" :src="form.education_img" alt="">
+                </ul>
+           </div>
+        </div>
+    </section>
+</template>
+<script>
+export default {
+
+  data(){
+    return{
+      form:{},
+      radios:1,
+      id:'',
+      edu:["小学", "初中", "高中", "大专", "本科","硕士","博士"]
+    }
+  },
+  methods:{
+      getData(){
+          this.$api.getUser({id:this.id}).then(res=>{
+              this.form=JSON.parse(res.data.data.userinfo);
+          })
+      },
+    
+  },
+  created(){
+      if(this.$route.query.id){
+            this.id=this.$route.query.id
+            this.getData()
+        }
+  }
+}
+</script>
+
+
+
+
+

+ 140 - 0
src/views/user/Index.vue

@@ -0,0 +1,140 @@
+<style lang="scss">
+.apply {
+  .filter {
+    background: #fff;
+    padding: 20px 20px 10px;
+    border: 1px solid #ededed;
+    border-radius: 2px;
+    margin-bottom: 10px;
+    margin-top: 10px;
+    .el-form-item {
+      margin-bottom: 10px;
+    }
+    .el-input,
+    .el-select {
+      width: 150px;
+    }
+  }
+  thead {
+    th {
+      background: #eee;
+    }
+  }
+}
+</style>
+<template>
+    <section class="apply">
+        <p>用户管理  >  用户列表</p>
+        <div class="filter">
+            <el-form label-width="60px" :inline="true" size="small">
+                <el-form-item label="昵称">
+                        <el-input placeholder="昵称" v-model="form.nickname"></el-input>
+                </el-form-item>
+                <el-form-item label="姓名">
+                        <el-input placeholder="姓名" v-model="form.realname"></el-input>
+                </el-form-item>
+                <el-form-item label="手机号">
+                        <el-input placeholder="手机号" v-model="form.phone"></el-input>
+                </el-form-item>
+                <el-form-item label="身份证">
+                        <el-input placeholder="身份证" v-model="form.idno"></el-input>
+                </el-form-item>
+                <el-form-item>
+                       <el-button  @click="getData" type="primary" icon="el-icon-search">搜索</el-button>
+                       <!-- <el-button type="primary">新增</el-button> -->
+                </el-form-item>
+            </el-form>
+        </div>
+
+
+        <el-table
+                class="table"
+                :data="list"
+                border  height="65vh"
+                style="width: 100%">
+                <el-table-column
+                prop="avatar"
+                label="头像">
+                <template slot-scope="scope">
+                  <img width="50" :src="scope.row.avatar" alt="">
+                </template>
+                </el-table-column>
+                <el-table-column
+                prop="nickname" width="150px"
+                label="昵称">
+                </el-table-column>
+                 <el-table-column
+                prop="openid" width="200px"
+                label="openid">
+                </el-table-column>
+                <el-table-column
+                prop="verify" width="150px"
+                label="实名认证">
+                <template slot-scope="scope">
+                  <el-tag size="mini" v-if='scope.row.userinfo' type="success">已认证</el-tag>
+                  <el-tag size="mini" v-else type="info">未认证</el-tag>
+                  &nbsp;&nbsp;
+                  <el-tag @click="$router.push({path:'/user/detail',query:{id:scope.row.id}})"  size="mini" effect="dark" v-if='scope.row.userinfo'>查看</el-tag>
+                </template>
+                </el-table-column>
+                <el-table-column
+                prop="userinfo.name"
+                label="姓名">
+                </el-table-column>
+                <el-table-column
+                prop="userinfo.phone" width="130px"
+                label="手机号">
+                </el-table-column>
+                <el-table-column width="180px"
+                prop="userinfo.idno"
+                label="身份证号">
+                </el-table-column>            
+                <el-table-column
+                prop="ctime" width="200px"
+                label="注册时间">
+                </el-table-column>
+        </el-table>
+        <Page  ref="pageButton"  :total='total' @pageChange='gopage'/>
+    </section>
+</template>
+<script>
+import Page from "../../components/Page";
+// import { Base64 } from 'js-base64';
+export default {
+  components:{
+        Page
+    },
+  data(){
+    return{
+      form:{name:'',page:1,page_size:20},
+      activeName:"1",
+      total:1,
+      list:[]
+    }
+  },
+  methods:{
+      gopage(size){
+          if(size){
+              this.form.page_size=size
+          }
+            this.form.page=this.$refs.pageButton.page
+            this.getData()
+      },
+      getData(){
+         var parm=this.form;
+          this.$api.getUserList(parm).then(res=>{
+              let list=res.data.data.list
+              this.total=res.data.data.total
+              for(let i=0;i<list.length;i++){
+                list[i].userinfo=JSON.parse(list[i].userinfo)
+              }
+              this.list=list;
+              console.log(list)
+          })
+      }
+  },
+  created(){
+    this.getData()
+  }
+};
+</script>

+ 136 - 0
src/views/videos/Add.vue

@@ -0,0 +1,136 @@
+<style lang="scss">
+    .add{
+        .el-input,button{
+            width: 300px;
+        }
+    }
+</style>
+<template>
+    <section class="add">
+        <p>在线培训  >  视频管理  >  新增视频</p>
+        <div class="content" v-loading.fullscreen.lock="fullscreenLoading">
+            <el-form label-width="80px">
+                <el-form-item label="培训项目" v-if="id!=''">
+                    <Subject v-if='form.subject_id' :subvalue='form.subject_item' @subChange='subChange'/>
+                </el-form-item>
+                <el-form-item label="培训项目" v-else>
+                    <Subject @subChange='subChange'/>
+                </el-form-item>
+                <el-form-item label="培训类型">
+                    <el-select v-model="form.train_type" placeholder="请选择" clearable>
+                        <el-option  label="新办"  value="新办"></el-option>
+                        <el-option  label="换证"  value="换证"></el-option>
+                        <el-option  label="复审"  value="复审"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="视频名称">
+                        <el-input placeholder="视频名称" v-model="form.title"></el-input>
+                </el-form-item>
+                <el-form-item label="封面图">
+                    <p v-if="form.img">
+                        <img width="300"  :src="form.img" alt="">
+                    </p>
+                    <input type="file" @change="upload('img')" id='img'>
+                </el-form-item>
+                <el-form-item label="视频文件">
+                    <p v-if="form.url">
+                        <video width="300"  :src="form.url"></video>
+                    </p>
+                    <input type="file" @change="upload('url')" id='url'>
+                </el-form-item>
+                <el-form-item label=" ">
+                        <el-button @click="save" type="primary">保存</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+    </section>
+</template>
+<script>
+import Subject from '../../components/Subject';
+export default {
+  components:{
+        Subject
+    },
+  data(){
+    return{
+      fullscreenLoading:false,
+      form:{},
+      id:''
+    }
+  },
+  methods:{
+      subChange(data,id){
+          this.form.subject_id=id
+          this.form.subject_item=data.join('|')
+      },
+      upload(type){
+          var file=document.getElementById(type).files;
+          var data=new FormData();
+            data.append("file",file[0])
+            this.fullscreenLoading=true
+          this.$api.uploadFile(data).then(res=>{
+              this.fullscreenLoading=false
+              if(res.data.code==0){
+                      let form=this.form;
+                      this.$set(form,type,res.data.data.url)
+                      this.$message({message: '上传成功!',type: 'success'});
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+          })
+      },
+      getData(){
+          this.$api.getVideo({id:this.form.id}).then(res=>{
+              this.form=res.data.data
+          })
+      },
+      save(){
+          var parm=this.form;
+          if(parm.id){
+              this.$api.putVideo(parm).then(res=>{
+                  if(res.data.code==0){
+                      this.$message({message: '修改成功!',type: 'success'});
+                      this.$router.push({path:'/videos'})
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+              })
+          }else{
+              this.$api.saveVideo(parm).then(res=>{
+                  if(res.data.code==0){
+                      this.$message({message: '添加成功!',type: 'success'});
+                      this.$router.push({path:'/videos'})
+                  }else{
+                      this.$message.error(res.data.message);
+                  }
+              })
+          }
+      },
+      del(id){
+            this.$confirm('确定删除吗', '提示', {
+                    type: 'warning'
+                }).then(() => {
+                   this.$api.deleteVideo({id:id}).then((res)=>{
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        this.getData()
+                })
+            })
+      },
+  },
+  created(){
+      if(this.$route.query.id){
+            this.form.id=this.$route.query.id
+            this.id=this.$route.query.id
+            this.getData()
+        }
+  }
+}
+</script>
+
+
+
+
+

+ 136 - 0
src/views/videos/Index.vue

@@ -0,0 +1,136 @@
+<style lang="scss">
+    .apply{
+       .filter{
+            background: #fff;
+            padding: 20px 20px 10px; 
+            border:1px solid #EDEDED;
+            border-radius:2px;
+            margin-bottom: 10px;
+            margin-top: 10px;
+            .el-form-item{
+                margin-bottom: 10px;
+            }
+            .el-input,.el-select{
+                width: 150px;
+            }
+    
+       }
+       thead{
+           th{
+               background: #eee;
+           }
+       }
+    }
+</style>
+<template>
+    <section class="apply">
+        <p>在线培训  >  视频管理</p>
+        <div class="filter">
+            <el-form label-width="80px" :inline="true" size="small">
+                <el-form-item label="视频名称">
+                        <el-input placeholder="视频名称" v-model="form.title"></el-input>
+                </el-form-item>
+                <el-form-item label="类别">
+                    <Subject @subChange='subChange'/>
+                </el-form-item>
+             
+                <el-form-item>
+                       <el-button @click="getData" type="primary" icon="el-icon-search">搜索</el-button>
+                       <el-button @click="$router.push({path:'/videos/add'})" type="primary">新增</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+
+
+        <el-table
+                class="table"
+                :data="list" height="450px"
+                border  v-loading="loading"
+                style="width: 100%">
+                <el-table-column
+                prop="title"
+                label="视频名称">
+                </el-table-column>
+                <el-table-column
+                prop="subject_item"
+                label="培训项目">
+                </el-table-column>
+                <el-table-column
+                prop="train_type"
+                label="培训类型">
+                </el-table-column>
+                <!-- <el-table-column
+                prop="total_score"
+                label="满分">
+                </el-table-column> -->
+                <el-table-column
+                prop="ctime"
+                label="创建时间">
+                </el-table-column>
+                <el-table-column
+                prop="zip" width="200"
+                label="操作">
+                <template slot-scope="scope">
+                    <el-button @click="$router.push({path:'/videos/add',query:{id:scope.row.id}})"  size="mini" type="success">编辑</el-button>
+                    <el-button @click="del(scope.row.id)"  size="mini" type="danger">删除</el-button>
+                </template>
+                </el-table-column>
+        </el-table>
+        <Page  ref="pageButton"  :total='total' @pageChange='gopage'/>
+    </section>
+</template>
+<script>
+import Page from '../../components/Page';
+import Subject from '../../components/Subject';
+export default {
+  components:{
+        Page,Subject
+    },
+  data(){
+    return{
+      form:{name:'',page:1,page_size:20},
+      activeName:"1",
+      total:1,
+      list:[],
+      loading:false
+    }
+  },
+  methods:{
+      gopage(size){
+          if(size){
+              this.form.page_size=size
+          }
+            this.form.page=this.$refs.pageButton.page
+            this.getData()
+      },
+      subChange(data){
+          this.form.subject_item=data.join('|')
+      },
+      getData(){
+         var parm=this.form;
+         this.loading=true
+          this.$api.getVideoList(parm).then(res=>{
+              this.list=res.data.data.list
+              this.total=res.data.data.total
+              this.loading=false
+          })
+      },
+      del(id){
+            this.$confirm('确定删除吗', '提示', {
+                    type: 'warning'
+                }).then(() => {
+                   this.$api.deleteVideo({id:id}).then((res)=>{
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        this.getData()
+                })
+            })
+      },
+  },
+  created(){
+      this.getData()
+  }
+}
+</script>

+ 11 - 0
vue.config.js

@@ -0,0 +1,11 @@
+module.exports={
+    devServer:{
+        proxy:{
+            '/api':{
+                target:'http://newadmin.yifeng2016.com',
+                changeOrigin: true,
+            }
+        }
+    },
+    publicPath:'/'
+}