├── .gitignore ├── README.md ├── app.js ├── controllers ├── file.js ├── index.js └── user.js ├── excel-editor ├── css.css ├── excel.png ├── ext-2.2 │ ├── INCLUDE_ORDER.txt │ ├── adapter │ │ ├── ext │ │ │ └── ext-base.js │ │ ├── jquery │ │ │ ├── ext-jquery-adapter.js │ │ │ └── jquery.js │ │ ├── prototype │ │ │ ├── effects.js │ │ │ ├── ext-prototype-adapter.js │ │ │ ├── prototype.js │ │ │ └── scriptaculous.js │ │ └── yui │ │ │ ├── ext-yui-adapter.js │ │ │ └── yui-utilities.js │ ├── ext-all.js │ ├── license.txt │ └── resources │ │ ├── css │ │ ├── README.txt │ │ ├── borders.css │ │ ├── box.css │ │ ├── button.css │ │ ├── combo.css │ │ ├── core.css │ │ ├── date-picker.css │ │ ├── dd.css │ │ ├── debug.css │ │ ├── dialog.css │ │ ├── editor.css │ │ ├── ext-all.css │ │ ├── form.css │ │ ├── grid.css │ │ ├── layout.css │ │ ├── menu.css │ │ ├── panel.css │ │ ├── progress.css │ │ ├── qtips.css │ │ ├── reset-min.css │ │ ├── reset.css │ │ ├── resizable.css │ │ ├── slider.css │ │ ├── tabs.css │ │ ├── toolbar.css │ │ ├── tree.css │ │ ├── window.css │ │ └── xtheme-gray.css │ │ ├── images │ │ ├── default │ │ │ ├── box │ │ │ │ ├── corners-blue.gif │ │ │ │ ├── corners.gif │ │ │ │ ├── l-blue.gif │ │ │ │ ├── l.gif │ │ │ │ ├── r-blue.gif │ │ │ │ ├── r.gif │ │ │ │ ├── tb-blue.gif │ │ │ │ └── tb.gif │ │ │ ├── button │ │ │ │ ├── btn-arrow.gif │ │ │ │ └── btn-sprite.gif │ │ │ ├── dd │ │ │ │ ├── drop-add.gif │ │ │ │ ├── drop-no.gif │ │ │ │ └── drop-yes.gif │ │ │ ├── editor │ │ │ │ └── tb-sprite.gif │ │ │ ├── form │ │ │ │ ├── checkbox.gif │ │ │ │ ├── clear-trigger.gif │ │ │ │ ├── clear-trigger.psd │ │ │ │ ├── date-trigger.gif │ │ │ │ ├── date-trigger.psd │ │ │ │ ├── error-tip-corners.gif │ │ │ │ ├── exclamation.gif │ │ │ │ ├── radio.gif │ │ │ │ ├── search-trigger.gif │ │ │ │ ├── search-trigger.psd │ │ │ │ ├── text-bg.gif │ │ │ │ ├── trigger-tpl.gif │ │ │ │ ├── trigger.gif │ │ │ │ └── trigger.psd │ │ │ ├── gradient-bg.gif │ │ │ ├── grid │ │ │ │ ├── arrow-left-white.gif │ │ │ │ ├── arrow-right-white.gif │ │ │ │ ├── col-move-bottom.gif │ │ │ │ ├── col-move-top.gif │ │ │ │ ├── columns.gif │ │ │ │ ├── dirty.gif │ │ │ │ ├── done.gif │ │ │ │ ├── drop-no.gif │ │ │ │ ├── drop-yes.gif │ │ │ │ ├── footer-bg.gif │ │ │ │ ├── grid-blue-hd.gif │ │ │ │ ├── grid-blue-split.gif │ │ │ │ ├── grid-hrow.gif │ │ │ │ ├── grid-loading.gif │ │ │ │ ├── grid-split.gif │ │ │ │ ├── grid-vista-hd.gif │ │ │ │ ├── grid3-hd-btn.gif │ │ │ │ ├── grid3-hrow-over.gif │ │ │ │ ├── grid3-hrow.gif │ │ │ │ ├── grid3-special-col-bg.gif │ │ │ │ ├── grid3-special-col-sel-bg.gif │ │ │ │ ├── group-by.gif │ │ │ │ ├── group-expand-sprite.gif │ │ │ │ ├── hd-pop.gif │ │ │ │ ├── hmenu-asc.gif │ │ │ │ ├── hmenu-desc.gif │ │ │ │ ├── hmenu-lock.gif │ │ │ │ ├── hmenu-lock.png │ │ │ │ ├── hmenu-unlock.gif │ │ │ │ ├── hmenu-unlock.png │ │ │ │ ├── invalid_line.gif │ │ │ │ ├── loading.gif │ │ │ │ ├── mso-hd.gif │ │ │ │ ├── nowait.gif │ │ │ │ ├── page-first-disabled.gif │ │ │ │ ├── page-first.gif │ │ │ │ ├── page-last-disabled.gif │ │ │ │ ├── page-last.gif │ │ │ │ ├── page-next-disabled.gif │ │ │ │ ├── page-next.gif │ │ │ │ ├── page-prev-disabled.gif │ │ │ │ ├── page-prev.gif │ │ │ │ ├── pick-button.gif │ │ │ │ ├── refresh.gif │ │ │ │ ├── row-check-sprite.gif │ │ │ │ ├── row-expand-sprite.gif │ │ │ │ ├── row-over.gif │ │ │ │ ├── row-sel.gif │ │ │ │ ├── sort_asc.gif │ │ │ │ ├── sort_desc.gif │ │ │ │ └── wait.gif │ │ │ ├── layout │ │ │ │ ├── collapse.gif │ │ │ │ ├── expand.gif │ │ │ │ ├── gradient-bg.gif │ │ │ │ ├── mini-bottom.gif │ │ │ │ ├── mini-left.gif │ │ │ │ ├── mini-right.gif │ │ │ │ ├── mini-top.gif │ │ │ │ ├── ns-collapse.gif │ │ │ │ ├── ns-expand.gif │ │ │ │ ├── panel-close.gif │ │ │ │ ├── panel-title-bg.gif │ │ │ │ ├── panel-title-light-bg.gif │ │ │ │ ├── stick.gif │ │ │ │ ├── stuck.gif │ │ │ │ ├── tab-close-on.gif │ │ │ │ └── tab-close.gif │ │ │ ├── menu │ │ │ │ ├── checked.gif │ │ │ │ ├── group-checked.gif │ │ │ │ ├── item-over.gif │ │ │ │ ├── menu-parent.gif │ │ │ │ ├── menu.gif │ │ │ │ └── unchecked.gif │ │ │ ├── panel │ │ │ │ ├── corners-sprite.gif │ │ │ │ ├── left-right.gif │ │ │ │ ├── light-hd.gif │ │ │ │ ├── tool-sprite-tpl.gif │ │ │ │ ├── tool-sprites.gif │ │ │ │ ├── tools-sprites-trans.gif │ │ │ │ ├── top-bottom.gif │ │ │ │ ├── top-bottom.png │ │ │ │ ├── white-corners-sprite.gif │ │ │ │ ├── white-left-right.gif │ │ │ │ └── white-top-bottom.gif │ │ │ ├── progress │ │ │ │ └── progress-bg.gif │ │ │ ├── qtip │ │ │ │ ├── bg.gif │ │ │ │ ├── close.gif │ │ │ │ └── tip-sprite.gif │ │ │ ├── s.gif │ │ │ ├── shadow-c.png │ │ │ ├── shadow-c.psd │ │ │ ├── shadow-lr.png │ │ │ ├── shadow.png │ │ │ ├── shared │ │ │ │ ├── blue-loading.gif │ │ │ │ ├── calendar.gif │ │ │ │ ├── glass-bg.gif │ │ │ │ ├── hd-sprite.gif │ │ │ │ ├── large-loading.gif │ │ │ │ ├── left-btn.gif │ │ │ │ ├── loading-balls.gif │ │ │ │ ├── right-btn.gif │ │ │ │ └── warning.gif │ │ │ ├── sizer │ │ │ │ ├── e-handle-dark.gif │ │ │ │ ├── e-handle.gif │ │ │ │ ├── ne-handle-dark.gif │ │ │ │ ├── ne-handle.gif │ │ │ │ ├── nw-handle-dark.gif │ │ │ │ ├── nw-handle.gif │ │ │ │ ├── s-handle-dark.gif │ │ │ │ ├── s-handle.gif │ │ │ │ ├── se-handle-dark.gif │ │ │ │ ├── se-handle.gif │ │ │ │ ├── square.gif │ │ │ │ ├── sw-handle-dark.gif │ │ │ │ └── sw-handle.gif │ │ │ ├── slider │ │ │ │ ├── slider-bg.png │ │ │ │ ├── slider-thumb.png │ │ │ │ ├── slider-v-bg.png │ │ │ │ └── slider-v-thumb.png │ │ │ ├── tabs │ │ │ │ ├── scroll-left.gif │ │ │ │ ├── scroll-right.gif │ │ │ │ ├── scroller-bg.gif │ │ │ │ ├── tab-btm-inactive-left-bg.gif │ │ │ │ ├── tab-btm-inactive-right-bg.gif │ │ │ │ ├── tab-btm-left-bg.gif │ │ │ │ ├── tab-btm-right-bg.gif │ │ │ │ ├── tab-close.gif │ │ │ │ ├── tab-strip-bg.gif │ │ │ │ ├── tab-strip-bg.png │ │ │ │ ├── tab-strip-btm-bg.gif │ │ │ │ └── tabs-sprite.gif │ │ │ ├── toolbar │ │ │ │ ├── bg.gif │ │ │ │ ├── btn-arrow-light.gif │ │ │ │ ├── btn-arrow.gif │ │ │ │ ├── btn-over-bg.gif │ │ │ │ ├── gray-bg.gif │ │ │ │ ├── tb-bg.gif │ │ │ │ └── tb-btn-sprite.gif │ │ │ ├── tree │ │ │ │ ├── arrows.gif │ │ │ │ ├── drop-add.gif │ │ │ │ ├── drop-between.gif │ │ │ │ ├── drop-no.gif │ │ │ │ ├── drop-over.gif │ │ │ │ ├── drop-under.gif │ │ │ │ ├── drop-yes.gif │ │ │ │ ├── elbow-end-minus-nl.gif │ │ │ │ ├── elbow-end-minus.gif │ │ │ │ ├── elbow-end-plus-nl.gif │ │ │ │ ├── elbow-end-plus.gif │ │ │ │ ├── elbow-end.gif │ │ │ │ ├── elbow-line.gif │ │ │ │ ├── elbow-minus-nl.gif │ │ │ │ ├── elbow-minus.gif │ │ │ │ ├── elbow-plus-nl.gif │ │ │ │ ├── elbow-plus.gif │ │ │ │ ├── elbow.gif │ │ │ │ ├── folder-open.gif │ │ │ │ ├── folder.gif │ │ │ │ ├── leaf.gif │ │ │ │ ├── loading.gif │ │ │ │ └── s.gif │ │ │ └── window │ │ │ │ ├── icon-error.gif │ │ │ │ ├── icon-info.gif │ │ │ │ ├── icon-question.gif │ │ │ │ ├── icon-warning.gif │ │ │ │ ├── left-corners.png │ │ │ │ ├── left-corners.psd │ │ │ │ ├── left-right.png │ │ │ │ ├── left-right.psd │ │ │ │ ├── right-corners.png │ │ │ │ ├── right-corners.psd │ │ │ │ ├── top-bottom.png │ │ │ │ └── top-bottom.psd │ │ ├── gray │ │ │ ├── button │ │ │ │ ├── btn-arrow.gif │ │ │ │ └── btn-sprite.gif │ │ │ ├── gradient-bg.gif │ │ │ ├── panel │ │ │ │ ├── corners-sprite.gif │ │ │ │ ├── left-right.gif │ │ │ │ ├── light-hd.gif │ │ │ │ ├── tool-sprite-tpl.gif │ │ │ │ ├── tool-sprites.gif │ │ │ │ ├── tools-sprites-trans.gif │ │ │ │ ├── top-bottom.gif │ │ │ │ ├── top-bottom.png │ │ │ │ ├── white-corners-sprite.gif │ │ │ │ ├── white-left-right.gif │ │ │ │ └── white-top-bottom.gif │ │ │ ├── qtip │ │ │ │ ├── bg.gif │ │ │ │ ├── close.gif │ │ │ │ └── tip-sprite.gif │ │ │ ├── s.gif │ │ │ ├── tabs │ │ │ │ ├── scroll-left.gif │ │ │ │ ├── scroll-right.gif │ │ │ │ ├── scroller-bg.gif │ │ │ │ ├── tab-btm-inactive-left-bg.gif │ │ │ │ ├── tab-btm-inactive-right-bg.gif │ │ │ │ ├── tab-btm-left-bg.gif │ │ │ │ ├── tab-btm-right-bg.gif │ │ │ │ ├── tab-close.gif │ │ │ │ ├── tab-strip-bg.gif │ │ │ │ ├── tab-strip-bg.png │ │ │ │ ├── tab-strip-btm-bg.gif │ │ │ │ └── tabs-sprite.gif │ │ │ ├── toolbar │ │ │ │ ├── bg.gif │ │ │ │ ├── btn-arrow-light.gif │ │ │ │ ├── btn-arrow.gif │ │ │ │ ├── btn-over-bg.gif │ │ │ │ ├── gray-bg.gif │ │ │ │ ├── tb-bg.gif │ │ │ │ └── tb-btn-sprite.gif │ │ │ └── window │ │ │ │ ├── icon-error.gif │ │ │ │ ├── icon-info.gif │ │ │ │ ├── icon-question.gif │ │ │ │ ├── icon-warning.gif │ │ │ │ ├── left-corners.png │ │ │ │ ├── left-corners.pspimage │ │ │ │ ├── left-right.png │ │ │ │ ├── right-corners.png │ │ │ │ └── top-bottom.png │ │ └── vista │ │ │ ├── basic-dialog │ │ │ ├── bg-center.gif │ │ │ ├── bg-left.gif │ │ │ ├── bg-right.gif │ │ │ ├── close.gif │ │ │ ├── collapse.gif │ │ │ ├── dlg-bg.gif │ │ │ ├── e-handle.gif │ │ │ ├── expand.gif │ │ │ ├── hd-sprite.gif │ │ │ ├── s-handle.gif │ │ │ ├── se-handle.gif │ │ │ └── w-handle.gif │ │ │ ├── gradient-bg.gif │ │ │ ├── grid │ │ │ ├── grid-split.gif │ │ │ └── grid-vista-hd.gif │ │ │ ├── layout │ │ │ ├── collapse.gif │ │ │ ├── expand.gif │ │ │ ├── gradient-bg.gif │ │ │ ├── ns-collapse.gif │ │ │ ├── ns-expand.gif │ │ │ ├── panel-close.gif │ │ │ ├── panel-title-bg.gif │ │ │ ├── panel-title-light-bg.gif │ │ │ ├── stick.gif │ │ │ ├── tab-close-on.gif │ │ │ └── tab-close.gif │ │ │ ├── qtip │ │ │ ├── bg.gif │ │ │ └── tip-sprite.gif │ │ │ ├── s.gif │ │ │ ├── sizer │ │ │ ├── e-handle-dark.gif │ │ │ ├── e-handle.gif │ │ │ ├── ne-handle-dark.gif │ │ │ ├── ne-handle.gif │ │ │ ├── nw-handle-dark.gif │ │ │ ├── nw-handle.gif │ │ │ ├── s-handle-dark.gif │ │ │ ├── s-handle.gif │ │ │ ├── se-handle-dark.gif │ │ │ ├── se-handle.gif │ │ │ ├── sw-handle-dark.gif │ │ │ └── sw-handle.gif │ │ │ ├── tabs │ │ │ ├── tab-btm-inactive-left-bg.gif │ │ │ ├── tab-btm-inactive-right-bg.gif │ │ │ ├── tab-btm-left-bg.gif │ │ │ ├── tab-btm-right-bg.gif │ │ │ └── tab-sprite.gif │ │ │ └── toolbar │ │ │ ├── gray-bg.gif │ │ │ └── tb-btn-sprite.gif │ │ └── resources.jsb ├── func.png ├── index.html ├── js │ ├── 6excel.css │ ├── 6excel.js │ ├── 6excel_reserve.js │ ├── bg000000.gif │ ├── btn-arro.gif │ ├── dragCopy.js │ ├── grid-blu.gif │ ├── in-min.js │ ├── logo.gif │ ├── name-sel.png │ ├── select-a.png │ ├── tab-stri.gif │ ├── tabs-spr.gif │ ├── tb-btn-s.gif │ ├── text-bg0.gif │ ├── tip-spri.gif │ ├── tool-spr.gif │ ├── trigger0.gif │ ├── white-to.gif │ ├── white-tp.gif │ └── white-tq.gif ├── themes │ └── 6excel │ │ ├── ie.css │ │ ├── ie7.css │ │ ├── img │ │ ├── cell.cur.ico │ │ ├── col.cur.ico │ │ ├── cursores.jpg │ │ ├── default_cursor.jpg │ │ ├── gelsheet_logo-113x54-transparent.png │ │ ├── gelsheet_logo-113x54.png │ │ ├── gelsheet_logo-132x51-Tab-transparent.png │ │ ├── gelsheet_logo-132x51-Tab.png │ │ ├── gelsheet_logo-85x41.png │ │ ├── gelsheet_logo.png │ │ ├── gray-1px-50.png │ │ ├── icons │ │ │ ├── HTML2-32x32.png │ │ │ ├── ODS-16x16.png │ │ │ ├── ODS-48x48.png │ │ │ ├── PDF-16x16.png │ │ │ ├── PDF-32x32.png │ │ │ ├── XLS-16x16.png │ │ │ ├── XLS-32x32.png │ │ │ ├── XLSX-16x16.png │ │ │ ├── align_center-16x16.gif │ │ │ ├── align_center-16x16.png │ │ │ ├── align_justify-16x16.png │ │ │ ├── align_left-16x16.gif │ │ │ ├── align_left-16x16.png │ │ │ ├── align_right-16x16.gif │ │ │ ├── align_right-16x16.png │ │ │ ├── background-color.png │ │ │ ├── background-color.svg │ │ │ ├── bgcolor-16x16.png │ │ │ ├── bgcolor.png │ │ │ ├── bold-16x16.png │ │ │ ├── bold.png │ │ │ ├── bold.svg │ │ │ ├── border_bottom.png │ │ │ ├── border_left.png │ │ │ ├── border_none.png │ │ │ ├── border_right.png │ │ │ ├── border_top.png │ │ │ ├── close.png │ │ │ ├── decimal-decrease.png │ │ │ ├── decimal-increase.png │ │ │ ├── delete-16x16.png │ │ │ ├── drawing.svg │ │ │ ├── excel_2007_icon.png │ │ │ ├── excel_2007_icon2.png │ │ │ ├── export.png │ │ │ ├── floppy_icon.gif │ │ │ ├── floppy_icon.png │ │ │ ├── font-16x16.png │ │ │ ├── font-color-16x16.png │ │ │ ├── font-color.png │ │ │ ├── font-color.svg │ │ │ ├── font.png │ │ │ ├── fx-16x16.png │ │ │ ├── italic-16x16.png │ │ │ ├── italic.png │ │ │ ├── italic.svg │ │ │ ├── modify-16x16.png │ │ │ ├── name-selector-trigger.png │ │ │ ├── new-16x16.gif │ │ │ ├── new-16x16.png │ │ │ ├── new-32x32.png │ │ │ ├── open-16x16.png │ │ │ ├── open-32x32.png │ │ │ ├── pencil-16x16.png │ │ │ ├── range.png │ │ │ ├── range2.png │ │ │ ├── redo-16x16.png │ │ │ ├── refresh-16x16.png │ │ │ ├── save-16x16.png │ │ │ ├── save-32x32.png │ │ │ ├── save-as-16x16.png │ │ │ ├── saveas-16x16.png │ │ │ ├── saveas-32x32.png │ │ │ ├── separator32x8.png │ │ │ ├── show-formula.png │ │ │ ├── sum.png │ │ │ ├── text2399.png │ │ │ ├── underline-16x16.png │ │ │ ├── underline.png │ │ │ ├── underline.svg │ │ │ ├── undo-16x16.png │ │ │ ├── unformat-16x16.gif │ │ │ ├── valign_button-16x16.gif │ │ │ ├── valign_center-16x16.gif │ │ │ └── valign_top-16x16.gif │ │ ├── row.cur.ico │ │ ├── row.cur2.ico │ │ ├── select-all.png │ │ ├── transp-1px.png │ │ ├── white-left-right.gif │ │ ├── white-top-bottom-dark.gif │ │ ├── white-top-bottom-light.gif │ │ └── white-top-bottom.gif │ │ ├── style.css │ │ └── toolbar.css └── web_excel.manifest ├── file_trans ├── fileTrans.js ├── lib │ ├── jszip │ │ ├── jszip-deflate.js │ │ ├── jszip-inflate.js │ │ ├── jszip-load.js │ │ └── jszip.js │ ├── node-xlsx.js │ └── xlsx │ │ └── xlsx.js ├── sheet1.xlsx └── sheetName.xlsx ├── models └── file.js ├── package.json ├── public ├── images │ ├── btn.jpg │ ├── dialogClose.gif │ ├── excel.jpg │ ├── main_bg_img.gif │ ├── sb_handle.gif │ ├── xbg.gif │ └── zc_btn.jpg ├── javascripts │ ├── fileManage.js │ ├── jquery-1.9.1.js │ └── template.min.js └── stylesheets │ ├── chat.css │ ├── fileManage.css │ └── login.css ├── run.bat ├── test.xlsx ├── test └── dataProducer.js ├── util └── database.js └── views ├── login.jade └── register.jade /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | 10 | pids 11 | logs 12 | results 13 | node_modules 14 | .idea 15 | 16 | npm-debug.log 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | web-excel 2 | ========= 3 | 一个在线多人协同编辑的excel软件 4 | 5 | 支持: 6 | 实时显示他人的编辑 7 | 支持简单的公式 8 | -------------------------------------------------------------------------------- /controllers/index.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | 3 | exports.routes = [ 4 | { 5 | 'pattern': /^(\/|\/index\.html)$/, 6 | 'method': 'get', 7 | 'handler': 'index' 8 | }, 9 | { 10 | 'pattern': ['/doc/:doc'], 11 | 'method': 'get', 12 | 'handler': 'index' 13 | } 14 | ]; 15 | 16 | exports.index = function (req, res) { 17 | if(req.session.userId || req.params.doc){ 18 | fs.readFile('excel-editor/index.html', 'utf-8', function (err, data) { 19 | if (err) { 20 | console.error(err.message); 21 | res.end('error'); 22 | } else { 23 | res.end(data); 24 | } 25 | }); 26 | }else{ 27 | res.redirect('/user/login') 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /controllers/user.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 用户模块 3 | */ 4 | 5 | var database = require('../util/database'), 6 | ObjectID = require('mongodb').ObjectID, 7 | crypto = require('crypto'); 8 | 9 | function md5 (text) { 10 | return crypto.createHash('md5').update(text).digest('hex'); 11 | }; 12 | 13 | exports.routes = [ 14 | { 15 | 'pattern': '/user/login', 16 | 'method': 'get', 17 | 'handler': 'index' 18 | }, 19 | { 20 | 'pattern': '/user/login', 21 | 'method': 'post', 22 | 'handler': 'login' 23 | }, 24 | { 25 | 'pattern': '/user/register', 26 | 'method': 'get', 27 | 'handler': 'showRegister' 28 | }, 29 | { 30 | 'pattern': '/user/register', 31 | 'method': 'post', 32 | 'handler': 'register' 33 | }, 34 | { 35 | 'pattern': '/user/logout', 36 | 'method': 'get', 37 | 'handler': 'logout' 38 | } 39 | ]; 40 | 41 | 42 | /** 43 | * 显示登陆页 44 | * @param req 45 | * @param res 46 | */ 47 | exports.index = function (req, res) { 48 | res.render('login'); 49 | }; 50 | 51 | /** 52 | * 登陆POST请求 53 | * @param req 54 | * @param res 55 | */ 56 | exports.login = function (req, res){ 57 | if(req.body.email && req.body.password){ 58 | database.ready( function ( db) { 59 | db.collection('user', function (err, collection) { 60 | collection.findOne({email:req.body.email}, function (err, item) { 61 | if (err) { 62 | console.error(err.message); 63 | return callback(err); 64 | } 65 | if(item && md5(req.body.password) === item.password){ 66 | req.session.userId = item._id; 67 | req.session.username = item.username; 68 | res.cookie('userId',item._id.toString()); 69 | res.cookie('username',item.username); 70 | res.redirect('/'); 71 | }else{ 72 | res.end('帐号或密码错误'); 73 | } 74 | 75 | }) 76 | }) 77 | }); 78 | }else{ 79 | res.end('请完整填写注册资料'); 80 | } 81 | } 82 | 83 | /** 84 | * 显示注册页 85 | * @param req 86 | * @param res 87 | */ 88 | exports.showRegister = function(req,res){ 89 | res.render('register'); 90 | } 91 | 92 | /** 93 | * 注册POST请求 94 | * @param req 95 | * @param res 96 | */ 97 | exports.register = function(req,res){ 98 | if(req.body.email && req.body.password && req.body.username){ 99 | database.ready(function (db) { 100 | db.collection('user', function (err, collection) { 101 | collection.findOne({email:req.body.email}, function (err, item) { 102 | if (err) { 103 | console.error(err.message); 104 | return callback(err); 105 | } 106 | if(item){ 107 | res.end('该Email已被注册'); 108 | }else{ 109 | collection.insert({ 110 | email:req.body.email, 111 | username:req.body.username, 112 | password:md5(req.body.password) 113 | },function(err,result){ 114 | collection.findOne({email:req.body.email}, function (err, item){ 115 | req.session.userId = item._id; 116 | req.session.username = item.username; 117 | res.cookie('userId',item._id.toString()); 118 | res.cookie('username',item.username); 119 | res.redirect('/'); 120 | }) 121 | }) 122 | } 123 | 124 | }) 125 | }) 126 | }); 127 | }else{ 128 | res.end('请完整填写注册资料'); 129 | } 130 | } 131 | 132 | /** 133 | * 注销 134 | * @param req 135 | * @param res 136 | */ 137 | exports.logout = function (req, res){ 138 | req.session = null; 139 | res.clearCookie('userId'); 140 | res.clearCookie('username'); 141 | res.redirect('/'); 142 | } 143 | -------------------------------------------------------------------------------- /excel-editor/css.css: -------------------------------------------------------------------------------- 1 | #diffSelector{ 2 | border-top:1px solid gray; 3 | border-left:1px solid gray; 4 | border-right:1px solid gray; 5 | box-shadow:2px 2px 5px ; 6 | } 7 | #diffSelector li{ 8 | height:24px; 9 | line-height:24px; 10 | cursor:pointer; 11 | color:gray; 12 | border-bottom:1px solid gray; 13 | } 14 | #diffSelector li:hover{ 15 | background-color:#a0cefe; 16 | } -------------------------------------------------------------------------------- /excel-editor/excel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loviselu/web-excel/11f8e404af94c51bfe053e60106130ce3c9e8fdc/excel-editor/excel.png -------------------------------------------------------------------------------- /excel-editor/ext-2.2/INCLUDE_ORDER.txt: -------------------------------------------------------------------------------- 1 | All adapter related files below are located in 2 | /adapters// of this zip file. 3 | 4 | Your include order should be: 5 | 6 | Ext Stand-alone 7 | ------------------------------------------------------------------- 8 | ext-base.js 9 | ext-all.js (or your choice of files) 10 | 11 | 12 | Yahoo! UI (.12+) 13 | ------------------------------------------------------------------- 14 | yui-utilities.js 15 | ext-yui-adapter.js 16 | ext-all.js (or your choice of files) 17 | 18 | 19 | jQuery (1.1+) 20 | ------------------------------------------------------------------- 21 | jquery.js 22 | ext-jquery-adapter.js 23 | ext-all.js (or your choice of files) 24 | 25 | 26 | Prototype (1.5+) / Scriptaculous (1.7+) 27 | ------------------------------------------------------------------- 28 | prototype.js 29 | scriptaculous.js?load=effects (or whatever you want to load) 30 | ext-prototype-adapter.js 31 | ext-all.js (or your choice of files) 32 | 33 | 34 | 35 | See the examples folders for more examples. -------------------------------------------------------------------------------- /excel-editor/ext-2.2/adapter/prototype/scriptaculous.js: -------------------------------------------------------------------------------- 1 | // script.aculo.us scriptaculous.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008 2 | 3 | // Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining 6 | // a copy of this software and associated documentation files (the 7 | // "Software"), to deal in the Software without restriction, including 8 | // without limitation the rights to use, copy, modify, merge, publish, 9 | // distribute, sublicense, and/or sell copies of the Software, and to 10 | // permit persons to whom the Software is furnished to do so, subject to 11 | // the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be 14 | // included in all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | // 24 | // For details, see the script.aculo.us web site: http://script.aculo.us/ 25 | 26 | var Scriptaculous = { 27 | Version: '1.8.1', 28 | require: function(libraryName) { 29 | // inserting via DOM fails in Safari 2.0, so brute force approach 30 | document.write('