add some api
This commit is contained in:
104
servers/app.js
Normal file
104
servers/app.js
Normal 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
32
servers/db.txt
Normal 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
182
servers/sql.js
Normal 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,
|
||||
}
|
||||
Reference in New Issue
Block a user