Commit a1f65f08 authored by fangzhipeng's avatar fangzhipeng

提交代码

parent 9f505302
from flask import Flask from flask import Flask
from common.error import error_handler, BussinessException
from common.middleware import PrefixMiddleware
from config import config
from daylife.record_service import record from daylife.record_service import record
from daylife.user_service import user
from weather.weather_service import weather from weather.weather_service import weather
from config import config
app = Flask(__name__) app = Flask(__name__)
class PrefixMiddleware(object):
def __init__(self, app, prefix=''):
self.app = app
self.prefix = prefix
def __call__(self, environ, start_response):
print(environ['PATH_INFO'])
if environ['PATH_INFO'].startswith(self.prefix):
environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
environ['SCRIPT_NAME'] = self.prefix
return self.app(environ, start_response)
else:
start_response('404', [('Content-Type', 'text/plain')])
return ["This url does not belong to the app.".encode()]
app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix='/api') app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix='/api')
# app.register_blueprint(weather)
app.register_blueprint(weather)
app.register_blueprint(record) app.register_blueprint(record)
app.register_blueprint(user)
app.register_error_handler(BussinessException, error_handler)
if __name__ == '__main__': if __name__ == '__main__':
if (not config.isDebug): if (not config.isDebug):
......
# coding=utf-8
from functools import wraps
import flask
from flask import request
from common import error_type
from common.error import BussinessException
def login_require(func):
@wraps(func)
def decorator(*args, **kwargs):
user_id = request.args.get('user_id')
token = request.args.get('token')
if not user_id or not token:
raise BussinessException(error_type.NEED_LOGIN)
return func(*args, **kwargs)
return decorator
\ No newline at end of file
# coding=utf-8
from common import error_type as et
from util import json_util
def error_handler(exception):
return exception.to_json()
class BussinessException(Exception):
"""
业务异常类
"""
def __init__(self, error_type = et.DEFAUL_ERROR):
self.status = error_type.status
self.message = error_type.message
def to_json(self):
return json_util.to_json(self)
\ No newline at end of file
# coding=utf-8
class ErrorType:
def __init__(self, status, message):
self.status = status
self.message = message
NEED_LOGIN = ErrorType(600, '请登录')
DEFAUL_ERROR = ErrorType(500, '服务器开小差了,请稍后再试')
VERIFY_CODE_EXPIRE = ErrorType(10000001, '验证码过期')
VERIFY_CODE_ERROR = ErrorType(100000002, '验证码错误')
# coding=utf-8
class PrefixMiddleware(object):
def __init__(self, app, prefix=''):
self.app = app
self.prefix = prefix
def __call__(self, environ, start_response):
print(environ['PATH_INFO'])
if environ['PATH_INFO'].startswith(self.prefix):
environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
environ['SCRIPT_NAME'] = self.prefix
return self.app(environ, start_response)
else:
start_response('404', [('Content-Type', 'text/plain')])
return ["This url does not belong to the app.".encode()]
\ No newline at end of file
# coding=utf-8
import redis
r = redis.Redis(host='127.0.0.1')
def put_with_expire(key, value, expire):
"""
redis put 操作
:param key:
:param value:
:param expire: 过期时间毫秒
:return:
"""
r.set(key, value, expire)
def get(key):
"""
获取redis值
:param key:
:return:
"""
value = r.get(key)
if value:
return value.decode(encoding='utf-8')
return None
def delete(key):
"""
删除对应key值
:param key:
:return:
"""
r.delete(key)
if __name__ == '__main__':
put_with_expire('hello_111', 'llljjlkj', 10)
# delete('hello_111')
print(get('hello_111'))
\ No newline at end of file
# -*- coding: utf-8 -*-
import json
import sys
from aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest
from aliyunsdkdysmsapi.request.v20170525 import QuerySendDetailsRequest
from aliyunsdkcore.client import AcsClient
import uuid
from aliyunsdkcore.profile import region_provider
from aliyunsdkcore.http import method_type as MT
from aliyunsdkcore.http import format_type as FT
from config import config
"""
短信业务调用接口示例,版本号:v20170525
Created on 2017-06-12
"""
try:
reload(sys)
sys.setdefaultencoding('utf8')
except NameError:
pass
except Exception as err:
raise err
# 注意:不要更改
REGION = "cn-hangzhou"
PRODUCT_NAME = "Dysmsapi"
DOMAIN = "dysmsapi.aliyuncs.com"
acs_client = AcsClient(config.get_config('ACCESS_KEY_ID'), config.get_config('ACCESS_KEY_SECRET'), REGION)
region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)
def send_sms(business_id, phone_numbers, sign_name, template_code, template_param=None):
smsRequest = SendSmsRequest.SendSmsRequest()
# 申请的短信模板编码,必填
smsRequest.set_TemplateCode(template_code)
# 短信模板变量参数
if template_param is not None:
smsRequest.set_TemplateParam(template_param)
# 设置业务请求流水号,必填。
smsRequest.set_OutId(business_id)
# 短信签名
smsRequest.set_SignName(sign_name)
# 数据提交方式
# smsRequest.set_method(MT.POST)
# 数据提交格式
# smsRequest.set_accept_format(FT.JSON)
# 短信发送的号码列表,必填。
smsRequest.set_PhoneNumbers(phone_numbers)
# 调用短信发送接口,返回json
smsResponse = acs_client.do_action_with_exception(smsRequest)
return json.loads(smsResponse.decode(encoding='utf-8'))
if __name__ == '__main__':
__business_id = uuid.uuid1()
#print(__business_id)
params = "{\"code\":\"12345\",\"product\":\"云通信\"}"
#params = u'{"name":"wqb","code":"12345678","address":"bz","phone":"13000000000"}'
print(send_sms(__business_id, "15071335527", "极客足球", "SMS_102260006", params))
# coding=utf-8
"""
sdk template_code 和自己业务映射关系
"""
verify_code = {'aliyun': {'template_code': 'SMS_102260006', 'sign_name': '极客足球'}}
\ No newline at end of file
# coding=utf-8
import uuid
from common.sms import demo_sms_send, sms_mapping
def send_verify_code(phone, verify_code):
"""
发送短信验证码
:return:
"""
template_code = getattr(sms_mapping, 'verify_code')['aliyun']['template_code']
sign_name = getattr(sms_mapping, 'verify_code')['aliyun']['sign_name']
# {"code": 1234}
params = "{\"code\": " + verify_code + "}"
res = demo_sms_send.send_sms(uuid.uuid1(), phone, sign_name, template_code, params)
if res['Code'] == 'OK':
print('发送成功!')
return 'ok'
else:
print('发送失败')
return 'fail'
if __name__ == '__main__':
send_verify_code('15071335527', '1234')
\ No newline at end of file
#mysql地址 #mysql地址
mysql_url='mysql+pymysql://root:root@localhost/daylife?charset=utf8mb4' mysql_url='mysql+pymysql://root:root@localhost/daylife?charset=utf8mb4'
#阿里云key
ACCESS_KEY_ID = "LTAItgZHDPJ5Jrdy"
ACCESS_KEY_SECRET = "GC8dDKIfsouOjCbLdiDpjLJaNyexEI"
\ No newline at end of file
# coding=utf-8 # coding=utf-8
mysql_url='mysql+pymysql://root:root@localhost/daylife?charset=utf8mb4' mysql_url='mysql+pymysql://root:root@localhost/daylife?charset=utf8mb4'
#阿里云key
ACCESS_KEY_ID = "LTAItgZHDPJ5Jrdy"
ACCESS_KEY_SECRET = "GC8dDKIfsouOjCbLdiDpjLJaNyexEI"
\ No newline at end of file
...@@ -11,7 +11,10 @@ class UserInfo(Base): ...@@ -11,7 +11,10 @@ class UserInfo(Base):
__tablename__ = 'user_info' __tablename__ = 'user_info'
id = Column(Integer, primary_key=True, nullable=False) id = Column(Integer, primary_key=True, nullable=False)
phone = Column(String(20), nullable=False, unique=True)
nickname = Column(String(50), primary_key=True, nullable=False, server_default=text("''")) nickname = Column(String(50), primary_key=True, nullable=False, server_default=text("''"))
create_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
update_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))
class UserRecord(Base): class UserRecord(Base):
...@@ -22,3 +25,15 @@ class UserRecord(Base): ...@@ -22,3 +25,15 @@ class UserRecord(Base):
content = Column(String(500), nullable=False) content = Column(String(500), nullable=False)
craete_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP")) craete_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
update_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")) update_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))
class UserToken(Base):
__tablename__ = 'user_token'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, nullable=False)
device_type = Column(Integer, nullable=False, server_default=text("'0'"))
token = Column(String(50), nullable=False)
expire_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
create_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP"))
update_at = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))
# coding=utf-8
"""
session = sqlengin.getSession()
session.commit()
session.close()
"""
from daylife.dao import sqlengin
from daylife.dao.models import UserRecord
def add_record(user_record):
session = sqlengin.getSession()
session.add(user_record)
session.commit()
session.close()
def select_by_user_id(user_id):
session = sqlengin.getSession()
items = session.query(UserRecord).filter(UserRecord.user_id==user_id).order_by(UserRecord.craete_at.desc()).all()
session.close()
return items
\ No newline at end of file
# coding=utf-8
import datetime
import uuid
from daylife.dao import sqlengin
from daylife.dao.models import UserInfo, UserToken
"""
session = sqlengin.getSession()
session.commit()
session.close()
"""
def insert_user(user_info):
session = sqlengin.getSession()
session.add(user_info)
session.commit()
session.close()
def select_by_phone(phone):
session = sqlengin.getSession()
user_info = session.query(UserInfo).filter(UserInfo.phone==phone).first()
session.close()
return user_info
def create_token(user_info):
"""
根据用户信息创建用户token
:param user_info:
:return:
"""
session = sqlengin.getSession()
session.query(UserToken).filter(UserToken.user_id==user_info.id).filter(UserToken.device_type==0).delete()
token = str(uuid.uuid1()).replace('-', '')
expire_at = datetime.datetime.now() + datetime.timedelta(days=90)
user_token = UserToken(user_id=user_info.id, device_type=0, token=token, expire_at=expire_at)
session.add(user_token)
session.commit()
session.close()
return token
# coding=utf-8
class UserInfoVo:
def __init__(self, phone, nickname, id, token):
self.phone = phone
self.nickname = nickname
self.id = id
self.token = token
\ No newline at end of file
# coding: utf-8 # coding: utf-8
from flask import Blueprint from flask import Blueprint, request
from daylife.dao import sqlengin from common.decorator import login_require
from common.util import http
from daylife.dao import sqlengin, record_dao
from daylife.dao.models import UserRecord from daylife.dao.models import UserRecord
from util import json_util from util import json_util
record = Blueprint('record', __name__, url_prefix='/record') record = Blueprint('record', __name__, url_prefix='/record')
@record.route('/my') @record.route('/my')
@login_require
def get_my_record(): def get_my_record():
""" """
获取个人发布信息 获取个人发布信息
:return: :return:
""" """
items = sqlengin.getSession().query(UserRecord).all() user_id = request.args.get('user_id')
return json_util.db_to_json(items) items = record_dao.select_by_user_id(user_id)
return http.BaseRes(data=json_util.convert_db_to_json_obj(items)).to_json()
@record.route('/my_follow') @record.route('/my_follow')
@login_require
def get_my_attention(): def get_my_attention():
""" """
我的关注人发布的记录 我的关注人发布的记录
...@@ -26,13 +31,17 @@ def get_my_attention(): ...@@ -26,13 +31,17 @@ def get_my_attention():
pass pass
@record.route('/publish') @record.route('/publish')
@login_require
def publish_record(): def publish_record():
""" """
发布关注信息 发布关注信息
:return: :return:
""" """
pass user_id = request.values.get('user_id')
content = request.args.get('content')
user_record = UserRecord(user_id=user_id, content=content)
record_dao.add_record(user_record)
return http.BaseRes(message='发布成功!').to_json()
......
# coding=utf-8 # coding=utf-8
from flask import Blueprint from flask import Blueprint, request
from common import error_type
from common.decorator import login_require
from common.error import BussinessException
from common.redis import redis_service
from common.sms import sms_service
from common.util import http
from config import config
from daylife.dao import user_dao
from daylife.dao.models import UserInfo
from daylife.model import UserInfoVo
user = Blueprint('user', __name__, url_prefix='/user')
USER_VERIFY_CODE_PREFIX = "verify_code_"
@user.route('/login')
def login():
"""
用户登录
:return:
"""
phone = request.args.get('phone')
verify_code = request.args.get('verify_code')
if config.isDebug:
if phone[0:4] != verify_code:
raise BussinessException(error_type.VERIFY_CODE_ERROR)
else:
check_verify_code(phone, verify_code)
if not user_dao.select_by_phone(phone):
user_dao.insert_user(UserInfo(phone=phone, nickname='黑米包子'))
user_info = user_dao.select_by_phone(phone)
token = user_dao.create_token(user_info)
return http.BaseRes(data=UserInfoVo(user_info.phone, user_info.nickname, user_info.id, token)).to_json()
def check_verify_code(phone, verify_code):
"""
校验用户发来的验证码
:param phone:
:param verify_code:
:return:
"""
verify_code_key = USER_VERIFY_CODE_PREFIX + phone
redis_verify_code = redis_service.get(verify_code_key)
if not redis_verify_code:
raise BussinessException(error_type.VERIFY_CODE_EXPIRE)
if redis_verify_code != verify_code:
raise BussinessException(error_type.VERIFY_CODE_ERROR)
redis_service.delete(verify_code_key)
@user.route('/logout')
def logout():
"""
用户登出
:return:
"""
pass
@user.route('/send_verify_code')
def send_verify_code():
"""
发送验证码
:param phone:
:param verify_code:
:return:
"""
phone = request.args.get('phone')
verify_code = request.args.get('verify_code')
res = sms_service.send_verify_code(phone, verify_code)
if res == 'ok':
redis_service.put_with_expire(USER_VERIFY_CODE_PREFIX + phone, verify_code, 5 * 60)
return http.BaseRes().to_json()
else:
raise BussinessException()
user = Blueprint(name='user', url_prefix='/user')
@user.route('/follow') @user.route('/follow')
@login_require
def follow(): def follow():
""" """
关注 关注
:return: :return:
""" """
pass return '返回关注列表'
@user.route('/fans') @user.route('/fans')
......
#!/usr/bin/env bash #!/usr/bin/env bash
sqlacodegen mysql+pymysql://root:root@127.0.0.1:3306/daylife > ./weather/dao/models.py sqlacodegen mysql+pymysql://root:root@127.0.0.1:3306/daylife > ./daylife//dao/models.py
\ No newline at end of file \ No newline at end of file
...@@ -20,3 +20,13 @@ def db_to_json(obj): ...@@ -20,3 +20,13 @@ def db_to_json(obj):
:return: :return:
""" """
return json.dumps(obj, cls=AlchemyEncoder, ensure_ascii=False) return json.dumps(obj, cls=AlchemyEncoder, ensure_ascii=False)
def convert_db_to_json_obj(obj):
"""
把db对象转换为可序列化对象
:param obj:
:return:
"""
return json.loads(db_to_json(obj))
\ No newline at end of file
...@@ -2,7 +2,7 @@ from flask import Blueprint ...@@ -2,7 +2,7 @@ from flask import Blueprint
from flask import request from flask import request
import requests import requests
import json import json
from common import BaseRes from common.util.http import BaseRes
from daylife.dao import sqlengin, models from daylife.dao import sqlengin, models
weather = Blueprint('weather', __name__, url_prefix='/weather') weather = Blueprint('weather', __name__, url_prefix='/weather')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment