├── .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 | front
-------------------------------------------------------------------------------- /back/server/static/static/css/app.3ec500fa903028dd599ec6d3226153e0.css: -------------------------------------------------------------------------------- 1 | .curtain[data-v-5c5348ab]{position:absolute;width:100%;height:100%;top:0;left:0;background-color:#fff;opacity:.4;z-index:1000}#app div[data-v-5c5348ab]:nth-last-child(2){min-height:calc(100vh - 226px)}a[data-v-61248c46]{text-decoration:none;color:#fff}#header[data-v-61248c46]{position:fixed;width:100%;z-index:9999;color:#fff}#header>header[data-v-61248c46]{width:95%;margin:0 auto;height:60px;line-height:60px}#header>header .header-left a[data-v-61248c46]{text-decoration:none;color:#fff}#header>header>div[data-v-61248c46]:first-child{float:left;font-size:18px;cursor:pointer}#header>header>div:first-child span[data-v-61248c46]{margin-right:18px}#header>header>div:first-child > span[data-v-61248c46]:nth-child(1){margin-right:65px;text-decoration:none}#header>header>div[data-v-61248c46]:nth-child(2){float:right;cursor:pointer}#header>header>div:nth-child(2) .header-publish[data-v-61248c46]{border-style:none;line-height:32px;padding:0 32px;background-image:linear-gradient(-133deg,#00ffb9,#acffec);border-radius:16px;font-family:PingFangSC-Regular;font-size:14px;color:#000;letter-spacing:0;display:inline-block;cursor:pointer;margin-right:10px;margin-right:50px}#header>header>div:nth-child(2)>div[data-v-61248c46]{display:inline}#header>header>div:nth-child(2)>.user-info img[data-v-61248c46]{width:36px;border-radius:50%}#header>header>div:nth-child(2)>.user-opt>span[data-v-61248c46]{margin-right:8px}#header>header>div:first-child span[data-v-61248c46]:hover,#header>header>div:nth-child(2)>.user-opt>span[data-v-61248c46]:hover,.span-hover[data-v-61248c46]{border-bottom:2px solid #00ffb9;padding-bottom:8px;border-radius:1px}.dropdown[data-v-61248c46]{display:inline-block}.dropdown>ul[data-v-61248c46]{position:absolute;display:none;padding:0;background-color:#fff;color:#000;min-width:90px;border-radius:4px}.dropdown>ul li[data-v-61248c46]{list-style:none;line-height:normal;padding:5px 15px}.dropdown>ul li>a[data-v-61248c46]{color:#000;text-decoration:none}.headerDropdown[data-v-61248c46]{background-color:#000}.headerDropdown li>a[data-v-61248c46]{color:#fff}.normal[data-v-61248c46]{color:#000;background-color:#fff;border-bottom:1px solid #e0dfdf}.normal a[data-v-61248c46],.normal span[data-v-61248c46]{color:#000}#login-dialog[data-v-d9a31170]{position:fixed;top:25%;left:32.5%;background-color:#fff;min-width:400px;width:35%;padding:15px;box-shadow:0 0 10px 0 #cdcdcd;z-index:10001;opacity:1;border-radius:4px;padding-top:30px}.loginBtn div>div[data-v-d9a31170],.loginBtn div>input[data-v-d9a31170]{border-style:none;line-height:32px;padding:0 32px;background-image:linear-gradient(-133deg,#00ffb9,#acffec);border-radius:16px;font-family:PingFangSC-Regular;font-size:14px;color:#000;letter-spacing:0;display:inline-block;cursor:pointer;margin-right:10px}.validator-error[data-v-d9a31170]{color:red}#dialog[data-v-4cab95f4]{position:fixed;top:25%;left:32.5%;background-color:#fff;min-width:400px;width:35%;padding:15px;box-shadow:0 0 10px 0 #cdcdcd;z-index:10001;opacity:1;border-radius:4px}.registerBtn div>div[data-v-4cab95f4],.registerBtn div>input[data-v-4cab95f4]{border-style:none;line-height:32px;padding:0 32px;background-image:linear-gradient(-133deg,#00ffb9,#acffec);border-radius:16px;font-family:PingFangSC-Regular;font-size:14px;color:#000;letter-spacing:0;display:inline-block;cursor:pointer;margin-right:10px}.form-control[data-v-4cab95f4]{border:0;border-bottom:1px solid #e6e6e6;box-shadow:none}.validator-error[data-v-4cab95f4]{color:red}.my-footer[data-v-14b4f554]{height:226px;margin-top:30px;border-top:1px solid #e0dfdf;background-color:#000;padding:15px;text-align:center}.my-footer>div[data-v-14b4f554]{color:#fff;text-align:center}.my-footer>div>div[data-v-14b4f554]{display:inline-block;min-width:370px}.my-footer>div>div>div[data-v-14b4f554]{margin-bottom:15px;text-align:left}.my-footer>div a[data-v-14b4f554],.my-footer>div span[data-v-14b4f554]{color:#fff}.row[data-v-14b4f554]{margin:0} 2 | /*# sourceMappingURL=app.3ec500fa903028dd599ec6d3226153e0.css.map */ -------------------------------------------------------------------------------- /back/server/static/static/fonts/glyphicons-halflings-regular.448c34a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/static/fonts/glyphicons-halflings-regular.448c34a.woff2 -------------------------------------------------------------------------------- /back/server/static/static/fonts/glyphicons-halflings-regular.e18bbf6.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/static/fonts/glyphicons-halflings-regular.e18bbf6.ttf -------------------------------------------------------------------------------- /back/server/static/static/fonts/glyphicons-halflings-regular.f4769f9.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/static/fonts/glyphicons-halflings-regular.f4769f9.eot -------------------------------------------------------------------------------- /back/server/static/static/fonts/glyphicons-halflings-regular.fa27723.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/static/fonts/glyphicons-halflings-regular.fa27723.woff -------------------------------------------------------------------------------- /back/server/static/static/img/banner1.2281d60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/static/img/banner1.2281d60.jpg -------------------------------------------------------------------------------- /back/server/static/static/img/banner2.217bb09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/static/img/banner2.217bb09.jpg -------------------------------------------------------------------------------- /back/server/static/static/img/releaseBanner.90fd715.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/static/img/releaseBanner.90fd715.jpg -------------------------------------------------------------------------------- /back/server/static/static/js/7.3f56943d41dcf2173cfc.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([7],{"0ejK":function(t,e,n){(t.exports=n("I71c")(!0)).push([t.i,"\n.projects-page[data-v-60f51479] {\n padding-top: 60px;\n}\n.projects-page > div[data-v-60f51479] {\n background-color: #fff;\n width: 90%;\n padding: 10px 15px;\n margin: 0 auto;\n margin-top: 60px;\n border-radius: 4px;\n}\n.projects-page > div > header[data-v-60f51479] {\n padding-bottom: 20px;\n border-bottom: 1px solid #ccc;\n font-weight: 600;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n.projects-page > div > header span[data-v-60f51479] {\n padding: 15px 8px;\n cursor: pointer;\n}\n.projects-page > div .projects-container[data-v-60f51479] {\n padding: 30px 0;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n.clicked[data-v-60f51479] {\n border-bottom: 2px solid #00ffb9;\n}\n.projects-container-tip[data-v-60f51479] {\n text-align: center;\n color: #00ffb9;\n}\n","",{version:3,sources:["/usr/code/extra-income/front/src/pages/Projects.vue"],names:[],mappings:";AACA;EACE,kBAAkB;CACnB;AACD;EACE,uBAAuB;EACvB,WAAW;EACX,mBAAmB;EACnB,eAAe;EACf,iBAAiB;EACjB,mBAAmB;CACpB;AACD;EACE,qBAAqB;EACrB,8BAA8B;EAC9B,iBAAiB;EACjB,+BAA+B;UACvB,uBAAuB;CAChC;AACD;EACE,kBAAkB;EAClB,gBAAgB;CACjB;AACD;EACE,gBAAgB;EAChB,+BAA+B;UACvB,uBAAuB;CAChC;AACD;EACE,iCAAiC;CAClC;AACD;EACE,mBAAmB;EACnB,eAAe;CAChB",file:"Projects.vue",sourcesContent:["\n.projects-page[data-v-60f51479] {\n padding-top: 60px;\n}\n.projects-page > div[data-v-60f51479] {\n background-color: #fff;\n width: 90%;\n padding: 10px 15px;\n margin: 0 auto;\n margin-top: 60px;\n border-radius: 4px;\n}\n.projects-page > div > header[data-v-60f51479] {\n padding-bottom: 20px;\n border-bottom: 1px solid #ccc;\n font-weight: 600;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n.projects-page > div > header span[data-v-60f51479] {\n padding: 15px 8px;\n cursor: pointer;\n}\n.projects-page > div .projects-container[data-v-60f51479] {\n padding: 30px 0;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n.clicked[data-v-60f51479] {\n border-bottom: 2px solid #00ffb9;\n}\n.projects-container-tip[data-v-60f51479] {\n text-align: center;\n color: #00ffb9;\n}\n"],sourceRoot:""}])},"8tq6":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var a=n("o5l+"),o={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"projects-page"},[n("div",[n("header",{staticClass:"projects-page-title",on:{click:t.selectType}},[n("span",{staticClass:"clicked",attrs:{"data-type":"releasing"}},[t._v("发布中")]),t._v(" "),n("span",{attrs:{"data-type":"applying"}},[t._v("申请中")]),t._v(" "),n("span",{attrs:{"data-type":"haveInHand"}},[t._v("进行中")]),t._v(" "),n("span",{attrs:{"data-type":"completed"}},[t._v("已完成")])]),t._v(" "),n("div",{staticClass:"projects-container row"},[t._l(t.showList,function(e){return n("router-link",{key:e.id,attrs:{to:{name:t.linkTo,params:{id:e.id}}}},[n("project-card",{attrs:{item:e}})],1)}),t._v(" "),0===t.showList.length?n("div",{staticClass:"projects-container-tip"},[t._v("没有满足条件的项目,快去创造吧...")]):t._e()],2)])])},staticRenderFns:[]};var i=function(t){n("MsXQ")},r=n("Z0/y")(a.a,o,!1,i,"data-v-60f51479",null);e.default=r.exports},MsXQ:function(t,e,n){var a=n("0ejK");"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);n("FIqI")("2387c5f0",a,!0,{})},"o5l+":function(t,e,n){"use strict";(function(t){var a=n("x2VJ"),o=n("d2gY");e.a={data:function(){return{showList:[],linkTo:"showReleasePro"}},mounted:function(){this.getTypeData("myProjectData","releasing")},beforeRouteEnter:function(t,e,n){n(function(t){t.$store.state.hasLogin||(alert("请先登录"),t.$router.push({name:"index"})),t.$store.commit("changeSingerState",{stateName:"myHeader",value:!0})})},methods:{reInit:function(e){t(".projects-page-title span").removeClass("clicked"),e.target.classList.add("clicked"),this.showAll=this.showDesign=this.showDeveloper=this.showMarket=this.showProject=!1},selectType:function(t){if(this.reInit(t),"SPAN"===t.target.nodeName)switch(t.target.getAttribute("data-type")){case"releasing":this.linkTo="showReleasePro",this.getTypeData("myProjectData","releasing");break;case"applying":this.linkTo="showReleasePro",this.getTypeData("applyListShow","申请中");break;case"haveInHand":this.linkTo="projectOrder",this.getTypeData("haveInHandListShow","进行中");break;case"completed":this.linkTo="projectOrder",this.getTypeData("haveInHandListShow","已完成")}},getTypeData:function(t,e){var n=this;this.$store.state.loginId&&this.$ajax.get(o.a+t,{params:{id:this.$store.state.loginId,type:e}}).then(function(t){n.showList=t.data},function(t){alert("获取数据失败,请检查网络")})}},components:{ProjectCard:a.a}}}).call(e,n("fu2u"))}}); 2 | //# sourceMappingURL=7.3f56943d41dcf2173cfc.js.map -------------------------------------------------------------------------------- /back/server/static/static/js/8.bbbe971192a088e05907.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([8],{GIsR:function(e,n,a){"use strict";Object.defineProperty(n,"__esModule",{value:!0});a("d2gY"),a("G1kT"),a("4PJ5");var t={components:{ReleaseForm:a("D+cQ").a},data:function(){return{viewId:1}},beforeRouteEnter:function(e,n,a){a(function(e){e.$store.state.hasLogin||(alert("请先登录"),e.$router.push({name:"index"})),e.$store.commit("changeSingerState",{stateName:"myHeader",value:!0})})},beforeRouteLeave:function(e,n,a){this.viewId++,a()}},r={render:function(){var e=this.$createElement,n=this._self._c||e;return n("div",{staticClass:"release"},[n("img",{attrs:{src:a("Qgy0"),alt:"banner"}}),this._v(" "),n("release-form",{key:this.viewId,attrs:{type:"releasePro"}})],1)},staticRenderFns:[]};var i=a("Z0/y")(t,r,!1,function(e){a("sXkC")},"data-v-494ad150",null);n.default=i.exports},sXkC:function(e,n,a){var t=a("zkyk");"string"==typeof t&&(t=[[e.i,t,""]]),t.locals&&(e.exports=t.locals);a("FIqI")("4353537c",t,!0,{})},zkyk:function(e,n,a){(e.exports=a("I71c")(!0)).push([e.i,"\n.release[data-v-494ad150] {\n padding-top: 60px;\n text-align: center;\n}\n.release img[data-v-494ad150] {\n width: 100%;\n}\n.release > div[data-v-494ad150],\n.release > img[data-v-494ad150] {\n margin-bottom: 60px;\n}\n.release > div[data-v-494ad150]:nth-last-child(1) {\n text-align: center;\n}\n.release > div:nth-last-child(1) span[data-v-494ad150] {\n border-style: none;\n line-height: 32px;\n padding: 0 32px;\n background-image: linear-gradient(-133deg, #00ffb9, #ACFFEC);\n border-radius: 16px;\n font-family: PingFangSC-Regular;\n font-size: 14px;\n color: #000;\n letter-spacing: 0;\n display: inline-block;\n cursor: pointer;\n margin-right: 10px;\n}\n","",{version:3,sources:["/usr/code/extra-income/front/src/pages/ReleasePro.vue"],names:[],mappings:";AACA;EACE,kBAAkB;EAClB,mBAAmB;CACpB;AACD;EACE,YAAY;CACb;AACD;;EAEE,oBAAoB;CACrB;AACD;EACE,mBAAmB;CACpB;AACD;EACE,mBAAmB;EACnB,kBAAkB;EAClB,gBAAgB;EAChB,6DAA6D;EAC7D,oBAAoB;EACpB,gCAAgC;EAChC,gBAAgB;EAChB,YAAY;EACZ,kBAAkB;EAClB,sBAAsB;EACtB,gBAAgB;EAChB,mBAAmB;CACpB",file:"ReleasePro.vue",sourcesContent:["\n.release[data-v-494ad150] {\n padding-top: 60px;\n text-align: center;\n}\n.release img[data-v-494ad150] {\n width: 100%;\n}\n.release > div[data-v-494ad150],\n.release > img[data-v-494ad150] {\n margin-bottom: 60px;\n}\n.release > div[data-v-494ad150]:nth-last-child(1) {\n text-align: center;\n}\n.release > div:nth-last-child(1) span[data-v-494ad150] {\n border-style: none;\n line-height: 32px;\n padding: 0 32px;\n background-image: linear-gradient(-133deg, #00ffb9, #ACFFEC);\n border-radius: 16px;\n font-family: PingFangSC-Regular;\n font-size: 14px;\n color: #000;\n letter-spacing: 0;\n display: inline-block;\n cursor: pointer;\n margin-right: 10px;\n}\n"],sourceRoot:""}])}}); 2 | //# sourceMappingURL=8.bbbe971192a088e05907.js.map -------------------------------------------------------------------------------- /back/server/static/static/js/9.602fe27102599b96af3e.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([9],{KvSM:function(e,n,t){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var l={render:function(){var e=this.$createElement;return(this._self._c||e)("div",[this._v("\n 专家\n")])},staticRenderFns:[]},r=t("Z0/y")(null,l,!1,null,null,null);n.default=r.exports}}); 2 | //# sourceMappingURL=9.602fe27102599b96af3e.js.map -------------------------------------------------------------------------------- /back/server/static/static/js/9.602fe27102599b96af3e.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/pages/Expert.vue?31a1","webpack:///./src/pages/Expert.vue"],"names":["Expert","render","_h","this","$createElement","_self","_c","_v","staticRenderFns","Component","__webpack_require__","normalizeComponent","__webpack_exports__"],"mappings":"qGAAA,IAGAA,GADiBC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAAkD,OAA/DD,KAAuCE,MAAAC,IAAAJ,GAAwB,OAA/DC,KAA+DI,GAAA,eAExEC,oBCWjBC,EAbAC,EAAA,OAaAC,CAXA,KAaAX,GATA,EAEA,KAEA,KAEA,MAUAY,EAAA,QAAAH,EAAA","file":"static/js/9.602fe27102599b96af3e.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_vm._v(\"\\n 专家\\n\")])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/_vue-loader@13.7.1@vue-loader/lib/template-compiler?{\"id\":\"data-v-ef8e913a\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/_vue-loader@13.7.1@vue-loader/lib/selector.js?type=template&index=0!./src/pages/Expert.vue\n// module id = null\n// module chunks = ","var normalizeComponent = require(\"!../../node_modules/_vue-loader@13.7.1@vue-loader/lib/component-normalizer\")\n/* script */\nvar __vue_script__ = null\n/* template */\nimport __vue_template__ from \"!!../../node_modules/_vue-loader@13.7.1@vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ef8e913a\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/_vue-loader@13.7.1@vue-loader/lib/selector?type=template&index=0!./Expert.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/Expert.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} -------------------------------------------------------------------------------- /back/server/static/static/js/manifest.3faf23d2e409a293c3b4.js: -------------------------------------------------------------------------------- 1 | !function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var f,i,u,s=0,d=[];s 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | dddddddsss 9 | 10 | -------------------------------------------------------------------------------- /back/server/static/updateFile/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/1.jpg -------------------------------------------------------------------------------- /back/server/static/updateFile/10-WxpayAPI_php_v3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/10-WxpayAPI_php_v3.zip -------------------------------------------------------------------------------- /back/server/static/updateFile/11-WxpayAPI_php_v3 (1).zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/11-WxpayAPI_php_v3 (1).zip -------------------------------------------------------------------------------- /back/server/static/updateFile/12-201441404444_陈根鸿_软件工程4班_实验三.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/12-201441404444_陈根鸿_软件工程4班_实验三.rar -------------------------------------------------------------------------------- /back/server/static/updateFile/13-WxPayAPI_JAVA_v3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/13-WxPayAPI_JAVA_v3.zip -------------------------------------------------------------------------------- /back/server/static/updateFile/14-WxpayAPI_php_v3 (1).zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/14-WxpayAPI_php_v3 (1).zip -------------------------------------------------------------------------------- /back/server/static/updateFile/15-WxPayAPI_JAVA_v3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/15-WxPayAPI_JAVA_v3.zip -------------------------------------------------------------------------------- /back/server/static/updateFile/16-WxpayAPI_php_v3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/16-WxpayAPI_php_v3.zip -------------------------------------------------------------------------------- /back/server/static/updateFile/8-WxpayAPI_php_v3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/8-WxpayAPI_php_v3.zip -------------------------------------------------------------------------------- /back/server/static/updateFile/9-WxpayAPI_php_v3 (2).zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/static/updateFile/9-WxpayAPI_php_v3 (2).zip -------------------------------------------------------------------------------- /back/server/templates/1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | ddsss 9 | 10 | 11 | -------------------------------------------------------------------------------- /back/server/templates/hello.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | dsssd 9 | 10 | -------------------------------------------------------------------------------- /back/server/utils.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/back/server/utils.py -------------------------------------------------------------------------------- /back/server/view/chongzhi.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 充值 12 | 13 | 14 | 15 | 16 | 31 | 32 | 33 | 42 |
43 |

价格

44 |
45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 |
月账号季账号半年账号年账号
30 天90 天180 天360 天
30 元60120240
69 |
70 |
71 |
72 |

支付宝/微信扫码自动购买账号

73 |
    74 |
  1. 75 |

    选择下面的套餐价格

    76 |
  2. 77 |

    78 | 30 元

    79 |

    80 | 60 元

    81 |

    82 | 120 元

    83 |

    84 | 240 元

    85 |
  3. 86 |

    选择支付方式

    87 |
  4. 88 |

    89 | 微信

    90 |

    91 | 支付宝

    92 |

    93 |

  5. 94 |

    输入手机号,然后点击 支付 扫码付款自动购买

    95 |
  6. 96 | 97 |

    98 | 99 |
100 |
101 |
102 |
103 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /back/server/view/tosubmit.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 充值跳转 12 | 13 | 14 | 15 | 16 | 31 | 32 | 33 |

创建支付中 ~~~

34 |
35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 | 46 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /back/server/views.py: -------------------------------------------------------------------------------- 1 | 2 | # 路由分发 3 | 4 | 5 | from . import api 6 | from .resources.Recommend import Recommend 7 | from .resources.Register import Register 8 | from .resources.addApply import AddApply 9 | from .resources.applyListShow import ApplyListShow 10 | from .resources.applyUserList import ApplyUserList 11 | from .resources.checkProject import CheckProject 12 | from .resources.generatingOrder import GeneratingOrder 13 | from .resources.haveInHandListShow import HaveInHandListShow 14 | from .resources.hellotest import Hello 15 | from .resources.increase import Increase 16 | from .resources.login import Login 17 | from .resources.myProjectData import MyProjectData 18 | from .resources.participantInfo import ParticipantInfo 19 | from .resources.proPageQuery import ProPageQuery 20 | from .resources.releaseSave import ReleaseSave 21 | from .resources.showBase import ShowBase 22 | from .resources.showOrderData import ShowOrderData 23 | from .resources.showReleasePro import ShowReleasePro 24 | from .resources.tokenCheck import TokenCheck 25 | from .resources.user import Add 26 | from .resources.userInfoSave import UserInfoSave 27 | from .resources.userInfoShow import UserInfoShow 28 | from .resources.update import Update, ShowList, Hangdle, CreateAppeal 29 | from .resources.account import ShowAccountInfo, Recharge 30 | from .resources.updateProgress import UpdateProgress 31 | from .resources.admin import AdminLogin, ShowUsers, HandleUser, ShowAppeals, Submit, changeAdv, HandlePro, ShowPro 32 | 33 | api.add_resource(Hello, '/') 34 | api.add_resource(Add, '/user') 35 | api.add_resource(Login, '/login') 36 | api.add_resource(Register, '/register') 37 | api.add_resource(TokenCheck, '/tokenCheck') 38 | api.add_resource(UserInfoSave, '/userInfoSave') 39 | api.add_resource(UserInfoShow, '/userInfoShow') 40 | api.add_resource(ReleaseSave, '/releaseSave') 41 | api.add_resource(ShowReleasePro, '/showReleasePro') 42 | api.add_resource(Recommend, '/recommend') 43 | api.add_resource(ShowBase, '/showBase') 44 | api.add_resource(MyProjectData, '/myProjectData') 45 | api.add_resource(ProPageQuery, '/proPageQuery') 46 | api.add_resource(AddApply, '/addApply') 47 | api.add_resource(ApplyListShow, '/applyListShow') 48 | api.add_resource(ApplyUserList, '/applyUserList') 49 | api.add_resource(GeneratingOrder, '/generatingOrder') 50 | api.add_resource(HaveInHandListShow, '/haveInHandListShow') 51 | api.add_resource(ShowOrderData, '/showOrderData') 52 | api.add_resource(ParticipantInfo, '/participantInfo') 53 | api.add_resource(Update, '/updateProgress') 54 | api.add_resource(ShowList, '/showUpdateList') 55 | api.add_resource(Hangdle, '/updateHandle') 56 | api.add_resource(CheckProject, '/checkProject') 57 | api.add_resource(Increase, '/increase') 58 | api.add_resource(ShowAccountInfo, '/showAccountInfo') 59 | api.add_resource(Recharge, '/recharge') 60 | api.add_resource(UpdateProgress, '/employeeEvaluate') 61 | api.add_resource(CreateAppeal, '/sendAppeal') 62 | api.add_resource(AdminLogin, '/adminLogin') 63 | api.add_resource(ShowUsers, '/showUsers') 64 | api.add_resource(HandleUser, '/handleUser') 65 | api.add_resource(ShowAppeals, '/showAppeals') 66 | api.add_resource(Submit, '/handleAppeal') 67 | api.add_resource(changeAdv, '/changeAdv') 68 | api.add_resource(HandlePro, '/handlePro') 69 | api.add_resource(ShowPro, '/showPro') 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /front/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false 5 | }], 6 | "stage-2" 7 | ], 8 | "plugins": ["transform-runtime", [ 9 | "component", 10 | { 11 | "libraryName": "element-ui", 12 | "styleLibraryName": "theme-chalk" 13 | } 14 | ]] 15 | } 16 | -------------------------------------------------------------------------------- /front/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /front/.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | -------------------------------------------------------------------------------- /front/.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parser: 'babel-eslint', 6 | parserOptions: { 7 | sourceType: 'module' 8 | }, 9 | env: { 10 | browser: true, 11 | }, 12 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 13 | extends: 'standard', 14 | // required to lint *.vue files 15 | plugins: [ 16 | 'html' 17 | ], 18 | // add your custom rules here 19 | rules: { 20 | // allow async-await 21 | 'generator-star-spacing': 'off', 22 | // allow debugger during development 23 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /front/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Editor directories and files 9 | .idea 10 | .vscode 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /front/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "postcss-import": {}, 7 | "autoprefixer": {} 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /front/README.md: -------------------------------------------------------------------------------- 1 | # front 2 | 3 | > A Vue.js project 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | 17 | # build for production and view the bundle analyzer report 18 | npm run build --report 19 | ``` 20 | 21 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 22 | -------------------------------------------------------------------------------- /front/build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /front/build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | 7 | function exec (cmd) { 8 | return require('child_process').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /front/build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/build/logo.png -------------------------------------------------------------------------------- /front/build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | const packageConfig = require('../package.json') 6 | 7 | exports.assetsPath = function (_path) { 8 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 9 | ? config.build.assetsSubDirectory 10 | : config.dev.assetsSubDirectory 11 | 12 | return path.posix.join(assetsSubDirectory, _path) 13 | } 14 | 15 | exports.cssLoaders = function (options) { 16 | options = options || {} 17 | 18 | const cssLoader = { 19 | loader: 'css-loader', 20 | options: { 21 | sourceMap: options.sourceMap 22 | } 23 | } 24 | 25 | const postcssLoader = { 26 | loader: 'postcss-loader', 27 | options: { 28 | sourceMap: options.sourceMap 29 | } 30 | } 31 | 32 | // generate loader string to be used with extract text plugin 33 | function generateLoaders (loader, loaderOptions) { 34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 35 | 36 | if (loader) { 37 | loaders.push({ 38 | loader: loader + '-loader', 39 | options: Object.assign({}, loaderOptions, { 40 | sourceMap: options.sourceMap 41 | }) 42 | }) 43 | } 44 | 45 | // Extract CSS when that option is specified 46 | // (which is the case during production build) 47 | if (options.extract) { 48 | return ExtractTextPlugin.extract({ 49 | use: loaders, 50 | fallback: 'vue-style-loader' 51 | }) 52 | } else { 53 | return ['vue-style-loader'].concat(loaders) 54 | } 55 | } 56 | 57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 58 | return { 59 | css: generateLoaders(), 60 | postcss: generateLoaders(), 61 | less: generateLoaders('less'), 62 | sass: generateLoaders('sass', { indentedSyntax: true }), 63 | scss: generateLoaders('sass'), 64 | stylus: generateLoaders('stylus'), 65 | styl: generateLoaders('stylus') 66 | } 67 | } 68 | 69 | // Generate loaders for standalone style files (outside of .vue) 70 | exports.styleLoaders = function (options) { 71 | const output = [] 72 | const loaders = exports.cssLoaders(options) 73 | 74 | for (const extension in loaders) { 75 | const loader = loaders[extension] 76 | output.push({ 77 | test: new RegExp('\\.' + extension + '$'), 78 | use: loader 79 | }) 80 | } 81 | 82 | return output 83 | } 84 | 85 | exports.createNotifierCallback = () => { 86 | const notifier = require('node-notifier') 87 | 88 | return (severity, errors) => { 89 | if (severity !== 'error') return 90 | 91 | const error = errors[0] 92 | const filename = error.file && error.file.split('!').pop() 93 | 94 | notifier.notify({ 95 | title: packageConfig.name, 96 | message: severity + ': ' + error.name, 97 | subtitle: filename || '', 98 | icon: path.join(__dirname, 'logo.png') 99 | }) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /front/build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /front/build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | const webpack = require('webpack') 7 | 8 | function resolve (dir) { 9 | return path.join(__dirname, '..', dir) 10 | } 11 | 12 | const createLintingRule = () => ({ 13 | test: /\.(js|vue)$/, 14 | loader: 'eslint-loader', 15 | enforce: 'pre', 16 | include: [resolve('src'), resolve('test')], 17 | options: { 18 | formatter: require('eslint-friendly-formatter'), 19 | emitWarning: !config.dev.showEslintErrorsInOverlay 20 | } 21 | }) 22 | 23 | module.exports = { 24 | context: path.resolve(__dirname, '../'), 25 | entry: { 26 | app: './src/main.js' 27 | }, 28 | output: { 29 | path: config.build.assetsRoot, 30 | filename: '[name].js', 31 | publicPath: process.env.NODE_ENV === 'production' 32 | ? config.build.assetsPublicPath 33 | : config.dev.assetsPublicPath 34 | }, 35 | resolve: { 36 | extensions: ['.js', '.vue', '.json'], 37 | alias: { 38 | 'vue$': 'vue/dist/vue.esm.js', 39 | '@': resolve('src'), 40 | } 41 | }, 42 | plugins: [ 43 | new webpack.ProvidePlugin({ 44 | '$':'jquery', 45 | 'jQuery':'jquery' , 46 | 'window.jQuery':'jquery' 47 | }) 48 | ], 49 | module: { 50 | rules: [ 51 | ...(config.dev.useEslint ? [createLintingRule()] : []), 52 | { 53 | test: /\.vue$/, 54 | loader: 'vue-loader', 55 | options: vueLoaderConfig 56 | }, 57 | { 58 | test: /\.js$/, 59 | loader: 'babel-loader', 60 | include: [resolve('src'), resolve('test')] 61 | }, 62 | { 63 | test: /\.less$/, 64 | loader: "style-loader!css-loader!less-loader", 65 | }, 66 | { 67 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 68 | loader: 'url-loader', 69 | options: { 70 | limit: 10000, 71 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 72 | } 73 | }, 74 | { 75 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 76 | loader: 'url-loader', 77 | options: { 78 | limit: 10000, 79 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 80 | } 81 | }, 82 | { 83 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 84 | loader: 'url-loader', 85 | options: { 86 | limit: 10000, 87 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 88 | } 89 | } 90 | ] 91 | }, 92 | node: { 93 | // prevent webpack from injecting useless setImmediate polyfill because Vue 94 | // source contains it (although only uses it if it's native). 95 | setImmediate: false, 96 | // prevent webpack from injecting mocks to Node native modules 97 | // that does not make sense for the client 98 | dgram: 'empty', 99 | fs: 'empty', 100 | net: 'empty', 101 | tls: 'empty', 102 | child_process: 'empty' 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /front/build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const baseWebpackConfig = require('./webpack.base.conf') 7 | const HtmlWebpackPlugin = require('html-webpack-plugin') 8 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 9 | const portfinder = require('portfinder') 10 | 11 | const HOST = process.env.HOST 12 | const PORT = process.env.PORT && Number(process.env.PORT) 13 | 14 | const devWebpackConfig = merge(baseWebpackConfig, { 15 | module: { 16 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 17 | }, 18 | // cheap-module-eval-source-map is faster for development 19 | devtool: config.dev.devtool, 20 | 21 | // these devServer options should be customized in /config/index.js 22 | devServer: { 23 | clientLogLevel: 'warning', 24 | historyApiFallback: true, 25 | hot: true, 26 | compress: true, 27 | host: HOST || config.dev.host, 28 | port: PORT || config.dev.port, 29 | open: config.dev.autoOpenBrowser, 30 | overlay: config.dev.errorOverlay 31 | ? { warnings: false, errors: true } 32 | : false, 33 | publicPath: config.dev.assetsPublicPath, 34 | proxy: config.dev.proxyTable, 35 | quiet: true, // necessary for FriendlyErrorsPlugin 36 | watchOptions: { 37 | poll: config.dev.poll, 38 | } 39 | }, 40 | plugins: [ 41 | new webpack.DefinePlugin({ 42 | 'process.env': require('../config/dev.env') 43 | }), 44 | new webpack.HotModuleReplacementPlugin(), 45 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 46 | new webpack.NoEmitOnErrorsPlugin(), 47 | // https://github.com/ampedandwired/html-webpack-plugin 48 | new HtmlWebpackPlugin({ 49 | filename: 'index.html', 50 | template: 'index.html', 51 | inject: true 52 | }), 53 | ] 54 | }) 55 | 56 | module.exports = new Promise((resolve, reject) => { 57 | portfinder.basePort = process.env.PORT || config.dev.port 58 | portfinder.getPort((err, port) => { 59 | if (err) { 60 | reject(err) 61 | } else { 62 | // publish the new Port, necessary for e2e tests 63 | process.env.PORT = port 64 | // add port to devServer config 65 | devWebpackConfig.devServer.port = port 66 | 67 | // Add FriendlyErrorsPlugin 68 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 69 | compilationSuccessInfo: { 70 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 71 | }, 72 | onErrors: config.dev.notifyOnErrors 73 | ? utils.createNotifierCallback() 74 | : undefined 75 | })) 76 | 77 | resolve(devWebpackConfig) 78 | } 79 | }) 80 | }) 81 | -------------------------------------------------------------------------------- /front/build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 13 | 14 | const env = require('../config/prod.env') 15 | 16 | const webpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ 19 | sourceMap: config.build.productionSourceMap, 20 | extract: true, 21 | usePostCSS: true 22 | }) 23 | }, 24 | devtool: config.build.productionSourceMap ? config.build.devtool : false, 25 | output: { 26 | path: config.build.assetsRoot, 27 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 28 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 29 | }, 30 | plugins: [ 31 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 32 | new webpack.DefinePlugin({ 33 | 'process.env': env 34 | }), 35 | new UglifyJsPlugin({ 36 | uglifyOptions: { 37 | compress: { 38 | warnings: false 39 | } 40 | }, 41 | sourceMap: config.build.productionSourceMap, 42 | parallel: true 43 | }), 44 | // extract css into its own file 45 | new ExtractTextPlugin({ 46 | filename: utils.assetsPath('css/[name].[contenthash].css'), 47 | // set the following option to `true` if you want to extract CSS from 48 | // codesplit chunks into this main css file as well. 49 | // This will result in *all* of your app's CSS being loaded upfront. 50 | allChunks: false, 51 | }), 52 | // Compress extracted CSS. We are using this plugin so that possible 53 | // duplicated CSS from different components can be deduped. 54 | new OptimizeCSSPlugin({ 55 | cssProcessorOptions: config.build.productionSourceMap 56 | ? { safe: true, map: { inline: false } } 57 | : { safe: true } 58 | }), 59 | // generate dist index.html with correct asset hash for caching. 60 | // you can customize output by editing /index.html 61 | // see https://github.com/ampedandwired/html-webpack-plugin 62 | new HtmlWebpackPlugin({ 63 | filename: config.build.index, 64 | template: 'index.html', 65 | inject: true, 66 | minify: { 67 | removeComments: true, 68 | collapseWhitespace: true, 69 | removeAttributeQuotes: true 70 | // more options: 71 | // https://github.com/kangax/html-minifier#options-quick-reference 72 | }, 73 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 74 | chunksSortMode: 'dependency' 75 | }), 76 | // keep module.id stable when vender modules does not change 77 | new webpack.HashedModuleIdsPlugin(), 78 | // enable scope hoisting 79 | new webpack.optimize.ModuleConcatenationPlugin(), 80 | // split vendor js into its own file 81 | new webpack.optimize.CommonsChunkPlugin({ 82 | name: 'vendor', 83 | minChunks (module) { 84 | // any required modules inside node_modules are extracted to vendor 85 | return ( 86 | module.resource && 87 | /\.js$/.test(module.resource) && 88 | module.resource.indexOf( 89 | path.join(__dirname, '../node_modules') 90 | ) === 0 91 | ) 92 | } 93 | }), 94 | // extract webpack runtime and module manifest to its own file in order to 95 | // prevent vendor hash from being updated whenever app bundle is updated 96 | new webpack.optimize.CommonsChunkPlugin({ 97 | name: 'manifest', 98 | minChunks: Infinity 99 | }), 100 | // This instance extracts shared chunks from code splitted chunks and bundles them 101 | // in a separate chunk, similar to the vendor chunk 102 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk 103 | new webpack.optimize.CommonsChunkPlugin({ 104 | name: 'app', 105 | async: 'vendor-async', 106 | children: true, 107 | minChunks: 3 108 | }), 109 | 110 | // copy custom static assets 111 | new CopyWebpackPlugin([ 112 | { 113 | from: path.resolve(__dirname, '../static'), 114 | to: config.build.assetsSubDirectory, 115 | ignore: ['.*'] 116 | } 117 | ]) 118 | ] 119 | }) 120 | 121 | if (config.build.productionGzip) { 122 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 123 | 124 | webpackConfig.plugins.push( 125 | new CompressionWebpackPlugin({ 126 | asset: '[path].gz[query]', 127 | algorithm: 'gzip', 128 | test: new RegExp( 129 | '\\.(' + 130 | config.build.productionGzipExtensions.join('|') + 131 | ')$' 132 | ), 133 | threshold: 10240, 134 | minRatio: 0.8 135 | }) 136 | ) 137 | } 138 | 139 | if (config.build.bundleAnalyzerReport) { 140 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 141 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 142 | } 143 | 144 | module.exports = webpackConfig 145 | -------------------------------------------------------------------------------- /front/config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /front/config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.2.5 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: {}, 14 | 15 | // Various Dev Server settings 16 | host: '0.0.0.0', // can be overwritten by process.env.HOST 17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 18 | autoOpenBrowser: false, 19 | errorOverlay: true, 20 | notifyOnErrors: true, 21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 22 | 23 | // Use Eslint Loader? 24 | // If true, your code will be linted during bundling and 25 | // linting errors and warnings will be shown in the console. 26 | useEslint: true, 27 | // If true, eslint errors and warnings will also be shown in the error overlay 28 | // in the browser. 29 | showEslintErrorsInOverlay: false, 30 | 31 | /** 32 | * Source Maps 33 | */ 34 | 35 | // https://webpack.js.org/configuration/devtool/#development 36 | devtool: 'eval-source-map', 37 | 38 | // If you have problems debugging vue-files in devtools, 39 | // set this to false - it *may* help 40 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 41 | cacheBusting: true, 42 | 43 | // CSS Sourcemaps off by default because relative paths are "buggy" 44 | // with this option, according to the CSS-Loader README 45 | // (https://github.com/webpack/css-loader#sourcemaps) 46 | // In our experience, they generally work as expected, 47 | // just be aware of this issue when enabling this option. 48 | cssSourceMap: false, 49 | }, 50 | 51 | build: { 52 | // Template for index.html 53 | // index: path.resolve(__dirname, '../dist/index.html'), 54 | index: path.resolve('/usr/code/extra-income/back/server/static/index.html'), 55 | 56 | // Paths 57 | // assetsRoot: path.resolve(__dirname, '../dist'), 58 | assetsRoot: path.resolve('/usr/code/extra-income/back/server/static'), 59 | assetsSubDirectory: 'static', 60 | // assetsPublicPath: '/', 61 | assetsPublicPath: '/static/', 62 | 63 | 64 | /** 65 | * Source Maps 66 | */ 67 | 68 | productionSourceMap: true, 69 | // https://webpack.js.org/configuration/devtool/#production 70 | devtool: '#source-map', 71 | 72 | // Gzip off by default as many popular static hosts such as 73 | // Surge or Netlify already gzip all static assets for you. 74 | // Before setting to `true`, make sure to: 75 | // npm install --save-dev compression-webpack-plugin 76 | productionGzip: false, 77 | productionGzipExtensions: ['js', 'css'], 78 | 79 | // Run the build command with an extra argument to 80 | // View the bundle analyzer report after build finishes: 81 | // `npm run build --report` 82 | // Set to `true` or `false` to always turn it on or off 83 | bundleAnalyzerReport: process.env.npm_config_report 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /front/config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /front/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | front 7 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /front/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "front", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "GenHongChan ", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "lint": "eslint --ext .js,.vue src", 11 | "build": "node build/build.js" 12 | }, 13 | "dependencies": { 14 | "axios": "^0.17.1", 15 | "bootstrap": "^3.3.7", 16 | "element-ui": "^2.3.2", 17 | "express": "^4.16.2", 18 | "jquery": "^2.2.4", 19 | "js-sha1": "^0.5.0", 20 | "less": "^2.7.3", 21 | "swiper": "^4.0.7", 22 | "vue": "^2.5.2", 23 | "vue-resource": "^1.3.4", 24 | "vue-router": "^3.0.1", 25 | "vuelidate": "^0.6.1", 26 | "vuex": "^3.0.1" 27 | }, 28 | "devDependencies": { 29 | "autoprefixer": "^7.1.2", 30 | "babel-core": "^6.22.1", 31 | "babel-eslint": "^7.1.1", 32 | "babel-loader": "^7.1.1", 33 | "babel-plugin-component": "^1.1.0", 34 | "babel-plugin-transform-runtime": "^6.22.0", 35 | "babel-preset-env": "^1.3.2", 36 | "babel-preset-stage-2": "^6.22.0", 37 | "bootstrap-webpack": "^0.0.6", 38 | "chalk": "^2.0.1", 39 | "copy-webpack-plugin": "^4.0.1", 40 | "css-loader": "^0.28.9", 41 | "eslint": "^3.19.0", 42 | "eslint-config-standard": "^10.2.1", 43 | "eslint-friendly-formatter": "^3.0.0", 44 | "eslint-loader": "^1.7.1", 45 | "eslint-plugin-html": "^3.0.0", 46 | "eslint-plugin-import": "^2.7.0", 47 | "eslint-plugin-node": "^5.2.0", 48 | "eslint-plugin-promise": "^3.4.0", 49 | "eslint-plugin-standard": "^3.0.1", 50 | "eventsource-polyfill": "^0.9.6", 51 | "exports-loader": "^0.6.4", 52 | "extract-text-webpack-plugin": "^3.0.0", 53 | "file-loader": "^1.1.4", 54 | "friendly-errors-webpack-plugin": "^1.6.1", 55 | "html-webpack-plugin": "^2.30.1", 56 | "imports-loader": "^0.7.1", 57 | "less-loader": "^4.0.5", 58 | "node-notifier": "^5.1.2", 59 | "optimize-css-assets-webpack-plugin": "^3.2.0", 60 | "ora": "^1.2.0", 61 | "portfinder": "^1.0.13", 62 | "postcss-import": "^11.0.0", 63 | "postcss-loader": "^2.0.8", 64 | "rimraf": "^2.6.0", 65 | "semver": "^5.3.0", 66 | "shelljs": "^0.7.6", 67 | "style-loader": "^0.19.1", 68 | "uglifyjs-webpack-plugin": "^1.1.1", 69 | "url-loader": "^0.5.8", 70 | "vue-loader": "^13.3.0", 71 | "vue-style-loader": "^3.0.1", 72 | "vue-template-compiler": "^2.5.2", 73 | "webpack": "^3.6.0", 74 | "webpack-bundle-analyzer": "^2.9.0", 75 | "webpack-dev-server": "^2.9.1", 76 | "webpack-merge": "^4.1.0" 77 | }, 78 | "engines": { 79 | "node": ">= 4.0.0", 80 | "npm": ">= 3.0.0" 81 | }, 82 | "browserslist": [ 83 | "> 1%", 84 | "last 2 versions", 85 | "not ie <= 8" 86 | ] 87 | } 88 | -------------------------------------------------------------------------------- /front/src/App.vue: -------------------------------------------------------------------------------- 1 | 12 | 29 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /front/src/assets/adv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/src/assets/adv.png -------------------------------------------------------------------------------- /front/src/assets/banner1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/src/assets/banner1.jpg -------------------------------------------------------------------------------- /front/src/assets/banner2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/src/assets/banner2.jpg -------------------------------------------------------------------------------- /front/src/assets/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/src/assets/camera.png -------------------------------------------------------------------------------- /front/src/assets/genchan.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/src/assets/genchan.jpeg -------------------------------------------------------------------------------- /front/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/src/assets/logo.png -------------------------------------------------------------------------------- /front/src/assets/recommendPro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/src/assets/recommendPro.jpg -------------------------------------------------------------------------------- /front/src/assets/releaseBanner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/src/assets/releaseBanner.jpg -------------------------------------------------------------------------------- /front/src/components/AdvManage.vue: -------------------------------------------------------------------------------- 1 | 16 | 54 | 55 | 148 | -------------------------------------------------------------------------------- /front/src/components/EmployeeScore.vue: -------------------------------------------------------------------------------- 1 | 15 | 25 | 45 | -------------------------------------------------------------------------------- /front/src/components/EmployerScore.vue: -------------------------------------------------------------------------------- 1 | 15 | 23 | 41 | -------------------------------------------------------------------------------- /front/src/components/Login.vue: -------------------------------------------------------------------------------- 1 | 15 | 49 | 118 | 119 | -------------------------------------------------------------------------------- /front/src/components/MyFooter.vue: -------------------------------------------------------------------------------- 1 | 30 | 66 | -------------------------------------------------------------------------------- /front/src/components/MyHeader.vue: -------------------------------------------------------------------------------- 1 | 104 | 150 | 193 | 194 | -------------------------------------------------------------------------------- /front/src/components/Portrait.vue: -------------------------------------------------------------------------------- 1 | 15 | 24 | 46 | -------------------------------------------------------------------------------- /front/src/components/ProManage.vue: -------------------------------------------------------------------------------- 1 | 10 | 66 | 136 | -------------------------------------------------------------------------------- /front/src/components/ProjectBox.vue: -------------------------------------------------------------------------------- 1 | 64 | 104 | 167 | -------------------------------------------------------------------------------- /front/src/components/Register.vue: -------------------------------------------------------------------------------- 1 | 18 | 61 | 136 | 137 | -------------------------------------------------------------------------------- /front/src/components/ShowOldPro.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 67 | 78 | -------------------------------------------------------------------------------- /front/src/components/UserManage.vue: -------------------------------------------------------------------------------- 1 | 13 | 76 | 147 | -------------------------------------------------------------------------------- /front/src/components/share/Advertisement.vue: -------------------------------------------------------------------------------- 1 | 31 | 38 | 39 | 55 | -------------------------------------------------------------------------------- /front/src/components/share/ApplyCard.vue: -------------------------------------------------------------------------------- 1 | 31 | 46 | 58 | -------------------------------------------------------------------------------- /front/src/components/share/CardGrounp.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 38 | 101 | -------------------------------------------------------------------------------- /front/src/components/share/MyDialog.vue: -------------------------------------------------------------------------------- 1 | 14 | 20 | 25 | -------------------------------------------------------------------------------- /front/src/components/share/MyProgress.vue: -------------------------------------------------------------------------------- 1 | 26 | 34 | 44 | -------------------------------------------------------------------------------- /front/src/components/share/ProjectCard.vue: -------------------------------------------------------------------------------- 1 | 58 | 59 | 81 | 86 | -------------------------------------------------------------------------------- /front/src/components/share/ReleaseInfo.vue: -------------------------------------------------------------------------------- 1 | 113 | 169 | 174 | -------------------------------------------------------------------------------- /front/src/config/config.js: -------------------------------------------------------------------------------- 1 | let baseUrl = 'http://127.0.0.1:5000/' 2 | let tokenKey = 'JD98Dskw=23njQndW9D' 3 | export {baseUrl, tokenKey, updateRules, commonRules} 4 | 5 | 6 | const updateRules = { 7 | title: [ 8 | { required: true, message: '请输入更新主题', trigger: 'blur' }, 9 | { min: 3, max: 12, message: '长度在 3 到 12 个字符', trigger: 'blur' } 10 | ], 11 | desc: [ 12 | { required: true, message: '请填更新描述', trigger: 'blur' }, 13 | { min: 1, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' } 14 | ], 15 | progress: [ 16 | { required: true, message: '进度不能为空'}, 17 | { type: 'number', message: '进度必须为数字值'}, 18 | ] 19 | } 20 | 21 | const commonRules = { 22 | number (message) { 23 | return [ 24 | { required: true, message: message + '不能为空'}, 25 | { type: 'number', message: message + '必须为数字值'}, 26 | ] 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /front/src/css/theme.less: -------------------------------------------------------------------------------- 1 | @baseColor: #fff; 2 | @secondColor: #00ffb9; 3 | @fontColor: #000; 4 | @btnBackImg: linear-gradient(-133deg,#00ffb9,#ACFFEC); 5 | .btnTheme(){ 6 | border-style: none; 7 | line-height: 32px; 8 | padding: 0 32px; 9 | background-image: @btnBackImg; 10 | border-radius: 16px; 11 | font-family: PingFangSC-Regular; 12 | font-size: 14px; 13 | color: #000; 14 | letter-spacing: 0; 15 | display: inline-block; 16 | cursor: pointer; 17 | margin-right: 10px; 18 | } 19 | .box-shadow(@color, @frist, @second, @third, @fouth:0){ 20 | -moz-box-shadow:@color @frist @second @third @fouth; /* Firefox */ 21 | -webkit-box-shadow:@color @frist @second @third @fouth; /* Safari 和 Chrome */ 22 | box-shadow: @color @frist @second @third @fouth; /* Opera 10.5+, 以及使用了IE-CSS3的IE浏览器 */ 23 | 24 | } 25 | .my-dialog(@size){ 26 | position: fixed; 27 | top: 25%; 28 | left: 50% - @size/2; 29 | background-color: #fff; 30 | min-width: 400px; 31 | width: @size; 32 | padding: 15px; 33 | .box-shadow(#cdcdcd,0,0,10px); 34 | z-index: 10001; 35 | opacity: 1; 36 | border-radius: 4px; 37 | } 38 | -------------------------------------------------------------------------------- /front/src/js/testToken.js: -------------------------------------------------------------------------------- 1 | import {baseUrl} from "../config/config"; 2 | // todo 验证登录状态token是否失效 3 | let testToken = () => { 4 | let result = false 5 | let store = window.localStorage 6 | let xhr = null 7 | if(window.XMLHttpRequest) 8 | xhr = new XMLHttpRequest() 9 | else 10 | xhr = new ActiveXObject() 11 | xhr.onreadystatechange = () => { 12 | if (xhr.readyState == 4 && xhr.status == 200) { 13 | result = true 14 | } 15 | } 16 | xhr.open('POST', baseUrl+'tokenCheck') 17 | xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8"); 18 | xhr.send("token="+store['token']) 19 | return result 20 | } 21 | 22 | export {testToken} 23 | -------------------------------------------------------------------------------- /front/src/js/webData.js: -------------------------------------------------------------------------------- 1 | const category = { 2 | developer: ['Python', 'Web', 'Html5', 'Java', 'Android', 3 | 'Ios', 'lunix', '.net', 'Php', '小程序'], 4 | design: ['PhotoShop', '网站设计', 'App设计', 'logo设计', 'Flash'], 5 | market: ['线上活动/执行', '线下活动/执行', '创意方案/执行', '新媒体运营', 'App推广', '用户运营', '写手' ], 6 | product: ['原型设计', '后台产品', 'App产品', '网站产品', '产品咨询', '需求撰写'] 7 | } 8 | 9 | export {category} 10 | -------------------------------------------------------------------------------- /front/src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import resource from 'vue-resource' 6 | import router from './router' 7 | import Vuex from 'vuex' 8 | import 'bootstrap-webpack' 9 | import $ from 'jquery' 10 | import Vuelidate from 'vuelidate' 11 | import axios from 'axios' 12 | import {baseUrl} from "./config/config"; 13 | import {Table, TableColumn, Loading, Popover, Button, MessageBox, Dialog, Form, Input, FormItem, 14 | Upload, Notification, Progress, Tag, Alert, Row, Col, Menu, MenuItem, Submenu,Pagination, Radio, 15 | RadioGroup 16 | } from 'element-ui' 17 | 18 | Vue.use(Loading.directive) 19 | Vue.use(Table) 20 | Vue.use(TableColumn) 21 | Vue.use(Submenu) 22 | Vue.use(Radio) 23 | Vue.use(RadioGroup) 24 | Vue.use(Row) 25 | Vue.use(Pagination) 26 | Vue.use(Col) 27 | Vue.use(MenuItem) 28 | Vue.use(Menu) 29 | Vue.use(Popover) 30 | Vue.use(Button) 31 | Vue.use(Form) 32 | Vue.use(Alert) 33 | Vue.use(Dialog) 34 | Vue.use(Input) 35 | Vue.use(FormItem) 36 | Vue.use(Upload) 37 | Vue.use(Progress) 38 | Vue.use(Tag) 39 | Vue.prototype.$ajax = axios 40 | Vue.prototype.$confirm = MessageBox.confirm; 41 | Vue.prototype.$notify = Notification; 42 | 43 | window.$ = $ 44 | 45 | router.beforeEach((to, from, next) => { 46 | document.body.scrollTop = document.documentElement.scrollTop = 0; 47 | let webStore = window.localStorage 48 | if (!store.state.hasLogin && 'token' in webStore) { 49 | new Promise(function (resolve, reject) { 50 | let xhr = null 51 | if (window.XMLHttpRequest) { 52 | xhr = new XMLHttpRequest() 53 | } else { 54 | xhr = new ActiveXObject() 55 | } 56 | xhr.open('POST', baseUrl + 'tokenCheck') 57 | xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=UTF-8') 58 | xhr.send('token=' + webStore['token']) 59 | xhr.onreadystatechange = () => { 60 | if (xhr.readyState !== 4) { 61 | return 62 | } 63 | if (xhr.status === 200) { 64 | resolve(xhr.responseText) 65 | } else { 66 | reject() 67 | } 68 | } 69 | }).then((result) => { 70 | result = parseInt(result) 71 | if (result === 10000) { 72 | store.commit('changeLoginId', webStore['token'].split('-')[0]) 73 | } else { 74 | webStore.removeItem('token') 75 | console.log('过期') 76 | next() 77 | } 78 | next() 79 | return axios.get(baseUrl + 'showBase', { 80 | params: { 81 | id: webStore['token'].split('-')[0] 82 | } 83 | }) 84 | }, () => { 85 | next() 86 | }).then(res => { 87 | store.commit('changeHead', res.data.headImg) 88 | }) 89 | } else { 90 | next() 91 | } 92 | }) 93 | Vue.use(Vuelidate) 94 | Vue.use(Vuex) 95 | Vue.use(resource) 96 | Vue.config.productionTip = false 97 | const store = new Vuex.Store({ 98 | state: { 99 | curtain: false, 100 | myHeader: false, 101 | hasLogin: false, 102 | headPic: 'default_head.jpg', 103 | loginId: null, 104 | adminLogin: false, 105 | adminName: null 106 | }, 107 | mutations: { 108 | changeSingerState (state, obj) { 109 | state[obj.stateName] = obj.value 110 | }, 111 | changeSinger (state, stateName) { 112 | state[stateName] = !state[stateName] 113 | }, 114 | changeHead (state, headPic) { 115 | state.headPic = headPic 116 | }, 117 | changeLoginId (state, value) { 118 | state.loginId = value 119 | state.hasLogin = !state.hasLogin 120 | } 121 | } 122 | }) 123 | 124 | /* eslint-disable no-new */ 125 | new Vue({ 126 | el: '#app', 127 | router, 128 | store, 129 | template: '', 130 | components: { App } 131 | }) 132 | -------------------------------------------------------------------------------- /front/src/pages/Admin.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | 12 | 24 | -------------------------------------------------------------------------------- /front/src/pages/AdminIndex.vue: -------------------------------------------------------------------------------- 1 | 23 | 60 | 86 | -------------------------------------------------------------------------------- /front/src/pages/AdminLogin.vue: -------------------------------------------------------------------------------- 1 | 13 | 28 | 71 | -------------------------------------------------------------------------------- /front/src/pages/Expert.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /front/src/pages/Index.vue: -------------------------------------------------------------------------------- 1 | 82 | 129 | 194 | -------------------------------------------------------------------------------- /front/src/pages/Projects.vue: -------------------------------------------------------------------------------- 1 | 36 | 58 | 135 | 136 | -------------------------------------------------------------------------------- /front/src/pages/ReleasePro.vue: -------------------------------------------------------------------------------- 1 | 20 | 26 | 55 | -------------------------------------------------------------------------------- /front/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | const Index = () => import('@/pages/Index') 4 | const Projects = () => import('@/pages/Projects') 5 | const Expert = () => import('@/pages/Expert') 6 | const UserInfo = () => import('@/pages/UserInfo') 7 | const ShowUserInfo = () => import('@/pages/ShowUserInfo') 8 | const ReleasePro = () => import('@/pages/ReleasePro') 9 | const ShowReleasePro = () => import('@/pages/ShowReleasePro') 10 | const ShowMoreRelease = () => import('@/pages/ShowMoreRelease') 11 | const ProjectOrder = () => import('@/pages/ProjectOrder') 12 | const Account = () => import('@/pages/Account') 13 | const Admin = () => import('@/pages/Admin') 14 | const AdminLogin = () => import('@/pages/AdminLogin') 15 | const AdminIndex = () => import('@/pages/AdminIndex') 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | Vue.use(Router) 27 | 28 | export default new Router({ 29 | routes: [ 30 | { 31 | path: '/', 32 | name: 'index', 33 | component: Index 34 | }, 35 | { 36 | path: '/myProjects', 37 | name: 'projects', 38 | component: Projects 39 | }, 40 | { 41 | path: '/expert', 42 | name: 'expert', 43 | component: Expert 44 | }, 45 | { 46 | path: '/userInfo', 47 | name: 'userInfo', 48 | component: UserInfo 49 | }, 50 | { 51 | path: '/showUserInfo/:id', 52 | name: 'showUserInfo', 53 | component: ShowUserInfo, 54 | props: true, 55 | }, 56 | { 57 | path: '/releasePro', 58 | name: 'releasePro', 59 | component: ReleasePro 60 | }, 61 | { 62 | path: '/showReleasePro/:id', 63 | name: 'showReleasePro', 64 | component: ShowReleasePro, 65 | props: true, 66 | }, 67 | { 68 | path: '/showMoreRelease', 69 | name: 'showMoreRelease', 70 | component: ShowMoreRelease 71 | }, 72 | { 73 | path: '/projectOrder/:id', 74 | name: 'projectOrder', 75 | component: ProjectOrder, 76 | props: true, 77 | }, 78 | { 79 | path: '/account', 80 | name: 'account', 81 | component: Account, 82 | }, 83 | { 84 | path: '/admin/', 85 | name: 'admin', 86 | component: Admin, 87 | redirect: '/admin/login', 88 | children: [ 89 | { 90 | path: 'login', 91 | name: 'adminLogin', 92 | component:AdminLogin 93 | }, 94 | { 95 | path: 'dashboard', 96 | name: 'dashboard', 97 | component: AdminIndex 98 | } 99 | ] 100 | } 101 | ] 102 | }) 103 | -------------------------------------------------------------------------------- /front/static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CHHome/extra-income/2ecb97e55d52e60b1ec6fcfdaed8deaed6775101/front/static/.gitkeep --------------------------------------------------------------------------------