95 | 每一位专家都经过严格审核 96 |
107 | {{item.synopsis}} 108 |
114 | 每个项目的交易都有完善的保障 115 |
├── .gitignore ├── README.md ├── back ├── __pycache__ │ └── config.cpython-35.pyc ├── config.py ├── create_db.py ├── extra_nginx.conf ├── extra_uwsgi.ini ├── requirements.txt ├── run.py └── server │ ├── __init__.py │ ├── __pycache__ │ ├── __init__.cpython-35.pyc │ ├── models.cpython-35.pyc │ └── views.cpython-35.pyc │ ├── models.py │ ├── package.json │ ├── payapi.js │ ├── resources │ ├── Recommend.py │ ├── Register.py │ ├── __init__.py │ ├── __pycache__ │ │ ├── Recommend.cpython-35.pyc │ │ ├── Register.cpython-35.pyc │ │ ├── __init__.cpython-35.pyc │ │ ├── account.cpython-35.pyc │ │ ├── addApply.cpython-35.pyc │ │ ├── admin.cpython-35.pyc │ │ ├── applyListShow.cpython-35.pyc │ │ ├── applyUserList.cpython-35.pyc │ │ ├── checkProject.cpython-35.pyc │ │ ├── generatingOrder.cpython-35.pyc │ │ ├── haveInHandListShow.cpython-35.pyc │ │ ├── hellotest.cpython-35.pyc │ │ ├── increase.cpython-35.pyc │ │ ├── login.cpython-35.pyc │ │ ├── myProjectData.cpython-35.pyc │ │ ├── participantInfo.cpython-35.pyc │ │ ├── proPageQuery.cpython-35.pyc │ │ ├── releaseSave.cpython-35.pyc │ │ ├── showBase.cpython-35.pyc │ │ ├── showOrderData.cpython-35.pyc │ │ ├── showReleasePro.cpython-35.pyc │ │ ├── tokenCheck.cpython-35.pyc │ │ ├── update.cpython-35.pyc │ │ ├── updateProgress.cpython-35.pyc │ │ ├── user.cpython-35.pyc │ │ ├── userInfoSave.cpython-35.pyc │ │ └── userInfoShow.cpython-35.pyc │ ├── account.py │ ├── addApply.py │ ├── admin.py │ ├── applyListShow.py │ ├── applyUserList.py │ ├── checkProject.py │ ├── generatingOrder.py │ ├── haveInHandListShow.py │ ├── hellotest.py │ ├── increase.py │ ├── login.py │ ├── myProjectData.py │ ├── participantInfo.py │ ├── proPageQuery.py │ ├── releaseSave.py │ ├── showBase.py │ ├── showOrderData.py │ ├── showReleasePro.py │ ├── tokenCheck.py │ ├── update.py │ ├── updateProgress.py │ ├── user.py │ ├── userInfoSave.py │ └── userInfoShow.py │ ├── server.js │ ├── static │ ├── imgs │ │ ├── 1.jpg │ │ ├── 10.jpg │ │ ├── 11.jpg │ │ ├── 12.jpg │ │ ├── 13.jpg │ │ ├── 15.jpg │ │ ├── 16.jpg │ │ ├── 2.jpg │ │ ├── 3.jpg │ │ ├── 4.jpg │ │ ├── 5.jpg │ │ ├── 6.jpg │ │ ├── 7.jpg │ │ ├── 8.jpg │ │ ├── 9.jpg │ │ ├── adv │ │ │ ├── 1.jpeg │ │ │ ├── 2.jpeg │ │ │ ├── 3.jpeg │ │ │ ├── 4.jpeg │ │ │ └── 5.jpeg │ │ ├── default_head.jpg │ │ ├── genhong.jpeg │ │ ├── project │ │ │ ├── 1.jpg │ │ │ ├── 10.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.jpg │ │ │ ├── 4.jpg │ │ │ └── default_pro.jpg │ │ └── userInfoBanner.jpg │ ├── index.html │ ├── static │ │ ├── css │ │ │ ├── app.3ec500fa903028dd599ec6d3226153e0.css │ │ │ └── app.3ec500fa903028dd599ec6d3226153e0.css.map │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.448c34a.woff2 │ │ │ ├── glyphicons-halflings-regular.e18bbf6.ttf │ │ │ ├── glyphicons-halflings-regular.f4769f9.eot │ │ │ └── glyphicons-halflings-regular.fa27723.woff │ │ ├── img │ │ │ ├── banner1.2281d60.jpg │ │ │ ├── banner2.217bb09.jpg │ │ │ ├── glyphicons-halflings-regular.8988968.svg │ │ │ └── releaseBanner.90fd715.jpg │ │ └── js │ │ │ ├── 0.3810eef52edc2834a094.js │ │ │ ├── 0.3810eef52edc2834a094.js.map │ │ │ ├── 1.16f2ad063021e5b9fd8b.js │ │ │ ├── 1.16f2ad063021e5b9fd8b.js.map │ │ │ ├── 2.7273f10698bb996f5364.js │ │ │ ├── 2.7273f10698bb996f5364.js.map │ │ │ ├── 3.a23f031ef204da550629.js │ │ │ ├── 3.a23f031ef204da550629.js.map │ │ │ ├── 4.23ac00a219dd432f8249.js │ │ │ ├── 4.23ac00a219dd432f8249.js.map │ │ │ ├── 5.474b56893a2b10cec1db.js │ │ │ ├── 5.474b56893a2b10cec1db.js.map │ │ │ ├── 6.4a980e5c3222f50661ce.js │ │ │ ├── 6.4a980e5c3222f50661ce.js.map │ │ │ ├── 7.3f56943d41dcf2173cfc.js │ │ │ ├── 7.3f56943d41dcf2173cfc.js.map │ │ │ ├── 8.bbbe971192a088e05907.js │ │ │ ├── 8.bbbe971192a088e05907.js.map │ │ │ ├── 9.602fe27102599b96af3e.js │ │ │ ├── 9.602fe27102599b96af3e.js.map │ │ │ ├── app.19cb1243be212d3e3dd7.js │ │ │ ├── app.19cb1243be212d3e3dd7.js.map │ │ │ ├── manifest.3faf23d2e409a293c3b4.js │ │ │ ├── manifest.3faf23d2e409a293c3b4.js.map │ │ │ ├── vendor.b83ac86a70f3cdd45227.js │ │ │ └── vendor.b83ac86a70f3cdd45227.js.map │ ├── tem │ │ └── test.html │ └── updateFile │ │ ├── 1.jpg │ │ ├── 10-WxpayAPI_php_v3.zip │ │ ├── 11-WxpayAPI_php_v3 (1).zip │ │ ├── 12-201441404444_陈根鸿_软件工程4班_实验三.rar │ │ ├── 13-WxPayAPI_JAVA_v3.zip │ │ ├── 14-WxpayAPI_php_v3 (1).zip │ │ ├── 15-WxPayAPI_JAVA_v3.zip │ │ ├── 16-WxpayAPI_php_v3.zip │ │ ├── 8-WxpayAPI_php_v3.zip │ │ └── 9-WxpayAPI_php_v3 (2).zip │ ├── templates │ ├── 1.html │ └── hello.html │ ├── utils.py │ ├── view │ ├── chongzhi.html │ └── tosubmit.html │ └── views.py └── front ├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── README.md ├── build ├── build.js ├── check-versions.js ├── logo.png ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── config ├── dev.env.js ├── index.js └── prod.env.js ├── index.html ├── package.json ├── src ├── App.vue ├── assets │ ├── adv.png │ ├── banner1.jpg │ ├── banner2.jpg │ ├── camera.png │ ├── genchan.jpeg │ ├── logo.png │ ├── recommendPro.jpg │ └── releaseBanner.jpg ├── components │ ├── AdvManage.vue │ ├── AppealManage.vue │ ├── EmployeeScore.vue │ ├── EmployerScore.vue │ ├── Login.vue │ ├── MyFooter.vue │ ├── MyHeader.vue │ ├── Portrait.vue │ ├── ProManage.vue │ ├── ProjectBox.vue │ ├── Register.vue │ ├── ShowOldPro.vue │ ├── UserManage.vue │ └── share │ │ ├── Advertisement.vue │ │ ├── ApplyCard.vue │ │ ├── CardGrounp.vue │ │ ├── MyDialog.vue │ │ ├── MyProgress.vue │ │ ├── ProjectCard.vue │ │ ├── ReleaseForm.vue │ │ └── ReleaseInfo.vue ├── config │ └── config.js ├── css │ └── theme.less ├── js │ ├── testToken.js │ └── webData.js ├── main.js ├── pages │ ├── Account.vue │ ├── Admin.vue │ ├── AdminIndex.vue │ ├── AdminLogin.vue │ ├── Expert.vue │ ├── Index.vue │ ├── ProjectOrder.vue │ ├── Projects.vue │ ├── ReleasePro.vue │ ├── ShowMoreRelease.vue │ ├── ShowReleasePro.vue │ ├── ShowUserInfo.vue │ └── UserInfo.vue └── router │ └── index.js └── static └── .gitkeep /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | node_modules 3 | dist 4 | back/extra_env/ 5 | back/.idea/ 6 | npm-debug.log 7 | yarn-debug.log 8 | yarn-error.log 9 | 10 | 11 | .idea/ 12 | .suo 13 | .ntvs 14 | .njsproj 15 | .sln 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # extra-income 2 | 毕业设计 --外包项目网站 -- vue+python+flask+uwsgi+nginx+mysql 3 | 4 | 5 | 6 | 7 | ## 启动步骤: 8 | ### 启动后台: 9 | 1. cd back 10 | 2. virtualenv --no-site-packages extra_env 11 | 3. pip install -r requirements.txt 12 | 4. python run.py 13 | > 以上开启后台dev环境 14 | 5. uwsgi extra_uwsgi.ini 15 | 6. sudo ln -s /home/genhongchan/code/python_web/extra-income/back/extra_nginx.conf /etc/nginx/conf.d/ 16 | 7. sudo /etc/init.d/nginx start 17 | 18 | > 以上开启pro环境,开启uwsgi+nginx **5-7为本人Ubuntu启动方式,pro环境下忽略3** 19 | 20 | 21 | ### 启动前端: 22 | 1. cd front 23 | 2. npm install 24 | 3. npm run dev 25 | > 以上开启前端dev环境 26 | 4. npm run build 27 | 28 | > 以上开启前端pro环境,**pro环境下忽略3** 29 | 30 | 31 | ### V0.0.1 腾讯云发布 32 | #### 项目第一个版本已经在腾讯云上线,地址为:[http://193.112.9.242:3390/static/index.html](http://193.112.9.242:3390/static/index.html),由于是第一版,可能会有一些意想不到的bug,欢迎把我服务器搞蹦。 33 | > (ps.云服务器为学生版入门服务器,带宽和速度方面受限,可能会出现下载过慢的问题,另外请在IE9以上访问) 34 | -------------------------------------------------------------------------------- /back/__pycache__/config.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/__pycache__/config.cpython-35.pyc -------------------------------------------------------------------------------- /back/config.py: -------------------------------------------------------------------------------- 1 | SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/extra_income?charset=utf8' 2 | SQLALCHEMY_TRACK_MODIFICATIONS = True 3 | -------------------------------------------------------------------------------- /back/create_db.py: -------------------------------------------------------------------------------- 1 | from server import db 2 | db.create_all() -------------------------------------------------------------------------------- /back/extra_nginx.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 3390; 3 | server_name 0.0.0.0; 4 | charset utf-8; 5 | client_max_body_size 75M; 6 | location / { 7 | include uwsgi_params; 8 | uwsgi_pass 127.0.0.1:5001; 9 | uwsgi_param UWSGI_PYTHON /usr/bin/python3; 10 | uwsgi_param UWSGI_CHDIR /usr/code/extra-income/back; 11 | uwsgi_param UWSGI_SCRIPT extra:app; 12 | } 13 | location /static/ { 14 | alias /home/ubuntu/code/extra-income/back/server/static/; 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /back/extra_uwsgi.ini: -------------------------------------------------------------------------------- 1 | [uwsgi] 2 | socket = 127.0.0.1:5001 3 | plugin = python 4 | wsgi-file = run.py 5 | callable = app 6 | processes = 4 7 | threads = 2 8 | stats = 127.0.0.1:9192 9 | ;virtualenv = /usr/code/extra-income/back/extra_env 10 | 11 | -------------------------------------------------------------------------------- /back/requirements.txt: -------------------------------------------------------------------------------- 1 | aniso8601==1.3.0 2 | apturl==0.5.2 3 | beautifulsoup4==4.4.1 4 | blinker==1.3 5 | Brlapi==0.6.4 6 | chardet==2.3.0 7 | checkbox-support==0.22 8 | click==6.7 9 | command-not-found==0.3 10 | cryptography==1.2.3 11 | defer==1.0.6 12 | feedparser==5.1.3 13 | Flask==0.12.2 14 | Flask-Cors==3.0.3 15 | Flask-RESTful==0.3.6 16 | Flask-SQLAlchemy==2.3.2 17 | guacamole==0.9.2 18 | html5lib==0.999 19 | httplib2==0.9.1 20 | idna==2.0 21 | itsdangerous==0.24 22 | Jinja2==2.10 23 | language-selector==0.1 24 | louis==2.6.4 25 | lxml==3.5.0 26 | Mako==1.0.3 27 | MarkupSafe==1.0 28 | oauthlib==1.0.3 29 | onboard==1.2.0 30 | padme==1.1.1 31 | pexpect==4.0.1 32 | Pillow==3.1.2 33 | plainbox==0.25 34 | ptyprocess==0.5 35 | pyasn1==0.1.9 36 | pycups==1.9.73 37 | pycurl==7.43.0 38 | pygobject==3.20.0 39 | PyJWT==1.3.0 40 | PyMySQL==0.8.0 41 | pyparsing==2.0.3 42 | python-apt==1.1.0b1 43 | python-dateutil==2.6.1 44 | python-debian==0.1.27 45 | python-systemd==231 46 | pytz==2017.3 47 | pyxdg==0.25 48 | reportlab==3.3.0 49 | requests==2.9.1 50 | sessioninstaller==0.0.0 51 | shadowsocks==2.8.2 52 | six==1.11.0 53 | SQLAlchemy==1.1.15 54 | system-service==0.3 55 | ubuntu-drivers-common==0.0.0 56 | ufw==0.35 57 | unattended-upgrades==0.1 58 | unity-scope-calculator==0.1 59 | unity-scope-chromiumbookmarks==0.1 60 | unity-scope-colourlovers==0.1 61 | unity-scope-devhelp==0.1 62 | unity-scope-firefoxbookmarks==0.1 63 | unity-scope-gdrive==0.7 64 | unity-scope-manpages==0.1 65 | unity-scope-openclipart==0.1 66 | unity-scope-texdoc==0.1 67 | unity-scope-tomboy==0.1 68 | unity-scope-virtualbox==0.1 69 | unity-scope-yelp==0.1 70 | unity-scope-zotero==0.1 71 | urllib3==1.13.1 72 | usb-creator==0.3.0 73 | uWSGI==2.0.15 74 | virtualenv==15.1.0 75 | Werkzeug==0.13 76 | xdiagnose==3.8.4.1 77 | xkit==0.0.0 78 | XlsxWriter==0.7.3 79 | -------------------------------------------------------------------------------- /back/run.py: -------------------------------------------------------------------------------- 1 | from server import app 2 | 3 | 4 | if __name__ == '__main__': 5 | app.run("0.0.0.0", debug=True, port=5000) 6 | -------------------------------------------------------------------------------- /back/server/__init__.py: -------------------------------------------------------------------------------- 1 | # 初始化app,restful api 2 | 3 | from flask import Flask 4 | from flask.ext import restful 5 | from flask_sqlalchemy import SQLAlchemy 6 | from flask_cors import * 7 | 8 | 9 | app = Flask(__name__) 10 | CORS(app, supports_credentials=True) # todo 允许跨域 11 | api = restful.Api(app) 12 | app.config.from_object('config') 13 | db = SQLAlchemy(app) 14 | 15 | 16 | 17 | from . import views, models 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /back/server/__pycache__/__init__.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/__pycache__/__init__.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/__pycache__/models.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/__pycache__/models.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/__pycache__/views.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/__pycache__/views.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "body-parser": "^1.18.2", 4 | "crypto": "^1.0.1", 5 | "express": "^4.16.2", 6 | "mysql": "^2.15.0" 7 | }, 8 | "scripts": { 9 | "back": "node server.js&python3 ../run.py" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /back/server/payapi.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var session = require('express-session') 3 | var request = require('request'); 4 | var app = express(); 5 | var bodyParser = require('body-parser'); 6 | app.use(bodyParser()); 7 | app.engine('.html', require('ejs').__express); 8 | //设置视图模板的默认后缀名为.html,避免了每次res.Render("xx.html")的尴尬 9 | app.set('view engine', 'html'); 10 | //设置模板文件文件夹,__dirname为全局变量,表示网站根目录 11 | app.set('views', __dirname + '/view'); 12 | 13 | app.use(express.static(__dirname + '/public')); 14 | app.use(session({ 15 | secret: "fd34s@!@dfa453f3DF#$D&W", 16 | resave: false, 17 | saveUninitialized: true, 18 | cookie: { secure: !true } 19 | })); 20 | var hash = require('hash.js') 21 | 22 | //根网站地址 23 | // var baseurl = "http://17pk760217.51mypc.cn" 24 | var baseurl = "http://localhost:7744" 25 | 26 | function num(min, max) { 27 | return Math.floor(Math.random() * (max - min)) + min; 28 | } 29 | //成功初始化payapi.js后,浏览器访问 http://localhost:7744/chongzhi 必看 30 | //首页充值 31 | app.get('/chongzhi', function(req, res) { 32 | res.render('chongzhi', { 33 | title: "充值", 34 | header: "充值" 35 | }); 36 | }); 37 | 38 | //点击支付后跳转至payapi二维码页面 39 | app.post('/payqrcode', function(req, res) { 40 | var data = req.body; 41 | var orderno = new Date().getTime(); 42 | getpaypage(data.price, data.pay, orderno, data.phone, res) 43 | }); 44 | 45 | 46 | //用户支付后,服务器接受通知数据 47 | app.post('/notify_url', function(req, res) { 48 | var token = "eab38ae3cc5556bda8dc24017985aa9b"; 49 | var data = req.body; 50 | console.log(data) 51 | var orderid = data.orderid; 52 | var realprice = data.realprice; 53 | var price = data.price; 54 | var orderuid = data.orderuid; 55 | var paysapi_id = data.paysapi_id; 56 | var server_key = data.key; 57 | var stringKey = orderid + orderuid + paysapi_id + price + realprice + token; 58 | var key = getMD5(stringKey) 59 | if (server_key == key) { 60 | console.log("更新订单支付状态") 61 | res.send({ code: 0 }) 62 | } 63 | }); 64 | //用户支付后,跳转页面 65 | app.post('/updateOrder', function(req, res) { 66 | var data = req.body; 67 | res.send({ code: 0 }) 68 | }); 69 | 70 | function getpaypage(price, istype, orderid, phone, res) { 71 | var orderno = orderid; 72 | var uid = "8700539c01bfac92b38a32c6"; 73 | var token = "eab38ae3cc5556bda8dc24017985aa9b"; 74 | var goodsname = "商品名称"; 75 | var price = price; 76 | var istype = istype; 77 | orderno = "" + orderno; 78 | orderno = getMD5(orderno) 79 | //支付后paysapi通知系统更新订单状态URL 80 | var notify_url = baseurl + "/notify_url"; 81 | //支付后paysapi跳转URL 82 | var return_url = baseurl + "/updateOrder"; 83 | console.log("notify_url:" + notify_url) 84 | console.log("return_url:" + return_url) 85 | var orderuid = phone; 86 | var stringKey = goodsname + istype + notify_url + orderid + orderuid + price + return_url + token + uid; 87 | //MD5加密key 88 | var key = getMD5(stringKey) 89 | var order = { 90 | uid: uid, 91 | price: price, 92 | istype: istype, 93 | notify_url: notify_url, 94 | return_url: return_url, 95 | orderid: orderid, 96 | orderno: orderno, 97 | orderuid: orderuid, 98 | api_key: key, 99 | goodsname: goodsname 100 | }; 101 | //order插入数据库 102 | //跳转到提交页面,页面自动跳转到payapi支付请求地址 103 | res.render('tosubmit', { 104 | title: "tosubmit", 105 | header: "tosubmit", 106 | order: order 107 | }); 108 | } 109 | 110 | function getMD5(pwd) { 111 | var crypto = require('crypto'); 112 | var md5 = crypto.createHash('md5'); 113 | var result = md5.update(pwd).digest('hex'); 114 | console.log(result); 115 | return result; 116 | } 117 | 118 | Date.prototype.Format = function(fmt) { //author: meizz yyyy-MM-dd 119 | var o = { 120 | "M+": this.getMonth() + 1, //月份 121 | "d+": this.getDate(), //日 122 | "h+": this.getHours(), //小时 123 | "m+": this.getMinutes(), //分 124 | "s+": this.getSeconds(), //秒 125 | "q+": Math.floor((this.getMonth() + 3) / 3), //季度 126 | "S": this.getMilliseconds() //毫秒 127 | }; 128 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 129 | for (var k in o) 130 | if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 131 | return fmt; 132 | } 133 | 134 | var server = app.listen(7744, function() { 135 | console.log("start"); 136 | }) -------------------------------------------------------------------------------- /back/server/resources/Recommend.py: -------------------------------------------------------------------------------- 1 | from flask.ext import restful 2 | from flask_restful import reqparse 3 | from flask.ext.restful import fields, marshal_with, marshal 4 | from ..models import User, ReleasePro 5 | from .. import db 6 | 7 | 8 | class Recommend(restful.Resource): 9 | def get(self): 10 | employees = User.query.order_by(db.desc(User.totalScore)).limit(8).all() 11 | releasePro = ReleasePro.query.filter_by(status='招募中').order_by(db.desc(ReleasePro.budget)).limit(8).all() 12 | result = dict() 13 | employeeList = list() 14 | releaseProList = list() 15 | result['employeeList'] = employeeList 16 | result['releaseProList'] = releaseProList 17 | for item in employees: 18 | item.registerTime = item.registerTime.strftime("%Y-%m-%d %H:%M:%S") 19 | employeeList.append(item.trans_to_dict()) 20 | for item in releasePro: 21 | item.releaseTime = item.releaseTime.strftime("%Y-%m-%d %H:%M:%S") 22 | releaseProList.append(item.trans_to_dict()) 23 | return result -------------------------------------------------------------------------------- /back/server/resources/Register.py: -------------------------------------------------------------------------------- 1 | # todo 注册 2 | 3 | from flask.ext import restful 4 | from flask_restful import reqparse 5 | from .. import db 6 | from ..models import User 7 | import random 8 | 9 | 10 | class Register(restful.Resource): 11 | def post(self): 12 | parser = reqparse.RequestParser() 13 | parser.add_argument('phone', type=str, required=True, help='phone is required', location='form') 14 | parser.add_argument('userName', type=str, required=True, help='user Name is required', location='form') 15 | parser.add_argument('password', type=str, required=True, help='password is required', location='form') 16 | args = parser.parse_args() 17 | user = User(args['phone'], args['userName'], args['password']) 18 | db.session.add(user) 19 | db.session.commit() 20 | return '1' 21 | 22 | -------------------------------------------------------------------------------- /back/server/resources/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__init__.py -------------------------------------------------------------------------------- /back/server/resources/__pycache__/Recommend.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/Recommend.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/Register.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/Register.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/__init__.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/__init__.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/account.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/account.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/addApply.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/addApply.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/admin.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/admin.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/applyListShow.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/applyListShow.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/applyUserList.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/applyUserList.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/checkProject.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/checkProject.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/generatingOrder.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/generatingOrder.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/haveInHandListShow.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/haveInHandListShow.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/hellotest.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/hellotest.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/increase.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/increase.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/login.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/login.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/myProjectData.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/myProjectData.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/participantInfo.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/participantInfo.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/proPageQuery.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/proPageQuery.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/releaseSave.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/releaseSave.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/showBase.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/showBase.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/showOrderData.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/showOrderData.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/showReleasePro.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/showReleasePro.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/tokenCheck.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/tokenCheck.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/update.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/update.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/updateProgress.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/updateProgress.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/user.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/user.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/userInfoSave.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/userInfoSave.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/__pycache__/userInfoShow.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/resources/__pycache__/userInfoShow.cpython-35.pyc -------------------------------------------------------------------------------- /back/server/resources/account.py: -------------------------------------------------------------------------------- 1 | # todo 项目更新进度 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from ..models import User, Turnover 5 | from .. import db 6 | import datetime 7 | 8 | 9 | class ShowAccountInfo(restful.Resource): 10 | def get(self): 11 | parser = reqparse.RequestParser() 12 | parser.add_argument('userId', type=int, required=True, help='userId is required') 13 | args = parser.parse_args() 14 | user = User.query.filter_by(id=args['userId']).first() 15 | turnovers = user.turnover.order_by(db.desc(Turnover.time)).all() 16 | result = dict() 17 | turnoverList = list() 18 | result['balance'] = user.balance 19 | result['deposit'] = user.deposit 20 | for item in turnovers: 21 | item.time = item.time.strftime("%Y-%m-%d %H:%M:%S") 22 | turnoverList.append(item.trans_to_dict()) 23 | result['turnoverList'] = turnoverList 24 | return result 25 | 26 | 27 | class Recharge(restful.Resource): 28 | def post(self): 29 | parser = reqparse.RequestParser() 30 | parser.add_argument('userId', type=int, required=True, help='userId is required') 31 | parser.add_argument('quota', type=int, required=True, help='quota is required') 32 | args = parser.parse_args() 33 | user = User.query.filter_by(id=args['userId']).first() 34 | user.balance += args['quota'] 35 | db.session.commit() 36 | turnover = Turnover(user.id, '充值(+余额)', args['quota'], user.balance, user.deposit) 37 | db.session.add(turnover) 38 | db.session.commit() 39 | return 'success' 40 | -------------------------------------------------------------------------------- /back/server/resources/addApply.py: -------------------------------------------------------------------------------- 1 | # todo 项目申请,将新的申请加入数据库applypro中,已经申请过的返回重复码 2 | 3 | from flask.ext import restful 4 | from flask_restful import reqparse 5 | from ..models import ApplyPro, User, ReleasePro 6 | from .. import db 7 | 8 | 9 | class AddApply(restful.Resource): 10 | def get(self): 11 | parser = reqparse.RequestParser() 12 | parser.add_argument('ReleaseProId', type=int, required=True, help='ReleaseProId is required') 13 | parser.add_argument('applyUserId', type=int, required=True, help='applyUserId is required') 14 | args = parser.parse_args() 15 | user = User.query.filter_by(id=args['applyUserId']).first() 16 | releasePro = ReleasePro.query.filter_by(id=args['ReleaseProId']).first() 17 | if user.balance < releasePro.budget: 18 | return 100002 19 | applyItem = ApplyPro.query.filter_by(ReleaseProId=args['ReleaseProId'], applyUserId=args['applyUserId']).first() 20 | if applyItem is None: 21 | applyPro = ApplyPro(args['ReleaseProId'], args['applyUserId']) 22 | db.session.add(applyPro) 23 | db.session.commit() 24 | return 100001 25 | else: 26 | return 110001 27 | -------------------------------------------------------------------------------- /back/server/resources/applyListShow.py: -------------------------------------------------------------------------------- 1 | # todo 我的项目中查看我正在申请的项目 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from ..models import ReleasePro, ApplyPro 5 | from .. import db 6 | 7 | 8 | class ApplyListShow(restful.Resource): 9 | def get(self): 10 | parser = reqparse.RequestParser() 11 | parser.add_argument('id', type=int, required=True, help='id is required') #applyId 12 | parser.add_argument('type', type=str, required=True, help='type is required') 13 | args = parser.parse_args() 14 | applyList = ApplyPro.query.filter_by(applyUserId=args['id'], status=args['type']).all() 15 | resultList = list() 16 | for item in applyList: 17 | project = item.releasePro 18 | project.releaseTime = project.releaseTime.strftime("%Y-%m-%d %H:%M:%S") 19 | resultList.append(project.trans_to_dict()) 20 | return resultList -------------------------------------------------------------------------------- /back/server/resources/applyUserList.py: -------------------------------------------------------------------------------- 1 | # todo 雇主查看申请项目的人,获取申请人更详细隐私信息 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from ..models import User, ApplyPro 5 | from .. import db 6 | 7 | 8 | class ApplyUserList(restful.Resource): 9 | def get(self): 10 | parser = reqparse.RequestParser() 11 | parser.add_argument('releaseProId', type=int, required=True, help='ReleaseProId is required') 12 | args = parser.parse_args() 13 | applyList = ApplyPro.query.filter_by(ReleaseProId=args['releaseProId'], status='申请中').all() 14 | resultList = list() 15 | for applyItem in applyList: 16 | user = User.query.filter_by(id=applyItem.applyUserId).first() 17 | applyItem.applyTime = applyItem.applyTime.strftime("%Y-%m-%d %H:%M:%S") 18 | applyItem = applyItem.trans_to_dict() 19 | applyItem['userId'] = user.id 20 | applyItem['userName'] = user.userName 21 | applyItem['profession'] = user.profession 22 | applyItem['phone'] = user.phone 23 | applyItem['email'] = user.email 24 | applyItem['headImg'] = user.headImg 25 | resultList.append(applyItem) 26 | return resultList -------------------------------------------------------------------------------- /back/server/resources/checkProject.py: -------------------------------------------------------------------------------- 1 | # todo 雇主验收项目 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from ..models import ProOrder, ReleasePro, User 5 | from .. import db 6 | 7 | 8 | class CheckProject(restful.Resource): 9 | def get(self): 10 | parser = reqparse.RequestParser() 11 | parser.add_argument('orderId', type=int, required=True, help='orderId is required') 12 | parser.add_argument('type', type=str, required=True, help='type is required') 13 | parser.add_argument('credit', type=int, required=False) 14 | parser.add_argument('quality', type=int, required=False) 15 | parser.add_argument('onTime', type=int, required=False) 16 | parser.add_argument('evaluate', type=str, required=False) 17 | args = parser.parse_args() 18 | order = ProOrder.query.filter_by(id=args['orderId'], status='交付中').first() 19 | if args['type'] == 'yes': 20 | order.status = '已完成' 21 | employee = User.query.filter_by(id=order.employeeId).first() 22 | employer = User.query.filter_by(id=order.employerId).first() 23 | order.credit = args['credit'] 24 | order.quality = args['quality'] 25 | order.onTime = args['onTime'] 26 | order.evaluate = args['evaluate'] 27 | employee.credit = (order.credit + employee.credit)/2 28 | employee.quality = (order.quality + employee.quality)/2 29 | employee.onTime = (order.onTime + employee.onTime)/2 30 | employee.hasFinish += 1 31 | employee.totalScore = employee.credit + employee.quality + employee.onTime 32 | employer.employerScore = (employer.employerScore + order.employerScore)/2 33 | releasrPro = ReleasePro.query.filter_by(id=order.releaseId, status='进行中').first() 34 | releasrPro.status = '已完成' 35 | db.session.commit() 36 | return 10006 37 | else: 38 | order.status = '进行中' 39 | order.progress = 0 40 | order.completionTime = None 41 | order.employerEvaluate = None 42 | order.employerScore = 0 43 | # todo employerEvaluate 44 | db.session.commit() 45 | return 10005 46 | # order. -------------------------------------------------------------------------------- /back/server/resources/generatingOrder.py: -------------------------------------------------------------------------------- 1 | # todo 生成项目订单 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from flask.ext.restful import fields, marshal_with, marshal 5 | from ..models import ProOrder, User, ReleasePro, Turnover 6 | from .. import db 7 | import datetime 8 | 9 | 10 | class GeneratingOrder(restful.Resource): 11 | def post(self): 12 | parser = reqparse.RequestParser() 13 | parser.add_argument('applyId', type=int, required=True) 14 | parser.add_argument('employerId', type=int, required=True) 15 | parser.add_argument('employeeId', type=int, required=True) 16 | parser.add_argument('releaseId', type=int, required=True) 17 | parser.add_argument('cycle', type=int, required=True) 18 | args = parser.parse_args() 19 | releasePro = ReleasePro.query.filter_by(id=args['releaseId'], status='招募中').first() 20 | self.changeStatus(args['applyId'], releasePro, args['employeeId']) 21 | proOrder = ProOrder(args['applyId'], args['employerId'], args['employeeId'], args['releaseId'], datetime.datetime.now() + datetime.timedelta(days=args['cycle'])) 22 | proOrder.employerDep = releasePro.budget 23 | proOrder.employeeDep = releasePro.budget 24 | db.session.add(proOrder) 25 | db.session.commit() 26 | return 10008 27 | 28 | def changeStatus(self, apply_id, releasePro, employeeId): 29 | releasePro.status = '进行中' 30 | enployer = User.query.filter_by(id=releasePro.employerId).first() 31 | enployee = User.query.filter_by(id=employeeId).first() 32 | enployee.balance -= releasePro.budget 33 | enployee.deposit += releasePro.budget 34 | enployer.employeeNum += 1 35 | employeeTurnover = Turnover(employeeId, '缴纳押金(-余额)', -releasePro.budget, enployee.balance, enployee.deposit) 36 | db.session.add(employeeTurnover) 37 | db.session.commit() 38 | applyList = releasePro.apply.all() 39 | for item in applyList: 40 | if item.id != apply_id: 41 | item.status = '已回绝' 42 | else: 43 | item.status = '已同意' -------------------------------------------------------------------------------- /back/server/resources/haveInHandListShow.py: -------------------------------------------------------------------------------- 1 | # todo 我的项目中进行时订单 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from flask.ext.restful import fields, marshal_with, marshal 5 | from ..models import ProOrder, ApplyPro, ReleasePro 6 | from .. import db 7 | import datetime 8 | 9 | 10 | class HaveInHandListShow(restful.Resource): 11 | def get(self): 12 | parser = reqparse.RequestParser() 13 | parser.add_argument('id', type=int, required=True) # todo 用户id 14 | parser.add_argument('type', type=str, required=True, help='type is required') 15 | args = parser.parse_args() 16 | if args['type'] == '进行中': 17 | proOrderList = ProOrder.query.filter_by(employerId=args['id']).filter(ProOrder.status.endswith('中')).all() 18 | proOrderList.extend(ProOrder.query.filter_by(employeeId=args['id']).filter(ProOrder.status.endswith('中')).all()) 19 | elif args['type'] == '已完成': 20 | proOrderList = ProOrder.query.filter_by(employerId=args['id']).filter(ProOrder.status.endswith('申诉完成')).all() 21 | proOrderList.extend(ProOrder.query.filter_by(employeeId=args['id']).filter(ProOrder.status.endswith('申诉完成')).all()) 22 | elif args['type'] == '已冻结': 23 | proOrderList = ProOrder.query.filter_by(employerId=args['id']).filter(ProOrder.status.endswith('已冻结')).all() 24 | proOrderList.extend(ProOrder.query.filter_by(employeeId=args['id']).filter(ProOrder.status.endswith('已冻结')).all()) 25 | proOrderList = sorted(proOrderList, key=lambda e: e.beginTime) 26 | releaseList = list() 27 | print(proOrderList) 28 | for orderItem in proOrderList: 29 | item = ReleasePro.query.filter_by(id=orderItem.releaseId, status=args['type']).first() 30 | if item is not None: 31 | item.releaseTime = item.releaseTime.strftime("%Y-%m-%d %H:%M:%S") 32 | item = item.trans_to_dict() 33 | item['orderId'] = orderItem.id 34 | releaseList.append(item) 35 | return releaseList 36 | -------------------------------------------------------------------------------- /back/server/resources/hellotest.py: -------------------------------------------------------------------------------- 1 | from flask.ext import restful 2 | from flask import render_template 3 | 4 | 5 | 6 | class Hello(restful.Resource): 7 | def get(self): 8 | return 'dffdff' 9 | -------------------------------------------------------------------------------- /back/server/resources/increase.py: -------------------------------------------------------------------------------- 1 | # todo 增加浏览次数/申请数 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from ..models import ReleasePro 5 | from .. import db 6 | 7 | 8 | class Increase(restful.Resource): 9 | def get(self): 10 | parser = reqparse.RequestParser() 11 | parser.add_argument('releaseId', type=int, required=True, help='releaseId is required') 12 | parser.add_argument('type', type=str, required=False) 13 | args = parser.parse_args() 14 | releasePro = ReleasePro.query.filter_by(id=args['releaseId'], status='招募中').first() 15 | if args['type'] == 'browse': 16 | releasePro.browse = releasePro.browse + 1 17 | else: 18 | releasePro.applyAmount = releasePro.applyAmount + 1 19 | db.session.commit() 20 | return 10007 -------------------------------------------------------------------------------- /back/server/resources/login.py: -------------------------------------------------------------------------------- 1 | # todo 验证登录信息,生成token 2 | 3 | from flask.ext import restful 4 | from flask_restful import reqparse 5 | from ..models import User 6 | import time 7 | import hashlib 8 | 9 | secretKey = 'JD98Dskw=23njQndW9D' 10 | maxAge = 3600 11 | 12 | 13 | 14 | class Login(restful.Resource): 15 | def post(self): 16 | parser = reqparse.RequestParser() 17 | parser.add_argument('userName', type=str, required=True, help='user name is required', location='form') 18 | parser.add_argument('password', type=str, required=True, help='password is required', location='form') 19 | args = parser.parse_args() 20 | expires = str(time.time() + maxAge) 21 | user = User.query.filter_by(userName=args['userName']).first() 22 | if user is not None and user.password == args['password']: 23 | s = '%s-%s-%s-%s' % (user.id, user.password, expires, secretKey) 24 | print(s) 25 | tokenArr = [str(user.id), expires, hashlib.sha1(s.encode('utf-8')).hexdigest()] 26 | return '-'.join(tokenArr) 27 | return 'fail' 28 | 29 | 30 | -------------------------------------------------------------------------------- /back/server/resources/myProjectData.py: -------------------------------------------------------------------------------- 1 | # todo 我的项目中发布中项目api,获取这两个类型的项目信息 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from flask.ext.restful import fields, marshal_with, marshal 5 | from ..models import User, ReleasePro 6 | from .. import db 7 | 8 | 9 | class MyProjectData(restful.Resource): 10 | def get(self): 11 | parser = reqparse.RequestParser() 12 | parser.add_argument('id', type=int, required=True, help='id is required') 13 | parser.add_argument('type', type=str, required=False) 14 | args = parser.parse_args() 15 | if args['type'] == 'releasing': 16 | return self.getReleasing(args['id']) 17 | 18 | def getReleasing(self, id): 19 | resultList = list() 20 | result = ReleasePro.query.filter_by(employerId=id, status='招募中').all() 21 | for item in result: 22 | item.releaseTime = item.releaseTime.strftime("%Y-%m-%d %H:%M:%S") 23 | resultList.append(item.trans_to_dict()) 24 | return resultList 25 | -------------------------------------------------------------------------------- /back/server/resources/participantInfo.py: -------------------------------------------------------------------------------- 1 | # todo 项目订单信息中显示参与者信息 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from flask.ext.restful import fields, marshal_with, marshal 5 | from ..models import User, ReleasePro 6 | from .. import db 7 | 8 | 9 | class ParticipantInfo(restful.Resource): 10 | def get(self): 11 | parser = reqparse.RequestParser() 12 | parser.add_argument('employerId', type=int, required=True, help='id is required') 13 | parser.add_argument('employeeId', type=int, required=True, help='id is required') 14 | args = parser.parse_args() 15 | employer = User.query.filter_by(id=args['employerId']).first() 16 | employee = User.query.filter_by(id=args['employeeId']).first() 17 | employerDict = self.change(employer) 18 | employeeDict = self.change(employee) 19 | result = dict() 20 | result['employee'] = employeeDict 21 | result['employer'] = employerDict 22 | return result 23 | 24 | def change(self, obj): 25 | myDict = dict() 26 | myDict['userId'] = obj.id 27 | myDict['headImg'] = obj.headImg 28 | myDict['userName'] = obj.userName 29 | myDict['email'] = obj.email 30 | myDict['phone'] = obj.phone 31 | myDict['profession'] = obj.profession 32 | return myDict -------------------------------------------------------------------------------- /back/server/resources/proPageQuery.py: -------------------------------------------------------------------------------- 1 | # todo 主页更多项目中的分页查询 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from ..models import ReleasePro 5 | from .. import db 6 | 7 | 8 | class ProPageQuery(restful.Resource): 9 | def get(self): 10 | parser = reqparse.RequestParser() 11 | parser.add_argument('index', type=int, required=True, help='id is required') 12 | parser.add_argument('type', type=str, required=True, help='type is required') 13 | parser.add_argument('keyWord', type=str, required=False) 14 | args = parser.parse_args() 15 | print(args['index'], args['type'], args['keyWord']) 16 | resultList = list() 17 | if args['type'] == '全部': 18 | if args['keyWord'] is None: 19 | queryResult = ReleasePro.query.filter(ReleasePro.status == '招募中') \ 20 | .order_by(db.desc(ReleasePro.budget)).limit(args['index'] * 2) 21 | else: 22 | queryResult = ReleasePro.query.filter(ReleasePro.status == '招募中') \ 23 | .filter(ReleasePro.projectName.like('%' + args['keyWord'] + '%')) \ 24 | .order_by(db.desc(ReleasePro.budget)).limit(args['index'] * 2) 25 | 26 | else: 27 | if args['keyWord'] is None: 28 | queryResult = ReleasePro.query\ 29 | .filter(ReleasePro.firstType == args['type']) \ 30 | .filter(ReleasePro.status == '招募中') \ 31 | .order_by(db.desc(ReleasePro.budget)).limit(args['index'] * 2) 32 | else: 33 | queryResult = ReleasePro.query \ 34 | .filter(ReleasePro.firstType == args['type']) \ 35 | .filter(ReleasePro.status == '招募中') \ 36 | .filter(ReleasePro.projectName.like('%' + args['keyWord'] + '%')) \ 37 | .order_by(db.desc(ReleasePro.budget)).limit(args['index'] * 2) 38 | for item in queryResult: 39 | item.releaseTime = item.releaseTime.strftime("%Y-%m-%d %H:%M:%S") 40 | resultList.append(item.trans_to_dict()) 41 | return resultList 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /back/server/resources/releaseSave.py: -------------------------------------------------------------------------------- 1 | from flask.ext import restful 2 | from flask_restful import reqparse 3 | from flask.ext.restful import fields, marshal_with, marshal 4 | from ..models import ReleasePro, User, Turnover 5 | from .. import db 6 | 7 | 8 | class ReleaseSave(restful.Resource): 9 | def post(self): 10 | parser = reqparse.RequestParser() 11 | parser.add_argument('userId', type=int, required=True) 12 | parser.add_argument('id', type=int, required=False) 13 | parser.add_argument('projectName', type=str, required=True) 14 | parser.add_argument('firstType', type=str, required=True) 15 | parser.add_argument('secondType', type=str, required=True) 16 | parser.add_argument('describe', type=str, required=True) 17 | parser.add_argument('budget', type=int, required=True) 18 | parser.add_argument('company', type=str, required=False) 19 | parser.add_argument('cycle', type=str, required=True) 20 | args = parser.parse_args() 21 | user = User.query.filter_by(id=args['userId']).first() 22 | 23 | if not args['id']: 24 | if user.balance < args['budget']: 25 | return -1 26 | user.balance -= args['budget'] 27 | user.deposit += args['budget'] 28 | turnover = Turnover(args['userId'], '缴纳押金(-余额)', -args['budget'], user.balance, user.deposit) 29 | db.session.add(turnover) 30 | newProject = ReleasePro(args['userId'], args['projectName'], args['firstType'], args['secondType'], 31 | args['describe'], args['budget'], args['cycle'], args['company']) 32 | db.session.add(newProject) 33 | db.session.commit() 34 | return newProject.id 35 | else: 36 | newProject = ReleasePro.query.filter_by(id=args['id']).first() 37 | newProject.projectName = args['projectName'] 38 | newProject.firstType = args['firstType'] 39 | newProject.secondType = args['secondType'] 40 | newProject.describe = args['describe'] 41 | newProject.budget = args['budget'] 42 | newProject.cycle = args['cycle'] 43 | newProject.company = args['company'] 44 | db.session.commit() 45 | return newProject.id 46 | 47 | 48 | -------------------------------------------------------------------------------- /back/server/resources/showBase.py: -------------------------------------------------------------------------------- 1 | from flask.ext import restful 2 | from flask_restful import reqparse 3 | from ..models import User 4 | 5 | 6 | class ShowBase(restful.Resource): 7 | def get(self): 8 | parser = reqparse.RequestParser() 9 | parser.add_argument('id', type=int, required=True, help='id is required') 10 | args = parser.parse_args() 11 | user = User.query.filter_by(id=args['id']).first() 12 | print (args['id']) 13 | print(user.headImg) 14 | res = dict() 15 | res['headImg'] = user.headImg 16 | return res -------------------------------------------------------------------------------- /back/server/resources/showOrderData.py: -------------------------------------------------------------------------------- 1 | # todo ,订单页面中订单信息获取 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from flask.ext.restful import fields, marshal_with, marshal 5 | from ..models import ProOrder, ReleasePro 6 | import datetime 7 | 8 | 9 | class ShowOrderData(restful.Resource): 10 | def get(self): 11 | parser = reqparse.RequestParser() 12 | parser.add_argument('releaseId', type=int, required=True, help='orderId is required') 13 | args = parser.parse_args() 14 | proOrder = ProOrder.query.filter_by(releaseId=args['releaseId']).first() 15 | if (proOrder.deadlineTime - datetime.datetime.now()).total_seconds() <= 0: 16 | proOrder.status = '已逾期' 17 | if proOrder is not None: 18 | proOrder.beginTime = proOrder.beginTime.strftime("%Y-%m-%d %H:%M:%S") 19 | proOrder.deadlineTime = proOrder.deadlineTime.strftime("%Y-%m-%d %H:%M:%S") 20 | if proOrder.completionTime is not None: 21 | proOrder.completionTime = proOrder.completionTime.strftime("%Y-%m-%d %H:%M:%S") 22 | return proOrder.trans_to_dict() -------------------------------------------------------------------------------- /back/server/resources/showReleasePro.py: -------------------------------------------------------------------------------- 1 | from flask.ext import restful 2 | from flask_restful import reqparse 3 | from flask.ext.restful import fields, marshal_with, marshal 4 | from ..models import User, ReleasePro 5 | 6 | resource_filed = { 7 | 'id': fields.Integer, 8 | 'employerId': fields.Integer, 9 | 'projectName': fields.String, 10 | 'firstType': fields.String, 11 | 'secondType': fields.String, 12 | 'describe': fields.String, 13 | 'budget': fields.Integer, 14 | 'cycle': fields.String, 15 | 'company': fields.String, 16 | 'status': fields.String, 17 | 'releaseTime': fields.String, 18 | 'applyAmount': fields.Integer, 19 | 'browse': fields.Integer 20 | } 21 | 22 | 23 | class ShowReleasePro(restful.Resource): 24 | @marshal_with(resource_filed) 25 | def get(self): 26 | parser = reqparse.RequestParser() 27 | parser.add_argument('id', type=int, required=True, help='id is required') 28 | args = parser.parse_args() 29 | releasePro = ReleasePro.query.filter_by(id=args['id']).first() 30 | releasePro.releaseTime = releasePro.releaseTime.strftime("%Y-%m-%d %H:%M:%S") 31 | return releasePro -------------------------------------------------------------------------------- /back/server/resources/tokenCheck.py: -------------------------------------------------------------------------------- 1 | 2 | # todo 验证登录状态是否有效 3 | 4 | from flask.ext import restful 5 | from flask_restful import reqparse 6 | from ..models import User 7 | import hashlib 8 | import time 9 | import base64 10 | import hmac 11 | 12 | secretKey = 'JD98Dskw=23njQndW9D' 13 | 14 | 15 | class TokenCheck(restful.Resource): 16 | def post(self): 17 | parser = reqparse.RequestParser() 18 | parser.add_argument('token', type=str, required=True, help='token is required', location='form') 19 | args = parser.parse_args() 20 | tokenArr = args['token'].split('-') 21 | user = User.query.filter_by(id=tokenArr[0]).first() 22 | print(round(time.time(), 5), '-', round(float(tokenArr[1]), 5)) 23 | if time.time() < float(tokenArr[1]): 24 | s = '%s-%s-%s-%s' % (user.id, user.password, tokenArr[1], secretKey) 25 | if hashlib.sha1(s.encode('utf-8')).hexdigest() == tokenArr[2]: 26 | return 10000 27 | else: 28 | return 11000 29 | -------------------------------------------------------------------------------- /back/server/resources/update.py: -------------------------------------------------------------------------------- 1 | from flask.ext import restful 2 | from flask_restful import reqparse 3 | from server.models import UpdateList, ProOrder, Turnover, User, ReleasePro, Appeal 4 | from server import db 5 | import os, base64 6 | import json 7 | import re 8 | import werkzeug 9 | 10 | upLoad_file = '/usr/code/extra-income/back/server/static/' 11 | 12 | 13 | class Update(restful.Resource): 14 | def post(self): 15 | parser = reqparse.RequestParser() 16 | parser.add_argument('title', type=str, required=True, location='form') 17 | parser.add_argument('desc', type=str, required=True, location='form') 18 | parser.add_argument('releaseId', type=int, required=True, location='form') 19 | parser.add_argument('progress', type=int, required=True, location='form') 20 | parser.add_argument('file', type=werkzeug.datastructures.FileStorage, required=True, location='files') 21 | args = parser.parse_args() 22 | print(args['title'], args['desc'], args['progress'], args['file'].filename, args['releaseId']) 23 | proOrder = ProOrder.query.filter_by(releaseId=args['releaseId']).first() 24 | print(proOrder) 25 | if proOrder is not None: 26 | updateList = UpdateList(args['title'], args['desc'], args['progress'], proOrder.id) 27 | db.session.add(updateList) 28 | db.session.commit() 29 | self.saveFile(args['file'], updateList, 'updateFile/', args['file'].filename) 30 | # file = open(upLoad_file + args['file'].filename, 'wb') 31 | # args['file'].save(upLoad_file + args['file'].filename) 32 | # updateList = UpdateList(args['title'], args['desc'], args['progress']) 33 | 34 | def saveFile(self, fileStorage, model, folder, filename): 35 | dir = upLoad_file + folder + str(model.id) + '-' + filename 36 | open(dir, 'wb') 37 | fileStorage.save(dir) 38 | model.fileDir = folder + str(model.id) + '-' + filename 39 | db.session.commit() 40 | 41 | 42 | class ShowList(restful.Resource): 43 | def get(self): 44 | parser = reqparse.RequestParser() 45 | parser.add_argument('releaseId', type=int, required=True) 46 | args = parser.parse_args() 47 | proOrder = ProOrder.query.filter_by(releaseId=args['releaseId']).first() 48 | updateLists = proOrder.updateList.all() 49 | resultList = list() 50 | for item in updateLists: 51 | item.updateTime = item.updateTime.strftime("%Y-%m-%d %H:%M:%S") 52 | item = item.trans_to_dict() 53 | resultList.append(item) 54 | return resultList 55 | 56 | 57 | class Hangdle(restful.Resource): 58 | def get(self): 59 | parser = reqparse.RequestParser() 60 | parser.add_argument('updateId', type=int, required=True) 61 | parser.add_argument('agress', type=int, required=True) 62 | parser.add_argument('reason', type=str, required=False) 63 | args = parser.parse_args() 64 | updateList = UpdateList.query.filter_by(id=args['updateId'], status='pending').first() 65 | proOrder = updateList.proOrder 66 | if args['agress'] == 1: 67 | updateList.status = 'accept' 68 | employer = User.query.filter_by(id=proOrder.employerId).first() 69 | employee = User.query.filter_by(id=proOrder.employeeId).first() 70 | releasePro = ReleasePro.query.filter_by(id=proOrder.releaseId).first() 71 | size = (updateList.progress - proOrder.progress) * releasePro.budget/100 72 | 73 | proOrder.employerDep -= size 74 | employer.deposit -= size 75 | employerTurnover = Turnover(employer.id, '支付薪酬(-押金)', -size, employer.balance, employer.deposit) 76 | 77 | proOrder.employeeDep -= size 78 | employee.deposit -= size 79 | employee.balance += 2 * size * 0.9 80 | employeeTurnover = Turnover(employee.id, '项目薪酬(+余额)', 2 * size * 0.9, employee.balance, employee.deposit) 81 | 82 | db.session.add(employerTurnover) 83 | db.session.add(employeeTurnover) 84 | db.session.commit() 85 | proOrder.progress = updateList.progress 86 | # if proOrder.progress == 100: 87 | # proOrder.status = '已完成' 88 | else: 89 | updateList.status = 'reject' 90 | updateList.rejectReason = args['reason'] 91 | 92 | db.session.commit() 93 | 94 | 95 | class CreateAppeal(restful.Resource): 96 | def get(self): 97 | parser = reqparse.RequestParser() 98 | parser.add_argument('orderId', type=int, required=True) 99 | parser.add_argument('complainantId', type=int, required=True) 100 | parser.add_argument('reason', type=str, required=True) 101 | args = parser.parse_args() 102 | proOrder = ProOrder.query.filter_by(id=args['orderId']).first() 103 | defendanterId = proOrder.employeeId if ProOrder.employerId == args['complainantId'] else proOrder.employerId 104 | proOrder.status = '已冻结' 105 | releasePro = ReleasePro.query.filter_by(id=proOrder.releaseId).first() 106 | releasePro.status = '已冻结' 107 | appeal = Appeal(args['complainantId'], defendanterId, args['orderId'], args['reason']) 108 | db.session.add(appeal) 109 | db.session.commit() 110 | return 100001 111 | 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /back/server/resources/updateProgress.py: -------------------------------------------------------------------------------- 1 | # todo 项目更新进度 2 | from flask.ext import restful 3 | from flask_restful import reqparse 4 | from ..models import ProOrder, User 5 | from .. import db 6 | import datetime 7 | 8 | 9 | class UpdateProgress(restful.Resource): 10 | def get(self): 11 | parser = reqparse.RequestParser() 12 | parser.add_argument('orderId', type=int, required=True, help='orderId is required') 13 | parser.add_argument('value', type=int, required=True, help='value is required') 14 | parser.add_argument('type', type=str, required=False) 15 | parser.add_argument('score', type=int, required=False) 16 | parser.add_argument('employerEvaluate', type=str, required=False) 17 | args = parser.parse_args() 18 | order = ProOrder.query.filter_by(id=args['orderId'], status='进行中').first() 19 | db.session.commit() 20 | if args.type is None: 21 | return 10003 22 | else: 23 | order.status = '交付中' 24 | order.employerScore = args['score'] 25 | order.employerEvaluate = args['employerEvaluate'] 26 | order.completionTime = datetime.datetime.now() 27 | db.session.commit() 28 | return 10004 29 | 30 | -------------------------------------------------------------------------------- /back/server/resources/user.py: -------------------------------------------------------------------------------- 1 | from flask.ext import restful 2 | from flask.ext.restful import fields, marshal_with 3 | from flask_restful import reqparse 4 | 5 | 6 | resource_filed = { 7 | 'username': fields.String, 8 | 'age': fields.Integer 9 | } 10 | class AddUser(object): 11 | def __init__(self, username, age, sex): 12 | self.username = username 13 | self.age = age 14 | self.sex = sex 15 | 16 | class Add(restful.Resource): 17 | @marshal_with(resource_filed) 18 | def get(self): 19 | parser = reqparse.RequestParser() 20 | parser.add_argument('username', type=str, help='Rate cannot be converted') 21 | parser.add_argument('age', type=int) 22 | parser.add_argument('sex', type=str) 23 | args = parser.parse_args() 24 | user = AddUser(args['username'], args['age'], args['sex']) 25 | return user 26 | -------------------------------------------------------------------------------- /back/server/resources/userInfoSave.py: -------------------------------------------------------------------------------- 1 | from flask.ext import restful 2 | from flask_restful import reqparse 3 | from ..models import User, OldProject 4 | from .. import db 5 | import os, base64 6 | import json 7 | import re 8 | 9 | 10 | upLoad_file = '/usr/code/extra-income/back/server/static/imgs/' 11 | # upLoad_file = '/home/ubuntu/code/extra-income/back/server/static/imgs/' 12 | 13 | 14 | # def updateDate(): 15 | 16 | myList = [{'name': '322', 'pass': '9888'}, {'name': '989898', 'pass': '9888'}] 17 | 18 | 19 | class UserInfoSave(restful.Resource): 20 | def post(self): 21 | print(myList) 22 | parser = reqparse.RequestParser() 23 | parser.add_argument('userName', type=str, required=False) 24 | parser.add_argument('headPic', type=str, required=False) 25 | parser.add_argument('age', type=int, required=False) 26 | parser.add_argument('goodAt', type=str, required=False) 27 | parser.add_argument('price', type=int, required=False) 28 | parser.add_argument('phone', type=str, required=False) 29 | parser.add_argument('profession', type=str, required=False) 30 | parser.add_argument('synopsis', type=str, required=False) 31 | parser.add_argument('email', type=str, required=False) 32 | parser.add_argument('token', type=str, required=True, help='token is required') 33 | parser.add_argument('projectList', type=str, required=False, action='append') 34 | args = parser.parse_args() 35 | tokenArr = args['token'].split('-') 36 | user = User.query.filter_by(id=tokenArr[0]).first() 37 | self.saveOldPro(args['projectList'], user.id) 38 | if args['headPic']: 39 | self.saveFile(args['headPic'], '', user) 40 | user.userName = args.userName 41 | user.age = args.age 42 | user.goodAt = args.goodAt 43 | user.price = args.price 44 | user.phone = args.phone 45 | user.email = args.email 46 | user.profession = args.profession 47 | user.synopsis = args.synopsis 48 | db.session.commit() 49 | return user.userName 50 | 51 | def saveOldPro(self, projectList, user_id): 52 | if projectList is None or len(projectList) == 0: 53 | return 54 | for i in projectList: 55 | proDict = json.loads(re.sub('\'', '\"', i)) 56 | if 'id' in proDict: 57 | oldproject = OldProject.query.filter_by(id=proDict['id']).first() 58 | oldproject.proName = proDict['proName'] 59 | oldproject.player = proDict['player'] 60 | oldproject.industry = proDict['industry'] 61 | oldproject.linkTo = proDict['linkTo'] 62 | oldproject.describe = proDict['describe'] 63 | 64 | else: 65 | oldproject = OldProject(user_id, proDict['proName'], proDict['player'], proDict['industry']) 66 | db.session.add(oldproject) 67 | db.session.commit() 68 | print(oldproject.id) 69 | oldproject.linkTo = proDict['linkTo'] 70 | oldproject.describe = proDict['describe'] 71 | if 'imgData' in proDict and proDict['imgData'] != '': 72 | self.saveFile(re.split(r';base64,', proDict['imgData'])[1], 'project/', oldproject) 73 | db.session.commit() 74 | 75 | def saveFile(self, baseStr, dir, obj): 76 | imgData = base64.b64decode(baseStr) 77 | file = open(upLoad_file+dir+str(obj.id) + '.jpg', 'wb') 78 | file.write(imgData) 79 | file.close() 80 | obj. headImg = dir + str(obj.id) + '.jpg' 81 | -------------------------------------------------------------------------------- /back/server/resources/userInfoShow.py: -------------------------------------------------------------------------------- 1 | from flask.ext import restful 2 | from flask_restful import reqparse 3 | from flask.ext.restful import fields, marshal_with, marshal 4 | from ..models import User, OldProject 5 | import json 6 | import datetime 7 | 8 | # resource_filed = { 9 | # 'id': fields.Integer, 10 | # 'phone': fields.String, 11 | # 'username': fields.String, 12 | # 'register_time': fields.String, 13 | # 'email': fields.String, 14 | # 'gender': fields.String, 15 | # 'age': fields.Integer, 16 | # 'good_at': fields.String, 17 | # 'on_time': fields.Integer, 18 | # 'credit': fields.Integer, 19 | # 'quality': fields.Integer, 20 | # 'price': fields.Integer, 21 | # 'has_finish': fields.Integer, 22 | # 'head_img': fields.String, 23 | # 'old_project_list': fields.List 24 | # } 25 | 26 | 27 | class UserInfoShow(restful.Resource): 28 | # @marshal_with(resource_filed) 29 | def get(self): 30 | parser = reqparse.RequestParser() 31 | parser.add_argument('id', type=int, required=True, help='id is required') 32 | parser.add_argument('type', type=str, required=False) 33 | args = parser.parse_args() 34 | id = args['id'] 35 | user = User.query.filter_by(id=id).first() 36 | if args['type'] is None: 37 | responseData = user.trans_to_dict() 38 | else: 39 | responseData = user.trans_to_dict() 40 | proList = list() 41 | for item in user.oldProject.all(): 42 | proList.append(item.trans_to_dict()) 43 | responseData['projectList'] = proList 44 | responseData['registerTime'] = responseData['registerTime'].strftime("%Y-%m-%d %H:%M:%S") 45 | print(responseData['registerTime']) 46 | return responseData 47 | -------------------------------------------------------------------------------- /back/server/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const crypto = require('crypto') 3 | const app = express(); 4 | const mysql = require('mysql'); 5 | const bodyParser = require('body-parser'); 6 | const urlencodedParser = bodyParser.urlencoded({ extended: false }) 7 | const secretKey = 'JD98Dskw=23njQndW9D' 8 | 9 | var connection = mysql.createConnection({ 10 | host : 'localhost', 11 | user : 'root', 12 | password : '123456', 13 | database : 'extra_income' 14 | }); 15 | connection.connect(); 16 | 17 | app.all('*', function(req, res, next) { 18 | res.header("Access-Control-Allow-Origin", "*"); 19 | res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS'); 20 | res.header("Access-Control-Allow-Headers", "X-Requested-With"); 21 | res.header('Access-Control-Allow-Headers', 'Content-Type'); 22 | next(); 23 | }); 24 | app.post('/tokenCheck', urlencodedParser, function (req, res) { 25 | let sha1 = crypto.createHash("sha1") 26 | let tokenArray = req.body.token.split('-') 27 | let userId = tokenArray[0] 28 | connection.query('select * from user where id='+userId, function(error, result, fields) { 29 | console.log(new Date().getTime() ,'-', tokenArray[1]*1000) 30 | if(error) 31 | console.error(error) 32 | else{ 33 | if(result.length == 0) 34 | res.send('no'); 35 | if(new Date().getTime() < tokenArray[1]*1000){ 36 | let s = result[0].id+'-'+result[0].password+'-'+tokenArray[1]+'-'+secretKey 37 | sha1.update(new Buffer(s, 'utf8').toString()) 38 | if(sha1.digest('hex') == tokenArray[2]){ 39 | console.log('success') 40 | res.send('yes'); 41 | } 42 | }else{ 43 | res.send('no'); 44 | } 45 | } 46 | }) 47 | }) 48 | 49 | app.get('/user', function (req, res) { 50 | res.send('haha'); 51 | }) 52 | app.get('/', function (req, res) { 53 | res.send('kkklllkkllnode'); 54 | }) 55 | var server = app.listen(8081,'0.0.0.0', function () { 56 | 57 | var host = server.address().address 58 | var port = server.address().port 59 | 60 | console.log("应用实例,访问地址为 http://%s:%s", host, port) 61 | 62 | }) -------------------------------------------------------------------------------- /back/server/static/imgs/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/1.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/10.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/11.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/12.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/13.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/15.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/16.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/2.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/3.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/4.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/5.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/6.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/7.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/8.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/9.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/adv/1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/adv/1.jpeg -------------------------------------------------------------------------------- /back/server/static/imgs/adv/2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/adv/2.jpeg -------------------------------------------------------------------------------- /back/server/static/imgs/adv/3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/adv/3.jpeg -------------------------------------------------------------------------------- /back/server/static/imgs/adv/4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/adv/4.jpeg -------------------------------------------------------------------------------- /back/server/static/imgs/adv/5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/adv/5.jpeg -------------------------------------------------------------------------------- /back/server/static/imgs/default_head.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/default_head.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/genhong.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/genhong.jpeg -------------------------------------------------------------------------------- /back/server/static/imgs/project/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/project/1.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/project/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/project/10.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/project/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/project/2.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/project/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/project/3.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/project/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/project/4.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/project/default_pro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/project/default_pro.jpg -------------------------------------------------------------------------------- /back/server/static/imgs/userInfoBanner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/imgs/userInfoBanner.jpg -------------------------------------------------------------------------------- /back/server/static/index.html: -------------------------------------------------------------------------------- 1 |
月账号 | 49 |季账号 | 50 |半年账号 | 51 |年账号 | 52 |
---|---|---|---|
30 天 | 57 |90 天 | 58 |180 天 | 59 |360 天 | 60 |
30 元 | 63 |60 元 | 64 |120 元 | 65 |240 元 | 66 |
55 | {{item.describe}} 56 |
57 |{{data.describe}}
165 |