├── back-end ├── .gitignore ├── views │ ├── error.art │ ├── fail.art │ └── succ.art ├── public │ └── uploads │ │ ├── companyLogo-1tRSq3.jpeg │ │ ├── companyLogo-36oxhA.jpeg │ │ ├── companyLogo-3HWfov.jpeg │ │ ├── companyLogo-4ZnBdM.gif │ │ ├── companyLogo-4vW746.gif │ │ ├── companyLogo-5I1qRW.jpeg │ │ ├── companyLogo-7im4Uv.gif │ │ ├── companyLogo-CsqtKr.jpeg │ │ ├── companyLogo-EcpJBA.jpeg │ │ ├── companyLogo-GayAx7.jpeg │ │ ├── companyLogo-IZf0b0.png │ │ ├── companyLogo-Klct0F.png │ │ ├── companyLogo-P4rwbg.gif │ │ ├── companyLogo-RWTT6T.gif │ │ ├── companyLogo-SGaQkz.gif │ │ ├── companyLogo-Trgpsl.jpeg │ │ ├── companyLogo-ULa3GM.gif │ │ ├── companyLogo-UwAhEW.gif │ │ ├── companyLogo-VhN1OW.png │ │ ├── companyLogo-X09K4d.gif │ │ ├── companyLogo-alBvSn.jpeg │ │ ├── companyLogo-cPasMX.jpeg │ │ ├── companyLogo-fnC0K7.jpeg │ │ ├── companyLogo-gAzckn.gif │ │ ├── companyLogo-kbe0RZ.gif │ │ ├── companyLogo-oALyJO.gif │ │ ├── companyLogo-taFwia.jpeg │ │ ├── companyLogo-upGYjc.jpeg │ │ ├── companyLogo-yJ402t.gif │ │ ├── companyLogo-yuSS0P.gif │ │ ├── companyLogo-z1PEMz.jpeg │ │ └── companyLogo-zWYHkP.jpeg ├── models │ ├── users.js │ └── positions.js ├── routes │ ├── index.js │ ├── users.js │ └── position.js ├── key │ ├── rsa_public_key.pem │ └── rsa_private_key.pem ├── utils │ ├── db.js │ └── tools.js ├── package.json ├── middlewares │ ├── auth.js │ └── upload.js ├── app.js ├── bin │ └── www └── controllers │ ├── users.js │ └── position.js ├── front-end ├── .gitignore ├── .DS_Store ├── src │ ├── .DS_Store │ ├── scripts │ │ ├── app.js │ │ ├── views │ │ │ ├── home.art │ │ │ ├── title.art │ │ │ ├── position.add.art │ │ │ ├── position.update.art │ │ │ ├── position.art │ │ │ ├── layout.art │ │ │ └── nav.art │ │ ├── controllers │ │ │ ├── home.js │ │ │ ├── layout.js │ │ │ ├── users.js │ │ │ └── position.js │ │ ├── models │ │ │ └── http.js │ │ └── router │ │ │ └── index.js │ ├── assets │ │ ├── .DS_Store │ │ ├── libs │ │ │ ├── .DS_Store │ │ │ ├── style.css │ │ │ ├── googleapis.css │ │ │ ├── html5shiv.min.js │ │ │ ├── skin-blue.min.css │ │ │ ├── web-storage-cache.min.js │ │ │ ├── respond.min.js │ │ │ ├── app.min.js │ │ │ ├── sme-router.js │ │ │ ├── jquery.form.min.js │ │ │ └── template-web.js │ │ ├── fonts │ │ │ ├── ionicons.eot │ │ │ ├── ionicons.ttf │ │ │ ├── ionicons.woff │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ └── images │ │ │ └── user2-160x160.jpg │ ├── styles │ │ └── app.scss │ ├── config │ │ ├── gulpfile-build.js │ │ └── gulpfile-dev.js │ └── index.html ├── dev │ ├── assets │ │ ├── fonts │ │ │ ├── ionicons.eot │ │ │ ├── ionicons.ttf │ │ │ ├── ionicons.woff │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ ├── images │ │ │ └── user2-160x160.jpg │ │ └── libs │ │ │ ├── style.css │ │ │ ├── googleapis.css │ │ │ ├── html5shiv.min.js │ │ │ ├── skin-blue.min.css │ │ │ ├── web-storage-cache.min.js │ │ │ ├── respond.min.js │ │ │ ├── app.min.js │ │ │ ├── sme-router.js │ │ │ ├── jquery.form.min.js │ │ │ └── template-web.js │ ├── styles │ │ └── app.css │ └── index.html └── package.json └── .DS_Store /back-end/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /front-end/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /back-end/views/error.art: -------------------------------------------------------------------------------- 1 |
error.
-------------------------------------------------------------------------------- /back-end/views/fail.art: -------------------------------------------------------------------------------- 1 | { 2 | "ret": false, 3 | "data": {{data}} 4 | } -------------------------------------------------------------------------------- /back-end/views/succ.art: -------------------------------------------------------------------------------- 1 | { 2 | "ret": true, 3 | "data": {{data}} 4 | } -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/.DS_Store -------------------------------------------------------------------------------- /front-end/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/.DS_Store -------------------------------------------------------------------------------- /front-end/src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/.DS_Store -------------------------------------------------------------------------------- /front-end/src/scripts/app.js: -------------------------------------------------------------------------------- 1 | import './controllers/layout' 2 | import './controllers/users' 3 | 4 | import './router/' -------------------------------------------------------------------------------- /front-end/src/assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/.DS_Store -------------------------------------------------------------------------------- /front-end/src/scripts/views/home.art: -------------------------------------------------------------------------------- 1 |
2 |   拉勾网管理系统前端:
3 |   gulp + sem-router + art-template + jQuery + admin-lte
4 | 
-------------------------------------------------------------------------------- /front-end/src/assets/libs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/libs/.DS_Store -------------------------------------------------------------------------------- /front-end/dev/assets/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/dev/assets/fonts/ionicons.eot -------------------------------------------------------------------------------- /front-end/dev/assets/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/dev/assets/fonts/ionicons.ttf -------------------------------------------------------------------------------- /front-end/src/assets/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/fonts/ionicons.eot -------------------------------------------------------------------------------- /front-end/src/assets/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/fonts/ionicons.ttf -------------------------------------------------------------------------------- /front-end/dev/assets/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/dev/assets/fonts/ionicons.woff -------------------------------------------------------------------------------- /front-end/src/assets/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/fonts/ionicons.woff -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-1tRSq3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-1tRSq3.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-36oxhA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-36oxhA.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-3HWfov.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-3HWfov.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-4ZnBdM.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-4ZnBdM.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-4vW746.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-4vW746.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-5I1qRW.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-5I1qRW.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-7im4Uv.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-7im4Uv.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-CsqtKr.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-CsqtKr.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-EcpJBA.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-EcpJBA.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-GayAx7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-GayAx7.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-IZf0b0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-IZf0b0.png -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-Klct0F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-Klct0F.png -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-P4rwbg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-P4rwbg.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-RWTT6T.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-RWTT6T.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-SGaQkz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-SGaQkz.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-Trgpsl.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-Trgpsl.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-ULa3GM.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-ULa3GM.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-UwAhEW.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-UwAhEW.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-VhN1OW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-VhN1OW.png -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-X09K4d.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-X09K4d.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-alBvSn.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-alBvSn.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-cPasMX.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-cPasMX.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-fnC0K7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-fnC0K7.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-gAzckn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-gAzckn.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-kbe0RZ.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-kbe0RZ.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-oALyJO.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-oALyJO.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-taFwia.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-taFwia.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-upGYjc.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-upGYjc.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-yJ402t.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-yJ402t.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-yuSS0P.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-yuSS0P.gif -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-z1PEMz.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-z1PEMz.jpeg -------------------------------------------------------------------------------- /back-end/public/uploads/companyLogo-zWYHkP.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/back-end/public/uploads/companyLogo-zWYHkP.jpeg -------------------------------------------------------------------------------- /front-end/dev/assets/images/user2-160x160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/dev/assets/images/user2-160x160.jpg -------------------------------------------------------------------------------- /front-end/src/assets/images/user2-160x160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/images/user2-160x160.jpg -------------------------------------------------------------------------------- /front-end/dev/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/dev/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /front-end/dev/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/dev/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /front-end/dev/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/dev/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /front-end/dev/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/dev/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /front-end/src/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /front-end/src/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /front-end/src/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /front-end/src/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lurongtao/gp-145-lagou-admin/HEAD/front-end/src/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /front-end/src/scripts/controllers/home.js: -------------------------------------------------------------------------------- 1 | import homeView from '../views/home.art' 2 | 3 | export const home = (req, res, next) => { 4 | res.render(homeView()) 5 | } -------------------------------------------------------------------------------- /front-end/dev/assets/libs/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /front-end/src/assets/libs/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /front-end/src/scripts/views/title.art: -------------------------------------------------------------------------------- 1 |

2 | {{title.title}} 3 |

4 | -------------------------------------------------------------------------------- /front-end/src/scripts/controllers/layout.js: -------------------------------------------------------------------------------- 1 | import layoutView from '../views/layout.art' 2 | 3 | class Layout { 4 | constructor() { 5 | this.render() 6 | } 7 | 8 | render() { 9 | let html = layoutView() 10 | $('#root').html(html) 11 | } 12 | } 13 | 14 | export default new Layout() -------------------------------------------------------------------------------- /back-end/models/users.js: -------------------------------------------------------------------------------- 1 | const { Users } = require('../utils/db') 2 | 3 | const save = (data) => { 4 | const users = new Users(data) 5 | return users.save() 6 | } 7 | 8 | const findOne = (conditions) => { 9 | return Users.findOne(conditions) 10 | } 11 | 12 | module.exports = { 13 | save, 14 | findOne 15 | } -------------------------------------------------------------------------------- /front-end/dev/assets/libs/googleapis.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Source Sans Pro'; 3 | font-style: normal; 4 | font-weight: 400; 5 | /*src: url(https://fonts.gstatic.com/s/sourcesanspro/v9/ODelI1aHBYDBqgeIAH2zlN0tugusXa58UbOrParLRF0.eot);*/ 6 | src: url(ODelI1aHBYDBqgeIAH2zlN0tugusXa58UbOrParLRF0.eot); 7 | } 8 | -------------------------------------------------------------------------------- /front-end/src/assets/libs/googleapis.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Source Sans Pro'; 3 | font-style: normal; 4 | font-weight: 400; 5 | /*src: url(https://fonts.gstatic.com/s/sourcesanspro/v9/ODelI1aHBYDBqgeIAH2zlN0tugusXa58UbOrParLRF0.eot);*/ 6 | src: url(ODelI1aHBYDBqgeIAH2zlN0tugusXa58UbOrParLRF0.eot); 7 | } 8 | -------------------------------------------------------------------------------- /back-end/routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET home page. */ 5 | router.get('/', function(req, res, next) { 6 | res.render('index', { title: 'Express' }); 7 | }) 8 | 9 | router.get('/test', (req, res) => { 10 | res.send('ok.') 11 | }) 12 | 13 | module.exports = router -------------------------------------------------------------------------------- /back-end/routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | var router = express.Router() 3 | 4 | const { signup, signin, signout, hasUsername, isSignin } = require('../controllers/users') 5 | 6 | router.post('/signup', hasUsername, signup) 7 | router.post('/signin', signin) 8 | router.get('/isSignin', isSignin) 9 | router.get('/signout', signout) 10 | 11 | module.exports = router 12 | -------------------------------------------------------------------------------- /back-end/key/rsa_public_key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArCg9BY1S9DntQQL14jxn 3 | Vib5Ja8vZ3QLab/kVM5bLrvz2lp2XXxWZM5ngqF/fZqCyRMgO9ooxUP/UM2ii/Sn 4 | s/EQljG92UlYYY0LgVY3LMd9g3QYGV+N/yDUKlppCH4VMF5N8OUnFRVxf8gFmsPJ 5 | E928eLm6tiuiSZHufHJnU2bDE36YiMbEn84mrp9B2QwMrzH9m81nIhO8pA9NR2wc 6 | I3GIsJ27n5eQMUdLe3zDIJrwkr4J37VrIqTLqcofGgPFK8qseNnzUfDy6OhPog/r 7 | E87xTo5iMnjSoB+5H+Ta93OSFNg/r+lB4CXqsGAsu1+BX5wCzRIlsk0fs+rUHxXc 8 | HwIDAQAB 9 | -----END PUBLIC KEY----- 10 | -------------------------------------------------------------------------------- /back-end/routes/position.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | var router = express.Router() 3 | 4 | let position = require('../controllers/position') 5 | let uploadMiddleware = require('../middlewares/upload') 6 | 7 | router.route('/') 8 | .get(position.findAll) 9 | .post(uploadMiddleware, position.save) 10 | .patch(uploadMiddleware, position.update) 11 | .delete(position.remove) 12 | 13 | router.get('/findOne', position.findOne) 14 | 15 | router.post('/search', position.search) 16 | 17 | module.exports = router 18 | -------------------------------------------------------------------------------- /back-end/utils/db.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | mongoose.connect('mongodb://localhost:27017/lagou-admin', { useUnifiedTopology: true, useNewUrlParser: true }) 3 | 4 | const Users = mongoose.model('users', { 5 | username: String, 6 | password: String 7 | }) 8 | 9 | const Positions = mongoose.model('positions', { 10 | companyLogo: String, 11 | positionName: String, 12 | companyName: String, 13 | city: String, 14 | salary: String, 15 | createTime: String 16 | }) 17 | 18 | module.exports = { 19 | Users, 20 | Positions 21 | } -------------------------------------------------------------------------------- /front-end/src/styles/app.scss: -------------------------------------------------------------------------------- 1 | .hidden-xs { 2 | display: inline-block; 3 | height: 100%; 4 | } 5 | 6 | .navbar-nav { 7 | height: 100%; 8 | .user-menu { 9 | height: 50px !important; 10 | a.btn-user { 11 | display: block; 12 | height: 100%; 13 | padding: 0 !important; 14 | display: flex; 15 | justify-content: center; 16 | align-items: center; 17 | span { 18 | display: flex; 19 | justify-content: center; 20 | align-items: center; 21 | padding: 0 5px; 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /front-end/dev/styles/app.css: -------------------------------------------------------------------------------- 1 | .hidden-xs { 2 | display: inline-block; 3 | height: 100%; } 4 | 5 | .navbar-nav { 6 | height: 100%; } 7 | .navbar-nav .user-menu { 8 | height: 50px !important; } 9 | .navbar-nav .user-menu a.btn-user { 10 | display: block; 11 | height: 100%; 12 | padding: 0 !important; 13 | display: flex; 14 | justify-content: center; 15 | align-items: center; } 16 | .navbar-nav .user-menu a.btn-user span { 17 | display: flex; 18 | justify-content: center; 19 | align-items: center; 20 | padding: 0 5px; } 21 | -------------------------------------------------------------------------------- /back-end/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "back-end", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "nodemon ./bin/www" 7 | }, 8 | "dependencies": { 9 | "art-template": "^4.13.2", 10 | "bcrypt": "^3.0.6", 11 | "cookie-parser": "~1.4.4", 12 | "cookie-session": "^1.3.3", 13 | "debug": "~2.6.9", 14 | "express": "~4.16.1", 15 | "express-art-template": "^1.0.1", 16 | "http-errors": "~1.6.3", 17 | "jade": "~1.11.0", 18 | "jsonwebtoken": "^8.5.1", 19 | "mongoose": "^5.7.6", 20 | "morgan": "~1.9.1", 21 | "multer": "^1.4.2", 22 | "randomstring": "^1.1.5" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /front-end/src/scripts/models/http.js: -------------------------------------------------------------------------------- 1 | import store from 'store' 2 | 3 | export default { 4 | get({url, type='GET', data={}}) { 5 | // let token = store.get('token') 6 | return $.ajax({ 7 | url, 8 | type, 9 | data, 10 | // headers: { 11 | // 'X-Access-Token': token 12 | // }, 13 | success: (result, textStatus, jqXHR) => { 14 | // let token = jqXHR.getResponseHeader('x-access-token') 15 | // if (token) { 16 | // store.set('token', token) 17 | // } 18 | return result 19 | } 20 | }) 21 | }, 22 | 23 | update({ 24 | url, 25 | data={}, 26 | type='post' 27 | }) { 28 | return $.ajax({ 29 | url, 30 | data, 31 | type, 32 | success(result) { 33 | return result 34 | } 35 | }) 36 | } 37 | } -------------------------------------------------------------------------------- /back-end/middlewares/auth.js: -------------------------------------------------------------------------------- 1 | const tools = require('../utils/tools') 2 | 3 | const isSignin = async function(req, res, next) { 4 | res.set('Content-Type', 'application/json; charset=utf-8') 5 | 6 | // let token = req.get('X-Access-Token') 7 | let { token, username } = req.cookies 8 | 9 | if (token) { 10 | if (req.path === '/isSignin') { 11 | res.render('succ', { 12 | data: JSON.stringify({ 13 | username 14 | }) 15 | }) 16 | } else { 17 | let decoded = await tools.verifyToken(token) 18 | if (decoded) { 19 | next() 20 | } else { 21 | res.render('fail', { 22 | data: JSON.stringify({ 23 | message: 'token 验证失败.' 24 | }) 25 | }) 26 | } 27 | } 28 | } else { 29 | res.render('fail', { 30 | data: JSON.stringify({ 31 | message: '没有权限.' 32 | }) 33 | }) 34 | } 35 | } 36 | 37 | module.exports = isSignin -------------------------------------------------------------------------------- /back-end/models/positions.js: -------------------------------------------------------------------------------- 1 | const { Positions } = require('../utils/db') 2 | 3 | const save = (data) => { 4 | let position = new Positions(data) 5 | return position.save() 6 | } 7 | 8 | const findAll = async ({start, count}) => { 9 | let list = await Positions.find({}).sort({_id: -1}).limit(~~count).skip(~~start) 10 | let total = await Positions.find({}).count() 11 | return { 12 | list, 13 | total 14 | } 15 | } 16 | 17 | const findOne = async (id) => { 18 | return await Positions.findById(id) 19 | } 20 | 21 | const update = async (data) => { 22 | return await Positions.findByIdAndUpdate(data.id, data) 23 | } 24 | 25 | const remove = async (id) => { 26 | return await Positions.findByIdAndDelete(id) 27 | } 28 | 29 | const search = async (keywords) => { 30 | let reg = new RegExp(keywords, 'gi') 31 | return await Positions.find({}).or([{ companyName: reg }, { positionName: reg }]) 32 | } 33 | 34 | module.exports = { 35 | save, 36 | findAll, 37 | findOne, 38 | update, 39 | remove, 40 | search 41 | } -------------------------------------------------------------------------------- /front-end/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gp-15", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "npx gulp -f src/config/gulpfile-dev.js", 8 | "build": "npx gulp -f src/config/gulpfile-build.js", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "devDependencies": { 15 | "gulp": "^4.0.2", 16 | "gulp-clean-css": "^4.2.0", 17 | "gulp-connect": "^5.7.0", 18 | "gulp-rev": "^9.0.0", 19 | "gulp-rev-collector": "^1.3.1", 20 | "gulp-sass": "^4.0.2", 21 | "http-proxy-middleware": "^0.20.0", 22 | "node-sass": "^4.12.0", 23 | "webpack-stream": "^5.2.1" 24 | }, 25 | "dependencies": { 26 | "art-template": "^4.13.2", 27 | "art-template-loader": "^1.4.3", 28 | "better-scroll": "^1.15.2", 29 | "css-loader": "^3.2.0", 30 | "lodash": "^4.17.15", 31 | "sass-loader": "^8.0.0", 32 | "sme-router": "^0.12.8", 33 | "store": "^2.0.12", 34 | "string-loader": "0.0.1", 35 | "style-loader": "^1.0.0" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /back-end/utils/tools.js: -------------------------------------------------------------------------------- 1 | const bcrypt = require('bcrypt') 2 | const jwt = require('jsonwebtoken') 3 | const fs = require('fs') 4 | const path = require('path') 5 | 6 | const hash = (password) => { 7 | return new Promise((resolve, reject) => { 8 | bcrypt.genSalt(10, function(err, salt) { 9 | bcrypt.hash(password, salt, function(err, hash) { 10 | resolve(hash) 11 | }) 12 | }) 13 | }) 14 | } 15 | 16 | const compare = (password, hash) => { 17 | return new Promise((resolve, reject) => { 18 | bcrypt.compare(password, hash, function(err, res) { 19 | resolve(res) 20 | }) 21 | }) 22 | } 23 | 24 | const generateToken = (username) => { 25 | return new Promise((resolve, reject) => { 26 | let cert = fs.readFileSync(path.resolve(__dirname, '../key/rsa_private_key.pem')) 27 | jwt.sign( 28 | { 29 | username 30 | }, 31 | cert, 32 | { 33 | algorithm: 'RS256' 34 | }, 35 | (err, token) => { 36 | resolve(token) 37 | }) 38 | }) 39 | } 40 | 41 | const verifyToken = (token) => { 42 | return new Promise((resolve, reject) => { 43 | let cert = fs.readFileSync(path.resolve(__dirname, '../key/rsa_public_key.pem')) 44 | jwt.verify(token, cert, (err, decoded) => { 45 | resolve(decoded) 46 | }) 47 | }) 48 | } 49 | 50 | module.exports = { 51 | hash, 52 | compare, 53 | generateToken, 54 | verifyToken 55 | } -------------------------------------------------------------------------------- /back-end/middlewares/upload.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const multer = require('multer') 3 | const randomstring = require('randomstring') 4 | const fs = require('fs') 5 | 6 | // const upload = multer({ 7 | // dest: path.resolve(__dirname, '../public/uploads') 8 | // }) 9 | 10 | var filename = '' 11 | 12 | const mimetypeMap = { 13 | 'image/png': '.png', 14 | 'image/jpg': '.jpg', 15 | 'image/jpeg': '.jpeg', 16 | 'image/gif': '.gif' 17 | } 18 | 19 | const storage = multer.diskStorage({ 20 | destination: (req, file, cb) => { 21 | cb(null, path.resolve(__dirname, '../public/uploads')) 22 | }, 23 | 24 | filename: (req, file, cb) => { 25 | let { fieldname, mimetype } = file 26 | filename = fieldname + '-' + randomstring.generate(6) + mimetypeMap[mimetype] 27 | cb(null, filename) 28 | } 29 | }) 30 | 31 | const upload = multer({ 32 | storage 33 | }).single('companyLogo') 34 | 35 | // module.exports = ((req, res, next) => { 36 | // return upload.single('companyLogo') 37 | // })() 38 | 39 | module.exports = (req, res, next) => { 40 | upload(req, res, (err) => { 41 | if (filename) { 42 | fs.unlink(path.resolve(__dirname, '../public/uploads/' + req.body.tempCompanylogo), (err) => { 43 | if (err) { 44 | console.log(err.message) 45 | } 46 | }) 47 | } 48 | req.filename = filename 49 | 50 | // 将filename置空,不然下一次修改会沿用上一次修改的图片 51 | filename = '' 52 | next() 53 | }) 54 | } -------------------------------------------------------------------------------- /front-end/src/scripts/router/index.js: -------------------------------------------------------------------------------- 1 | import SMERouter from 'sme-router' 2 | 3 | import { home } from '../controllers/home' 4 | import * as position from '../controllers/position' 5 | 6 | import titleView from '../views/title.art' 7 | 8 | const router = new SMERouter('content') 9 | 10 | router.use((req) => { 11 | let url = req.url.slice(1).split('/')[0].split('?')[0].split('_')[0] 12 | 13 | // 高亮处理 14 | $(`.sidebar-menu li[data-url=${url}]`).addClass('active').siblings().removeClass('active') 15 | 16 | // 面包屑 17 | let BreadcrumbMap = { 18 | 'home': { 19 | level1: '管理系统', 20 | level2: '首页' 21 | }, 22 | 'position': { 23 | level1: '管理系统', 24 | level2: '职位管理' 25 | } 26 | } 27 | let TitleMap = { 28 | 'home': { 29 | title: '首页', 30 | subtitle: '欢迎你' 31 | }, 32 | 'position': { 33 | title: '职位管理', 34 | subtitle: '职位管理' 35 | } 36 | } 37 | 38 | let info = { 39 | Breadcrumb: { 40 | level1: BreadcrumbMap[url].level1, 41 | level2: BreadcrumbMap[url].level2 42 | }, 43 | Title: { 44 | title: TitleMap[url].title, 45 | subtitle: TitleMap[url].subtitle 46 | } 47 | } 48 | 49 | let html = titleView({ 50 | title: info.Title, 51 | breadcrumb: info.Breadcrumb 52 | }) 53 | $('.content-header').html(html) 54 | }) 55 | 56 | window.router = router 57 | 58 | router.route('/home', home) 59 | router.route('/position', position.list) 60 | router.route('/position_add', position.add) 61 | router.route('/position_update', position.update) 62 | router.route('/position_list/:page', position.list) 63 | 64 | router.route('*', (req, res, next) => { 65 | res.redirect('/home') 66 | }) 67 | 68 | export default router -------------------------------------------------------------------------------- /back-end/key/rsa_private_key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEArCg9BY1S9DntQQL14jxnVib5Ja8vZ3QLab/kVM5bLrvz2lp2 3 | XXxWZM5ngqF/fZqCyRMgO9ooxUP/UM2ii/Sns/EQljG92UlYYY0LgVY3LMd9g3QY 4 | GV+N/yDUKlppCH4VMF5N8OUnFRVxf8gFmsPJE928eLm6tiuiSZHufHJnU2bDE36Y 5 | iMbEn84mrp9B2QwMrzH9m81nIhO8pA9NR2wcI3GIsJ27n5eQMUdLe3zDIJrwkr4J 6 | 37VrIqTLqcofGgPFK8qseNnzUfDy6OhPog/rE87xTo5iMnjSoB+5H+Ta93OSFNg/ 7 | r+lB4CXqsGAsu1+BX5wCzRIlsk0fs+rUHxXcHwIDAQABAoIBAAm7iJ+curjV4YTQ 8 | Xwg4M/tZ3rHzsnFdzRtgXs8wj1UYCRQqExD764JtbMqkyKlYJ9aoPyVDExT74B44 9 | Ud0pqqVwlmh3TW1QSS/SonjgX+QnLwBUetxMW6G1wGjYjaGORzJh0nQw8EGv4afA 10 | rhhuwxpdab9FeLm9w8H2/w2IBjFfwQm1+T5pYYioGPHvCr0I7vhFssBN6iUrQycU 11 | EocB3SxLff5gD+7+IYU5O0w0LaK248Svxa2H0BEHYtl+BIkp7jMVnWIdv2Vg03ah 12 | zHM9iMsZmCV2IPTXm8vip4gcm3CF+9ojzfv0+ERqvfj9muzIrMVM0VsuHnKKiHNw 13 | +SbAhzkCgYEA5RlWAISTJhjNei3PI8FIqyA4PuTw29GLqncpj2/D+njpMKKt5TuS 14 | 3k2rWekuLS3FJbJRcENy70ei5/tQlPfVRN9rOfrR11lpLFVk4CNTjLQx7qsJBivd 15 | fa2Ybp6C0V1UHZdgsAbizAXL62wtQ465x2ZGstMWhChWOcdOKKVhHC0CgYEAwF8+ 16 | tSXyQiTGG60asdB6n3RCJ+DBtDapWltiJCr1k1FaYBQm0P9XXft230zVMgse3M0/ 17 | US1Tt21SL+cSystvJlWk/pFwRTZbFOYz+DulFL4cD3yZ2iCvmhQCQLW/fG4mD/J4 18 | UAobqEQi+E5il8CtolhMoU1q+FjFAvI/oDtVrPsCgYBsEfaKyf8r8nlDUEatRCkG 19 | aG1/5blkyEVNBWc6fWuCRPUjdyn2v5J5gUP6Zs/cigG81ZArF/Yov68uJVQO4ZXe 20 | JlJLiHDiWBAP1LyAKsnnzrzbLB1WpuyVs4T7cZSeNJtQVi9K+gSUX4uhI2d6veIP 21 | GMTy6DZv4yNBoC3TaKgVhQKBgAWBtHXTBEBIdTNNnToB0cDGvy4NDP5voiFoBEMs 22 | x6LT7VZavVG2PXX/QMPbmy63isafSXS1a3QQuQ2N+8e6UxAx22s+Foykpa7PeCVe 23 | 77bMSllXI8BOtzgd4oKfsT+Kl6RVOIRyBaCncqjQ9ZmKdm3zQR5M7Qb244zWCmQ3 24 | zpgJAoGBAIg/q5M8dODolLaDwqKpwVMNBCwhsiK/++Cmcy/lguN3TfXbc+6O45EM 25 | Ev/WdzkenlhMDRpQ0joHqtjjYrJXQgx5fLo3xS79ZwoUcdpdNAXJVzzCIOKHrDWI 26 | nB9vUOJu6vStkT7JW+pgt0ox3rOW93QPSLV/+XGRqmRdVIzTnMDa 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /back-end/app.js: -------------------------------------------------------------------------------- 1 | var createError = require('http-errors'); 2 | var express = require('express'); 3 | var path = require('path'); 4 | var cookieParser = require('cookie-parser'); 5 | var logger = require('morgan') 6 | var cookieSession = require('cookie-session') 7 | 8 | var indexRouter = require('./routes/index'); 9 | var usersRouter = require('./routes/users'); 10 | var positionRouter = require('./routes/position'); 11 | 12 | const authMiddleware = require('./middlewares/auth') 13 | 14 | var app = express(); 15 | 16 | // view engine setup 17 | app.engine('art', require('express-art-template')); 18 | app.set('view options', { 19 | debug: process.env.NODE_ENV !== 'production', 20 | escape: false 21 | }); 22 | app.set('views', path.join(__dirname, './views')); 23 | app.set('view engine', 'art') 24 | 25 | app.use(logger('dev')); 26 | app.use(express.json()); 27 | app.use(express.urlencoded({ extended: false })); 28 | app.use(cookieParser()); 29 | app.use(express.static(path.join(__dirname, 'public'))); 30 | 31 | app.use(cookieSession({ 32 | name: 'session', 33 | secret: '012345abcde', 34 | maxAge: 24 * 60 * 60 * 1000 // 24 hours 35 | })) 36 | 37 | app.use('/', indexRouter); 38 | app.use('/api/users', usersRouter) 39 | app.use('/api/position', authMiddleware, positionRouter) 40 | 41 | // catch 404 and forward to error handler 42 | app.use(function(req, res, next) { 43 | next(createError(404)); 44 | }); 45 | 46 | // error handler 47 | app.use(function(err, req, res, next) { 48 | // set locals, only providing error in development 49 | res.locals.message = err.message; 50 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 51 | 52 | // render the error page 53 | res.status(err.status || 500); 54 | res.render('error'); 55 | }); 56 | 57 | module.exports = app; 58 | -------------------------------------------------------------------------------- /front-end/src/scripts/views/position.add.art: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |

职位添加

5 |
6 | 7 | 8 |
15 |
16 |
17 | 18 | 19 |
20 |
21 | 22 | 23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 | 35 |
36 |
37 | 38 | 39 | 43 |
44 |
45 | -------------------------------------------------------------------------------- /front-end/src/config/gulpfile-build.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const { src, dest, series, parallel} = require('gulp') 3 | const sass = require('gulp-sass') 4 | const webpack = require('webpack-stream') 5 | const cleanCSS = require('gulp-clean-css') 6 | 7 | const rev = require('gulp-rev') 8 | const revCollector = require('gulp-rev-collector') 9 | 10 | const buildPath = '../../build' 11 | 12 | // copyhtml 13 | function copyhtml() { 14 | return src([`${buildPath}/rev/**/*.json`, '../*.html']) 15 | .pipe(revCollector()) 16 | .pipe(dest(buildPath)) 17 | } 18 | 19 | // copylibs 20 | function copylibs() { 21 | return src('../libs/**/*') 22 | .pipe(dest(`${buildPath}/libs`)) 23 | } 24 | 25 | // copylibs 26 | function copyassets() { 27 | return src('../assets/**/*') 28 | .pipe(dest(`${buildPath}/assets`)) 29 | } 30 | 31 | // 编译sass 32 | function packSCSS() { 33 | return src('../styles/*.scss') 34 | .pipe(sass().on('error', sass.logError)) 35 | .pipe(cleanCSS({compatibility: 'ie8'})) 36 | .pipe(rev()) 37 | .pipe(dest(`${buildPath}/styles`)) 38 | .pipe(rev.manifest()) 39 | .pipe(dest(`${buildPath}/rev/styles`)) 40 | } 41 | 42 | // JS模块化 43 | function packJS() { 44 | return src('../scripts/app.js') 45 | .pipe(webpack({ 46 | mode: 'production', 47 | entry: '../scripts/app.js', 48 | output: { 49 | path: path.resolve(__dirname, buildPath), 50 | filename: 'app.js' 51 | }, 52 | module: { 53 | rules: [ 54 | { 55 | test: /\.html$/, 56 | loader: 'string-loader' 57 | }, 58 | { 59 | test: /\.art$/, 60 | loader: "art-template-loader" 61 | } 62 | ] 63 | } 64 | })) 65 | .pipe(rev()) 66 | .pipe(dest(`${buildPath}/scripts`)) 67 | .pipe(rev.manifest({})) 68 | .pipe(dest(`${buildPath}/rev/scripts`)) 69 | } 70 | 71 | exports.default = series(parallel(copyassets, copylibs, packSCSS, packJS), copyhtml) -------------------------------------------------------------------------------- /back-end/bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('back-end:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /front-end/src/scripts/views/position.update.art: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |

职位修改

5 |
6 | 7 | 8 |
13 |
14 |
15 | 16 |
17 | 18 |
19 |
20 | 21 | 22 |
23 |
24 | 25 | 26 |
27 |
28 | 29 | 30 |
31 |
32 | 33 | 34 |
35 |
36 | 37 | 38 | 42 | 43 | 44 |
45 |
46 | -------------------------------------------------------------------------------- /front-end/src/scripts/controllers/users.js: -------------------------------------------------------------------------------- 1 | import store from 'store' 2 | 3 | import navView from '../views/nav.art' 4 | 5 | import httpModel from '../models/http' 6 | 7 | 8 | class Users { 9 | constructor() { 10 | this.render() 11 | this.type = '' 12 | this.isSignin = false 13 | this.username = '' 14 | } 15 | 16 | async render() { 17 | // 如果调用了一个async 方法,方法里如果有await 18 | // 在调用的时候必须await 19 | await this.auth() 20 | 21 | let that = this 22 | 23 | let html = navView({ 24 | isSignin: this.isSignin, 25 | username: this.username 26 | }) 27 | $('#nav').html(html) 28 | 29 | // 注册登录按钮点击 30 | $('#btn-signin, #btn-signup').on('click', function() { 31 | that.type = $(this).attr('id') 32 | }) 33 | 34 | // 提交 35 | $('#btn-submit').on('click', this.handleSubmit.bind(this)) 36 | 37 | // 注销 38 | $('body').off('click').on('click', '#btn-signout', async () => { 39 | let result = await httpModel.get({ 40 | url: '/api/users/signout' 41 | }) 42 | if (result.ret) { 43 | location.reload() 44 | } 45 | 46 | // store.remove('token') 47 | // location.reload() 48 | }) 49 | } 50 | 51 | async auth() { 52 | let result = await httpModel.get({ 53 | url: '/api/users/isSignin' 54 | }) 55 | 56 | let username = result.data.username 57 | this.isSignin = username ? true : false 58 | this.username = username 59 | } 60 | 61 | async handleSubmit() { 62 | let data = $('.form-horizontal').serialize() 63 | 64 | let result = await httpModel.get({ 65 | // this.type 存储了用户点了“登录”或“注册”按钮 66 | url: '/api/users/' + (this.type === 'btn-signin' ? 'signin' : 'signup'), 67 | data, 68 | type: 'POST' 69 | }) 70 | 71 | this.handleSubmitSucc(result) 72 | } 73 | 74 | handleSubmitSucc(result) { 75 | $('.form-horizontal')[0].reset() 76 | 77 | if (result.ret) { 78 | let html = navView({ 79 | isSignin: true, 80 | username: result.data.username 81 | }) 82 | 83 | if (this.type === 'btn-signin') { 84 | $('#nav').html(html) 85 | } else { 86 | alert(result.data.message) 87 | } 88 | } else { 89 | alert(result.data.message) 90 | } 91 | 92 | } 93 | } 94 | 95 | export default new Users() -------------------------------------------------------------------------------- /front-end/dev/assets/libs/html5shiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); -------------------------------------------------------------------------------- /front-end/src/assets/libs/html5shiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); -------------------------------------------------------------------------------- /front-end/src/config/gulpfile-dev.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const { src, dest, series, parallel, watch } = require('gulp') 3 | const connect = require('gulp-connect') 4 | const sass = require('gulp-sass') 5 | const webpack = require('webpack-stream') 6 | const proxy = require('http-proxy-middleware') 7 | 8 | const devPath = '../../dev' 9 | 10 | // copyhtml 11 | function copyhtml() { 12 | return src('../*.html') 13 | .pipe(dest(devPath)) 14 | .pipe(connect.reload()) 15 | } 16 | 17 | // copylibs 18 | function copylibs() { 19 | return src('../libs/**/*') 20 | .pipe(dest(`${devPath}/libs`)) 21 | } 22 | 23 | // copylibs 24 | function copyassets() { 25 | return src('../assets/**/*') 26 | .pipe(dest(`${devPath}/assets`)) 27 | } 28 | 29 | // 编译sass 30 | function packSCSS() { 31 | return src('../styles/*.scss') 32 | .pipe(sass().on('error', sass.logError)) 33 | .pipe(dest(`${devPath}/styles`)) 34 | .pipe(connect.reload()) 35 | } 36 | 37 | // JS模块化 38 | function packJS() { 39 | return src('../scripts/*.js') 40 | .pipe(webpack({ 41 | mode: 'development', 42 | entry: { 43 | app: '../scripts/app.js' 44 | }, 45 | output: { 46 | path: path.resolve(__dirname, devPath), 47 | filename: '[name].js' 48 | }, 49 | module: { 50 | rules: [ 51 | { 52 | test: /\.html$/, 53 | loader: 'string-loader' 54 | }, 55 | { 56 | test: /\.art$/, 57 | loader: "art-template-loader" 58 | }, 59 | { 60 | test: /\.scss$/, 61 | use: [ 62 | 'style-loader', 63 | 'css-loader', 64 | 'sass-loader', 65 | ], 66 | } 67 | ] 68 | } 69 | })) 70 | .pipe(dest(`${devPath}/scripts`)) 71 | .pipe(connect.reload()) 72 | } 73 | 74 | // 启动server 75 | function gulpServer() { 76 | return connect.server({ 77 | name: 'Dist App', 78 | root: devPath, 79 | port: 8000, 80 | host: '10.9.49.156', 81 | livereload: true, 82 | middleware: () => { 83 | return [ 84 | proxy('/api', { 85 | target: 'http://localhost:3000', 86 | changeOrigin: true 87 | }) 88 | ] 89 | } 90 | }) 91 | } 92 | 93 | // watch 94 | function watchFiles() { 95 | watch('../*.html', series(copyhtml)) 96 | watch('../libs/*', series(copylibs)) 97 | watch('../**/*', series(packJS)) 98 | watch('../**/*.scss', series(packSCSS)) 99 | watch('../assets/*', series(copyassets)) 100 | } 101 | 102 | exports.default = series(parallel(copyhtml, copyassets, copylibs, packSCSS, packJS), parallel(gulpServer, watchFiles)) -------------------------------------------------------------------------------- /back-end/controllers/users.js: -------------------------------------------------------------------------------- 1 | const usersModel = require('../models/users') 2 | const tools = require('../utils/tools') 3 | const authMiddleware = require('../middlewares/auth') 4 | 5 | const signup = async function(req, res, next) { 6 | res.set('Content-Type', 'application/json; charset=utf-8') 7 | 8 | let { username, password } = req.body 9 | 10 | let hash = await tools.hash(password) 11 | 12 | let result = await usersModel.save({ 13 | username, 14 | password: hash 15 | }) 16 | 17 | if (result) { 18 | res.render('succ', { 19 | data: JSON.stringify({ 20 | message: '用户注册成功.' 21 | }) 22 | }) 23 | } else { 24 | res.render('fail', { 25 | data: JSON.stringify({ 26 | message: '用户注册失败.' 27 | }) 28 | }) 29 | } 30 | } 31 | 32 | const hasUsername = async function(req, res, next) { 33 | res.set('Content-Type', 'application/json; charset=utf-8') 34 | let { username } = req.body 35 | let result = await usersModel.findOne({username}) 36 | if (result) { 37 | res.render('fail', { 38 | data: JSON.stringify({ 39 | message: '用户名已经存在.' 40 | }) 41 | }) 42 | } else { 43 | next() 44 | } 45 | } 46 | 47 | const signin = async function(req, res, next) { 48 | res.set('Content-Type', 'application/json; charset=utf-8') 49 | let { username, password } = req.body 50 | 51 | let result = await usersModel.findOne({username}) 52 | 53 | if (result) { 54 | let compareResult = await tools.compare(password, result.password) 55 | if (compareResult) { 56 | let token = await tools.generateToken(username) 57 | 58 | // 往headers 注入一个自定义的字段,将token传给前端 59 | // res.header('X-Access-Token', token) 60 | 61 | // 往浏览器里种cookie 62 | res.cookie('token', token) 63 | res.cookie('username', username) 64 | 65 | res.render('succ', { 66 | data: JSON.stringify({ 67 | type: 'signin', 68 | username, 69 | message: '用户登录成功.' 70 | }) 71 | }) 72 | } else { 73 | res.render('fail', { 74 | data: JSON.stringify({ 75 | message: '用户名或密码不正确.' 76 | }) 77 | }) 78 | } 79 | } else { 80 | res.render('fail', { 81 | data: JSON.stringify({ 82 | message: '用户名或密码不正确.' 83 | }) 84 | }) 85 | } 86 | } 87 | 88 | const isSignin = authMiddleware 89 | 90 | const signout = function(req, res, next) { 91 | // req.session = null 92 | res.cookie('token', '') 93 | res.cookie('username', '') 94 | 95 | res.set('Content-Type', 'application/json; charset=utf-8') 96 | res.render('succ', { 97 | data: JSON.stringify({ 98 | message: '注销成功.' 99 | }) 100 | }) 101 | } 102 | 103 | module.exports = { 104 | signup, 105 | hasUsername, 106 | signin, 107 | isSignin, 108 | signout 109 | } -------------------------------------------------------------------------------- /front-end/src/scripts/views/position.art: -------------------------------------------------------------------------------- 1 |
2 |
3 |

4 | 5 |

6 | 7 |
8 |
9 | 10 | 11 |
12 | 13 |
14 |
15 |
16 |
17 | 18 |
19 | {{if list.length === 0}} 20 | 21 | 22 | 23 | 24 |
暂无数据.
25 | {{else}} 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | {{each list}} 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 50 | 51 | {{/each}} 52 |
#公司logo公司名称职位名称招聘城市发布时间薪资操作
{{$index + 1}}{{$value.companyName}}{{$value.positionName}}{{$value.city}}{{$value.createTime}}{{$value.salary}} 47 | 48 | 49 |
53 | {{/if}} 54 |
55 | 56 | {{if list.length > 0 && from === 'list' }} 57 | 71 | {{/if}} 72 |
73 | -------------------------------------------------------------------------------- /front-end/dev/assets/libs/skin-blue.min.css: -------------------------------------------------------------------------------- 1 | .skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} -------------------------------------------------------------------------------- /front-end/src/assets/libs/skin-blue.min.css: -------------------------------------------------------------------------------- 1 | .skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} -------------------------------------------------------------------------------- /front-end/dev/index.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | AdminLTE 2 | Starter 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 35 | 36 | 56 | 57 |
58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /front-end/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | AdminLTE 2 | Starter 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 35 | 36 | 56 | 57 |
58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /back-end/controllers/position.js: -------------------------------------------------------------------------------- 1 | const positionModel = require('../models/positions') 2 | const moment = require('moment') 3 | const fs = require('fs') 4 | const path = require('path') 5 | 6 | const findAll = async(req, res, next) => { 7 | res.set('Content-Type', 'application/json; charset=utf-8') 8 | 9 | let pageInfo = req.query 10 | 11 | let result = await positionModel.findAll(pageInfo) 12 | 13 | if (result) { 14 | res.render('succ', { 15 | data: JSON.stringify(result) 16 | }) 17 | } else { 18 | res.render('fail', { 19 | data: JSON.stringify({}) 20 | }) 21 | } 22 | } 23 | 24 | const findOne = async (req, res, next) => { 25 | let id = req.query.id 26 | let result = await positionModel.findOne(id) 27 | if (result) { 28 | res.render('succ', { 29 | data: JSON.stringify(result) 30 | }) 31 | } else { 32 | res.render('fail', { 33 | data: JSON.stringify(result) 34 | }) 35 | } 36 | } 37 | 38 | const save = async (req, res, next) => { 39 | res.set('Content-Type', 'application/json; charset=utf-8') 40 | let data = req.body 41 | data.createTime = moment().format('YYYY-MM-DD HH:mm:ss') 42 | data.companyLogo = req.filename 43 | let result = await positionModel.save(data) 44 | if (result) { 45 | res.render('succ', { 46 | data: JSON.stringify({ 47 | message: '数据添加成功.' 48 | }) 49 | }) 50 | } else { 51 | res.render('fail', { 52 | data: JSON.stringify({ 53 | message: '数据添加失败.' 54 | }) 55 | }) 56 | } 57 | } 58 | 59 | const update = async (req, res, next) => { 60 | let data = req.body 61 | if (req.filename === '') { 62 | delete data.companyLogo 63 | } else { 64 | data.companyLogo = req.filename 65 | } 66 | 67 | data.createTime = moment().format('YYYY-MM-DD HH:mm:ss') 68 | let result = await positionModel.update(data) 69 | 70 | if (result) { 71 | res.render('succ', { 72 | data: JSON.stringify({ 73 | message: '数据修改成功.' 74 | }) 75 | }) 76 | } else { 77 | res.render('fail', { 78 | data: JSON.stringify({ 79 | message: '数据修改失败.' 80 | }) 81 | }) 82 | } 83 | } 84 | 85 | const remove = async (req, res, next) => { 86 | let { id, tempCompanylogo } = req.body 87 | let result = positionModel.remove(id) 88 | 89 | if (result) { 90 | fs.unlink(path.resolve(__dirname, '../public/uploads/' + tempCompanylogo), (err) => { 91 | if (err) { 92 | console.log(err.message) 93 | } 94 | }) 95 | 96 | res.render('succ', { 97 | data: JSON.stringify({ 98 | message: '数据删除成功.' 99 | }) 100 | }) 101 | } else { 102 | res.render('fail', { 103 | data: JSON.stringify({ 104 | message: '数据删除失败.' 105 | }) 106 | }) 107 | } 108 | } 109 | 110 | const search = async (req, res, next) => { 111 | let { keywords } = req.body 112 | let result = await positionModel.search(keywords) 113 | 114 | if (result) { 115 | res.render('succ', { 116 | data: JSON.stringify({ 117 | list: result 118 | }) 119 | }) 120 | } else { 121 | res.render('fail', { 122 | data: JSON.stringify({ 123 | list: [] 124 | }) 125 | }) 126 | } 127 | } 128 | 129 | module.exports = { 130 | findAll, 131 | findOne, 132 | save, 133 | update, 134 | remove, 135 | search 136 | } -------------------------------------------------------------------------------- /front-end/dev/assets/libs/web-storage-cache.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | web-storage-cache -- Added `expires` attribute and serialize data with `JSON.parse` for the localStorage and sessionStorage. 3 | Version 1.0.3 4 | https://github.com/WQTeam/web-storage-cache 5 | (c) 2013-2016 WQTeam, MIT license 6 | */ 7 | !function(a,b){"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.WebStorageCache=b()}(this,function(){"use strict";function a(a,b){for(var c in b)a[c]=b[c];return a}function b(a){var b=!1;if(a&&a.setItem){b=!0;var c="__"+Math.round(1e7*Math.random());try{a.setItem(c,c),a.removeItem(c)}catch(d){b=!1}}return b}function c(a){var b=typeof a;return"string"===b&&window[a]instanceof Storage?window[a]:a}function d(a){return"[object Date]"===Object.prototype.toString.call(a)&&!isNaN(a.getTime())}function e(a,b){if(b=b||new Date,"number"==typeof a?a=a===1/0?l:new Date(b.getTime()+1e3*a):"string"==typeof a&&(a=new Date(a)),a&&!d(a))throw new Error("`expires` parameter cannot be converted to a valid Date instance");return a}function f(a){var b=!1;if(a)if(a.code)switch(a.code){case 22:b=!0;break;case 1014:"NS_ERROR_DOM_QUOTA_REACHED"===a.name&&(b=!0)}else-2147024882===a.number&&(b=!0);return b}function g(a,b){this.c=(new Date).getTime(),b=b||m;var c=e(b);this.e=c.getTime(),this.v=a}function h(a){return"object"!=typeof a?!1:a&&"c"in a&&"e"in a&&"v"in a?!0:!1}function i(a){var b=(new Date).getTime();return bd;d++){var e=this.storage.key(d),f=null;try{f=n.deserialize(this.storage.getItem(e))}catch(g){}if(null!==f&&void 0!==f.e){var h=(new Date).getTime();h>=f.e&&b.push(e)}}return b.forEach(function(a){c["delete"](a)}),b},clear:function(){this.storage.clear()},add:function(b,c,d){b=j(b),d=a({force:!0},d);try{var e=n.deserialize(this.storage.getItem(b));if(!h(e)||!i(e))return this.set(b,c,d),!0}catch(f){return this.set(b,c,d),!0}return!1},replace:function(a,b,c){a=j(a);var d=null;try{d=n.deserialize(this.storage.getItem(a))}catch(e){return!1}if(h(d)){if(i(d))return this.set(a,b,c),!0;this["delete"](a)}return!1},touch:function(a,b){a=j(a);var c=null;try{c=n.deserialize(this.storage.getItem(a))}catch(d){return!1}if(h(c)){if(i(c))return this.set(a,this.get(a),{exp:b}),!0;this["delete"](a)}return!1}};return k.prototype=p,k}); -------------------------------------------------------------------------------- /front-end/src/assets/libs/web-storage-cache.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | web-storage-cache -- Added `expires` attribute and serialize data with `JSON.parse` for the localStorage and sessionStorage. 3 | Version 1.0.3 4 | https://github.com/WQTeam/web-storage-cache 5 | (c) 2013-2016 WQTeam, MIT license 6 | */ 7 | !function(a,b){"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.WebStorageCache=b()}(this,function(){"use strict";function a(a,b){for(var c in b)a[c]=b[c];return a}function b(a){var b=!1;if(a&&a.setItem){b=!0;var c="__"+Math.round(1e7*Math.random());try{a.setItem(c,c),a.removeItem(c)}catch(d){b=!1}}return b}function c(a){var b=typeof a;return"string"===b&&window[a]instanceof Storage?window[a]:a}function d(a){return"[object Date]"===Object.prototype.toString.call(a)&&!isNaN(a.getTime())}function e(a,b){if(b=b||new Date,"number"==typeof a?a=a===1/0?l:new Date(b.getTime()+1e3*a):"string"==typeof a&&(a=new Date(a)),a&&!d(a))throw new Error("`expires` parameter cannot be converted to a valid Date instance");return a}function f(a){var b=!1;if(a)if(a.code)switch(a.code){case 22:b=!0;break;case 1014:"NS_ERROR_DOM_QUOTA_REACHED"===a.name&&(b=!0)}else-2147024882===a.number&&(b=!0);return b}function g(a,b){this.c=(new Date).getTime(),b=b||m;var c=e(b);this.e=c.getTime(),this.v=a}function h(a){return"object"!=typeof a?!1:a&&"c"in a&&"e"in a&&"v"in a?!0:!1}function i(a){var b=(new Date).getTime();return bd;d++){var e=this.storage.key(d),f=null;try{f=n.deserialize(this.storage.getItem(e))}catch(g){}if(null!==f&&void 0!==f.e){var h=(new Date).getTime();h>=f.e&&b.push(e)}}return b.forEach(function(a){c["delete"](a)}),b},clear:function(){this.storage.clear()},add:function(b,c,d){b=j(b),d=a({force:!0},d);try{var e=n.deserialize(this.storage.getItem(b));if(!h(e)||!i(e))return this.set(b,c,d),!0}catch(f){return this.set(b,c,d),!0}return!1},replace:function(a,b,c){a=j(a);var d=null;try{d=n.deserialize(this.storage.getItem(a))}catch(e){return!1}if(h(d)){if(i(d))return this.set(a,b,c),!0;this["delete"](a)}return!1},touch:function(a,b){a=j(a);var c=null;try{c=n.deserialize(this.storage.getItem(a))}catch(d){return!1}if(h(c)){if(i(c))return this.set(a,this.get(a),{exp:b}),!0;this["delete"](a)}return!1}};return k.prototype=p,k}); -------------------------------------------------------------------------------- /front-end/dev/assets/libs/respond.min.js: -------------------------------------------------------------------------------- 1 | /*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl 2 | * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT 3 | * */ 4 | 5 | !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b #mq-test-1 { width: 42px; }',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b { 11 | res.go('/position_add') 12 | }) 13 | } 14 | 15 | function _handleUpdateClick(res, obj) { 16 | let id = $(obj).attr('data-id') 17 | res.go('/position_update', {id}) 18 | } 19 | 20 | function _handlePageNumberClick(req, res, obj, type, pageCount) { 21 | // list(req, res, next, ~~$(obj).text()) 22 | if (type) { 23 | let page = ~~req.params.page 24 | 25 | if (type === 'prev' && page > 1) { 26 | res.go('/position_list/' + (page - 1)) 27 | } else if (type === 'next' && page < pageCount.length) { 28 | res.go('/position_list/' + (page + 1)) 29 | } 30 | 31 | } else { 32 | res.go('/position_list/' + ~~$(obj).text()) 33 | } 34 | } 35 | 36 | async function _handleDeleteClick(req, res, obj) { 37 | let id = $(obj).attr('data-id') 38 | let tempCompanylogo = $(obj).attr('data-img') 39 | let result = await http.update({ 40 | url: '/api/position', 41 | type: 'delete', 42 | data: { id, tempCompanylogo } 43 | }) 44 | 45 | if (result.ret) { 46 | res.go('/position_list/' + (req.params.page || 1) + '?r=' + (new Date().getTime())) 47 | } 48 | } 49 | 50 | async function _handleSearch(res, keywords) { 51 | if (keywords === '') { 52 | res.go('/position_list/1' + '?r=' + new Date().getTime()) 53 | return 54 | } 55 | 56 | let result = await http.update({ 57 | url: '/api/position/search', 58 | data: { 59 | keywords 60 | } 61 | }) 62 | 63 | if (result.ret) { 64 | res.render(positionView({ 65 | list: result.data.list, 66 | from: 'search' 67 | })) 68 | } 69 | } 70 | 71 | export const list = async (req, res, next) => { 72 | let currentPage = ~~req.params.page || 1 73 | let result = await http.get({ 74 | url: '/api/position', 75 | data: { 76 | start: (currentPage - 1) * count, 77 | count 78 | } 79 | }) 80 | 81 | if (result.data.list.length === 0 && currentPage > 1) { 82 | res.go('/position_list/' + (currentPage - 1)) 83 | return 84 | } 85 | 86 | let pageCount = _.range(1, Math.ceil(result.data.total/count) + 1) 87 | 88 | if (result.ret) { 89 | let { list } = result.data 90 | res.render(positionView({ 91 | list, 92 | pageCount, 93 | currentPage, 94 | from: 'list' 95 | })) 96 | 97 | _handleAddClick(res) 98 | } else { 99 | res.go('/home') 100 | } 101 | 102 | $('.btn-update').on('click', function() { 103 | _handleUpdateClick(res, this) 104 | }) 105 | 106 | $('.btn-delete').on('click', function() { 107 | _handleDeleteClick(req, res, this) 108 | }) 109 | 110 | $('body').on('keyup', '#search', (e) => { 111 | if (e.keyCode === 13) { 112 | _handleSearch(res, e.target.value) 113 | } 114 | }) 115 | 116 | $('#box-footer a.page-number').on('click', function() { 117 | _handlePageNumberClick(req, res, this) 118 | }) 119 | 120 | $('#box-footer a.page-prev').on('click', function() { 121 | _handlePageNumberClick(req, res, this, 'prev') 122 | }) 123 | 124 | $('#box-footer a.page-next').on('click', function() { 125 | _handlePageNumberClick(req, res, this, 'next', pageCount) 126 | }) 127 | } 128 | 129 | export const add = async (req, res, next) => { 130 | res.render(positionAddView()) 131 | 132 | // $('#posadd-submit').on('click', async() => { 133 | // let $form = $('#position-form') 134 | // let data = $form.serialize() 135 | // let result = await http.update({ 136 | // url: '/api/position', 137 | // data 138 | // }) 139 | // if (result.ret) { 140 | // $form[0].reset() 141 | // } else { 142 | // alert(result.data.message) 143 | // } 144 | // }) 145 | 146 | // $('#posadd-submit').on('click', () => { 147 | // console.log(0) 148 | $('#position-form').ajaxForm({ 149 | resetForm: true 150 | }) 151 | // }) 152 | 153 | $('#posadd-back').on('click', () => { 154 | res.go('/position') 155 | }) 156 | } 157 | 158 | export const update = async (req, res, next) => { 159 | let id = req.body.id 160 | 161 | let result = await http.get({ 162 | url: '/api/position/findOne', 163 | data: { 164 | id 165 | } 166 | }) 167 | res.render(positionUpdateView({ 168 | item: result.data 169 | })) 170 | 171 | // $('#posedit-submit').on('click', async() => { 172 | // let $form = $('#position-form') 173 | // let data = $form.serialize() 174 | // let result = await http.update({ 175 | // url: '/api/position', 176 | // data: data + '&id=' + id, 177 | // type: 'patch' 178 | // }) 179 | // if (result.ret) { 180 | // res.go('/position') 181 | // } else { 182 | // alert(result.data.message) 183 | // } 184 | // }) 185 | 186 | $('#position-form').ajaxForm({ 187 | resetForm: true, 188 | dataType: 'json', 189 | url: '/api/position', 190 | method: 'patch', 191 | success: (result) => { 192 | if (result.ret) { 193 | res.back() 194 | } else { 195 | alert(result.data.message) 196 | } 197 | } 198 | }) 199 | 200 | $('#posedit-back').on('click', () => { 201 | res.back() 202 | }) 203 | } -------------------------------------------------------------------------------- /front-end/src/scripts/views/layout.art: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 11 | 12 | 13 | 14 |
15 | 16 | 67 | 68 | 69 |
70 | 71 |
72 |
73 | 74 | 75 |
76 | 77 | 78 | 79 |
80 | 81 |
82 | 83 | 84 | 85 |
86 | 87 | 90 | 91 | Copyright © 2016 Company. All rights reserved. 92 |
93 | 94 | 95 | 166 | 167 | 169 |
-------------------------------------------------------------------------------- /front-end/src/scripts/views/nav.art: -------------------------------------------------------------------------------- 1 | 2 | 3 | 切换导航 4 | 5 | 6 | -------------------------------------------------------------------------------- /front-end/dev/assets/libs/app.min.js: -------------------------------------------------------------------------------- 1 | /*! AdminLTE app.js 2 | * ================ 3 | * Main JS application file for AdminLTE v2. This file 4 | * should be included in all pages. It controls some layout 5 | * options and implements exclusive AdminLTE plugins. 6 | * 7 | * @Author Almsaeed Studio 8 | * @Support 9 | * @Email 10 | * @version 2.3.7 11 | * @license MIT 12 | */ 13 | function _init(){"use strict";$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){var a=$(".main-header").outerHeight()+$(".main-footer").outerHeight(),b=$(window).height(),c=$(".sidebar").height();if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",b-$(".main-footer").outerHeight());else{var d;b>=c?($(".content-wrapper, .right-side").css("min-height",b-a),d=b-a):($(".content-wrapper, .right-side").css("min-height",c),d=c);var e=$($.AdminLTE.options.controlSidebarOptions.selector);"undefined"!=typeof e&&e.height()>d&&$(".content-wrapper, .right-side").css("min-height",e.height())}},fixSidebar:function(){return $("body").hasClass("fixed")?("undefined"==typeof $.fn.slimScroll&&window.console&&window.console.error("Error: the fixed layout requires the slimscroll plugin!"),void($.AdminLTE.options.sidebarSlimScroll&&"undefined"!=typeof $.fn.slimScroll&&($(".sidebar").slimScroll({destroy:!0}).height("auto"),$(".sidebar").slimscroll({height:$(window).height()-$(".main-header").height()+"px",color:"rgba(0,0,0,0.2)",size:"3px"})))):void("undefined"!=typeof $.fn.slimScroll&&$(".sidebar").slimScroll({destroy:!0}).height("auto"))}},$.AdminLTE.pushMenu={activate:function(a){var b=$.AdminLTE.options.screenSizes;$(document).on("click",a,function(a){a.preventDefault(),$(window).width()>b.sm-1?$("body").hasClass("sidebar-collapse")?$("body").removeClass("sidebar-collapse").trigger("expanded.pushMenu"):$("body").addClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").hasClass("sidebar-open")?$("body").removeClass("sidebar-open").removeClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").addClass("sidebar-open").trigger("expanded.pushMenu")}),$(".content-wrapper").click(function(){$(window).width()<=b.sm-1&&$("body").hasClass("sidebar-open")&&$("body").removeClass("sidebar-open")}),($.AdminLTE.options.sidebarExpandOnHover||$("body").hasClass("fixed")&&$("body").hasClass("sidebar-mini"))&&this.expandOnHover()},expandOnHover:function(){var a=this,b=$.AdminLTE.options.screenSizes.sm-1;$(".main-sidebar").hover(function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-collapse")&&$(window).width()>b&&a.expand()},function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-expanded-on-hover")&&$(window).width()>b&&a.collapse()})},expand:function(){$("body").removeClass("sidebar-collapse").addClass("sidebar-expanded-on-hover")},collapse:function(){$("body").hasClass("sidebar-expanded-on-hover")&&$("body").removeClass("sidebar-expanded-on-hover").addClass("sidebar-collapse")}},$.AdminLTE.tree=function(a){var b=this,c=$.AdminLTE.options.animationSpeed;$(document).off("click",a+" li a").on("click",a+" li a",function(a){var d=$(this),e=d.next();if(e.is(".treeview-menu")&&e.is(":visible")&&!$("body").hasClass("sidebar-collapse"))e.slideUp(c,function(){e.removeClass("menu-open")}),e.parent("li").removeClass("active");else if(e.is(".treeview-menu")&&!e.is(":visible")){var f=d.parents("ul").first(),g=f.find("ul:visible").slideUp(c);g.removeClass("menu-open");var h=d.parent("li");e.slideDown(c,function(){e.addClass("menu-open"),f.find("li.active").removeClass("active"),h.addClass("active"),b.layout.fix()})}e.is(".treeview-menu")&&a.preventDefault()})},$.AdminLTE.controlSidebar={activate:function(){var a=this,b=$.AdminLTE.options.controlSidebarOptions,c=$(b.selector),d=$(b.toggleBtnSelector);d.on("click",function(d){d.preventDefault(),c.hasClass("control-sidebar-open")||$("body").hasClass("control-sidebar-open")?a.close(c,b.slide):a.open(c,b.slide)});var e=$(".control-sidebar-bg");a._fix(e),$("body").hasClass("fixed")?a._fixForFixed(c):$(".content-wrapper, .right-side").height() .box-body, > .box-footer, > form >.box-body, > form > .box-footer");c.hasClass("collapsed-box")?(a.children(":first").removeClass(b.icons.open).addClass(b.icons.collapse),d.slideDown(b.animationSpeed,function(){c.removeClass("collapsed-box")})):(a.children(":first").removeClass(b.icons.collapse).addClass(b.icons.open),d.slideUp(b.animationSpeed,function(){c.addClass("collapsed-box")}))},remove:function(a){var b=a.parents(".box").first();b.slideUp(this.animationSpeed)}}}if("undefined"==typeof jQuery)throw new Error("AdminLTE requires jQuery");$.AdminLTE={},$.AdminLTE.options={navbarMenuSlimscroll:!0,navbarMenuSlimscrollWidth:"3px",navbarMenuHeight:"200px",animationSpeed:500,sidebarToggleSelector:"[data-toggle='offcanvas']",sidebarPushMenu:!0,sidebarSlimScroll:!0,sidebarExpandOnHover:!1,enableBoxRefresh:!0,enableBSToppltip:!0,BSTooltipSelector:"[data-toggle='tooltip']",enableFastclick:!1,enableControlSidebar:!0,controlSidebarOptions:{toggleBtnSelector:"[data-toggle='control-sidebar']",selector:".control-sidebar",slide:!0},enableBoxWidget:!0,boxWidgetOptions:{boxWidgetIcons:{collapse:"fa-minus",open:"fa-plus",remove:"fa-times"},boxWidgetSelectors:{remove:'[data-widget="remove"]',collapse:'[data-widget="collapse"]'}},directChat:{enable:!0,contactToggleSelector:'[data-widget="chat-pane-toggle"]'},colors:{lightBlue:"#3c8dbc",red:"#f56954",green:"#00a65a",aqua:"#00c0ef",yellow:"#f39c12",blue:"#0073b7",navy:"#001F3F",teal:"#39CCCC",olive:"#3D9970",lime:"#01FF70",orange:"#FF851B",fuchsia:"#F012BE",purple:"#8E24AA",maroon:"#D81B60",black:"#222222",gray:"#d2d6de"},screenSizes:{xs:480,sm:768,md:992,lg:1200}},$(function(){"use strict";$("body").removeClass("hold-transition"),"undefined"!=typeof AdminLTEOptions&&$.extend(!0,$.AdminLTE.options,AdminLTEOptions);var a=$.AdminLTE.options;_init(),$.AdminLTE.layout.activate(),$.AdminLTE.tree(".sidebar"),a.enableControlSidebar&&$.AdminLTE.controlSidebar.activate(),a.navbarMenuSlimscroll&&"undefined"!=typeof $.fn.slimscroll&&$(".navbar .menu").slimscroll({height:a.navbarMenuHeight,alwaysVisible:!1,size:a.navbarMenuSlimscrollWidth}).css("width","100%"),a.sidebarPushMenu&&$.AdminLTE.pushMenu.activate(a.sidebarToggleSelector),a.enableBSToppltip&&$("body").tooltip({selector:a.BSTooltipSelector}),a.enableBoxWidget&&$.AdminLTE.boxWidget.activate(),a.enableFastclick&&"undefined"!=typeof FastClick&&FastClick.attach(document.body),a.directChat.enable&&$(document).on("click",a.directChat.contactToggleSelector,function(){var a=$(this).parents(".direct-chat").first();a.toggleClass("direct-chat-contacts-open")}),$('.btn-group[data-toggle="btn-toggle"]').each(function(){var a=$(this);$(this).find(".btn").on("click",function(b){a.find(".btn.active").removeClass("active"),$(this).addClass("active"),b.preventDefault()})})}),function(a){"use strict";a.fn.boxRefresh=function(b){function c(a){a.append(f),e.onLoadStart.call(a)}function d(a){a.find(f).remove(),e.onLoadDone.call(a)}var e=a.extend({trigger:".refresh-btn",source:"",onLoadStart:function(a){return a},onLoadDone:function(a){return a}},b),f=a('
');return this.each(function(){if(""===e.source)return void(window.console&&window.console.log("Please specify a source first - boxRefresh()"));var b=a(this),f=b.find(e.trigger).first();f.on("click",function(a){a.preventDefault(),c(b),b.find(".box-body").load(e.source,function(){d(b)})})})}}(jQuery),function(a){"use strict";a.fn.activateBox=function(){a.AdminLTE.boxWidget.activate(this)},a.fn.toggleBox=function(){var b=a(a.AdminLTE.boxWidget.selectors.collapse,this);a.AdminLTE.boxWidget.collapse(b)},a.fn.removeBox=function(){var b=a(a.AdminLTE.boxWidget.selectors.remove,this);a.AdminLTE.boxWidget.remove(b)}}(jQuery),function(a){"use strict";a.fn.todolist=function(b){var c=a.extend({onCheck:function(a){return a},onUncheck:function(a){return a}},b);return this.each(function(){"undefined"!=typeof a.fn.iCheck?(a("input",this).on("ifChecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onCheck.call(b)}),a("input",this).on("ifUnchecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onUncheck.call(b)})):a("input",this).on("change",function(){var b=a(this).parents("li").first();b.toggleClass("done"),a("input",b).is(":checked")?c.onCheck.call(b):c.onUncheck.call(b)})})}}(jQuery); -------------------------------------------------------------------------------- /front-end/src/assets/libs/app.min.js: -------------------------------------------------------------------------------- 1 | /*! AdminLTE app.js 2 | * ================ 3 | * Main JS application file for AdminLTE v2. This file 4 | * should be included in all pages. It controls some layout 5 | * options and implements exclusive AdminLTE plugins. 6 | * 7 | * @Author Almsaeed Studio 8 | * @Support 9 | * @Email 10 | * @version 2.3.7 11 | * @license MIT 12 | */ 13 | function _init(){"use strict";$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){var a=$(".main-header").outerHeight()+$(".main-footer").outerHeight(),b=$(window).height(),c=$(".sidebar").height();if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",b-$(".main-footer").outerHeight());else{var d;b>=c?($(".content-wrapper, .right-side").css("min-height",b-a),d=b-a):($(".content-wrapper, .right-side").css("min-height",c),d=c);var e=$($.AdminLTE.options.controlSidebarOptions.selector);"undefined"!=typeof e&&e.height()>d&&$(".content-wrapper, .right-side").css("min-height",e.height())}},fixSidebar:function(){return $("body").hasClass("fixed")?("undefined"==typeof $.fn.slimScroll&&window.console&&window.console.error("Error: the fixed layout requires the slimscroll plugin!"),void($.AdminLTE.options.sidebarSlimScroll&&"undefined"!=typeof $.fn.slimScroll&&($(".sidebar").slimScroll({destroy:!0}).height("auto"),$(".sidebar").slimscroll({height:$(window).height()-$(".main-header").height()+"px",color:"rgba(0,0,0,0.2)",size:"3px"})))):void("undefined"!=typeof $.fn.slimScroll&&$(".sidebar").slimScroll({destroy:!0}).height("auto"))}},$.AdminLTE.pushMenu={activate:function(a){var b=$.AdminLTE.options.screenSizes;$(document).on("click",a,function(a){a.preventDefault(),$(window).width()>b.sm-1?$("body").hasClass("sidebar-collapse")?$("body").removeClass("sidebar-collapse").trigger("expanded.pushMenu"):$("body").addClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").hasClass("sidebar-open")?$("body").removeClass("sidebar-open").removeClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").addClass("sidebar-open").trigger("expanded.pushMenu")}),$(".content-wrapper").click(function(){$(window).width()<=b.sm-1&&$("body").hasClass("sidebar-open")&&$("body").removeClass("sidebar-open")}),($.AdminLTE.options.sidebarExpandOnHover||$("body").hasClass("fixed")&&$("body").hasClass("sidebar-mini"))&&this.expandOnHover()},expandOnHover:function(){var a=this,b=$.AdminLTE.options.screenSizes.sm-1;$(".main-sidebar").hover(function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-collapse")&&$(window).width()>b&&a.expand()},function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-expanded-on-hover")&&$(window).width()>b&&a.collapse()})},expand:function(){$("body").removeClass("sidebar-collapse").addClass("sidebar-expanded-on-hover")},collapse:function(){$("body").hasClass("sidebar-expanded-on-hover")&&$("body").removeClass("sidebar-expanded-on-hover").addClass("sidebar-collapse")}},$.AdminLTE.tree=function(a){var b=this,c=$.AdminLTE.options.animationSpeed;$(document).off("click",a+" li a").on("click",a+" li a",function(a){var d=$(this),e=d.next();if(e.is(".treeview-menu")&&e.is(":visible")&&!$("body").hasClass("sidebar-collapse"))e.slideUp(c,function(){e.removeClass("menu-open")}),e.parent("li").removeClass("active");else if(e.is(".treeview-menu")&&!e.is(":visible")){var f=d.parents("ul").first(),g=f.find("ul:visible").slideUp(c);g.removeClass("menu-open");var h=d.parent("li");e.slideDown(c,function(){e.addClass("menu-open"),f.find("li.active").removeClass("active"),h.addClass("active"),b.layout.fix()})}e.is(".treeview-menu")&&a.preventDefault()})},$.AdminLTE.controlSidebar={activate:function(){var a=this,b=$.AdminLTE.options.controlSidebarOptions,c=$(b.selector),d=$(b.toggleBtnSelector);d.on("click",function(d){d.preventDefault(),c.hasClass("control-sidebar-open")||$("body").hasClass("control-sidebar-open")?a.close(c,b.slide):a.open(c,b.slide)});var e=$(".control-sidebar-bg");a._fix(e),$("body").hasClass("fixed")?a._fixForFixed(c):$(".content-wrapper, .right-side").height() .box-body, > .box-footer, > form >.box-body, > form > .box-footer");c.hasClass("collapsed-box")?(a.children(":first").removeClass(b.icons.open).addClass(b.icons.collapse),d.slideDown(b.animationSpeed,function(){c.removeClass("collapsed-box")})):(a.children(":first").removeClass(b.icons.collapse).addClass(b.icons.open),d.slideUp(b.animationSpeed,function(){c.addClass("collapsed-box")}))},remove:function(a){var b=a.parents(".box").first();b.slideUp(this.animationSpeed)}}}if("undefined"==typeof jQuery)throw new Error("AdminLTE requires jQuery");$.AdminLTE={},$.AdminLTE.options={navbarMenuSlimscroll:!0,navbarMenuSlimscrollWidth:"3px",navbarMenuHeight:"200px",animationSpeed:500,sidebarToggleSelector:"[data-toggle='offcanvas']",sidebarPushMenu:!0,sidebarSlimScroll:!0,sidebarExpandOnHover:!1,enableBoxRefresh:!0,enableBSToppltip:!0,BSTooltipSelector:"[data-toggle='tooltip']",enableFastclick:!1,enableControlSidebar:!0,controlSidebarOptions:{toggleBtnSelector:"[data-toggle='control-sidebar']",selector:".control-sidebar",slide:!0},enableBoxWidget:!0,boxWidgetOptions:{boxWidgetIcons:{collapse:"fa-minus",open:"fa-plus",remove:"fa-times"},boxWidgetSelectors:{remove:'[data-widget="remove"]',collapse:'[data-widget="collapse"]'}},directChat:{enable:!0,contactToggleSelector:'[data-widget="chat-pane-toggle"]'},colors:{lightBlue:"#3c8dbc",red:"#f56954",green:"#00a65a",aqua:"#00c0ef",yellow:"#f39c12",blue:"#0073b7",navy:"#001F3F",teal:"#39CCCC",olive:"#3D9970",lime:"#01FF70",orange:"#FF851B",fuchsia:"#F012BE",purple:"#8E24AA",maroon:"#D81B60",black:"#222222",gray:"#d2d6de"},screenSizes:{xs:480,sm:768,md:992,lg:1200}},$(function(){"use strict";$("body").removeClass("hold-transition"),"undefined"!=typeof AdminLTEOptions&&$.extend(!0,$.AdminLTE.options,AdminLTEOptions);var a=$.AdminLTE.options;_init(),$.AdminLTE.layout.activate(),$.AdminLTE.tree(".sidebar"),a.enableControlSidebar&&$.AdminLTE.controlSidebar.activate(),a.navbarMenuSlimscroll&&"undefined"!=typeof $.fn.slimscroll&&$(".navbar .menu").slimscroll({height:a.navbarMenuHeight,alwaysVisible:!1,size:a.navbarMenuSlimscrollWidth}).css("width","100%"),a.sidebarPushMenu&&$.AdminLTE.pushMenu.activate(a.sidebarToggleSelector),a.enableBSToppltip&&$("body").tooltip({selector:a.BSTooltipSelector}),a.enableBoxWidget&&$.AdminLTE.boxWidget.activate(),a.enableFastclick&&"undefined"!=typeof FastClick&&FastClick.attach(document.body),a.directChat.enable&&$(document).on("click",a.directChat.contactToggleSelector,function(){var a=$(this).parents(".direct-chat").first();a.toggleClass("direct-chat-contacts-open")}),$('.btn-group[data-toggle="btn-toggle"]').each(function(){var a=$(this);$(this).find(".btn").on("click",function(b){a.find(".btn.active").removeClass("active"),$(this).addClass("active"),b.preventDefault()})})}),function(a){"use strict";a.fn.boxRefresh=function(b){function c(a){a.append(f),e.onLoadStart.call(a)}function d(a){a.find(f).remove(),e.onLoadDone.call(a)}var e=a.extend({trigger:".refresh-btn",source:"",onLoadStart:function(a){return a},onLoadDone:function(a){return a}},b),f=a('
');return this.each(function(){if(""===e.source)return void(window.console&&window.console.log("Please specify a source first - boxRefresh()"));var b=a(this),f=b.find(e.trigger).first();f.on("click",function(a){a.preventDefault(),c(b),b.find(".box-body").load(e.source,function(){d(b)})})})}}(jQuery),function(a){"use strict";a.fn.activateBox=function(){a.AdminLTE.boxWidget.activate(this)},a.fn.toggleBox=function(){var b=a(a.AdminLTE.boxWidget.selectors.collapse,this);a.AdminLTE.boxWidget.collapse(b)},a.fn.removeBox=function(){var b=a(a.AdminLTE.boxWidget.selectors.remove,this);a.AdminLTE.boxWidget.remove(b)}}(jQuery),function(a){"use strict";a.fn.todolist=function(b){var c=a.extend({onCheck:function(a){return a},onUncheck:function(a){return a}},b);return this.each(function(){"undefined"!=typeof a.fn.iCheck?(a("input",this).on("ifChecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onCheck.call(b)}),a("input",this).on("ifUnchecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onUncheck.call(b)})):a("input",this).on("change",function(){var b=a(this).parents("li").first();b.toggleClass("done"),a("input",b).is(":checked")?c.onCheck.call(b):c.onUncheck.call(b)})})}}(jQuery); -------------------------------------------------------------------------------- /front-end/dev/assets/libs/sme-router.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["sme-router"]=t():e["sme-router"]=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=1)}([function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"hash";if(o(this,e),this._mount=document.getElementById(t),!this._mount)throw new Error("Can not get mount point document.getElementById(#"+t+")...");this._subRouteView='
',this._subMount=null,this._isPassing=!1,this._cache={},this._middlewares=[],this._matcher=new u.default,this._history="hash"===n?new f.default({matcher:this._matcher}):new c.default({matcher:this._matcher})}return i(e,[{key:"render",value:function(e){this._isPassing?this._subMount.innerHTML=e:this._mount.innerHTML=e}},{key:"next",value:function(e){this._mount.innerHTML=e,this._isPassing=this._history.getMatchedCount()>1,this._subMount=document.querySelector("#__sub-route-view")}},{key:"subRoute",value:function(){return this._subRouteView}},{key:"use",value:function(e){this._middlewares.push(e)}},{key:"route",value:function(e,t){var n=this;this._matcher.add(e,function(r){if("*"!==e&&!r._id)for(var o=0;o-1&&(n=e.substr(r),e=e.slice(0,r));for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:[],t=arguments[1],n={},r=0;r-1&&(m=s[E],s=s.slice(0,E))}s&&(r.push(s),s="",f=!1);var O=""!==m&&void 0!==b&&b!==m,j="+"===x||"*"===x,P="?"===x||"*"===x,C=m||c,M=w||k;r.push({name:g||o++,prefix:m,delimiter:C,optional:P,repeat:j,partial:O,pattern:M?a(M):"[^"+i(C)+"]+?"})}}return(s||u-1;else{var v=i(y.prefix),_=y.repeat?"(?:"+y.pattern+")(?:"+v+"(?:"+y.pattern+"))*":y.pattern;t&&t.push(y),y.optional?y.partial?l+=v+"("+_+")?":l+="(?:"+v+"("+_+"))?":l+=v+"("+_+")"}}return o?(r||(l+="(?:"+a+")?"),l+="$"===c?"$":"(?="+c+")"):(r||(l+="(?:"+a+"(?="+c+"))?"),f||(l+="(?="+a+"|"+c+")")),new RegExp("^"+l,u(n))}function h(e,t,n){return e instanceof RegExp?s(e,t):Array.isArray(e)?c(e,t,n):l(e,t,n)}e.exports=h,e.exports.parse=n,e.exports.compile=r,e.exports.tokensToFunction=o,e.exports.tokensToRegExp=f;var p="/",d="./",y=new RegExp(["(\\\\.)","(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?"].join("|"),"g")},function(e,t,n){"use strict";function r(e){var t={};return(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach(function(e){var n=e.split("="),r=o(n,2),i=r[0],a=r[1],u=[decodeURIComponent(i),a?decodeURIComponent(a):null],s=u[0],c=u[1];t[s]=c}),t):null}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,u=e[Symbol.iterator]();!(r=(a=u.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&u.return&&u.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.parseQuery=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n0?n.slice(0,r)+"#"+e:n.slice(0,0)+"#"+e,this._cache[e]=t,location.replace(e)}},{key:"back",value:function(){history.go(-1)}},{key:"stop",value:function(){window.removeEventListener("load",this._listen),window.removeEventListener("hashchange",this._listen)}}]),t}(s.default);t.default=c}])}); -------------------------------------------------------------------------------- /front-end/src/assets/libs/sme-router.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["sme-router"]=t():e["sme-router"]=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=1)}([function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"hash";if(o(this,e),this._mount=document.getElementById(t),!this._mount)throw new Error("Can not get mount point document.getElementById(#"+t+")...");this._subRouteView='
',this._subMount=null,this._isPassing=!1,this._cache={},this._middlewares=[],this._matcher=new u.default,this._history="hash"===n?new f.default({matcher:this._matcher}):new c.default({matcher:this._matcher})}return i(e,[{key:"render",value:function(e){this._isPassing?this._subMount.innerHTML=e:this._mount.innerHTML=e}},{key:"next",value:function(e){this._mount.innerHTML=e,this._isPassing=this._history.getMatchedCount()>1,this._subMount=document.querySelector("#__sub-route-view")}},{key:"subRoute",value:function(){return this._subRouteView}},{key:"use",value:function(e){this._middlewares.push(e)}},{key:"route",value:function(e,t){var n=this;this._matcher.add(e,function(r){if("*"!==e&&!r._id)for(var o=0;o-1&&(n=e.substr(r),e=e.slice(0,r));for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:[],t=arguments[1],n={},r=0;r-1&&(m=s[E],s=s.slice(0,E))}s&&(r.push(s),s="",f=!1);var O=""!==m&&void 0!==b&&b!==m,j="+"===x||"*"===x,P="?"===x||"*"===x,C=m||c,M=w||k;r.push({name:g||o++,prefix:m,delimiter:C,optional:P,repeat:j,partial:O,pattern:M?a(M):"[^"+i(C)+"]+?"})}}return(s||u-1;else{var v=i(y.prefix),_=y.repeat?"(?:"+y.pattern+")(?:"+v+"(?:"+y.pattern+"))*":y.pattern;t&&t.push(y),y.optional?y.partial?l+=v+"("+_+")?":l+="(?:"+v+"("+_+"))?":l+=v+"("+_+")"}}return o?(r||(l+="(?:"+a+")?"),l+="$"===c?"$":"(?="+c+")"):(r||(l+="(?:"+a+"(?="+c+"))?"),f||(l+="(?="+a+"|"+c+")")),new RegExp("^"+l,u(n))}function h(e,t,n){return e instanceof RegExp?s(e,t):Array.isArray(e)?c(e,t,n):l(e,t,n)}e.exports=h,e.exports.parse=n,e.exports.compile=r,e.exports.tokensToFunction=o,e.exports.tokensToRegExp=f;var p="/",d="./",y=new RegExp(["(\\\\.)","(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?"].join("|"),"g")},function(e,t,n){"use strict";function r(e){var t={};return(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach(function(e){var n=e.split("="),r=o(n,2),i=r[0],a=r[1],u=[decodeURIComponent(i),a?decodeURIComponent(a):null],s=u[0],c=u[1];t[s]=c}),t):null}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,u=e[Symbol.iterator]();!(r=(a=u.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&u.return&&u.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.parseQuery=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n0?n.slice(0,r)+"#"+e:n.slice(0,0)+"#"+e,this._cache[e]=t,location.replace(e)}},{key:"back",value:function(){history.go(-1)}},{key:"stop",value:function(){window.removeEventListener("load",this._listen),window.removeEventListener("hashchange",this._listen)}}]),t}(s.default);t.default=c}])}); -------------------------------------------------------------------------------- /front-end/dev/assets/libs/jquery.form.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Form Plugin 3 | * version: 3.51.0-2014.06.20 4 | * Requires jQuery v1.5 or later 5 | * Copyright (c) 2014 M. Alsup 6 | * Examples and documentation at: https://jquery-form.github.io/form/ 7 | * Project repository: https://github.com/malsup/form 8 | * Dual licensed under the MIT and GPL licenses. 9 | * https://github.com/malsup/form#copyright-and-license 10 | */ 11 | !function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):e("undefined"!=typeof jQuery?jQuery:window.Zepto)}(function(e){"use strict";function t(t){var r=t.data;t.isDefaultPrevented()||(t.preventDefault(),e(t.target).ajaxSubmit(r))}function r(t){var r=t.target,a=e(r);if(!a.is("[type=submit],[type=image]")){var n=a.closest("[type=submit]");if(0===n.length)return;r=n[0]}var i=this;if(i.clk=r,"image"==r.type)if(void 0!==t.offsetX)i.clk_x=t.offsetX,i.clk_y=t.offsetY;else if("function"==typeof e.fn.offset){var o=a.offset();i.clk_x=t.pageX-o.left,i.clk_y=t.pageY-o.top}else i.clk_x=t.pageX-r.offsetLeft,i.clk_y=t.pageY-r.offsetTop;setTimeout(function(){i.clk=i.clk_x=i.clk_y=null},100)}function a(){if(e.fn.ajaxSubmit.debug){var t="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(t):window.opera&&window.opera.postError&&window.opera.postError(t)}}var n={};n.fileapi=void 0!==e("").get(0).files,n.formdata=void 0!==window.FormData;var i=!!e.fn.prop;e.fn.attr2=function(){if(!i)return this.attr.apply(this,arguments);var e=this.prop.apply(this,arguments);return e&&e.jquery||"string"==typeof e?e:this.attr.apply(this,arguments)},e.fn.ajaxSubmit=function(t){function r(r){var a,n,i=e.param(r,t.traditional).split("&"),o=i.length,s=[];for(a=0;o>a;a++)i[a]=i[a].replace(/\+/g," "),n=i[a].split("="),s.push([decodeURIComponent(n[0]),decodeURIComponent(n[1])]);return s}function o(a){for(var n=new FormData,i=0;i').val(m.extraData[d].value).appendTo(w)[0]:e('').val(m.extraData[d]).appendTo(w)[0]);m.iframeTarget||v.appendTo("body"),g.attachEvent?g.attachEvent("onload",s):g.addEventListener("load",s,!1),setTimeout(t,15);try{w.submit()}catch(h){var x=document.createElement("form").submit;x.apply(w)}}finally{w.setAttribute("action",i),w.setAttribute("enctype",c),r?w.setAttribute("target",r):f.removeAttr("target"),e(l).remove()}}function s(t){if(!x.aborted&&!F){if(M=n(g),M||(a("cannot access response document"),t=k),t===D&&x)return x.abort("timeout"),void S.reject(x,"timeout");if(t==k&&x)return x.abort("server abort"),void S.reject(x,"error","server abort");if(M&&M.location.href!=m.iframeSrc||T){g.detachEvent?g.detachEvent("onload",s):g.removeEventListener("load",s,!1);var r,i="success";try{if(T)throw"timeout";var o="xml"==m.dataType||M.XMLDocument||e.isXMLDoc(M);if(a("isXml="+o),!o&&window.opera&&(null===M.body||!M.body.innerHTML)&&--O)return a("requeing onLoad callback, DOM not available"),void setTimeout(s,250);var u=M.body?M.body:M.documentElement;x.responseText=u?u.innerHTML:null,x.responseXML=M.XMLDocument?M.XMLDocument:M,o&&(m.dataType="xml"),x.getResponseHeader=function(e){var t={"content-type":m.dataType};return t[e.toLowerCase()]},u&&(x.status=Number(u.getAttribute("status"))||x.status,x.statusText=u.getAttribute("statusText")||x.statusText);var c=(m.dataType||"").toLowerCase(),l=/(json|script|text)/.test(c);if(l||m.textarea){var f=M.getElementsByTagName("textarea")[0];if(f)x.responseText=f.value,x.status=Number(f.getAttribute("status"))||x.status,x.statusText=f.getAttribute("statusText")||x.statusText;else if(l){var p=M.getElementsByTagName("pre")[0],h=M.getElementsByTagName("body")[0];p?x.responseText=p.textContent?p.textContent:p.innerText:h&&(x.responseText=h.textContent?h.textContent:h.innerText)}}else"xml"==c&&!x.responseXML&&x.responseText&&(x.responseXML=X(x.responseText));try{E=_(x,c,m)}catch(y){i="parsererror",x.error=r=y||i}}catch(y){a("error caught: ",y),i="error",x.error=r=y||i}x.aborted&&(a("upload aborted"),i=null),x.status&&(i=x.status>=200&&x.status<300||304===x.status?"success":"error"),"success"===i?(m.success&&m.success.call(m.context,E,"success",x),S.resolve(x.responseText,"success",x),d&&e.event.trigger("ajaxSuccess",[x,m])):i&&(void 0===r&&(r=x.statusText),m.error&&m.error.call(m.context,x,i,r),S.reject(x,"error",r),d&&e.event.trigger("ajaxError",[x,m,r])),d&&e.event.trigger("ajaxComplete",[x,m]),d&&!--e.active&&e.event.trigger("ajaxStop"),m.complete&&m.complete.call(m.context,x,i),F=!0,m.timeout&&clearTimeout(j),setTimeout(function(){m.iframeTarget?v.attr("src",m.iframeSrc):v.remove(),x.responseXML=null},100)}}}var c,l,m,d,p,v,g,x,y,b,T,j,w=f[0],S=e.Deferred();if(S.abort=function(e){x.abort(e)},r)for(l=0;l'),v.css({position:"absolute",top:"-1000px",left:"-1000px"})),g=v[0],x={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(t){var r="timeout"===t?"timeout":"aborted";a("aborting upload... "+r),this.aborted=1;try{g.contentWindow.document.execCommand&&g.contentWindow.document.execCommand("Stop")}catch(n){}v.attr("src",m.iframeSrc),x.error=r,m.error&&m.error.call(m.context,x,r,t),d&&e.event.trigger("ajaxError",[x,m,r]),m.complete&&m.complete.call(m.context,x,r)}},d=m.global,d&&0===e.active++&&e.event.trigger("ajaxStart"),d&&e.event.trigger("ajaxSend",[x,m]),m.beforeSend&&m.beforeSend.call(m.context,x,m)===!1)return m.global&&e.active--,S.reject(),S;if(x.aborted)return S.reject(),S;y=w.clk,y&&(b=y.name,b&&!y.disabled&&(m.extraData=m.extraData||{},m.extraData[b]=y.value,"image"==y.type&&(m.extraData[b+".x"]=w.clk_x,m.extraData[b+".y"]=w.clk_y)));var D=1,k=2,A=e("meta[name=csrf-token]").attr("content"),L=e("meta[name=csrf-param]").attr("content");L&&A&&(m.extraData=m.extraData||{},m.extraData[L]=A),m.forceSync?o():setTimeout(o,10);var E,M,F,O=50,X=e.parseXML||function(e,t){return window.ActiveXObject?(t=new ActiveXObject("Microsoft.XMLDOM"),t.async="false",t.loadXML(e)):t=(new DOMParser).parseFromString(e,"text/xml"),t&&t.documentElement&&"parsererror"!=t.documentElement.nodeName?t:null},C=e.parseJSON||function(e){return window.eval("("+e+")")},_=function(t,r,a){var n=t.getResponseHeader("content-type")||"",i="xml"===r||!r&&n.indexOf("xml")>=0,o=i?t.responseXML:t.responseText;return i&&"parsererror"===o.documentElement.nodeName&&e.error&&e.error("parsererror"),a&&a.dataFilter&&(o=a.dataFilter(o,r)),"string"==typeof o&&("json"===r||!r&&n.indexOf("json")>=0?o=C(o):("script"===r||!r&&n.indexOf("javascript")>=0)&&e.globalEval(o)),o};return S}if(!this.length)return a("ajaxSubmit: skipping submit process - no element selected"),this;var u,c,l,f=this;"function"==typeof t?t={success:t}:void 0===t&&(t={}),u=t.type||this.attr2("method"),c=t.url||this.attr2("action"),l="string"==typeof c?e.trim(c):"",l=l||window.location.href||"",l&&(l=(l.match(/^([^#]+)/)||[])[1]),t=e.extend(!0,{url:l,success:e.ajaxSettings.success,type:u||e.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var m={};if(this.trigger("form-pre-serialize",[this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(t.beforeSerialize&&t.beforeSerialize(this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var d=t.traditional;void 0===d&&(d=e.ajaxSettings.traditional);var p,h=[],v=this.formToArray(t.semantic,h);if(t.data&&(t.extraData=t.data,p=e.param(t.data,d)),t.beforeSubmit&&t.beforeSubmit(v,this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[v,this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var g=e.param(v,d);p&&(g=g?g+"&"+p:p),"GET"==t.type.toUpperCase()?(t.url+=(t.url.indexOf("?")>=0?"&":"?")+g,t.data=null):t.data=g;var x=[];if(t.resetForm&&x.push(function(){f.resetForm()}),t.clearForm&&x.push(function(){f.clearForm(t.includeHidden)}),!t.dataType&&t.target){var y=t.success||function(){};x.push(function(r){var a=t.replaceTarget?"replaceWith":"html";e(t.target)[a](r).each(y,arguments)})}else t.success&&x.push(t.success);if(t.success=function(e,r,a){for(var n=t.context||this,i=0,o=x.length;o>i;i++)x[i].apply(n,[e,r,a||f,f])},t.error){var b=t.error;t.error=function(e,r,a){var n=t.context||this;b.apply(n,[e,r,a,f])}}if(t.complete){var T=t.complete;t.complete=function(e,r){var a=t.context||this;T.apply(a,[e,r,f])}}var j=e("input[type=file]:enabled",this).filter(function(){return""!==e(this).val()}),w=j.length>0,S="multipart/form-data",D=f.attr("enctype")==S||f.attr("encoding")==S,k=n.fileapi&&n.formdata;a("fileAPI :"+k);var A,L=(w||D)&&!k;t.iframe!==!1&&(t.iframe||L)?t.closeKeepAlive?e.get(t.closeKeepAlive,function(){A=s(v)}):A=s(v):A=(w||D)&&k?o(v):e.ajax(t),f.removeData("jqxhr").data("jqxhr",A);for(var E=0;Ec;c++)if(d=u[c],f=d.name,f&&!d.disabled)if(t&&o.clk&&"image"==d.type)o.clk==d&&(a.push({name:f,value:e(d).val(),type:d.type}),a.push({name:f+".x",value:o.clk_x},{name:f+".y",value:o.clk_y}));else if(m=e.fieldValue(d,!0),m&&m.constructor==Array)for(r&&r.push(d),l=0,h=m.length;h>l;l++)a.push({name:f,value:m[l]});else if(n.fileapi&&"file"==d.type){r&&r.push(d);var v=d.files;if(v.length)for(l=0;li;i++)r.push({name:a,value:n[i]});else null!==n&&"undefined"!=typeof n&&r.push({name:this.name,value:n})}}),e.param(r)},e.fn.fieldValue=function(t){for(var r=[],a=0,n=this.length;n>a;a++){var i=this[a],o=e.fieldValue(i,t);null===o||"undefined"==typeof o||o.constructor==Array&&!o.length||(o.constructor==Array?e.merge(r,o):r.push(o))}return r},e.fieldValue=function(t,r){var a=t.name,n=t.type,i=t.tagName.toLowerCase();if(void 0===r&&(r=!0),r&&(!a||t.disabled||"reset"==n||"button"==n||("checkbox"==n||"radio"==n)&&!t.checked||("submit"==n||"image"==n)&&t.form&&t.form.clk!=t||"select"==i&&-1==t.selectedIndex))return null;if("select"==i){var o=t.selectedIndex;if(0>o)return null;for(var s=[],u=t.options,c="select-one"==n,l=c?o+1:u.length,f=c?o:0;l>f;f++){var m=u[f];if(m.selected){var d=m.value;if(d||(d=m.attributes&&m.attributes.value&&!m.attributes.value.specified?m.text:m.value),c)return d;s.push(d)}}return s}return e(t).val()},e.fn.clearForm=function(t){return this.each(function(){e("input,select,textarea",this).clearFields(t)})},e.fn.clearFields=e.fn.clearInputs=function(t){var r=/^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;return this.each(function(){var a=this.type,n=this.tagName.toLowerCase();r.test(a)||"textarea"==n?this.value="":"checkbox"==a||"radio"==a?this.checked=!1:"select"==n?this.selectedIndex=-1:"file"==a?/MSIE/.test(navigator.userAgent)?e(this).replaceWith(e(this).clone(!0)):e(this).val(""):t&&(t===!0&&/hidden/.test(a)||"string"==typeof t&&e(this).is(t))&&(this.value="")})},e.fn.resetForm=function(){return this.each(function(){("function"==typeof this.reset||"object"==typeof this.reset&&!this.reset.nodeType)&&this.reset()})},e.fn.enable=function(e){return void 0===e&&(e=!0),this.each(function(){this.disabled=!e})},e.fn.selected=function(t){return void 0===t&&(t=!0),this.each(function(){var r=this.type;if("checkbox"==r||"radio"==r)this.checked=t;else if("option"==this.tagName.toLowerCase()){var a=e(this).parent("select");t&&a[0]&&"select-one"==a[0].type&&a.find("option").selected(!1),this.selected=t}})},e.fn.ajaxSubmit.debug=!1}); -------------------------------------------------------------------------------- /front-end/src/assets/libs/jquery.form.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Form Plugin 3 | * version: 3.51.0-2014.06.20 4 | * Requires jQuery v1.5 or later 5 | * Copyright (c) 2014 M. Alsup 6 | * Examples and documentation at: https://jquery-form.github.io/form/ 7 | * Project repository: https://github.com/malsup/form 8 | * Dual licensed under the MIT and GPL licenses. 9 | * https://github.com/malsup/form#copyright-and-license 10 | */ 11 | !function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):e("undefined"!=typeof jQuery?jQuery:window.Zepto)}(function(e){"use strict";function t(t){var r=t.data;t.isDefaultPrevented()||(t.preventDefault(),e(t.target).ajaxSubmit(r))}function r(t){var r=t.target,a=e(r);if(!a.is("[type=submit],[type=image]")){var n=a.closest("[type=submit]");if(0===n.length)return;r=n[0]}var i=this;if(i.clk=r,"image"==r.type)if(void 0!==t.offsetX)i.clk_x=t.offsetX,i.clk_y=t.offsetY;else if("function"==typeof e.fn.offset){var o=a.offset();i.clk_x=t.pageX-o.left,i.clk_y=t.pageY-o.top}else i.clk_x=t.pageX-r.offsetLeft,i.clk_y=t.pageY-r.offsetTop;setTimeout(function(){i.clk=i.clk_x=i.clk_y=null},100)}function a(){if(e.fn.ajaxSubmit.debug){var t="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(t):window.opera&&window.opera.postError&&window.opera.postError(t)}}var n={};n.fileapi=void 0!==e("").get(0).files,n.formdata=void 0!==window.FormData;var i=!!e.fn.prop;e.fn.attr2=function(){if(!i)return this.attr.apply(this,arguments);var e=this.prop.apply(this,arguments);return e&&e.jquery||"string"==typeof e?e:this.attr.apply(this,arguments)},e.fn.ajaxSubmit=function(t){function r(r){var a,n,i=e.param(r,t.traditional).split("&"),o=i.length,s=[];for(a=0;o>a;a++)i[a]=i[a].replace(/\+/g," "),n=i[a].split("="),s.push([decodeURIComponent(n[0]),decodeURIComponent(n[1])]);return s}function o(a){for(var n=new FormData,i=0;i').val(m.extraData[d].value).appendTo(w)[0]:e('').val(m.extraData[d]).appendTo(w)[0]);m.iframeTarget||v.appendTo("body"),g.attachEvent?g.attachEvent("onload",s):g.addEventListener("load",s,!1),setTimeout(t,15);try{w.submit()}catch(h){var x=document.createElement("form").submit;x.apply(w)}}finally{w.setAttribute("action",i),w.setAttribute("enctype",c),r?w.setAttribute("target",r):f.removeAttr("target"),e(l).remove()}}function s(t){if(!x.aborted&&!F){if(M=n(g),M||(a("cannot access response document"),t=k),t===D&&x)return x.abort("timeout"),void S.reject(x,"timeout");if(t==k&&x)return x.abort("server abort"),void S.reject(x,"error","server abort");if(M&&M.location.href!=m.iframeSrc||T){g.detachEvent?g.detachEvent("onload",s):g.removeEventListener("load",s,!1);var r,i="success";try{if(T)throw"timeout";var o="xml"==m.dataType||M.XMLDocument||e.isXMLDoc(M);if(a("isXml="+o),!o&&window.opera&&(null===M.body||!M.body.innerHTML)&&--O)return a("requeing onLoad callback, DOM not available"),void setTimeout(s,250);var u=M.body?M.body:M.documentElement;x.responseText=u?u.innerHTML:null,x.responseXML=M.XMLDocument?M.XMLDocument:M,o&&(m.dataType="xml"),x.getResponseHeader=function(e){var t={"content-type":m.dataType};return t[e.toLowerCase()]},u&&(x.status=Number(u.getAttribute("status"))||x.status,x.statusText=u.getAttribute("statusText")||x.statusText);var c=(m.dataType||"").toLowerCase(),l=/(json|script|text)/.test(c);if(l||m.textarea){var f=M.getElementsByTagName("textarea")[0];if(f)x.responseText=f.value,x.status=Number(f.getAttribute("status"))||x.status,x.statusText=f.getAttribute("statusText")||x.statusText;else if(l){var p=M.getElementsByTagName("pre")[0],h=M.getElementsByTagName("body")[0];p?x.responseText=p.textContent?p.textContent:p.innerText:h&&(x.responseText=h.textContent?h.textContent:h.innerText)}}else"xml"==c&&!x.responseXML&&x.responseText&&(x.responseXML=X(x.responseText));try{E=_(x,c,m)}catch(y){i="parsererror",x.error=r=y||i}}catch(y){a("error caught: ",y),i="error",x.error=r=y||i}x.aborted&&(a("upload aborted"),i=null),x.status&&(i=x.status>=200&&x.status<300||304===x.status?"success":"error"),"success"===i?(m.success&&m.success.call(m.context,E,"success",x),S.resolve(x.responseText,"success",x),d&&e.event.trigger("ajaxSuccess",[x,m])):i&&(void 0===r&&(r=x.statusText),m.error&&m.error.call(m.context,x,i,r),S.reject(x,"error",r),d&&e.event.trigger("ajaxError",[x,m,r])),d&&e.event.trigger("ajaxComplete",[x,m]),d&&!--e.active&&e.event.trigger("ajaxStop"),m.complete&&m.complete.call(m.context,x,i),F=!0,m.timeout&&clearTimeout(j),setTimeout(function(){m.iframeTarget?v.attr("src",m.iframeSrc):v.remove(),x.responseXML=null},100)}}}var c,l,m,d,p,v,g,x,y,b,T,j,w=f[0],S=e.Deferred();if(S.abort=function(e){x.abort(e)},r)for(l=0;l'),v.css({position:"absolute",top:"-1000px",left:"-1000px"})),g=v[0],x={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(t){var r="timeout"===t?"timeout":"aborted";a("aborting upload... "+r),this.aborted=1;try{g.contentWindow.document.execCommand&&g.contentWindow.document.execCommand("Stop")}catch(n){}v.attr("src",m.iframeSrc),x.error=r,m.error&&m.error.call(m.context,x,r,t),d&&e.event.trigger("ajaxError",[x,m,r]),m.complete&&m.complete.call(m.context,x,r)}},d=m.global,d&&0===e.active++&&e.event.trigger("ajaxStart"),d&&e.event.trigger("ajaxSend",[x,m]),m.beforeSend&&m.beforeSend.call(m.context,x,m)===!1)return m.global&&e.active--,S.reject(),S;if(x.aborted)return S.reject(),S;y=w.clk,y&&(b=y.name,b&&!y.disabled&&(m.extraData=m.extraData||{},m.extraData[b]=y.value,"image"==y.type&&(m.extraData[b+".x"]=w.clk_x,m.extraData[b+".y"]=w.clk_y)));var D=1,k=2,A=e("meta[name=csrf-token]").attr("content"),L=e("meta[name=csrf-param]").attr("content");L&&A&&(m.extraData=m.extraData||{},m.extraData[L]=A),m.forceSync?o():setTimeout(o,10);var E,M,F,O=50,X=e.parseXML||function(e,t){return window.ActiveXObject?(t=new ActiveXObject("Microsoft.XMLDOM"),t.async="false",t.loadXML(e)):t=(new DOMParser).parseFromString(e,"text/xml"),t&&t.documentElement&&"parsererror"!=t.documentElement.nodeName?t:null},C=e.parseJSON||function(e){return window.eval("("+e+")")},_=function(t,r,a){var n=t.getResponseHeader("content-type")||"",i="xml"===r||!r&&n.indexOf("xml")>=0,o=i?t.responseXML:t.responseText;return i&&"parsererror"===o.documentElement.nodeName&&e.error&&e.error("parsererror"),a&&a.dataFilter&&(o=a.dataFilter(o,r)),"string"==typeof o&&("json"===r||!r&&n.indexOf("json")>=0?o=C(o):("script"===r||!r&&n.indexOf("javascript")>=0)&&e.globalEval(o)),o};return S}if(!this.length)return a("ajaxSubmit: skipping submit process - no element selected"),this;var u,c,l,f=this;"function"==typeof t?t={success:t}:void 0===t&&(t={}),u=t.type||this.attr2("method"),c=t.url||this.attr2("action"),l="string"==typeof c?e.trim(c):"",l=l||window.location.href||"",l&&(l=(l.match(/^([^#]+)/)||[])[1]),t=e.extend(!0,{url:l,success:e.ajaxSettings.success,type:u||e.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var m={};if(this.trigger("form-pre-serialize",[this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(t.beforeSerialize&&t.beforeSerialize(this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var d=t.traditional;void 0===d&&(d=e.ajaxSettings.traditional);var p,h=[],v=this.formToArray(t.semantic,h);if(t.data&&(t.extraData=t.data,p=e.param(t.data,d)),t.beforeSubmit&&t.beforeSubmit(v,this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[v,this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var g=e.param(v,d);p&&(g=g?g+"&"+p:p),"GET"==t.type.toUpperCase()?(t.url+=(t.url.indexOf("?")>=0?"&":"?")+g,t.data=null):t.data=g;var x=[];if(t.resetForm&&x.push(function(){f.resetForm()}),t.clearForm&&x.push(function(){f.clearForm(t.includeHidden)}),!t.dataType&&t.target){var y=t.success||function(){};x.push(function(r){var a=t.replaceTarget?"replaceWith":"html";e(t.target)[a](r).each(y,arguments)})}else t.success&&x.push(t.success);if(t.success=function(e,r,a){for(var n=t.context||this,i=0,o=x.length;o>i;i++)x[i].apply(n,[e,r,a||f,f])},t.error){var b=t.error;t.error=function(e,r,a){var n=t.context||this;b.apply(n,[e,r,a,f])}}if(t.complete){var T=t.complete;t.complete=function(e,r){var a=t.context||this;T.apply(a,[e,r,f])}}var j=e("input[type=file]:enabled",this).filter(function(){return""!==e(this).val()}),w=j.length>0,S="multipart/form-data",D=f.attr("enctype")==S||f.attr("encoding")==S,k=n.fileapi&&n.formdata;a("fileAPI :"+k);var A,L=(w||D)&&!k;t.iframe!==!1&&(t.iframe||L)?t.closeKeepAlive?e.get(t.closeKeepAlive,function(){A=s(v)}):A=s(v):A=(w||D)&&k?o(v):e.ajax(t),f.removeData("jqxhr").data("jqxhr",A);for(var E=0;Ec;c++)if(d=u[c],f=d.name,f&&!d.disabled)if(t&&o.clk&&"image"==d.type)o.clk==d&&(a.push({name:f,value:e(d).val(),type:d.type}),a.push({name:f+".x",value:o.clk_x},{name:f+".y",value:o.clk_y}));else if(m=e.fieldValue(d,!0),m&&m.constructor==Array)for(r&&r.push(d),l=0,h=m.length;h>l;l++)a.push({name:f,value:m[l]});else if(n.fileapi&&"file"==d.type){r&&r.push(d);var v=d.files;if(v.length)for(l=0;li;i++)r.push({name:a,value:n[i]});else null!==n&&"undefined"!=typeof n&&r.push({name:this.name,value:n})}}),e.param(r)},e.fn.fieldValue=function(t){for(var r=[],a=0,n=this.length;n>a;a++){var i=this[a],o=e.fieldValue(i,t);null===o||"undefined"==typeof o||o.constructor==Array&&!o.length||(o.constructor==Array?e.merge(r,o):r.push(o))}return r},e.fieldValue=function(t,r){var a=t.name,n=t.type,i=t.tagName.toLowerCase();if(void 0===r&&(r=!0),r&&(!a||t.disabled||"reset"==n||"button"==n||("checkbox"==n||"radio"==n)&&!t.checked||("submit"==n||"image"==n)&&t.form&&t.form.clk!=t||"select"==i&&-1==t.selectedIndex))return null;if("select"==i){var o=t.selectedIndex;if(0>o)return null;for(var s=[],u=t.options,c="select-one"==n,l=c?o+1:u.length,f=c?o:0;l>f;f++){var m=u[f];if(m.selected){var d=m.value;if(d||(d=m.attributes&&m.attributes.value&&!m.attributes.value.specified?m.text:m.value),c)return d;s.push(d)}}return s}return e(t).val()},e.fn.clearForm=function(t){return this.each(function(){e("input,select,textarea",this).clearFields(t)})},e.fn.clearFields=e.fn.clearInputs=function(t){var r=/^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;return this.each(function(){var a=this.type,n=this.tagName.toLowerCase();r.test(a)||"textarea"==n?this.value="":"checkbox"==a||"radio"==a?this.checked=!1:"select"==n?this.selectedIndex=-1:"file"==a?/MSIE/.test(navigator.userAgent)?e(this).replaceWith(e(this).clone(!0)):e(this).val(""):t&&(t===!0&&/hidden/.test(a)||"string"==typeof t&&e(this).is(t))&&(this.value="")})},e.fn.resetForm=function(){return this.each(function(){("function"==typeof this.reset||"object"==typeof this.reset&&!this.reset.nodeType)&&this.reset()})},e.fn.enable=function(e){return void 0===e&&(e=!0),this.each(function(){this.disabled=!e})},e.fn.selected=function(t){return void 0===t&&(t=!0),this.each(function(){var r=this.type;if("checkbox"==r||"radio"==r)this.checked=t;else if("option"==this.tagName.toLowerCase()){var a=e(this).parent("select");t&&a[0]&&"select-one"==a[0].type&&a.find("option").selected(!1),this.selected=t}})},e.fn.ajaxSubmit.debug=!1}); -------------------------------------------------------------------------------- /front-end/dev/assets/libs/template-web.js: -------------------------------------------------------------------------------- 1 | /*! art-template@4.12.2 for browser | https://github.com/aui/art-template */ 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.template=t():e.template=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,n){(function(t){e.exports=!1;try{e.exports="[object process]"===Object.prototype.toString.call(t.process)}catch(n){}}).call(t,n(4))},function(e,t,n){"use strict";var r=n(8),i=n(3),o=n(23),s=function(e,t){t.onerror(e,t);var n=function(){return"{Template Error}"};return n.mappings=[],n.sourcesContent=[],n},a=function c(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};"string"!=typeof e?t=e:t.source=e,t=i.$extend(t),e=t.source,!0===t.debug&&(t.cache=!1,t.minimize=!1,t.compileDebug=!0),t.compileDebug&&(t.minimize=!1),t.filename&&(t.filename=t.resolveFilename(t.filename,t));var n=t.filename,a=t.cache,u=t.caches;if(a&&n){var p=u.get(n);if(p)return p}if(!e)try{e=t.loader(n,t),t.source=e}catch(d){var l=new o({name:"CompileError",path:n,message:"template not found: "+d.message,stack:d.stack});if(t.bail)throw l;return s(l,t)}var f=void 0,h=new r(t);try{f=h.build()}catch(l){if(l=new o(l),t.bail)throw l;return s(l,t)}var m=function(e,n){try{return f(e,n)}catch(l){if(!t.compileDebug)return t.cache=!1,t.compileDebug=!0,c(t)(e,n);if(l=new o(l),t.bail)throw l;return s(l,t)()}};return m.mappings=f.mappings,m.sourcesContent=f.sourcesContent,m.toString=function(){return f.toString()},a&&n&&u.set(n,m),m};a.Compiler=r,e.exports=a},function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=/((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyu]{1,5}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g,t.matchToToken=function(e){var t={type:"invalid",value:e[0]};return e[1]?(t.type="string",t.closed=!(!e[3]&&!e[4])):e[5]?t.type="comment":e[6]?(t.type="comment",t.closed=!!e[7]):e[8]?t.type="regex":e[9]?t.type="number":e[10]?t.type="name":e[11]?t.type="punctuator":e[12]&&(t.type="whitespace"),t}},function(e,t,n){"use strict";function r(){this.$extend=function(e){return e=e||{},s(e,e instanceof r?e:this)}}var i=n(0),o=n(12),s=n(13),a=n(14),c=n(15),u=n(16),p=n(17),l=n(18),f=n(19),h=n(20),m=n(22),d={source:null,filename:null,rules:[f,l],escape:!0,debug:!!i&&"production"!==process.env.NODE_ENV,bail:!0,cache:!0,minimize:!0,compileDebug:!1,resolveFilename:m,include:a,htmlMinifier:h,htmlMinifierOptions:{collapseWhitespace:!0,minifyCSS:!0,minifyJS:!0,ignoreCustomFragments:[]},onerror:c,loader:p,caches:u,root:"/",extname:".art",ignore:[],imports:o};r.prototype=d,e.exports=new r},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(r){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){},function(e,t,n){"use strict";var r=n(7),i=n(1),o=n(24),s=function(e,t){return t instanceof Object?r({filename:e},t):i({filename:e,source:t})};s.render=r,s.compile=i,s.defaults=o,e.exports=s},function(e,t,n){"use strict";var r=n(1),i=function(e,t,n){return r(e,n)(t)};e.exports=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=n(9),o=n(11),s="$data",a="$imports",c="print",u="include",p="extend",l="block",f="$$out",h="$$line",m="$$blocks",d="$$slice",v="$$from",g="$$options",y=function(e,t){return Object.hasOwnProperty.call(e,t)},b=JSON.stringify,x=function(){function e(t){var n,i,y=this;r(this,e);var b=t.source,x=t.minimize,w=t.htmlMinifier;if(this.options=t,this.stacks=[],this.context=[],this.scripts=[],this.CONTEXT_MAP={},this.ignore=[s,a,g].concat(t.ignore),this.internal=(n={},n[f]="''",n[h]="[0,0]",n[m]="arguments[1]||{}",n[v]="null",n[c]="function(){var s=''.concat.apply('',arguments);"+f+"+=s;return s}",n[u]="function(src,data){var s="+g+".include(src,data||"+s+",arguments[2]||"+m+","+g+");"+f+"+=s;return s}",n[p]="function(from){"+v+"=from}",n[d]="function(c,p,s){p="+f+";"+f+"='';c();s="+f+";"+f+"=p+s;return s}",n[l]="function(){var a=arguments,s;if(typeof a[0]==='function'){return "+d+"(a[0])}else if("+v+"){if(!"+m+"[a[0]]){"+m+"[a[0]]="+d+"(a[1])}else{"+f+"+="+m+"[a[0]]}}else{s="+m+"[a[0]];if(typeof s==='string'){"+f+"+=s}else{s="+d+"(a[1])}return s}}",n),this.dependencies=(i={},i[c]=[f],i[u]=[f,g,s,m],i[p]=[v,u],i[l]=[d,v,f,m],i),this.importContext(f),t.compileDebug&&this.importContext(h),x)try{b=w(b,t)}catch(E){}this.source=b,this.getTplTokens(b,t.rules,this).forEach(function(e){e.type===o.TYPE_STRING?y.parseString(e):y.parseExpression(e)})}return e.prototype.getTplTokens=function(){return o.apply(undefined,arguments)},e.prototype.getEsTokens=function(e){return i(e)},e.prototype.getVariables=function(e){var t=!1;return e.filter(function(e){return"whitespace"!==e.type&&"comment"!==e.type}).filter(function(e){return"name"===e.type&&!t||(t="punctuator"===e.type&&"."===e.value,!1)}).map(function(e){return e.value})},e.prototype.importContext=function(e){var t=this,n="",r=this.internal,i=this.dependencies,o=this.ignore,c=this.context,u=this.options,p=u.imports,l=this.CONTEXT_MAP;y(l,e)||-1!==o.indexOf(e)||(y(r,e)?(n=r[e],y(i,e)&&i[e].forEach(function(e){return t.importContext(e)})):n="$escape"===e||"$each"===e||y(p,e)?a+"."+e:s+"."+e,l[e]=n,c.push({name:e,value:n}))},e.prototype.parseString=function(e){var t=e.value;if(t){var n=f+"+="+b(t);this.scripts.push({source:t,tplToken:e,code:n})}},e.prototype.parseExpression=function(e){var t=this,n=e.value,r=e.script,i=r.output,s=this.options.escape,a=r.code;i&&(a=!1===s||i===o.TYPE_RAW?f+"+="+r.code:f+"+=$escape("+r.code+")");var c=this.getEsTokens(a);this.getVariables(c).forEach(function(e){return t.importContext(e)}),this.scripts.push({source:n,tplToken:e,code:a})},e.prototype.checkExpression=function(e){for(var t=[[/^\s*}[\w\W]*?{?[\s;]*$/,""],[/(^[\w\W]*?\([\w\W]*?(?:=>|\([\w\W]*?\))\s*{[\s;]*$)/,"$1})"],[/(^[\w\W]*?\([\w\W]*?\)\s*{[\s;]*$)/,"$1}"]],n=0;n2&&arguments[2]!==undefined?arguments[2]:{},i=[{type:"string",value:e,line:0,start:0,end:e.length}],o=0;o]/;s.$escape=function(e){return i(r(e))},s.$each=function(e,t){if(Array.isArray(e))for(var n=0,r=e.length;n {{"+n+"}}")};switch("#"===t&&h("#value","@value"),f){case"set":i="var "+c.join("").trim();break;case"if":i="if("+c.join("").trim()+"){";break;case"else":var m=c.indexOf("if");~m?(c.splice(0,m+1),i="}else if("+c.join("").trim()+"){"):i="}else{";break;case"/if":i="}";break;case"each":p=r._split(a),p.shift(),"as"===p[1]&&(h("each object as value index","each object value index"),p.splice(1,1));i="$each("+(p[0]||"$data")+",function("+(p[1]||"$value")+","+(p[2]||"$index")+"){";break;case"/each":i="})";break;case"block":p=r._split(a),p.shift(),i="block("+p.join(",").trim()+",function(){";break;case"/block":i="})";break;case"echo":f="print",h("echo value","value");case"print":case"include":case"extend":if(0!==c.join("").trim().indexOf("(")){p=r._split(a),p.shift(),i=f+"("+p.join(",")+")";break}default:if(~c.indexOf("|")){var d=a.reduce(function(e,t){var n=t.value,r=t.type;return"|"===n?e.push([]):"whitespace"!==r&&"comment"!==r&&(e.length||e.push([]),":"===n&&1===e[e.length-1].length?h("value | filter: argv","value | filter argv"):e[e.length-1].push(t)),e},[]).map(function(e){return r._split(e)});i=d.reduce(function(e,t){var n=t.shift();return t.unshift(e),"$imports."+n+"("+t.join(",")+")"},d.shift().join(" ").trim())}l=l||"escape"}return u.code=i,u.output=l,u},_split:function(e){e=e.filter(function(e){var t=e.type;return"whitespace"!==t&&"comment"!==t});for(var t=0,n=e.shift(),r=/\]|\)/,i=[[n]];t/,use:function(e,t,n,r){return n={"-":"raw","=":"escape","":!1,"==":"raw","=#":"raw"}[n],t&&(r="/*"+r+"*/",n=!1),{code:r,output:n}}};e.exports=r},function(e,t,n){"use strict";var r=n(0),i=function(e,t){if(r){var i,o=n(21).minify,s=t.htmlMinifierOptions,a=t.rules.map(function(e){return e.test});(i=s.ignoreCustomFragments).push.apply(i,a),e=o(e,s)}return e};e.exports=i},function(e,t){!function(e){e.noop=function(){}}("object"==typeof e&&"object"==typeof e.exports?e.exports:window)},function(e,t,n){"use strict";var r=n(0),i=/^\.+\//,o=function(e,t){if(r){var o=n(5),s=t.root,a=t.extname;if(i.test(e)){var c=t.filename,u=!c||e===c,p=u?s:o.dirname(c);e=o.resolve(p,e)}else e=o.resolve(s,e);o.extname(e)||(e+=a)}return e};e.exports=o},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function s(e){var t=e.name,n=e.source,r=e.path,i=e.line,o=e.column,s=e.generated,a=e.message;if(!n)return a;var c=n.split(/\n/),u=Math.max(i-3,0),p=Math.min(c.length,i+3),l=c.slice(u,p).map(function(e,t){var n=t+u+1;return(n===i?" >> ":" ")+n+"| "+e}).join("\n");return(r||"anonymous")+":"+i+":"+o+"\n"+l+"\n\n"+t+": "+a+(s?"\n generated: "+s:"")}var a=function(e){function t(n){r(this,t);var o=i(this,e.call(this,n.message));return o.name="TemplateError",o.message=s(n),Error.captureStackTrace&&Error.captureStackTrace(o,o.constructor),o}return o(t,e),t}(Error);e.exports=a},function(e,t,n){"use strict";e.exports=n(3)}])}); -------------------------------------------------------------------------------- /front-end/src/assets/libs/template-web.js: -------------------------------------------------------------------------------- 1 | /*! art-template@4.12.2 for browser | https://github.com/aui/art-template */ 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.template=t():e.template=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,n){(function(t){e.exports=!1;try{e.exports="[object process]"===Object.prototype.toString.call(t.process)}catch(n){}}).call(t,n(4))},function(e,t,n){"use strict";var r=n(8),i=n(3),o=n(23),s=function(e,t){t.onerror(e,t);var n=function(){return"{Template Error}"};return n.mappings=[],n.sourcesContent=[],n},a=function c(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};"string"!=typeof e?t=e:t.source=e,t=i.$extend(t),e=t.source,!0===t.debug&&(t.cache=!1,t.minimize=!1,t.compileDebug=!0),t.compileDebug&&(t.minimize=!1),t.filename&&(t.filename=t.resolveFilename(t.filename,t));var n=t.filename,a=t.cache,u=t.caches;if(a&&n){var p=u.get(n);if(p)return p}if(!e)try{e=t.loader(n,t),t.source=e}catch(d){var l=new o({name:"CompileError",path:n,message:"template not found: "+d.message,stack:d.stack});if(t.bail)throw l;return s(l,t)}var f=void 0,h=new r(t);try{f=h.build()}catch(l){if(l=new o(l),t.bail)throw l;return s(l,t)}var m=function(e,n){try{return f(e,n)}catch(l){if(!t.compileDebug)return t.cache=!1,t.compileDebug=!0,c(t)(e,n);if(l=new o(l),t.bail)throw l;return s(l,t)()}};return m.mappings=f.mappings,m.sourcesContent=f.sourcesContent,m.toString=function(){return f.toString()},a&&n&&u.set(n,m),m};a.Compiler=r,e.exports=a},function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=/((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyu]{1,5}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g,t.matchToToken=function(e){var t={type:"invalid",value:e[0]};return e[1]?(t.type="string",t.closed=!(!e[3]&&!e[4])):e[5]?t.type="comment":e[6]?(t.type="comment",t.closed=!!e[7]):e[8]?t.type="regex":e[9]?t.type="number":e[10]?t.type="name":e[11]?t.type="punctuator":e[12]&&(t.type="whitespace"),t}},function(e,t,n){"use strict";function r(){this.$extend=function(e){return e=e||{},s(e,e instanceof r?e:this)}}var i=n(0),o=n(12),s=n(13),a=n(14),c=n(15),u=n(16),p=n(17),l=n(18),f=n(19),h=n(20),m=n(22),d={source:null,filename:null,rules:[f,l],escape:!0,debug:!!i&&"production"!==process.env.NODE_ENV,bail:!0,cache:!0,minimize:!0,compileDebug:!1,resolveFilename:m,include:a,htmlMinifier:h,htmlMinifierOptions:{collapseWhitespace:!0,minifyCSS:!0,minifyJS:!0,ignoreCustomFragments:[]},onerror:c,loader:p,caches:u,root:"/",extname:".art",ignore:[],imports:o};r.prototype=d,e.exports=new r},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(r){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){},function(e,t,n){"use strict";var r=n(7),i=n(1),o=n(24),s=function(e,t){return t instanceof Object?r({filename:e},t):i({filename:e,source:t})};s.render=r,s.compile=i,s.defaults=o,e.exports=s},function(e,t,n){"use strict";var r=n(1),i=function(e,t,n){return r(e,n)(t)};e.exports=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=n(9),o=n(11),s="$data",a="$imports",c="print",u="include",p="extend",l="block",f="$$out",h="$$line",m="$$blocks",d="$$slice",v="$$from",g="$$options",y=function(e,t){return Object.hasOwnProperty.call(e,t)},b=JSON.stringify,x=function(){function e(t){var n,i,y=this;r(this,e);var b=t.source,x=t.minimize,w=t.htmlMinifier;if(this.options=t,this.stacks=[],this.context=[],this.scripts=[],this.CONTEXT_MAP={},this.ignore=[s,a,g].concat(t.ignore),this.internal=(n={},n[f]="''",n[h]="[0,0]",n[m]="arguments[1]||{}",n[v]="null",n[c]="function(){var s=''.concat.apply('',arguments);"+f+"+=s;return s}",n[u]="function(src,data){var s="+g+".include(src,data||"+s+",arguments[2]||"+m+","+g+");"+f+"+=s;return s}",n[p]="function(from){"+v+"=from}",n[d]="function(c,p,s){p="+f+";"+f+"='';c();s="+f+";"+f+"=p+s;return s}",n[l]="function(){var a=arguments,s;if(typeof a[0]==='function'){return "+d+"(a[0])}else if("+v+"){if(!"+m+"[a[0]]){"+m+"[a[0]]="+d+"(a[1])}else{"+f+"+="+m+"[a[0]]}}else{s="+m+"[a[0]];if(typeof s==='string'){"+f+"+=s}else{s="+d+"(a[1])}return s}}",n),this.dependencies=(i={},i[c]=[f],i[u]=[f,g,s,m],i[p]=[v,u],i[l]=[d,v,f,m],i),this.importContext(f),t.compileDebug&&this.importContext(h),x)try{b=w(b,t)}catch(E){}this.source=b,this.getTplTokens(b,t.rules,this).forEach(function(e){e.type===o.TYPE_STRING?y.parseString(e):y.parseExpression(e)})}return e.prototype.getTplTokens=function(){return o.apply(undefined,arguments)},e.prototype.getEsTokens=function(e){return i(e)},e.prototype.getVariables=function(e){var t=!1;return e.filter(function(e){return"whitespace"!==e.type&&"comment"!==e.type}).filter(function(e){return"name"===e.type&&!t||(t="punctuator"===e.type&&"."===e.value,!1)}).map(function(e){return e.value})},e.prototype.importContext=function(e){var t=this,n="",r=this.internal,i=this.dependencies,o=this.ignore,c=this.context,u=this.options,p=u.imports,l=this.CONTEXT_MAP;y(l,e)||-1!==o.indexOf(e)||(y(r,e)?(n=r[e],y(i,e)&&i[e].forEach(function(e){return t.importContext(e)})):n="$escape"===e||"$each"===e||y(p,e)?a+"."+e:s+"."+e,l[e]=n,c.push({name:e,value:n}))},e.prototype.parseString=function(e){var t=e.value;if(t){var n=f+"+="+b(t);this.scripts.push({source:t,tplToken:e,code:n})}},e.prototype.parseExpression=function(e){var t=this,n=e.value,r=e.script,i=r.output,s=this.options.escape,a=r.code;i&&(a=!1===s||i===o.TYPE_RAW?f+"+="+r.code:f+"+=$escape("+r.code+")");var c=this.getEsTokens(a);this.getVariables(c).forEach(function(e){return t.importContext(e)}),this.scripts.push({source:n,tplToken:e,code:a})},e.prototype.checkExpression=function(e){for(var t=[[/^\s*}[\w\W]*?{?[\s;]*$/,""],[/(^[\w\W]*?\([\w\W]*?(?:=>|\([\w\W]*?\))\s*{[\s;]*$)/,"$1})"],[/(^[\w\W]*?\([\w\W]*?\)\s*{[\s;]*$)/,"$1}"]],n=0;n2&&arguments[2]!==undefined?arguments[2]:{},i=[{type:"string",value:e,line:0,start:0,end:e.length}],o=0;o]/;s.$escape=function(e){return i(r(e))},s.$each=function(e,t){if(Array.isArray(e))for(var n=0,r=e.length;n {{"+n+"}}")};switch("#"===t&&h("#value","@value"),f){case"set":i="var "+c.join("").trim();break;case"if":i="if("+c.join("").trim()+"){";break;case"else":var m=c.indexOf("if");~m?(c.splice(0,m+1),i="}else if("+c.join("").trim()+"){"):i="}else{";break;case"/if":i="}";break;case"each":p=r._split(a),p.shift(),"as"===p[1]&&(h("each object as value index","each object value index"),p.splice(1,1));i="$each("+(p[0]||"$data")+",function("+(p[1]||"$value")+","+(p[2]||"$index")+"){";break;case"/each":i="})";break;case"block":p=r._split(a),p.shift(),i="block("+p.join(",").trim()+",function(){";break;case"/block":i="})";break;case"echo":f="print",h("echo value","value");case"print":case"include":case"extend":if(0!==c.join("").trim().indexOf("(")){p=r._split(a),p.shift(),i=f+"("+p.join(",")+")";break}default:if(~c.indexOf("|")){var d=a.reduce(function(e,t){var n=t.value,r=t.type;return"|"===n?e.push([]):"whitespace"!==r&&"comment"!==r&&(e.length||e.push([]),":"===n&&1===e[e.length-1].length?h("value | filter: argv","value | filter argv"):e[e.length-1].push(t)),e},[]).map(function(e){return r._split(e)});i=d.reduce(function(e,t){var n=t.shift();return t.unshift(e),"$imports."+n+"("+t.join(",")+")"},d.shift().join(" ").trim())}l=l||"escape"}return u.code=i,u.output=l,u},_split:function(e){e=e.filter(function(e){var t=e.type;return"whitespace"!==t&&"comment"!==t});for(var t=0,n=e.shift(),r=/\]|\)/,i=[[n]];t/,use:function(e,t,n,r){return n={"-":"raw","=":"escape","":!1,"==":"raw","=#":"raw"}[n],t&&(r="/*"+r+"*/",n=!1),{code:r,output:n}}};e.exports=r},function(e,t,n){"use strict";var r=n(0),i=function(e,t){if(r){var i,o=n(21).minify,s=t.htmlMinifierOptions,a=t.rules.map(function(e){return e.test});(i=s.ignoreCustomFragments).push.apply(i,a),e=o(e,s)}return e};e.exports=i},function(e,t){!function(e){e.noop=function(){}}("object"==typeof e&&"object"==typeof e.exports?e.exports:window)},function(e,t,n){"use strict";var r=n(0),i=/^\.+\//,o=function(e,t){if(r){var o=n(5),s=t.root,a=t.extname;if(i.test(e)){var c=t.filename,u=!c||e===c,p=u?s:o.dirname(c);e=o.resolve(p,e)}else e=o.resolve(s,e);o.extname(e)||(e+=a)}return e};e.exports=o},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function s(e){var t=e.name,n=e.source,r=e.path,i=e.line,o=e.column,s=e.generated,a=e.message;if(!n)return a;var c=n.split(/\n/),u=Math.max(i-3,0),p=Math.min(c.length,i+3),l=c.slice(u,p).map(function(e,t){var n=t+u+1;return(n===i?" >> ":" ")+n+"| "+e}).join("\n");return(r||"anonymous")+":"+i+":"+o+"\n"+l+"\n\n"+t+": "+a+(s?"\n generated: "+s:"")}var a=function(e){function t(n){r(this,t);var o=i(this,e.call(this,n.message));return o.name="TemplateError",o.message=s(n),Error.captureStackTrace&&Error.captureStackTrace(o,o.constructor),o}return o(t,e),t}(Error);e.exports=a},function(e,t,n){"use strict";e.exports=n(3)}])}); --------------------------------------------------------------------------------