├── .gitattributes
├── .gitignore
├── README.md
├── _config.yml
├── app.js
├── bin
└── www
├── config
├── db_config.json
├── log4js.json
└── system_config.json
├── core
├── common.js
├── logger.js
├── menu_auth.js
├── mysql.js
├── permissions.js
└── util
│ ├── Md5Utils.js
│ ├── RedisUtils.js
│ ├── StringUtils.js
│ ├── VerifyCode.js
│ └── commonUtil.js
├── db
└── db.tar.gz
├── package.json
├── public
├── css
│ ├── AdminLTE.css
│ ├── AdminLTE.min.css
│ ├── adminlte.css.map
│ ├── blue.css
│ ├── bootstrap-select.min.css
│ ├── bootstrap-table.min.css
│ ├── bootstrap.min.css
│ ├── bootstrap.min.css.map
│ ├── dataTables.bootstrap.min.css
│ ├── font-awesome.min.css
│ ├── ionicons.min.css
│ ├── jquery.datetimepicker.css
│ ├── jquery.treegrid.min.css
│ ├── noty.css
│ ├── noty.css.map
│ ├── skins
│ │ ├── _all-skins.css
│ │ ├── _all-skins.min.css
│ │ ├── skin-black-light.css
│ │ ├── skin-black-light.min.css
│ │ ├── skin-black.css
│ │ ├── skin-black.min.css
│ │ ├── skin-blue-light.css
│ │ ├── skin-blue-light.min.css
│ │ ├── skin-blue.css
│ │ ├── skin-blue.min.css
│ │ ├── skin-green-light.css
│ │ ├── skin-green-light.min.css
│ │ ├── skin-green.css
│ │ ├── skin-green.min.css
│ │ ├── skin-purple-light.css
│ │ ├── skin-purple-light.min.css
│ │ ├── skin-purple.css
│ │ ├── skin-purple.min.css
│ │ ├── skin-red-light.css
│ │ ├── skin-red-light.min.css
│ │ ├── skin-red.css
│ │ ├── skin-red.min.css
│ │ ├── skin-yellow-light.css
│ │ ├── skin-yellow-light.min.css
│ │ ├── skin-yellow.css
│ │ └── skin-yellow.min.css
│ ├── style.css
│ └── ztree
│ │ ├── img
│ │ ├── diy
│ │ │ ├── 1_close.png
│ │ │ ├── 1_open.png
│ │ │ ├── 2.png
│ │ │ ├── 3.png
│ │ │ ├── 4.png
│ │ │ ├── 5.png
│ │ │ ├── 6.png
│ │ │ ├── 7.png
│ │ │ ├── 8.png
│ │ │ └── 9.png
│ │ ├── line_conn.gif
│ │ ├── loading.gif
│ │ ├── zTreeStandard.gif
│ │ └── zTreeStandard.png
│ │ └── zTreeStyle.css
├── fonts
│ ├── FontAwesome.otf
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.svg
│ ├── fontawesome-webfont.ttf
│ ├── fontawesome-webfont.woff
│ ├── fontawesome-webfont.woff2
│ ├── glyphicons-halflings-regular.eot
│ ├── glyphicons-halflings-regular.svg
│ ├── glyphicons-halflings-regular.ttf
│ ├── glyphicons-halflings-regular.woff
│ ├── glyphicons-halflings-regular.woff2
│ ├── ionicons.eot
│ ├── ionicons.svg
│ ├── ionicons.ttf
│ └── ionicons.woff
├── images
│ ├── bg.jpg
│ ├── blue.png
│ ├── blue@2x.png
│ ├── favicon.ico
│ ├── loading.gif
│ ├── loading
│ │ ├── loading-spinner-blue.gif
│ │ ├── loading-spinner-default.gif
│ │ ├── loading-spinner-grey.gif
│ │ └── loading.gif
│ ├── login.png
│ ├── menu.png
│ ├── menu_auth.png
│ ├── user2-160x160.jpg
│ ├── user3-128x128.jpg
│ ├── user4-128x128.jpg
│ └── welcome.png
├── javascripts
│ ├── adminlte.min.js
│ ├── app.js
│ ├── app_iframe.js
│ ├── axios.min.js
│ ├── bootstrap-select.min.js
│ ├── bootstrap-table-treegrid.js
│ ├── bootstrap-table.min.js
│ ├── bootstrap.min.js
│ ├── chartjs
│ │ ├── Chart.js
│ │ └── Chart.min.js
│ ├── ckeditor
│ │ ├── CHANGES.md
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── adapters
│ │ │ └── jquery.js
│ │ ├── build-config.js
│ │ ├── ckeditor.js
│ │ ├── config.js
│ │ ├── contents.css
│ │ ├── lang
│ │ │ ├── af.js
│ │ │ ├── ar.js
│ │ │ ├── bg.js
│ │ │ ├── bn.js
│ │ │ ├── bs.js
│ │ │ ├── ca.js
│ │ │ ├── cs.js
│ │ │ ├── cy.js
│ │ │ ├── da.js
│ │ │ ├── de-ch.js
│ │ │ ├── de.js
│ │ │ ├── el.js
│ │ │ ├── en-au.js
│ │ │ ├── en-ca.js
│ │ │ ├── en-gb.js
│ │ │ ├── en.js
│ │ │ ├── eo.js
│ │ │ ├── es.js
│ │ │ ├── et.js
│ │ │ ├── eu.js
│ │ │ ├── fa.js
│ │ │ ├── fi.js
│ │ │ ├── fo.js
│ │ │ ├── fr-ca.js
│ │ │ ├── fr.js
│ │ │ ├── gl.js
│ │ │ ├── gu.js
│ │ │ ├── he.js
│ │ │ ├── hi.js
│ │ │ ├── hr.js
│ │ │ ├── hu.js
│ │ │ ├── id.js
│ │ │ ├── is.js
│ │ │ ├── it.js
│ │ │ ├── ja.js
│ │ │ ├── ka.js
│ │ │ ├── km.js
│ │ │ ├── ko.js
│ │ │ ├── ku.js
│ │ │ ├── lt.js
│ │ │ ├── lv.js
│ │ │ ├── mk.js
│ │ │ ├── mn.js
│ │ │ ├── ms.js
│ │ │ ├── nb.js
│ │ │ ├── nl.js
│ │ │ ├── no.js
│ │ │ ├── pl.js
│ │ │ ├── pt-br.js
│ │ │ ├── pt.js
│ │ │ ├── ro.js
│ │ │ ├── ru.js
│ │ │ ├── si.js
│ │ │ ├── sk.js
│ │ │ ├── sl.js
│ │ │ ├── sq.js
│ │ │ ├── sr-latn.js
│ │ │ ├── sr.js
│ │ │ ├── sv.js
│ │ │ ├── th.js
│ │ │ ├── tr.js
│ │ │ ├── tt.js
│ │ │ ├── ug.js
│ │ │ ├── uk.js
│ │ │ ├── vi.js
│ │ │ ├── zh-cn.js
│ │ │ └── zh.js
│ │ ├── plugins
│ │ │ ├── a11yhelp
│ │ │ │ └── dialogs
│ │ │ │ │ ├── a11yhelp.js
│ │ │ │ │ └── lang
│ │ │ │ │ ├── _translationstatus.txt
│ │ │ │ │ ├── af.js
│ │ │ │ │ ├── ar.js
│ │ │ │ │ ├── bg.js
│ │ │ │ │ ├── ca.js
│ │ │ │ │ ├── cs.js
│ │ │ │ │ ├── cy.js
│ │ │ │ │ ├── da.js
│ │ │ │ │ ├── de-ch.js
│ │ │ │ │ ├── de.js
│ │ │ │ │ ├── el.js
│ │ │ │ │ ├── en-gb.js
│ │ │ │ │ ├── en.js
│ │ │ │ │ ├── eo.js
│ │ │ │ │ ├── es.js
│ │ │ │ │ ├── et.js
│ │ │ │ │ ├── eu.js
│ │ │ │ │ ├── fa.js
│ │ │ │ │ ├── fi.js
│ │ │ │ │ ├── fo.js
│ │ │ │ │ ├── fr-ca.js
│ │ │ │ │ ├── fr.js
│ │ │ │ │ ├── gl.js
│ │ │ │ │ ├── gu.js
│ │ │ │ │ ├── he.js
│ │ │ │ │ ├── hi.js
│ │ │ │ │ ├── hr.js
│ │ │ │ │ ├── hu.js
│ │ │ │ │ ├── id.js
│ │ │ │ │ ├── it.js
│ │ │ │ │ ├── ja.js
│ │ │ │ │ ├── km.js
│ │ │ │ │ ├── ko.js
│ │ │ │ │ ├── ku.js
│ │ │ │ │ ├── lt.js
│ │ │ │ │ ├── lv.js
│ │ │ │ │ ├── mk.js
│ │ │ │ │ ├── mn.js
│ │ │ │ │ ├── nb.js
│ │ │ │ │ ├── nl.js
│ │ │ │ │ ├── no.js
│ │ │ │ │ ├── pl.js
│ │ │ │ │ ├── pt-br.js
│ │ │ │ │ ├── pt.js
│ │ │ │ │ ├── ro.js
│ │ │ │ │ ├── ru.js
│ │ │ │ │ ├── si.js
│ │ │ │ │ ├── sk.js
│ │ │ │ │ ├── sl.js
│ │ │ │ │ ├── sq.js
│ │ │ │ │ ├── sr-latn.js
│ │ │ │ │ ├── sr.js
│ │ │ │ │ ├── sv.js
│ │ │ │ │ ├── th.js
│ │ │ │ │ ├── tr.js
│ │ │ │ │ ├── tt.js
│ │ │ │ │ ├── ug.js
│ │ │ │ │ ├── uk.js
│ │ │ │ │ ├── vi.js
│ │ │ │ │ ├── zh-cn.js
│ │ │ │ │ └── zh.js
│ │ │ ├── about
│ │ │ │ └── dialogs
│ │ │ │ │ ├── about.js
│ │ │ │ │ ├── hidpi
│ │ │ │ │ └── logo_ckeditor.png
│ │ │ │ │ └── logo_ckeditor.png
│ │ │ ├── clipboard
│ │ │ │ └── dialogs
│ │ │ │ │ └── paste.js
│ │ │ ├── dialog
│ │ │ │ └── dialogDefinition.js
│ │ │ ├── icons.png
│ │ │ ├── icons_hidpi.png
│ │ │ ├── image
│ │ │ │ ├── dialogs
│ │ │ │ │ └── image.js
│ │ │ │ └── images
│ │ │ │ │ └── noimage.png
│ │ │ ├── link
│ │ │ │ ├── dialogs
│ │ │ │ │ ├── anchor.js
│ │ │ │ │ └── link.js
│ │ │ │ └── images
│ │ │ │ │ ├── anchor.png
│ │ │ │ │ └── hidpi
│ │ │ │ │ └── anchor.png
│ │ │ ├── magicline
│ │ │ │ └── images
│ │ │ │ │ ├── hidpi
│ │ │ │ │ ├── icon-rtl.png
│ │ │ │ │ └── icon.png
│ │ │ │ │ ├── icon-rtl.png
│ │ │ │ │ └── icon.png
│ │ │ ├── pastefromword
│ │ │ │ └── filter
│ │ │ │ │ └── default.js
│ │ │ ├── scayt
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.md
│ │ │ │ ├── README.md
│ │ │ │ └── dialogs
│ │ │ │ │ ├── options.js
│ │ │ │ │ └── toolbar.css
│ │ │ ├── specialchar
│ │ │ │ └── dialogs
│ │ │ │ │ ├── lang
│ │ │ │ │ ├── _translationstatus.txt
│ │ │ │ │ ├── af.js
│ │ │ │ │ ├── ar.js
│ │ │ │ │ ├── bg.js
│ │ │ │ │ ├── ca.js
│ │ │ │ │ ├── cs.js
│ │ │ │ │ ├── cy.js
│ │ │ │ │ ├── da.js
│ │ │ │ │ ├── de-ch.js
│ │ │ │ │ ├── de.js
│ │ │ │ │ ├── el.js
│ │ │ │ │ ├── en-gb.js
│ │ │ │ │ ├── en.js
│ │ │ │ │ ├── eo.js
│ │ │ │ │ ├── es.js
│ │ │ │ │ ├── et.js
│ │ │ │ │ ├── eu.js
│ │ │ │ │ ├── fa.js
│ │ │ │ │ ├── fi.js
│ │ │ │ │ ├── fr-ca.js
│ │ │ │ │ ├── fr.js
│ │ │ │ │ ├── gl.js
│ │ │ │ │ ├── he.js
│ │ │ │ │ ├── hr.js
│ │ │ │ │ ├── hu.js
│ │ │ │ │ ├── id.js
│ │ │ │ │ ├── it.js
│ │ │ │ │ ├── ja.js
│ │ │ │ │ ├── km.js
│ │ │ │ │ ├── ko.js
│ │ │ │ │ ├── ku.js
│ │ │ │ │ ├── lt.js
│ │ │ │ │ ├── lv.js
│ │ │ │ │ ├── nb.js
│ │ │ │ │ ├── nl.js
│ │ │ │ │ ├── no.js
│ │ │ │ │ ├── pl.js
│ │ │ │ │ ├── pt-br.js
│ │ │ │ │ ├── pt.js
│ │ │ │ │ ├── ru.js
│ │ │ │ │ ├── si.js
│ │ │ │ │ ├── sk.js
│ │ │ │ │ ├── sl.js
│ │ │ │ │ ├── sq.js
│ │ │ │ │ ├── sv.js
│ │ │ │ │ ├── th.js
│ │ │ │ │ ├── tr.js
│ │ │ │ │ ├── tt.js
│ │ │ │ │ ├── ug.js
│ │ │ │ │ ├── uk.js
│ │ │ │ │ ├── vi.js
│ │ │ │ │ ├── zh-cn.js
│ │ │ │ │ └── zh.js
│ │ │ │ │ └── specialchar.js
│ │ │ ├── table
│ │ │ │ └── dialogs
│ │ │ │ │ └── table.js
│ │ │ ├── tabletools
│ │ │ │ └── dialogs
│ │ │ │ │ └── tableCell.js
│ │ │ └── wsc
│ │ │ │ ├── LICENSE.md
│ │ │ │ ├── README.md
│ │ │ │ └── dialogs
│ │ │ │ ├── ciframe.html
│ │ │ │ ├── tmpFrameset.html
│ │ │ │ ├── wsc.css
│ │ │ │ ├── wsc.js
│ │ │ │ └── wsc_ie.js
│ │ ├── samples
│ │ │ ├── css
│ │ │ │ └── samples.css
│ │ │ ├── img
│ │ │ │ ├── github-top.png
│ │ │ │ ├── header-bg.png
│ │ │ │ ├── header-separator.png
│ │ │ │ ├── logo.png
│ │ │ │ └── navigation-tip.png
│ │ │ ├── index.html
│ │ │ ├── js
│ │ │ │ ├── sample.js
│ │ │ │ └── sf.js
│ │ │ ├── old
│ │ │ │ ├── ajax.html
│ │ │ │ ├── api.html
│ │ │ │ ├── appendto.html
│ │ │ │ ├── assets
│ │ │ │ │ ├── inlineall
│ │ │ │ │ │ └── logo.png
│ │ │ │ │ ├── outputxhtml
│ │ │ │ │ │ └── outputxhtml.css
│ │ │ │ │ ├── posteddata.php
│ │ │ │ │ ├── sample.jpg
│ │ │ │ │ └── uilanguages
│ │ │ │ │ │ └── languages.js
│ │ │ │ ├── datafiltering.html
│ │ │ │ ├── dialog
│ │ │ │ │ ├── assets
│ │ │ │ │ │ └── my_dialog.js
│ │ │ │ │ └── dialog.html
│ │ │ │ ├── divreplace.html
│ │ │ │ ├── enterkey
│ │ │ │ │ └── enterkey.html
│ │ │ │ ├── htmlwriter
│ │ │ │ │ ├── assets
│ │ │ │ │ │ └── outputforflash
│ │ │ │ │ │ │ ├── outputforflash.fla
│ │ │ │ │ │ │ ├── outputforflash.swf
│ │ │ │ │ │ │ └── swfobject.js
│ │ │ │ │ ├── outputforflash.html
│ │ │ │ │ └── outputhtml.html
│ │ │ │ ├── index.html
│ │ │ │ ├── inlineall.html
│ │ │ │ ├── inlinebycode.html
│ │ │ │ ├── inlinetextarea.html
│ │ │ │ ├── jquery.html
│ │ │ │ ├── magicline
│ │ │ │ │ └── magicline.html
│ │ │ │ ├── readonly.html
│ │ │ │ ├── replacebyclass.html
│ │ │ │ ├── replacebycode.html
│ │ │ │ ├── sample.css
│ │ │ │ ├── sample.js
│ │ │ │ ├── sample_posteddata.php
│ │ │ │ ├── tabindex.html
│ │ │ │ ├── toolbar
│ │ │ │ │ └── toolbar.html
│ │ │ │ ├── uicolor.html
│ │ │ │ ├── uilanguages.html
│ │ │ │ ├── wysiwygarea
│ │ │ │ │ └── fullpage.html
│ │ │ │ └── xhtmlstyle.html
│ │ │ └── toolbarconfigurator
│ │ │ │ ├── css
│ │ │ │ └── fontello.css
│ │ │ │ ├── font
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── config.json
│ │ │ │ ├── fontello.eot
│ │ │ │ ├── fontello.svg
│ │ │ │ ├── fontello.ttf
│ │ │ │ └── fontello.woff
│ │ │ │ ├── index.html
│ │ │ │ ├── js
│ │ │ │ ├── abstracttoolbarmodifier.js
│ │ │ │ ├── fulltoolbareditor.js
│ │ │ │ ├── toolbarmodifier.js
│ │ │ │ └── toolbartextmodifier.js
│ │ │ │ └── lib
│ │ │ │ └── codemirror
│ │ │ │ ├── LICENSE
│ │ │ │ ├── codemirror.css
│ │ │ │ ├── codemirror.js
│ │ │ │ ├── javascript.js
│ │ │ │ ├── neo.css
│ │ │ │ ├── show-hint.css
│ │ │ │ └── show-hint.js
│ │ ├── skins
│ │ │ └── moono
│ │ │ │ ├── dialog.css
│ │ │ │ ├── dialog_ie.css
│ │ │ │ ├── dialog_ie7.css
│ │ │ │ ├── dialog_ie8.css
│ │ │ │ ├── dialog_iequirks.css
│ │ │ │ ├── editor.css
│ │ │ │ ├── editor_gecko.css
│ │ │ │ ├── editor_ie.css
│ │ │ │ ├── editor_ie7.css
│ │ │ │ ├── editor_ie8.css
│ │ │ │ ├── editor_iequirks.css
│ │ │ │ ├── icons.png
│ │ │ │ ├── icons_hidpi.png
│ │ │ │ ├── images
│ │ │ │ ├── arrow.png
│ │ │ │ ├── close.png
│ │ │ │ ├── hidpi
│ │ │ │ │ ├── close.png
│ │ │ │ │ ├── lock-open.png
│ │ │ │ │ ├── lock.png
│ │ │ │ │ └── refresh.png
│ │ │ │ ├── lock-open.png
│ │ │ │ ├── lock.png
│ │ │ │ ├── refresh.png
│ │ │ │ └── spinner.gif
│ │ │ │ └── readme.md
│ │ └── styles.js
│ ├── dashboard.js
│ ├── dataTables.bootstrap.min.js
│ ├── defaults-zh_CN.min.js
│ ├── demo.js
│ ├── html5shiv.min.js
│ ├── icheck.min.js
│ ├── jquery-2.2.3.min.js
│ ├── jquery-ui.min.js
│ ├── jquery.dataTables.min.js
│ ├── jquery.datetimepicker.full.min.js
│ ├── jquery.min.js
│ ├── jquery.qubit.js
│ ├── jquery.slimscroll.min.js
│ ├── jquery.treegrid.min.js
│ ├── jquery.ztree.all.min.js
│ ├── md5.js
│ ├── moment.min.js
│ ├── noty.min.js
│ ├── noty.min.js.map
│ └── respond.min.js
└── service
│ ├── login_log_manage.js
│ ├── menu_manage.js
│ ├── menu_role_manage.js
│ ├── operation_log_manage.js
│ ├── role_manage.js
│ ├── user_manage.js
│ └── user_role_manage.js
├── routes
├── index.js
├── login.js
├── login_log.js
├── menu_role.js
├── menus.js
├── operation_log.js
├── roles.js
├── user_role.js
├── users.js
└── verify.js
├── test
├── mysql.js
└── test.js
└── views
├── 401.ejs
├── content.ejs
├── error.ejs
├── index.ejs
├── login.ejs
├── login_log.ejs
├── menu.ejs
├── menu_role.ejs
├── notice.ejs
├── operation_log.ejs
├── partials
├── footer.ejs
├── header.ejs
├── iframe_footer.ejs
├── iframe_header.ejs
└── sidebar.ejs
├── role.ejs
├── user.ejs
└── user_role.ejs
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.js linguist-language=JavaScript
2 | *.css linguist-language=JavaScript
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24 | .grunt
25 |
26 | # Bower dependency directory (https://bower.io/)
27 | bower_components
28 |
29 | # node-waf configuration
30 | .lock-wscript
31 |
32 | # Compiled binary addons (http://nodejs.org/api/addons.html)
33 | build/Release
34 |
35 | # Dependency directories
36 | node_modules/
37 | jspm_packages/
38 |
39 | # Typescript v1 declaration files
40 | typings/
41 |
42 | # Optional npm cache directory
43 | .npm
44 |
45 | # Optional eslint cache
46 | .eslintcache
47 |
48 | # Optional REPL history
49 | .node_repl_history
50 |
51 | # Output of 'npm pack'
52 | *.tgz
53 |
54 | # Yarn Integrity file
55 | .yarn-integrity
56 |
57 | # dotenv environment variables file
58 | .env
59 |
60 | logs
61 |
62 | .idea
63 |
64 | vcs.xml
65 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # express-admin
2 | ```
3 | 一个基于NodeJS Express Bootstrap 框架的后台管理系统,包括登录,角色,菜单权限等。
4 | redis: v3.0+,
5 | nodejs: v8.0+
6 | ```
7 | # 下载地址
8 | https://github.com/wangbinlml/express-admin
9 |
10 | # Demo地址
11 |
12 | http://a.chenxun.org
13 | username: test
14 | password: test
15 |
16 |
17 | # 安装
18 | ```
19 | git clone https://github.com/wangbinlml/express-admin.git
20 | cd express-admin
21 | npm install
22 | 打开浏览器访问:http://127.0.0.1:3000 (3000端口可在system_config.json中配置)
23 |
24 | 注:图片验证码使用canvas;安装请参考官网教程(https://github.com/Automattic/node-canvas)
25 | ```
26 | #配置数据库
27 | ```
28 | {
29 | "mysql": {
30 | "host": "127.0.0.1",
31 | "user": "root",
32 | "password": "",
33 | "database": "demo",
34 | "port": 3306,
35 | "connectionLimit": 50,
36 | "acquireTimeout": 10000,
37 | "charset": "utf8"
38 | },
39 | "redis": {
40 | "cluster": false,
41 | "connect_info": [
42 | {
43 | "port": 6379,
44 | "host": "127.0.0.1"
45 | }
46 | ]
47 | }
48 | }
49 | ```
50 | #数据库文件
51 | ```
52 | db/db.tar.gz
53 | db/change.sql
54 | ```
55 | # Todo List
56 | - [X] 用户登录
57 | - [X] 登录验证码
58 | - [X] 用户管理
59 | - [x] 菜单管理
60 | - [x] 权限管理
61 | - [x] 用户角色管理
62 | - [x] 菜单权限管理
63 | - [x] 实例数据库
64 | - [x] 菜单管理加入table tree
65 | - [x] 权限设置加入ztree
66 | - [x] 菜单以tab方式打开,可以同时展示多个页面
67 | - [ ] 操作权限管理
68 |
69 | # 界面预览
70 |
71 | 1.登录
72 | --
73 | 
74 |
75 | 1.首页
76 | --
77 | 
78 |
79 | 3.菜单管理
80 | --
81 | 
82 |
83 | 4.权限设置
84 | --
85 | 
86 |
87 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-architect
--------------------------------------------------------------------------------
/bin/www:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /**
4 | * Module dependencies.
5 | */
6 |
7 | var log = require('../core/logger').getLogger("system");
8 | var app = require('../app');
9 | var debug = require('debug')('express-admin:server');
10 | var http = require('http');
11 | var commonUtil = require('../core/util/commonUtil');
12 | var systemConfig = require(commonUtil.getConfigPath() + "/system_config");
13 |
14 | /**
15 | * Get port from environment and store in Express.
16 | */
17 |
18 | var port = normalizePort(process.env.PORT || systemConfig.application_port || '3000');
19 | app.set('port', port);
20 |
21 | /**
22 | * Create HTTP server.
23 | */
24 |
25 | var server = http.createServer(app);
26 |
27 | /**
28 | * Listen on provided port, on all network interfaces.
29 | */
30 |
31 | server.listen(port);
32 | server.on('error', onError);
33 | server.on('listening', onListening);
34 |
35 | /**
36 | * Normalize a port into a number, string, or false.
37 | */
38 |
39 | function normalizePort(val) {
40 | var port = parseInt(val, 10);
41 |
42 | if (isNaN(port)) {
43 | // named pipe
44 | return val;
45 | }
46 |
47 | if (port >= 0) {
48 | // port number
49 | return port;
50 | }
51 |
52 | return false;
53 | }
54 |
55 | /**
56 | * Event listener for HTTP server "error" event.
57 | */
58 |
59 | function onError(error) {
60 | if (error.syscall !== 'listen') {
61 | throw error;
62 | }
63 |
64 | var bind = typeof port === 'string'
65 | ? 'Pipe ' + port
66 | : 'Port ' + port;
67 |
68 | // handle specific listen errors with friendly messages
69 | switch (error.code) {
70 | case 'EACCES':
71 | console.error(bind + ' requires elevated privileges');
72 | log.error(bind + ' requires elevated privileges');
73 | process.exit(1);
74 | break;
75 | case 'EADDRINUSE':
76 | console.error(bind + ' is already in use');
77 | log.error(bind + ' is already in use');
78 | process.exit(1);
79 | break;
80 | default:
81 | throw error;
82 | }
83 | }
84 |
85 | /**
86 | * Event listener for HTTP server "listening" event.
87 | */
88 |
89 | function onListening() {
90 | var addr = server.address();
91 | var bind = typeof addr === 'string'
92 | ? 'pipe ' + addr
93 | : 'port ' + addr.port;
94 | debug('Listening on ' + bind);
95 | log.info('Listening on ' + bind);
96 | }
97 |
--------------------------------------------------------------------------------
/config/db_config.json:
--------------------------------------------------------------------------------
1 | {
2 | "mysql": {
3 | "host": "192.168.1.6",
4 | "user": "root",
5 | "password": "root",
6 | "database": "demo",
7 | "port": 3306,
8 | "connectionLimit": 50,
9 | "acquireTimeout": 10000,
10 | "charset": "utf8",
11 | "db_prefix": "bs_"
12 | },
13 | "mongodb": {
14 | "db_type": "mongodb",
15 | "db_host": [
16 | "192.168.1.6:27017"
17 | ],
18 | "db_name": "demo",
19 | "db_replica_set": ""
20 | },
21 | "redis": {
22 | "cluster": false,
23 | "connect_info": [
24 | {
25 | "port": 6379,
26 | "host": "192.168.1.6"
27 | }
28 | ]
29 | }
30 | }
--------------------------------------------------------------------------------
/config/log4js.json:
--------------------------------------------------------------------------------
1 | {
2 | "appenders": {
3 | "console": {
4 | "type": "console"
5 | },
6 | "express": {
7 | "type": "console"
8 | },
9 | "systemLog": {
10 | "type": "dateFile",
11 | "filename": "logs/access.log",
12 | "pattern": "-yyyy-MM-dd",
13 | "alwaysIncludePattern": false
14 | }
15 | },
16 | "categories": {
17 | "default": {
18 | "appenders": [
19 | "console"
20 | ],
21 | "level": "info"
22 | },
23 | "express": {
24 | "appenders": [
25 | "express"
26 | ],
27 | "level": "info"
28 | },
29 | "system": {
30 | "appenders": [
31 | "console",
32 | "systemLog"
33 | ],
34 | "level": "debug"
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/config/system_config.json:
--------------------------------------------------------------------------------
1 | {
2 | "application_port": 3000,
3 | "session_time_out_minute": 360
4 | }
5 |
--------------------------------------------------------------------------------
/core/common.js:
--------------------------------------------------------------------------------
1 | const stringUtils = require("./util/StringUtils");
2 | const mysql = require('./mysql');
3 | const log = require('../core/logger').getLogger("system");
4 | module.exports.saveLoginLog = async(req) => {
5 | var user = req.session.user;
6 | var ip = stringUtils.getReqRemoteIp(req);
7 | log.info("客户端用户IP:",ip);
8 | await mysql.query("insert into bs_login_log(user_id,user_name,name,ip,login_time) values(?,?,?,?,?)", [user.id, user.user_name, user.name, ip, new Date()]);
9 | };
10 | module.exports.saveOperateLog = async(req, operations) => {
11 | var user = req.session.user;
12 | await mysql.query("insert into bs_operation_logs(user_id,user_name,name,operations,operate_time) values(?,?,?,?,?)", [user.id, user.user_name, user.name, operations, new Date()]);
13 | };
--------------------------------------------------------------------------------
/core/logger.js:
--------------------------------------------------------------------------------
1 | var log4js = require('log4js');
2 | var commonUtil = require('./util/commonUtil');
3 | log4js.configure(commonUtil.getConfigPath() + '/log4js.json');
4 |
5 | exports.getLogger=function(category){
6 | return log4js.getLogger(category);
7 | };
8 |
--------------------------------------------------------------------------------
/core/permissions.js:
--------------------------------------------------------------------------------
1 | const mysql = require('./mysql');
2 | const log = require('./logger').getLogger("system");
3 | const _ = require('lodash');
4 | const stringUtils = require('../core/util/StringUtils');
5 |
6 | /**
7 | * 根据菜单ID获取操作权限
8 | * @param req
9 | * @param user_id
10 | * @param menu_id
11 | * @return {Promise
50 | This sample shows how to create and destroy CKEditor instances on the fly. After the removal of CKEditor the content created inside the editing
51 | area will be displayed in a
54 | For details of how to create this setup check the source code of this sample page
55 | for JavaScript code responsible for the creation and destruction of a CKEditor instance.
56 | Click the buttons to create and remove a CKEditor instance.
60 |
61 |
62 |
23 | The
48 | This sample shows how to use the
49 |
53 | For details on how to create this setup check the source code of this sample page.
54 |
41 | * 加密方式:将密码+固定盐值(SALT)先进行md5得到二进制字节数组后再进行Base64加密得到密文结果
42 | * @param password 明文密码
43 | * @returns 加密密码
44 | */
45 | module.exports.generatePassword = function (password) {
46 | return crypto.createHash("md5").update(password + PASSWORD_SALT).digest("base64");
47 | };
48 |
49 |
50 | /**
51 | * 随机生成头像背景色
52 | * @returns {string}背景色
53 | */
54 | module.exports.generateHeadColor = function () {
55 | return HEAD_COLOR_ARR[Math.floor(Math.random() * HEAD_COLOR_ARR.length)];
56 | };
57 |
58 |
59 | /**
60 | * 根据指定的字符串生成本系统所需加密密码
61 | * @param str 字符串
62 | * @returns {string}加密密码
63 | */
64 | module.exports.createPassword = function (str) {
65 | return crypto.createHash("md5").update(str + SYSTEM_PASSWORD_SALT).digest("base64");
66 | };
67 |
68 |
69 | module.exports.md5 = function (text) {
70 | return crypto.createHash('md5').update(text).digest('hex');
71 | };
72 | module.exports.getReqRemoteIp = function (req) {
73 | var ip = req.headers["x-real-ip"] || req.ip;
74 | return ip;
75 | };
76 | /*
77 | * 递归遍历
78 | * @param data array
79 | * @param id int
80 | * return array
81 | * */
82 | exports.MenuRecursion = (data, parent_id) => {
83 | let list = [];
84 | for (let index = 0; index < data.length; index++) {
85 | let obj = data[ index ];
86 | let v = {
87 | menu_id: obj.menu_id,
88 | menu_name: obj.menu_name,
89 | menu_url: obj.menu_url,
90 | parent_id: obj.parent_id,
91 | menu_icon: obj.menu_icon,
92 | type: obj.type
93 | };
94 | if (parent_id == obj[ 'parent_id' ]) {
95 | v[ 'menu_child' ] = this.MenuRecursion(data, obj[ 'menu_id' ]);
96 | list.push(v);
97 | }
98 | }
99 | return list;
100 | };
101 |
102 | exports.sidebarRecursion = (data, parent_id) => {
103 | let list = [];
104 | for (let index = 0; index < data.length; index++) {
105 | let obj = data[ index ];
106 | let v = {
107 | id: obj.menu_id,
108 | text: obj.menu_name,
109 | url: obj.menu_url,
110 | parent_id: obj.parent_id,
111 | icon: obj.menu_icon,
112 | targetType: 'iframe-tab',
113 | type: obj.type
114 | };
115 | if (parent_id == obj[ 'parent_id' ]) {
116 | v[ 'children' ] = this.sidebarRecursion(data, obj[ 'menu_id' ]);
117 | list.push(v);
118 | }
119 | }
120 | return list;
121 | };
122 |
--------------------------------------------------------------------------------
/core/util/VerifyCode.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Description: 图片验证码
3 | * Created by wangbin.
4 | * Date: 16-9-5
5 | * Time: 上午11:42
6 | */
7 | var Canvas = require('canvas');
8 | /*
9 | * get random float value amount [start, end)
10 | */
11 | var randFloat = function(start, end) {
12 | return start + Math.random() * (end - start);
13 | };
14 |
15 | /*
16 | * get random integer value amount [start, end)
17 | */
18 | var randInt = function(start, end) {
19 | return Math.floor(Math.random() * (end - start)) + start;
20 | };
21 |
22 | exports.Generate = function(random, W, H, font) {
23 | var W = W || 90;
24 | var H = H || 25;
25 | var canvas = new Canvas(W, H);
26 | var ctx = canvas.getContext('2d');
27 | var items = 'abcdefghjkmnpqrstuvwxyz23456789'.split('');
28 | var vcode = '';
29 |
30 | ctx.rotate(0);
31 | ctx.fillStyle = '#fff';
32 | ctx.fillRect(0, 0, W, H);
33 | ctx.globalAlpha = 1;
34 | //ctx.font = '15px sans-serif';
35 |
36 | for (var i = 0; i < 10; i++) {
37 | ctx.fillStyle = 'rgb(' + randInt(150, 225) + ',' + randInt(150, 225) + ',' + randInt(150, 225) + ')';
38 | for (var j = 0; j < random+1; j++) {
39 | ctx.fillText(items[randInt(0, items.length)], randFloat(-10, W + 10), randFloat(-10, H + 10));
40 | }
41 | }
42 |
43 | var color = 'rgb(0,0,0)';
44 | //var color = 'rgb(' + randInt(1, 120) + ',' + randInt(1, 120) + ',' + randInt(1, 120) + ')';
45 | ctx.font = font || 'normal 30px sans-serif';
46 | for (var i = 0; i < random; i++) {
47 | var j = randInt(0, items.length);
48 | ctx.fillStyle = color;
49 | //ctx.fillText(items[j], 15 + i * 50, 50);
50 | ctx.fillText(items[j], 5 + i * 20, 25);
51 | /* var a = randFloat(0.85, 1.0);
52 | var b = randFloat(-0.02, 0.03);
53 | var c = randFloat(-0.1, 0.4);
54 | var d = randFloat(0.85, 1.0);
55 | ctx.transform(a, b, c, d, 0, 0);*/
56 | vcode += items[j];
57 | }
58 |
59 | ctx.beginPath();
60 | ctx.strokeStyle = color;
61 | /*var A = randFloat(10, H / 3);
62 | var b = randFloat(H / 6, 4 * H / 6);
63 | var f = randFloat(H / 6, 4 * H / 6);
64 | var T = randFloat(H * 1.5, W);
65 | var w = 4 * Math.PI / T;
66 | var S = function(x) {
67 | return A * Math.sin(w * x + f) + b;
68 | };
69 | ctx.lineWidth = 5;
70 | for (var x = -20; x < 600; x += random) {
71 | ctx.moveTo(x, S(x));
72 | ctx.lineTo(x + 3, S(x + 3));
73 | }
74 | */
75 | ctx.lineWidth = 5;
76 | ctx.closePath();
77 | ctx.stroke();
78 | //canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'image-src.png')));
79 | return {
80 | code: vcode.toLowerCase(),
81 | dataURL: canvas.toDataURL(),
82 | buffer: canvas.toBuffer()
83 | };
84 | };
--------------------------------------------------------------------------------
/core/util/commonUtil.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 获取配置文件路径
3 | * @returns {string}
4 | */
5 | exports.getConfigPath = function(){
6 | var configPath = process.cwd() + '/config';
7 | var applicationPath = process.argv.splice(4);
8 | if (applicationPath.length > 0) {
9 | applicationPath = applicationPath[0];
10 | applicationPath = applicationPath.split("=");
11 | applicationPath = applicationPath[1];
12 | configPath = applicationPath + '/config';
13 | }
14 | return configPath;
15 | };
--------------------------------------------------------------------------------
/db/db.tar.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/db/db.tar.gz
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "express-admin",
3 | "version": "0.2.2",
4 | "private": true,
5 | "scripts": {
6 | "start": "node ./bin/www"
7 | },
8 | "dependencies": {
9 | "body-parser": "~1.15.1",
10 | "canvas": "^1.6.9",
11 | "connect-redis": "^3.3.0",
12 | "cookie-parser": "~1.4.3",
13 | "ejs": "^2.5.7",
14 | "express": "~4.13.4",
15 | "express-session": "^1.15.4",
16 | "ioredis": "^3.1.2",
17 | "lodash": "^4.17.4",
18 | "log4js": "^2.3.1",
19 | "moment": "^2.18.1",
20 | "mysql": "^2.14.0",
21 | "serve-favicon": "~2.3.0",
22 | "uuid": "^3.2.1"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/public/css/blue.css:
--------------------------------------------------------------------------------
1 | /* iCheck plugin Square skin, blue
2 | ----------------------------------- */
3 | .icheckbox_square-blue,
4 | .iradio_square-blue {
5 | display: inline-block;
6 | *display: inline;
7 | vertical-align: middle;
8 | margin: 0;
9 | padding: 0;
10 | width: 22px;
11 | height: 22px;
12 | background: url(../images/blue.png) no-repeat;
13 | border: none;
14 | cursor: pointer;
15 | }
16 |
17 | .icheckbox_square-blue {
18 | background-position: 0 0;
19 | }
20 | .icheckbox_square-blue.hover {
21 | background-position: -24px 0;
22 | }
23 | .icheckbox_square-blue.checked {
24 | background-position: -48px 0;
25 | }
26 | .icheckbox_square-blue.disabled {
27 | background-position: -72px 0;
28 | cursor: default;
29 | }
30 | .icheckbox_square-blue.checked.disabled {
31 | background-position: -96px 0;
32 | }
33 |
34 | .iradio_square-blue {
35 | background-position: -120px 0;
36 | }
37 | .iradio_square-blue.hover {
38 | background-position: -144px 0;
39 | }
40 | .iradio_square-blue.checked {
41 | background-position: -168px 0;
42 | }
43 | .iradio_square-blue.disabled {
44 | background-position: -192px 0;
45 | cursor: default;
46 | }
47 | .iradio_square-blue.checked.disabled {
48 | background-position: -216px 0;
49 | }
50 |
51 | /* Retina support */
52 | @media only screen and (-webkit-min-device-pixel-ratio: 1.5),
53 | only screen and (-moz-min-device-pixel-ratio: 1.5),
54 | only screen and (-o-min-device-pixel-ratio: 3/2),
55 | only screen and (min-device-pixel-ratio: 1.5) {
56 | .icheckbox_square-blue,
57 | .iradio_square-blue {
58 | background-image: url(blue@2x.png);
59 | -webkit-background-size: 240px 24px;
60 | background-size: 240px 24px;
61 | }
62 | }
--------------------------------------------------------------------------------
/public/css/jquery.treegrid.min.css:
--------------------------------------------------------------------------------
1 | .treegrid-indent{width:16px;height:16px;display:inline-block;position:relative}.treegrid-expander{width:16px;height:16px;display:inline-block;position:relative;cursor:pointer}.treegrid-expander-expanded{background-image:url(../images/collapse.png)}.treegrid-expander-collapsed{background-image:url(../images/expand.png)}
--------------------------------------------------------------------------------
/public/css/noty.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":[],"names":[],"mappings":"","file":"noty.css","sourceRoot":""}
--------------------------------------------------------------------------------
/public/css/skins/skin-black.min.css:
--------------------------------------------------------------------------------
1 | .skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav>li>a:hover,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a,.skin-black .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-black .sidebar-menu>li.active>a{border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-black .sidebar-menu .treeview-menu>li.active>a,.skin-black .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .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-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .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-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222}
--------------------------------------------------------------------------------
/public/css/skins/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,.skin-blue .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-blue .sidebar-menu>li.active>a{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 .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-blue .sidebar-menu .treeview-menu>li.active>a,.skin-blue .sidebar-menu .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}
--------------------------------------------------------------------------------
/public/css/skins/skin-green-light.min.css:
--------------------------------------------------------------------------------
1 | .skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .main-sidebar{border-right:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-green-light .sidebar-menu .treeview-menu>li.active>a,.skin-green-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-green-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .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-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .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}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}
--------------------------------------------------------------------------------
/public/css/skins/skin-green.min.css:
--------------------------------------------------------------------------------
1 | .skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a,.skin-green .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-green .sidebar-menu>li.active>a{border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-green .sidebar-menu .treeview-menu>li.active>a,.skin-green .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .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-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .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}
--------------------------------------------------------------------------------
/public/css/skins/skin-purple.min.css:
--------------------------------------------------------------------------------
1 | .skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a,.skin-purple .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-purple .sidebar-menu>li.active>a{border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-purple .sidebar-menu .treeview-menu>li.active>a,.skin-purple .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .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-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .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}
--------------------------------------------------------------------------------
/public/css/skins/skin-red-light.min.css:
--------------------------------------------------------------------------------
1 | .skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .main-sidebar{border-right:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-red-light .sidebar-menu .treeview-menu>li.active>a,.skin-red-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-red-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .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-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .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}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}
--------------------------------------------------------------------------------
/public/css/skins/skin-red.min.css:
--------------------------------------------------------------------------------
1 | .skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a,.skin-red .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-red .sidebar-menu>li.active>a{border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-red .sidebar-menu .treeview-menu>li.active>a,.skin-red .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .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-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .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}
--------------------------------------------------------------------------------
/public/css/skins/skin-yellow.min.css:
--------------------------------------------------------------------------------
1 | .skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a,.skin-yellow .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-yellow .sidebar-menu>li.active>a{border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-yellow .sidebar-menu .treeview-menu>li.active>a,.skin-yellow .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .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-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .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}
--------------------------------------------------------------------------------
/public/css/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 |
10 | #verify {
11 | float: left;
12 | margin-right: 15px;
13 | width: 70%;
14 | }
15 |
16 | #yzm {
17 | cursor: pointer;
18 | }
19 |
20 | .login-box-msg {
21 | color: red;
22 | }
23 |
24 | .login-page {
25 | background: url("/images/bg.jpg");
26 | }
27 |
28 | .login-logo a{
29 | color: #fff;
30 | }
31 |
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/1_close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/1_close.png
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/1_open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/1_open.png
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/2.png
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/3.png
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/4.png
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/5.png
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/6.png
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/7.png
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/8.png
--------------------------------------------------------------------------------
/public/css/ztree/img/diy/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/diy/9.png
--------------------------------------------------------------------------------
/public/css/ztree/img/line_conn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/line_conn.gif
--------------------------------------------------------------------------------
/public/css/ztree/img/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/loading.gif
--------------------------------------------------------------------------------
/public/css/ztree/img/zTreeStandard.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/zTreeStandard.gif
--------------------------------------------------------------------------------
/public/css/ztree/img/zTreeStandard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/css/ztree/img/zTreeStandard.png
--------------------------------------------------------------------------------
/public/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/public/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/public/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/public/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/public/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/public/fonts/ionicons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/ionicons.eot
--------------------------------------------------------------------------------
/public/fonts/ionicons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/ionicons.ttf
--------------------------------------------------------------------------------
/public/fonts/ionicons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/fonts/ionicons.woff
--------------------------------------------------------------------------------
/public/images/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/bg.jpg
--------------------------------------------------------------------------------
/public/images/blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/blue.png
--------------------------------------------------------------------------------
/public/images/blue@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/blue@2x.png
--------------------------------------------------------------------------------
/public/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/favicon.ico
--------------------------------------------------------------------------------
/public/images/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/loading.gif
--------------------------------------------------------------------------------
/public/images/loading/loading-spinner-blue.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/loading/loading-spinner-blue.gif
--------------------------------------------------------------------------------
/public/images/loading/loading-spinner-default.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/loading/loading-spinner-default.gif
--------------------------------------------------------------------------------
/public/images/loading/loading-spinner-grey.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/loading/loading-spinner-grey.gif
--------------------------------------------------------------------------------
/public/images/loading/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/loading/loading.gif
--------------------------------------------------------------------------------
/public/images/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/login.png
--------------------------------------------------------------------------------
/public/images/menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/menu.png
--------------------------------------------------------------------------------
/public/images/menu_auth.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/menu_auth.png
--------------------------------------------------------------------------------
/public/images/user2-160x160.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/user2-160x160.jpg
--------------------------------------------------------------------------------
/public/images/user3-128x128.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/user3-128x128.jpg
--------------------------------------------------------------------------------
/public/images/user4-128x128.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/user4-128x128.jpg
--------------------------------------------------------------------------------
/public/images/welcome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/images/welcome.png
--------------------------------------------------------------------------------
/public/javascripts/app.js:
--------------------------------------------------------------------------------
1 | var getIds = function () {
2 | var ids = [];
3 | $(".datatable :checked").each(function () {
4 | var id = $(this).val();
5 | if (id === "all") return true;
6 | ids.push(id);
7 | });
8 | return ids;
9 | };
10 | function showSidebarMenu() {
11 | $.ajax({
12 | type: "get",
13 | url: "/sidebar",
14 | error: function (error) {
15 | $(".login-box-msg").text('内部错误,请稍后再试');
16 | new Noty({
17 | type: 'error',
18 | layout: 'topCenter',
19 | text: '内部错误,请稍后再试',
20 | timeout: '2000'
21 | }).show();
22 | },
23 | success: function (result) {
24 | if (result.error) {
25 | $(".login-box-msg").text(result.msg || '获取菜单失败 ');
26 | new Noty({
27 | type: 'error',
28 | layout: 'topCenter',
29 | text: result.msg || '获取菜单失败',
30 | timeout: '2000'
31 | }).show();
32 | } else {
33 | $('.sidebar-menu').sidebarMenu({data: result.data});
34 | }
35 | }
36 | })
37 | }
38 |
--------------------------------------------------------------------------------
/public/javascripts/ckeditor/README.md:
--------------------------------------------------------------------------------
1 | CKEditor 4
2 | ==========
3 |
4 | Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
5 | http://ckeditor.com - See LICENSE.md for license information.
6 |
7 | CKEditor is a text editor to be used inside web pages. It's not a replacement
8 | for desktop text editors like Word or OpenOffice, but a component to be used as
9 | part of web applications and websites.
10 |
11 | ## Documentation
12 |
13 | The full editor documentation is available online at the following address:
14 | http://docs.ckeditor.com
15 |
16 | ## Installation
17 |
18 | Installing CKEditor is an easy task. Just follow these simple steps:
19 |
20 | 1. **Download** the latest version from the CKEditor website:
21 | http://ckeditor.com. You should have already completed this step, but be
22 | sure you have the very latest version.
23 | 2. **Extract** (decompress) the downloaded file into the root of your website.
24 |
25 | **Note:** CKEditor is by default installed in the `ckeditor` folder. You can
26 | place the files in whichever you want though.
27 |
28 | ## Checking Your Installation
29 |
30 | The editor comes with a few sample pages that can be used to verify that
31 | installation proceeded properly. Take a look at the `samples` directory.
32 |
33 | To test your installation, just call the following page at your website:
34 |
35 | http://
43 | CKEditor Samples » Create and Destroy Editor Instances for Ajax Applications
44 |
45 | <div>
element.
52 |
15 | CKEditor Samples » Append To Page Element Using JavaScript Code
16 |
17 | CKEDITOR.appendTo()
method serves to to place editors inside existing DOM elements. Unlike CKEDITOR.replace()
,
24 | a target container to be replaced is no longer necessary. A new editor
25 | instance is inserted directly wherever it is desired.
26 | CKEDITOR.appendTo( 'container_id',
28 | { /* Configuration options to be used. */ }
29 | 'Editor content to be used.'
30 | );
31 |
48 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/public/javascripts/ckeditor/samples/old/assets/inlineall/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/javascripts/ckeditor/samples/old/assets/inlineall/logo.png
--------------------------------------------------------------------------------
/public/javascripts/ckeditor/samples/old/assets/outputxhtml/outputxhtml.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
3 | * For licensing, see LICENSE.md or http://ckeditor.com/license
4 | *
5 | * Styles used by the XHTML 1.1 sample page (xhtml.html).
6 | */
7 |
8 | /**
9 | * Basic definitions for the editing area.
10 | */
11 | body
12 | {
13 | font-family: Arial, Verdana, sans-serif;
14 | font-size: 80%;
15 | color: #000000;
16 | background-color: #ffffff;
17 | padding: 5px;
18 | margin: 0px;
19 | }
20 |
21 | /**
22 | * Core styles.
23 | */
24 |
25 | .Bold
26 | {
27 | font-weight: bold;
28 | }
29 |
30 | .Italic
31 | {
32 | font-style: italic;
33 | }
34 |
35 | .Underline
36 | {
37 | text-decoration: underline;
38 | }
39 |
40 | .StrikeThrough
41 | {
42 | text-decoration: line-through;
43 | }
44 |
45 | .Subscript
46 | {
47 | vertical-align: sub;
48 | font-size: smaller;
49 | }
50 |
51 | .Superscript
52 | {
53 | vertical-align: super;
54 | font-size: smaller;
55 | }
56 |
57 | /**
58 | * Font faces.
59 | */
60 |
61 | .FontComic
62 | {
63 | font-family: 'Comic Sans MS';
64 | }
65 |
66 | .FontCourier
67 | {
68 | font-family: 'Courier New';
69 | }
70 |
71 | .FontTimes
72 | {
73 | font-family: 'Times New Roman';
74 | }
75 |
76 | /**
77 | * Font sizes.
78 | */
79 |
80 | .FontSmaller
81 | {
82 | font-size: smaller;
83 | }
84 |
85 | .FontLarger
86 | {
87 | font-size: larger;
88 | }
89 |
90 | .FontSmall
91 | {
92 | font-size: 8pt;
93 | }
94 |
95 | .FontBig
96 | {
97 | font-size: 14pt;
98 | }
99 |
100 | .FontDouble
101 | {
102 | font-size: 200%;
103 | }
104 |
105 | /**
106 | * Font colors.
107 | */
108 | .FontColor1
109 | {
110 | color: #ff9900;
111 | }
112 |
113 | .FontColor2
114 | {
115 | color: #0066cc;
116 | }
117 |
118 | .FontColor3
119 | {
120 | color: #ff0000;
121 | }
122 |
123 | .FontColor1BG
124 | {
125 | background-color: #ff9900;
126 | }
127 |
128 | .FontColor2BG
129 | {
130 | background-color: #0066cc;
131 | }
132 |
133 | .FontColor3BG
134 | {
135 | background-color: #ff0000;
136 | }
137 |
138 | /**
139 | * Indentation.
140 | */
141 |
142 | .Indent1
143 | {
144 | margin-left: 40px;
145 | }
146 |
147 | .Indent2
148 | {
149 | margin-left: 80px;
150 | }
151 |
152 | .Indent3
153 | {
154 | margin-left: 120px;
155 | }
156 |
157 | /**
158 | * Alignment.
159 | */
160 |
161 | .JustifyLeft
162 | {
163 | text-align: left;
164 | }
165 |
166 | .JustifyRight
167 | {
168 | text-align: right;
169 | }
170 |
171 | .JustifyCenter
172 | {
173 | text-align: center;
174 | }
175 |
176 | .JustifyFull
177 | {
178 | text-align: justify;
179 | }
180 |
181 | /**
182 | * Other.
183 | */
184 |
185 | code
186 | {
187 | font-family: courier, monospace;
188 | background-color: #eeeeee;
189 | padding-left: 1px;
190 | padding-right: 1px;
191 | border: #c0c0c0 1px solid;
192 | }
193 |
194 | kbd
195 | {
196 | padding: 0px 1px 0px 1px;
197 | border-width: 1px 2px 2px 1px;
198 | border-style: solid;
199 | }
200 |
201 | blockquote
202 | {
203 | color: #808080;
204 | }
205 |
--------------------------------------------------------------------------------
/public/javascripts/ckeditor/samples/old/assets/posteddata.php:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
16 | CKEditor — Posted Data
17 |
18 |
19 |
49 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/public/javascripts/ckeditor/samples/old/assets/sample.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbinlml/express-admin/5788ede74c9272e14ca7870b61d6d4f90f0fe749/public/javascripts/ckeditor/samples/old/assets/sample.jpg
--------------------------------------------------------------------------------
/public/javascripts/ckeditor/samples/old/assets/uilanguages/languages.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
3 | For licensing, see LICENSE.md or http://ckeditor.com/license
4 | */
5 | var CKEDITOR_LANGS=function(){var c={af:"Afrikaans",ar:"Arabic",bg:"Bulgarian",bn:"Bengali/Bangla",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German","de-ch":"German (Switzerland)",el:"Greek",en:"English","en-au":"English (Australia)","en-ca":"English (Canadian)","en-gb":"English (United Kingdom)",eo:"Esperanto",es:"Spanish",et:"Estonian",eu:"Basque",fa:"Persian",fi:"Finnish",fo:"Faroese",fr:"French","fr-ca":"French (Canada)",gl:"Galician",gu:"Gujarati",he:"Hebrew",hi:"Hindi",
6 | hr:"Croatian",hu:"Hungarian",id:"Indonesian",is:"Icelandic",it:"Italian",ja:"Japanese",ka:"Georgian",km:"Khmer",ko:"Korean",ku:"Kurdish",lt:"Lithuanian",lv:"Latvian",mk:"Macedonian",mn:"Mongolian",ms:"Malay",nb:"Norwegian Bokmal",nl:"Dutch",no:"Norwegian",pl:"Polish",pt:"Portuguese (Portugal)","pt-br":"Portuguese (Brazil)",ro:"Romanian",ru:"Russian",si:"Sinhala",sk:"Slovak",sq:"Albanian",sl:"Slovenian",sr:"Serbian (Cyrillic)","sr-latn":"Serbian (Latin)",sv:"Swedish",th:"Thai",tr:"Turkish",tt:"Tatar",
7 | ug:"Uighur",uk:"Ukrainian",vi:"Vietnamese",zh:"Chinese Traditional","zh-cn":"Chinese Simplified"},b=[],a;for(a in CKEDITOR.lang.languages)b.push({code:a,name:c[a]||a});b.sort(function(a,b){return a.name
22 |
25 |
26 | $value )
31 | {
32 | if ( ( !is_string($value) && !is_numeric($value) ) || !is_string($key) )
33 | continue;
34 |
35 | if ( get_magic_quotes_gpc() )
36 | $value = htmlspecialchars( stripslashes((string)$value) );
37 | else
38 | $value = htmlspecialchars( (string)$value );
39 | ?>
40 | Field Name
23 | Value
24 |
41 |
44 |
48 |
42 |
43 |
41 | CKEditor Samples » Using the CKEditor Read-Only API
42 |
43 | setReadOnly
50 | API to put editor into the read-only state that makes it impossible for users to change the editor contents.
51 | ' + requires[ i ] + '
' );
22 | }
23 |
24 | if ( missing.length ) {
25 | var warn = CKEDITOR.dom.element.createFromHtml(
26 | '
2 |
3 | -------------------------------------------------------------------------------------------
4 | CKEditor - Posted Data
5 |
6 | We are sorry, but your Web server does not support the PHP language used in this script.
7 |
8 | Please note that CKEditor can be used with any other server-side language than just PHP.
9 | To save the content created with CKEditor you need to read the POST data on the server
10 | side and write it to a file or the database.
11 |
12 | Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
13 | For licensing, see LICENSE.md or http://ckeditor.com/license
14 | -------------------------------------------------------------------------------------------
15 |
16 |
52 | This sample shows how tab key navigation among editor instances is
53 | affected by the tabIndex
attribute from
54 | the original page element. Use TAB key to move between the editors.
55 |
58 | 59 |
60 | 61 |62 | 63 |
64 |65 | 66 |
67 | 77 |*/ include "assets/posteddata.php"; ?> 17 | -------------------------------------------------------------------------------- /public/javascripts/ckeditor/samples/old/tabindex.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |
8 | 9 |
10 | 11 | 12 | 22 | 42 | 43 |
78 |