2019独角兽企业重金招聘Python工程师标准>>>

一、APP原型

参考另一篇博客:https://my.oschina.net/u/2480757/blog/788578

二、项目需求

为签到App提供登录、注册、请假,签到等相关数据接口。

三、项目结构

四、数据库设计

用到了Mongoose将实体类和数据库对象一一对应起来,同时通过Mongoose操作数据库也极为简单。

###五、编写相关实体类

用户
var userschema=new mongoose.Schema({
username:String,
password:String
});
签到记录
var signinschema=new mongoose.Schema({
user_name:String,
unique_id:String,/username+日期/
am_signin:String,
am_signout:String,
pm_signin:String,
pm_signout:String,
night_signout:String,
night_signin:String,
create_date:{type: Date, default: Date.now}
});
请假记录
var holidayschema=new mongoose.Schema({
user_name:String,
begin_time:String,
end_time:String,
reason:String,
feedback:String
});

六、路由控制

APP需要什么样的接口,在此文件里配置,然后再在相应的控制器中写相应的函数逻辑处理代码。

module.exports = function(app) {/*处理用户登录请求*/app.post('/phone_api/login',User.login);/*处理用户登录请求*/app.post('/phone_api/register',User.register);/*用户提交请假请求*/app.post('/phone_api/add_holiday',Holiday.addHoliday);/*获取用户提交请假记录*/app.post('/phone_api/get_holidays',Holiday.getHolidays);/*用户签到*/app.post('/phone_api/sign_in',Signin.signin);/*用户签到签到记录*/app.post('/phone_api/get_signins',Signin.getSignins);
};

七、主要代码

7.1、用户登录

/*处理用户登录请求*/
exports.login=function(req,res){var username=req.body.username;var password=req.body.password;User.findOne({username:username}, function (err, docs) {if(err){res.json({"status":"error","msg":"error_system"});/*系统错误*/}else if(docs==null){res.json({"status":"error","msg":"error_username"});/*用户名不存在*/} else {if(docs.password==password){res.json({"status":"success","msg":""});}else{res.json({"status":"error","msg":"error_password"});}}})
}

7.2、用户签到:主要判断用户点击的按钮,同时需要当前是否存在用户签到记录,通过一个可预见性的Unique_id来实现。及用户名加日期来限制该记录当天的唯一性。

exports.signin=function(req,res){var unique_id=req.body.unique_id;var user_name=req.body.user_name;var type=req.body.type;var date=req.body.date;Signin.findOne({unique_id:unique_id}, function (err, docs) {if(err){res.json({"status":"error","msg":"error_system"});/*系统错误*/}else if(docs==null){/*如何没有找到签到记录,那么是当天第一次签到*/var newSignin=new Signin();newSignin.unique_id=unique_id;newSignin.user_name=user_name;if(type=="am_signin"){newSignin.am_signin=date;newSignin.am_signout="0";newSignin.pm_signin="0";newSignin.pm_signout="0";newSignin.night_signin="0";newSignin.night_signout="0";newSignin.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else if(type=="am_signout"){newSignin.am_signin="0";newSignin.am_signout=date;newSignin.pm_signin="0";newSignin.pm_signout="0";newSignin.night_signin="0";newSignin.night_signout="0";newSignin.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else if(type=="pm_signin"){newSignin.am_signin="0";newSignin.am_signout="0";newSignin.pm_signin=date;newSignin.pm_signout="0";newSignin.night_signin="0";newSignin.night_signout="0";newSignin.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else if(type=="pm_signout"){newSignin.am_signin="0";newSignin.am_signout="0";newSignin.pm_signin="0";newSignin.pm_signout=date;newSignin.night_signin="0";newSignin.night_signout="0";newSignin.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else if(type=="night_signin"){newSignin.am_signin="0";newSignin.am_signout="0";newSignin.pm_signin="0";newSignin.pm_signout="0";newSignin.night_signin=date;newSignin.night_signout="0";newSignin.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else if(type=="night_signout"){newSignin.am_signin="0";newSignin.am_signout="0";newSignin.pm_signin="0";newSignin.pm_signout="0";newSignin.night_signin="0";newSignin.night_signout=date;newSignin.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}} else {/*如果有记录,只需要修改签到记录即可*/if(type=="am_signin"){/*修改签到记录*/if(docs.am_signin=="0"){docs.am_signin=date;docs.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else{/*如果有记录,则表示已经签到过了*/res.json({"status":"error","msg":"already_signin"});}}else if(type=="am_signout"){if(docs.am_signout=="0"){docs.am_signout=date;docs.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else{/*如果有记录,则表示已经签到过了*/res.json({"status":"error","msg":"already_signin"});}}else if(type=="pm_signin"){if(docs.pm_signin=="0"){docs.pm_signin=date;docs.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else{/*如果有记录,则表示已经签到过了*/res.json({"status":"error","msg":"already_signin"});}}else if(type=="pm_signout"){if(docs.pm_signout=="0"){docs.pm_signout=date;docs.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else{/*如果有记录,则表示已经签到过了*/res.json({"status":"error","msg":"already_signin"});}}else if(type=="night_signin"){if(docs.night_signin=="0"){docs.night_signin=date;docs.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else{/*如果有记录,则表示已经签到过了*/res.json({"status":"error","msg":"already_signin"});}}else if(type=="night_signout"){if(docs.night_signout=="0"){docs.night_signout=date;docs.save(function(err){if(err){res.json({"status":"error","msg":"error_system"})}else{res.json({"status":"success","msg":""});}});}else{/*如果有记录,则表示已经签到过了*/res.json({"status":"error","msg":"already_signin"});}}}})
}

7.3 关于分页获取签到记录 sort按照id倒序排列,limit每页显示10条记录,skip跳过多少条记录。

/*获得用户签到记录*/
exports.getSignins=function(req,res){/*用户id*/var user_name=req.body.user_name;/*页数*/var page_num=req.body.page_num;/*分页*/Signin.find({user_name:user_name}).sort({'_id':-1}).limit(10).skip((page_num-1)*10).exec(function (err, doc) {if(err){res.json({"status":"error","msg":"error_system"});}else{if(doc.isNull){res.json({"status":"success","msg":"data_empty"});}res.json({"status":"success","msg":doc});}})
}

###八、问题与总结 使用Natapp内外网映射工具的时候需要修改端口号,将其从默认3000修改为80。
APP项目源码: https://github.com/dpc761218914/SignIn
Node.js服务端源码: https://github.com/dpc761218914/SignIn_Server

转载于:https://my.oschina.net/u/2480757/blog/789212

入门级Node.js express服务端开发_Android签到APP相关推荐

  1. 如何高效快速地在Linux系统上部署Node.js+Express+MySQL的开发环境(桌面可视化)...

    一.前言 可能一些初级前端和我一样,在有些项目需要前后台都一个人打通搞定的时候,对于后台和开发环境的部署还是比较头疼的.特别是Linux系统,由于没有系统接触过,也不太喜欢去记背那么多命令,大部分命令 ...

  2. node.js express php,nodejs开发——express路由与中间件

    路由 通常HTTP URL的格式是这样的: http表示协议. host表示主机. port为端口,可选字段,不提供时默认为80. path指定请求资源的URI(Uniform Resource Id ...

  3. 前端工程化:express服务端开发

    目录 1.express基本使用 1. 安装依赖 2. 创建服务 3. 启动服务 2.express中间件和异常 1. 中间件分3种 2. 异常捕获有3种 3.https服务和静态服务 1. http ...

  4. node.js+Express计算机毕业设计人体健康管理app(程序+LW+部署)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程.欢迎交流 项目运行 环境配置: Node.js+ Vscode + Mysql5.7 + HBuilderX+Navicat11+Vue ...

  5. 基于安卓的企业物流管理系统(Android客户端+JavaSSM服务端开发的物流管理APP)

    摘 要 随着互联网的技术的快速发展和无线网络的更新迭代,使4G网络已成为过去式5G网络蓬勃发展.技术的发展,硬件的提高使人们使用智能手机可以更加快速.便捷的浏览信息.获取信息. 本文首先介绍企业物流管 ...

  6. rds基于什么开发_为什么不学基于TypeScript的Node.js服务端开发?

    为什么不学?学不动了吗?!别躺下啊,我扶你起来! 我们早就知道,如今的JavaScript已经不再是当初那个在浏览器网页中写写简单的表单验证.没事弹个alert框吓吓人的龙套角色了.借助基于v8引擎的 ...

  7. SAP UI5 应用开发教程之五十五 - 如何将本地 SAP UI5 应用通过 Node.js Express 部署到公网上试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  8. NodeJS+Express+mySQL服务端开发详解

    NodeJS+Express+mySQL服务端开发详解 随着NodeJS的发展,现在已经被很多人熟知,NodeJS已经成为了前端开发人员必备的技能.本文不会对NodeJS过多介绍 如果你感兴趣可以访问 ...

  9. github nodejs mysql_GitHub - lizhuohaicode/express: nodejs服务端开发(Express+Mysql)---小k博客...

    nodejs服务端开发(Express+Mysql) 项目展示 git clone git@github.com:htmlk/express.git 2.再导入express.sql到数据库,数据库名 ...

最新文章

  1. 获取文件后缀的五种方法
  2. HDU 3336 Count the string KMP
  3. Leetcode:Intersection of Two Linked Lists
  4. 微服务架构可视化平台实践
  5. [Spring cloud 一步步实现广告系统] 8. 检索系统配置依赖
  6. Python:数字的格式化输出
  7. 思科加强生成树性能的属性(Portfast /Uplinkfast/BackboneFast)与RSTP的关系
  8. 谈谈一些有趣的CSS题目(十五)-- 谈谈 CSS 关键字 initial、inherit 和 unset
  9. Jquery 禁用浏览器的 后退和前进按钮
  10. SecureCRT无法使用root账户远程连接ubuntu
  11. 微型计算机如何开声音,MP3声控录音机
  12. js实现轮播图背景色随之渐变的效果(小程序版)
  13. codelite编译器配置
  14. 2020厦门大学计算机系学硕,2020考研厦门大学推荐:热门专业及学科设置
  15. php base64保存为图片
  16. Mock工具之Moco使用教程
  17. Tomcat 优化
  18. Less简介——CSS
  19. Matplotlib 绘制圆环图的两种方法!
  20. Python深度学习-ch5深度学习用于计算机视觉

热门文章

  1. 微信小程序后台接口调试及发布
  2. c++代码实现我的世界(3)续
  3. AutoCAD 2007-2023.1 安装教程,“珊瑚の海”精简优化版
  4. radmin不能发送Ctrl+Alt+Del的解决办法
  5. python中file是什么意思_python文件file
  6. 影视剪辑,再来新一波视频剪辑素材
  7. 百度地图WebAPI
  8. 解决电脑不能够发现蓝牙键盘,不能够连接蓝牙键盘问题
  9. (转)爱剪辑学习记录_2.快速添加、截取、删除视频片段
  10. 分享几款超级好用的手机APP,你肯定能用到