add some api

This commit is contained in:
2018-05-27 17:10:30 +08:00
parent 8389b7dbaf
commit 90305d393a
33 changed files with 14627 additions and 57 deletions

104
servers/app.js Normal file
View File

@@ -0,0 +1,104 @@
let Koa = require("koa");
let bodyParser = require('koa-body');
let route = require('koa-route');
const logger = require('koa-logger')
const compose = require('koa-compose');
let db = require('./sql');
const app = new Koa();
app.use(bodyParser({multipart: true}));
// app.use(async(ctx, next) => {
// console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);
// await next();
// })
app.use(logger());
app.use(async(ctx, next)=>{
if(ctx.request.method == "POST"){
// for(ctx.request.body in ctx.request.body);
console.log(ctx.request.body);
}
await next();
})
let getTitale = async(ctx,next)=>{
ctx.response.body = JOSN.stringify({name:(await db.activity.get_tital(ctx.query['paper_id']))});
}
// start 返回问卷信息 开始计时
/**
* name student_id school user_class telephone paper_id
*
* setcookie
{
time_lim: 600,
paper_id: "sadsada",
question_list:[
{
type: 0
question_id : "sdadsadsad"
question: "asdasd",
answer:[
{
num: number,
content: "sdafsdsa"
},
]
},
]
}
*/
let start = async(ctx,next)=>{
let post = ctx.request.body;
let paper_id = post.paper_id;
delete post.paper_id;
post.user_ip = ctx.request.headers["x-real-ip"];
ctx.session.user_id = await db.user.init_user(post);
ctx.session.activity_id = paper_id;
ctx.session.start_time = new Date();
let rec = await db.activity.get_paper(paper_id);
if(rec == "time_err"){
ctx.response.body=JSON.stringify({success:false,msg:"不在答题时间,不能答题"});
}else{
ctx.response.body = JSON.stringify(rec);
}
}
//记录返回信息
/*
[question_id = num]
{
success: true,
msg: "您已经参加过","提交成功"
}
*/
let end = async(ctx,next)=>{
let post = ctx.request.body;
let end_time = new Date();
if(await db.activity.is_time_out(
ctx.session.activity_id,
ctx.session.start_time,
end_time
)){
ctx.response.body = JSON.stringify({success: false,msg:"用时过分长"});
}else{
let test_id = await db.test_paper.log_in(db.question,
ctx.session.activity_id,
ctx.session.user_id,
ctx.session.start_time,
end_time,
post
);
if(test_id == 'had'){
ctx.response.body = JSON.stringify({success: false,msg:"已参加哦"});
}else{
await Promise.all([db.user.add_test(ctx.session.user_id,test_id),
db.activity.add_test(ctx.session.activity_idtest_id,test_id)
])
ctx.response.body = JSON.stringify({success: true,msg:"已成功提交"});
}
}
}
app.use(compose([
route.get('/api/getTital',getTitale),
route.post('/api/start',start),
route.post('/api/end',end)
]));
app.listen(8083);
console.log('app started at port 8083...');

32
servers/db.txt Normal file
View File

@@ -0,0 +1,32 @@
question
|- user
| |- student_id
| |- name
| |- school
| |- user_class
| |- telephone
| |- user_ip
| |- test_list
| | |- test_paper_id
|- activity
| |- name
| |- start_time
| |- end_time
| |- question_list
| |- time_lim
| |- contestant_paper_list
|- question
| |- type
| |- problem
| |- answer
| | |- content
| | |- price
| | |- try_user_list
|- test_paper
| |- user_id
| |- activity_id
| |- question_list
| |- answer_list
| |- time_start
| |- time_end
| |- fraction

182
servers/sql.js Normal file
View File

@@ -0,0 +1,182 @@
let mongoose = require('mongoose');
let Schema = mongoose.Schema;
let user = new Schema({
student_id: String,
name: String,
school: String,
user_class: String,
telephone: String,
user_ip: String,
test_list:[{type: mongoose.Schema.ObjectId, ref: "test_paper"}],
});
let activity = new Schema({
name: String,
strat_time: Date,
end_time: Date,
question_num: Number,
question_list: [{type: mongoose.Schema.ObjectId, ref: "question"}],
time_lim: Number,
contestant_paper_list: [{type: mongoose.Schema.ObjectId, ref: "test_paper"}],
})
let question = new Schema({
type: Number,
problem: String,
answer:[{
content: String,
price: Number,
try_user_list:[{type: mongoose.Schema.ObjectId, ref: "user"}],
}]
})
let test_paper = new Schema({
user_id: {type: mongoose.Schema.ObjectId, ref: "user"},
activity: {type: mongoose.Schema.ObjectId, ref: "activity"},
question_list:[{type: mongoose.Schema.ObjectId, ref: "question"}],
answer: [String],
time_start: Date,
time_end: Date,
fraction: Number,
})
user.statics.init_user = function(user){
return new Promise((rec,rej)=>{
this.findOne({telephone:user.telephone},async (err,rew)=>{
if(err) console.log(err);
if(rew){
rew.name = post.name;
rew.student_id = post.student_id;
rew.school = post.school;
rew.user_class = post.user_class;
await rew.save();
rec(rew._id);
return;
}
let a_user = new this(user);
await a_user.save();
rec(a_user._id);
})
})
}
user.static.add_test = function(user_id,test_id){
this.findById(user_id).exec(async(err,rew)=>{
if(err)console.log(err);
rew.test_list.push(test_id);
await rew.save();
rec(rew);
})
}
activity.static.add_test = function(activity_id,test_id){
this.findById(activity_id).exec(async(err,rew)=>{
if(err)console.log(err);
rew.contestant_paper_list.push(test_id);
await rew.save();
rec(rew);
})
}
activity.static.get_tital = function(activity_id){
return new Promise((rec,rej)=>{
this.findById(activity_id,(err,rew)=>{
if(err)console.log(err);
if(rew){
rec(rew.name);
}else{
rec('NULL');
}
})
})
}
activity.static.get_paper = function(activity_id,no_time_lim = false){
return new Promise((rec,rej)=>{
this.findById(activity_id).populate('question_list').exec((err,rew)=>{
if(err) console.log(err);
let now = new Date();
if((now < rew.end_time && now > rew.strat_time)||no_time_lim){
let question_list = rew.question_list;
while (question_list.length > rew.question_num) {
question_list.splice(Math.floor(Math.random()*(question_list.length)),1);
}
for (it of question_list) {
for (at in it.answer) {
it.answer[a].num = at + it.answer.length * Math.floor(Math.random()*5000);
delete it.answer[a].price;
delete it.answer[a].try_user_list;
}
it.question_id = it._id;
}
rec({
time_lim: rew.time_lim,
paper_id: rew._id,
question_list: question_list
});
}else{
rec('time_err');
}
})
})
}
activity.static.is_time_out = function(activity_id,strat_time,end_time){
return new Promise((rec,rej)=>{
this.findById(activity_id).exec((err,rew)=>{
if(err)console.log(err);
let use_time = end_time - strat_time / 1000;
if(rew.time_lim - use_time > -20){
rec(false);
}else{
rec(true);
}
})
})
}
test_paper.static.log_in = function(question_db,activity_id,user_id,strat_time,end_time,post){
return new Promise((rec,rej)=>{
this.findOne({user_id: user_id,activity:activity_id}).exec(async(err,rew)=>{
if(err)console.log(err);
if(rew){
rec("had");
}else{
let a_test_paper = new this({
user_id: user_id,
activity:activity_id,
question_list:[],
answer:[],
time_start: strat_time,
time_end: end_time,
fraction: 0
})
let promise_list = [];
for(a in post){
promise_list.push(question_db.get_in_it(a,post[a],user_id));
a_test_paper.answer.push(post[a]);
a_test_paper.problem.push(a);
}
let fraction_list = await Promise.all(promise_list);
a_test_paper.fraction = eval(fraction_list.join("+"));
await a_test_paper.save();
rec(a_test_paper._id);
}
})
})
}
question.static.get_in_it = function(question_id,answer_num,user_id){
return new Promise((rec,rej)=>{
this.findById(question_id).exec((err,rew)=>{
if(err) console.log(err);
if(rew.answer[answer_num%rew.answer.length].try_user_list.indexOf(user_id) == -1){
rew.answer[answer_num%rew.answer.length].try_user_list.push(user_id);
}
rec(rew.answer[answer_num%rew.answer.length].price);
})
})
}
mongoose.connect("mongodb://127.0.0.1:27017/question", { config: { autoIndex: false } });
let user_db = mongoose.model('user', user);
let activity_db = mongoose.model('activity', activity);
let question_db = mongoose.model('question', question);
let test_paper_db = mongoose.model('test_paper', test_paper);
let cookie_db = mongoose.model('cookie',cookie);
module.exports={
user: user_db,
activity: activity_db,
question: question_db,
test_paper: test_paper_db,
cookie: cookie_db,
}