提交 004c85ad authored 作者: 王鹏飞's avatar 王鹏飞

整体结构调整;报名申请升级到2.0;

上级 699ed213
......@@ -32,5 +32,7 @@ module.exports = {
}
},
ProvidePlugin: {},
others: {}
others: {
projectId: '1007'
}
}
......@@ -13,5 +13,7 @@ module.exports = {
}
},
ProvidePlugin: {},
others: {}
others: {
projectId: '1007'
}
}
......@@ -14,5 +14,7 @@ module.exports = {
}
},
ProvidePlugin: {},
others: {}
others: {
projectId: '1007'
}
}
......@@ -225,7 +225,6 @@
"version": "7.10.4",
"resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.10.4.tgz",
"integrity": "sha1-TFxUvgS9MWcKc4J5fXW5+i5bViA=",
"dev": true,
"requires": {
"@babel/types": "^7.10.4"
}
......@@ -257,8 +256,7 @@
"@babel/helper-plugin-utils": {
"version": "7.10.4",
"resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.10.4.tgz?cache=0&sync_timestamp=1593521148758&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-plugin-utils%2Fdownload%2F%40babel%2Fhelper-plugin-utils-7.10.4.tgz",
"integrity": "sha1-L3WoMSadT2d95JmG3/WZJ1M883U=",
"dev": true
"integrity": "sha1-L3WoMSadT2d95JmG3/WZJ1M883U="
},
"@babel/helper-regex": {
"version": "7.10.5",
......@@ -324,8 +322,7 @@
"@babel/helper-validator-identifier": {
"version": "7.10.4",
"resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.10.4.tgz?cache=0&sync_timestamp=1593522720715&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.10.4.tgz",
"integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=",
"dev": true
"integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI="
},
"@babel/helper-wrap-function": {
"version": "7.10.4",
......@@ -549,7 +546,6 @@
"version": "7.10.4",
"resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.10.4.tgz",
"integrity": "sha1-Oauq48v3EMQ3PYQpSE5rohNAFmw=",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.10.4"
}
......@@ -1116,7 +1112,6 @@
"version": "7.11.5",
"resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.11.5.tgz",
"integrity": "sha1-2d5XfQElLXfGgAzuA57mT691Zi0=",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.10.4",
"lodash": "^4.17.19",
......@@ -1124,14 +1119,27 @@
}
},
"@ezijing/vue-form": {
"version": "0.1.24",
"resolved": "https://registry.npmjs.org/@ezijing/vue-form/-/vue-form-0.1.24.tgz",
"integrity": "sha512-w2v0lFQE6PuEm7zxoi/p0rqFxJQ25gk2EFuZcJHtTKQL/BYFF09Qx3qTDJdal9QxUTKhlmML64+Zs2pXYT5AzA==",
"version": "2.0.13",
"resolved": "https://registry.npmjs.org/@ezijing/vue-form/-/vue-form-2.0.13.tgz",
"integrity": "sha512-r+OQxGcjeOxn8gq47zy3UCGj5u3VKpbcSZ76YpNfrLQTmbwbmxc1EIhVK6reV1rOW0/G9c6plVqvb0X/Sg9oHw==",
"requires": {
"@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
"@vue/babel-preset-jsx": "^1.1.2",
"axios": "^0.20.0",
"core-js": "^3.6.5",
"element-ui": "^2.13.2",
"element-ui": "^2.14.1",
"qs": "^6.9.4",
"vue": "^2.6.12"
},
"dependencies": {
"axios": {
"version": "0.20.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz",
"integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==",
"requires": {
"follow-redirects": "^1.10.0"
}
}
}
},
"@ezijing/vue-passport": {
......@@ -1142,6 +1150,16 @@
"axios": "^0.20.0",
"element-ui": "^2.13.2",
"md5": "^2.3.0"
},
"dependencies": {
"axios": {
"version": "0.20.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz",
"integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==",
"requires": {
"follow-redirects": "^1.10.0"
}
}
}
},
"@types/anymatch": {
......@@ -1244,10 +1262,112 @@
}
}
},
"@vue/babel-helper-vue-jsx-merge-props": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz",
"integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA=="
},
"@vue/babel-plugin-transform-vue-jsx": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz",
"integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==",
"requires": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/plugin-syntax-jsx": "^7.2.0",
"@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
"html-tags": "^2.0.0",
"lodash.kebabcase": "^4.1.1",
"svg-tags": "^1.0.0"
}
},
"@vue/babel-preset-jsx": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz",
"integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==",
"requires": {
"@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
"@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
"@vue/babel-sugar-composition-api-inject-h": "^1.2.1",
"@vue/babel-sugar-composition-api-render-instance": "^1.2.4",
"@vue/babel-sugar-functional-vue": "^1.2.2",
"@vue/babel-sugar-inject-h": "^1.2.2",
"@vue/babel-sugar-v-model": "^1.2.3",
"@vue/babel-sugar-v-on": "^1.2.3"
}
},
"@vue/babel-sugar-composition-api-inject-h": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz",
"integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==",
"requires": {
"@babel/plugin-syntax-jsx": "^7.2.0"
}
},
"@vue/babel-sugar-composition-api-render-instance": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz",
"integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==",
"requires": {
"@babel/plugin-syntax-jsx": "^7.2.0"
}
},
"@vue/babel-sugar-functional-vue": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz",
"integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==",
"requires": {
"@babel/plugin-syntax-jsx": "^7.2.0"
}
},
"@vue/babel-sugar-inject-h": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz",
"integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==",
"requires": {
"@babel/plugin-syntax-jsx": "^7.2.0"
}
},
"@vue/babel-sugar-v-model": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz",
"integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==",
"requires": {
"@babel/plugin-syntax-jsx": "^7.2.0",
"@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
"@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
"camelcase": "^5.0.0",
"html-tags": "^2.0.0",
"svg-tags": "^1.0.0"
},
"dependencies": {
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
}
}
},
"@vue/babel-sugar-v-on": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz",
"integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==",
"requires": {
"@babel/plugin-syntax-jsx": "^7.2.0",
"@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
"camelcase": "^5.0.0"
},
"dependencies": {
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
}
}
},
"@vue/component-compiler-utils": {
"version": "3.2.0",
"resolved": "https://registry.npm.taobao.org/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.2.0.tgz?cache=0&sync_timestamp=1595427694165&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcomponent-compiler-utils%2Fdownload%2F%40vue%2Fcomponent-compiler-utils-3.2.0.tgz",
"integrity": "sha1-j4UYLO7Sjps8dTE95mn4MWbRHl0=",
"resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz",
"integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==",
"requires": {
"consolidate": "^0.15.1",
"hash-sum": "^1.0.2",
......@@ -1879,8 +1999,8 @@
},
"async-validator": {
"version": "1.8.5",
"resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-1.8.5.tgz?cache=0&sync_timestamp=1596625258256&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-validator%2Fdownload%2Fasync-validator-1.8.5.tgz",
"integrity": "sha1-3D4I7B/Q3dtn5ghC8CwM0c7G1/A=",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
"integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
"requires": {
"babel-runtime": "6.x"
}
......@@ -1925,9 +2045,9 @@
"dev": true
},
"axios": {
"version": "0.20.0",
"resolved": "https://registry.npm.taobao.org/axios/download/axios-0.20.0.tgz?cache=0&sync_timestamp=1597979791211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faxios%2Fdownload%2Faxios-0.20.0.tgz",
"integrity": "sha1-BXujDwSIRpSZOozQf6OUz/EcUL0=",
"version": "0.21.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz",
"integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==",
"requires": {
"follow-redirects": "^1.10.0"
}
......@@ -1983,9 +2103,9 @@
},
"dependencies": {
"core-js": {
"version": "2.6.11",
"resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz",
"integrity": "sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw="
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
}
}
},
......@@ -2195,9 +2315,9 @@
"dev": true
},
"bootstrap": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz",
"integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A=="
"version": "4.5.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.3.tgz",
"integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ=="
},
"bowser": {
"version": "1.9.4",
......@@ -2899,8 +3019,8 @@
},
"consolidate": {
"version": "0.15.1",
"resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz?cache=0&sync_timestamp=1599596654038&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsolidate%2Fdownload%2Fconsolidate-0.15.1.tgz",
"integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=",
"resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
"integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
"requires": {
"bluebird": "^3.1.1"
}
......@@ -3013,9 +3133,9 @@
}
},
"core-js": {
"version": "3.6.5",
"resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.6.5.tgz",
"integrity": "sha1-c5XcJzrzf7LlDpvT2f6EEoUjHRo="
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.0.tgz",
"integrity": "sha512-W2VYNB0nwQQE7tKS7HzXd7r2y/y2SVJl4ga6oH/dnaLFzM0o2lB2P3zCkWj5Wc/zyMYjtgd5Hmhk0ObkQFZOIA=="
},
"core-js-compat": {
"version": "3.6.5",
......@@ -3365,8 +3485,8 @@
},
"deepmerge": {
"version": "1.5.2",
"resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz",
"integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M="
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
"integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
},
"default-gateway": {
"version": "4.2.0",
......@@ -3629,11 +3749,11 @@
}
},
"dom7": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/dom7/-/dom7-2.1.5.tgz",
"integrity": "sha512-xnhwVgyOh3eD++/XGtH+5qBwYTgCm0aW91GFgPJ3XG+jlsRLyJivnbP0QmUBFhI+Oaz9FV0s7cxgXHezwOEBYA==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
"integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
"requires": {
"ssr-window": "^2.0.0"
"ssr-window": "^3.0.0-alpha.1"
}
},
"domain-browser": {
......@@ -3721,9 +3841,9 @@
"dev": true
},
"element-ui": {
"version": "2.13.2",
"resolved": "https://registry.npm.taobao.org/element-ui/download/element-ui-2.13.2.tgz?cache=0&sync_timestamp=1589795164194&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felement-ui%2Fdownload%2Felement-ui-2.13.2.tgz",
"integrity": "sha1-WCv0eqqqr+I+oZWPriF6aHrQZEc=",
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.14.1.tgz",
"integrity": "sha512-Uje0J12dBaXdyvt/EtuDA8diFbYTdO7uI4QCfl7zmEJmE1WxgCSVKhlRRoL8MDonO8pyNVhB4n0AFAR14g56nw==",
"requires": {
"async-validator": "~1.8.1",
"babel-helper-vue-jsx-merge-props": "^2.0.0",
......@@ -5535,6 +5655,11 @@
"integrity": "sha1-zCvEYp/JhJZ4AfnoGwsemQcBLdM=",
"dev": true
},
"html-tags": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz",
"integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos="
},
"html-webpack-plugin": {
"version": "4.5.0",
"resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-4.5.0.tgz?cache=0&sync_timestamp=1600690506465&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-webpack-plugin%2Fdownload%2Fhtml-webpack-plugin-4.5.0.tgz",
......@@ -6493,6 +6618,11 @@
"resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336097104&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz",
"integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI="
},
"lodash.kebabcase": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
"integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY="
},
"loglevel": {
"version": "1.7.0",
"resolved": "https://registry.npm.taobao.org/loglevel/download/loglevel-1.7.0.tgz?cache=0&sync_timestamp=1598447642950&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floglevel%2Fdownload%2Floglevel-1.7.0.tgz",
......@@ -6527,8 +6657,8 @@
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427519396&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz",
"integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
......@@ -6620,8 +6750,8 @@
},
"merge-source-map": {
"version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz",
"integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=",
"resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
"integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
"requires": {
"source-map": "^0.6.1"
}
......@@ -7920,8 +8050,8 @@
},
"prettier": {
"version": "1.19.1",
"resolved": "https://registry.npm.taobao.org/prettier/download/prettier-1.19.1.tgz?cache=0&sync_timestamp=1598414081254&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-1.19.1.tgz",
"integrity": "sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
"integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
"optional": true
},
"pretty-error": {
......@@ -8085,11 +8215,15 @@
"integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=",
"dev": true
},
"qrcode.vue": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-1.7.0.tgz",
"integrity": "sha512-R7t6Y3fDDtcU7L4rtqwGUDP9xD64gJhIwpfjhRCTKmBoYF6SS49PIJHRJ048cse6OI7iwTwgyy2C46N9Ygoc6g=="
},
"qs": {
"version": "6.9.4",
"resolved": "https://registry.npm.taobao.org/qs/download/qs-6.9.4.tgz",
"integrity": "sha1-kJCykNH5FyjTwi5UhDykSupatoc=",
"dev": true
"integrity": "sha1-kJCykNH5FyjTwi5UhDykSupatoc="
},
"query-string": {
"version": "4.3.4",
......@@ -8280,8 +8414,8 @@
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz?cache=0&sync_timestamp=1595456117883&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.11.1.tgz",
"integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk="
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"regenerator-transform": {
"version": "0.14.5",
......@@ -8572,8 +8706,8 @@
},
"resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ="
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
},
"resolve": {
"version": "1.17.0",
......@@ -9515,9 +9649,9 @@
}
},
"ssr-window": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-2.0.0.tgz",
"integrity": "sha512-NXzN+/HPObKAx191H3zKlYomE5WrVIkoCB5IaSdvKokxTpjBdWfr0RaP+1Z5KOfDT0ZVz+2tdtiBkhsEQ9p+0A=="
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
"integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
},
"ssri": {
"version": "6.0.1",
......@@ -9782,13 +9916,18 @@
"has-flag": "^3.0.0"
}
},
"svg-tags": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
"integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q="
},
"swiper": {
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/swiper/-/swiper-5.4.5.tgz",
"integrity": "sha512-7QjA0XpdOmiMoClfaZ2lYN6ICHcMm72LXiY+NF4fQLFidigameaofvpjEEiTQuw3xm5eksG5hzkaRsjQX57vtA==",
"version": "6.3.5",
"resolved": "https://registry.npmjs.org/swiper/-/swiper-6.3.5.tgz",
"integrity": "sha512-MZkkVJ+sXukp6G3Z3BlKayhBjRIQuO1TZaTlH7ooI/0qbH0kkmItFMjFo19nOOsJaDXglA32xqyc9KCtmbJv0w==",
"requires": {
"dom7": "^2.1.5",
"ssr-window": "^2.0.0"
"dom7": "^3.0.0-alpha.7",
"ssr-window": "^3.0.0-alpha.4"
}
},
"table": {
......@@ -9924,8 +10063,8 @@
},
"throttle-debounce": {
"version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.1.0.tgz?cache=0&sync_timestamp=1597223490354&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthrottle-debounce%2Fdownload%2Fthrottle-debounce-1.1.0.tgz",
"integrity": "sha1-UYU9o3vmihVctugns1FKPEIuic0="
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
"integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
},
"through": {
"version": "2.3.8",
......@@ -9982,8 +10121,7 @@
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"dev": true
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
},
"to-object-path": {
"version": "0.3.0",
......@@ -10544,18 +10682,18 @@
},
"vue-hot-reload-api": {
"version": "2.3.4",
"resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz",
"integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI="
"resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
"integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog=="
},
"vue-i18n": {
"version": "8.22.0",
"resolved": "https://registry.npm.taobao.org/vue-i18n/download/vue-i18n-8.22.0.tgz",
"integrity": "sha1-ZAM4Gm6rHSKeUVpirdspsv86v+0="
"version": "8.22.2",
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.22.2.tgz",
"integrity": "sha512-rb569fVJInPUgS/bbCxEQ9DrAoFTntuJvYoK4Fpk2VfNbA09WzdTKk57ppjz3S+ps9hW+p9H+2ASgMvojedkow=="
},
"vue-loader": {
"version": "15.9.3",
"resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.3.tgz?cache=0&sync_timestamp=1599639207320&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.3.tgz",
"integrity": "sha1-DeNdnlVdPtU5aVFsrFziVTEpndo=",
"version": "15.9.5",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.5.tgz",
"integrity": "sha512-oeMOs2b5o5gRqkxfds10bCx6JeXYTwivRgbb8hzOrcThD2z1+GqEKE3EX9A2SGbsYDf4rXwRg6D5n1w0jO5SwA==",
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
......@@ -10585,14 +10723,14 @@
}
},
"vue-router": {
"version": "3.4.6",
"resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.4.6.tgz?cache=0&sync_timestamp=1602076636169&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.4.6.tgz",
"integrity": "sha1-972iyaQ9OYN2IcmgK6d4n12qJLI="
"version": "3.4.9",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz",
"integrity": "sha512-CGAKWN44RqXW06oC+u4mPgHLQQi2t6vLD/JbGRDAXm0YpMv0bgpKuU5bBd7AvMgfTz9kXVRIWKHqRwGEb8xFkA=="
},
"vue-style-loader": {
"version": "4.1.2",
"resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.2.tgz",
"integrity": "sha1-3t80mAbyXOtOZPOtfApE+6c1/Pg=",
"resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz",
"integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==",
"requires": {
"hash-sum": "^1.0.2",
"loader-utils": "^1.0.2"
......@@ -10609,8 +10747,13 @@
},
"vue-template-es2015-compiler": {
"version": "1.9.1",
"resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz",
"integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU="
"resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw=="
},
"vuex": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.0.tgz",
"integrity": "sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ=="
},
"watchpack": {
"version": "1.7.4",
......
......@@ -72,24 +72,26 @@
"webpack-merge": "^4.2.2"
},
"dependencies": {
"@ezijing/vue-form": "^0.1.24",
"@ezijing/vue-form": "^2.0.13",
"@ezijing/vue-passport": "^1.0.0",
"axios": "^0.20.0",
"core-js": "^3.6.5",
"axios": "^0.21.0",
"bootstrap": "^4.5.3",
"core-js": "^3.8.0",
"cross-env": "^7.0.2",
"bootstrap": "^4.3.1",
"element-ui": "^2.13.2",
"element-ui": "^2.14.1",
"jquery": "^3.5.1",
"js-cookie": "^2.2.1",
"jquery": "^3.4.1",
"js-md5": "^0.7.3",
"lodash": "^4.17.20",
"swiper": "^5.4.5",
"qrcode.vue": "^1.7.0",
"swiper": "^6.3.5",
"vue": "^2.6.12",
"vue-awesome-swiper": "^4.1.1",
"vue-i18n": "^8.22.0",
"vue-loader": "^15.9.3",
"vue-i18n": "^8.22.2",
"vue-loader": "^15.9.5",
"vue-meta-info": "^0.1.7",
"vue-router": "^3.4.6",
"vue-template-compiler": "^2.6.12"
"vue-router": "^3.4.9",
"vue-template-compiler": "^2.6.12",
"vuex": "^3.6.0"
}
}
import axios from 'axios'
import _ from 'lodash'
// import tools from '@tool'
import { MessageBox, Message } from 'element-ui'
import qs from 'qs'
export default class API {
constructor(config) {
/* 创建一个 自定义配置axios实例 */
axios.defaults.withCredentials = true // 让ajax携带cookie
// 让ajax携带cookie
axios.defaults.withCredentials = true
this._axios = axios.create({
timeout: config.timeout || 5 * 1000,
/* 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream' */
......@@ -18,71 +17,40 @@ export default class API {
headers: {
Accept: '*/*',
'Accept-Language': '',
'Content-Type': 'application/json'
'Content-Type': 'application/x-www-form-urlencoded'
}
})
}
/* 获取当前Vue创建实例 */
getVueInstance() {
return window.G.$instance_vue
}
/* 重新封装 请求时的执行函数 */
_request(_config = {}) {
/* 具体执行请求成功后业务逻辑前,先执行该方法 */
let beforeSuccess = _config.beforeSuccess
? _config.beforeSuccess
: this._reqSuccess
const beforeSuccess = _config.beforeSuccess ? _config.beforeSuccess : this._reqSuccess
/* 具体执行请求失败后业务逻辑前,先执行该方法 */
let beforeFail = _config.beforeFail ? _config.beforeFail : this._reqFail
/* 这里可以统一处理 登录 */
/**
* 增加 Cookie 和 请求头传值,如果是 服务端渲染,就放Node端
* 所有请求 全部增加 token 和 tenant 请求头并 自带 cookie
*/
// let s = decodeURIComponent(tools.cookies.getCookie('_SUP') || '')
// let ticket = ''
// s = s.match(/"([\d\w=]+)";\}$/)
// if (s && s.length === 2) {
// s = new Buffer(s[1], 'base64').toString() // eslint-disable-line
// s = s.slice(12, s.search('-TGT') + 4)
// ticket = s.split('').reverse().join('')
// }
let headers = {
// 'X-Forwarded-For': req.get('x-forwarded-for'),
// 'X-Real-Ip': req.get('x-real-ip'),
// 'token': ticket,
tenant: 'kelley',
version: window.G.VERSION
const beforeFail = _config.beforeFail ? _config.beforeFail : this._reqFail
const headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
_config.headers = _.assignIn(_config.headers, headers)
/* 判别传输方式 */
if (
_config.headers['Content-Type'] === 'application/x-www-form-urlencoded'
) {
/* 必须使用 Form-Data 方式 */
let str = ''
let _obj = _config.data || _config.params
for (let key in _obj) {
str += key + '=' + _obj[key] + '&'
}
str = str.substr(0, str.length - 1)
if (_config.data) {
_config.data = str
} else {
_config.params = str
}
_config.headers = _.assignIn(headers, _config.headers)
/* 判别 传输方式 */
if (_config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
_config.data = qs.stringify(_config.data)
}
if (_config.headers['Content-Type'] === 'multipart/form-data') {
let fr = new FormData() // eslint-disable-line
let _obj = _config.data || _config.params
for (let key in _obj) {
const _obj = _config.data || _config.params
for (const key in _obj) {
fr.append(key, _obj[key])
}
_config.data = fr
}
/* 创建并根据参数发起请求 */
return this._axios(_config).then(
beforeSuccess.bind(this),
beforeFail.bind(this)
)
return this._axios(_config).then(beforeSuccess.bind(this), beforeFail.bind(this))
}
/**
......@@ -91,39 +59,10 @@ export default class API {
* @param {[object]} res 返回数据
*/
_reqSuccess(res) {
let { status, data } = res
const { status, data } = res
let err = null
/* 针对 MBA学习系统 做特殊 请求成功处理 */
if (status === 200) {
if (data === null) {
return data
}
if (data.status === 403 && !/\/getinfo$/gi.test(res.config.url)) {
MessageBox.confirm('登录状态已过期, 请重新登录。', '提示', {
confirmButtonText: '确定',
// cancelButtonText: '取消',
type: 'warning',
showClose: false,
closeOnPressEscape: false,
closeOnClickModal: false,
showCancelButton: false
})
.then(() => {
/* 重新刷新当前页 */
window.location.reload()
})
.catch(() => {
Message({
type: 'info',
message: '已取消,将不再记录任何数据操作,除非重新登录'
})
})
} else if (data.status !== 200 && data.message) {
err = new Error(data.message)
throw err
} else {
return data
}
return data
} else {
err = new Error(JSON.stringify(res.data))
throw err
......@@ -137,55 +76,10 @@ export default class API {
*/
_reqFail(res) {
let err = null
if (res.response) {
if (res.response.data) {
if (
!/\/getinfo$/gi.test(res.config.url) &&
res.response.data.status === 403
) {
MessageBox.confirm('登录状态已过期, 请重新登录。', '提示', {
confirmButtonText: '确定',
// cancelButtonText: '取消',
type: 'warning',
showClose: false,
closeOnPressEscape: false,
closeOnClickModal: false,
showCancelButton: false
})
.then(() => {
/* 重新刷新当前页 */
window.location.reload()
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消,将不再记录任何数据操作,除非重新登录'
})
})
}
err = new Error(res.response.data.message)
} else if (
res.response.data.status === 401 &&
res.response.data.message
) {
MessageBox.confirm(res.response.data.message, '提示', {
confirmButtonText: '关闭',
// cancelButtonText: '取消',
type: 'warning',
showClose: false,
closeOnPressEscape: false,
closeOnClickModal: false,
showCancelButton: false
}).then(() => {
/* 重新刷新当前页 */
window.location.reload()
})
} else {
/* 错误处理,服务端非正常返回 */
err = new Error(JSON.stringify(res.response))
}
} else if (res.code === 'ECONNABORTED') {
if (res.code === 'ECONNABORTED') {
err = new Error('网络超时,请稍后重试')
} else if (res.response) {
err = new Error(JSON.stringify(res.response))
} else {
err = new Error('msg:' + res.message + 'stack:' + res.stack)
err.code = 500
......@@ -196,24 +90,21 @@ export default class API {
/* 重新实现 get请求 */
get(url, data, config) {
return this._request(
_.assignIn({ url, method: 'GET', params: data }, config)
)
return this._request(_.assignIn({ url, method: 'GET', params: data }, config))
}
/* 重新实现 post请求 */
post(url, data, config) {
return this._request(
_.assignIn({ url, method: 'POST', data: data }, config)
)
return this._request(_.assignIn({ url, method: 'POST', data: data }, config))
}
/* 重新实现 put请求 */
put(url, data, config) {
return this._request(_.assignIn({ url, method: 'PUT', data: data }, config))
}
/* 重新实现 delete请求 */
delete(url, data, config) {
return this._request(
_.assignIn({ url, method: 'DELETE', params: data }, config)
)
return this._request(_.assignIn({ url, method: 'DELETE', params: data }, config))
}
}
import BaseAPI from '@/api/base_api'
const httpRequest = new BaseAPI(webConf)
const projectId = webConf.others.projectId
/**
* 获取用户信息
*/
export function getUser() {
return httpRequest.get('/passport/account/get-user-info')
}
/**
* 修改用户信息
*/
export function updateUser(data) {
return httpRequest.post('/usercenter/user/update-user', data)
}
/**
* 修改密码
*/
export function updatePassword(data) {
return httpRequest.post('/usercenter/user/update-pwd', data)
}
/**
* 发送验证码
*/
export function sendCode(data) {
return httpRequest.post('/usercenter/user/send-code', data)
}
/**
* 获取报名信息
*/
export function getApplication(params) {
return httpRequest.get(`/enrollment/v1.0/application-materials/${projectId}`, params)
}
/**
* 获取报名信息
*/
export function updateApplication(data) {
return httpRequest.post(`/enrollment/v1.0/application-materials/${projectId}/put`, data, {
headers: { 'Content-Type': 'application/json' }
})
}
/**
* 获取报名审核状态
*/
export function getApplicationStatus() {
return httpRequest.get(`/enrollment/v1.0/application-materials/profile/${projectId}`)
}
/**
* 获取支付二维码
*/
export function getOrder(params) {
return httpRequest.get(
`/enrollment/v1.0/application-materials/payment-records/request/${projectId}/APPLICATION_FEE`,
params
)
}
/**
* 检查支付状态
*/
export function checkPay(id, params) {
return httpRequest.get(
`/enrollment/v1.0/application-materials/payment-records/check-status/${projectId}/APPLICATION_FEE/${id}`,
params
)
}
/**
* 写推荐信
*/
export function addLetter(userId, letterId, data) {
return httpRequest.post(
`/enrollment/v1.0/application-materials/reco-letters/submit/${projectId}/${userId}/${letterId}/put`,
data,
{
headers: { 'Content-Type': 'application/json' }
}
)
}
/**
* 更换推荐人
*/
export function updateProvider(letterId, data) {
return httpRequest.post(
`/enrollment/v1.0/application-materials/reco-letters/change-provider/${projectId}/${letterId}/put`,
data,
{
headers: { 'Content-Type': 'application/json' }
}
)
}
/**
* 再次邀请
*/
export function sendToProvider(letterId) {
return httpRequest.get(
`/enrollment/v1.0/application-materials/reco-letters/send-invitation-to-provider/${projectId}/${letterId}`
)
}
/**
* 退出登录
*/
export function logout() {
return httpRequest.get('/passport/rest/logout')
}
<template>
<div id="app">
<router-view />
</div>
</template>
<template>
<svg class="NuxtLogo" width="245" height="180" viewBox="0 0 452 342" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path
d="M139 330l-1-2c-2-4-2-8-1-13H29L189 31l67 121 22-16-67-121c-1-2-9-14-22-14-6 0-15 2-22 15L5 303c-1 3-8 16-2 27 4 6 10 12 24 12h136c-14 0-21-6-24-12z"
fill="#00C58E"
/>
<path
d="M447 304L317 70c-2-2-9-15-22-15-6 0-15 3-22 15l-17 28v54l39-67 129 230h-49a23 23 0 0 1-2 14l-1 1c-6 11-21 12-23 12h76c3 0 17-1 24-12 3-5 5-14-2-26z"
fill="#108775"
/>
<path
d="M376 330v-1l1-2c1-4 2-8 1-12l-4-12-102-178-15-27h-1l-15 27-102 178-4 12a24 24 0 0 0 2 15c4 6 10 12 24 12h190c3 0 18-1 25-12zM256 152l93 163H163l93-163z"
fill="#2F495E"
fill-rule="nonzero"
/>
</g>
</svg>
</template>
<style>
.NuxtLogo {
animation: 1s appear;
}
@keyframes appear {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
</style>
<template>
<div class="content-box">
<div class="content">
<div class="menu">
<div v-for="(item, value) in list" :key="value">
<router-link :to="item.url">
<div class="li">{{ item.name }}</div>
</router-link>
<div v-if="item.child" class="list-child">
<div class="list-child-title">必填项</div>
<router-link v-for="(idx, val) in item.child" :key="val" :to="idx.url">
<div class="child-li">{{ idx.name }}</div>
</router-link>
</div>
</div>
</div>
<div class="fill">
<slot></slot>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['menu'],
data: function () {
return {
list: this.menu,
}
},
}
</script>
<style lang="scss" scoped>
@import '../assets/css/ProjectContent';
a {
display: block;
}
.list-li {
font-size: 18px;
}
.child-li {
height: 34px;
line-height: 34px;
}
.list-child-title {
padding-top: 20px;
padding-bottom: 10px;
}
</style>
export default class GlobalVariable {
/* 初始化函数,传入整个Vue对象 */
init (Vue, obj) {
init(Vue, obj) {
this.setInitSiderbarVar(Vue, obj)
this.setInitUserInfo(Vue)
}
......@@ -8,7 +8,7 @@ export default class GlobalVariable {
* 定义siderbar 初始变量
* 目的:刷新页面时,定位siderbar位置
*/
setInitSiderbarVar (Vue, obj) {
setInitSiderbarVar(Vue, obj) {
let _$ = Vue.prototype.$GlobalVariable
if (/^\/app\//g.test(obj.to.path)) {
_$['siderbar'] = {
......@@ -19,7 +19,7 @@ export default class GlobalVariable {
/**
* 定义 UserInfo 初始化用户信息,判断是否登录等
*/
setInitUserInfo (Vue) {
setInitUserInfo(Vue) {
let _$ = Vue.prototype.$GlobalVariable
if (!_$.UserInfo) {
_$.UserInfo = {}
......
<template>
<el-button v-bind="$attrs" :disabled="currentDisabled" @click="start">{{ curretnValue }}</el-button>
</template>
<script>
export default {
name: 'Countdown',
props: {
step: { type: Number, default: 1000 },
disabled: { type: Boolean, default: false },
seconds: { type: Number, default: 60 },
defaultValue: { type: String, default: '获取验证码' }
},
data() {
return {
currentDisabled: false,
currentSeconds: 0,
timer: null
}
},
watch: {
disabled: {
immediate: true,
handler(value) {
this.currentDisabled = value
}
}
},
computed: {
curretnValue() {
const longTime = this.seconds - this.currentSeconds
return longTime < this.seconds ? `${longTime}秒后重发` : this.defaultValue
}
},
methods: {
genTimer() {
this.clearTimer()
this.timer = setInterval(() => {
this.currentSeconds++
if (this.currentSeconds === this.seconds) {
this.stop()
}
}, this.step)
},
clearTimer() {
this.timer && clearInterval(this.timer)
},
start() {
this.currentDisabled = true
this.genTimer()
this.$emit('start')
},
stop() {
this.clearTimer()
this.currentSeconds = 0
this.currentDisabled = false
this.$emit('stop')
}
}
}
</script>
<template>
<div class="app-footer">
<div class="app-footer-main">
<div class="inner">
<div class="left">
<img src="../../assets/img/head/ezijing-logo2.png" class="logo" />
<ul class="menu">
<li v-for="item in menuList" :key="item.href">
<a :href="item.href" target="_blank">{{ item.title }}</a>
</li>
</ul>
</div>
<div class="right">
<div class="contact">
<h3>联系我们</h3>
<p>
清控紫荆教育<br />
中国未来金融领袖计划<br />
电话:010-62793909<br />
E-mail:chinafflg@ezijing.com<br />
地址:北京市海淀区中关村东路1号院7号楼5层<br />
邮编:100000
</p>
</div>
<div class="qrcode">
<img src="https://zws-imgs-pub.ezijing.com/static/public/29ce10d35376f24ae1ecaccd57215d5c.jpg" alt="" />
<p>扫二维码关注官方微信</p>
<p>微信公众号zijingedu</p>
</div>
</div>
</div>
</div>
<div class="copyright">
<div class="inner"><p>版权所有@清控紫荆</p></div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
menuList: [
{ title: '中国教育部', href: 'http://www.moe.gov.cn/' },
{ title: '中国涉外教育监管网', href: 'http://jsj.moe.gov.cn/' },
{ title: '印第安纳大学', href: 'https://www.indiana.edu/' },
{ title: 'Kelley商学院', href: 'https://kelley.iu.edu/' },
{ title: '紫荆教育', href: 'https://www.ezijing.com/' }
]
}
}
}
</script>
<style lang="scss" scoped>
.app-footer {
.inner {
max-width: 970px;
margin: 0 auto;
}
.app-footer-main {
padding: 40px 0;
color: #a7a7a7;
background-color: #212223;
.inner {
display: flex;
justify-content: space-between;
align-items: center;
}
}
.menu {
margin-top: 10px;
line-height: 30px;
font-size: 12px;
color: #7d7d7d;
}
.right {
display: flex;
}
.contact {
h3 {
font-size: 16px;
color: #fff;
line-height: 1;
margin-bottom: 15px;
}
p {
font-size: 12px;
color: #a7a7a7;
line-height: 24px;
}
}
.qrcode {
width: 128px;
margin-left: 80px;
img {
width: 100%;
}
p {
font-size: 12px;
color: #a7a7a7;
text-align: center;
line-height: 20px;
}
}
.copyright {
height: 40px;
line-height: 40px;
color: #fff;
background: #ccc;
}
}
</style>
<template>
<header class="app-header">
<section class="app-header-bar">
<div class="inner">
<div class="login">
<template v-if="isLogin">
<div>{{ user.nickname }}</div>
<span>|</span>
<div @click="handleLogout">退出</div>
</template>
<template v-else>
<div @click="handleRegister">注册</div>
<span>|</span>
<div @click="handleLogin">登录</div>
</template>
</div>
</div>
</section>
<section class="app-header-main">
<div class="hd">
<div class="hd-left">
<a href="/"><img src="../../assets/img/head/ezijing-logo.png" class="logo" /></a>
<h1 class="title">{{ title }}</h1>
</div>
<div class="hd-right">
<img src="../../assets/img/head/kelley-logo.png" />
</div>
</div>
<div class="bd">
<ul class="nav">
<li v-for="item in navList" :key="item.path">
<router-link :to="item.path">{{ item.title }}</router-link>
</li>
</ul>
<div class="search">
<div class="lang">EN</div>
<input type="text" placeholder="Search" class="search-input" />
<div class="search-button">搜索</div>
</div>
</div>
</section>
<vue-passport ref="passport" @ready="onReady" :options="options"></vue-passport>
</header>
</template>
<script>
export default {
data() {
return {
title: '中国未来金融领袖计划',
navList: [
{ title: '首页', path: '/index' },
{ title: '项目介绍', path: '/project' },
{ title: '视频中心', path: '/videoCenter' },
{ title: '招生信息', path: '/recruit' },
{ title: '教学模块', path: '/teaching' },
{ title: '师生风采', path: '/presence' },
{ title: '职业发展', path: '/careerDev' },
{ title: '校友工作', path: '/alumniWork' }
],
isLogin: false,
user: null,
options: {
login: {
account: {
onSuccess: this.loginSuccess
},
phone: {
onSuccess: this.loginSuccess
}
}
}
}
},
computed: {
passport() {
return this.$refs.passport
}
},
watch: {
$route(route) {
if (route.query.needLogin) {
this.handleLogin()
}
}
},
methods: {
handleLogin() {
this.passport.login()
},
handleRegister() {
this.passport.register()
},
handleLogout() {
this.passport.logout()
this.isLogin = false
window.G.UserInfo = {}
this.$router.push('/')
},
onReady(isLogin, user = {}) {
this.isLogin = isLogin
this.user = user
window.G.UserInfo = user
},
loginSuccess(data) {
this.passport.checkLoginStatus((isLogin, user = {}) => {
this.isLogin = isLogin
this.user = user
this.$router.push('/my')
})
}
}
}
</script>
<style lang="scss" scoped>
.app-header {
background-color: #fff;
.inner {
max-width: 970px;
margin: 0 auto;
}
}
.app-header-bar {
height: 40px;
background-color: #333;
.login {
float: right;
display: flex;
line-height: 40px;
color: #fff;
div {
font-size: 18px;
text-align: center;
cursor: pointer;
}
span {
padding: 0 20px;
}
}
}
.app-header-main {
max-width: 970px;
margin: 0 auto;
.hd {
height: 110px;
display: flex;
justify-content: space-between;
align-items: center;
}
.hd-left {
display: flex;
justify-content: center;
align-items: center;
}
.logo {
width: 156px;
height: 50px;
}
.title {
margin-left: 20px;
padding: 0 10px;
color: #222;
font-size: 20px;
line-height: 33px;
font-weight: 600;
border-left: 2px solid #333;
}
.bd {
margin-top: -20px;
padding: 10px 0;
display: flex;
align-items: center;
justify-content: space-between;
}
.nav {
display: flex;
li {
font-size: 15px;
font-weight: 600;
color: #222;
line-height: 20px;
padding: 0 14px;
a {
position: relative;
}
&:first-child {
padding-left: 0;
}
}
li + li {
border-left: 1px solid #d7d8d9;
}
}
.router-link-active:after {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: -3px;
height: 2px;
background: #bf0927;
}
.search {
display: flex;
align-items: center;
}
.lang {
font-size: 15px;
color: #999;
}
.search-input {
outline: none;
width: 159px;
height: 34px;
border-radius: 4px;
border: 1px solid #ccc;
margin: 0 3px 0 8px;
padding-left: 13px;
font-size: 15px;
color: #999;
}
.search-button {
width: 54px;
height: 34px;
border-radius: 4px;
border: 1px solid #ccc;
font-size: 15px;
color: #999;
text-align: center;
line-height: 34px;
cursor: pointer;
}
}
</style>
<template>
<div class="app-layout">
<app-header />
<app-main />
<app-footer v-if="hasFooter" />
</div>
</template>
<script>
import AppHeader from './header'
import AppMain from './main'
import AppFooter from './footer'
export default {
props: {
hasFooter: { type: Boolean, default: true }
},
components: { AppHeader, AppMain, AppFooter }
}
</script>
<template>
<div class="app-main">
<router-view />
</div>
</template>
<template>
<el-row type="flex" justify="center">
<el-col :xs="24" :sm="18" :md="12" :lg="9" :xl="6">
<el-form ref="setAccountform" :model="setAccount" :rules="accountRules">
<el-form-item prop="user">
<el-input class="self-input" v-model="setAccount.user" type="text" placeholder="手机号" @keyup.enter.native="onSubmitSetAccount">
</el-input>
</el-form-item>
<el-form-item prop="pwd">
<el-input v-model="setAccount.pwd" :disabled="isSendDisable" type="text" placeholder="短信验证码" @keyup.enter.native="onSubmitSetAccount">
<el-button slot="suffix" size="mini" :disabled="isSendDisable || isSendCode" @click="sendCode">{{sendBtnText}}</el-button>
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="login-btn" @click="onSubmitSetAccount">登录</el-button>
</el-form-item>
<div class="text">
<span class="code-login">
<template v-if="query.rd">
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ path: '/login/index?rd=' + query.rd }">密码登录</router-link>
</template>
<template v-else>
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ name: 'normalLogin' }">密码登录</router-link>
</template>
</span>
<span class="forget-pwd">
<template v-if="query.rd">
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ path: '/login/forget?rd=' + query.rd }">忘记密码</router-link>
</template>
<template v-else>
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ name: 'forgetPwd' }">忘记密码</router-link>
</template>
</span>
</div>
</el-form>
</el-col>
</el-row>
</template>
<script>
import { request } from '@action'
export default {
props: {
params: { type: Object, required: false, default: {} },
query: { type: Object, required: false, default: {} }
},
data () {
/* 账号输入正确时,才能获取验证码 */
let checkAccount = (rule, value, callback) => {
/* 手机格式 */
if (/^1[3-9]\d{9}$/.test(value)) {
this.isSendDisable = false
callback()
} else {
this.isSendDisable = true
callback(new Error('请输入正确格式的手机号'))
}
}
return {
isSendDisable: true, // 是否可以发送
isSendCode: false, // 是否已发送验证码
timeInterval: null, // 定时器,倒计时
sendBtnText: '发送验证码', // 按钮 文字
setAccount: {},
accountRules: {
'user': [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{ validator: checkAccount, trigger: 'change' }
],
'pwd': [
{ required: true, message: '请输入短信验证码', trigger: 'blur' }
]
}
}
},
beforeDestroy () { /* 清空倒计时 */ this.clearTime() },
methods: {
/* 发送验证码 */
sendCode () {
if (!this.isSendCode) {
// const loading = this.$loading({ lock: true, text: '', spinner: '', background: 'rgba(255, 255, 255, 0.9)' })
request({
component: this,
actionName: 'loginAction',
functionName: 'sendCode',
data: {
mobile: this.setAccount.user
},
thenCallback: res => {
if (res.status === 200) {
/* 发送验证码不管是否成功,都开始倒计时 */
let time = 60
this.isSendCode = true
this.sendBtnText = '60s后重发'
this.timeInterval = setInterval(() => {
if (time-- > 0) {
this.sendBtnText = time + 's后重发'
} else {
this.isSendCode = false
this.sendBtnText = '发送验证码'
clearInterval(this.timeInterval)
}
}, 1000)
} else {
return new Error(JSON.stringify(res))
}
},
catchCallback: e => {},
finallyCallback: () => {}
})
}
},
/* 清空倒计时 */
clearTime () {
this.isSendCode = true
this.sendBtnText = '发送验证码'
clearInterval(this.timeInterval)
},
onSubmitSetAccount () {
this.$refs['setAccountform'].validate((valid) => {
if (valid) {
request({
component: this,
actionName: 'loginAction',
functionName: 'codeLogin',
data: {
mobile: this.setAccount.user,
code: this.setAccount.pwd
},
thenCallback: data => {
/* 查询上次跳转信息,并跳转回去 */
if (this.query.rd) {
this.$router.push({ path: decodeURIComponent(this.query.rd) })
} else {
this.$router.push({ path: '/' })
}
},
catchCallback: e => {},
finallyCallback: () => {}
})
} else {
this.$message.error('请根据输入框提示,检查输入项。')
return false
}
})
}
}
}
</script>
<template>
<div>
<el-steps :active="stepActive" align-center>
<el-step title="步骤1"></el-step>
<el-step title="步骤2"></el-step>
<el-step title="步骤3"></el-step>
</el-steps>
<div v-if="stepActive === 1" class="step1">
<el-form ref="form1" :model="accountSet" :rules="accountRules" @submit.native.prevent>
<el-row>
<el-col :xs="24" :sm="18" :md="18" :lg="18" :xl="18">
<el-form-item prop="account">
<el-input v-model="accountSet.account" type="text" placeholder="输入注册手机号/邮箱" @keyup.enter.native="onSubmitForm1"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="6" :md="6" :lg="6" :xl="6">
<el-form-item>
<el-button type="primary" @click="onSubmitForm1">发送验证码</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="go-back">
<template v-if="query.rd">
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ path: '/login/index?rd=' + query.rd }">返回登录</router-link>
</template>
<template v-else>
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ name: 'normalLogin' }">返回登录</router-link>
</template>
</div>
</div>
<div v-if="stepActive === 2" class="step2">
<div class="txt">
验证码已发送至:{{accountSet.account}}
</div>
<el-form ref="form2" :model="accountSet" :rules="accountRules" @submit.native.prevent>
<el-row>
<el-col :xs="24" :sm="14" :md="14" :lg="14" :xl="14">
<el-form-item label-width="1.2rem" prop="code" :label="(accountSet.type ? '邮箱验证码' : '手机验证码')">
<el-input v-model="accountSet.code" type="text" placeholder="输入4位验证码"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="10" :md="10" :lg="10" :xl="10">
<el-form-item>
<el-button type="primary" :disabled="isSendCode" @click="sendCode">{{sendBtnText}}</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="operate">
<el-row>
<el-col :span="12">
<el-button @click="goPrevStep">上一步</el-button>
</el-col>
<el-col :span="12">
<el-button @click="onSubmitForm2">下一步</el-button>
</el-col>
</el-row>
</div>
</div>
<div v-if="stepActive === 3" class="step3">
<el-form ref="form3" :model="accountSet" :rules="accountRules">
<el-form-item label-width="1.1rem" prop="newpwd" label="新密码">
<el-input v-model="accountSet.newpwd" type="password" placeholder="请输入6-20个字母、数字及标点符号,不可仅数字"></el-input>
</el-form-item>
<el-form-item label-width="1.1rem" prop="repwd" label="重复新密码">
<el-input v-model="accountSet.repwd" type="password" placeholder="请重新输入新密码"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmitForm3">完成</el-button>
</el-form-item>
</el-form>
</div>
<el-dialog
title=""
:visible.sync="centerDialogVisible"
width="30%"
center append-to-body>
<i class="el-icon-success" style="display: block; font-size: 0.6rem; text-align: center; color: #67c23a;"></i>
<span style="display: block; margin-top: 0.2rem; text-align: center;">密码设置成功</span>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="goLogin">登 录</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { request } from '@action'
export default {
props: {
params: { type: Object, required: false, default: {} },
query: { type: Object, required: false, default: {} }
},
data () {
/* 检查账号格式 */
let checkAccount = (rule, value, callback) => {
if (!/^(1[3-9]\d{9}|[\w\.]+@\w+(\.\w+)+)$/.test(value)) { // eslint-disable-line
callback(new Error('请输入正确格式的手机号/邮箱'))
} else {
/* 手机格式 */
if (/^(1[3-9]\d{9}$)/.test(value)) {
this.accountSet.type = 0
}
/* 邮箱格式 */
if (/^([\w\.]+@\w+(\.\w+)+)/.test(value)) { // eslint-disable-line
this.accountSet.type = 1
}
callback()
}
}
/* 检查密码 */
let checkPwd = (rule, value, callback) => {
if (value === this.accountSet.newpwd) {
callback()
} else {
callback(new Error('两次输入密码不一致'))
}
}
return {
stepActive: 1,
isSendCode: false, // 是否已发送验证码
timeInterval: null, // 定时器,倒计时
sendBtnText: '发送验证码', // 按钮 文字
accountSet: {
type: 0, // 0:表示手机格式,1:表示邮箱格式
account: '',
code: ''
},
accountRules: {
'account': [
{ required: true, message: '请输入注册手机号/邮箱', trigger: 'blur' },
{ validator: checkAccount, trigger: 'change' }
],
'code': [
{ required: true, message: '请输入4位数字验证码', trigger: 'blur' },
{ pattern: /^(\d{4})$/, message: '请输入4位数字验证码', trigger: 'change' }
],
'newpwd': [
{ required: true, message: '请输入新密码', trigger: 'blur' },
{ pattern: /^.*[^\d]+.*$/, message: '请输入6-20个字母、数字及标点符号,不可仅数字', trigger: 'blur' }
],
'repwd': [
{ required: true, message: '请重复输入新密码', trigger: 'blur' },
{ validator: checkPwd, trigger: 'change' }
]
},
centerDialogVisible: false // 修改密码成功弹框
}
},
beforeDestroy () { /* 清空倒计时 */ this.clearTime() },
methods: {
/* 上一步 */
goPrevStep () {
this.stepActive -= 1
/* 清空 第一步 填写内容 */
this.accountSet.account = ''
/* 清空倒计时 */
this.clearTime()
},
/* 第一步 提交 */
onSubmitForm1 () {
this.$refs['form1'].validate((valid) => {
if (valid) {
/* 跳到第二步 */
this.stepActive = 2
/* 跳到第二步 并 发送验证码 */
this.sendCode()
} else {
this.$message.error('请检查手机号或邮箱是否输入正确')
return false
}
})
},
/* 发送验证码 */
sendCode () {
if (!this.isSendCode) {
request({
component: this,
actionName: 'loginAction',
functionName: 'sendResetPwdCode',
data: {
contact: this.accountSet.account,
source_type: 3
},
thenCallback: res => {
if (res.status === 200) {
/* 发送验证码不管是否成功,都开始倒计时 */
let time = 60
this.isSendCode = true
this.sendBtnText = '60s后重发'
this.timeInterval = setInterval(() => {
if (time-- > 0) {
this.sendBtnText = time + 's后重发'
} else {
this.isSendCode = false
this.sendBtnText = '发送验证码'
clearInterval(this.timeInterval)
}
}, 1000)
this.$message({
type: 'success',
message: '验证码已成功发送,请耐心等待。每天最高发送5次',
duration: 10000
})
} else {
return new Error(JSON.stringify(res))
}
},
catchCallback: e => { this.goPrevStep() },
finallyCallback: () => {}
})
}
},
/* 清空倒计时 */
clearTime () {
this.isSendCode = false
this.sendBtnText = '发送验证码'
clearInterval(this.timeInterval)
},
/* 第二步 提交 */
onSubmitForm2 () {
this.$refs['form2'].validate((valid) => {
if (valid) {
request({
component: this,
actionName: 'loginAction',
functionName: 'validateCode',
data: {
contact: this.accountSet.account,
code: this.accountSet.code
},
thenCallback: data => {
if (data.status === 200) {
/* 跳到第三步 */
this.stepActive = 3
} else {
return new Error(JSON.stringify(data))
}
},
catchCallback: () => {},
finallyCallback: () => {}
})
} else {
this.$message.error('请检查验证码是否输入正确!')
return false
}
})
},
/* 第三步 提交 */
onSubmitForm3 () {
this.$refs['form3'].validate((valid) => {
if (valid) {
request({
component: this,
actionName: 'loginAction',
functionName: 'resetPwd',
data: {
contact: this.accountSet.account,
code: this.accountSet.code,
new_password: this.accountSet.repwd
},
thenCallback: data => {
if (data.status === 200) {
this.centerDialogVisible = true
} else {
return new Error(JSON.stringify(data))
}
},
catchCallback: () => {},
finallyCallback: () => {}
})
} else {
this.$message.error('请检查输入项是否输入正确!')
return false
}
})
},
/**
* 关闭弹框时,跳转 登录页
*/
goLogin () {
this.centerDialogVisible = false
/* 跳转到 登录 */
this.$router.push({ path: '/login/index' })
}
}
}
</script>
.p-con { position: relative; width: 100%; height: 70%; background: #8e8e8e; color: #535353; text-align: center; }
/* 头部 */
.p-con .hd { position: absolute; top: 0; left: 0; right: 0; background: #ffffff; }
.p-con .hd img { display: block; margin: 0 auto; padding: 0.3rem 0 0.1rem 0; }
.p-con .hd .txt { margin: 0 auto; padding: 0 0 0.2rem 0; letter-spacing: 0.05rem; font-size: 0.32rem; font-weight: 700; }
/* 底部 */
.p-con .ft { position: fixed; bottom: 0; left: 0; right: 0; padding: 0.4rem 0 0.1rem 0; background: #e5e5e5; }
.p-con .ft .num { font-size: 0.14rem; line-height: 1.5; }
.p-con .ft .time { font-size: 0.14rem; line-height: 1.5; }
.p-con .ft .txt { padding: 0.1rem; color: #898989; font-size: 0.12rem; line-height: 1.5; }
/* 中间部分 */
.p-con .bd { position: relative; /* padding: 1.45rem 0 1.3rem 0; */ margin: 0 auto; height: 100%; /* min-height: 6rem; */ box-sizing: border-box; }
.p-con .bd .router-link-class { color: #ffffff; text-decoration: none; }
/* normal 登录 */
.p-con .bd .top50 { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
.p-con .bd .top50 img { display: block; margin: 0 auto; }
.p-con .bd .top50 .login-btn { margin-top: 0.1rem; background: #ffffff; border-color: #ffffff; color: #000; width: 100%; }
.p-con .bd .top50 .text { margin-top: -16px; color: #e5e5e5; font-size: 16px; line-height: 1.5; overflow: hidden; }
.p-con .bd .top50 .text .code-login { float: left; cursor: pointer; }
.p-con .bd .top50 .text .forget-pwd { float: right; cursor: pointer; }
/* forget 登录 */
.step1 { font-size: 0.16rem; width: 71%; margin: 0.6rem auto 0 auto; }
.step1 .go-back { margin-top: 0.2rem; text-align: left; }
.step2 { width: 71%; margin: 0.6rem auto 0 auto; }
.step2 .txt { margin-bottom: 0.3rem; font-size: 0.16rem; color: #ffffff; text-align: left; }
.step2 .el-form-item__label { font-size: 0.16rem; color: #ffffff; }
.step2 .operate { margin-top: 0.2rem; }
.step3 { width: 68%; margin: 0.6rem auto 0 auto; }
.step3 .el-form-item:last-child { margin-bottom: 0; }
.step3 .el-form-item__label { font-size: 0.16rem; color: #ffffff; text-align: left; }
/* Extra small devices (portrait phones, less than 576px) */
@media (max-width: 575px) {
html { font-size: 80px; }
.step3 { width: 90%; }
}
/* Small devices (landscape phones, 576px and up) */
@media (min-width: 576px) and (max-width: 767px) {
html { font-size: 80px; }
.step3 { width: 80%; }
}
/* Medium devices (tablets, 768px and up) */
@media (min-width: 768px) and (max-width: 991px) {
html { font-size: 80px; }
}
/* Large devices (desktops, 992px and up) */
@media (min-width: 992px) and (max-width: 1199px) {
html { font-size: 90px; }
}
/* Extra large devices (large desktops, 1200px and up) */
@media (min-width: 1200px) {
html { font-size: 100px; }
}
<template>
<div class="p-con">
<div class="bd">
<div class="top50 container">
<router-view></router-view>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
/* 这部分 架构 样式 基于 bootstrap - 4.1.3 栏删格系统 */
/* 由于压缩后 样式覆盖不上,直接采用 css方式 */
@import './login.css';
</style>
<template>
<el-row type="flex" justify="center">
<el-col :xs="24" :sm="18" :md="12" :lg="9" :xl="6">
<el-form ref="setAccountform" :model="setAccount" :rules="accountRules">
<el-form-item prop="user">
<el-input class="self-input" v-model="setAccount.user" type="text" placeholder="手机/邮箱" @keyup.enter.native="onSubmitSetAccount">
<i slot="prefix" class="el-input__icon el-icon-self-character"></i>
</el-input>
</el-form-item>
<el-form-item prop="pwd">
<el-input v-model="setAccount.pwd" type="password" placeholder="密码" @keyup.enter.native="onSubmitSetAccount">
<i slot="prefix" class="el-input__icon el-icon-self-mima"></i>
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="login-btn" @click="onSubmitSetAccount">登录</el-button>
</el-form-item>
<div class="text">
<span class="code-login">
<template v-if="query.rd">
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ path: '/login/code?rd=' + query.rd }">验证码登录</router-link>
</template>
<template v-else>
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ name: 'codeLogin' }">验证码登录</router-link>
</template>
</span>
<span class="forget-pwd">
<template v-if="query.rd">
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ path: '/login/forget?rd=' + query.rd }">忘记密码</router-link>
</template>
<template v-else>
<router-link class="router-link-class" active-class="router-link-active-class" :to="{ name: 'forgetPwd' }">忘记密码</router-link>
</template>
</span>
</div>
</el-form>
</el-col>
</el-row>
</template>
<script>
import { request } from '@action'
import Base64 from 'Base64'
export default {
props: {
params: { type: Object, required: false, default: {} },
query: { type: Object, required: false, default: {} }
},
data () {
return {
setAccount: {},
accountRules: {
'user': [
{ required: true, message: '请输入账号', trigger: 'blur' },
{ pattern: /^(1[3-9]\d{9}|[\w\.]+@\w+(\.\w+)+)$/, message: '请输入正确格式的手机号/邮箱', trigger: 'change' } // eslint-disable-line
],
'pwd': [
{ required: true, message: '请输入密码', trigger: 'blur' }
]
}
}
},
methods: {
onSubmitSetAccount () {
this.$refs['setAccountform'].validate((valid) => {
if (valid) {
request({
component: this,
actionName: 'loginAction',
functionName: 'userLogin',
data: {
login_name: this.setAccount.user,
password: this.$md5('uokoaduw' + this.setAccount.pwd.split('').reverse().join('') + 'auhgniq'),
pwd: Base64.encode('uokoaduw' + this.setAccount.pwd.split('').reverse().join('') + 'auhgniq') // 追加上 密码
},
thenCallback: res => {
/* 查询上次跳转信息,并跳转回去 */
if (this.query.rd) {
this.$router.push({ path: decodeURIComponent(this.query.rd) })
} else {
window.G.pwd = Base64.encode('uokoaduw' + this.setAccount.pwd.split('').reverse().join('') + 'auhgniq')
this.$router.push({ path: '/' })
}
/* 重置账号、密码 */
// this.$refs['setAccountform'].resetFields()
},
catchCallback: () => {},
finallyCallback: () => {}
})
} else {
this.$message.error('请根据输入框提示,检查输入项。')
return false
}
})
}
}
}
</script>
<template>
<div>
<h3>入学协议</h3>
<div>
<input type="file"/>
</div>
<div>尚未上传文件</div>
<p>申请者可将签字后的入学协议原件扫描或拍照后提交。<br/>
学员应仔细阅读《入学协议》以及课程介绍,如对入学协议或课程有异议,请第一时间与课程顾问咨询确认。<br/>
请用A4纸打印后,在入学协议上签上姓名和日期,内容需显示完整、格式整齐、字迹清晰可辨。<br/>
上传文件仅限“jpg,jpeg,pdf,png”格式,文件小于10Mb。</p>
</div>
</template>
......@@ -4,10 +4,11 @@ import '@ezijing/vue-form/dist/vue-form.css'
import VuePassport from '@ezijing/vue-passport'
import '@ezijing/vue-passport/dist/vue-passport.css'
import Element from 'element-ui' // 引入 element-ui 框架
import './components/style/_com.scss' // 定义 element-ui主题色 + 公共样式
import VueRouter from 'vue-router' // 使用 vue-router
import createRouter from './router' // router定义
import Main from './main.vue' // 初始化 vue页面
import './style.scss' // 定义 element-ui主题色 + 公共样式
import router from './router' // router定义
import store from './store'
import App from './app.vue'
// import cTool from '@tool'
/* 引入 md5 */
import md5 from 'js-md5'
......@@ -15,10 +16,8 @@ import md5 from 'js-md5'
import BeforeRouter from './components/before'
Vue.use(Element)
Vue.use(VueRouter)
Vue.use(VueForm)
Vue.use(VuePassport)
const router = createRouter()
/* 设置全局变量 */
window.G = Vue.prototype.$GlobalVariable = {
VERSION: 'PC-1.5.6'
......@@ -47,6 +46,7 @@ Vue.prototype.VueEvent = new Vue()
// Vue.prototype.jq = $
new Vue({
store,
router,
render: h => h(Main)
render: h => h(App)
}).$mount('#app')
<template>
<div style="height: 100%; width: 100%">
<div class="login" v-show="$route.path != '/preview'">
<div class="content">
<template v-if="isLogin">
<div @click="handleLogout">退出</div>
<span>|</span>
<div>{{ user.nickname }}</div>
</template>
<template v-else>
<div @click="handleRegister">注册</div>
<span>|</span>
<div @click="handleLogin">登录</div>
</template>
</div>
</div>
<vue-passport ref="passport" @ready="onReady" :options="options" v-show="$route.path != '/preview'"></vue-passport>
<div class="head" v-show="$route.path != '/preview'">
<div class="logo-box center97">
<img src="./assets/img/head/ezijing-logo.png" alt="" />
<div class="line"></div>
<!-- <img src="./assets/img/head/kelley-logo.png" alt=""> -->
<div class="logo-text">中国未来金融领袖计划</div>
<img src="./assets/img/head/kelley-logo.png" alt="" class="logo-right" />
</div>
<div class="menu-box center97">
<ul class="menu">
<router-link class="none" to="/index">
<li>首页</li>
</router-link>
<router-link to="/project">
<li>项目介绍</li>
</router-link>
<router-link to="/videoCenter">
<li>视频中心</li>
</router-link>
<router-link to="/recruit">
<li>招生信息</li>
</router-link>
<router-link to="/teaching">
<li>教学模块</li>
</router-link>
<router-link to="/presence">
<li>师生风采</li>
</router-link>
<router-link to="/careerDev">
<li>职业发展</li>
</router-link>
<router-link to="/alumniWork">
<li>校友工作</li>
</router-link>
</ul>
<div class="search">
<div class="lang">EN</div>
<input type="text" placeholder="Search">
<div class="btn">搜索</div>
</div>
</div>
<!-- <vue-passport ref="passport" @ready="onReady" :options="options"></vue-passport> -->
<!-- <div class="menu-box">
<div class="menu">
<router-link to="/">
<div class="menu-logo">
<img src="./assets/img/logo.png" alt="logo" />
</div>
</router-link>
<ul class="menu-a">
<router-link class="none" to="/signup/index?active=center">
<li class="signup">在线报名</li>
</router-link>
<router-link to="/project">
<li>项目介绍</li>
</router-link>
<router-link to="/news">
<li>新闻中心</li>
</router-link>
<router-link to="/know">
<li>招生中心</li>
</router-link>
<router-link to="/download">
<li>下载专区</li>
</router-link>
<router-link to="/contact">
<li>联系我们</li>
</router-link>
</ul>
</div>
</div> -->
</div>
<router-view></router-view>
<!-- 底部 -->
<div class="foot-box" v-show="$route.path != '/preview'">
<div class="center97">
<div class="foot">
<div class="left">
<div class="logo">
<img src="./assets/img/head/ezijing-logo2.png" alt="" class="elogo" />
<!-- <div class="line"></div> -->
<!-- <img src="./assets/img/head/kelley-logo2.png" alt="" class="klogo"> -->
</div>
<div class="con">
<div class="l">
<div @click="goPage('http://www.moe.gov.cn/')">中国教育部</div>
<div @click="goPage('http://jsj.moe.gov.cn/')">中国涉外教育监管网</div>
<div @click="goPage('https://www.indiana.edu/')">印第安纳大学</div>
<div @click="goPage('https://kelley.iu.edu/')">Kelley商学院</div>
<div @click="goPage('https://www.ezijing.com/')">紫荆教育</div>
</div>
<div class="c" style="opacity: 0;">
<div>关于项目</div>
<div>常见问题</div>
<div>关于项目</div>
<div>常见问题</div>
</div>
<div class="c" style="opacity: 0;">
<div>关于项目</div>
<div>常见问题</div>
<div>关于项目</div>
<div>常见问题</div>
</div>
</div>
</div>
<div class="centerf">
<div class="title">联系我们</div>
<div class="p">清控紫荆教育</div>
<div class="p">中国未来金融领袖计划</div>
<div class="p">电话:010-62793909</div>
<div class="p">E-mail:chinafflg@ezijing.com</div>
<div class="p">地址:北京市海淀区中关村东路1号院7号楼5层</div>
<div class="p">邮编:100000</div>
</div>
<div class="f-right">
<div class="code">
<img src="https://zws-imgs-pub.ezijing.com/static/public/29ce10d35376f24ae1ecaccd57215d5c.jpg" alt="">
</div>
<div class="txt">扫二维码关注官方微信</div>
<div class="txt">微信公众号zijingedu</div>
</div>
</div>
</div>
</div>
<div class="new-foot">
<div class="center97">
<p>版权所有@清控紫荆</p>
</div>
</div>
<!-- <div class="foot-box">
<div class="foot">
<div class="foot-logo">
<img src="./assets/img/zijing.png" alt="紫荆教育" />
</div>
<div class="relevancy">
<div class="relevancy-organ">
<span>相关机构:</span>
<a href>中国教育部</a>
<a href>中国涉外教育监管网</a>
<a href>中国产业金融菁英计划</a>
<a href>美国西部院校教育联盟认证(WASC)</a>
<a href>紫荆教育</a>
</div>
<div class="relevancy-state">
<span>网警信息:Copyright © 2017 Zijing Education. All rights reserved. 京ICP备15016866号-1</span>
</div>
</div>
</div>
</div> -->
</div>
</template>
<script>
export default {
data() {
return {
isLogin: false,
user: null,
options: {
login: {
account: {
onSuccess: this.loginSuccess
},
phone: {
onSuccess: this.loginSuccess
}
}
}
}
},
computed: {
passport() {
return this.$refs['passport']
}
},
watch: {
$route(route) {
if (route.query.needLogin) {
this.handleLogin()
}
}
},
methods: {
goPage(url) {
window.open(url)
},
mas() {
this.$message('功能暂未开放')
},
handleLogin() {
this.passport.login()
},
handleRegister() {
this.passport.register()
},
handleLogout() {
this.passport.logout()
this.isLogin = false
window.G.UserInfo = {}
this.$router.push('/')
},
onReady(isLogin, user = {}) {
this.isLogin = isLogin
this.user = user
window.G.UserInfo = user
},
loginSuccess(data) {
this.passport.checkLoginStatus((isLogin, user = {}) => {
this.isLogin = isLogin
this.user = user
this.$router.push('/signup/index')
})
}
}
}
</script>
<style>
ul,
li,
a {
padding: 0;
margin: 0;
list-style: none;
}
a {
text-decoration: none;
}
html {
font-family: PingFangSC-Regular, PingFang SC, 'Microsoft Yahei';
}
body {
margin: 0;
background: #fff;
}
p {
margin: 0;
padding: 0;
}
</style>
<style scoped>
.head {
width: 100%;
height: 146px;
background: #fff;
}
.head .logo-text {
color: #222222;
font-size: 26px;
}
.center97 {
width: 970px;
margin: 0 auto;
}
.logo-box {
height: 110px;
display: flex;
align-items: center;
}
.logo-box .line {
width: 2px;
height: 33px;
background: #333333;
border-radius: 1px;
margin: 0 20px;
}
.menu-box {
display: flex;
}
.menu-box .menu {
display: flex;
}
.menu-box .menu li {
position: relative;
color: #222;
font-size: 15px;
padding: 0 13px;
height: 20px;
border-right: 1px solid #d7d8d9;
}
.menu-box .menu .router-link-active li:after {
content: '';
position: absolute;
bottom: -3px;
left: 50%;
-webkit-transform: translateX(-50%);
width: 56px;
height: 2px;
background: #bf0927;
}
.menu-box .search {
display: flex;
margin-left: auto;
align-items: center;
margin-top: -8px;
}
.menu-box .search .lang {
font-size: 15px;
color: #999;
}
.menu-box .search input {
outline: none;
width: 159px;
height: 34px;
border-radius: 4px;
border: 1px solid #cccccc;
margin: 0 3px 0 8px;
padding-left: 13px;
font-size: 15px;
color: #999;
}
.menu-box .search .btn {
width: 54px;
height: 34px;
border-radius: 4px;
border: 1px solid #cccccc;
font-size: 15px;
color: #999;
text-align: center;
line-height: 34px;
}
.foot-box {
width: 100%;
background: #212223;
padding-bottom: 56px;
}
.foot-box .foot {
display: flex;
padding-top: 40px;
}
.foot-box .foot .left .logo {
display: flex;
align-items: center;
}
.foot-box .foot .left .logo .elogo {
width: 152px;
/* height: 50px; */
}
.foot-box .foot .left .logo .line {
width: 2px;
height: 33px;
background: #ffffff;
border-radius: 1px;
margin: 0 20px;
}
.foot-box .foot .left .logo .elogo {
width: 136px;
/* height: 40px; */
}
.foot-box .foot .left .con {
display: flex;
margin-top: 22px;
}
.foot-box .foot .left .con .l {
height: 98px;
/* border-right: 1px solid #333; */
padding-right: 10px;
/* margin-left: 30px; */
}
.foot-box .foot .left .con .l div {
font-size: 12px;
color: #7d7d7d;
margin-bottom: 10px;
cursor: pointer;
}
.foot-box .foot .left .con .c {
padding: 0 40px;
border-right: 1px solid #333;
height: 98px;
}
.foot-box .foot .left .con .c div {
font-size: 12px;
color: #7d7d7d;
margin-bottom: 10px;
}
.foot-box .centerf {
margin-left: 166px;
}
.foot-box .centerf .title {
font-size: 16px;
color: #fff;
margin-bottom: 15px;
}
.foot-box .centerf .p {
font-size: 12px;
color: #a7a7a7;
margin-bottom: 5px;
}
.foot-box .f-right {
margin-left: auto;
}
.foot-box .f-right .code {
width: 128px;
height: 128px;
background: #ffffff;
}
.foot-box .f-right .code img {
width: 100%;
height: 100%;
display: block;
}
.foot-box .f-right .txt {
color: #a7a7a7;
width: 100%;
text-align: center;
font-size: 12px;
margin-top: 5px;
}
.new-foot {
width: 100%;
height: 40px;
background: #cccccc;
}
.new-foot p {
font-size: 14px;
color: #fff;
line-height: 40px;
}
.login {
height: 40px;
background-color: #333;
line-height: 40px;
width: 100%;
font-family: PingFangSC-Regular, PingFang SC, 'Microsoft Yahei';
}
.login .content {
width: 100%;
height: 40px;
line-height: 40px;
max-width: 1200px;
margin: 0 auto;
text-align: right;
color: #ffffff;
font-size: 20px;
font-weight: 500;
}
.login .content div {
float: right;
text-align: center;
font-size: 18px;
line-height: 40px;
font-weight: 400;
cursor: pointer;
}
.login .content span {
float: right;
padding-left: 20px;
padding-right: 20px;
}
/* .menu-box {
width: 100%;
background-color: #ffffff;
height: 88px;
line-height: 88px;
}
.menu {
max-width: 1200px;
width: 100%;
margin: 0 auto;
overflow: hidden;
}
.menu-logo {
float: left;
height: 88px;
line-height: 88px;
}
.menu-logo img {
height: 60px;
vertical-align: middle;
}
.menu-a {
float: right;
display: flex;
height: 88px;
align-items: center;
}
.menu-a .router-link-active {
text-decoration: underline;
}
.menu-a .none.router-link-active {
text-decoration: none;
}
.menu-a .none.router-link-active .signup {
color: #c41230;
}
.menu-a li {
text-align: right;
padding-left: 40px;
height: 42px;
line-height: 42px;
box-sizing: border-box;
color: #000;
font-size: 18px;
font-weight: 400;
cursor: pointer;
align-items: center;
}
.menu-a .signup {
border: 2px solid #c41230;
text-align: center;
padding-left: 20px;
padding-right: 20px;
line-height: 38px;
}
.menu-a li:hover,
.login .content div:hover {
color: #c41230;
}
.foot-box {
width: 100%;
height: 138px;
background-color: #333;
}
.foot {
width: 100%;
max-width: 1200px;
height: 98px;
padding-top: 40px;
margin: 0 auto;
display: flex;
}
.foot-logo {
width: 181px;
}
.foot-logo img {
width: 181px;
height: 58px;
}
.relevancy {
margin-left: 41px;
display: flex;
flex-direction: column;
font-size: 18px;
color: #ffffff;
}
.relevancy div {
height: 32px;
line-height: 32px;
}
.relevancy div a {
color: #ffffff;
margin-left: 20px;
} */
.logo-right {
margin-left: auto;
}
</style>
# PAGES
This directory contains your Application Views and Routes.
The framework reads all the `*.vue` files inside this directory and creates the router of your application.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing).
----------------------
- recruit 招生文件夹
......@@ -3,40 +3,40 @@
<div class="banner-box">
<swiper :options="swiperOptions" ref="mySwiper" class="item-swiper">
<swiper-slide>
<img src="https://zws-imgs-pub.ezijing.com/static/public/7472ae2a061874a02e78d57f369da79a.jpg" alt="">
<img src="https://zws-imgs-pub.ezijing.com/static/public/7472ae2a061874a02e78d57f369da79a.jpg" alt="" />
</swiper-slide>
<div class="swiper-button-prev" slot="button-prev"></div>
<div class="swiper-button-next" slot="button-next"></div>
</swiper>
<ul class="nav">
<li @click="goPage('/signup/index')">
<li @click="goPage('/my')">
<div class="icon">
<img src="../../assets/img/lang/banner-i1.png" alt="">
<img src="../../assets/img/lang/banner-i1.png" alt="" />
</div>
<div class="txt">报名申请</div>
<div class="block"></div>
</li>
<li @click="goPage('/recruit')">
<div class="icon">
<img src="../../assets/img/lang/banner-i2.png" alt="">
<img src="../../assets/img/lang/banner-i2.png" alt="" />
</div>
<div class="txt">招生简章</div>
</li>
<li @click="goPage('/project')">
<div class="icon">
<img src="../../assets/img/lang/banner-i3.png" alt="">
<img src="../../assets/img/lang/banner-i3.png" alt="" />
</div>
<div class="txt">项目介绍</div>
</li>
<li @click="goPage('/recruit')">
<div class="icon">
<img src="../../assets/img/lang/banner-i4.png" alt="">
<img src="../../assets/img/lang/banner-i4.png" alt="" />
</div>
<div class="txt">资料下载</div>
</li>
<li @click="goPage('/recruit', 2)">
<div class="icon">
<img src="../../assets/img/lang/banner-i5.png" alt="">
<img src="../../assets/img/lang/banner-i5.png" alt="" />
</div>
<div class="txt">常见问题</div>
</li>
......@@ -46,33 +46,33 @@
<div class="title">项目特色</div>
<ul>
<li>
<img src="../../assets/img/lang/home-s-icon1.png" alt="">
<div class="p">国际视野与<br/>中国实践学习设置</div>
<img src="../../assets/img/lang/home-s-icon1.png" alt="" />
<div class="p">国际视野与<br />中国实践学习设置</div>
</li>
<li>
<img src="../../assets/img/lang/home-s-icon2.png" alt="">
<div class="p">金融理论与<br/>金融实操结合设计</div>
<img src="../../assets/img/lang/home-s-icon2.png" alt="" />
<div class="p">金融理论与<br />金融实操结合设计</div>
</li>
<li>
<img src="../../assets/img/lang/home-s-icon3.png" alt="">
<div class="p">全球移动研学<br/>与机构实习模式</div>
<img src="../../assets/img/lang/home-s-icon3.png" alt="" />
<div class="p">全球移动研学<br />与机构实习模式</div>
</li>
<li>
<img src="../../assets/img/lang/home-s-icon4.png" alt="">
<div class="p">复合人才培养<br/>与学业界双导师</div>
<img src="../../assets/img/lang/home-s-icon4.png" alt="" />
<div class="p">复合人才培养<br />与学业界双导师</div>
</li>
<li>
<img src="../../assets/img/lang/home-s-icon5.png" alt="">
<div class="p">金融领导力与<br/>职业发展无缝接</div>
<img src="../../assets/img/lang/home-s-icon5.png" alt="" />
<div class="p">金融领导力与<br />职业发展无缝接</div>
</li>
</ul>
</div>
<div class="new-module2">
<div class="title">培养目标</div>
<div class="mian">
<div class="txt">培养<br/>国际化、产业化、科技化的复合型金融人才和领袖</div>
<img src="https://zws-imgs-pub.ezijing.com/static/public/751bd3cfc8997722c3ee7bf1f4cef4e5.png" alt="">
</div>
<div class="title">培养目标</div>
<div class="mian">
<div class="txt">培养<br />国际化、产业化、科技化的复合型金融人才和领袖</div>
<img src="https://zws-imgs-pub.ezijing.com/static/public/751bd3cfc8997722c3ee7bf1f4cef4e5.png" alt="" />
</div>
</div>
<!-- <div class="module1">
<div class="title">培养目标</div>
......@@ -101,13 +101,23 @@
<div class="txt">具有国际竞争力的高级应用型金融人才。</div>
</div> -->
<div class="module3">
<img src="https://zws-imgs-pub.ezijing.com/static/public/3a2bd304a92d6d9496d2407111175b23.jpg" alt="" class="bg">
<img src="../../assets/img/lang/m3-btn.png" alt="" class="btn" @click="videoplay()">
<img
src="https://zws-imgs-pub.ezijing.com/static/public/3a2bd304a92d6d9496d2407111175b23.jpg"
alt=""
class="bg"
/>
<img src="../../assets/img/lang/m3-btn.png" alt="" class="btn" @click="videoplay()" />
<div id="videoAlert" v-if="videoShow">
<div class="cont">
<div class="close-box" @click="videoShow = false"></div>
<video src="https://zws-imgs-pub.ezijing.com/static/public/34fa19b6033f83337d96b44ab23324ea.mp4" width="" height="" controls="controls" preload="none" autoplay>
</video>
<video
src="https://zws-imgs-pub.ezijing.com/static/public/34fa19b6033f83337d96b44ab23324ea.mp4"
width=""
height=""
controls="controls"
preload="none"
autoplay
></video>
</div>
</div>
</div>
......@@ -116,7 +126,7 @@
<div class="swiper-mian" @click="goPreview('https://mp.weixin.qq.com/s/YFcZMtuykIXC9_eNyf_Ijg')">
<swiper :options="swiperOptions2" ref="mySwiper2" class="item-swiper">
<swiper-slide>
<img src="https://zws-imgs-pub.ezijing.com/static/public/7e8d7f04e99a15bb637efa48d2c0c14d.jpg" alt="">
<img src="https://zws-imgs-pub.ezijing.com/static/public/7e8d7f04e99a15bb637efa48d2c0c14d.jpg" alt="" />
</swiper-slide>
<div class="swiper-pagination" slot="pagination"></div>
</swiper>
......@@ -125,10 +135,17 @@
<div class="txt">肇越:公积金制度如何改革才能让老百姓得实惠?</div>
</div>
</div>
<div class="swiper-mian float-r" @click="goPreview('https://i3jtw0.smartapps.cn/subpackage/pages/docdetails/doc-details?id=ucms_7yGhOpXQ5Ej&oauthType=search&hostname=baiduboxapp&_swebfr=1')">
<div
class="swiper-mian float-r"
@click="
goPreview(
'https://i3jtw0.smartapps.cn/subpackage/pages/docdetails/doc-details?id=ucms_7yGhOpXQ5Ej&oauthType=search&hostname=baiduboxapp&_swebfr=1'
)
"
>
<swiper :options="swiperOptions2" ref="mySwiper2" class="item-swiper">
<swiper-slide>
<img src="https://zws-imgs-pub.ezijing.com/static/public/010f4dd0338d68dd8a0e54b46b7edb21.png" alt="">
<img src="https://zws-imgs-pub.ezijing.com/static/public/010f4dd0338d68dd8a0e54b46b7edb21.png" alt="" />
</swiper-slide>
<div class="swiper-pagination" slot="pagination"></div>
</swiper>
......@@ -174,7 +191,7 @@
<script>
import { Swiper, SwiperSlide, directive } from 'vue-awesome-swiper'
import 'swiper/css/swiper.css'
import 'swiper/swiper-bundle.css'
export default {
components: {
Swiper,
......@@ -183,20 +200,20 @@ export default {
directives: {
swiper: directive
},
data () {
data() {
return {
swiperOptions: {
observer: true,
autoHeight: true,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev"
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev'
}
},
swiperOptions2: {
observer: true,
pagination: {
el: ".swiper-pagination",
el: '.swiper-pagination',
clickable: true
}
},
......@@ -213,9 +230,9 @@ export default {
},
methods: {
videoplay() {
this.videoShow = true
var video = document.querySelector('#videoAlert');
video.play();
this.videoShow = true
var video = document.querySelector('#videoAlert')
video.play()
},
mas() {
this.$message('功能暂未开放')
......@@ -237,27 +254,27 @@ export default {
goPreview(url) {
window.open(url)
}
},
}
}
</script>
<style lang="scss" scoped>
.con970{
.con970 {
width: 970px;
margin: 0 auto;
}
.floats{
.floats {
display: flex;
}
.banner-box{
.banner-box {
position: relative;
width: 100%;
.item-swiper{
.item-swiper {
position: relative;
img{
img {
width: 100%;
display: block;
}
.swiper-button-prev{
.swiper-button-prev {
position: absolute;
top: 50%;
left: 125px;
......@@ -268,11 +285,11 @@ export default {
background-size: 100% 100%;
z-index: 9;
margin: 0;
&::after{
&::after {
content: '';
}
}
.swiper-button-next{
.swiper-button-next {
position: absolute;
top: 50%;
right: 125px;
......@@ -283,12 +300,12 @@ export default {
background-size: 100% 100%;
z-index: 9;
margin: 0;
&::after{
&::after {
content: '';
}
}
}
.nav{
.nav {
position: absolute;
bottom: -67px;
left: 50%;
......@@ -297,64 +314,64 @@ export default {
z-index: 9;
display: flex;
height: 134px;
li{
background: rgba(191,9,39,.7);
li {
background: rgba(191, 9, 39, 0.7);
flex: 1;
.icon{
.icon {
width: 100%;
position: relative;
height: 100px;
border-right: 1px solid rgba(255,255,255, .3);
img{
border-right: 1px solid rgba(255, 255, 255, 0.3);
img {
position: absolute;
top: 42%;
left: 50%;
-webkit-transform: translate(-50%,-50%);
-webkit-transform: translate(-50%, -50%);
}
}
.txt{
.txt {
font-size: 19px;
color: #fff;
text-align: center;
line-height: 34px;
}
.block{
.block {
width: 100%;
height: 20px;
display: none;
}
&:hover{
&:hover {
margin-top: -20px;
padding-bottom: 20px;
}
}
}
}
.module1{
.module1 {
padding: 127px 0 60px;
background: #fff;
.title{
.title {
text-align: center;
color: #BF0927;
color: #bf0927;
font-size: 32px;
margin-bottom: 40px;
}
ul{
ul {
width: 970px;
margin: 0 auto;
li{
li {
display: flex;
margin-bottom: 17px;
.txt{
.txt {
position: relative;
padding-left: 45px;
width: 528px;
font-size: 18px;
color: #717171;
&.mar{
&.mar {
margin-right: 100px;
}
&::after{
&::after {
content: '';
width: 8px;
height: 8px;
......@@ -369,33 +386,33 @@ export default {
}
}
}
.module2{
.module2 {
width: 100%;
height: 378px;
background: url(../../assets/img/lang/m2-bg.png);
background-size: cover;
.title{
.title {
color: #fff;
font-size: 32px;
padding: 65px 0 25px;
text-align: center;
}
.txt{
.txt {
color: #fff;
font-size: 16px;
text-align: center;
margin-bottom: 7px;
}
}
.module3{
.module3 {
position: relative;
width: 100%;
margin-top: 60px;
.bg{
.bg {
width: 100%;
display: block;
}
.btn{
.btn {
width: 113px;
height: 113px;
position: absolute;
......@@ -404,90 +421,98 @@ export default {
-webkit-transform: translate(-50%, -50%);
}
}
.module4{
.module4 {
background: #fff;
padding: 60px 0 30px;
.item-swiper{
.item-swiper {
width: 465px;
height: 310px;
}
.float-r{
.float-r {
margin-left: auto !important;
}
::v-deep{
.swiper-container{
::v-deep {
.swiper-container {
margin: 0;
position: initial;
}
.swiper-pagination-bullets{
.swiper-pagination-bullets {
bottom: -18px;
}
.swiper-pagination-bullet-active{
background: #BF0927;
.swiper-pagination-bullet-active {
background: #bf0927;
}
}
.swiper-mian{
.swiper-mian {
position: relative;
.written{
.written {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 64px;
background: rgba(0,0,0,0.3);
background: rgba(0, 0, 0, 0.3);
display: flex;
z-index: 9;
.btn{
.btn {
width: 114px;
height: 64px;
background: #BF0927;
background: #bf0927;
text-align: center;
line-height: 64px;
color: #fff;
font-size: 18px;
&.color{
background: #E5B075;
&.color {
background: #e5b075;
}
}
.txt{
.txt {
padding: 5px 10px 0;
font-size: 16px;
font-weight: 600;
color: #FFFFFF;
color: #ffffff;
line-height: 26px;
}
}
}
}
#videoAlert{
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
position: fixed;
top: 0;
left: 0;
z-index: 100;
// display: none;
#videoAlert {
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
position: fixed;
top: 0;
left: 0;
z-index: 100;
// display: none;
}
// #videoAlert .cont{position: relative;}
#videoAlert .close{width: 50px;position: absolute;right: 0;top: 1%;max-width: 150px;}
#videoAlert .close img{width: 50px;}
#videoAlert video{
#videoAlert .close {
width: 50px;
position: absolute;
right: 0;
top: 1%;
max-width: 150px;
}
#videoAlert .close img {
width: 50px;
}
#videoAlert video {
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
width: 80%;
height: auto;
width: 80%;
height: auto;
z-index: 9;
}
@media (max-width: 1400px){
@media (max-width: 1400px) {
#videoAlert video {
width: 60%;
width: 60%;
}
}
#videoAlert .close-box{
#videoAlert .close-box {
position: absolute;
top: 0;
left: 0;
......@@ -573,9 +598,9 @@ export default {
// justify-content: center;
// }
// }
.module4{
.swiper-slide{
img{
.module4 {
.swiper-slide {
img {
position: absolute;
top: 0;
left: 50%;
......@@ -584,29 +609,29 @@ export default {
}
}
}
.new-module1{
.new-module1 {
width: 970px;
margin: 0 auto;
padding: 127px 0 60px;
.title{
.title {
text-align: center;
font-size: 32px;
font-weight: bold;
color: #BF0927;
color: #bf0927;
line-height: 45px;
}
ul{
ul {
display: flex;
justify-content: space-between;
margin-top: 40px;
li{
img{
li {
img {
width: 61px;
height: 61px;
margin: 0 auto;
display: block;
}
.p{
.p {
text-align: center;
font-size: 18px;
color: #222222;
......@@ -616,33 +641,33 @@ export default {
}
}
}
.new-module2{
.new-module2 {
width: 100%;
height: 412px;
background: url(https://zws-imgs-pub.ezijing.com/static/public/8bb492052422218623723105e74eb996.png);
background-size: 100% 100%;
.title{
.title {
text-align: center;
font-size: 32px;
font-weight: 600;
color: #FFFFFF;
color: #ffffff;
line-height: 45px;
padding-top: 60px;
}
.mian{
.mian {
display: flex;
margin-top: 30px;
align-items: center;
width: 970px;
margin: 0 auto;
.txt{
.txt {
// width: 276px;
font-size: 22px;
font-weight: bold;
color: #FFFFFF;
color: #ffffff;
line-height: 36px;
}
img{
img {
width: 267px;
margin-left: auto;
}
......
<script>
import Index from './_lang/index.vue'
export default Index
</script>
<template>
<div class="letter">
<header class="header">
<div class="inner">
<div class="logo">
<router-link to="/"><img src="../../assets/img/head/ezijing-logo.png" /></router-link>
</div>
</div>
</header>
<nav class="nav"><h1 class="title">中国未来金融领袖计划项目推荐信</h1></nav>
<section class="content">
<el-form
:model="ruleForm"
:rules="rules"
ref="form"
label-width="100px"
:label-position="labelPosition"
@submit.native.prevent
style="max-width: 680px"
>
<el-form-item label="姓名" prop="provider_name">
<el-input v-model.trim="ruleForm.provider_name"></el-input>
</el-form-item>
<el-form-item label="推荐信内容" prop="letter_content">
<el-input type="textarea" :autosize="{ minRows: 6 }" v-model.trim="ruleForm.letter_content"></el-input>
</el-form-item>
<el-form-item label="手机号" prop="provider_phone_number">
<el-input v-model.trim="ruleForm.provider_phone_number"></el-input>
</el-form-item>
<el-form-item label="工作单位" prop="provider_company_name">
<el-input v-model.trim="ruleForm.provider_company_name"></el-input>
</el-form-item>
<el-form-item label="职务" prop="provider_job_title">
<el-input v-model.trim="ruleForm.provider_job_title"></el-input>
</el-form-item>
</el-form>
<div class="buttons">
<el-button type="primary" @click="handleSubmit">确认提交</el-button>
</div>
</section>
<el-dialog title="推荐信提交成功" :visible.sync="dialogVisible" :center="true" width="348px">
<div style="text-align: center"><img src="../../assets/images/icon_success.png" /></div>
<template #footer>
<el-button type="primary" @click="toHome">了解项目</el-button>
</template>
</el-dialog>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
name: 'LetterIndex',
data() {
return {
ruleForm: {
provider_name: '',
letter_content: '',
provider_phone_number: '',
provider_company_name: '',
provider_job_title: ''
},
rules: {
provider_name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
letter_content: [{ required: true, message: '请输入推荐信内容', trigger: 'blur' }],
provider_phone_number: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
provider_company_name: [{ required: true, message: '请输入工作单位', trigger: 'blur' }],
provider_job_title: [{ required: true, message: '请输入职务', trigger: 'blur' }]
},
dialogVisible: false,
clientWidth: 0
}
},
computed: {
userId() {
return this.$route.params.userId
},
letterId() {
return this.$route.params.letterId
},
labelPosition() {
return this.clientWidth < 768 ? 'top' : 'left'
}
},
methods: {
// 提交
handleSubmit() {
this.$refs.form.validate().then(() => {
this.handleAddRequest()
})
},
// 提交推荐信
handleAddRequest() {
api.addLetter(this.userId, this.letterId, this.ruleForm).then(response => {
console.log(response)
const { error, message } = response
if (error.toString() === '0') {
this.dialogVisible = true
} else {
this.$message.error(message)
}
})
},
toHome() {
this.$router.push('/')
},
getClientWidth() {
this.clientWidth = document.body.clientWidth
}
},
mounted() {
this.getClientWidth()
window.addEventListener('resize', this.getClientWidth)
},
destroyed() {
window.removeEventListener('resize', this.getClientWidth)
}
}
</script>
<style lang="scss" scoped>
.letter {
.header {
background-color: #fff;
.inner {
max-width: 1000px;
margin: 0 auto;
}
.logo {
padding: 14px 0;
img {
height: 50px;
}
}
}
.nav {
background-color: var(--main-color);
.title {
font-size: 24px;
font-weight: 600;
color: #fff;
line-height: 60px;
text-align: center;
}
}
.content {
max-width: 1000px;
margin: 20px auto;
padding: 20px;
background-color: #fff;
box-sizing: border-box;
}
::v-deep .el-input {
max-width: 270px;
}
::v-deep .el-form--label-top {
.el-form-item__label {
line-height: 20px;
}
.el-input {
max-width: 100%;
}
}
::v-deep .el-input__inner,
::v-deep .el-textarea__inner {
border-radius: 0;
}
.buttons {
border-top: 1px solid #f1f1f1;
padding: 20px 100px;
}
@media (max-width: 767px) {
.logo {
text-align: center;
}
.buttons {
padding: 20px 0;
.el-button {
width: 100%;
display: block;
}
}
}
}
</style>
<template>
<div class="my">
<div class="card">
<div class="result">
<div class="result-left"><img src="../../../assets/images/my_icon.png" />招生办反馈</div>
<div class="result-right">{{ result.submit_status_desc || '未收到报名信息' }}</div>
</div>
</div>
<div class="card" style="min-height: 360px">
<ul class="nav">
<li @click="toApplication"><img src="../../../assets/images/my_01.png" /></li>
<li @click="toInterview"><img src="../../../assets/images/my_02.png" /></li>
<li @click="toAdmission"><img src="../../../assets/images/my_03.png" /></li>
</ul>
<div class="progress">
<el-steps :active="activeProgress" finish-status="success" align-center>
<el-step v-for="(item, index) in 3" :key="index">
<template #title>{{ getProgressStatusText(index) }}</template>
</el-step>
</el-steps>
</div>
</div>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
name: 'AppHome',
data() {
return {
material: {},
progress: {},
submissionStage: {
0: ['FILLING', 'PREPAYMENT'],
1: ['INTERVIEW_APPLICATION', 'AUDITION', 'INTERVIEW', 'PAYMENT'],
2: ['REGISTRATION'],
3: ['CLOSED']
},
result: {}
}
},
computed: {
activeProgress() {
for (const key in this.submissionStage) {
const list = this.submissionStage[key]
if (list.includes(this.material.submission_stage)) {
return parseInt(key)
}
}
return 0
}
},
methods: {
// 获取进度值
getProgressStatusText(index) {
if (this.activeProgress === index) {
return '进行中'
} else {
return this.activeProgress > index ? '已完成' : '待进行'
}
},
// 获取报名信息
getApplication() {
api.getApplication().then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
const { material, progress } = data
this.material = material
this.progress = progress
} else {
this.$message.error(message)
}
})
},
// 获取报名审核状态
getApplicationStatus() {
api.getApplicationStatus().then(response => {
this.result = response.data
})
},
// 报名申请
toApplication() {
this.$router.push('/my/application?active=application_info')
},
// 申请面试
toInterview() {
if (this.activeProgress < 1) {
this.$message.warning('请完成报名申请并缴报名费')
return
}
this.$router.push('/my/interview')
},
// 办理入学
toAdmission() {
if (this.activeProgress < 2) {
this.$message.warning('请等待面试结果')
return
}
this.$router.push('/my/admission')
}
},
beforeMount() {
this.getApplication()
this.getApplicationStatus()
}
}
</script>
<style lang="scss" scoped>
.card {
background: #fff;
border-radius: 5px;
}
.card + .card {
margin-top: 10px;
}
.nav {
display: flex;
justify-content: space-between;
padding: 40px 70px 20px;
li {
position: relative;
width: 180px;
height: 120px;
}
a {
color: currentColor;
}
.cover {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
font-weight: 600;
color: #fff;
text-align: center;
background-color: rgba(0, 0, 0.5);
}
}
.result {
min-height: 40px;
padding: 0 20px;
display: flex;
align-items: center;
}
.result-left {
line-height: 14px;
color: var(--main-color);
img {
margin-right: 10px;
}
}
.result-right {
padding-left: 40px;
color: #666;
}
.progress {
margin: 0 40px;
}
</style>
<template>
<app-layout>
<vue-form
:menus="menus"
:default-active="currentActive"
@page-change="handlePageChange"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
>
<template #aside-append>
<div class="aside-logout" @click="$store.dispatch('logout')"><span>退出登录</span></div>
</template>
<!-- 首页 -->
<app-home v-if="currentActive === 'account'" />
<template #content>
<!-- 基本信息 -->
<app-info v-if="currentActive === 'account_info'" />
<!-- 密码修改 -->
<app-password v-if="currentActive === 'account_password'" />
</template>
</vue-form>
</app-layout>
</template>
<script>
import AppLayout from '../layout.vue'
import AppHome from './home.vue'
import AppInfo from './info.vue'
import AppPassword from './password.vue'
export default {
components: { AppLayout, AppHome, AppInfo, AppPassword },
data() {
return {
menus: [
{
id: 'account',
title: '个人信息',
children: [
{ id: 'account_info', title: '基本信息' },
{ id: 'account_password', title: '密码修改' }
]
}
],
currentActive: 'account'
}
},
watch: {
$route: {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'account'
}
}
},
methods: {
handlePageChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } })
console.log('页面切换了', value)
},
handleSuccess(data) {
console.log('提交成功了', data)
this.$message({ type: 'success', message: data.message })
},
handleError(data) {
console.log('提交失败了', data)
this.$message({ type: 'error', message: data.message })
}
}
}
</script>
<template>
<div>
<el-form
:model="ruleForm"
:rules="rules"
ref="form"
label-width="100px"
@submit.native.prevent
style="max-width: 680px"
>
<el-form-item label="姓名" prop="real_name">
<el-input v-model.trim="ruleForm.real_name"></el-input>
</el-form-item>
<el-form-item label="手机号" prop="mobile">
<el-input v-model.trim="ruleForm.mobile"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit">确认修改</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
name: 'MyInfo',
data() {
return {
ruleForm: {
real_name: '',
mobile: ''
},
rules: {
real_name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }]
}
}
},
methods: {
getUser() {
api.getUser().then(response => {
const data = response.data
this.ruleForm.real_name = data.realname
this.ruleForm.mobile = data.mobile
})
},
// 提交
handleSubmit() {
this.$refs.form.validate().then(this.handleRequest)
},
// 接口请求
handleRequest() {
this.loading = true
api.updateUser(this.ruleForm).then(response => {
response.code === 0 ? this.handleSuccess(response) : this.$message.error(response.msg)
this.loading = false
})
},
// 成功
handleSuccess(response) {
this.$alert('基本信息修改成功', {
type: 'success',
confirmButtonText: '返回报名系统',
callback: action => {
this.$router.push('/my')
}
})
}
},
beforeMount() {
this.getUser()
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-input {
max-width: 270px;
}
</style>
<template>
<div>
<el-form :model="ruleForm" :rules="rules" ref="form" label-width="100px" @submit.native.prevent>
<el-form-item label="手机号" prop="account">
<el-input v-model.trim="ruleForm.account"></el-input>
</el-form-item>
<el-form-item prop="code" label="验证码">
<el-input v-model.trim="ruleForm.code" placeholder="请输入验证码">
<countdown
slot="suffix"
size="mini"
:disabled="disabledSend"
@start="sendCodeRequest"
ref="countdown"
></countdown>
</el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model.trim="ruleForm.password"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="passwordR">
<el-input type="password" v-model.trim="ruleForm.passwordR"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit">确认修改</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import * as api from '@/api/my'
import countdown from '@/components/countdown.vue'
export default {
name: 'MyPassword',
components: { countdown },
data() {
const validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请再次输入密码'))
} else if (value !== this.ruleForm.password) {
callback(new Error('两次输入密码不一致!'))
} else {
callback()
}
}
return {
ruleForm: { account: '', code: '', password: '', passwordR: '' },
rules: {
account: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
code: [{ required: true, message: '请输入验证码', trigger: 'blur' }],
password: [
{ required: true, message: '请输入新密码', trigger: 'blur' },
{ min: 6, max: 20, message: '长度为6-20个字符', trigger: 'blur' }
],
passwordR: [
{ required: true, message: '请输入新密码', trigger: 'blur' },
{ validator: validatePass, trigger: 'blur' }
]
}
}
},
computed: {
disabledSend() {
const value = this.ruleForm.account
return !(/^1[3-9]\d{9}$/.test(value) || /@/.test(value))
}
},
methods: {
// 提交
handleSubmit() {
this.$refs.form.validate().then(this.handleRequest)
},
// 接口请求
handleRequest() {
this.loading = true
api.updatePassword(this.ruleForm).then(response => {
response.code === 0 ? this.handleSuccess(response) : this.$message.error(response.msg)
this.loading = false
})
},
// 成功
handleSuccess(response) {
this.$alert('密码修改成功,快去登录吧', '提示', {
type: 'success',
confirmButtonText: '去登录',
callback: action => {
this.$router.push('/login')
}
})
},
// 验证码
sendCodeRequest() {
api
.sendCode({ account: this.ruleForm.account })
.then(response => {
console.log(response)
if (response.code === 0) {
this.$message({ type: 'success', message: '验证码已发送' })
} else {
// 停止计时
this.$refs.countdown.stop()
this.$message({ type: 'error', message: response.msg })
}
})
.catch(this.$refs.countdown.stop)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-input {
max-width: 270px;
}
</style>
import xy from './xy'
import xfjn from './xfjn'
export default function(_this) {
return {
id: 'admission',
title: '入学办理',
children: [xy(_this), xfjn]
}
}
export default {
id: 'admission_xfjn',
title: '学费缴纳',
html: `
<p><strong>一、对公收款银行信息:</strong></p>
<p>户名:清控紫荆( 北京)教育科技股份有限公司</p>
<p>帐号:694485289</p>
<p>开户行:中国民生银行股份有限公司北京魏公村支行</p>
<p style="margin-top:30px;"><strong>二、支付宝收款账户信息:</strong></p>
<p>支付宝账号:service@ezijing.com</p>
<p>支付宝户名:清控紫荆(北京)教育科技股份有限公司</p>
`
}
export default function(_this) {
return {
id: 'admission_xy',
title: '入学协议',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 6
const ADMISSION_AGREEMENT = attachments.filter(item => {
return item.file_type_id === 'ADMISSION_AGREEMENT'
})
return { ADMISSION_AGREEMENT }
}
},
form: {
next: { to: { query: { active: 'admission_xfjn' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'ADMISSION_AGREEMENT',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'ADMISSION_AGREEMENT' }
},
// prepend: `
// <p>第一步:点击下载按键获取入学协议</p>
// <p><a href="https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/%E5%85%A5%E5%AD%A6%E5%8D%8F%E8%AE%AE%EF%BC%88%E8%AF%B7%E4%B8%8B%E8%BD%BD%E6%A8%A1%E6%9D%BF%E5%A1%AB%E5%86%99%E5%90%8E%E4%B8%8A%E4%BC%A0%E7%85%A7%E7%89%87%EF%BC%89.docx" target="_blank" download>下载入学协议</a></p>
// <p>第二步:申请者可将签字后的入学协议原件扫描或拍照后提交。学员应仔细阅读《入学协议》以及课程介绍,如对入学协议或课程有异议,请第一时间与课程顾问咨询确认。请用A4纸打印后,在入学协议上签上姓名和日期,内容需显示完整、格式整齐、字迹清晰可辨。点击下方按钮,上传文件</p>
// `
prepend: `
<p>第一步:请以录取通知书的协议为准</p>
<p>第二步:申请者可将签字后的入学协议原件扫描或拍照后提交。学员应仔细阅读《入学协议》以及课程介绍,如对入学协议或课程有异议,请第一时间与课程顾问咨询确认。请用A4纸打印后,在入学协议上签上姓名和日期,内容需显示完整、格式整齐、字迹清晰可辨。点击下方按钮,上传文件</p>
`
}
]
}
}
}
<template>
<app-layout>
<vue-form
:menus="menus"
:default-active="currentActive"
@page-change="handlePageChange"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
@prev="handlePrev"
@next="handleNext"
@uploaded="getApplication"
>
<template #aside-append>
<div class="aside-logout" @click="$store.dispatch('logout')"><span>退出登录</span></div>
</template>
</vue-form>
<el-dialog
title="办理入学资料提交成功"
:visible.sync="dialogVisible"
:center="true"
:close-on-click-modal="false"
width="348px"
>
<div class="dialog-tips">
<p>请确认是否已缴费,如未缴费点击下方缴费按钮 <br />(已缴费,请忽略)</p>
<div class="icon"><img src="../../../assets/images/icon_success.png" /></div>
</div>
<template #footer>
<el-button type="primary" @click="toPay">立即缴费</el-button>
<el-button type="primary" @click="dialogVisible = false">忽略</el-button>
</template>
</el-dialog>
</app-layout>
</template>
<script>
import AppLayout from '../layout.vue'
import getMenu from './form'
import * as api from '@/api/my'
export default {
components: { AppLayout },
data() {
const menus = getMenu(this)
return {
menus: [menus],
currentActive: 'admission_xy',
dialogVisible: false,
detail: null
}
},
watch: {
$route: {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'admission_xy'
}
},
showSubmitedDialog(value) {
this.dialogVisible = value
}
},
computed: {
isSubmited() {
if (this.detail) {
return !!this.detail.material.attachments.find(item => item.file_type_id === 'ADMISSION_AGREEMENT')
}
return false
},
showSubmitedDialog() {
return this.isSubmited && this.currentActive === 'admission_xy'
}
},
methods: {
// 获取报名信息
getApplication() {
api.getApplication().then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.detail = data
} else {
this.$message.error(message)
}
})
},
handlePageChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } })
console.log('页面切换了', value)
},
handleSuccess(data) {
console.log('提交成功了', data)
this.$message({ type: 'success', message: data.message })
},
handleError(data) {
console.log('提交失败了', data)
this.$message({ type: 'error', message: data.message })
},
handlePrev(to) {
this.$router.push(to)
},
handleNext(to) {
this.$router.push(to)
},
toPay() {
this.dialogVisible = false
this.$router.push({ path: '/my/admission', query: { active: 'admission_xfjn' } })
}
},
beforeMount() {
this.getApplication()
}
}
</script>
<style lang="scss" scoped>
.dialog-tips {
text-align: center;
p {
color: #262626;
line-height: 20px;
}
.icon {
margin-top: 20px;
text-align: center;
}
}
</style>
<template>
<el-dialog
title="您当前完成进度如下:"
width="348px"
:center="true"
:close-on-click-modal="false"
:visible.sync="dialogVisible"
@open="handleOpen"
@close="handleClose"
>
<div>
<ul v-if="detail">
<li
v-for="item in currentOptions"
:class="progress[item.code].progress === 1 ? 'is-success' : 'is-error'"
:key="item.code"
>
<span class="name">{{ item.title }}</span>
<span class="line"></span>
<span class="status">{{ progress[item.code].progress === 1 ? '已完成' : '未完成' }}</span>
<span class="view" @click="handleView(item.view.to)">立即查看</span>
</li>
</ul>
</div>
<template #footer>
<el-button type="primary" @click="dialogVisible = false">我知道啦</el-button>
</template>
</el-dialog>
</template>
<script>
import * as api from '@/api/my'
export default {
props: { value: { type: Boolean, default: false }, type: { type: Number, default: 0 } },
data() {
return {
dialogVisible: false,
detail: null,
progress: {},
options: [
[
{
title: '个人资料',
code: 'applicaitonInfo',
view: { to: { path: '/my/application', query: { active: 'application_info' } } }
},
{
title: '推荐信',
code: 'applicationTjx',
view: { to: { path: '/my/application', query: { active: 'application_tjx' } } }
}
// {
// title: '无犯罪证明',
// code: 'applicationWfzzm',
// view: { to: { path: '/my/application', query: { active: 'application_wfzzm' } } }
// }
],
[
{
title: '学位证书',
code: 'interviewXwzs',
view: { to: { path: '/my/interview', query: { active: 'interview_byz' } } }
},
{
title: '成绩单',
code: 'interviewCjd',
view: { to: { path: '/my/interview', query: { active: 'interview_cjd' } } }
},
{
title: '2寸照片',
code: 'interviewZp',
view: { to: { path: '/my/interview', query: { active: 'interview_zp' } } }
},
{
title: '推荐信',
code: 'interviewTjx',
view: { to: { path: '/my/application', query: { active: 'application_tjx' } } }
}
]
]
}
},
watch: {
value: {
immediate: true,
handler(value) {
this.dialogVisible = value
}
}
},
computed: {
currentOptions() {
return this.options[this.type]
}
},
methods: {
// 获取报名信息
getApplication() {
api.getApplication(this.$route.query).then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
const { progress } = data
this.detail = data
const fillingMissedRequiredList = progress.FILLING.attachments.missed_required_list
// 个人资料
const applicaitonInfo = { progress: 0 }
const infoRequriedList = ['basic_info', 'educations', 'careers', 'answers']
for (const key of infoRequriedList) {
if (progress.FILLING[key].progress < 1) {
applicaitonInfo.progress = 0
break
}
applicaitonInfo.progress = 1
}
if (applicaitonInfo.progress === 1 && !fillingMissedRequiredList.ID_CARD_PHOTO) {
applicaitonInfo.progress = 1
} else {
applicaitonInfo.progress = 0
}
// 推荐信
const applicationTjx = { progress: 0 }
applicationTjx.progress = progress.FILLING.reco_letters ? progress.FILLING.reco_letters.progress : 0
// 无犯罪证明
const applicationWfzzm = { progress: 0 }
applicationWfzzm.progress = fillingMissedRequiredList.NO_CRIMINAL_CERT ? 0 : 1
const missedRequiredList = progress.INTERVIEW_APPLICATION.attachments.missed_required_list
// 学位证书
const interviewXwzs = { progress: 0 }
interviewXwzs.progress = missedRequiredList.DEGREE_CERT_CN ? 0 : 1
// 成绩单
const interviewCjd = { progress: 0 }
interviewCjd.progress = missedRequiredList.REPORT_CARD_CN || missedRequiredList.REPORT_CARD_EN ? 0 : 1
// 2寸照片
const interviewZp = { progress: 0 }
interviewZp.progress = missedRequiredList.PERSONAL_PHOTO_FOR_ID ? 0 : 1
// 推荐信
const interviewTjx = { progress: 0 }
interviewTjx.progress = progress.INTERVIEW_APPLICATION.reco_letters
? progress.INTERVIEW_APPLICATION.reco_letters.progress
: 0
this.progress = {
applicaitonInfo,
applicationTjx,
applicationWfzzm,
interviewXwzs,
interviewCjd,
interviewZp,
interviewTjx
}
} else {
this.$message.error(message)
}
})
},
handleView(to) {
this.dialogVisible = false
this.$router.push(to)
},
handleOpen() {
this.getApplication()
},
handleClose() {
this.$emit('input', this.dialogVisible)
}
}
}
</script>
<style lang="scss" scoped>
li {
padding: 10px 0;
display: flex;
align-items: center;
}
.name {
width: 80px;
text-align: right;
}
.line {
width: 40px;
height: 1px;
margin: 0 10px;
background-color: #ccc;
}
.is-success {
.status {
color: #33c011;
}
}
.is-error {
.status {
color: #af1b40;
}
}
.view {
margin-left: 40px;
color: #57acff;
text-decoration: underline;
cursor: pointer;
}
</style>
/**
* 申请声明
*/
export default function(_this) {
return {
id: 'application_declare',
title: '申请声明',
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { submission_stage: submissionStage = 'FILLING' } = data.data.material
const isSubmited = submissionStage !== 'FILLING'
this.form.options.disabled = isSubmited
if (isSubmited) {
return { isAgree: [1] }
}
return { isAgree: [] }
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/submit/${webConf.others.projectId}`,
callback() {
_this.getApplication()
this.form.options.disabled = true
// _this.$router.push({ path: this.$route.path, query: { active: 'application_pay' } })
_this.$router.push({ path: '/my/interview' })
},
errorCallback() {
_this.completeVisible = true
}
},
form: {
prev: { to: { query: { active: 'application_wfzzm' } } },
submitText: '提交报名申请',
model: { isAgree: [] },
options: {},
items: [
{
type: 'v-checkbox',
values: [{ label: '同意', value: 1 }],
model: 'isAgree',
rules: [{ required: true, message: '请阅读协议', trigger: 'change' }],
prepend:
'<p>我提供的所有报名材料信息皆准确和完整。我同意在需要的情况下提交原件以确认我的报名资格。由于报名材料中的虚假、错误信息或重大遗漏导致不录取或取消学籍的后果由我个人承担。我理解并同意所有报名材料归紫荆教育所有,无论考生录取与否均不退回。我授权紫荆教育使用报名表中的信息查询本人学习和工作记录。</p>'
}
]
}
}
}
import info from './info'
import tjx from './tjx'
import wfzsm from './wfzzm'
import declare from './declare'
export default function(_this) {
return {
id: 'application',
title: '报名申请',
children: [
info(_this),
tjx(_this),
// wfzsm(_this),
declare(_this)
// {
// id: 'application_pay',
// title: '缴报名费',
// show: false,
// visible() {
// return _this.visible
// }
// }
]
}
}
import first from './info/first'
import profile from './info/profile'
import education from './info/education'
import career from './info/career'
import honor from './info/honor'
import training from './info/training'
import answer from './info/answer'
export default function(_this) {
return {
id: 'application_info',
title: '个人资料',
tabs: [first(_this), profile(_this), education(_this), career(_this), answer(_this), training(_this), honor(_this)]
}
}
/**
* 学习目的
*/
export default function(_this) {
return {
id: 'application_info_answer',
title: '学习目的',
required: true,
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { answers = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
const [first = {}, second = {}] = answers
return {
qid1: first.qid || '1',
question1: '您为什么申请中国产业金融菁英计划项目? (200字以上,1000字以内)',
answer1: first.answer,
qid2: second.qid || '2',
question2: '您的短期和长期职业发展目标是什么?您打 算如何达成此愿景?(200字以上,1000字 以内)',
answer2: second.answer
}
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
return {
answers: [
{ qid: data.qid1, question: data.question1, answer: data.answer1 },
{ qid: data.qid2, question: data.question2, answer: data.answer2 }
]
}
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_career' } }, isSubmit: true },
next: { to: { query: { active: 'application_info', tab: 'application_info_training' } }, isSubmit: true },
options: {},
items: [
{
type: 'v-input',
label: '您为什么申请中国产业金融菁英计划项目? (200字以上,1000字以内)',
model: 'answer1',
attrs: { type: 'textarea', rows: '8', maxlength: '1000', style: 'width:100%' },
rules: [
{ required: true, message: '请输入', trigger: 'blur' },
{ min: 60, max: 1000, message: '长度在 60 到 1000 个字符', trigger: 'blur' }
]
},
{
type: 'v-input',
label: '您的短期和长期职业发展目标是什么?您打 算如何达成此愿景?(200字以上,1000字 以内)',
model: 'answer2',
attrs: { type: 'textarea', rows: '8', maxlength: '1000', style: 'width:100%' },
rules: [
{ required: true, message: '请输入', trigger: 'blur' },
{ min: 60, max: 1000, message: '长度在 60 到 1000 个字符', trigger: 'blur' }
]
}
]
}
}
}
/**
* 工作经验
*/
export default function(_this) {
return {
id: 'application_info_career',
title: '工作经验',
required: true,
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { careers: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
const careers = data.map(item => {
return [
'start_date',
'end_date',
'company_name_cn',
'industry',
'dept_cn',
'position_cn',
'job_desc_cn'
].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
})
return { careers }
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_education' } }, isSubmit: true },
next: { to: { query: { active: 'application_info', tab: 'application_info_answer' } }, isSubmit: true },
hasAdd: true,
options: { labelWidth: '140px' },
items: [
{
type: 'v-datepicker',
label: '开始时间',
model: 'start_date',
attrs: {
type: 'month',
placeholder: '请选择工作开始时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择工作开始时间', trigger: 'blur' }]
},
{
type: 'v-datepicker',
label: '结束时间',
model: 'end_date',
attrs: {
type: 'month',
placeholder: '请选择工作结束时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择工作结束时间', trigger: 'blur' }]
},
{
type: 'v-input',
label: '工作单位',
model: 'company_name_cn',
attrs: { placeholder: '请输入工作单位' },
rules: [{ required: true, message: '请输入工作单位', trigger: 'blur' }]
},
{
type: 'v-select',
values: [
{ label: '互联网/电子商务', value: '1 ' },
{ label: '基金/证券/期货/投资', value: '2 ' },
{ label: '保险', value: '3 ' },
{ label: '银行', value: '4 ' },
{ label: '信托/担保/拍卖/典当', value: '5 ' },
{ label: '计算机软件', value: '6 ' },
{ label: 'IT服务(系统/数据/维护)', value: '7 ' },
{ label: '电子技术/半导体/集成电路', value: '8 ' },
{ label: '计算机硬件', value: '9 ' },
{ label: '通信/电信/网络设备', value: '10' },
{ label: '通信/电信运营、增值服务', value: '11' },
{ label: '网络游戏', value: '12' },
{ label: '房地产/建筑/建材/工程', value: '13' },
{ label: '家居/室内设计/装饰装潢', value: '14' },
{ label: '物业管理/商业中心', value: '15' },
{ label: '专业服务/咨询(财会/法律/人力资源等)', value: '16' },
{ label: '广告/会展/公关', value: '17' },
{ label: '中介服务', value: '18' },
{ label: '检验/检测/认证', value: '19' },
{ label: '外包服务', value: '20' },
{ label: '快速消费品(食品/饮料/烟酒/日化)', value: '21' },
{ label: '耐用消费品(服饰/纺织/皮革/家具/家电)', value: '22' },
{ label: '贸易/进出口', value: '23' },
{ label: '零售/批发', value: '24' },
{ label: '租赁服务', value: '25' },
{ label: '教育/培训/院校', value: '26' },
{ label: '礼品/玩具/工艺美术/收藏品/奢侈品', value: '27' },
{ label: '汽车/摩托车', value: '28' },
{ label: '大型设备/机电设备/重工业', value: '29' },
{ label: '加工制造(原料加工/模具)', value: '30' },
{ label: '仪器仪表及工业自动化', value: '31' },
{ label: '印刷/包装/造纸', value: '32' },
{ label: '办公用品及设备', value: '33' },
{ label: '医药/生物工程', value: '34' },
{ label: '医疗设备/器械', value: '35' },
{ label: '航空/航天研究与制造', value: '36' },
{ label: '交通/运输,物流/仓储', value: '37' },
{ label: '医疗/护理/美容/保健/卫生服务', value: '38' },
{ label: '酒店/餐饮,旅游/度假,媒体/出版/影视/文化传播', value: '39' },
{ label: '娱乐/体育/休闲', value: '40' },
{ label: '能源/矿产/采掘/冶炼', value: '41' },
{ label: '石油/石化/化工,电气/电力/水利', value: '42' },
{ label: '环保', value: '43' },
{ label: '政府/公共事业/非盈利机构', value: '44' },
{ label: '学术/科研,农/林/牧/渔跨领域经营', value: '45' },
{ label: '其他', value: '90' }
],
label: '行业类别',
model: 'industry',
rules: [{ required: true, message: '请选择行业类别', trigger: 'change' }]
},
{
type: 'v-input',
label: '工作部门',
model: 'dept_cn',
attrs: { placeholder: '请输入工作部门' },
rules: [{ required: true, message: '请输入工作部门', trigger: 'blur' }]
},
{
type: 'v-input',
label: '工作职位',
model: 'position_cn',
attrs: { placeholder: '请输入工作职位' },
rules: [{ required: true, message: '请输入工作职位', trigger: 'blur' }]
},
{
type: 'v-input',
label: '工作描述',
model: 'job_desc_cn',
attrs: {
type: 'textarea',
placeholder: '请输入工作描述',
rows: '8',
maxlength: '3000'
},
rules: [{ required: true, message: '请输入工作描述', trigger: 'blur' }]
}
]
}
}
}
export default [
{ label: '中国', value: '中国' },
{ label: '阿富汗', value: '阿富汗' },
{ label: '奥兰群岛', value: '奥兰群岛' },
{ label: '阿尔巴尼亚', value: '阿尔巴尼亚' },
{ label: '阿尔及利亚', value: '阿尔及利亚' },
{ label: '美属萨摩亚', value: '美属萨摩亚' },
{ label: '安道尔', value: '安道尔' },
{ label: '安哥拉', value: '安哥拉' },
{ label: '安圭拉', value: '安圭拉' },
{ label: '安提瓜和巴布达', value: '安提瓜和巴布达' },
{ label: '阿根廷', value: '阿根廷' },
{ label: '亚美尼亚', value: '亚美尼亚' },
{ label: '阿鲁巴', value: '阿鲁巴' },
{ label: '澳大利亚', value: '澳大利亚' },
{ label: '奥地利', value: '奥地利' },
{ label: '阿塞拜疆', value: '阿塞拜疆' },
{ label: '孟加拉', value: '孟加拉' },
{ label: '巴林', value: '巴林' },
{ label: '巴哈马', value: '巴哈马' },
{ label: '巴巴多斯', value: '巴巴多斯' },
{ label: '白俄罗斯', value: '白俄罗斯' },
{ label: '比利时', value: '比利时' },
{ label: '伯利兹', value: '伯利兹' },
{ label: '贝宁', value: '贝宁' },
{ label: '百慕大', value: '百慕大' },
{ label: '不丹', value: '不丹' },
{ label: '玻利维亚', value: '玻利维亚' },
{ label: '波斯尼亚和黑塞哥维那', value: '波斯尼亚和黑塞哥维那' },
{ label: '博茨瓦纳', value: '博茨瓦纳' },
{ label: '布维岛', value: '布维岛' },
{ label: '巴西', value: '巴西' },
{ label: '文莱', value: '文莱' },
{ label: '保加利亚', value: '保加利亚' },
{ label: '布基纳法索', value: '布基纳法索' },
{ label: '布隆迪', value: '布隆迪' },
{ label: '柬埔寨', value: '柬埔寨' },
{ label: '喀麦隆', value: '喀麦隆' },
{ label: '加拿大', value: '加拿大' },
{ label: '佛得角', value: '佛得角' },
{ label: '中非', value: '中非' },
{ label: '乍得', value: '乍得' },
{ label: '智利', value: '智利' },
{ label: '圣诞岛', value: '圣诞岛' },
{ label: '科科斯(基林)群岛', value: '科科斯(基林)群岛' },
{ label: '哥伦比亚', value: '哥伦比亚' },
{ label: '科摩罗', value: '科摩罗' },
{ label: '刚果(金)', value: '刚果(金)' },
{ label: '刚果', value: '刚果' },
{ label: '库克群岛', value: '库克群岛' },
{ label: '哥斯达黎加', value: '哥斯达黎加' },
{ label: '科特迪瓦', value: '科特迪瓦' },
{ label: '克罗地亚', value: '克罗地亚' },
{ label: '古巴', value: '古巴' },
{ label: '捷克', value: '捷克' },
{ label: '塞浦路斯', value: '塞浦路斯' },
{ label: '丹麦', value: '丹麦' },
{ label: '吉布提', value: '吉布提' },
{ label: '多米尼加', value: '多米尼加' },
{ label: '厄瓜多尔', value: '厄瓜多尔' },
{ label: '埃及', value: '埃及' },
{ label: '赤道几内亚', value: '赤道几内亚' },
{ label: '厄立特里亚', value: '厄立特里亚' },
{ label: '爱沙尼亚', value: '爱沙尼亚' },
{ label: '埃塞俄比亚', value: '埃塞俄比亚' },
{ label: '法罗群岛', value: '法罗群岛' },
{ label: '斐济', value: '斐济' },
{ label: '芬兰', value: '芬兰' },
{ label: '法国', value: '法国' },
{ label: '法国大都会', value: '法国大都会' },
{ label: '法属圭亚那', value: '法属圭亚那' },
{ label: '法属波利尼西亚', value: '法属波利尼西亚' },
{ label: '加蓬', value: '加蓬' },
{ label: '冈比亚', value: '冈比亚' },
{ label: '格鲁吉亚', value: '格鲁吉亚' },
{ label: '德国', value: '德国' },
{ label: '加纳', value: '加纳' },
{ label: '直布罗陀', value: '直布罗陀' },
{ label: '希腊', value: '希腊' },
{ label: '格林纳达', value: '格林纳达' },
{ label: '瓜德罗普岛', value: '瓜德罗普岛' },
{ label: '关岛', value: '关岛' },
{ label: '危地马拉', value: '危地马拉' },
{ label: '根西岛', value: '根西岛' },
{ label: '几内亚比绍', value: '几内亚比绍' },
{ label: '几内亚', value: '几内亚' },
{ label: '圭亚那', value: '圭亚那' },
{ label: '海地', value: '海地' },
{ label: '洪都拉斯', value: '洪都拉斯' },
{ label: '匈牙利', value: '匈牙利' },
{ label: '冰岛', value: '冰岛' },
{ label: '印度', value: '印度' },
{ label: '印度尼西亚', value: '印度尼西亚' },
{ label: '伊朗', value: '伊朗' },
{ label: '伊拉克', value: '伊拉克' },
{ label: '爱尔兰', value: '爱尔兰' },
{ label: '马恩岛', value: '马恩岛' },
{ label: '以色列', value: '以色列' },
{ label: '意大利', value: '意大利' },
{ label: '牙买加', value: '牙买加' },
{ label: '日本', value: '日本' },
{ label: '泽西岛', value: '泽西岛' },
{ label: '约旦', value: '约旦' },
{ label: '哈萨克斯坦', value: '哈萨克斯坦' },
{ label: '肯尼亚', value: '肯尼亚' },
{ label: '基里巴斯', value: '基里巴斯' },
{ label: '韩国', value: '韩国' },
{ label: '朝鲜', value: '朝鲜' },
{ label: '科威特', value: '科威特' },
{ label: '吉尔吉斯斯坦', value: '吉尔吉斯斯坦' },
{ label: '老挝', value: '老挝' },
{ label: '拉脱维亚', value: '拉脱维亚' },
{ label: '黎巴嫩', value: '黎巴嫩' },
{ label: '莱索托', value: '莱索托' },
{ label: '利比里亚', value: '利比里亚' },
{ label: '利比亚', value: '利比亚' },
{ label: '列支敦士登', value: '列支敦士登' },
{ label: '立陶宛', value: '立陶宛' },
{ label: '卢森堡', value: '卢森堡' },
{ label: '马其顿', value: '马其顿' },
{ label: '马拉维', value: '马拉维' },
{ label: '马来西亚', value: '马来西亚' },
{ label: '马达加斯加', value: '马达加斯加' },
{ label: '马尔代夫', value: '马尔代夫' },
{ label: '马里', value: '马里' },
{ label: '马耳他', value: '马耳他' },
{ label: '马绍尔群岛', value: '马绍尔群岛' },
{ label: '马提尼克岛', value: '马提尼克岛' },
{ label: '毛里塔尼亚', value: '毛里塔尼亚' },
{ label: '毛里求斯', value: '毛里求斯' },
{ label: '马约特', value: '马约特' },
{ label: '墨西哥', value: '墨西哥' },
{ label: '密克罗尼西亚', value: '密克罗尼西亚' },
{ label: '摩尔多瓦', value: '摩尔多瓦' },
{ label: '摩纳哥', value: '摩纳哥' },
{ label: '蒙古', value: '蒙古' },
{ label: '黑山', value: '黑山' },
{ label: '蒙特塞拉特', value: '蒙特塞拉特' },
{ label: '摩洛哥', value: '摩洛哥' },
{ label: '莫桑比克', value: '莫桑比克' },
{ label: '缅甸', value: '缅甸' },
{ label: '纳米比亚', value: '纳米比亚' },
{ label: '瑙鲁', value: '瑙鲁' },
{ label: '尼泊尔', value: '尼泊尔' },
{ label: '荷兰', value: '荷兰' },
{ label: '新喀里多尼亚', value: '新喀里多尼亚' },
{ label: '新西兰', value: '新西兰' },
{ label: '尼加拉瓜', value: '尼加拉瓜' },
{ label: '尼日尔', value: '尼日尔' },
{ label: '尼日利亚', value: '尼日利亚' },
{ label: '纽埃', value: '纽埃' },
{ label: '诺福克岛', value: '诺福克岛' },
{ label: '挪威', value: '挪威' },
{ label: '阿曼', value: '阿曼' },
{ label: '巴基斯坦', value: '巴基斯坦' },
{ label: '帕劳', value: '帕劳' },
{ label: '巴勒斯坦', value: '巴勒斯坦' },
{ label: '巴拿马', value: '巴拿马' },
{ label: '巴布亚新几内亚', value: '巴布亚新几内亚' },
{ label: '秘鲁', value: '秘鲁' },
{ label: '菲律宾', value: '菲律宾' },
{ label: '皮特凯恩群岛', value: '皮特凯恩群岛' },
{ label: '波兰', value: '波兰' },
{ label: '葡萄牙', value: '葡萄牙' },
{ label: '波多黎各', value: '波多黎各' },
{ label: '卡塔尔', value: '卡塔尔' },
{ label: '留尼汪岛', value: '留尼汪岛' },
{ label: '罗马尼亚', value: '罗马尼亚' },
{ label: '卢旺达', value: '卢旺达' },
{ label: '俄罗斯联邦', value: '俄罗斯联邦' },
{ label: '圣赫勒拿', value: '圣赫勒拿' },
{ label: '圣基茨和尼维斯', value: '圣基茨和尼维斯' },
{ label: '圣卢西亚', value: '圣卢西亚' },
{ label: '圣文森特和格林纳丁斯', value: '圣文森特和格林纳丁斯' },
{ label: '萨尔瓦多', value: '萨尔瓦多' },
{ label: '萨摩亚', value: '萨摩亚' },
{ label: '圣马力诺', value: '圣马力诺' },
{ label: '圣多美和普林西比', value: '圣多美和普林西比' },
{ label: '沙特阿拉伯', value: '沙特阿拉伯' },
{ label: '塞内加尔', value: '塞内加尔' },
{ label: '塞舌尔', value: '塞舌尔' },
{ label: '塞拉利昂', value: '塞拉利昂' },
{ label: '新加坡', value: '新加坡' },
{ label: '塞尔维亚', value: '塞尔维亚' },
{ label: '斯洛伐克', value: '斯洛伐克' },
{ label: '斯洛文尼亚', value: '斯洛文尼亚' },
{ label: '所罗门群岛', value: '所罗门群岛' },
{ label: '索马里', value: '索马里' },
{ label: '南非', value: '南非' },
{ label: '西班牙', value: '西班牙' },
{ label: '斯里兰卡', value: '斯里兰卡' },
{ label: '苏丹', value: '苏丹' },
{ label: '苏里南', value: '苏里南' },
{ label: '斯威士兰', value: '斯威士兰' },
{ label: '瑞典', value: '瑞典' },
{ label: '瑞士', value: '瑞士' },
{ label: '叙利亚', value: '叙利亚' },
{ label: '塔吉克斯坦', value: '塔吉克斯坦' },
{ label: '坦桑尼亚', value: '坦桑尼亚' },
{ label: '泰国', value: '泰国' },
{ label: '特立尼达和多巴哥', value: '特立尼达和多巴哥' },
{ label: '东帝汶', value: '东帝汶' },
{ label: '多哥', value: '多哥' },
{ label: '托克劳', value: '托克劳' },
{ label: '汤加', value: '汤加' },
{ label: '突尼斯', value: '突尼斯' },
{ label: '土耳其', value: '土耳其' },
{ label: '土库曼斯坦', value: '土库曼斯坦' },
{ label: '图瓦卢', value: '图瓦卢' },
{ label: '乌干达', value: '乌干达' },
{ label: '乌克兰', value: '乌克兰' },
{ label: '阿拉伯联合酋长国', value: '阿拉伯联合酋长国' },
{ label: '英国', value: '英国' },
{ label: '美国', value: '美国' },
{ label: '乌拉圭', value: '乌拉圭' },
{ label: '乌兹别克斯坦', value: '乌兹别克斯坦' },
{ label: '瓦努阿图', value: '瓦努阿图' },
{ label: '梵蒂冈', value: '梵蒂冈' },
{ label: '委内瑞拉', value: '委内瑞拉' },
{ label: '越南', value: '越南' },
{ label: '瓦利斯群岛和富图纳群岛', value: '瓦利斯群岛和富图纳群岛' },
{ label: '西撒哈拉', value: '西撒哈拉' },
{ label: '也门', value: '也门' },
{ label: '南斯拉夫', value: '南斯拉夫' },
{ label: '赞比亚', value: '赞比亚' },
{ label: '津巴布韦', value: '津巴布韦' }
]
/**
* 教育背景
*/
export default function(_this) {
return {
id: 'application_info_education',
title: '教育背景',
required: true,
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { educations: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
const educations = data.map(item => {
return ['start_date', 'end_date', 'school_name_cn', 'major_cn', 'degree'].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
})
return { educations }
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_profile' } }, isSubmit: true },
next: { to: { query: { active: 'application_info', tab: 'application_info_career' } }, isSubmit: true },
hasAdd: true,
options: { labelWidth: '140px' },
items: [
{
type: 'v-datepicker',
label: '开始时间',
model: 'start_date',
attrs: {
type: 'month',
placeholder: '请选择教育开始时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择教育开始时间', trigger: 'blur' }]
},
{
type: 'v-datepicker',
label: '结束时间',
model: 'end_date',
attrs: {
type: 'month',
placeholder: '请选择教育结束时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择教育结束时间', trigger: 'blur' }]
},
{
type: 'v-input',
label: '学校名称',
model: 'school_name_cn',
attrs: { placeholder: '请输入学校名称' },
rules: [{ required: true, message: '请输入学校名称', trigger: 'blur' }]
},
{
type: 'v-input',
label: '专业名称',
model: 'major_cn',
attrs: { placeholder: '请输入专业名称' },
rules: [{ required: true, message: '请输入专业名称', trigger: 'blur' }]
},
{
type: 'v-select',
values: [
{ value: '专科' },
{ value: '本科' },
{ value: '本科/学士' },
{ value: '硕士研究生' },
{ value: '研究生/硕士' },
{ value: '博士研究生' },
{ value: '研究生/博士' },
{ value: '其他' }
],
label: '学历/学位',
model: 'degree',
rules: [{ required: true, message: '请选择学历/学位', trigger: 'change' }]
}
]
}
}
}
/**
* 个人信息
*/
export default function(_this) {
return {
id: 'application_info_first',
title: '个人信息',
required: true,
visible() {
return this.tabActive === 'application_info_first'
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const {
basic_info: basicInfo = {},
attachments = [],
submission_stage: submissionStage = 'FILLING'
} = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
const attachment = attachments.reduce(
(result, item) => {
const types = ['ID_CARD_FRONT', 'ID_CARD_BACK', 'HK_ID_CARD', 'PASSPORT', 'OTHER_ID_CARD_PHOTO']
types.forEach(type => {
if (item.file_type_id === type) {
result[type].push(item)
}
})
return result
},
{ ID_CARD_FRONT: [], ID_CARD_BACK: [], HK_ID_CARD: [], PASSPORT: [], OTHER_ID_CARD_PHOTO: [] }
)
return Object.assign({}, basicInfo, attachment)
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
const basicInfo = ['phone_number', 'email', 'id_type'].reduce((result, key) => {
result[key] = data[key]
return result
}, {})
return { basic_info: basicInfo }
}
},
form: {
hasButton: false,
next: { to: { query: { active: 'application_info', tab: 'application_info_profile' } }, isSubmit: true },
options: { labelWidth: '140px' },
items: [
{
type: 'v-input',
label: '手机号',
model: 'phone_number',
attrs: { placeholder: '请输入手机号', maxlength: 11 },
rules: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入手机号', trigger: 'blur' }]
},
{
type: 'v-input',
label: '邮箱',
model: 'email',
attrs: { placeholder: '请输入邮箱' },
rules: [{ type: 'email', required: true, message: '请输入邮箱', trigger: 'blur' }]
},
{
type: 'v-select',
values: [{ value: '居民身份证' }, { value: '港澳台身份证' }, { value: '护照' }, { value: '其他' }],
label: '证件类型',
model: 'id_type',
attrs: { placeholder: '请选择证件类型' },
rules: [{ required: true, message: '请选择证件类型', trigger: 'change' }]
},
// 身份证照片(背面)
{
type: 'v-upload',
label: '身份证人像面',
model: 'ID_CARD_BACK',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'ID_CARD_BACK' },
limit: 1,
accept: 'image/*',
image: 'https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/id_card_back.png'
},
rules: [{ type: 'array', required: true, message: '请上传身份证照片人像面', trigger: 'change' }],
isShow(data) {
return data.id_type === '居民身份证'
}
},
// 身份证照片(正面)
{
type: 'v-upload',
label: '身份证国徽面',
model: 'ID_CARD_FRONT',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'ID_CARD_FRONT' },
limit: 1,
accept: 'image/*',
image: 'https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/id_card_front.png'
},
rules: [{ type: 'array', required: true, message: '请上传身份证照片国徽面', trigger: 'change' }],
isShow(data) {
return data.id_type === '居民身份证'
}
},
// 港澳台身份证
{
type: 'v-upload',
label: '港澳台身份证',
model: 'HK_ID_CARD',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'HK_ID_CARD' },
limit: 1,
accept: 'image/*'
},
rules: [{ type: 'array', required: true, message: '请上传港澳台身份证', trigger: 'change' }],
isShow(data) {
return data.id_type === '港澳台身份证'
}
},
// 护照
{
type: 'v-upload',
label: '护照',
model: 'PASSPORT',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'PASSPORT' },
limit: 1,
accept: 'image/*'
},
rules: [{ type: 'array', required: true, message: '请上传护照', trigger: 'change' }],
isShow(data) {
return data.id_type === '护照'
}
},
// 其他证件
{
type: 'v-upload',
label: '其他证件',
model: 'OTHER_ID_CARD_PHOTO',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'OTHER_ID_CARD_PHOTO' },
limit: 1,
accept: 'image/*'
},
rules: [{ type: 'array', required: true, message: '请上传其他证件', trigger: 'change' }],
isShow(data) {
return data.id_type === '其他'
}
}
]
}
}
}
/**
* 荣誉奖励
*/
export default function(_this) {
return {
id: 'application_info_honor',
title: '荣誉奖励',
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { honors: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
const honors = data.map(item => {
return ['time', 'title', 'institution_cn'].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
})
return { honors }
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_training' } }, isSubmit: true },
next: { to: { query: { active: 'application_tjx' } }, isSubmit: true },
hasAdd: true,
options: { labelWidth: '140px' },
items: [
{
type: 'v-datepicker',
label: '获取时间',
model: 'time',
attrs: { type: 'date', valueFormat: 'yyyy-MM-dd', placeholder: '请选择获取时间' },
rules: [{ required: true, message: '请选择获取时间', trigger: 'blur' }]
},
{
type: 'v-input',
label: '荣誉奖励',
model: 'title',
attrs: { placeholder: '请输入荣誉奖励' },
rules: [{ required: true, message: '请输入荣誉奖励', trigger: 'blur' }]
},
{
type: 'v-input',
label: '证书颁发机构',
model: 'institution_cn',
attrs: { placeholder: '请输入证书颁发机构' },
rules: [{ required: true, message: '请输入证书颁发机构', trigger: 'blur' }]
}
]
}
}
}
/**
* 个人信息
*/
import country from './country'
export default function(_this) {
return {
id: 'application_info_profile',
title: '个人信息',
required: true,
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const {
basic_info: basicInfo = {},
attachments = [],
submission_stage: submissionStage = 'FILLING'
} = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
const attachment = attachments.reduce(
(result, item) => {
const types = ['ID_CARD_FRONT', 'ID_CARD_BACK', 'HK_ID_CARD', 'PASSPORT', 'OTHER_ID_CARD_PHOTO']
types.forEach(type => {
if (item.file_type_id === type) {
result[type].push(item)
}
})
return result
},
{ ID_CARD_FRONT: [], ID_CARD_BACK: [], HK_ID_CARD: [], PASSPORT: [], OTHER_ID_CARD_PHOTO: [] }
)
return Object.assign({}, basicInfo, attachment)
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
// let [province, city] = data.city.split('-')
// data.address_province = province
// data.address_city = city
const basicInfo = [
'phone_number',
'email',
'id_type',
'id_number',
'real_name_cn',
'real_name_en',
'gender',
'nationality',
'birthday',
'address_province',
'address_city',
'we_chat_account',
'mailing_address',
'emergency_contact_name',
'emergency_contacts_phone'
].reduce((result, key) => {
result[key] = data[key]
return result
}, {})
return { basic_info: basicInfo }
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_first' } } },
next: { to: { query: { active: 'application_info', tab: 'application_info_education' } }, isSubmit: true },
options: { labelWidth: '140px' },
items: [
{
type: 'v-input',
label: '手机号',
model: 'phone_number',
attrs: { placeholder: '请输入手机号', maxlength: 11 },
rules: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入手机号', trigger: 'blur' }]
},
{
type: 'v-input',
label: '邮箱',
model: 'email',
attrs: { placeholder: '请输入邮箱' },
rules: [{ type: 'email', required: true, message: '请输入邮箱', trigger: 'blur' }],
hint: '(后续报名信息将发送至此邮箱,请认真填写)'
},
{
type: 'v-select',
values: [{ value: '居民身份证' }, { value: '港澳台身份证' }, { value: '护照' }, { value: '其他' }],
label: '证件类型',
model: 'id_type',
attrs: { placeholder: '请选择证件类型' },
rules: [{ required: true, message: '请选择证件类型', trigger: 'change' }]
},
// 身份证照片(背面)
{
type: 'v-upload',
label: '身份证人像面',
model: 'ID_CARD_BACK',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'ID_CARD_BACK' },
limit: 1,
image: 'https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/id_card_back.png'
},
rules: [{ type: 'array', required: true, message: '请上传身份证照片人像面', trigger: 'change' }],
isShow(data) {
return data.id_type === '居民身份证'
}
},
// 身份证照片(正面)
{
type: 'v-upload',
label: '身份证国徽面',
model: 'ID_CARD_FRONT',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'ID_CARD_FRONT' },
limit: 1,
image: 'https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/id_card_front.png'
},
rules: [{ type: 'array', required: true, message: '请上传身份证照片国徽面', trigger: 'change' }],
isShow(data) {
return data.id_type === '居民身份证'
}
},
// 港澳台身份证
{
type: 'v-upload',
label: '港澳台身份证',
model: 'HK_ID_CARD',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'HK_ID_CARD' },
limit: 1
},
rules: [{ type: 'array', required: true, message: '请上传港澳台身份证', trigger: 'change' }],
isShow(data) {
return data.id_type === '港澳台身份证'
}
},
// 护照
{
type: 'v-upload',
label: '护照',
model: 'PASSPORT',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'PASSPORT' },
limit: 1
},
rules: [{ type: 'array', required: true, message: '请上传护照', trigger: 'change' }],
isShow(data) {
return data.id_type === '护照'
}
},
// 其他证件
{
type: 'v-upload',
label: '其他证件',
model: 'OTHER_ID_CARD_PHOTO',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'OTHER_ID_CARD_PHOTO' },
limit: 1
},
rules: [{ type: 'array', required: true, message: '请上传其他证件', trigger: 'change' }],
isShow(data) {
return data.id_type === '其他'
}
},
{
type: 'v-input',
label: '证件号码',
model: 'id_number',
attrs: { placeholder: '请输入证件号码' },
rules: [{ required: true, message: '请输入证件号码', trigger: 'blur' }]
},
{
type: 'v-input',
label: '姓名',
model: 'real_name_cn',
attrs: { placeholder: '请输入姓名' },
rules: [{ required: true, message: '请输入姓名', trigger: 'blur' }]
},
{
type: 'v-input',
label: '英文名',
model: 'real_name_en',
attrs: { placeholder: '请输入英文名' },
rules: [{ required: true, message: '请输入英文名', trigger: 'blur' }]
},
{
type: 'v-radio',
values: [
{ label: '男', value: '男' },
{ label: '女', value: '女' }
],
label: '性别',
model: 'gender',
rules: [{ required: true, message: '请选择性别', trigger: 'change' }]
},
{
type: 'v-select',
label: '国籍',
model: 'nationality',
values: country,
attrs: { placeholder: '请选择国籍', filterable: true },
rules: [{ required: true, message: '请选择国籍', trigger: 'blur' }]
},
{
type: 'v-datepicker',
label: '出生日期',
model: 'birthday',
attrs: { type: 'date', placeholder: '请选择出生日期', valueFormat: 'yyyy-MM-dd' },
rules: [{ required: true, message: '请选择出生日期', trigger: 'blur' }]
},
{
type: 'v-input',
label: '居住省',
model: 'address_province',
attrs: { placeholder: '请输入居住省' },
rules: [{ required: true, message: '请输入居住省', trigger: 'blur' }]
},
{
type: 'v-input',
label: '居住市',
model: 'address_city',
attrs: { placeholder: '请输入居住市' },
rules: [{ required: true, message: '请输入居住市', trigger: 'blur' }]
},
// {
// type: 'city-v-select',
// label: '现居住城市',
// model: 'city',
// separator: '-',
// rules: [{ required: true, message: '请选择居住城市', trigger: 'blur' }]
// },
{
type: 'v-input',
label: '微信号',
model: 'we_chat_account',
attrs: { placeholder: '请输入微信号' },
rules: [{ required: true, message: '请输入微信号', trigger: 'blur' }]
},
{
type: 'v-input',
label: '邮寄地址',
model: 'mailing_address',
attrs: { placeholder: '请输入邮寄地址' },
rules: [{ required: true, message: '请输入邮寄地址', trigger: 'blur' }]
},
{
type: 'v-input',
label: '紧急联系人',
model: 'emergency_contact_name',
attrs: { placeholder: '请输入紧急联系人' },
rules: [{ required: true, message: '请输入紧急联系人', trigger: 'blur' }]
},
{
type: 'v-input',
label: '紧急联系电话',
model: 'emergency_contacts_phone',
attrs: { placeholder: '请输入紧急联系电话' },
rules: [{ required: true, message: '请输入紧急联系电话', trigger: 'blur' }]
}
]
}
}
}
/**
* 所受培训
*/
export default function(_this) {
return {
id: 'application_info_training',
title: '所受培训',
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { trainings: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
const trainings = data.map(item => {
return ['start_date', 'end_date', 'institution_cn', 'course_cn'].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
})
return { trainings }
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_answer' } }, isSubmit: true },
next: { to: { query: { active: 'application_info', tab: 'application_info_honor' } }, isSubmit: true },
hasAdd: true,
options: { labelWidth: '140px' },
items: [
{
type: 'v-datepicker',
label: '开始时间',
model: 'start_date',
attrs: {
type: 'month',
placeholder: '请选择培训开始时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择培训开始时间', trigger: 'blur' }]
},
{
type: 'v-datepicker',
label: '结束时间',
model: 'end_date',
attrs: {
type: 'month',
placeholder: '请选择培训结束时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择培训结束时间', trigger: 'blur' }]
},
{
type: 'v-input',
label: '培训机构',
model: 'institution_cn',
attrs: { placeholder: '请输入培训机构' },
rules: [{ required: true, message: '请输入培训机构', trigger: 'blur' }]
},
{
type: 'v-input',
label: '课程名称',
model: 'course_cn',
attrs: { placeholder: '请输入课程名称' },
rules: [{ required: true, message: '请输入课程名称', trigger: 'blur' }]
}
]
}
}
}
/**
* 推荐信
*/
export default function(_this) {
return {
id: 'application_tjx',
title: '推荐信',
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 3
const list = data.data.material.reco_letters || []
return list.length ? list : [{}, {}]
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
return { reco_letters: data }
}
},
form: {
minlength: 2,
prev: { to: { query: { active: 'application_info', tab: 'application_info_honor' } }, isSubmit: true },
next: { to: { query: { active: 'application_wfzzm' } }, isSubmit: true },
hasAdd: true,
disabled(data) {
return !!data.letter_content
},
aside: {
prepend: {
html: '<p style="color:#33C011;">推荐人已完成</p>',
visible(data) {
return !!data.letter_content
}
},
buttons: [
{
text: '再次邀请',
visible(data) {
const editable = ['PREPAYMENT', 'INTERVIEW_APPLICATION', 'AUDITION'].includes(
_this.detail.material.submission_stage
)
return data.id && !data.letter_content && editable
},
onClick(data) {
_this.sendToProvider(data)
}
},
{
text: '更换推荐人',
visible(data) {
const editable = ['PREPAYMENT', 'INTERVIEW_APPLICATION', 'AUDITION'].includes(
_this.detail.material.submission_stage
)
return data.id && !data.letter_content && editable
},
onClick(data, $form) {
$form.validate().then(() => {
_this.changeProvider(data)
})
}
}
]
},
options: { labelWidth: '140px' },
items: [
{
type: 'v-input',
label: '推荐人姓名',
model: 'provider_name',
attrs: { placeholder: '请输入推荐人姓名' },
rules: [{ required: true, message: '请输入推荐人姓名', trigger: 'blur' }]
},
{
type: 'v-input',
label: '推荐人电话',
model: 'provider_phone_number',
attrs: { placeholder: '请输入推荐人电话', maxlength: 11 },
rules: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入推荐人电话', trigger: 'blur' }]
},
{
type: 'v-input',
label: '推荐人邮箱',
model: 'provider_email',
attrs: { placeholder: '请输入推荐人邮箱' },
rules: [{ type: 'email', required: true, message: '请输入推荐人邮箱', trigger: 'blur' }]
},
{
type: 'v-select',
values: [
{ value: '老师/导师' },
{ value: '领导' },
{ value: '同学' },
{ value: '同事' },
{ value: '亲属' },
{ value: '朋友' },
{ value: '其他' }
],
label: '与推荐人关系',
model: 'provider_relationship',
rules: [{ required: true, message: '请选择与推荐人关系', trigger: 'change' }]
}
]
}
}
}
export default function(_this) {
return {
id: 'application_wfzzm',
title: '无犯罪证明',
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
const NO_CRIMINAL_CERT = attachments.filter(item => {
return item.file_type_id === 'NO_CRIMINAL_CERT'
})
return { NO_CRIMINAL_CERT }
}
},
form: {
prev: { to: { query: { active: 'application_tjx' } } },
next: { to: { query: { active: 'application_declare' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'NO_CRIMINAL_CERT',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'NO_CRIMINAL_CERT' },
limit: 1
},
prepend: `
<p>第一步:点击下载按键获取无犯罪证明模板</p>
<p><a href="https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/%E6%97%A0%E7%8A%AF%E7%BD%AA%E8%AE%B0%E5%BD%95%E8%AF%81%E6%98%8E.docx" target="_blank" download>下载模板</a></p>
<p>第二步:打印文件后填写内容并签字上传至电脑,点击下方按钮上传文件</p>
`
}
]
}
}
}
<template>
<app-layout>
<vue-form
:menus="menus"
:default-active="currentActive"
:tab-active="tabActive"
@page-change="handlePageChange"
@tab-change="handleTabChange"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
@prev="handlePrev"
@next="handleNext"
v-if="detail"
>
<template #aside-append>
<div class="aside-preview" @click="dialogVisible = true" v-if="visible">预览全部</div>
<div class="aside-logout" @click="$store.dispatch('logout')"><span>退出登录</span></div>
</template>
<!-- 报名缴费 -->
<template #content v-if="currentActive === 'application_pay'">
<app-pay />
</template>
</vue-form>
<el-dialog title="预览全部" :visible.sync="dialogVisible" width="790px" class="dialog-preview">
<app-preview :hasEdit="true" @edit="handlePreviewEdit" v-if="dialogVisible" />
</el-dialog>
<app-complete v-model="completeVisible"></app-complete>
</app-layout>
</template>
<script>
import AppLayout from '../layout.vue'
import getMenu from './form'
import AppPay from './pay.vue'
import AppPreview from './preview.vue'
import AppComplete from './complete.vue'
import * as api from '@/api/my'
export default {
components: { AppLayout, AppPay, AppPreview, AppComplete },
data() {
const menus = getMenu(this)
return {
menus: [menus],
currentActive: 'application_info',
tabActive: 'application_info_profile',
dialogVisible: false,
detail: null,
completeVisible: false
}
},
watch: {
$route: {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'application_info'
this.tabActive = query.tab || 'application_info_profile'
}
}
},
computed: {
visible() {
return this.currentActive !== 'application_info' || this.tabActive !== 'application_info_first'
}
},
methods: {
// 获取报名信息
getApplication() {
api.getApplication().then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.detail = data
if (
!data.progress.FILLING.attachments ||
data.progress.FILLING.attachments.missed_required_list.ID_CARD_PHOTO
) {
this.tabActive = 'application_info_first'
}
const { submission_stage: submissionStage = 'FILLING' } = data.material
if (submissionStage !== 'FILLING') {
this.menus[0].children.forEach(item => {
if (item.id === 'application_pay') {
item.show = true
}
})
}
} else {
this.$message.error(message)
}
})
},
handlePageChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } })
},
handleTabChange(value) {
this.tabActive = value
const query = Object.assign({}, this.$route.query, { tab: value })
this.$router.push({ query })
},
handleSuccess(data) {
console.log('提交成功了', data)
this.$message({ type: 'success', message: '提交成功' })
},
handleError(data) {
console.log('提交失败了', data)
this.$message({ type: 'error', message: data.message })
},
handlePrev(to) {
this.$router.push(to)
},
handleNext(to) {
this.$router.push(to)
},
handlePreviewEdit(to) {
this.$router.push(to)
this.dialogVisible = false
},
// 更换推荐人
changeProvider(data) {
api.updateProvider(data.id, data).then(response => {
const { error, message } = response
if (error.toString() === '0') {
this.$message({ type: 'success', message })
} else {
this.$message.error(message)
}
})
},
// 再次邀请推荐
sendToProvider(data) {
api.sendToProvider(data.id).then(response => {
const { error, message } = response
if (error.toString() === '0') {
this.$message({ type: 'success', message })
} else {
this.$message.error(message)
}
})
}
},
beforeMount() {
this.getApplication()
}
}
</script>
<style lang="scss" scoped>
::v-deep .aside-preview {
margin-top: -20px;
padding-left: 64px;
font-size: 14px;
font-weight: 700;
line-height: 44px;
color: #222;
cursor: pointer;
}
.dialog-preview {
::v-deep .el-dialog__body {
padding: 0;
}
}
</style>
<template>
<div class="pay">
<div class="pic">
<img src="../../../assets/images/my_pay_01.png" />
</div>
<div class="pay-hd">
<h1>欢迎您</h1>
<p class="t1">
申请紫荆-中国未来金融领袖计划项目,本项目的注册费、申请费共计<span>800</span>元,请扫描二维码缴费以完成报名。
</p>
<p class="t1" v-if="isPass">
因面试未通过需重新申请紫荆-中国未来金融领袖计划项目,本项目的注册费、申请费共计<span>800</span>元,请扫描二维码缴费以完成报名。
</p>
</div>
<div class="qrcode-error" v-if="qrcodeError">
生成二维码失败请刷新<i class="el-icon-refresh-left" @click="refreshQrcode" title="刷新"></i>
</div>
<div class="qrcode" v-else>
<qrcode-vue :value="qrcodeValue" size="100"></qrcode-vue>
<span @click="refreshQrcode">刷新</span>
</div>
<div class="pay-ft">
<p class="t2">注释:再提交800元申请费后,申请人还需上传并提交如下文件。</p>
<p class="t2">①本科学位证书、②本科中、英文成绩单各一份、③个人证件照(2寸、免冠、白底)</p>
<p class="t2">该申请费不退,请慎重缴费!</p>
</div>
<el-dialog
title="报名费缴费成功"
:visible.sync="dialogVisible"
:center="true"
:close-on-click-modal="false"
width="348px"
>
<div class="dialog-pay">
<p>请填写申请面试的材料,材料齐全后<br />招生办老师将给您致电预约面试日期与时间</p>
<div class="icon"><img src="../../../assets/images/icon_success.png" /></div>
</div>
<template #footer>
<el-button type="primary" @click="toInterview">立即预约</el-button>
</template>
</el-dialog>
</div>
</template>
<script>
import QrcodeVue from 'qrcode.vue'
import * as api from '@/api/my'
export default {
name: 'AppPay',
components: { QrcodeVue },
data() {
return {
isPass: false,
order: { id: '', payment_url: '' },
qrcodeError: false,
dialogVisible: false,
timer: null,
paymentRecords: [] // 所有订单
}
},
computed: {
// 二维码地址
qrcodeValue() {
return this.order.payment_url
},
// 支付成功
paySuccess() {
return this.order.payment_status === 'SUCCESS'
},
// 待支付订单
orderList() {
// 筛选待支付订单
const list = this.paymentRecords.filter(item => {
return item.bill_type === 'APPLICATION_FEE' && item.payment_status === 'WAITING_FOR_PAY'
})
// 待支付订单是否有当前订单
const found = list.find(item => item.id === this.order.id)
return found ? list : [...list, this.order]
}
},
methods: {
// 获取报名信息
async getApplication() {
await api.getApplication().then(response => {
const { payment_records: paymentRecords = [] } = response.data.material
// 获取支付订单
this.paymentRecords = paymentRecords
if (paymentRecords && paymentRecords.length) {
// 获取支付成功的订单
const orderPaySuccess = paymentRecords.find(item => {
return item.bill_type === 'APPLICATION_FEE' && item.payment_status === 'SUCCESS'
})
if (orderPaySuccess) {
this.order = orderPaySuccess
this.dialogVisible = true
return
}
// 获取最后一个订单
const [lastPayment] = paymentRecords.reverse()
this.order = lastPayment
}
})
},
// 获取订单
async getOrder() {
if (this.paySuccess) {
return
}
await api.getOrder({ payment_method: 'WX_PAY_QR' }).then(response => {
const { data, error, message } = response
this.qrcodeError = error.toString() === '1'
if (error.toString() === '0') {
this.order = data
} else {
this.$message.error(message)
}
})
},
// 刷新二维码
refreshQrcode() {
this.getOrder()
},
// 检查支付状态
async checkPay(order) {
if (this.paySuccess) {
this.timer && clearInterval(this.timer)
return
}
const userId = window.G.UserInfo.id
await api.checkPay(order.id, { user_id: userId }).then(response => {
if (response.data.payment_status === 'SUCCESS') {
this.timer && clearInterval(this.timer)
this.dialogVisible = true
}
})
},
setCheckPayTimer() {
this.timer && clearInterval(this.timer)
this.timer = setInterval(() => {
this.orderList.forEach(order => {
this.checkPay(order)
})
}, 3000)
},
// 申请面试
toInterview() {
this.$router.push('/my/interview')
}
},
async mounted() {
await this.getApplication()
await this.getOrder()
this.setCheckPayTimer()
},
destroyed() {
this.timer && clearInterval(this.timer)
}
}
</script>
<style lang="scss" scoped>
.pay {
max-width: 562px;
margin: 0 auto;
}
.pic {
text-align: center;
}
.pay-hd {
h1 {
padding: 10px 0;
font-size: 24px;
font-weight: 500;
color: #222;
line-height: 1;
text-align: center;
}
}
.qrcode {
padding: 20px 0;
text-align: center;
span {
margin-top: 10px;
font-size: 12px;
color: #999;
cursor: pointer;
}
}
.qrcode-error {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
width: 100px;
height: 100px;
padding: 10px;
margin: 20px auto;
color: var(--main-color);
border-style: dashed;
border-width: 1px;
border-color: var(--main-color);
box-sizing: border-box;
text-align: center;
i {
margin-top: 10px;
cursor: pointer;
}
}
.t1 {
font-size: 14px;
color: #303030;
line-height: 20px;
text-align: center;
span {
color: #ffa448;
}
}
.t2 {
font-size: 12px;
color: #999;
line-height: 20px;
}
.dialog-pay {
text-align: center;
p {
color: #262626;
line-height: 20px;
}
.icon {
margin-top: 20px;
text-align: center;
}
}
</style>
<template>
<div class="preview" v-loading="loading">
<template v-if="!loading">
<div class="preview-hd">
<el-steps align-center :active="options.length">
<template v-for="item in options">
<el-step
:title="item.title"
:status="progress.FILLING[item.code] && progress.FILLING[item.code].progress === 1 ? 'success' : 'error'"
:key="item.code"
></el-step>
</template>
</el-steps>
</div>
<div class="preivew-bd">
<template v-for="item in options">
<div
class="preview-item"
:class="progress.FILLING[item.code].progress === 1 ? 'is-success' : 'is-error'"
:key="item.code"
v-if="progress.FILLING[item.code]"
>
<div class="preview-item-hd">
<div class="title">
{{ item.title }}
<template v-if="progress.FILLING[item.code].progress === 1">(已完善)</template>
<template v-else>(待完善)</template>
</div>
<div class="line"></div>
<el-button plain size="small" @click="handleEdit(item.edit.to)" v-if="hasEdit">编辑</el-button>
</div>
<div class="preview-item-bd">
<template v-if="item.computed">
<div v-html="item.computed(material[item.code])"></div>
</template>
<template v-else-if="item.isMultiple">
<div class="group" v-for="(data, index) in material[item.code]" :key="index">
<dl
v-for="subitem in item.items"
:key="subitem.code"
v-show="subitem.visible ? subitem.visible() : true"
>
<dt>{{ subitem.label }}</dt>
<dd>
<template v-if="subitem.computed">
<div v-html="subitem.computed(data)"></div>
</template>
<template v-else>{{ data[subitem.code] }}</template>
</dd>
</dl>
</div>
</template>
<template v-else>
<div class="group">
<dl v-for="subitem in item.items" :key="subitem.code">
<dt>{{ subitem.label }}</dt>
<dd>
<template v-if="subitem.computed">
<div v-html="subitem.computed(material[item.code])"></div>
</template>
<template v-else>{{ material[item.code][subitem.code] }}</template>
</dd>
</dl>
</div>
</template>
</div>
</div>
</template>
<div class="preview-item is-success" v-if="isManager">
<div class="preview-item-hd">
<div class="title">照片/附件</div>
<div class="line"></div>
</div>
<div class="preview-item-bd">
<template v-if="material.attachments">
<ul class="attachments">
<li class="attachments-item" v-for="(item, index) in material.attachments" :key="index">
<a class="inner" :href="item.oss_sign_url" target="_blank">
<div class="pic"><img :src="item.oss_sign_url" /></div>
<div class="name">{{ item.file_type_label }}</div>
<div class="time">{{ item.upload_time }}</div>
</a>
</li>
</ul>
</template>
</div>
</div>
</div>
</template>
</div>
</template>
<script>
import * as api from '@/api/my'
// 行业类别
const industryList = [
{ label: '互联网/电子商务', value: '1 ' },
{ label: '基金/证券/期货/投资', value: '2 ' },
{ label: '保险', value: '3 ' },
{ label: '银行', value: '4 ' },
{ label: '信托/担保/拍卖/典当', value: '5 ' },
{ label: '计算机软件', value: '6 ' },
{ label: 'IT服务(系统/数据/维护)', value: '7 ' },
{ label: '电子技术/半导体/集成电路', value: '8 ' },
{ label: '计算机硬件', value: '9 ' },
{ label: '通信/电信/网络设备', value: '10' },
{ label: '通信/电信运营、增值服务', value: '11' },
{ label: '网络游戏', value: '12' },
{ label: '房地产/建筑/建材/工程', value: '13' },
{ label: '家居/室内设计/装饰装潢', value: '14' },
{ label: '物业管理/商业中心', value: '15' },
{ label: '专业服务/咨询(财会/法律/人力资源等)', value: '16' },
{ label: '广告/会展/公关', value: '17' },
{ label: '中介服务', value: '18' },
{ label: '检验/检测/认证', value: '19' },
{ label: '外包服务', value: '20' },
{ label: '快速消费品(食品/饮料/烟酒/日化)', value: '21' },
{ label: '耐用消费品(服饰/纺织/皮革/家具/家电)', value: '22' },
{ label: '贸易/进出口', value: '23' },
{ label: '零售/批发', value: '24' },
{ label: '租赁服务', value: '25' },
{ label: '教育/培训/院校', value: '26' },
{ label: '礼品/玩具/工艺美术/收藏品/奢侈品', value: '27' },
{ label: '汽车/摩托车', value: '28' },
{ label: '大型设备/机电设备/重工业', value: '29' },
{ label: '加工制造(原料加工/模具)', value: '30' },
{ label: '仪器仪表及工业自动化', value: '31' },
{ label: '印刷/包装/造纸', value: '32' },
{ label: '办公用品及设备', value: '33' },
{ label: '医药/生物工程', value: '34' },
{ label: '医疗设备/器械', value: '35' },
{ label: '航空/航天研究与制造', value: '36' },
{ label: '交通/运输,物流/仓储', value: '37' },
{ label: '医疗/护理/美容/保健/卫生服务', value: '38' },
{ label: '酒店/餐饮,旅游/度假,媒体/出版/影视/文化传播', value: '39' },
{ label: '娱乐/体育/休闲', value: '40' },
{ label: '能源/矿产/采掘/冶炼', value: '41' },
{ label: '石油/石化/化工,电气/电力/水利', value: '42' },
{ label: '环保', value: '43' },
{ label: '政府/公共事业/非盈利机构', value: '44' },
{ label: '学术/科研,农/林/牧/渔跨领域经营', value: '45' },
{ label: '其他', value: '90' }
]
export default {
name: 'Preview',
props: {
hasEdit: { type: Boolean, default: false },
isManager: { type: Boolean, default: false }
},
data() {
return {
loading: false,
material: {},
progress: {},
options: [
{
title: '个人资料',
code: 'basic_info',
edit: {
to: { path: '/my/application', query: { active: 'application_info', tab: 'application_info_profile' } }
},
items: [
{ label: '姓名', code: 'real_name_cn' },
{ label: '英文名', code: 'real_name_en' },
{
label: '现居住城市',
code: 'address_city',
computed(data) {
return `${data.address_province}-${data.address_city}`
}
},
{ label: '证件类型', code: 'id_type' },
{ label: '证件号码', code: 'id_number' },
{ label: '手机', code: 'phone_number' },
{ label: '邮箱', code: 'email' },
{ label: '性别', code: 'gender' },
{ label: '国籍', code: 'nationality' },
{ label: '生日', code: 'birthday' },
{ label: '微信号', code: 'we_chat_account' },
{ label: '邮寄地址', code: 'mailing_address' },
{ label: '紧急联系人', code: 'emergency_contact_name' },
{ label: '紧急联系人电话', code: 'emergency_contacts_phone' }
]
},
{
title: '教育背景',
code: 'educations',
edit: {
to: { path: '/my/application', query: { active: 'application_info', tab: 'application_info_education' } }
},
isMultiple: true,
items: [
{
label: '教育时间',
code: 'start_date',
computed(data) {
return `${data.start_date}${data.end_date}`
}
},
{ label: '专业名称', code: 'major_cn' },
{ label: '学校名称', code: 'school_name_cn' },
{ label: '学历/学位', code: 'degree' }
]
},
{
title: '工作经验',
code: 'careers',
edit: {
to: { path: '/my/application', query: { active: 'application_info', tab: 'application_info_career' } }
},
isMultiple: true,
items: [
{
label: '工作时间',
code: 'start_date',
computed(data) {
return `${data.start_date}${data.end_date}`
}
},
{ label: '工作单位', code: 'company_name_cn' },
{
label: '行业类别',
code: 'industry',
computed(data) {
const found = industryList.find(item => item.value === data.industry)
return found.label
}
},
{ label: '工作部门', code: 'dept_cn' },
{ label: '工作职位', code: 'position_cn' },
{ label: '工作描述', code: 'job_desc_cn' }
]
},
{
title: '学习目的',
code: 'answers',
edit: {
to: { path: '/my/application', query: { active: 'application_info', tab: 'application_info_answer' } }
},
computed(data = []) {
const result = data.map(item => {
return `<dl><dt>${item.question}</dt><dd>${item.answer}</dd></dl>`
})
return `<div class="answers">${result.join('')}</div>`
}
},
{
title: '所受培训',
code: 'trainings',
edit: {
to: { path: '/my/application', query: { active: 'application_info', tab: 'application_info_training' } }
},
isMultiple: true,
items: [
{
label: '培训时间',
code: 'start_date',
computed(data) {
return `${data.start_date}${data.end_date}`
}
},
{ label: '培训机构', code: 'institution_cn' },
{ label: '课程名称', code: 'course_cn' }
]
},
{
title: '荣誉奖励',
code: 'honors',
edit: {
to: { path: '/my/application', query: { active: 'application_info', tab: 'application_info_honor' } }
},
isMultiple: true,
items: [
{ label: '获取时间', code: 'time' },
{ label: '荣誉奖励', code: 'title' },
{ label: '证书颁发机构', code: 'institution_cn' }
]
},
{
title: '推荐信',
code: 'reco_letters',
edit: { to: { path: '/my/application', query: { active: 'application_tjx' } } },
isMultiple: true,
items: [
{ label: '推荐人姓名', code: 'provider_name' },
{ label: '推荐人电话', code: 'provider_phone_number' },
{ label: '推荐人邮箱', code: 'provider_email' },
{ label: '与推荐人关系', code: 'provider_relationship' },
{ label: '推荐人工作单位', code: 'provider_company_name', visible: () => this.isManager },
{ label: '推荐人职务', code: 'provider_job_title', visible: () => this.isManager },
{ label: '推荐信内容', code: 'letter_content', visible: () => this.isManager }
]
},
{
title: '无犯罪证明',
code: 'attachments',
edit: { to: { path: '/my/application', query: { active: 'application_wfzzm' } } },
computed(data) {
if (!data || !data.length) {
return ''
}
const found = data.find(item => item.file_type_id === 'NO_CRIMINAL_CERT')
return found
? `<a href="${found.oss_sign_url}" target="_blank"><img src="${found.oss_sign_url}" style="max-width:300px;margin:10px 0;"></a>`
: ''
}
}
]
}
},
methods: {
// 获取报名信息
getApplication() {
this.loading = true
api.getApplication(this.$route.query).then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
const { material, progress } = data
this.material = material
const missedRequiredList = progress.FILLING.attachments.missed_required_list
progress.FILLING.attachments.progress = missedRequiredList.NO_CRIMINAL_CERT ? 0 : 1
this.progress = progress
} else {
this.$message.error(message)
}
this.loading = false
})
},
handleEdit(to) {
this.$emit('edit', to)
// this.$router.push(to)
}
},
beforeMount() {
this.getApplication()
}
}
</script>
<style lang="scss" scoped>
.preview {
max-width: 750px;
min-height: 80vh;
padding: 20px;
margin: 0 auto;
background-color: #fff;
}
.preview-hd {
padding: 20px 0;
::v-deep .el-step__title {
font-size: 12px;
}
}
.preview-item {
margin: 20px;
}
.is-success {
color: #37a912;
.line {
background: linear-gradient(90deg, #37a912 0%, rgba(255, 218, 218, 0) 100%);
}
}
.is-error {
color: #da2a56;
.line {
background: linear-gradient(90deg, #da2a56 0%, rgba(255, 218, 218, 0) 100%);
}
}
.preview-item-hd {
display: flex;
align-items: center;
.title {
font-size: 18px;
font-weight: 600;
}
.line {
flex: 1;
height: 4px;
margin: 0 20px;
}
}
.preview-item-bd {
.group {
padding: 20px 0;
display: flex;
flex-wrap: wrap;
}
.group + .group {
border-top: 1px solid #f1f1f1;
}
dl {
flex: 50%;
display: flex;
margin-bottom: 10px;
font-size: 14px;
color: #222;
}
dt {
font-weight: bold;
}
dd {
flex: 1;
word-break: break-all;
}
}
</style>
<style lang="scss">
.preview {
.answers {
padding: 20px 0;
dl {
margin-bottom: 10px;
font-size: 14px;
color: #222;
& + dl {
margin-top: 20px;
}
}
dt {
font-weight: bold;
margin-bottom: 5px;
}
dd {
word-break: break-all;
}
}
.attachments {
padding: 20px 0;
}
.attachments-item {
&:hover {
background-color: #f7f7f7;
}
.inner {
padding: 10px;
height: 40px;
display: flex;
align-items: center;
color: #222;
}
.pic {
width: 32px;
height: 32px;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.name {
flex: 1;
padding: 0 10px;
}
.time {
font-size: 12px;
}
}
}
</style>
export default {
id: 'interview_byzs',
title: '毕业证书',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 2
const DIPLOMA_CN = attachments.filter(item => {
return item.file_type_id === 'DIPLOMA_CN'
})
return { DIPLOMA_CN }
}
},
form: {
next: { to: { query: { active: 'interview_xwzs' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'DIPLOMA_CN',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'DIPLOMA_CN' }
},
append:
'申请者需要将本科或以上毕业证书原件扫描或者拍照后提交。<br> 可上传多个文件,请确保证书号码清晰可辨。<br> 上传文件仅限“jpg,jpeg,png”格式,文件小于10MB。'
}
]
}
}
export default {
id: 'interview_cjd',
title: '成绩单(中+英)',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 2
return attachments.reduce(
(result, item) => {
if (item.file_type_id === 'REPORT_CARD_CN') {
result.REPORT_CARD_CN.push(item)
}
if (item.file_type_id === 'REPORT_CARD_EN') {
result.REPORT_CARD_EN.push(item)
}
return result
},
{ REPORT_CARD_CN: [], REPORT_CARD_EN: [] }
)
}
},
form: {
prev: { to: { query: { active: 'interview_ywjl' } } },
next: { to: { query: { active: 'interview_zp' } } },
hasButton: false,
options: { 'label-position': 'top' },
hint: `
<p>请将中英文成绩单原件扫描或者拍照后提交。</p>
<p>获取途径:联系大学时就读学校相关部门(档案馆/教务处)获取成绩单。</p>
`,
items: [
{
type: 'v-upload',
label: '中文成绩单',
required: true,
model: 'REPORT_CARD_CN',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'REPORT_CARD_CN' }
}
},
{
type: 'v-upload',
label: '英文成绩单',
required: true,
model: 'REPORT_CARD_EN',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'REPORT_CARD_EN' }
}
}
]
}
}
import zp from './zp'
import byzs from './byzs'
import xwzs from './xwzs'
import xwzszm from './xwzszm'
import ywjl from './ywjl'
import cjd from './cjd'
export default function(_this) {
return {
id: 'interview',
title: '申请面试',
children: [byzs, xwzs, xwzszm, ywjl, cjd, zp(_this)]
}
}
export default {
id: 'interview_xwzs',
title: '学位证书',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 2
const DEGREE_CERT_CN = attachments.filter(item => {
return item.file_type_id === 'DEGREE_CERT_CN'
})
return { DEGREE_CERT_CN }
}
},
form: {
prev: { to: { query: { active: 'interview_byzs' } } },
next: { to: { query: { active: 'interview_xwzsywzm' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'DEGREE_CERT_CN',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'DEGREE_CERT_CN' }
},
append:
'申请者需要将学位证书原件扫描或者拍照后提交。<br>可上传多个文件,请确保证书号码清晰可辨。<br>上传文件仅限“jpg,jpeg,png”格式,文件小于10MB。'
}
]
}
}
export default {
id: 'interview_xwzsywzm',
title: '学位证书英文证明',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 2
const DEGREE_CERT_EN = attachments.filter(item => {
return item.file_type_id === 'DEGREE_CERT_EN'
})
return { DEGREE_CERT_EN }
}
},
form: {
prev: { to: { query: { active: 'interview_xwzs' } } },
next: { to: { query: { active: 'interview_ywjl' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'DEGREE_CERT_EN',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'DEGREE_CERT_EN' }
},
append: '请将学校出具的学位证书英文证明原件扫描或者拍照后提交。'
}
]
}
}
export default {
id: 'interview_ywjl',
title: '英文简历',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 2
const RESUME_EN = attachments.filter(item => {
return item.file_type_id === 'RESUME_EN'
})
return { RESUME_EN }
}
},
form: {
prev: { to: { query: { active: 'interview_xwzsywzm' } } },
next: { to: { query: { active: 'interview_cjd' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'RESUME_EN',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'RESUME_EN' }
},
append: `
<p>请下载填写英文简历模板后上传 [<a href="https://zws-imgs-pub.ezijing.com/static/public/2e8e4f6898f59e03636139a402ef16c1.docx" target="_blank" download="英文简历模板">下载模板</a>]</p>
<p>请将英文简历填写完存为"pdf"格式上传,文件小于10MB。</p>`
}
]
}
}
export default function(_this) {
return {
id: 'interview_zp',
title: '2寸照片',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 2
const PERSONAL_PHOTO_FOR_ID = attachments.filter(item => {
return item.file_type_id === 'PERSONAL_PHOTO_FOR_ID'
})
return { PERSONAL_PHOTO_FOR_ID }
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/submit/${webConf.others.projectId}`,
beforeRequest(data) {
return { submission_stage: 'INTERVIEW_APPLICATION' }
},
callback() {
this.form.options.disabled = true
_this.dialogVisible = true
_this.getApplication()
},
errorCallback() {
_this.completeVisible = true
}
},
form: {
prev: { to: { query: { active: 'interview_cjd' } } },
submitText: '申请面试',
model: { submission_stage: 'INTERVIEW_APPLICATION' },
options: {},
items: [
{
type: 'v-upload',
model: 'PERSONAL_PHOTO_FOR_ID',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'PERSONAL_PHOTO_FOR_ID' }
},
append:
'申请者需要上传本人半年以内的一寸彩色近照。<br> 只需上传一个文件,且照片完整、干净。<br> 上传文件仅限“jpg,jpeg,gif,png”格式的图片文件,且文件小于10MB。'
}
]
}
}
}
<template>
<app-layout>
<vue-form
:menus="menus"
:default-active="currentActive"
@page-change="handlePageChange"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
@prev="handlePrev"
@next="handleNext"
>
<template #aside-append>
<div class="aside-logout" @click="$store.dispatch('logout')"><span>退出登录</span></div>
</template>
</vue-form>
<app-complete :type="1" v-model="completeVisible"></app-complete>
<el-dialog
title="资料提交成功"
:visible.sync="dialogVisible"
:center="true"
:close-on-click-modal="false"
width="348px"
>
<div class="dialog-tips">
<p>请注意接听中国未来金融领袖计划项目招办老师的邀约电话</p>
<div class="icon"><img src="../../../assets/images/icon_success.png" /></div>
</div>
<template #footer>
<el-button type="primary" @click="dialogVisible = false">我知道啦</el-button>
</template>
</el-dialog>
</app-layout>
</template>
<script>
import AppLayout from '../layout.vue'
import getMenu from './form'
import AppComplete from '../application/complete.vue'
import * as api from '@/api/my'
export default {
components: { AppLayout, AppComplete },
data() {
const menus = getMenu(this)
return {
menus: [menus],
currentActive: 'interview_byzs',
completeVisible: false,
dialogVisible: false,
detail: null
}
},
watch: {
$route: {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'interview_byzs'
}
},
showSubmitedDialog(value) {
this.dialogVisible = value
}
},
computed: {
isSubmited() {
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
if (this.detail) {
return stageList.findIndex(item => item === this.detail.material.submission_stage) > 2
}
return false
},
showSubmitedDialog() {
return this.isSubmited && this.currentActive === 'interview_zp'
}
},
methods: {
// 获取报名信息
getApplication() {
api.getApplication().then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.detail = data
} else {
this.$message.error(message)
}
})
},
handlePageChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } })
console.log('页面切换了', value)
},
handleSuccess(data) {
this.getApplication()
console.log('提交成功了', data)
this.$message({ type: 'success', message: data.message })
},
handleError(data) {
console.log('提交失败了', data)
this.$message({ type: 'error', message: data.message })
},
handlePrev(to) {
this.$router.push(to)
},
handleNext(to) {
this.$router.push(to)
}
},
beforeMount() {
this.getApplication()
}
}
</script>
<style lang="scss" scoped>
.dialog-tips {
text-align: center;
p {
color: #262626;
line-height: 20px;
}
.icon {
margin-top: 20px;
text-align: center;
}
}
</style>
<template>
<div style="background-color: #eee">
<div class="layout">
<div class="layout-hd">
<slot name="header">
<h1 class="title">在线报名</h1>
</slot>
</div>
<div class="layout-bd">
<slot></slot>
</div>
</div>
</div>
</template>
<script>
export default {
props: {},
data() {
return {}
},
mounted() {
document.body.style = 'background-color:#eee;'
},
destroyed() {
document.body.style = ''
}
}
</script>
<style lang="scss" scoped>
.layout {
max-width: 970px;
margin: 0 auto;
overflow: hidden;
}
.layout-hd {
.title {
padding: 20px 0;
font-size: 18px;
line-height: 1;
color: var(--main-color);
border-bottom-width: 1px;
border-bottom-style: solid;
border-bottom-color: var(--main-color);
}
}
.layout-bd {
margin: 20px 0;
}
::v-deep .v-layout-aside {
position: relative;
min-height: 410px;
align-self: flex-start;
.aside-logout {
span {
display: inline-block;
background: url('../../assets/images/icon_logout.png') no-repeat left center;
background-size: 18px 17px;
padding-left: 33px;
}
position: absolute;
left: 0;
right: 0;
bottom: 0;
margin: 0 10px;
padding: 12px;
font-size: 12px;
color: #999;
text-align: center;
border-top: 1px solid #eee;
cursor: pointer;
}
}
</style>
<template>
<div v-if="loaded">
<index-welcome @update="handleUpdate" v-if="!isSubmited" />
<index-pay v-else />
</div>
</template>
<script>
import IndexWelcome from './indexWelcome.vue'
import IndexPay from './indexPay.vue'
import * as api from '@/api/my'
export default {
components: { IndexWelcome, IndexPay },
data() {
return {
loaded: false,
progress: {}
}
},
methods: {
// 获取报名信息
getApplication() {
this.loaded = false
api.getApplication().then(response => {
const { progress = {} } = response.data
this.progress = progress
// 缴费成功
if (progress.PREPAYMENT.total_progress) {
this.$router.push('/my/account')
} else {
this.loaded = true
}
})
},
handleUpdate(data) {
const { progress } = data
this.progress = progress
}
},
computed: {
isSubmited() {
const { FILLING = {} } = this.progress
if (FILLING && FILLING.basic_info) {
return !!FILLING.basic_info.progress
}
return false
}
},
beforeCreate() {
document.body.style.background = '#fff'
},
beforeMount() {
this.getApplication()
},
destroyed() {
document.body.style = ''
}
}
</script>
<template>
<div class="pay">
<div class="pay-hd">
<div class="pic">
<img src="../../../assets/images/my_pay_02.png" height="160" />
</div>
<h1>请使用微信扫描下方二维码</h1>
</div>
<div class="qrcode-error" v-if="qrcodeError">
生成二维码失败请刷新<i class="el-icon-refresh-left" @click="refreshQrcode" title="刷新"></i>
</div>
<div class="qrcode" v-else>
<qrcode-vue :value="qrcodeValue" size="100"></qrcode-vue>
<span @click="refreshQrcode">刷新</span>
</div>
<div class="pay-ft">
<p class="t2">注释:在提交800元申请费后,申请人需上传并提交如下文件。</p>
<p class="t2">①填写报名表、②完成推荐信3封、③无犯罪声明、④本科学历学位证书、⑤中英文成绩单、⑥个人证件照</p>
<p class="t2">该申请费不退,请慎重缴费!</p>
</div>
<el-dialog
title="报名费缴费成功"
:visible.sync="dialogVisible"
:center="true"
:close-on-click-modal="false"
width="348px"
>
<div class="dialog-pay">
<p>请填写报名所需材料,材料齐全后招生办老师将<br />给您致电预约面试日期与时间</p>
<div class="icon"><img src="../../../assets/images/icon_success.png" /></div>
</div>
<template #footer>
<el-button type="primary" @click="toApplication">立即预约</el-button>
</template>
</el-dialog>
</div>
</template>
<script>
import QrcodeVue from 'qrcode.vue'
import * as api from '@/api/my'
export default {
name: 'AppPay',
components: { QrcodeVue },
data() {
return {
isPass: false,
order: { id: '', payment_url: '' },
qrcodeError: false,
dialogVisible: false,
timer: null,
paymentRecords: [] // 所有订单
}
},
computed: {
// 二维码地址
qrcodeValue() {
return this.order.payment_url
},
// 支付成功
paySuccess() {
return this.order.payment_status === 'SUCCESS'
},
// 待支付订单
orderList() {
// 筛选待支付订单
const list = this.paymentRecords.filter(item => {
return item.bill_type === 'APPLICATION_FEE' && item.payment_status === 'WAITING_FOR_PAY'
})
// 待支付订单是否有当前订单
const found = list.find(item => item.id === this.order.id)
return found ? list : [...list, this.order]
}
},
methods: {
// 获取报名信息
async getApplication() {
await api.getApplication().then(response => {
const { payment_records: paymentRecords = [] } = response.data.material
// 获取支付订单
this.paymentRecords = paymentRecords
if (paymentRecords && paymentRecords.length) {
// 获取支付成功的订单
const orderPaySuccess = paymentRecords.find(item => {
return item.bill_type === 'APPLICATION_FEE' && item.payment_status === 'SUCCESS'
})
if (orderPaySuccess) {
this.order = orderPaySuccess
this.dialogVisible = true
return
}
// 获取最后一个订单
const [lastPayment] = paymentRecords.reverse()
this.order = lastPayment
}
})
},
// 获取订单
async getOrder() {
if (this.paySuccess) {
return
}
await api.getOrder({ payment_method: 'WX_PAY_QR' }).then(response => {
const { data, error, message } = response
this.qrcodeError = error.toString() === '1'
if (error.toString() === '0') {
this.order = data
} else {
this.$message.error(message)
}
})
},
// 刷新二维码
refreshQrcode() {
this.getOrder()
},
// 检查支付状态
async checkPay(order) {
if (this.paySuccess) {
this.timer && clearInterval(this.timer)
return
}
const userId = window.G.UserInfo.id
await api.checkPay(order.id, { user_id: userId }).then(response => {
if (response.data.payment_status === 'SUCCESS') {
this.timer && clearInterval(this.timer)
this.dialogVisible = true
}
})
},
setCheckPayTimer() {
this.timer && clearInterval(this.timer)
this.timer = setInterval(() => {
this.orderList.forEach(order => {
this.checkPay(order)
})
}, 3000)
},
// 填写个人资料
toApplication() {
this.$router.push('/my/application?active=application_info')
}
},
async mounted() {
await this.getApplication()
await this.getOrder()
this.setCheckPayTimer()
},
destroyed() {
this.timer && clearInterval(this.timer)
}
}
</script>
<style lang="scss" scoped>
.pay {
max-width: 562px;
margin: 0 auto;
padding: 40px 0;
}
.pay-hd {
.pic {
text-align: center;
}
h1 {
margin-top: 40px;
font-size: 24px;
font-weight: 500;
color: #222;
line-height: 1;
text-align: center;
}
}
.qrcode {
padding: 20px 0;
text-align: center;
span {
margin-top: 10px;
font-size: 12px;
color: #999;
cursor: pointer;
}
}
.qrcode-error {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
width: 100px;
height: 100px;
padding: 10px;
margin: 20px auto;
color: var(--main-color);
border-style: dashed;
border-width: 1px;
border-color: var(--main-color);
box-sizing: border-box;
text-align: center;
i {
margin-top: 10px;
cursor: pointer;
}
}
.t1 {
font-size: 14px;
color: #303030;
line-height: 20px;
text-align: center;
span {
color: #ffa448;
}
}
.t2 {
font-size: 12px;
color: #999;
line-height: 20px;
}
.dialog-pay {
text-align: center;
p {
color: #262626;
line-height: 20px;
}
.icon {
margin-top: 20px;
text-align: center;
}
}
</style>
<template>
<div class="welcome">
<div class="top">
<div class="pic">
<img src="../../../assets/images/my_pay_01.png" />
</div>
<h1>欢迎您</h1>
<p class="t1">
申请紫荆-中国未来金融领袖计划项目,请在填写以下内容并<br />
提交报名申请后,扫码支付本项目的注册费、申请费共计<span>800</span>元。
</p>
</div>
<div class="form">
<el-form :model="ruleForm" :rules="rules" label-width="70px" ref="ruleForm">
<el-form-item label="姓名" prop="real_name_cn">
<el-input v-model="ruleForm.real_name_cn"></el-input>
</el-form-item>
<el-form-item label="手机号" prop="phone_number">
<el-input v-model="ruleForm.phone_number" :maxlength="11"></el-input>
</el-form-item>
<el-form-item label="邮件" prop="email">
<el-input v-model="ruleForm.email"></el-input>
</el-form-item>
<div class="buttons">
<el-button type="primary" class="button-submit" @click="handleSubmit">提交</el-button>
</div>
</el-form>
</div>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
data() {
return {
material: {},
progress: {},
ruleForm: {
real_name_cn: '',
phone_number: '',
email: ''
},
rules: {
real_name_cn: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
phone_number: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入手机号', trigger: 'blur' }],
email: [{ type: 'email', required: true, message: '请输入邮箱', trigger: 'blur' }]
}
}
},
methods: {
handleSubmit() {
this.$refs.ruleForm.validate().then(this.handleSubmitRequest)
},
handleSubmitRequest() {
const params = {
basic_info: this.ruleForm
}
api.updateApplication(params).then(response => {
if (response.error === '0') {
this.$emit('update', response.data)
} else {
this.$message({ type: 'error', message: response.message })
}
})
}
}
}
</script>
<style lang="scss" scoped>
.welcome {
margin: 0 auto;
padding: 20px 0;
}
.top {
padding: 40px 0;
.pic {
text-align: center;
}
h1 {
padding: 20px 0;
font-size: 24px;
font-weight: 500;
color: #222;
line-height: 1;
text-align: center;
}
}
.t1 {
font-size: 14px;
color: #262626;
line-height: 20px;
text-align: center;
span {
color: #ffa448;
}
}
.buttons {
text-align: center;
}
.button-submit {
width: 100px;
margin: 0 auto;
}
.form {
max-width: 350px;
margin: 0 auto;
}
</style>
......@@ -48,7 +48,7 @@ export default {
methods: {
goPage() {
this.$router.push({
path: '/signup/index'
path: '/my'
})
},
changeChildTab(index) {
......
<template>
<div>
<Project-title></Project-title>
<div class="content-box">
<!-- 内容写在这里面 -->
<div class="content">
<vue-form
:menus="menus"
:default-active="currentActive"
@@page-change="handleChange"
@success="handleSuccess"
@error="handleError"
>
<!-- 最终检查 -->
<template v-if="currentActive === 'final'">
<div class="enroll-final">
<table class>
<template v-for="(item, index) in submenu">
<tr :key="index" v-if="index < 7">
<td>{{ index }}{{ item.title }}</td>
<td>
<template v-if="item.progress">
<span class="is-success">已完成</span>
</template>
<template v-else>
<span class="is-error">未完成</span>
</template>
</td>
</tr>
</template>
</table>
</div>
</template>
</vue-form>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios'
import ProjectTitle from '../../components/ProjectTitle.vue'
import uwlaForm from './form/index.js'
export default {
components: {
ProjectTitle
},
data() {
return {
currentActive: 'profile',
menus: uwlaForm
}
},
watch: {
$route: {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'profile'
}
}
},
computed: {
submenu() {
return this.menus[0].children
}
},
methods: {
handleChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } }).catch(() => {})
console.log('页面切换了', value)
},
handleSuccess(data) {
console.log('提交成功了', data)
this.$message({ type: 'success', message: '保存成功' })
this.getProgress()
},
handleError(error) {
console.log(error)
this.$message({ type: 'error', message: error.message })
},
// 获取进度
getProgress() {
axios.get('/api/zws/v1/enrollment/submissions?project_id=1007').then(response => {
let children = this.menus[0].children
const { submit_progress: submitProgress, submit_status: submitStatus } = response.data
// https://gitlab.ezijing.com/root/api-documents/-/blob/master/zws/submission.md#221-%E8%B5%84%E6%96%99%E6%8F%90%E4%BA%A4%E7%8A%B6%E6%80%81-submit_status
children.forEach(item => {
if (item.form && item.form.options) {
item.form.options.disabled = !!submitStatus
}
if (item.id === 'pay') {
item.form.options.disabled = [4, 5, 6, 7, 21].includes(submitStatus)
}
if (submitProgress.hasOwnProperty(item.id)) {
item.progress = submitProgress[item.id] === 0.2 ? 100 : 0
}
})
if (submitStatus) {
const pay = children.find(item => item.id === 'pay')
pay.visible = true
}
})
}
},
beforeMount() {
this.getProgress()
}
}
</script>
<style lang="scss" scoped>
.content-box {
width: 100%;
background-color: #fff;
position: relative;
}
.content {
width: 100%;
max-width: 1200px;
margin: 0 auto;
position: relative;
top: -20px;
padding: 40px;
background-color: #fff;
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.1);
box-sizing: border-box;
}
.enroll-final table {
line-height: 2;
width: 100%;
margin: 40px 0;
font-size: 14px;
}
.enroll-final table td {
border: 1px solid #dedede;
padding: 10px 20px;
}
.enroll-final table td:first-child {
width: 30%;
background: #eee;
}
.enroll-final .is-success {
color: green;
}
.enroll-final .is-error {
color: #af1b40;
}
::v-deep .qrcode {
display: flex;
justify-content: space-between;
padding: 40px 0;
img {
width: 300px;
}
}
</style>
export default {
id: 'answer',
title: '学习目的',
showProgress: true,
progress: 0,
get: {
action: '/api/zws/v1/enrollment/answers?project_id=1007',
callback(data) {
let [first = {}, second = {}] = data
return {
qid1: first.qid || 1,
question1: first.question || '您为什么申请中国产业金融菁英计划项目?(200字以上,1000字以内)',
answer1: first.answer,
qid2: second.qid || 2,
question2:
second.question || '您的短期和长期职业发展目标是什么?您打算如何达成此愿景?(200字以上,1000字以内)',
answer2: second.answer
}
}
},
update: {
action: '/api/zws/v1/enrollment/answers/batch-upload',
data: { project_id: 1007 },
beforeRequest(data) {
return {
records: [
{ qid: data.qid1, question: data.question1, answer: data.answer1 },
{ qid: data.qid2, question: data.question2, answer: data.answer2 }
]
}
}
},
form: {
options: { disabled: false },
items: [
{
type: 'input-form',
label: '您为什么申请中国产业金融菁英计划项目?(200字以上,1000字以内)',
model: 'answer1',
attrs: {
type: 'textarea',
rows: '8',
maxlength: '1000'
},
rules: [
{
required: true,
message: '请输入',
trigger: 'blur'
},
{
min: 200,
max: 1000,
message: '长度在 200 到 1000 个字符',
trigger: 'blur'
}
]
},
{
type: 'input-form',
label: '您的短期和长期职业发展目标是什么?您打算如何达成此愿景?(200字以上,1000字以内)',
model: 'answer2',
attrs: {
type: 'textarea',
rows: '8',
maxlength: '1000'
},
rules: [
{
required: true,
message: '请输入',
trigger: 'blur'
},
{
min: 200,
max: 1000,
message: '长度在 200 到 1000 个字符',
trigger: 'blur'
}
]
}
]
}
}
export default {
id: 'attachment',
title: '照片/附件',
showProgress: true,
progress: 0,
get: {
action: '/api/zws/v1/enrollment/attachments?project_id=1007',
callback(data) {
let _data = {
uploadArrs10: [],
uploadArrs22: [],
uploadArrs23: [],
uploadArrs30: [],
uploadArrs31: [],
uploadArrs36: [],
uploadArrs40: [],
uploadArrs41: [],
uploadArrs43: [],
uploadArrs50: [],
uploadArrs51: []
}
data.forEach((item, index) => {
_data[`uploadArrs${item.file_type}`] &&
_data[`uploadArrs${item.file_type}`].push({
url: item.file,
id: item.id,
sso_file_name: item.sso_file_name
})
})
return _data
}
},
form: {
hasButton: false,
options: { disabled: false },
items: [
/* 一寸彩色近照 */
{
type: 'upload-form',
label: '一寸彩色近照',
required: true,
model: 'uploadArrs10',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 10,
project_id: 1007
},
attrs: {
multiple: false,
limit: 1
},
html: `
<div style="color: #72818c; font-size: 14px;">
<p style="margin: 0;">申请者需要上传本人半年以内的一寸彩色近照。</p>
<p style="margin: 0;">只需上传一个文件,且照片完整、干净。</p>
<p style="margin: 0;">上传文件仅限“jpg,jpeg,gif,png”格式的图片文件,且文件小于10MB。</p>
</div>
`
},
/* 有效身份证件(正面) */
{
type: 'upload-form',
label: '有效身份证件(正面)',
required: true,
model: 'uploadArrs22',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 22,
project_id: 1007
},
attrs: {
multiple: false,
limit: 1
},
html: `
<div style="color: #72818c; font-size: 14px;">
<p style="margin: 0;">申请者需要将有效身份证件原件扫描或者拍照后提交。</p>
<p style="margin: 0;">请您提供有效身份证件的扫描件,身份证与台港澳居民大陆通行证应包括正反两面扫描件。</p>
<p style="margin: 0;">只上传一个文件,多份文件需合并到一个文件后打印出来检查无误后再上传。</p>
<p style="margin: 0;">上传文件仅限“jpg,jpeg,gif,png”格式,文件小于10MB。</p>
</div>
`
},
/* 有效身份证件(反面) */
{
type: 'upload-form',
label: '有效身份证件(反面)',
required: true,
model: 'uploadArrs23',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 23,
project_id: 1007
},
attrs: {
multiple: false,
limit: 1
},
html: `
<div style="color: #72818c; font-size: 14px;">
<p style="margin: 0;">申请者需要将有效身份证件原件扫描或者拍照后提交。</p>
<p style="margin: 0;">请您提供有效身份证件的扫描件,身份证与台港澳居民大陆通行证应包括正反两面扫描件。</p>
<p style="margin: 0;">只上传一个文件,多份文件需合并到一个文件后打印出来检查无误后再上传。</p>
<p style="margin: 0;">上传文件仅限“jpg,jpeg,gif,png”格式,文件小于10MB。</p>
</div>
`
},
/* 毕业证书 */
{
type: 'upload-form',
label: '毕业证书',
required: true,
model: 'uploadArrs30',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 30,
project_id: 1007
},
attrs: {
multiple: true
},
html: `
<div style="color: #72818c; font-size: 14px;">
<p style="margin: 0;">申请者需要将本科或以上毕业证书原件扫描或者拍照后提交。</p>
<p style="margin: 0;">可上传多个文件,请确保证书号码清晰可辨。</p>
<p style="margin: 0;">上传文件仅限“jpg,jpeg,png”格式,文件小于10MB。</p>
</div>
`
},
/* 学位证书 */
{
type: 'upload-form',
label: '学位证书',
required: true,
model: 'uploadArrs31',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 31,
project_id: 1007
},
attrs: {
multiple: true
},
html: `
<div style="color: #72818c; font-size: 14px;">
<p style="margin: 0;">申请者需要将学位证书原件扫描或者拍照后提交。</p>
<p style="margin: 0;">可上传多个文件,请确保证书号码清晰可辨。</p>
<p style="margin: 0;">上传文件仅限“jpg,jpeg,png”格式,文件小于10MB。</p>
</div>
`
},
/* 学位证书英文证明 */
{
type: 'upload-form',
label: '学位证书英文证明',
required: true,
model: 'uploadArrs36',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 36,
project_id: 1007
},
attrs: {
multiple: true
},
html: `
<div style="color: #72818c; font-size: 14px;">
<p style="margin: 0;">请将学校出具的学位证书英文证明原件扫描或者拍照后提交。</p>
</div>
`
},
/* 英文简历 */
{
type: 'upload-form',
label: '英文简历',
required: true,
model: 'uploadArrs50',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 50,
project_id: 1007
},
attrs: {
multiple: true
},
html: `
<div style="color: #72818c; font-size: 14px;">
<p style="margin: 0;">请下载填写英文简历模板后上传 <a href="https://zws-imgs-pub.ezijing.com/static/public/2e8e4f6898f59e03636139a402ef16c1.docx">[下载模板]</a></p>
<p style="margin: 0;">请将英文简历填写完存为"pdf"格式上传,文件小于10MB。</p>
</div>
`
},
// /* 托福/雅思成绩单 */
// {
// type: 'upload-form',
// label: '托福/雅思成绩单',
// required: true,
// model: 'uploadArrs41',
// action: '/api/zws/v1/enrollment/attachments',
// deleteAction: '/api/zws/v1/enrollment/attachments',
// data: {
// file_type: 41,
// project_id: 1007
// },
// attrs: {
// multiple: true
// },
// html: `
// <div style="color: #72818c; font-size: 14px;">
// <p style="margin: 0;">托福(TOEFL)/雅思(IELTS)成绩单:如之前考取托福或雅思成绩,请提交官方成绩单扫描件,暂不对有效期进行要求。</p>
// <p style="margin: 0;">可上传多个文件,请确保证书号码清晰可辨。</p>
// <p style="margin: 0;">上传文件仅限“jpg,gif,png”格式,文件小于10MB。</p>
// </div>
// `
// },
/* 个人陈述 */
{
type: 'upload-form',
label: '个人陈述',
required: true,
model: 'uploadArrs51',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 51,
project_id: 1007
},
attrs: {
multiple: true
},
html: `
<div>
<p>申请人以第一人称的视角介绍自己的申请动机、专业兴趣、专业经历、成长经历、职业规划、</p>
<p>学习计划、研究兴趣、为什么选择这所学校,为什么选择这个项目等。请用英文完成,1000</p>
<p>字以内。请将个人陈述填写完存为"pdf"格式上传,文件小于10MB。</p>
</div>
`
},
/* 成绩单 */
{
type: 'upload-form',
label: '中文成绩单',
required: true,
model: 'uploadArrs40',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 40,
project_id: 1007
},
attrs: {
multiple: true
},
html: `
<div style="color: #72818c; font-size: 14px;">
<p style="margin: 0;">请将中英文成绩单原件扫描或者拍照后提交。如果成绩单是多个文件,请合并为一个PDF上传。文件以英文名命名,例如:Chen Xiaohui Chinese Transcript/Chen Xiaohui EnglishTranscript</p>
<p style="margin: 0;">获取途径:联系大学时就读学校相关部门(档案馆/教务处)获取成绩单。</p>
</div>
`
},
/* 成绩单 */
{
type: 'upload-form',
label: '英文成绩单',
required: true,
model: 'uploadArrs43',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 43,
project_id: 1007
},
attrs: {
multiple: true
},
html: `
<div style="color: #72818c; font-size: 14px;">
<p style="margin: 0;">请将中英文成绩单原件扫描或者拍照后提交。如果成绩单是多个文件,请合并为一个PDF上传。文件以英文名命名,例如:Chen Xiaohui Chinese Transcript/Chen Xiaohui EnglishTranscript</p>
<p style="margin: 0;">获取途径:联系大学时就读学校相关部门(档案馆/教务处)获取成绩单。</p>
</div>
`
}
]
}
}
export default {
id: 'career',
title: '工作经验(可选)',
// showProgress: true,
progress: 0,
get: {
action: '/api/zws/v1/enrollment/careers?project_id=1007',
callback(data) {
return data.map(item => {
const { start_date: startDate, end_date: endDate } = item
if (startDate) {
item.dates = [startDate + '', endDate + '']
}
return item
})
}
},
update: {
action: '/api/zws/v1/enrollment/careers/batch-upload',
data: { project_id: 1007 },
beforeRequest(data) {
const records = data.map(item => {
let [startDate, endDate] = item.dates
item.start_date = startDate
item.end_date = endDate
return [
'start_date',
'end_date',
'company_name_cn',
'industry',
'dept_cn',
'position_cn',
'job_type',
'annual_salary',
'job_desc_cn',
'company_profile'
].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
})
return { records }
}
},
form: {
hint: '请务必如实提供所有工作经历(包括实习)的详细信息,按照时间由近到远的顺序依次填写。',
hasAdd: true,
options: {
labelWidth: '140px',
disabled: false
},
items: [
{
type: 'date-picker-from-to-form',
elemType: 'monthrange',
label: '工作时间',
model: 'dates',
rangeSeparator: '至',
startPlaceholder: '请选择开始时间',
endPlaceholder: '请选择结束时间',
attrs: { 'value-format': 'yyyyMM' },
rules: [{ required: true, message: '请选择教育时间', trigger: 'blur' }]
},
{
type: 'input-form',
label: '工作单位',
model: 'company_name_cn',
placeholder: '请输入工作单位',
rules: [{ required: true, message: '请输入工作单位', trigger: 'blur' }]
},
{
type: 'select-form',
values: [
{ label: '互联网/电子商务', value: 1 },
{ label: '基金/证券/期货/投资', value: 2 },
{ label: '保险', value: 3 },
{ label: '银行', value: 4 },
{ label: '信托/担保/拍卖/典当', value: 5 },
{ label: '计算机软件', value: 6 },
{ label: 'IT服务(系统/数据/维护)', value: 7 },
{ label: '电子技术/半导体/集成电路', value: 8 },
{ label: '计算机硬件', value: 9 },
{ label: '通信/电信/网络设备', value: 10 },
{ label: '通信/电信运营、增值服务', value: 11 },
{ label: '网络游戏', value: 12 },
{ label: '房地产/建筑/建材/工程', value: 13 },
{ label: '家居/室内设计/装饰装潢', value: 14 },
{ label: '物业管理/商业中心', value: 15 },
{ label: '专业服务/咨询(财会/法律/人力资源等)', value: 16 },
{ label: '广告/会展/公关', value: 17 },
{ label: '中介服务', value: 18 },
{ label: '检验/检测/认证', value: 19 },
{ label: '外包服务', value: 20 },
{ label: '快速消费品(食品/饮料/烟酒/日化)', value: 21 },
{ label: '耐用消费品(服饰/纺织/皮革/家具/家电)', value: 22 },
{ label: '贸易/进出口', value: 23 },
{ label: '零售/批发', value: 24 },
{ label: '租赁服务', value: 25 },
{ label: '教育/培训/院校', value: 26 },
{ label: '礼品/玩具/工艺美术/收藏品/奢侈品', value: 27 },
{ label: '汽车/摩托车', value: 28 },
{ label: '大型设备/机电设备/重工业', value: 29 },
{ label: '加工制造(原料加工/模具)', value: 30 },
{ label: '仪器仪表及工业自动化', value: 31 },
{ label: '印刷/包装/造纸', value: 32 },
{ label: '办公用品及设备', value: 33 },
{ label: '医药/生物工程', value: 34 },
{ label: '医疗设备/器械', value: 35 },
{ label: '航空/航天研究与制造', value: 36 },
{ label: '交通/运输,物流/仓储', value: 37 },
{ label: '医疗/护理/美容/保健/卫生服务', value: 38 },
{ label: '酒店/餐饮,旅游/度假,媒体/出版/影视/文化传播', value: 39 },
{ label: '娱乐/体育/休闲', value: 40 },
{ label: '能源/矿产/采掘/冶炼', value: 41 },
{ label: '石油/石化/化工,电气/电力/水利', value: 42 },
{ label: '环保', value: 43 },
{ label: '政府/公共事业/非盈利机构', value: 44 },
{ label: '学术/科研,农/林/牧/渔跨领域经营', value: 45 },
{ label: '其他', value: 90 }
],
label: '行业类别',
model: 'industry',
rules: [{ required: true, message: '请选择行业类别', trigger: 'change' }]
},
{
type: 'input-form',
label: '工作部门',
model: 'dept_cn',
placeholder: '请输入工作部门',
rules: [{ required: true, message: '请输入工作部门', trigger: 'blur' }]
},
{
type: 'input-form',
label: '工作职位',
model: 'position_cn',
placeholder: '请输入工作职位',
rules: [{ required: true, message: '请输入工作职位', trigger: 'blur' }]
},
{
type: 'select-form',
values: [
{ label: '高层管理(总经理/副总经理以上级)', value: 1 },
{ label: '高级管理(总助/执行主任/执行总监级)', value: 2 },
{ label: '中级管理(总监/部门经理级)', value: 3 },
{ label: '初级经理(主管/一级经理级)', value: 4 },
{ label: '职员', value: 5 },
{ label: '其他', value: 9 }
],
label: '职位类型',
model: 'job_type',
rules: [{ required: true, message: '请选择职位类型', trigger: 'change' }]
},
{
type: 'input-form',
label: '工作年薪(万元)',
model: 'annual_salary',
placeholder: '请输入工作年薪',
rules: [{ required: true, message: '请输入工作年薪', trigger: 'blur' }]
},
{
type: 'input-form',
label: '工作描述',
model: 'job_desc_cn',
attrs: {
type: 'textarea',
placeholder:
'请详细描述您的职责范围,工作任务以及取得的成绩等,填写文字在100个字以上评定等级,少于不计算,内容越详细,等级越高。(字限3000字以内)',
rows: '8',
maxlength: '3000'
},
placeholder: '请输入工作描述',
rules: [{ required: true, message: '请输入工作描述', trigger: 'blur' }]
},
{
type: 'input-form',
label: '公司(单位)简介',
model: 'company_profile',
attrs: {
type: 'textarea',
placeholder: '300字左右,包括所属行业在业内的位置,经营时间,业务规模,发展前景等信息',
rows: '4'
},
placeholder: '请输入公司(单位)简介',
rules: [{ required: true, message: '请输入公司(单位)简介', trigger: 'blur' }]
}
]
}
}
export default {
id: 'declare',
title: '本人郑重声明',
get: {
action: '/api/zws/v1/enrollment/submissions?project_id=1007',
callback(data) {
const isSubmited = !!data.submit_status
if (isSubmited) {
return { isAgree: [1] }
}
return { isAgree: [] }
}
},
update: {
action: '/api/zws/v1/enrollment/submissions/submit',
data: { project_id: 1007 }
},
form: {
options: { disabled: false },
hint:
'我提供的所有报名材料信息皆准确和完整。我同意在需要的情况下提交原件以确认我的报名资格。由于报名材料中的虚假、错误信息或重大遗漏导致不录取或取消学籍的后果由我个人承担。 我理解并同意所有报名材料归紫荆教育所有,无论考生录取与否均不退回。我授权紫荆教育使用报名表中的信息查询本人学习和工作记录。',
model: {
isAgree: []
},
items: [
{
type: 'checkbox-group-form',
label: '',
values: [{ label: '我同意', value: 1 }],
model: 'isAgree',
rules: [
{
required: true,
message: '请勾选',
trigger: 'change'
}
]
}
]
}
}
export default {
id: 'education',
title: '教育背景',
showProgress: true,
progress: 0,
get: {
action: '/api/zws/v1/enrollment/educations?project_id=1007',
callback(data) {
return data.map(item => {
const { start_date: startDate, end_date: endDate } = item
if (startDate) {
item.dates = [startDate + '', endDate + '']
}
return item
})
}
},
update: {
action: '/api/zws/v1/enrollment/educations/batch-upload',
data: { project_id: 1007 },
beforeRequest(data) {
const records = data.map(item => {
let [startDate, endDate] = item.dates
item.start_date = startDate
item.end_date = endDate
return [
'start_date',
'end_date',
'school_name_cn',
'school_country',
'school_city',
'major_cn',
'degree',
'school_ranking',
'gpa'
].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
})
return { records }
}
},
form: {
hint: `<div style="color:red;font-size:18px;">请务必如实提供高中以上所有学历学位的详细信息。</div>
<div>按照从最高学历至第一学历的顺序,请您依次填写:博士、硕士、本科,<br>并且填写您获得学位所在学校的国家和城市</div>`,
hasAdd: true,
options: {
labelWidth: '110px',
disabled: false
},
items: [
{
type: 'date-picker-from-to-form',
elemType: 'monthrange',
label: '教育时间',
model: 'dates',
rangeSeparator: '至',
startPlaceholder: '请选择开始时间',
endPlaceholder: '请选择结束时间',
attrs: { 'value-format': 'yyyyMM' },
rules: [{ required: true, message: '请选择教育时间', trigger: 'blur' }]
},
{
type: 'input-form',
label: '学校名称',
model: 'school_name_cn',
rules: [{ required: true, message: '请输入学校名称', trigger: 'blur' }]
},
{
type: 'input-form',
label: '学校所在国家',
model: 'school_country',
rules: [{ required: true, message: '请输入学校所在国家', trigger: 'blur' }]
},
{
type: 'input-form',
label: '学校所在城市',
model: 'school_city',
rules: [{ required: true, message: '请输入学校所在城市', trigger: 'blur' }]
},
{
type: 'input-form',
label: '专业名称',
model: 'major_cn',
rules: [{ required: true, message: '请输入专业名称', trigger: 'blur' }]
},
{
type: 'select-form',
values: [
{ label: '专科', value: 1 },
{ label: '本科', value: 2 },
{ label: '本科/学士', value: 3 },
{ label: '硕士研究生', value: 4 },
{ label: '研究生/硕士', value: 5 },
{ label: '博士研究生', value: 6 },
{ label: '研究生/博士', value: 7 },
{ label: '其他', value: 9 }
],
label: '学历/学位',
model: 'degree',
rules: [{ required: true, message: '请选择学历/学位', trigger: 'change' }]
},
{
type: 'input-form',
label: '院系排名',
model: 'school_ranking',
rules: [{ required: true, message: '请输入院系排名', trigger: 'blur' }]
},
{
type: 'input-form',
label: 'GPA',
model: 'gpa',
rules: [{ required: true, message: '请输入专业名称', trigger: 'blur' }]
}
]
}
}
export default {
id: 'honor',
title: '荣誉奖励(可选)',
// showProgress: true,
progress: 0,
get: {
action: '/api/zws/v1/enrollment/honors?project_id=1007'
},
update: {
action: '/api/zws/v1/enrollment/honors/batch-upload',
data: { project_id: 1007 },
beforeRequest(data) {
const records = data.map(item => {
return ['title', 'summary'].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
})
return { records }
}
},
form: {
hasAdd: true,
options: {
labelWidth: '180px',
disabled: false
},
items: [
{
type: 'input-form',
label: '荣誉/奖励',
model: 'title',
placeholder: '请输入荣誉/奖励名称',
rules: [{ required: true, message: '请输入荣誉/奖励', trigger: 'blur' }]
},
{
type: 'input-form',
label: '证书颁发机构及获得时间',
model: 'summary',
rules: [
{
required: true,
message: '请输入证书颁发机构及获得时间',
trigger: 'blur'
}
]
}
]
}
}
import profile from './profile'
import education from './education'
import career from './career'
import answer from './answer'
import attachment from './attachment'
import training from './training'
import honor from './honor'
import declare from './declare'
import pay from './pay'
export default [
{
id: 'registerform',
title: '填写报名表',
isActive: true,
hasShadow: true,
children: [
profile,
education,
career,
honor,
training,
answer,
attachment,
// {
// id: 'final',
// title: '最终检查'
// },
declare,
pay
]
}
]
export default {
id: 'pay',
title: '缴报名费',
showProgress: false,
progress: 0,
visible: false,
get: {
action: '/api/zws/v1/enrollment/attachments?project_id=1007',
callback(data) {
let _data = {
uploadArrs73: []
}
data.forEach((item, index) => {
_data[`uploadArrs${item.file_type}`] &&
_data[`uploadArrs${item.file_type}`].push({
url: item.file,
id: item.id,
sso_file_name: item.sso_file_name
})
})
return _data
}
},
form: {
hint: `<p>缴费提示信息:</p>
<p>报名申请费用:人民币800元</p>
<p>缴费项目:中国未来金融领袖计划报名申请费</p>
<p>请使用微信或支付宝扫描二维码并在规定的时间内完成缴费,缴费完成后请保留缴费凭证相关信息并上传至申请系统。</p>`,
hasButton: false,
options: { disabled: false },
items: [
/* 一寸彩色近照 */
{
type: 'upload-form',
label: '缴费凭证',
required: true,
model: 'uploadArrs73',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: { file_type: 73, project_id: 1007 },
attrs: { multiple: false, limit: 1 },
html: `<div class="qrcode">
<img src="https://zws-imgs-pub.ezijing.com/static/build/learn-mba/wxpay.png" />
<img src="https://zws-imgs-pub.ezijing.com/static/build/learn-mba/alipay.png" />
</div>`
}
]
}
}
export default {
id: 'profile',
title: '个人信息',
showProgress: true,
progress: 0,
get: {
action: '/api/zws/v1/enrollment/profiles?project_id=1007',
callback(data) {
if (data) {
data.city = `${data.address_province + ''}-${data.address_city + ''}`
}
return data || {}
}
},
update: {
action: '/api/zws/v1/enrollment/profiles',
data: { project_id: 1007 },
beforeRequest(data) {
let [province, city] = data.city.split('-')
data.address_province = province
data.address_city = city
return [
'real_name_cn',
'real_name_en',
'id_type',
'id_number',
'birthday',
'gender',
'nationality',
'address_province',
'address_city',
'work_years',
'phone_number',
'email',
'qq_account',
'we_chat_account',
'mailing_address',
'emergency_contact_name',
'emergency_contacts_phone',
'english_level',
'english_score',
'channel'
].reduce((result, key) => {
result[key] = data[key]
return result
}, {})
}
},
form: {
options: {
labelWidth: '150px',
disabled: false
},
items: [
{
type: 'input-form',
label: '姓名',
model: 'real_name_cn',
placeholder: '请输入姓名',
rules: [{ required: true, message: '请输入姓名', trigger: 'blur' }]
},
{
type: 'input-form',
label: '英文名(姓名全拼)',
model: 'real_name_en',
placeholder: '请输入英文名',
rules: [{ required: true, message: '请输入英文名', trigger: 'blur' }]
},
{
type: 'select-form',
values: [
{ label: '居民身份证', value: 0 },
{ label: '港澳台身份证', value: 1 },
{ label: '护照号', value: 2 },
{ label: '军官证', value: 3 },
{ label: '其他', value: 9 }
],
label: '证件类型',
model: 'id_type',
placeholder: '请选择证件类型',
rules: [{ required: true, message: '请选择证件类型', trigger: 'change' }]
},
{
type: 'input-form',
label: '证件号码',
model: 'id_number',
placeholder: '请输入证件号码',
rules: [{ required: true, message: '请输入证件号码', trigger: 'blur' }]
},
{
type: 'date-picker-form',
elemType: 'date',
label: '出生日期',
model: 'birthday',
placeholder: '请选择出生日期',
attrs: { 'value-format': 'yyyy-MM-dd' },
rules: [{ required: true, message: '请选择出生日期', trigger: 'blur' }]
},
{
type: 'radio-group-form',
values: [
{ label: '男', value: 1 },
{ label: '女', value: 2 }
],
label: '性别',
model: 'gender',
rules: [{ required: true, message: '请选择性别', trigger: 'change' }]
},
{
type: 'select-form',
values: [
{ label: '中国', value: 1 },
{ label: '其他国家', value: 9 }
],
label: '国籍',
model: 'nationality',
placeholder: '请选择国籍',
rules: [{ required: true, message: '请选择国籍', trigger: 'blur' }]
},
{
type: 'city-select-form',
label: '现居住城市',
model: 'city',
separator: '-',
rules: [{ required: true, message: '请选择居住城市', trigger: 'blur' }]
},
{
type: 'input-form',
label: '工作/实习经验',
model: 'work_years',
placeholder: '5年11个月',
rules: [{ required: true, message: '请输入工作/实习经验', trigger: 'blur' }]
},
{
type: 'input-form',
label: '手机号',
model: 'phone_number',
placeholder: '请输入手机号',
rules: [{ required: true, message: '请输入手机号', trigger: 'blur' }]
},
{
type: 'input-form',
label: '邮箱',
model: 'email',
placeholder: '请输入邮箱',
rules: [{ required: true, message: '请输入邮箱', trigger: 'blur' }],
hint: '(后续报名信息将发送至此邮箱,请认真填写)'
},
{
type: 'input-form',
label: 'QQ号',
model: 'qq_account',
placeholder: '请输入QQ号',
rules: [{ required: true, message: '请输入QQ号', trigger: 'blur' }]
},
{
type: 'input-form',
label: '微信号',
model: 'we_chat_account',
placeholder: '请输入微信号',
rules: [{ required: true, message: '请输入微信号', trigger: 'blur' }]
},
{
type: 'input-form',
label: '邮寄地址',
model: 'mailing_address',
placeholder: '请输入邮寄地址',
rules: [{ required: true, message: '请输入邮寄地址', trigger: 'blur' }]
},
{
type: 'input-form',
label: '紧急联系人',
model: 'emergency_contact_name',
placeholder: '请输入紧急联系人',
rules: [{ required: true, message: '请输入紧急联系人', trigger: 'blur' }]
},
{
type: 'input-form',
label: '紧急联系电话',
model: 'emergency_contacts_phone',
placeholder: '请输入紧急联系电话',
rules: [{ required: true, message: '请输入紧急联系电话', trigger: 'blur' }]
},
{
type: 'select-form',
values: [
{ label: '四级', value: 4 },
{ label: '六级', value: 3 },
{ label: '托福', value: 1 },
{ label: '雅思', value: 2 }
],
label: '英语水平',
model: 'english_level',
rules: [{ required: true, message: '请选择英语水平', trigger: 'change' }]
},
{
type: 'input-form',
label: '托福/雅思成绩',
model: 'english_score',
attrs: { type: 'number' },
rules: [{ required: true, message: '请输入托福/雅思成绩', trigger: 'blur' }]
},
{
type: 'select-form',
values: [
{ label: '紫荆教育官方网站', value: 11 },
{ label: '紫荆教育官方微信公众号', value: 12 },
{ label: '紫荆教育学位项目老学员推荐', value: 13 },
{ label: '紫荆教育Kelley项目系列活动', value: 14 },
{
label: '紫荆教育其他活动公开课、大讲堂、沙龙等',
value: 15
},
{ label: '紫荆教育员工或者老师推荐', value: 16 },
{ label: '公司人力资源推荐', value: 17 },
{
label: '报纸杂志网站广告微博微信公众号论坛等第三方媒体、社交平台',
value: 18
},
{
label: '网络搜索,如百度、必应、谷歌等',
value: 19
},
{ label: '其他', value: 9 }
],
label: '了解途径',
model: 'channel',
defaultValue: 0,
rules: [{ required: true, message: '请选择了解途径', trigger: 'change' }]
}
]
}
}
export default {
id: 'training',
title: '所受培训(可选)',
// showProgress: true,
progress: 0,
get: {
action: '/api/zws/v1/enrollment/trainings?project_id=1007',
callback(data) {
return data.map(item => {
const { start_date: startDate, end_date: endDate } = item
if (startDate) {
item.dates = [startDate + '', endDate + '']
}
return item
})
}
},
update: {
action: '/api/zws/v1/enrollment/trainings/batch-upload',
data: { project_id: 1007 },
beforeRequest(data) {
const records = data.map(item => {
let [startDate, endDate] = item.dates
item.start_date = startDate
item.end_date = endDate
return ['start_date', 'end_date', 'institute_cn', 'course_cn'].reduce(
(result, key) => {
result[key] = item[key]
return result
},
{}
)
})
return { records }
}
},
form: {
hasAdd: true,
options: {
labelWidth: '80px',
disabled: false
},
items: [
{
type: 'date-picker-from-to-form',
elemType: 'monthrange',
label: '培训时间',
model: 'dates',
rangeSeparator: '至',
startPlaceholder: '请选择开始时间',
endPlaceholder: '请选择结束时间',
attrs: { 'value-format': 'yyyyMM' },
rules: [{ required: true, message: '请选择培训时间', trigger: 'blur' }]
},
{
type: 'input-form',
label: '培训机构',
model: 'institute_cn',
rules: [{ required: true, message: '请输入培训机构', trigger: 'blur' }]
},
{
type: 'input-form',
label: '课程名称',
model: 'course_cn',
rules: [
{
required: true,
message: '请输入课程名称',
trigger: 'blur'
}
]
}
]
}
}
<template>
<div>
<Project-title></Project-title>
<div class="content-box">
<!-- 内容写在这里面 -->
<div class="content">
<vue-form
asideWidth="220px"
:menus="menus"
:default-active="currentActive"
@page-change="handleChange"
@success="handleSuccess"
@error="handleError"
>
<template v-if="currentActive === 'center'">
<local></local>
</template>
<template v-if="currentActive === 'download'">
<div class="download-list">
<a
href="https://zws-imgs-pub.ezijing.com/static/public/b90c0804f40c3106a33303f7548873f0.pdf"
target="_blank"
>项目介绍.pdf</a
>
</div>
</template>
</vue-form>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios'
import cAction from '@action'
import ProjectTitle from '@/components/ProjectTitle.vue'
// 报名中心
import local from './loca.vue'
const menus = [
{
id: 'center',
title: '报名中心',
isActive: true
},
{
id: 'examTest',
title: '考试测评',
visible: false,
href: ''
},
{
id: 'entry',
title: '办理入学',
isGroup: true,
children: [
{
title: '必填项',
children: [
{
id: 'entry_protocol',
title: '入学协议',
showProgress: true,
progress: 0,
get: {
action: '/api/zws/v1/enrollment/attachments?project_id=1007',
callback(data) {
let _data = {
uploadArrs70: []
}
data.forEach((item, index) => {
_data['uploadArrs' + item.file_type] &&
_data['uploadArrs' + item.file_type].push({
url: item.file,
id: item.id,
sso_file_name: item.sso_file_name
})
})
return _data
}
},
form: {
hasButton: false,
options: { disabled: false },
hint: `<p style="margin-top:30px;">入学协议 <a href="https://zws-imgs-pub.ezijing.com/static/public/41b2a4ae91c6826dc5f9daa3ebf345eb.docx" target="_blank" download="入学协议">[下载入学协议]</a></p>`,
items: [
{
type: 'upload-form',
label: '',
required: true,
model: 'uploadArrs70',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 70,
project_id: 1007
},
attrs: {
multiple: false,
limit: 1
},
html: `
<div>
<p>申请者可将签字后的入学协议原件扫描或拍照后提交。</p>
<p>学员应仔细阅读《入学协议》以及课程介绍,如对入学协议或课程有异议,请第一时间与课程顾问咨询确认。</p>
<p>请用A4纸打印后,再入学协议上签上姓名和日期,内容需显示完整、格式整齐、字迹清晰可辩。 上传文件仅限“jpg、jpeg、pdf、png”格式,文件小于10Mb。</p>
</div>`
}
]
}
},
{
id: 'entry_payment',
title: '缴费凭证',
showProgress: true,
progress: 0,
get: {
action: '/api/zws/v1/enrollment/attachments?project_id=1007',
callback(data) {
let _data = {
uploadArrs71: []
}
data.forEach((item, index) => {
_data['uploadArrs' + item.file_type] &&
_data['uploadArrs' + item.file_type].push({
url: item.file,
id: item.id,
sso_file_name: item.sso_file_name
})
})
return _data
}
},
form: {
hasButton: false,
options: { disabled: false },
items: [
{
type: 'upload-form',
label: '',
required: true,
model: 'uploadArrs71',
action: '/api/zws/v1/enrollment/attachments',
deleteAction: '/api/zws/v1/enrollment/attachments',
data: {
file_type: 71,
project_id: 1007
},
attrs: {
multiple: false,
limit: 1
},
html: `
<div>
<p>申请者可将转账/支付缴费凭证截图或拍照后提交。</p>
<p>上传多个文件,请打印出来检查无误后再上传。用A4纸打印后内容需显示完整、格式整齐、字迹清晰可辨。</p>
<p>上传文件仅限“jpg,jpeg,pdf,png”格式,文件小于10Mb。</p>
</div>`
}
]
}
}
]
}
]
},
{
id: 'user',
title: '个人信息',
children: [
{
id: 'user_info',
title: '个人信息修改',
get: {
action: '/api/passport/account/get-user-info',
method: 'get',
callback({ data }) {
data.city_select_str = data.county ? `${data.province}-${data.city}-${data.county}` : ''
data.gender = data.gender || 1
data.birthday = data.birthday || ''
return data
}
},
update: {
action: '/api/usercenter/user/update-user',
data: { service: 'sofia.ezijing.com' },
beforeRequest(data) {
let [province, city, county] = data.city_select_str.split('-')
data.province = province
data.city = city
data.county = county
return ['nickname', 'birthday', 'gender', 'province', 'city', 'county'].reduce((result, key) => {
result[key] = data[key]
return result
}, {})
}
},
form: {
options: {
labelWidth: '100px'
},
items: [
{
type: 'input-form',
label: '昵称',
model: 'nickname',
modelWidth: '300px',
placeholder: '4-30个字符,支持中英文、数字、“_”',
rules: [{ required: true, message: '请输入昵称', trigger: 'blur' }]
},
{
type: 'radio-group-form',
label: '性别',
model: 'gender',
modelWidth: '300px',
values: [
{ label: '男', value: 1 },
{ label: '女', value: 2 }
],
rules: [{ required: true, message: '请选择性别', trigger: 'change' }]
},
{
type: 'date-picker-form',
elemType: 'date',
label: '出生日期',
model: 'birthday',
modelWidth: '300px',
placeholder: '请选择出生日期',
attrs: { 'value-format': 'yyyy-MM-dd' },
rules: [
{
required: true,
message: '请选择出生日期',
trigger: ['blur', 'change']
}
]
},
{
type: 'city-select-form',
label: '现居住城市',
modelWidth: '100px',
separator: '-',
model: 'city_select_str',
placeholder0: '请选择省份',
placeholder1: '请选择城市',
rules: [{ required: true, message: '请选择居住城市', trigger: 'blur' }],
maxLength: 3
}
]
}
},
{
id: 'user_password',
title: '密码修改',
get: {
action: '/api/passport/account/get-user-info',
method: 'get',
callback({ data }) {
return data
}
},
update: {
action: '/api/usercenter/user/change-pwd-by-cookie',
data: { service: 'sofia.ezijing.com' },
beforeRequest(data) {
return ['old_password', 'password', 'passwordR'].reduce((result, key) => {
result[key] = data[key]
return result
}, {})
}
},
form: {
options: {
labelWidth: '100px'
},
items: [
{
type: 'input-form',
label: '用户名',
model: 'nickname',
modelWidth: '300px',
disabled: true
},
{
type: 'input-form',
label: '当前密码',
model: 'old_password',
modelWidth: '300px',
attrs: { type: 'password' },
rules: [
{
required: true,
message: '请输入当前密码',
trigger: 'blur'
}
]
},
{
type: 'input-form',
label: '新密码',
model: 'password',
modelWidth: '300px',
placeholder: '6-20个字符,只能包含字母、数字及标点符号',
attrs: { type: 'password' },
rules: [
{
required: true,
message: '请输入新密码',
trigger: 'blur'
}
]
},
{
type: 'input-form',
label: '确认密码',
model: 'passwordR',
modelWidth: '300px',
attrs: { type: 'password' },
rules: [
{
required: true,
message: '请输入确认密码',
trigger: 'blur'
}
]
}
]
}
}
]
}
// {
// id: 'download',
// title: '相关下载',
// },
]
export default {
components: {
ProjectTitle,
local
},
data() {
return {
currentActive: 'center',
menus: menus
}
},
watch: {
$route: {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'center'
}
}
},
methods: {
handleChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } })
console.log('页面切换了', value)
},
handleSuccess(data) {
console.log('提交成功了', data)
if (!data.code) {
this.$message({ type: 'success', message: '保存成功' })
} else {
this.$message({ type: 'error', message: data.msg })
}
this.getProgress()
},
handleError(error) {
console.log(error)
this.$message({ type: 'error', message: error.message })
},
getProgress() {
cAction.reportAction.getStatus({ project_id: 1007 }).then(response => {
const { submit_progress: submitProgress, submit_status: submitStatus } = response
this.showExamText(response)
const uploadProgressList = submitProgress.attachment_upload_progress_list[30].required.list
const children = this.menus[2].children[0].children
children.forEach(item => {
// if (item.form && item.form.options) {
// item.form.options.disabled = submitStatus === 7
// }
const found = uploadProgressList.find(upload => upload.type_title === item.title)
if (found) {
item.progress = found.upload_progress
}
})
})
},
// 考试测评
showExamText(data) {
if (data.submit_status === 3) {
this.menus[1].visible = true
cAction.reportAction
.getexamTestUrl()
.then(data => {
this.menus[1].href = data.address
})
.catch(e => {
this.$message.error(e.message)
})
}
}
},
beforeMount() {
this.getProgress()
}
}
</script>
<style>
.content-box {
font-family: 'PingFangSC-Regular', 'PingFang SC', 'Microsoft Yahei';
}
</style>
<style lang="scss" scoped>
.content-box {
width: 100%;
background-color: #fff;
position: relative;
}
.content {
width: 100%;
max-width: 1200px;
margin: 0 auto;
position: relative;
top: -20px;
padding: 40px;
background-color: #fff;
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.1);
box-sizing: border-box;
}
.download-list {
padding-top: 20px;
padding-bottom: 30px;
a {
font-size: 18px;
color: #3a8fff;
border-bottom: 2px solid #3a8fff;
}
}
::v-deep .ezj-aside {
width: 220px !important;
}
</style>
<template>
<div>
<div class="project">
<div class="project-list" v-for="(item, value) in project" :key="value">
<div class="list-name">{{ item.name }}</div>
<div class="list-full">
<div class="list-full-hint">内容完整度</div>
<el-progress :percentage="percentage" :stroke-width="10" :show-text="false"></el-progress>
</div>
<div class="list-status">
报名表状态:<span>{{ submiteText }}</span>
</div>
<div class="list-fillout">
<router-link to="/signup/form">填写报名表</router-link>
</div>
</div>
<p class="hint">
尊敬的考生:
<br />请您按要求逐项填写报名信息、上传报名材料,完成在线报名。资料齐全后,我们将以短信和邮件的方式给予反馈,根据报名先后顺序统一安排面试,名额录完为止。
</p>
</div>
<!-- <div class="project-notice">
<h3 class="project-notice-title">重要通知</h3>
<a
href="https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/static/public/39c8350ccf423794e67efcaa8d269064.pdf"
target="_blank"
>紫荆-索菲亚金融方向工商管理硕士(FMBA)学位项目.pdf</a>
</div> -->
</div>
</template>
<script>
import axios from 'axios'
export default {
data() {
return {
project: [{ name: '中国未来金融领袖计划' }],
percentage: 0,
customColor: '#c41230',
submitStatus: 0,
submitProgress: {}
}
},
computed: {
submiteText() {
return this.submitStatus ? '已提交' : '尚未提交'
}
},
methods: {
// 获取进度
getProgress() {
axios.get('/api/zws/v1/enrollment/submissions?project_id=1007').then(response => {
const { submit_progress: submitProgress, submit_status: submitStatus } = response.data
this.submitProgress = submitProgress
this.submitStatus = submitStatus
const { answer = 0, attachment = 0, education = 0, profile = 0 } = submitProgress
this.percentage = (((answer + attachment + education + profile) * 10) / 8) * 100
})
}
},
beforeMount() {
this.getProgress()
}
}
</script>
<style lang="scss" scoped>
a {
color: #000;
}
.project {
padding-bottom: 40px;
border-bottom: 1px solid #d8dce6;
}
.project-list {
height: 80px;
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.1);
margin-top: 40px;
display: flex;
font-size: 18px;
align-items: center;
justify-content: space-between;
padding: 0 20px;
.list-full {
width: 90px;
display: flex;
flex-direction: column;
> .list-full-hint {
height: 38px;
line-height: 42px;
}
}
.list-status {
> span {
color: #c41230;
}
}
.list-fillout {
width: 138px;
height: 40px;
border: 2px solid #c41230;
vertical-align: middle;
line-height: 40px;
text-align: center;
> a {
color: #c41230;
}
}
}
.hint {
margin-top: 70px;
font-size: 18px;
}
.project-notice {
font-size: 18px;
a {
text-decoration: underline;
}
}
.project-notice-title {
height: 64px;
line-height: 64px;
}
</style>
import Vue from 'vue'
import Router from 'vue-router'
import routes from './routes'
export default () => {
return new Router({
routes,
mode: 'history', // 还有一个 hash 默认
fallback: true, // 浏览器不支持 history时,自动改成 hash方式
scrollBehavior (to, from, savedPosition) { // 每次打开,滚动到 最顶端
return { x: 0, y: 0 }
}
})
}
Vue.use(Router)
export default new Router({
routes,
mode: 'history', // 还有一个 hash 默认
fallback: true // 浏览器不支持 history时,自动改成 hash方式
})
import Layout from '@/components/layout'
export default [
{ path: '*', redirect: '/' },
{ path: '/', component: () => import('@/pages/index.vue') },
{
path: '/signup/index', // 在线报名
component: () => import('@/pages/signup/index.vue'),
meta: { requiredLogin: true }
},
{
path: '/signup/form', // 填写报名表
component: () => import('@/pages/signup/form.vue'),
meta: { requiredLogin: true }
},
{
path: '/project', // 项目介绍
component: () => import('@/pages/project/index.vue')
},
{
path: '/news', // 新闻列表
component: () => import('@/pages/news/index.vue')
},
{
path: '/know', // 招生简章
component: () => import('@/pages/know/index.vue')
},
{
path: '/download', // 资料下载
component: () => import('@/pages/download/index.vue')
},
{
path: '/contact', // 联系我们
component: () => import('@/pages/contact/index.vue')
},
{
path: '/index', // 联系我们
component: () => import('@/pages/_lang/index.vue')
},
{
path: '/preview', // 预览word
component: () => import('@/pages/_lang/preview.vue')
},
{
path: '/recruit', // 招生信息
component: () => import('@/pages/recruitInfo/index.vue')
},
{
path: '/careerDev', // 职业发展
component: () => import('@/pages/careerDev/index.vue')
},
{
path: '/presence', // 师生风采
component: () => import('@/pages/presence/index.vue')
},
{
path: '/alumniWork', // 校友工作
component: () => import('@/pages/alumniWork/index.vue')
},
{
path: '/teaching', // 教学模块
component: () => import('@/pages/teaching/index.vue')
},
{
path: '/videoCenter', // 视频中心
component: () => import('@/pages/videoCenter/index.vue')
},
{
path: '/videoCenter/details', // 视频中心详情
component: () => import('@/pages/videoCenter/details.vue')
path: '/',
component: Layout,
children: [
{ path: '', redirect: '/index' },
{ path: '/index', component: () => import('@/pages/home/index.vue') },
{
path: '/project', // 项目介绍
component: () => import('@/pages/project/index.vue')
},
{
path: '/news', // 新闻列表
component: () => import('@/pages/news/index.vue')
},
{
path: '/know', // 招生简章
component: () => import('@/pages/know/index.vue')
},
{
path: '/download', // 资料下载
component: () => import('@/pages/download/index.vue')
},
{
path: '/contact', // 联系我们
component: () => import('@/pages/contact/index.vue')
},
{
path: '/recruit', // 招生信息
component: () => import('@/pages/recruitInfo/index.vue')
},
{
path: '/careerDev', // 职业发展
component: () => import('@/pages/careerDev/index.vue')
},
{
path: '/presence', // 师生风采
component: () => import('@/pages/presence/index.vue')
},
{
path: '/alumniWork', // 校友工作
component: () => import('@/pages/alumniWork/index.vue')
},
{
path: '/teaching', // 教学模块
component: () => import('@/pages/teaching/index.vue')
},
{
path: '/videoCenter', // 视频中心
component: () => import('@/pages/videoCenter/index.vue')
},
{
path: '/videoCenter/details', // 视频中心详情
component: () => import('@/pages/videoCenter/details.vue')
}
]
},
// 在线报名
{
path: '/login',
redirect: '/login/index',
component: () => import('@/components/login/login.vue'),
path: '/my',
component: Layout,
meta: { requiredLogin: true },
props: { hasFooter: false },
children: [
{
path: 'index',
name: 'normalLogin',
component: () => import('@/components/login/normal/normal.vue'),
props: route => ({ query: route.query, params: route.params })
name: 'apply',
path: '',
component: () => import(/* webpackChunkName: "my-welcome" */ '@/pages/my/welcome/index.vue')
},
{
name: 'account',
path: 'account',
component: () => import(/* webpackChunkName: "my-account" */ '@/pages/my/account/index.vue')
},
{
path: 'application',
component: () => import(/* webpackChunkName: "my-application" */ '@/pages/my/application/index.vue')
},
{
path: 'code',
name: 'codeLogin',
component: () => import('@/components/login/code/code.vue'),
props: route => ({ query: route.query, params: route.params })
path: 'interview',
component: () => import(/* webpackChunkName: "my-interview" */ '@/pages/my/interview/index.vue')
},
{
path: 'forget',
name: 'forgetPwd',
component: () => import('@/components/login/forget/forget.vue'),
props: route => ({ query: route.query, params: route.params })
path: 'admission',
component: () => import(/* webpackChunkName: "my-admission" */ '@/pages/my/admission/index.vue')
}
]
},
// 推荐信
{
path: '/letter',
component: () => import(/* webpackChunkName: "letter" */ '@/pages/letter/index.vue')
},
{
path: '/application-materials/reco-letters/submit/:projectId/:userId/:letterId',
component: () => import(/* webpackChunkName: "letter" */ '@/pages/letter/index.vue')
},
{
path: '/preview',
props: { isManager: true },
component: () => import(/* webpackChunkName: "preview" */ '@/pages/my/application/preview.vue')
},
{
path: '/complete',
component: () => import(/* webpackChunkName: "complete" */ '@/pages/my/application/complete.vue')
}
]
import Vue from 'vue'
import Vuex from 'vuex'
import router from '@/router'
import { logout } from '@/api/my'
Vue.use(Vuex)
export default new Vuex.Store({
state: {},
getters: {},
mutations: {},
actions: {
logout() {
return logout().then(() => {
router.push('/')
})
}
}
})
......@@ -8,7 +8,7 @@ $--border-radius-base: 0 !default;
/* 引入隐藏显示样式 */
@import '~element-ui/lib/theme-chalk/display.css';
/* 引入三方 自定义图标库,方法 vue -> 第三方 自建图标库 中有 */
@import '../../assets/icons/iconfont.css';
@import '@/assets/icons/iconfont.css';
[class^='el-icon-self-'],
[class*='el-icon-self-'] {
font-family: 'selfAllIcon' !important;
......@@ -36,10 +36,27 @@ body {
padding-top: 20px;
}
}
/* 统一字体样式 */
* {
ul,
li,
a {
padding: 0;
margin: 0;
list-style: none;
}
a {
text-decoration: none;
}
body {
font-size: 14px; // 防止html根元素 影响本身DOM元素字体大小继承
font-family: 'Source Han Sans CN', 'PingFang SC', -apple-system, 'Microsoft YaHei', 'Helvetica', 'Arial', Verdana,
'Hiragino Sans GB', 'Wenquanyi Micro Hei', sans-serif;
padding: 0;
margin: 0;
background: #fff;
}
p {
margin: 0;
padding: 0;
}
......@@ -47,6 +64,9 @@ table {
border-collapse: collapse;
border-spacing: 0;
}
img {
vertical-align: middle;
}
/* 独立 特殊修改 */
/* 进度条 原始背景色 加深 */
.el-progress-bar__outer {
......@@ -180,3 +200,6 @@ table {
font-size: 100px;
}
}
a {
color: currentColor;
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论