From ee9cd27e6ec072411f47cefd23be3a6374fd6431 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 09:23:49 +1200 Subject: [PATCH 01/57] update readme.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 68c81ff..3ac4663 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ -## 简介 +## DESCRIPTION 一个基于 `Node` + `React` + `Webpack` + `MongoDB` 实现的 ToDoList 应用。 -## 功能: +## FUNCTION - 添加 ToDo - 删除 ToDo -## 安装 +## INSTALL ```js npm install ``` -## 启动 +## START ```js mongod --dbpath D:/mongodb/data ``` @@ -25,7 +25,7 @@ webpack -w npm start ``` -## 相关 +## ABOUT **项目和代码分析** From 89fb1ddd0d935d13b36b26dcc8956d9826ea9cd5 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 09:24:44 +1200 Subject: [PATCH 02/57] update readme.md again --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3ac4663..840ac21 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ ## FUNCTION -- 添加 ToDo -- 删除 ToDo +- Add ToDo +- Delete ToDo ## INSTALL ```js From b3ba466df21b8d6d0feeb7b92919d530f5d1e433 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 09:35:36 +1200 Subject: [PATCH 03/57] change README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 840ac21..08e14e1 100644 --- a/README.md +++ b/README.md @@ -39,5 +39,5 @@ Windows:[http://www.cnblogs.com/wx1993/p/5206587.html]([http://www.cnblogs.com [http://www.cnblogs.com/wx1993/p/6518248.html](http://www.cnblogs.com/wx1993/p/6518248.html?_blank) -## 效果 +## SCREENSHOT ![](https://camo.githubusercontent.com/3e21821d6a9aefbbdf9b0b3625ae5e6c4e0338d2/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3738313436342f3230313730332f3738313436342d32303137303332303134323332393533332d313631373830363535362e706e67) From a53d2cf41706202ee073bbbdf09ff2d940f11c41 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 09:56:45 +1200 Subject: [PATCH 04/57] add travis.yml and some test files --- .travis.yml | 2 ++ hello.js | 7 ++++++ test/hello-test.js | 24 +++++++++++++++++++ ...7\245\344\275\234\346\265\201\347\250\213" | 8 +++++++ 4 files changed, 41 insertions(+) create mode 100644 .travis.yml create mode 100644 hello.js create mode 100644 test/hello-test.js create mode 100644 "test/\345\267\245\344\275\234\346\265\201\347\250\213" diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..d4a0133 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,2 @@ +language: node_js +node_js: "12" diff --git a/hello.js b/hello.js new file mode 100644 index 0000000..d939089 --- /dev/null +++ b/hello.js @@ -0,0 +1,7 @@ +module.exports = function (...rest) { + var sum = 0; + for (let n of rest) { + sum += n; + } + return sum; +}; \ No newline at end of file diff --git a/test/hello-test.js b/test/hello-test.js new file mode 100644 index 0000000..73e11a7 --- /dev/null +++ b/test/hello-test.js @@ -0,0 +1,24 @@ +const assert = require('assert'); + +const sum = require('../hello'); + +describe('#hello.js', () => { + + describe('#sum()', () => { + it('sum() should return 0', () => { + assert.strictEqual(sum(), 0); + }); + + it('sum(1) should return 1', () => { + assert.strictEqual(sum(1), 1); + }); + + it('sum(1, 2) should return 3', () => { + assert.strictEqual(sum(1, 2), 3); + }); + + it('sum(1, 2, 3) should return 6', () => { + assert.strictEqual(sum(1, 2, 3), 6); + }); + }); +}); \ No newline at end of file diff --git "a/test/\345\267\245\344\275\234\346\265\201\347\250\213" "b/test/\345\267\245\344\275\234\346\265\201\347\250\213" new file mode 100644 index 0000000..d5954a0 --- /dev/null +++ "b/test/\345\267\245\344\275\234\346\265\201\347\250\213" @@ -0,0 +1,8 @@ +工作流程 + +1.fork项目 +2.使用workflow工作模式 +3.增加travis-CI调用mocha测试 +4.设置heroku自动发布 +5.增加mlab应用并修改链接 重新提交github 自动发布 +6.完成 \ No newline at end of file From 863478fb5e49fe46171cb95db441086b8949264e Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 10:02:06 +1200 Subject: [PATCH 05/57] only want to CI in mater branch --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index d4a0133..213c5af 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,2 +1,4 @@ language: node_js node_js: "12" +branches: + only: master From 13cd52dfc882fe2a6dd43fadde904df15ca44c27 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 10:45:38 +1200 Subject: [PATCH 06/57] add passing icon --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 08e14e1..20ba46f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build Status](https://travis-ci.org/grr6525/Node-React-MongoDB-TodoList.svg?branch=master)](https://travis-ci.org/grr6525/Node-React-MongoDB-TodoList) + ## DESCRIPTION 一个基于 `Node` + `React` + `Webpack` + `MongoDB` 实现的 ToDoList 应用。 From ed0f444a2b5ea137bbeb309dbb63e87bc7862a23 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 11:13:39 +1200 Subject: [PATCH 07/57] connet mongoDB in mlab --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index eac9fa6..5c792ee 100644 --- a/app.js +++ b/app.js @@ -9,7 +9,7 @@ var index = require('./routes/index'); var users = require('./routes/users'); var mongoose = require('mongoose') -mongoose.connect('mongodb://localhost:27017/todo') +mongoose.connect('mongodb://heroku_bqszzqcw:d1fcgvmgq3astipgea67pquhm3@ds263927.mlab.com:63927/heroku_bqszzqcw') var app = express(); From 20dd6b5af2fd4243d06b23c5826e665525c5538f Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 11:24:51 +1200 Subject: [PATCH 08/57] add gitignore and mocha and chai --- .gitignore | 2 ++ package.json | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5171c54 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +npm-debug.log \ No newline at end of file diff --git a/package.json b/package.json index 105712f..6b4439a 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,13 @@ }, "dependencies": { "body-parser": "~1.16.0", + "chai": "^4.2.0", "cookie-parser": "~1.4.3", "debug": "~2.6.0", "ejs": "~2.5.5", "express": "~4.14.1", "jquery": "^3.1.1", + "mocha": "^6.2.0", "mongoose": "^4.8.6", "morgan": "~1.7.0", "serve-favicon": "~2.3.2" From 0cf702c3821f9207df9514caa71916a852b04958 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 11:34:12 +1200 Subject: [PATCH 09/57] use mocha and chai to test code --- hello.js | 12 +++++------- test/hello-test.js | 24 ------------------------ test/hello.test.js | 8 ++++++++ 3 files changed, 13 insertions(+), 31 deletions(-) delete mode 100644 test/hello-test.js create mode 100644 test/hello.test.js diff --git a/hello.js b/hello.js index d939089..3f2b505 100644 --- a/hello.js +++ b/hello.js @@ -1,7 +1,5 @@ -module.exports = function (...rest) { - var sum = 0; - for (let n of rest) { - sum += n; - } - return sum; -}; \ No newline at end of file +function add(x, y) { + return x + y; + } + + module.exports = add; \ No newline at end of file diff --git a/test/hello-test.js b/test/hello-test.js deleted file mode 100644 index 73e11a7..0000000 --- a/test/hello-test.js +++ /dev/null @@ -1,24 +0,0 @@ -const assert = require('assert'); - -const sum = require('../hello'); - -describe('#hello.js', () => { - - describe('#sum()', () => { - it('sum() should return 0', () => { - assert.strictEqual(sum(), 0); - }); - - it('sum(1) should return 1', () => { - assert.strictEqual(sum(1), 1); - }); - - it('sum(1, 2) should return 3', () => { - assert.strictEqual(sum(1, 2), 3); - }); - - it('sum(1, 2, 3) should return 6', () => { - assert.strictEqual(sum(1, 2, 3), 6); - }); - }); -}); \ No newline at end of file diff --git a/test/hello.test.js b/test/hello.test.js new file mode 100644 index 0000000..6c7715a --- /dev/null +++ b/test/hello.test.js @@ -0,0 +1,8 @@ +var add = require('./add.js'); +var expect = require('chai').expect; + +describe('test for add function', function() { + it('1 + 1 should be 2', function() { + expect(add(1, 1)).to.be.equal(2); + }); +}); \ No newline at end of file From 7de34e1d3dcec1dc62d9959a6a539aa4ca0abe53 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 11:58:14 +1200 Subject: [PATCH 10/57] a simple to use mocha and chai --- test/hello.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/hello.test.js b/test/hello.test.js index 6c7715a..e765e9f 100644 --- a/test/hello.test.js +++ b/test/hello.test.js @@ -1,4 +1,4 @@ -var add = require('./add.js'); +var add = require('./../hello.js'); var expect = require('chai').expect; describe('test for add function', function() { From 628b4c5c47729b6daff7b36b74ab849140b4e50e Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 12:07:22 +1200 Subject: [PATCH 11/57] use mocha test --- package.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6b4439a..837ff08 100644 --- a/package.json +++ b/package.json @@ -3,20 +3,21 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www" + "start": "node ./bin/www", + "test": "mocha test" }, "dependencies": { - "body-parser": "~1.16.0", + "body-parser": "^1.19.0", "chai": "^4.2.0", "cookie-parser": "~1.4.3", "debug": "~2.6.0", "ejs": "~2.5.5", - "express": "~4.14.1", + "express": "^4.17.1", "jquery": "^3.1.1", "mocha": "^6.2.0", "mongoose": "^4.8.6", - "morgan": "~1.7.0", - "serve-favicon": "~2.3.2" + "morgan": "^1.9.1", + "serve-favicon": "^2.5.0" }, "devDependencies": { "babel": "^6.23.0", From 3218bb08ebb98e3a640ce45e327e22ea987d0521 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 18 Aug 2019 12:18:14 +1200 Subject: [PATCH 12/57] update some details about README.md --- README.md | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 20ba46f..ede39ec 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![Build Status](https://travis-ci.org/grr6525/Node-React-MongoDB-TodoList.svg?branch=master)](https://travis-ci.org/grr6525/Node-React-MongoDB-TodoList) ## DESCRIPTION -一个基于 `Node` + `React` + `Webpack` + `MongoDB` 实现的 ToDoList 应用。 +A TODO LIST APPLICATION BASED ON Node-React-express-MongoDB ## FUNCTION @@ -15,13 +15,6 @@ npm install ``` ## START -```js -mongod --dbpath D:/mongodb/data -``` - -```js -webpack -w -``` ```js npm start @@ -29,11 +22,11 @@ npm start ## ABOUT -**项目和代码分析** +**HOW IT WORKS** [http://www.cnblogs.com/wx1993/p/6550111.html](http://www.cnblogs.com/wx1993/p/6550111.html?_blank) -**MongoDB 的安装和配置** +**HOW TO INSTALL MongoDB** Mac:[http://www.cnblogs.com/wx1993/p/5187530.html](http://www.cnblogs.com/wx1993/p/5187530.html?_blank) From b1012d2305c301b714ca4bb60013dfd355326868 Mon Sep 17 00:00:00 2001 From: Jason <52952606+grr6525@users.noreply.github.com> Date: Thu, 10 Oct 2019 14:53:46 +1300 Subject: [PATCH 13/57] Update index.js --- src/pages/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/index.js b/src/pages/index.js index 7375d8c..1f9ed57 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -130,7 +130,7 @@ class Todo extends React.Component { render() { return (
-

Todo List

+

TodoWoCAOList

{ this.state.showTooltip && From 9503775587664dddc13288040818cc8dfc9fc242 Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 10 Oct 2019 16:21:46 +1300 Subject: [PATCH 14/57] change some layout --- public/css/style.css | 32 ++++++++++++++---- public/js/bundle.js | 77 +++++++++++++++++++++++++++++++++----------- src/pages/index.js | 2 +- 3 files changed, 85 insertions(+), 26 deletions(-) diff --git a/public/css/style.css b/public/css/style.css index 5dfd0f0..f52f080 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -13,20 +13,34 @@ button { } .container { - position: absolute; + position:absolute; top: 15%; - right: 15%; + left: 1%; width: 400px; height: 475px; - overflow-x: hidden; - overflow-y: auto; - padding: 20px; + + border: 1px solid #666; + border-radius: 5px; + box-shadow: 5px 5px 20px #000; + background: rgba(60,60,60,0.3); +} + +.container2 { + + position:absolute; + top: 15%; + left: 450px; + width: 800px; + height: 475px; + border: 1px solid #666; border-radius: 5px; box-shadow: 5px 5px 20px #000; background: rgba(60,60,60,0.3); } + + .header h2 { padding: 0; margin: 0; @@ -34,7 +48,13 @@ button { text-align: center; letter-spacing: 1px; } - +.header2 h2 { + padding: 0; + margin: 0; + font-size: 25px; + text-align: center; + letter-spacing: 1px; +} .todoForm { margin: 20px 0 30px 0; } diff --git a/public/js/bundle.js b/public/js/bundle.js index 77db085..4fd60b9 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -9658,25 +9658,64 @@ var Todo = function (_React$Component) { key: 'render', value: function render() { return _react2.default.createElement( - 'div', - { className: 'container' }, - _react2.default.createElement( - 'h2', - { className: 'header' }, - 'Todo List' - ), - _react2.default.createElement( - 'form', - { className: 'todoForm', ref: 'todoForm', onSubmit: this.handleSubmit.bind(this) }, - _react2.default.createElement('input', { ref: 'content', type: 'text', placeholder: 'Type content here...', className: 'todoContent' }), - this.state.showTooltip && _react2.default.createElement( - 'span', - { className: 'tooltip' }, - 'Content is required !' - ) - ), - _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) - ); + 'div', + {classname:'bigcontainer'}, + _react2.default.createElement( + 'div', + { className: 'container' }, + _react2.default.createElement( + 'h2', + { className: 'header' }, + 'Discription' + ), + _react2.default.createElement( + 'input', + { ref: 'content', type:'text', className: 'DiscriptionIn' } + ), + _react2.default.createElement( + 'input', + { ref: 'content', type:'text', className: 'Year1' } + ), + _react2.default.createElement( + 'input', + { ref: 'content', type:'text', className: 'Year2' } + ), + _react2.default.createElement( + 'form', + { className: 'todoForm', ref: 'todoForm', onSubmit: this.handleSubmit.bind(this) }, + _react2.default.createElement('input', { ref: 'content', type: 'text', placeholder: 'Type content here...', className: 'todoContent' }), + this.state.showTooltip && _react2.default.createElement( + 'span', + { className: 'tooltip' }, + 'Content is required !' + ) + ), + _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) + + ), + _react2.default.createElement( + 'div', + { className: 'container2' }, + _react2.default.createElement( + 'h2', + { className: 'header' }, + 'Result' + ), + + _react2.default.createElement( + 'form', + { className: 'todoForm', ref: 'todoForm', onSubmit: this.handleSubmit.bind(this) }, + _react2.default.createElement('input', { ref: 'content', type: 'text', placeholder: 'Type content here...', className: 'todoContent' }), + this.state.showTooltip && _react2.default.createElement( + 'span', + { className: 'tooltip' }, + 'Content is required !' + ) + ), + _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) + + ) + ); } }]); diff --git a/src/pages/index.js b/src/pages/index.js index 1f9ed57..7375d8c 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -130,7 +130,7 @@ class Todo extends React.Component { render() { return (
-

TodoWoCAOList

+

Todo List

{ this.state.showTooltip && From e419b1c3349d9467d435283529a6f788baf3f4c2 Mon Sep 17 00:00:00 2001 From: Sander Date: Thu, 10 Oct 2019 20:47:44 +1300 Subject: [PATCH 15/57] #2 feature 2 add if conditions --- public/css/style.css | 82 +++++++++++++--- public/js/bundle.js | 227 ++++++++++++++++++++++++++++++++++--------- src/pages/index.js | 9 +- 3 files changed, 252 insertions(+), 66 deletions(-) diff --git a/public/css/style.css b/public/css/style.css index f52f080..03ba608 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -12,7 +12,7 @@ button { cursor: pointer; } -.container { +/* .container { position:absolute; top: 15%; left: 1%; @@ -23,7 +23,7 @@ button { border-radius: 5px; box-shadow: 5px 5px 20px #000; background: rgba(60,60,60,0.3); -} +} */ .container2 { @@ -39,31 +39,87 @@ button { background: rgba(60,60,60,0.3); } +.searchcondition { + position:absolute; + width: 36.2%; + height: 80%; + left: 2%; + border: 1px solid #666; + border-radius: 5px; + box-shadow: 5px 5px 20px #000; + background: rgba(60,60,60,0.3); +} +.searchresult { + position:absolute; + width: 60.8%; + height: 80%; + left: 38.4%; + border: 1px solid #666; + border-radius: 5px; + box-shadow: 5px 5px 20px #000; + background: rgba(60,60,60,0.3); +} -.header h2 { - padding: 0; - margin: 0; - font-size: 25px; - text-align: center; - letter-spacing: 1px; +.layer { + float: none; + align-items:center; + margin-top: 2px; + height: 15%; } -.header2 h2 { - padding: 0; - margin: 0; + +.yeartext { + Float: left; + margin-left:-40px; + width: 30%; + height: 35%; +} + +.divyear { + Float: left; + margin-Left: 5%; + width: 20%; +} + +.ifsection { + margin-left: 5%; + height: 50%; + width: 20%; +} + +.iftext { + margin-left: 5%; + height: 35%; + width: 30%; +} + +.ifbutton { + margin-left: 2px; + height: 55%; + width: 5%; +} + +.conditiontitle { + margin-left: 5%; +} + +.header h2 { + margin-left: 5%; font-size: 25px; text-align: center; letter-spacing: 1px; } + .todoForm { margin: 20px 0 30px 0; + width: 500px; + height: 268px; } .todoContent { - display: block; width: 380px; padding: 10px; - margin-bottom: 20px; + margin-top: 20px; border: none; border-radius: 3px; } diff --git a/public/js/bundle.js b/public/js/bundle.js index 4fd60b9..62c579a 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -9640,7 +9640,7 @@ var Todo = function (_React$Component) { // 生成参数 var newItem = { - content: this.refs.content.value, + content: this.refs.content.value, date: month + "/" + date + " " + hours + ":" + minutes + ":" + seconds }; @@ -9658,64 +9658,201 @@ var Todo = function (_React$Component) { key: 'render', value: function render() { return _react2.default.createElement( - 'div', - {classname:'bigcontainer'}, + 'span', + {classname:'container'}, _react2.default.createElement( 'div', - { className: 'container' }, + { className: 'searchcondition' }, _react2.default.createElement( - 'h2', - { className: 'header' }, - 'Discription' - ), - _react2.default.createElement( - 'input', - { ref: 'content', type:'text', className: 'DiscriptionIn' } - ), - _react2.default.createElement( - 'input', - { ref: 'content', type:'text', className: 'Year1' } - ), - _react2.default.createElement( - 'input', - { ref: 'content', type:'text', className: 'Year2' } + 'div', + {className: 'conditiontitle'}, + _react2.default.createElement( + 'h2', + { className: 'header' }, + 'Discription' + ), ), + _react2.default.createElement( 'form', { className: 'todoForm', ref: 'todoForm', onSubmit: this.handleSubmit.bind(this) }, - _react2.default.createElement('input', { ref: 'content', type: 'text', placeholder: 'Type content here...', className: 'todoContent' }), - this.state.showTooltip && _react2.default.createElement( - 'span', - { className: 'tooltip' }, - 'Content is required !' + _react2.default.createElement( + 'div', + { className:'layer' }, + _react2.default.createElement( + 'div', + {className: 'divyear' }, + 'From' + ), + _react2.default.createElement( + 'input', + { ref: 'content', type: 'text', placeholder: '2018', className: 'yeartext' }), + + _react2.default.createElement( + 'div', + {className: 'divyear' }, + 'TO' + ), + _react2.default.createElement( + 'input', + { ref: 'content', type: 'text', placeholder: '2019', className: 'yeartext' }) + ), + + _react2.default.createElement( + 'div', + { className : 'layer'}, + _react2.default.createElement( + 'select', + { className : 'ifsection'}, + + _react2.default.createElement( + 'option', + { value : 'Article title'}, + 'Article title' + ), + + _react2.default.createElement( + 'option', + { value : 'Article Source'}, + 'Article Source' + ), + + _react2.default.createElement( + 'option', + { value : 'Author'}, + 'Author' + ), + ), + + _react2.default.createElement( + 'select', + { className : 'ifsection'}, + + _react2.default.createElement( + 'option', + { value : 'Contains'}, + 'Contains' + ), + + _react2.default.createElement( + 'option', + { value : 'Not contain'}, + 'Not contain' + ), + + _react2.default.createElement( + 'option', + { value : 'Begins with'}, + 'Begins with' + ), + + _react2.default.createElement( + 'option', + { value : 'End with'}, + 'end with' + ), + + _react2.default.createElement( + 'option', + { value : 'Equal'}, + 'Equal' + ), + ), + + + _react2.default.createElement( + 'input', + { ref: 'content', type: 'text', placeholder: 'value', className: 'iftext' }), + + _react2.default.createElement( + 'button', + { type: 'button', className: 'ifbutton', onClick: this.handleSubmit.bind(this)}, + '+' + ), + _react2.default.createElement( + 'button', + { type: 'button', className: 'ifbutton'}, + '-' + ), + + ) ), _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) - - ), + ), + _react2.default.createElement( 'div', - { className: 'container2' }, + {className: 'searchresult'}, + // _react2.default.createElement( + // 'div', + // { className : 'layer'}, + // _react2.default.createElement( + // 'select', + // { className : 'searchsection'}, + + // _react2.default.createElement( + // 'option', + // { value : 'Contains'}, + // 'Contains' + // ), + + // _react2.default.createElement( + // 'option', + // { value : 'Not contain'}, + // 'Not contain' + // ), + + // _react2.default.createElement( + // 'option', + // { value : 'Begins with'}, + // 'Begins with' + // ), + + // _react2.default.createElement( + // 'option', + // { value : 'End with'}, + // 'end with' + // ), + + // _react2.default.createElement( + // 'option', + // { value : 'Equal'}, + // 'Equal' + // ), + // ), + // ), + + + // _react2.default.createElement( + // 'form', + // { className: 'todoForm', ref: 'todoForm', onSubmit: this.handleSubmit.bind(this) }, + // _react2.default.createElement('input', { ref: 'content', type: 'text', placeholder: 'Type content here...', className: 'todoContent' }), + // this.state.showTooltip && _react2.default.createElement( + // 'span', + // { className: 'tooltip' }, + // 'Content is required !' + // ) + // ), + _react2.default.createElement( - 'h2', - { className: 'header' }, - 'Result' + 'div', + {className: 'conditiontitle'}, + _react2.default.createElement( + 'h2', + { className: 'header' }, + 'Results' + ), ), - - _react2.default.createElement( - 'form', - { className: 'todoForm', ref: 'todoForm', onSubmit: this.handleSubmit.bind(this) }, - _react2.default.createElement('input', { ref: 'content', type: 'text', placeholder: 'Type content here...', className: 'todoContent' }), - this.state.showTooltip && _react2.default.createElement( - 'span', - { className: 'tooltip' }, - 'Content is required !' - ) - ), - _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) - - ) - ); + // _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList}) + // _react2.default.createElement( + // 'textarea', + // {value : this.state.todoList} + + // ) + + ) + ); } }]); diff --git a/src/pages/index.js b/src/pages/index.js index 7375d8c..827f3f9 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -130,14 +130,7 @@ class Todo extends React.Component { render() { return (
-

Todo List

- - - { this.state.showTooltip && - Content is required ! - } - - +
) } From 4638f539f1c325ce0e9d793db14f7b7551fa747e Mon Sep 17 00:00:00 2001 From: Sander Date: Fri, 11 Oct 2019 00:22:47 +1300 Subject: [PATCH 16/57] # feature 3 Saving the search conditions. --- public/css/style.css | 30 ++++++++++++- public/js/bundle.js | 102 +++++++++++++++++++++++++++++-------------- views/index.ejs | 3 +- 3 files changed, 100 insertions(+), 35 deletions(-) diff --git a/public/css/style.css b/public/css/style.css index 03ba608..dced210 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -42,7 +42,7 @@ button { .searchcondition { position:absolute; width: 36.2%; - height: 80%; + height: 70%; left: 2%; border: 1px solid #666; border-radius: 5px; @@ -53,7 +53,7 @@ button { .searchresult { position:absolute; width: 60.8%; - height: 80%; + height: 70%; left: 38.4%; border: 1px solid #666; border-radius: 5px; @@ -68,18 +68,33 @@ button { height: 15%; } +.maintitle{ + float: right; +} + .yeartext { Float: left; margin-left:-40px; width: 30%; height: 35%; } +.yeartext2 { + Float: left; + margin-left:-50px; + width: 30%; + height: 35%; +} .divyear { Float: left; margin-Left: 5%; width: 20%; } +.divyear2 { + Float: left; + margin-Left: 8%; + width: 20%; +} .ifsection { margin-left: 5%; @@ -98,9 +113,20 @@ button { height: 55%; width: 5%; } +.searchbutton { + margin-left: 45.5%; + height: 55%; + width: 25%; +} +.savebutton { + margin-left: 1%; + height: 55%; + width: 25%; +} .conditiontitle { margin-left: 5%; + margin-right: 10%; } .header h2 { diff --git a/public/js/bundle.js b/public/js/bundle.js index 62c579a..5d7b7ef 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -9511,7 +9511,8 @@ var Todo = function (_React$Component) { var _this = _possibleConstructorReturn(this, (Todo.__proto__ || Object.getPrototypeOf(Todo)).call(this, props)); _this.state = { - todoList: [], + todoList: [], + todoListALL:[], showTooltip: false // 控制 tooltip 的显示隐藏 }; return _this; @@ -9526,7 +9527,7 @@ var Todo = function (_React$Component) { // 获取 todolist - }, { + },{ key: '_getTodoList', value: function _getTodoList() { var that = this; @@ -9535,10 +9536,12 @@ var Todo = function (_React$Component) { type: 'get', dataType: 'json', success: function success(data) { + console.log(data); // const todoList = that.todoSort(data) that.setState({ - todoList: data + todoList: data, + todoListALL: data }); }, error: function error(err) { @@ -9655,11 +9658,20 @@ var Todo = function (_React$Component) { }); } }, { + key: '_addcondition', + value: function _addcondition(){ + return _react2.default.createElement( + 'h2', + { className: '123'}, + '12321312' + ) + } + }, { key: 'render', value: function render() { return _react2.default.createElement( 'span', - {classname:'container'}, + {className:'container'}, _react2.default.createElement( 'div', { className: 'searchcondition' }, @@ -9679,23 +9691,24 @@ var Todo = function (_React$Component) { _react2.default.createElement( 'div', { className:'layer' }, - _react2.default.createElement( + _react2.default.createElement( + 'div', + {className: 'divyear' }, + 'From' + ), + _react2.default.createElement( + 'input', + { ref: 'content', type: 'text', placeholder: '2018', className: 'yeartext' }), + + _react2.default.createElement( 'div', - {className: 'divyear' }, - 'From' + {className: 'divyear2' }, + 'TO' ), - _react2.default.createElement( + _react2.default.createElement( 'input', - { ref: 'content', type: 'text', placeholder: '2018', className: 'yeartext' }), - - _react2.default.createElement( - 'div', - {className: 'divyear' }, - 'TO' - ), - _react2.default.createElement( - 'input', - { ref: 'content', type: 'text', placeholder: '2019', className: 'yeartext' }) + { ref: 'content', type: 'text', placeholder: '2019', className: 'yeartext2' } + ) ), _react2.default.createElement( @@ -9758,27 +9771,51 @@ var Todo = function (_React$Component) { 'Equal' ), ), - _react2.default.createElement( 'input', - { ref: 'content', type: 'text', placeholder: 'value', className: 'iftext' }), + { ref: 'content', type: 'text', placeholder: 'value', className: 'iftext' } + ), - _react2.default.createElement( + _react2.default.createElement( 'button', - { type: 'button', className: 'ifbutton', onClick: this.handleSubmit.bind(this)}, + { type: 'button', className: 'ifbutton'}, '+' - ), - _react2.default.createElement( - 'button', - { type: 'button', className: 'ifbutton'}, - '-' - ), - - - ) + ), + _react2.default.createElement( + 'button', + { type: 'button', className: 'ifbutton'}, + '-' + ), + ), + + _react2.default.createElement( + 'div', + { className : 'layer'}, + + _react2.default.createElement( + 'button', + { type: 'button', className: 'searchbutton'}, + 'Search' + ), + _react2.default.createElement( + 'button', + { type: 'button', className: 'savebutton', onClick: this.handleSubmit.bind(this)}, + 'Save' + ), + ), ), - _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) + _react2.default.createElement( + 'div', + {className: 'conditiontitle'}, + _react2.default.createElement( + 'h2', + { className: 'header' }, + 'History' + ), + + _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) + ), ), _react2.default.createElement( @@ -9844,6 +9881,7 @@ var Todo = function (_React$Component) { 'Results' ), ), + // _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList}) // _react2.default.createElement( // 'textarea', diff --git a/views/index.ejs b/views/index.ejs index 3545827..5240865 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -5,7 +5,8 @@ - +

SERLER

+
From 4061b8eeb63fab8d70d960b57ccdaaf25d80cccd Mon Sep 17 00:00:00 2001 From: Sander Date: Fri, 11 Oct 2019 00:32:21 +1300 Subject: [PATCH 17/57] # feature 3 add logo.png --- public/css/style.css | 4 +++- public/images/logo.png | Bin 0 -> 23780 bytes views/index.ejs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 public/images/logo.png diff --git a/public/css/style.css b/public/css/style.css index dced210..37d8181 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -60,7 +60,9 @@ button { box-shadow: 5px 5px 20px #000; background: rgba(60,60,60,0.3); } - +h1{ + font-size: 75px; +} .layer { float: none; align-items:center; diff --git a/public/images/logo.png b/public/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..297fd8cc6c9b2fd16e6980e723ade91112d458ae GIT binary patch literal 23780 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 -

SERLER

+

SERLER

From aab9398d201d91cf2c174dc778cbd2bccffded73 Mon Sep 17 00:00:00 2001 From: Sander Date: Fri, 11 Oct 2019 00:54:16 +1300 Subject: [PATCH 18/57] # feature 2 adjust logo --- public/css/style.css | 15 +++++++++------ views/index.ejs | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/public/css/style.css b/public/css/style.css index 37d8181..ab1ef22 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -42,7 +42,7 @@ button { .searchcondition { position:absolute; width: 36.2%; - height: 70%; + height: 75%; left: 2%; border: 1px solid #666; border-radius: 5px; @@ -53,7 +53,7 @@ button { .searchresult { position:absolute; width: 60.8%; - height: 70%; + height: 75%; left: 38.4%; border: 1px solid #666; border-radius: 5px; @@ -61,7 +61,7 @@ button { background: rgba(60,60,60,0.3); } h1{ - font-size: 75px; + font-size: 55px; } .layer { float: none; @@ -73,6 +73,9 @@ h1{ .maintitle{ float: right; } +.logo{ + margin-top: -40px; +} .yeartext { Float: left; @@ -82,7 +85,7 @@ h1{ } .yeartext2 { Float: left; - margin-left:-50px; + margin-left:-56px; width: 30%; height: 35%; } @@ -140,8 +143,8 @@ h1{ .todoForm { margin: 20px 0 30px 0; - width: 500px; - height: 268px; + width: 99%; + height: 40%; } .todoContent { diff --git a/views/index.ejs b/views/index.ejs index f8c6abb..e095ecb 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -5,7 +5,7 @@ -

SERLER

+

SERLER

From 31000abb0e21fe20b89866f197a39af3b6b58e97 Mon Sep 17 00:00:00 2001 From: Jason Date: Fri, 11 Oct 2019 09:06:26 +1300 Subject: [PATCH 19/57] change some details of the page --- public/js/bundle.js | 12 ++++++------ routes/index.js | 11 +++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/public/js/bundle.js b/public/js/bundle.js index 5d7b7ef..aa3cba4 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -9720,20 +9720,20 @@ var Todo = function (_React$Component) { _react2.default.createElement( 'option', - { value : 'Article title'}, - 'Article title' + { value : 'Method'}, + 'Method' ), _react2.default.createElement( 'option', - { value : 'Article Source'}, - 'Article Source' + { value : 'Methodology'}, + 'Methodology' ), _react2.default.createElement( 'option', - { value : 'Author'}, - 'Author' + { value : 'Benifit'}, + 'Benifit' ), ), diff --git a/routes/index.js b/routes/index.js index a9c5765..4074da5 100644 --- a/routes/index.js +++ b/routes/index.js @@ -19,6 +19,17 @@ router.get('/getAllItems', (req, res, next) => { }) }); + +router.get('/getFakeData', (req, res, next) => { + Todo.find({}).sort({'date': -1}).exec((err, todoList) => { + if (err) { + console.log(err); + }else { + res.json(todoList); + } + }) +}); + // 添加todo router.post('/addItem', (req, res, next) => { let newItem = req.body; From 215a6792d7cb095edd5f9f5e317fe29e2f7a7fef Mon Sep 17 00:00:00 2001 From: Jason Date: Fri, 11 Oct 2019 11:08:38 +1300 Subject: [PATCH 20/57] change some spelling mistake --- public/js/bundle.js | 72 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/public/js/bundle.js b/public/js/bundle.js index aa3cba4..01a855b 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -9658,15 +9658,61 @@ var Todo = function (_React$Component) { }); } }, { - key: '_addcondition', - value: function _addcondition(){ - return _react2.default.createElement( - 'h2', - { className: '123'}, - '12321312' - ) - } - }, { + key: 'searchData', + value: function _searchData(){ + + event.preventDefault(); + // 表单输入为空验证 + if (this.refs.contentFrom.value == "") { + this.refs.contentFrom.focus(); + return; + }else if (this.refs.contentEnd.value == "") { + this.refs.contentEnd.focus(); + return; + } + + // 生成参数 + var newItem = { + beginYear: this.refs.contentFrom.value, + endYear:this.refs.contentEnd.value + }; + + console.log(newItem); + //this._onSearchData(newItem); + + + + + } + }, + + { + key: '_onSearchData', + value: function _onSearchData(newItem) { + var that = this; + _jquery2.default.ajax({ + url: '/SearchData', + type: 'get', + dataType: 'json', + data: newItem, + success: function success(data) { + console.log(data); + var todoList = that.todoSort(data); + that.setState({ + todoList: todoList + }); + }, + error: function error(err) { + console.log(err); + } + }); + } + + // 删除 todo + + }, + + { key: 'render', value: function render() { return _react2.default.createElement( @@ -9681,7 +9727,7 @@ var Todo = function (_React$Component) { _react2.default.createElement( 'h2', { className: 'header' }, - 'Discription' + 'Description' ), ), @@ -9698,7 +9744,7 @@ var Todo = function (_React$Component) { ), _react2.default.createElement( 'input', - { ref: 'content', type: 'text', placeholder: '2018', className: 'yeartext' }), + { ref: 'contentFrom', type: 'text', placeholder: '2018', className: 'yeartext' }), _react2.default.createElement( 'div', @@ -9707,7 +9753,7 @@ var Todo = function (_React$Component) { ), _react2.default.createElement( 'input', - { ref: 'content', type: 'text', placeholder: '2019', className: 'yeartext2' } + { ref: 'contentEnd', type: 'text', placeholder: '2019', className: 'yeartext2' } ) ), @@ -9795,7 +9841,7 @@ var Todo = function (_React$Component) { _react2.default.createElement( 'button', - { type: 'button', className: 'searchbutton'}, + { type: 'button', className: 'searchbutton',onClick: this.searchData.bind(this)}, 'Search' ), _react2.default.createElement( From 0d71417c2f25f1fa1a2caea2573d7d6b53e779f6 Mon Sep 17 00:00:00 2001 From: Jason Date: Fri, 11 Oct 2019 19:46:20 +1300 Subject: [PATCH 21/57] change the route --- routes/index.js | 31 +++++++++++++++++++------------ routes/users.js | 2 +- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/routes/index.js b/routes/index.js index 4074da5..2b53943 100644 --- a/routes/index.js +++ b/routes/index.js @@ -4,7 +4,7 @@ var Todo = require('../src/models/todo') router.get('/', (req, res, next) => { res.render('index', { - title: 'React TodoList' + title: 'SERLER' }); }); @@ -19,17 +19,6 @@ router.get('/getAllItems', (req, res, next) => { }) }); - -router.get('/getFakeData', (req, res, next) => { - Todo.find({}).sort({'date': -1}).exec((err, todoList) => { - if (err) { - console.log(err); - }else { - res.json(todoList); - } - }) -}); - // 添加todo router.post('/addItem', (req, res, next) => { let newItem = req.body; @@ -48,6 +37,24 @@ router.post('/addItem', (req, res, next) => { }) }) + +router.all('/SearchData', (req, res, next) => { + + // let newItem = req.body; + // Todo.find({"context":newItem.beginYear }).sort({'date': -1}).exec((err, todoList) => { + // if (err) { + // console.log(err); + // }else { + // res.json(todoList); + // } + // }) + res.send('GET request to the homepage'); + + +}) + + + // 删除todo router.post('/deleteItem', (req, res, next) => { console.log(req.body); diff --git a/routes/users.js b/routes/users.js index 927484c..48c1172 100644 --- a/routes/users.js +++ b/routes/users.js @@ -3,7 +3,7 @@ var router = express.Router(); router.get('/', (req, res, next) => { res.render('index', { - title: 'React TodoList' + title: 'SERLER' }); }); From 828978c83aed467bb2c3b04ba15a7043899206fb Mon Sep 17 00:00:00 2001 From: Jason Date: Fri, 11 Oct 2019 20:11:09 +1300 Subject: [PATCH 22/57] search function done --- public/js/bundle.js | 22 +++++++++++----------- routes/index.js | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/public/js/bundle.js b/public/js/bundle.js index 01a855b..ca40bee 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -9661,24 +9661,24 @@ var Todo = function (_React$Component) { key: 'searchData', value: function _searchData(){ - event.preventDefault(); - // 表单输入为空验证 - if (this.refs.contentFrom.value == "") { - this.refs.contentFrom.focus(); - return; - }else if (this.refs.contentEnd.value == "") { - this.refs.contentEnd.focus(); - return; - } + // event.preventDefault(); + // // 表单输入为空验证 + // if (this.refs.contentFrom.value == "") { + // this.refs.contentFrom.focus(); + // return; + // }else if (this.refs.contentEnd.value == "") { + // this.refs.contentEnd.focus(); + // return; + // } // 生成参数 var newItem = { beginYear: this.refs.contentFrom.value, endYear:this.refs.contentEnd.value }; - + console.log(newItem); - //this._onSearchData(newItem); + this._onSearchData(newItem); diff --git a/routes/index.js b/routes/index.js index 2b53943..4e3a97a 100644 --- a/routes/index.js +++ b/routes/index.js @@ -40,16 +40,16 @@ router.post('/addItem', (req, res, next) => { router.all('/SearchData', (req, res, next) => { - // let newItem = req.body; - // Todo.find({"context":newItem.beginYear }).sort({'date': -1}).exec((err, todoList) => { - // if (err) { - // console.log(err); - // }else { - // res.json(todoList); - // } - // }) - res.send('GET request to the homepage'); - + let beginYear = req.query.beginYear; + let endYear = req.query.endYear; + Todo.find({content: beginYear}).sort({'date': -1}).exec((err, todoList) => { + if (err) { + console.log(err); + }else { + res.json(todoList); + } + }) + // res.json(beginYear + endYear); }) From b586e4039c1e82d1216b0ab67312f2d1e4eeec6a Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 14 Oct 2019 09:38:55 +1300 Subject: [PATCH 23/57] multiple queries --- routes/index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/routes/index.js b/routes/index.js index 4e3a97a..374a4e2 100644 --- a/routes/index.js +++ b/routes/index.js @@ -42,15 +42,13 @@ router.all('/SearchData', (req, res, next) => { let beginYear = req.query.beginYear; let endYear = req.query.endYear; - Todo.find({content: beginYear}).sort({'date': -1}).exec((err, todoList) => { + Todo.find({content:{$in:[beginYear,endYear]}}).sort({'date': -1}).exec((err, todoList) => { if (err) { console.log(err); }else { res.json(todoList); } - }) - // res.json(beginYear + endYear); - + }) }) From 788580d00093784f6e72c6a99205ebc6f04c6efc Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 14 Oct 2019 19:49:00 +1300 Subject: [PATCH 24/57] fix search problem --- public/js/bundle.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/public/js/bundle.js b/public/js/bundle.js index ca40bee..10e9db1 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -9538,7 +9538,7 @@ var Todo = function (_React$Component) { success: function success(data) { console.log(data); - // const todoList = that.todoSort(data) + // const todoList = that.todoSort(data) that.setState({ todoList: data, todoListALL: data @@ -9857,7 +9857,7 @@ var Todo = function (_React$Component) { _react2.default.createElement( 'h2', { className: 'header' }, - 'History' + 'Histories' ), _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) @@ -32092,6 +32092,16 @@ var TodoItem = function (_React$Component) { { className: "itemCont" }, this.props.content ), + _react2.default.createElement( + "span", + { className: "itemMethods" }, + this.props.methods + ), + _react2.default.createElement( + "span", + { className: "itemAuthor" }, + this.props.author + ), _react2.default.createElement( "span", { className: "itemTime" }, @@ -32160,8 +32170,9 @@ var TodoList = function (_React$Component) { // 循环生成每一条 todoItem,并将 delete 方法传递给子组件 var todoItems = todoList.map(function (item, index) { return _react2.default.createElement(_todoItem2.default, { - key: index, - content: item.content, + content: item.publishTime, + methods: item.methods, + author: item.author, date: item.date, onDeleteItem: _this2.props.onDeleteItem }); From 7881c3f7ddb0f398a19f34f863b3928e47dc3a6b Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 14 Oct 2019 19:55:54 +1300 Subject: [PATCH 25/57] add detail of search bar --- public/js/bundle.js | 4 +++- routes/index.js | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/public/js/bundle.js b/public/js/bundle.js index 10e9db1..626cc42 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -9860,7 +9860,7 @@ var Todo = function (_React$Component) { 'Histories' ), - _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) + //_react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) ), ), @@ -9926,6 +9926,8 @@ var Todo = function (_React$Component) { { className: 'header' }, 'Results' ), + _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList, onDeleteItem: this._onDeleteItem.bind(this) }) + ), // _react2.default.createElement(_todoList2.default, { todoList: this.state.todoList}) diff --git a/routes/index.js b/routes/index.js index 374a4e2..9041259 100644 --- a/routes/index.js +++ b/routes/index.js @@ -42,7 +42,7 @@ router.all('/SearchData', (req, res, next) => { let beginYear = req.query.beginYear; let endYear = req.query.endYear; - Todo.find({content:{$in:[beginYear,endYear]}}).sort({'date': -1}).exec((err, todoList) => { + Todo.find({title : {$regex : beginYear}}).sort({'date': -1}).exec((err, todoList) => { if (err) { console.log(err); }else { @@ -52,6 +52,37 @@ router.all('/SearchData', (req, res, next) => { }) +router.get('/addFakeData', (req, res, next) => { + +const newItem={ + + title : 'Pinning Down Variables, and Taking an Agile Approach.', + methods : 'ADD', + source : 'http://eds.b.ebscohost.com.ezproxy.aut.ac.nz/eds/pdfviewer/pdfviewer?vid=12&sid=9b5bb43f-5e08-4432-a1b6-a607f840d694%40sessionmgr103', + PublicationType : 'Academic Journals', + author : 'Torres, Edwin', + addTime : '2019', + publishTime : '2019' + + }; + + + Todo.create(newItem, (err) => { + if (err) { + console.log(err); + }else { + Todo.find({}, (err, todoList) => { + if (err) { + console.log(err); + }else { + res.json(todoList); + } + }); + } + }) +}) + + // 删除todo router.post('/deleteItem', (req, res, next) => { From 9134017ef4d0f4c2f8223d1342fd2107729b3390 Mon Sep 17 00:00:00 2001 From: Sander Date: Tue, 15 Oct 2019 17:19:31 +1300 Subject: [PATCH 26/57] # 1 use a new way to imp the search method and add new function. --- .gitignore | 24 +- README.md | 37 - config/env.js | 91 + config/jest/cssTransform.js | 14 + config/jest/fileTransform.js | 12 + config/paths.js | 55 + config/polyfills.js | 16 + config/webpack.config.dev.js | 265 + config/webpack.config.prod.js | 334 + config/webpackDevServer.config.js | 92 + controller/dept.js | 81 + controller/staff.js | 84 + model/department.js | 4 + model/staff.js | 4 + package-lock.json | 12369 ++++++++++++++++ package.json | 124 +- public/favicon.ico | Bin 0 -> 3870 bytes public/images/logo.jpg | Bin 0 -> 6694 bytes public/index.html | 40 + public/manifest.json | 15 + route/index.js | 16 + schema/department.js | 17 + schema/staff.js | 20 + scripts/build.js | 150 + scripts/start.js | 86 + scripts/test.js | 27 + src/App.css | 272 + src/App.js | 30 + src/App.test.js | 8 + src/components/container/baseDataTree.js | 117 + src/components/content.js | 21 + src/components/g-breadcrumb.js | 26 + src/components/g-filter-dept.js | 36 + src/components/g-filter-letter.js | 63 + src/components/g-headerImg.js | 26 + src/components/g-list.js | 73 + src/components/g-search.js | 12 + src/components/g-selectData.js | 95 + src/components/headerImg.css | 18 + src/components/layout.css | 20 + src/components/layout.js | 37 + src/components/menu.js | 15 + src/css/leftNav.css | 24 + src/css/menu.css | 25 + src/css/tree.css | 66 + src/global/fixHeight.js | 5 + src/global/initBaseData.js | 42 + src/index.css | 70 + src/index.js | 21 + src/logo.svg | 7 + src/pages/att/container/delGroup.js | 26 + src/pages/att/container/groupdetail.js | 77 + src/pages/att/container/groupedit.js | 224 + src/pages/att/container/grouplist.js | 17 + src/pages/att/css/att_group.css | 26 + src/pages/att/group.js | 99 + src/pages/att/index.js | 10 + src/pages/attendence/common.js | 20 + src/pages/attendence/commonList.js | 34 + src/pages/attendence/components/Header.js | 15 + src/pages/attendence/components/MemberList.js | 36 + src/pages/attendence/components/leftNav.js | 12 + src/pages/attendence/components/list.js | 80 + src/pages/attendence/components/listItem.js | 82 + src/pages/attendence/detail.css | 42 + src/pages/attendence/detail.js | 111 + src/pages/attendence/external.js | 23 + src/pages/attendence/externalEdit.css | 7 + src/pages/attendence/externalEdit.js | 263 + src/pages/attendence/externalList.js | 40 + src/pages/attendence/index.js | 15 + src/pages/attendence/list.css | 117 + src/pages/attendence/main.js | 19 + src/pages/attendence/staff.js | 20 + src/pages/attendence/staffList.js | 35 + src/pages/department/deptTree.js | 219 + src/pages/department/index.css | 46 + src/pages/department/index.js | 24 + src/pages/department/list.js | 168 + src/pages/holiday/annual.js | 50 + src/pages/holiday/annual_list.js | 186 + src/pages/holiday/award.js | 188 + src/pages/holiday/components/Main.js | 24 + src/pages/holiday/components/leftNav.js | 13 + src/pages/holiday/container/annualList.js | 18 + .../holiday/container/annualRule_edit.js | 162 + .../holiday/container/annualRule_list.js | 31 + src/pages/holiday/container/awardList.js | 34 + src/pages/holiday/container/dayOffList.js | 36 + .../holiday/container/dayOffRule_edit.js | 116 + .../holiday/container/dayOffRule_show.js | 39 + src/pages/holiday/container/editModel.js | 21 + src/pages/holiday/container/popTip.js | 56 + src/pages/holiday/container/typeList.js | 46 + src/pages/holiday/css/dayoffrule.css | 12 + src/pages/holiday/css/list.css | 3 + src/pages/holiday/day_off.js | 19 + src/pages/holiday/day_off_list.js | 176 + src/pages/holiday/day_off_rule.js | 25 + src/pages/holiday/index.js | 11 + src/pages/holiday/type.js | 166 + src/pages/member/editMenber.js | 124 + src/pages/member/index.css | 9 + src/pages/member/index.js | 119 + src/pages/member/listMember.js | 17 + src/pages/warn/index.css | 13 + src/pages/warn/index.js | 15 + src/registerServiceWorker.js | 108 + src/router/index.js | 10 + src/store/index.js | 11 + src/store/reducer/att/index.js | 61 + src/store/reducer/attrendance/index.js | 113 + src/store/reducer/baseData/index.js | 75 + src/store/reducer/holiday/index.js | 253 + 114 files changed, 19307 insertions(+), 66 deletions(-) create mode 100644 config/env.js create mode 100644 config/jest/cssTransform.js create mode 100644 config/jest/fileTransform.js create mode 100644 config/paths.js create mode 100644 config/polyfills.js create mode 100644 config/webpack.config.dev.js create mode 100644 config/webpack.config.prod.js create mode 100644 config/webpackDevServer.config.js create mode 100644 controller/dept.js create mode 100644 controller/staff.js create mode 100644 model/department.js create mode 100644 model/staff.js create mode 100644 package-lock.json create mode 100644 public/favicon.ico create mode 100644 public/images/logo.jpg create mode 100644 public/index.html create mode 100644 public/manifest.json create mode 100644 route/index.js create mode 100644 schema/department.js create mode 100644 schema/staff.js create mode 100644 scripts/build.js create mode 100644 scripts/start.js create mode 100644 scripts/test.js create mode 100644 src/App.css create mode 100644 src/App.js create mode 100644 src/App.test.js create mode 100644 src/components/container/baseDataTree.js create mode 100644 src/components/content.js create mode 100644 src/components/g-breadcrumb.js create mode 100644 src/components/g-filter-dept.js create mode 100644 src/components/g-filter-letter.js create mode 100644 src/components/g-headerImg.js create mode 100644 src/components/g-list.js create mode 100644 src/components/g-search.js create mode 100644 src/components/g-selectData.js create mode 100644 src/components/headerImg.css create mode 100644 src/components/layout.css create mode 100644 src/components/layout.js create mode 100644 src/components/menu.js create mode 100644 src/css/leftNav.css create mode 100644 src/css/menu.css create mode 100644 src/css/tree.css create mode 100644 src/global/fixHeight.js create mode 100644 src/global/initBaseData.js create mode 100644 src/index.css create mode 100644 src/index.js create mode 100644 src/logo.svg create mode 100644 src/pages/att/container/delGroup.js create mode 100644 src/pages/att/container/groupdetail.js create mode 100644 src/pages/att/container/groupedit.js create mode 100644 src/pages/att/container/grouplist.js create mode 100644 src/pages/att/css/att_group.css create mode 100644 src/pages/att/group.js create mode 100644 src/pages/att/index.js create mode 100644 src/pages/attendence/common.js create mode 100644 src/pages/attendence/commonList.js create mode 100644 src/pages/attendence/components/Header.js create mode 100644 src/pages/attendence/components/MemberList.js create mode 100644 src/pages/attendence/components/leftNav.js create mode 100644 src/pages/attendence/components/list.js create mode 100644 src/pages/attendence/components/listItem.js create mode 100644 src/pages/attendence/detail.css create mode 100644 src/pages/attendence/detail.js create mode 100644 src/pages/attendence/external.js create mode 100644 src/pages/attendence/externalEdit.css create mode 100644 src/pages/attendence/externalEdit.js create mode 100644 src/pages/attendence/externalList.js create mode 100644 src/pages/attendence/index.js create mode 100644 src/pages/attendence/list.css create mode 100644 src/pages/attendence/main.js create mode 100644 src/pages/attendence/staff.js create mode 100644 src/pages/attendence/staffList.js create mode 100644 src/pages/department/deptTree.js create mode 100644 src/pages/department/index.css create mode 100644 src/pages/department/index.js create mode 100644 src/pages/department/list.js create mode 100644 src/pages/holiday/annual.js create mode 100644 src/pages/holiday/annual_list.js create mode 100644 src/pages/holiday/award.js create mode 100644 src/pages/holiday/components/Main.js create mode 100644 src/pages/holiday/components/leftNav.js create mode 100644 src/pages/holiday/container/annualList.js create mode 100644 src/pages/holiday/container/annualRule_edit.js create mode 100644 src/pages/holiday/container/annualRule_list.js create mode 100644 src/pages/holiday/container/awardList.js create mode 100644 src/pages/holiday/container/dayOffList.js create mode 100644 src/pages/holiday/container/dayOffRule_edit.js create mode 100644 src/pages/holiday/container/dayOffRule_show.js create mode 100644 src/pages/holiday/container/editModel.js create mode 100644 src/pages/holiday/container/popTip.js create mode 100644 src/pages/holiday/container/typeList.js create mode 100644 src/pages/holiday/css/dayoffrule.css create mode 100644 src/pages/holiday/css/list.css create mode 100644 src/pages/holiday/day_off.js create mode 100644 src/pages/holiday/day_off_list.js create mode 100644 src/pages/holiday/day_off_rule.js create mode 100644 src/pages/holiday/index.js create mode 100644 src/pages/holiday/type.js create mode 100644 src/pages/member/editMenber.js create mode 100644 src/pages/member/index.css create mode 100644 src/pages/member/index.js create mode 100644 src/pages/member/listMember.js create mode 100644 src/pages/warn/index.css create mode 100644 src/pages/warn/index.js create mode 100644 src/registerServiceWorker.js create mode 100644 src/router/index.js create mode 100644 src/store/index.js create mode 100644 src/store/reducer/att/index.js create mode 100644 src/store/reducer/attrendance/index.js create mode 100644 src/store/reducer/baseData/index.js create mode 100644 src/store/reducer/holiday/index.js diff --git a/.gitignore b/.gitignore index 5171c54..14222eb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,22 @@ -node_modules -npm-debug.log \ No newline at end of file +# See https://help.github.com/ignore-files/ for more about ignoring files. + +# dependencies +/node_modules + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local +../.idea/ + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/README.md b/README.md index ede39ec..8b13789 100644 --- a/README.md +++ b/README.md @@ -1,38 +1 @@ -[![Build Status](https://travis-ci.org/grr6525/Node-React-MongoDB-TodoList.svg?branch=master)](https://travis-ci.org/grr6525/Node-React-MongoDB-TodoList) -## DESCRIPTION -A TODO LIST APPLICATION BASED ON Node-React-express-MongoDB - - -## FUNCTION - -- Add ToDo -- Delete ToDo - -## INSTALL -```js -npm install -``` - -## START - -```js -npm start -``` - -## ABOUT - -**HOW IT WORKS** - -[http://www.cnblogs.com/wx1993/p/6550111.html](http://www.cnblogs.com/wx1993/p/6550111.html?_blank) - -**HOW TO INSTALL MongoDB** - -Mac:[http://www.cnblogs.com/wx1993/p/5187530.html](http://www.cnblogs.com/wx1993/p/5187530.html?_blank) - -Windows:[http://www.cnblogs.com/wx1993/p/5206587.html]([http://www.cnblogs.com/wx1993/p/5206587.html?_blank) - -[http://www.cnblogs.com/wx1993/p/6518248.html](http://www.cnblogs.com/wx1993/p/6518248.html?_blank) - -## SCREENSHOT -![](https://camo.githubusercontent.com/3e21821d6a9aefbbdf9b0b3625ae5e6c4e0338d2/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3738313436342f3230313730332f3738313436342d32303137303332303134323332393533332d313631373830363535362e706e67) diff --git a/config/env.js b/config/env.js new file mode 100644 index 0000000..97b77c9 --- /dev/null +++ b/config/env.js @@ -0,0 +1,91 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const paths = require('./paths'); + +// Make sure that including paths.js after env.js will read .env variables. +delete require.cache[require.resolve('./paths')]; + +const NODE_ENV = process.env.NODE_ENV; +if (!NODE_ENV) { + throw new Error( + 'The NODE_ENV environment variable is required but was not specified.' + ); +} + +// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use +var dotenvFiles = [ + `${paths.dotenv}.${NODE_ENV}.local`, + `${paths.dotenv}.${NODE_ENV}`, + // Don't include `.env.local` for `test` environment + // since normally you expect tests to produce the same + // results for everyone + NODE_ENV !== 'test' && `${paths.dotenv}.local`, + paths.dotenv, +].filter(Boolean); + +// Load environment variables from .env* files. Suppress warnings using silent +// if this file is missing. dotenv will never modify any environment variables +// that have already been set. +// https://github.com/motdotla/dotenv +dotenvFiles.forEach(dotenvFile => { + if (fs.existsSync(dotenvFile)) { + require('dotenv').config({ + path: dotenvFile, + }); + } +}); + +// We support resolving modules according to `NODE_PATH`. +// This lets you use absolute paths in imports inside large monorepos: +// https://github.com/facebookincubator/create-react-app/issues/253. +// It works similar to `NODE_PATH` in Node itself: +// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders +// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. +// Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims. +// https://github.com/facebookincubator/create-react-app/issues/1023#issuecomment-265344421 +// We also resolve them to make sure all tools using them work consistently. +const appDirectory = fs.realpathSync(process.cwd()); +process.env.NODE_PATH = (process.env.NODE_PATH || '') + .split(path.delimiter) + .filter(folder => folder && !path.isAbsolute(folder)) + .map(folder => path.resolve(appDirectory, folder)) + .join(path.delimiter); + +// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be +// injected into the application via DefinePlugin in Webpack configuration. +const REACT_APP = /^REACT_APP_/i; + +function getClientEnvironment(publicUrl) { + const raw = Object.keys(process.env) + .filter(key => REACT_APP.test(key)) + .reduce( + (env, key) => { + env[key] = process.env[key]; + return env; + }, + { + // Useful for determining whether we’re running in production mode. + // Most importantly, it switches React into the correct mode. + NODE_ENV: process.env.NODE_ENV || 'development', + // Useful for resolving the correct path to static assets in `public`. + // For example, . + // This should only be used as an escape hatch. Normally you would put + // images into the `src` and `import` them in code to get their paths. + PUBLIC_URL: publicUrl, + connect_database:'' + } + ); + // Stringify all values so we can feed into Webpack DefinePlugin + const stringified = { + 'process.env': Object.keys(raw).reduce((env, key) => { + env[key] = JSON.stringify(raw[key]); + return env; + }, {}), + }; + + return { raw, stringified }; +} + +module.exports = getClientEnvironment; diff --git a/config/jest/cssTransform.js b/config/jest/cssTransform.js new file mode 100644 index 0000000..f1534f6 --- /dev/null +++ b/config/jest/cssTransform.js @@ -0,0 +1,14 @@ +'use strict'; + +// This is a custom Jest transformer turning style imports into empty objects. +// http://facebook.github.io/jest/docs/tutorial-webpack.html + +module.exports = { + process() { + return 'module.exports = {};'; + }, + getCacheKey() { + // The output is always the same. + return 'cssTransform'; + }, +}; diff --git a/config/jest/fileTransform.js b/config/jest/fileTransform.js new file mode 100644 index 0000000..ffce0da --- /dev/null +++ b/config/jest/fileTransform.js @@ -0,0 +1,12 @@ +'use strict'; + +const path = require('path'); + +// This is a custom Jest transformer turning file imports into filenames. +// http://facebook.github.io/jest/docs/tutorial-webpack.html + +module.exports = { + process(src, filename) { + return `module.exports = ${JSON.stringify(path.basename(filename))};`; + }, +}; diff --git a/config/paths.js b/config/paths.js new file mode 100644 index 0000000..6d16efc --- /dev/null +++ b/config/paths.js @@ -0,0 +1,55 @@ +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const url = require('url'); + +// Make sure any symlinks in the project folder are resolved: +// https://github.com/facebookincubator/create-react-app/issues/637 +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = relativePath => path.resolve(appDirectory, relativePath); + +const envPublicUrl = process.env.PUBLIC_URL; + +function ensureSlash(path, needsSlash) { + const hasSlash = path.endsWith('/'); + if (hasSlash && !needsSlash) { + return path.substr(path, path.length - 1); + } else if (!hasSlash && needsSlash) { + return `${path}/`; + } else { + return path; + } +} + +const getPublicUrl = appPackageJson => + envPublicUrl || require(appPackageJson).homepage; + +// We use `PUBLIC_URL` environment variable or "homepage" field to infer +// "public path" at which the app is served. +// Webpack needs to know it to put the right