├── .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 |
10 |
15 |
16 |
17 |
18 |
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 |
--------------------------------------------------------------------------------