├── .idea ├── .name ├── encodings.xml ├── modules.xml ├── misc.xml └── babycare.iml ├── README.md └── tconch.py /.idea/.name: -------------------------------------------------------------------------------- 1 | babycare -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/babycare.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 17 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## API 3 | 4 | ### 注册 5 | ``` 6 | curl -H "Content-Type: application/json" -X POST -d '{"username":"xyz","password":"xyz"}' http://localhost:5000/api/v1/register 7 | 8 | ``` 9 | 10 | ### 登录 11 | ``` 12 | curl -H "Content-Type: application/json" http://127.0.0.1:5000/auth -X POST -d '{"username":"xyz","password":"xyz"}' 13 | { 14 | "token": "eyJpYXQiOjE0NzI0NTkwNDIsImV4cCI6MTQ3MjQ1OTY0MiwiYWxnIjoiSFMyNTYifQ.eyJpZCI6MX0.LLE5eVOsARkosrSyXeusMOtpL4z2OnKU_hcpSGgIGmw" 15 | } 16 | 17 | request.setHeader("Authorization", "JWT "+Base64.encodeBytes("login:password".getBytes())); 18 | ``` 19 | 20 | ### 认证 21 | ``` 22 | curl -H "Content-Type: application/json" -H "Authorization:JWT eyJpYXQiOjE0NzI0NTkwNDIsImV4cCI6MTQ3MjQ1OTY0MiwiYWxnIjoiSFMyNTYifQ.eyJpZCI6MX0.LLE5eVOsARkosrSyXeusMOtpL4z2OnKU_hcpSGgIGmw" -X POST http://127.0.0.1:5000/api/v1/get_info 23 | 24 | request.setHeader("Authorization", "JWT "+Base64.encodeBytes("login:password".getBytes())); 25 | ``` 26 | 27 | 28 | -------------------------------------------------------------------------------- /tconch.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | import time 3 | from datetime import timedelta 4 | 5 | from flask import Flask, request, jsonify 6 | from flask_bcrypt import Bcrypt 7 | from flask_jwt import JWT, jwt_required, current_identity 8 | from flask_restful import Resource, Api 9 | from sqlalchemy import create_engine, Column, Integer, String, DateTime 10 | from sqlalchemy.ext.declarative import declarative_base 11 | from sqlalchemy.orm import sessionmaker 12 | 13 | app = Flask(__name__) 14 | app.config['SECRET_KEY'] = 'TwYV2R2IEU5&Ne6JSr@Jx9HjOuy7QVG%' 15 | app.config['AUTH_SALT'] = 'Jx9HjOuy7QVG' 16 | app.config['JWT_AUTH_URL_RULE'] = '/auth' 17 | app.config['JWT_EXPIRATION_DELTA'] = timedelta(milliseconds=1440 * 31 * 60) 18 | app.config['BCRYPT_LEVEL'] = 14 19 | api = Api(app) 20 | 21 | bcrypt = Bcrypt(app) 22 | 23 | Base = declarative_base() 24 | engine = create_engine("mysql+pymysql://root:@localhost:3306/llc?charset=utf8") 25 | Session = sessionmaker(bind=engine) 26 | session = Session() 27 | 28 | 29 | def int2Boolean(i): 30 | if i is 1: 31 | return True 32 | if i is 0: 33 | return False 34 | return False 35 | 36 | 37 | class Baby(Base): 38 | __tablename__ = "babys" 39 | 40 | id = Column(Integer, primary_key=True, autoincrement=True) 41 | baby_uuid = Column(String(255), nullable=False, unique=True, primary_key=True) 42 | nickname = Column(String(255)) 43 | lat = Column(String(255)) 44 | lng = Column(String(255)) 45 | address = Column(String(255)) 46 | last_time = Column(DateTime) 47 | upload_user = Column(String(255)) 48 | 49 | 50 | class UserBaby(Base): 51 | __tablename__ = "user_babys" 52 | 53 | id = Column(Integer, autoincrement=True, primary_key=True) 54 | is_admin = Column(Integer) 55 | username = Column(String(255), nullable=False) 56 | baby_uuid = Column(String(255), nullable=False) 57 | relationship = Column(String(255), nullable=False) 58 | 59 | def get_info(self): 60 | baby = session.query(Baby).filter_by(baby_uuid=self.baby_uuid).first() 61 | return {'is_admin': int2Boolean(self.is_admin), 'relationship': self.relationship, 62 | 'nickname': baby.nickname, 'baby_uuid': self.baby_uuid, 'lat': baby.lat, 'lng': baby.lng, 63 | 'address': baby.address, 'last_time': baby.last_time, 'upload_user': baby.upload_user} 64 | 65 | 66 | class User(Base): 67 | __tablename__ = "users" 68 | 69 | id = Column(Integer, primary_key=True, autoincrement=True) 70 | username = Column(String(255), unique=True, nullable=False, primary_key=True) 71 | password_hash = Column(String(255), nullable=False) 72 | nickname = Column(String(255)) 73 | register_time = Column(DateTime) 74 | last_login_time = Column(DateTime) 75 | 76 | def hash_password(self, password): 77 | self.password_hash = bcrypt.generate_password_hash(password) 78 | 79 | def verify_password(self, password): 80 | return bcrypt.check_password_hash(self.password_hash, password) 81 | 82 | 83 | Base.metadata.create_all(engine) 84 | 85 | 86 | def authenticate(username, password): 87 | user = session.query(User).filter_by(username=username).first() 88 | if not user or not user.verify_password(password): 89 | return None 90 | user.last_login_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) 91 | session.add(user) 92 | session.commit() 93 | return user 94 | 95 | 96 | def identity(payload): 97 | user_id = payload['identity'] 98 | return session.query(User).filter_by(id=user_id).first() 99 | 100 | 101 | jwt = JWT(app, authenticate, identity) 102 | 103 | 104 | class Register(Resource): 105 | @staticmethod 106 | def post(): 107 | username = request.json.get('username') 108 | password = request.json.get('password') 109 | nickname = request.json.get('nickname') 110 | if username is None or password is None: 111 | return jsonify({'status': False, "msg": "用户名或密码不能为空"}) 112 | if session.query(User).filter_by(username=username).first() is not None: 113 | return jsonify({'status': False, "msg": "用户名已存在"}) 114 | user = User(username=username) 115 | user.hash_password(password) 116 | user.nickname = nickname 117 | user.register_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) 118 | session.add(user) 119 | session.commit() 120 | return jsonify({'status': True, 'msg': "注册成功"}) 121 | 122 | 123 | class Login(Resource): 124 | @staticmethod 125 | @jwt_required() 126 | def post(): 127 | return jsonify({'status': True}) 128 | 129 | 130 | class BindBabyId(Resource): 131 | @staticmethod 132 | @jwt_required() 133 | def post(): 134 | nickname = request.json.get("nickname") 135 | baby_uuid = request.json.get('baby_uuid') 136 | user_relation = request.json.get('user_relation') 137 | userbaby = session.query(UserBaby).filter_by(baby_uuid=baby_uuid, is_admin=1).first() 138 | if userbaby is not None: 139 | return jsonify({'status': False, "msg": "此id已被绑定,请联系管理员添加"}) 140 | userbaby = UserBaby() 141 | userbaby.baby_uuid = baby_uuid 142 | userbaby.username = current_identity.username 143 | userbaby.relationship = user_relation 144 | userbaby.is_admin = 1 145 | baby = Baby() 146 | baby.baby_uuid = baby_uuid 147 | baby.nickname = nickname 148 | session.add(baby) 149 | session.add(userbaby) 150 | session.commit() 151 | return jsonify({'status': True, "msg": "绑定成功"}) 152 | 153 | 154 | class AddBindBabyId(Resource): 155 | @staticmethod 156 | @jwt_required() 157 | def post(): 158 | baby_uuid = request.json.get('baby_uuid') 159 | add_username = request.json.get('add_username') 160 | user_relation = request.json.get('user_relation') 161 | user = session.query(User).filter_by(username=add_username).first() 162 | userbaby = session.query(UserBaby).filter_by(username=add_username).first() 163 | if not user: 164 | return jsonify({'status': False, "msg": "用户不存在"}) 165 | if userbaby.is_admin is 0: 166 | return jsonify({'status': False, "msg": "不是管理员无法添加"}) 167 | userbaby.baby_uuid = baby_uuid 168 | userbaby.username = user.username 169 | userbaby.user_relation = user_relation 170 | userbaby.is_admin = 0 171 | session.add(userbaby) 172 | session.commit() 173 | return jsonify({'status': True, "msg": "添加成功"}) 174 | 175 | 176 | class GetBindInfo(Resource): 177 | @staticmethod 178 | @jwt_required() 179 | def post(): 180 | userbabys = session.query(UserBaby).filter_by(username=current_identity.username).all() 181 | userbabys_json = [] 182 | for userbaby in userbabys: 183 | userbabys_json.append(userbaby.get_info()) 184 | return jsonify( 185 | {'status': True, "msg": "获取成功", 186 | 'data': userbabys_json}) 187 | 188 | 189 | class UploadLocation(Resource): 190 | @staticmethod 191 | @jwt_required() 192 | def post(): 193 | lat = request.json.get('lat') 194 | lng = request.json.get('lng') 195 | address = request.json.get('address') 196 | baby_uuid = request.json.get('baby_uuid') 197 | baby = session.query(Baby).filter_by(baby_uuid=baby_uuid).first() 198 | user = session.query(UserBaby).filter_by(username=current_identity.username, baby_uuid=baby_uuid).first() 199 | if user is None or baby is None: 200 | return jsonify({'status': False, "msg": "绑定后才能上传哦"}) 201 | if not baby: 202 | baby = Baby() 203 | baby.address = address 204 | baby.lat = lat 205 | baby.lng = lng 206 | baby.baby_uuid = baby_uuid 207 | baby.upload_user = user.relationship 208 | baby.last_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) 209 | session.add(baby) 210 | session.commit() 211 | return jsonify({'status': True, "msg": "s上传成功"}) 212 | 213 | 214 | class GetLocation(Resource): 215 | @staticmethod 216 | @jwt_required() 217 | def post(): 218 | userbabys = session.query(UserBaby).filter_by(username=current_identity.username).all() 219 | baby_json = [] 220 | if userbabys is None: 221 | return jsonify({'status': False, "msg": "目前还没有位置信息哟"}) 222 | for userbaby in userbabys: 223 | baby = session.query(Baby).filter_by(baby_uuid=userbaby.baby_uuid).first() 224 | baby_json.append(baby.get_info()) 225 | return jsonify({'status': True, "msg": "获取成功", 'data': baby_json}) 226 | 227 | 228 | api.add_resource(Register, '/api/v1/register') 229 | api.add_resource(Login, '/api/v1/login') 230 | api.add_resource(BindBabyId, '/api/v1/bind') 231 | api.add_resource(AddBindBabyId, '/api/v1/add_bind') 232 | api.add_resource(GetBindInfo, '/api/v1/get_bind_info') 233 | api.add_resource(UploadLocation, '/api/v1/upload_location') 234 | api.add_resource(GetLocation, '/api/v1/get_location') 235 | 236 | if __name__ == '__main__': 237 | app.run(debug=True, host="0.0.0.0") 238 | --------------------------------------------------------------------------------