Skip to content

Instantly share code, notes, and snippets.

@AntiKnot
Created April 2, 2020 06:11
Show Gist options
  • Select an option

  • Save AntiKnot/48407066cc29fdea9b5b3f93f65f0903 to your computer and use it in GitHub Desktop.

Select an option

Save AntiKnot/48407066cc29fdea9b5b3f93f65f0903 to your computer and use it in GitHub Desktop.
会员订阅 demo
import datetime
test_event = [
{"event": "try", "date": "2018 01-02 12:33:23", "amount": "3d"},
{"event": "buy", "date": "2018 04-02 12:33:23", "amount": "3m"},
{"event": "try", "date": "2018 05-02 12:33:23", "amount": "3d"},
{"event": "renew", "date": "2018 07-01 12:33:23", "amount": "1y"},
{"event": "renew", "date": "2018 10-01 12:33:23", "amount": "1m"},
{"event": "buy", "date": "2019 03-01 12:33:23", "amount": "1m"},
# {"event": "buy", "date": "2019 04-20 12:33:23", "amount": "0d"},
]
today = datetime.date.today()
yesterday = datetime.date.today() - datetime.timedelta(days=1)
days = {'0d': 0, '3d': 3, '1m': 30, '3m': 90, '6m': 180, '1y': 360}
def string2date(string_date):
return datetime.datetime.strptime(string_date, "%Y %m-%d %H:%M:%S").date()
database = {
'has_try': False,
'expired_date': yesterday,
'renew_deadline': yesterday,
}
def wrapper(fun):
def _deco(event):
fun(event)
print(
'premium:{} can_review:{} expired:{}'.format(is_premium(event), now_could_review(event),
is_expired_now(event)))
return _deco
def is_premium(event):
if database.get('expired_date') >= string2date(event['date']):
return True
return False
def expired_date():
return database.get('expired_date')
def is_expired(event):
return True if database.get('expired_date') <= string2date(event['date']) else False
def is_expired_now(event):
return True if database.get('expired_date') <= today else False
def renew_deadline():
return database.get('renew_deadline')
def could_review(event):
return True if database.get('renew_deadline') > string2date(event['date']) else False
def now_could_review(event):
return True if database.get('renew_deadline') > string2date(event['date']) else False
@wrapper
def event_try(event):
if database.get('has_try'):
print('this account had been tried 3d, try premium does not enjoy renew cut.')
else:
database.update({
'has_try': True,
'expired_date': string2date(event['date']) + datetime.timedelta(days=3),
'renew_deadline': string2date(event['date']) + datetime.timedelta(days=3 + 15)
})
print('Try success, your expired date is {}'.format(database.get('expired_date')))
@wrapper
def event_buy(event):
amount = event['amount']
if could_review(event) is True:
print('You have bean a premium, buy will extending premium')
event_renew(event)
else:
database.update({
'has_try': True,
'expired_date': string2date(event['date']) + datetime.timedelta(days=days[amount]),
'renew_deadline': string2date(event['date']) + datetime.timedelta(days=days[amount] + 15)
})
print('Buy success, your expired date is {}'.format(database.get('expired_date')))
@wrapper
def event_renew(event):
amount = event['amount']
_expired_data = database.get('expired_date')
if could_review(event) is True:
database.update({
'has_try': True,
'expired_date': _expired_data + datetime.timedelta(days=days[amount]),
'renew_deadline': _expired_data + datetime.timedelta(days=days[amount] + 15),
})
print('Renew success, your expired date is {}'.format(database.get('expired_date')))
else:
print('This account has not bought premium, or over renew deadline, please buy premium as first')
def deal_event(event):
choice_fun = {
'try': event_try,
'buy': event_buy,
'renew': event_renew,
}
fun = choice_fun[event['event']]
fun(event)
if __name__ == '__main__':
[deal_event(event) for event in test_event]
print(database)
@AntiKnot
Copy link
Copy Markdown
Author

AntiKnot commented Apr 2, 2020

实现类似视频网站订阅会员,并且有一定订阅优惠策略。
看完fluent python 决定用策略模式重构一遍。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment