Gogs 2 роки тому
коміт
03e17478ba
100 змінених файлів з 3170 додано та 0 видалено
  1. 4 0
      index.html
  2. 0 0
      src/account/__init__.py
  3. BIN
      src/account/__init__.pyc
  4. 49 0
      src/account/cauth.py
  5. BIN
      src/account/cauth.pyc
  6. 36 0
      src/account/control_permission.py
  7. 106 0
      src/account/control_role.py
  8. 289 0
      src/account/control_user.py
  9. BIN
      src/account/control_user.pyc
  10. 6 0
      src/account/models.py
  11. BIN
      src/account/models.pyc
  12. 36 0
      src/account/password_handle.py
  13. BIN
      src/account/password_handle.pyc
  14. 19 0
      src/account/urls_backstage.py
  15. BIN
      src/account/urls_backstage.pyc
  16. 156 0
      src/account/views.py
  17. BIN
      src/account/views.pyc
  18. 12 0
      src/asgi.py
  19. 0 0
      src/common/__init__.py
  20. BIN
      src/common/__init__.pyc
  21. 89 0
      src/common/captcha.py
  22. BIN
      src/common/captcha.pyc
  23. 234 0
      src/common/common_control.py
  24. BIN
      src/common/common_control.pyc
  25. 221 0
      src/common/common_functions.py
  26. BIN
      src/common/common_functions.pyc
  27. 70 0
      src/common/common_notice.py
  28. BIN
      src/common/common_notice.pyc
  29. 3 0
      src/common/constant.py
  30. BIN
      src/common/constant.pyc
  31. 242 0
      src/common/core_views.py
  32. BIN
      src/common/core_views.pyc
  33. 227 0
      src/common/custom_tools.py
  34. 40 0
      src/common/error_info.py
  35. BIN
      src/common/error_info.pyc
  36. 33 0
      src/common/excel_output.py
  37. BIN
      src/common/font/consola.ttf
  38. 39 0
      src/common/logger.py
  39. BIN
      src/common/logger.pyc
  40. 402 0
      src/common/migrations/0001_initial.py
  41. BIN
      src/common/migrations/0001_initial.pyc
  42. 47 0
      src/common/migrations/0002_auto_20220620_2043.py
  43. BIN
      src/common/migrations/0002_auto_20220620_2043.pyc
  44. 27 0
      src/common/migrations/0003_auto_20220620_2043.py
  45. BIN
      src/common/migrations/0003_auto_20220620_2043.pyc
  46. 138 0
      src/common/migrations/0004_auto_20220620_2044.py
  47. BIN
      src/common/migrations/0004_auto_20220620_2044.pyc
  48. 23 0
      src/common/migrations/0005_auto_20220620_2046.py
  49. BIN
      src/common/migrations/0005_auto_20220620_2046.pyc
  50. 25 0
      src/common/migrations/0006_auto_20220620_2047.py
  51. BIN
      src/common/migrations/0006_auto_20220620_2047.pyc
  52. 23 0
      src/common/migrations/0007_auto_20220620_2048.py
  53. BIN
      src/common/migrations/0007_auto_20220620_2048.pyc
  54. 25 0
      src/common/migrations/0008_auto_20220620_2048.py
  55. BIN
      src/common/migrations/0008_auto_20220620_2048.pyc
  56. 23 0
      src/common/migrations/0009_auto_20220620_2052.py
  57. BIN
      src/common/migrations/0009_auto_20220620_2052.pyc
  58. 25 0
      src/common/migrations/0010_auto_20220620_2053.py
  59. BIN
      src/common/migrations/0010_auto_20220620_2053.pyc
  60. 19 0
      src/common/migrations/0011_remove_matchgroup_charge.py
  61. BIN
      src/common/migrations/0011_remove_matchgroup_charge.pyc
  62. 20 0
      src/common/migrations/0012_matchgroup_charge.py
  63. BIN
      src/common/migrations/0012_matchgroup_charge.pyc
  64. 20 0
      src/common/migrations/0013_match_match_status.py
  65. BIN
      src/common/migrations/0013_match_match_status.pyc
  66. 20 0
      src/common/migrations/0014_player_player_type.py
  67. BIN
      src/common/migrations/0014_player_player_type.pyc
  68. 25 0
      src/common/migrations/0015_auto_20220623_2255.py
  69. BIN
      src/common/migrations/0015_auto_20220623_2255.pyc
  70. 20 0
      src/common/migrations/0016_userinfo_player_type.py
  71. BIN
      src/common/migrations/0016_userinfo_player_type.pyc
  72. 25 0
      src/common/migrations/0017_auto_20220624_1038.py
  73. BIN
      src/common/migrations/0017_auto_20220624_1038.pyc
  74. 20 0
      src/common/migrations/0018_auto_20220624_1058.py
  75. BIN
      src/common/migrations/0018_auto_20220624_1058.pyc
  76. 61 0
      src/common/migrations/0019_auto_20220705_1444.py
  77. BIN
      src/common/migrations/0019_auto_20220705_1444.pyc
  78. 33 0
      src/common/migrations/0020_consult.py
  79. BIN
      src/common/migrations/0020_consult.pyc
  80. 46 0
      src/common/migrations/0021_auto_20220725_0942.py
  81. BIN
      src/common/migrations/0021_auto_20220725_0942.pyc
  82. 20 0
      src/common/migrations/0022_usermatch_fund.py
  83. BIN
      src/common/migrations/0022_usermatch_fund.pyc
  84. 18 0
      src/common/migrations/0023_delete_usermatch.py
  85. BIN
      src/common/migrations/0023_delete_usermatch.pyc
  86. 32 0
      src/common/migrations/0024_usermatch.py
  87. BIN
      src/common/migrations/0024_usermatch.pyc
  88. 20 0
      src/common/migrations/0025_userstock_user_id.py
  89. BIN
      src/common/migrations/0025_userstock_user_id.pyc
  90. 19 0
      src/common/migrations/0026_remove_signuporder_signup_name.py
  91. BIN
      src/common/migrations/0026_remove_signuporder_signup_name.pyc
  92. 20 0
      src/common/migrations/0027_signuporder_signup_name.py
  93. BIN
      src/common/migrations/0027_signuporder_signup_name.pyc
  94. 24 0
      src/common/migrations/0028_auto_20230103_1724.py
  95. BIN
      src/common/migrations/0028_auto_20230103_1724.pyc
  96. 20 0
      src/common/migrations/0029_wanzhuconsult_reply_user_id.py
  97. BIN
      src/common/migrations/0029_wanzhuconsult_reply_user_id.pyc
  98. 19 0
      src/common/migrations/0030_auto_20230105_1513.py
  99. BIN
      src/common/migrations/0030_auto_20230105_1513.pyc
  100. 0 0
      src/common/migrations/0031_auto_20230105_1514.py

Різницю між файлами не показано, бо вона завелика
+ 4 - 0
index.html


+ 0 - 0
src/account/__init__.py


BIN
src/account/__init__.pyc


+ 49 - 0
src/account/cauth.py

@@ -0,0 +1,49 @@
+#coding=utf-8
+import logging
+import datetime
+
+import account.password_handle as ph
+from django.db.models import Q
+
+import common.error_info as ce
+import common.models as cm
+
+logger = logging.getLogger(__name__)
+
+
+class AccountManage(object):
+
+    def authenticate(self,request,account,pwd):
+        """
+        @attention: 用户认证
+        """
+
+        user = cm.SysUserInfo.objects.filter(Q(name=account)).first()
+        if user is not None:
+            if self.user_can_authenticate(user):
+                if ph.check_password(pwd, user.password):
+                    return user
+                else:
+                    raise ce.TipException("账号或密码错误")
+            else:
+                raise ce.TipException("账户已停用")
+        else:
+            raise ce.TipException("账号或密码错误")
+
+    def user_can_authenticate(self, user):
+        """
+        @attention: 账户是否已经激活
+        """
+        is_active = getattr(user, 'is_active', None)
+        return is_active == 1
+    
+    def get_user(self, pk):
+        """
+        @attention: 由于在django系统中,每次request都是一个独立的请求,所以每次进入时第一次使用,都会调用该函数
+        """
+        try:
+            user = cm.SysUserInfo.objects.get(pk=pk)
+        except cm.SysUserInfo.DoesNotExist:
+            return None
+        return user
+

BIN
src/account/cauth.pyc


+ 36 - 0
src/account/control_permission.py

@@ -0,0 +1,36 @@
+#-*-coding:utf-8 -*-
+import re
+import collections
+import common.models as cm
+
+def get_permission_list(role_id=None,platform=None):
+    """
+    """
+    if role_id:
+        qset = cm.Role.objects.filter(id=role_id).first().permission.all()
+    else:
+        qset = cm.Permission.objects.all()
+    if platform:
+        qset = qset.filter(platform__icontains=platform)
+    permissions = format_permission_tree(qset)
+    return permissions
+
+def get_permission_tree(pobj,data=None):
+    data = data if data else []
+    childrenset = cm.Permission.objects.filter(pid=pobj.id)
+    for cdobj in childrenset:
+        data.append({"id":cdobj.id,"name":cdobj.name,"codename":cdobj.codename,"children":get_permission_tree(cdobj)})
+    return data
+
+
+def format_permission_tree(qset):
+    """暂时写死待完善....
+    """
+    ptrees = []
+    toppers = qset.filter(pid__isnull=True)
+    for topobj in toppers:
+        ptree = {"id":topobj.id,"name":topobj.name,"codename":topobj.codename}
+        ptree["children"] = get_permission_tree(topobj)
+        ptrees.append(ptree)
+    return ptrees
+

+ 106 - 0
src/account/control_role.py

@@ -0,0 +1,106 @@
+#coding=utf-8
+'''
+'''
+import json
+from django.db import transaction
+import common.models as cm
+import common.error_info as ce
+import common.common_functions as ccf
+import common.common_control as ccc
+
+def get_role_list(query=None,relations=None,page=None,page_size=None):
+    """
+    """
+    qset = cm.Role.objects.all()
+    if query and query.get("platform"):
+        qset = qset.filter(platform=query.get("platform"))
+    total,qset = ccc.get_page_qset(qset,page,page_size)
+    roles = qset.values("id","name","desc","ctime","platform")
+    if relations:
+        for i,role in enumerate(roles):
+            permissions = list(qset[i].permission.all().values_list("name",flat=True))
+            role.update({"permissions":",".join(permissions)})
+    return total,list(roles)
+
+
+def get_role_info(*ids):
+    """
+    """
+    qset = cm.Role.objects.filter(id__in=ids)
+    roles = list(qset.values())
+    for i,role in enumerate(roles):
+        role["permission_addroles"] = json.loads(role["permission_addroles"])
+        permissions = list(qset[i].permission.all().values("name","id"))
+        role.update({"permissions":permissions})
+    return roles
+
+
+def get_all_role_list():
+    qset = cm.Role.objects.all()
+    roles = qset.values("id","name","desc","ctime","platform")
+    return list(roles)
+
+
+def add_role(**kwargs):
+    """
+    """
+    need_params = ["name","platform","permissions"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    need_params.extend(["cperson","desc"])
+    try:
+        permission_addroles = kwargs.pop("permission_addroles")
+        permissions = kwargs.pop("permissions")
+    except KeyError:
+        permission_addroles = None
+        permissions = None
+
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    with transaction.atomic():
+        robj = cm.Role.objects.create(**cvals)
+        #添加permission
+        robj.permission_addroles = json.dumps(permission_addroles)
+        robj.permission.add(*permissions)
+        robj.save()
+
+
+def update_role(**kwargs):
+    """
+    """
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    id = kwargs.get("id")
+    uvals = {}
+    if "name" in kwargs:
+        uvals["name"] = kwargs.get("name")
+    if "desc" in kwargs:
+        uvals["desc"] = kwargs.get("desc")
+    if "permission_addroles" in kwargs:
+        uvals["permission_addroles"] = json.dumps(kwargs.get("permission_addroles"))
+    with transaction.atomic():
+        robj = cm.Role.objects.filter(id=id).first()
+        cm.Role.objects.filter(id=id).update(**uvals)
+        if robj:
+            robj.permission.remove()
+            robj.permission.add(*kwargs.get("permissions"))
+
+
+def delete_role(**kwargs):
+    """
+    """
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    cm.Role.objects.filter(id__in=ids).delete()
+
+
+
+
+
+
+

+ 289 - 0
src/account/control_user.py

@@ -0,0 +1,289 @@
+#coding=utf-8
+'''
+'''
+import json
+import datetime
+import logging
+import re
+import time
+import random
+
+import hashlib
+import xlrd
+from django.core.cache import cache
+from django.db.models import Q
+from django.db.models import Sum
+from django.db import transaction
+from django.contrib import auth
+import common.models as cm
+import common.error_info as ce
+import password_handle as ph
+import common.common_functions as ccf
+from utils.aestool import aescbc
+import common.common_control as ccc
+
+def add_user(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["realname","phone","department_id","utype","is_active"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    if cm.UserInfo.objects.filter(phone=kwargs.get("phone")).exists():
+        raise ce.TipException(u"该用户已存在!")
+    need_params.extend(["email","remark"])
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    cvals.update({"name":cvals.get("phone")})
+    cvals.update({"password":ph.make_password(cvals.get("phone")[-6:],True)})
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    obj = cm.UserInfo.objects.create(**cvals)
+    return obj
+
+
+def delete_user(request):
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    cm.UserInfo.objects.filter(id__in=ids).update(status=0)
+
+
+def update_user(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    id = kwargs.get("id")
+    if cm.UserInfo.objects.exclude(id=id).filter(phone=kwargs.get("phone")).exists():
+        raise ce.TipException(u"该用户已存在!")
+    need_params.extend(["realname","phone","department_id","utype","is_active","email","remark"])
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    cvals.update({"name":cvals.get("phone")})
+    cvals.update({"password":ph.make_password(cvals.get("phone")[-6:],True)})
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    obj = cm.UserInfo.objects.filter(id=id).update(**cvals)
+    return obj
+
+def login_user(request):
+    """
+    """
+    info = request.json
+    username = info.get('username')
+    password = info.get('password')
+    utype = info.get('utype')
+    captcha_id = info.get('imgcode_id')
+    idcode = info.get('imgcode')
+    captcha = cache.get(captcha_id, '')
+    cache.delete(captcha_id)
+    #if not username or not password:
+    #    raise ce.TipException(u"账户或密码不能为空!")
+    #if not idcode:
+    #    raise ce.TipException(u"验证码不能为空!")
+    #if idcode.upper() != captcha.upper():
+    #    raise ce.TipException(u"验证码错误!")
+
+    user = auth.authenticate(request, account=username, pwd=password)
+    if user:
+        auth.login(request, user)
+        return user
+    else:
+        raise ce.TipException(u"账号或密码错误!")
+
+
+def reset_password(request):
+    """
+    @attention: 重置密码
+    """
+    qdata = request.json
+    need_params = ["password","repassword"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    uid = request.json.get("uid")
+    if not uid:
+        uid = request.user.id
+    phone = qdata.get("phone")
+    password = qdata.get("password")
+    repassword = qdata.get("repassword")
+    if password != repassword:
+        raise ce.TipException(u"两次输入的密码不一致!")
+    pwd = ph.make_password(password)
+    cm.SysUserInfo.objects.filter(phone=phone).update(password=pwd)
+
+
+def reset_user_password(request):
+    qdata = request.json
+    need_params = ["uid","code","password"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    upk = qdata.get("uid")
+    code = qdata.get("code")
+    pkey = request.user.phone
+    if cache.get(pkey,"") != code:
+        raise ce.TipException(u"验证码不正确!")
+    newpwd = qdata.get("password")
+    pwd = ph.make_password(newpwd)
+    cm.UserInfo.objects.filter(pk=upk).update(password=pwd)
+
+
+def regist_user(request):
+    """
+    """
+    kwargs = request.json
+    need_parms = ["realname","password","repassword","phone","email"]
+    mse = ccf.check_params(*need_parms,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    if cm.UserInfo.objects.filter(phone=kwargs.get("phone")).exists():
+        raise ce.TipException(u"该手机号已注册!")
+    cvals = ccf.get_need_params(*need_parms,**kwargs)
+    cvals.pop("repassword")
+    cvals["name"] = cvals["phone"]
+    if kwargs["password"] != kwargs["repassword"]:
+        raise ce.TipException(u"前后输入的密码不一致!")
+    if not cvals.get("password"):
+        pwd,password = ph.make_default_password(None)
+        cvals.update({"password":password})
+    else:
+        pwd = cvals.get("password")
+        cvals.update({"password":ph.make_password(cvals.get("password"))})
+    uobj = cm.UserInfo.objects.create(**cvals)
+    return None
+
+
+def format_user(*ids):
+    """
+    """
+    eset = cm.SysUserInfo.objects.filter(id__in=ids,is_active=1)
+    if not eset.exists():
+        raise ce.TipException(u"账号不存在!")
+    data = list(eset.values())
+    return data
+
+def get_user_info(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    info = format_user(*ids)
+    info = info[0] if info else {}
+    return info
+
+def get_user_personal_info(request):
+    """
+    """
+    id = request.user.id
+    info = format_user(*[id])
+    info = info[0] if info else {}
+    return info
+
+def get_account_info(request):
+    """
+    """
+    id = request.user.id
+    info = format_user(*[id])
+    info = info[0] if info else {}
+    info["p"] = ["Product.*.*"]
+    return info
+
+def get_user_list(request):
+    """
+    """
+    kwargs = request.json
+    eset = cm.UserInfo.objects.filter(status=1)
+    if "name" in kwargs and kwargs.get("name"):
+        eset = eset.filter(name__icontains=kwargs.get("name"))
+    if "department_id" in kwargs and kwargs.get("department_id"):
+        eset = eset.filter(department_id=kwargs.get("department_id"))
+    if "utype" in kwargs and kwargs.get("utype"):
+        eset = eset.filter(utype=kwargs.get("utype"))
+    if "is_active" in kwargs and kwargs.get("is_active"):
+        eset = eset.filter(is_active=kwargs.get("is_active"))
+    total = eset.count()
+    edata = list(eset.values())
+    page = int(kwargs.get("page",1))
+    page_size = int(kwargs.get("page_size",20))
+    total,data = ccf.get_page_list(edata,page,page_size)
+    return (total,data)
+
+
+def get_unaudit_user_list(request):
+    """
+    """
+    kwargs = request.json
+    eset = cm.UserInfo.objects.filter(status=1,is_active=0)
+    if "name" in kwargs and kwargs.get("name"):
+        eset = eset.filter(name__icontains=kwargs.get("name"))
+    if "utype" in kwargs and kwargs.get("utype"):
+        eset = eset.filter(utype=kwargs.get("utype"))
+    total = eset.count()
+    edata = list(eset.values())
+    page = int(kwargs.get("page",1))
+    page_size = int(kwargs.get("page_size",20))
+    total,data = ccf.get_page_list(edata,page,page_size)
+    return (total,data)
+
+
+def login_user_by_token(request):
+    """
+    """
+    info = request.json
+    name = info.get('name','')
+    phone = info.get('phone','')
+    phcode = info.get('phcode')
+    role = info.get('role')
+
+    if not phone:
+        raise ce.TipException(u"缺少手机号!")
+    if not phcode:
+        raise ce.TipException(u"缺少验证码!")
+    org_phcode = ccc.cache.get(phone)
+
+    #if not org_phcode == phcode:
+    #    raise ce.TipException(u"验证码错误!")
+
+    if str(role)=="1":
+        user = cm.Doctors.objects.filter(phone=phone,name=name).first()
+    else:
+        pinyin = ccf.get_name_pinyin(name)
+        code = pinyin + ccf.get_now_str("%Y%m%d")
+        user,flag = cm.Patients.objects.get_or_create(phone=phone,name=name)
+        user.name = name
+        user.code = code
+        user.save()
+
+    if not user:
+        raise ce.TipException(u"医生不存在!")
+    else:
+        tstr = "{}_{}_{}{}".format(role,user.id,time.time(),random.randint(100000,999999))
+        token = aescbc.encrypt(tstr)
+        return {"id":user.id,"token":token,"status":1,"role":role}
+
+
+def get_authinfo_by_token(request):
+    """
+    """
+    user = request.user
+    uid = user.get("id")
+    role = user.get("role")
+    if str(role) == "1":
+        user = cm.Doctors.objects.filter(id=uid).values().first()
+        user["doctor_role"] = user.get("role")
+    else:
+        user = cm.Patients.objects.filter(id=uid).values().first()
+    user["role"] = role
+
+    return user

BIN
src/account/control_user.pyc


+ 6 - 0
src/account/models.py

@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models
+
+# Create your models here.

BIN
src/account/models.pyc


+ 36 - 0
src/account/password_handle.py

@@ -0,0 +1,36 @@
+#coding=utf-8
+'''
+@attention: 密码加密验证模块
+'''
+import hashlib
+import re
+import random
+
+def check_password(new,old):
+    """
+    """
+    np = hashlib.md5(new).hexdigest().upper()
+    return np==old
+
+def make_password(pwd,isdefault=None):
+    """
+    """
+    return hashlib.md5(pwd).hexdigest().upper()
+
+def make_default_password(pwd):
+    """
+    @attention: 密码加密
+    """
+    ustr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    lstr = "abcdefghjklmnopqrstuvwxyz"
+    dstr = "0123456789"
+    sstr = "!@#$%&*"
+    pwd = "".join(random.sample(ustr,3)+random.sample(lstr,3)+random.sample(dstr,3)+random.sample(sstr,3))
+    return pwd,hashlib.md5(pwd).hexdigest().upper()
+
+if __name__ == '__main__':
+    old = "8589103"
+    op = make_password(old)
+    print op
+    new = "123456"
+    # print check_password(new, op)

BIN
src/account/password_handle.pyc


+ 19 - 0
src/account/urls_backstage.py

@@ -0,0 +1,19 @@
+# coding=utf-8
+'''
+'''
+from django.conf.urls import url
+from account import views
+
+urlpatterns = [
+    url(r'^admin/login$', views.LoginView.as_view()),
+    url(r'^admin/regist$', views.RegistView.as_view()),
+    url(r'^admin/logout$', views.LogoutView.as_view()),
+    url(r'^admin/info$', views.InfoView.as_view()),
+    url(r'^admin/imgcode$', views.CaptchaView.as_view()),
+    url(r'^admin/pwd/reset$', views.ResetPwdView.as_view()),
+    url(r'^phcode$', views.GetPhoneCodeView.as_view()),
+
+    url(r'^doctor/login$', views.DoctorLoginView.as_view()),
+    url(r'^doctor/authinfo$', views.DoctorAuthInfoView.as_view()),
+]
+

BIN
src/account/urls_backstage.pyc


+ 156 - 0
src/account/views.py

@@ -0,0 +1,156 @@
+# coding=utf-8
+from __future__ import unicode_literals
+import random
+import json
+import uuid
+from django.contrib import auth
+from django.core.cache import cache
+from django.conf import settings
+
+from common import core_views as cv
+from common.captcha import create_idcode
+import control_user as cr
+from utils.cloopen_sms import cloopensms
+#from utils.aliyun_sms import send_verify_code,send_signup_success
+import common.common_control as ccc
+from utils.submail import send_verify_code
+
+class GetPhoneCodeView(cv.BaseView):
+    def send_resetpwd_code_msg(self,phones,content):
+        """重置密码短信验证码
+        """
+        template_id = "401151"
+        #if settings.SEND_SMS:
+        rst,msg = cloopensms.send(phones,template_id,content)
+        return rst,msg
+
+    def send_phcode(self,request):
+        """
+        """
+        qdata = request.json
+        phone = qdata.get("phone")
+        code = "%s%s%s%s" % (random.randint(0,9),random.randint(0,9),random.randint(0,9),random.randint(0,9))
+        send_verify_code(phone,code)
+        ccc.cache.set(phone,code,120)
+
+    def post(self, request):
+        """#获取短信验证码
+        @phone:"15982456282",手机号
+        """
+        try:
+            rst = self.send_phcode(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class CaptchaView(cv.BaseView):
+    def get(self, request):
+        """#获取图形验证码(管理后台)
+        >imgcode_id:"",后台返回登录时和验证码一起回传给后台
+        >imgcode:"",验证码图片base64
+        """
+        captcha, buf_str = create_idcode(4)
+        uid = str(uuid.uuid4())
+        cache.set(uid, captcha, 30 * 60)
+        return cv.to_suc({'imgcode': buf_str, 'imgcode_id': uid})
+
+class LoginView(cv.BaseView):
+    def post(self, request):
+        """#账号登录(管理后台)
+        @username:"root",str,账号
+        @password:"root",str,密码
+        @imgcode_id:"erwerkkk",图形验证码接口返回的
+        @imgcode:"erwe",图形验证码
+        """
+        try:
+            rst = cr.login_user(request)
+            return cv.to_suc()
+        except Exception as e: 
+            cv.tracefail()
+            return cv.to_fail(e)
+
+class LogoutView(cv.AuthView):
+    def post(self, request):
+        '''
+        #退出登录(管理后台)
+        '''
+        user = request.user
+        if user:
+            user_name = user.realname
+            user_email = user.name
+        else:
+            user_name = ''
+            user_email = ''
+        auth.logout(request)
+        return cv.to_suc()
+
+class RegistView(cv.BaseView):
+    def post(self,request):
+        """#用户注册
+        @utype:1/2/3,全职/兼职/企业
+        @realname:姓名
+        @phone:"15982456282",手机号
+        @phcode:"1234",短信验证码
+        @password:"123456",密码
+        @repassword:"123456",确认密码
+        """
+        try:
+            rst = cr.regist_user(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+class InfoView(cv.AdminView):
+    def get(self, request):
+        '''
+        #获取全局账号信息(权限控制)
+        '''
+        try:
+            users = cr.get_account_info(request)
+            return cv.to_suc(users)
+        except Exception as e:
+            return cv.to_fail(e)
+
+class ResetPwdView(cv.AdminView):
+    def put(self, request):
+        """
+        #重置密码(平台管理后台)
+        @password:"",新密码
+        @repassword:"",确认密码
+        """
+        try:
+            cr.reset_password(request)
+            return cv.to_suc()
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+class DoctorLoginView(cv.BaseView):
+    def post(self, request):
+        """#账号登录(管理后台)
+        @username:"root",str,账号
+        @password:"root",str,密码
+        @imgcode_id:"erwerkkk",图形验证码接口返回的
+        @imgcode:"erwe",图形验证码
+        """
+        try:
+            rst = cr.login_user_by_token(request)
+            return cv.to_suc(rst)
+        except Exception as e: 
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class DoctorAuthInfoView(cv.AuthView):
+    def get(self,request):
+        """#获取用户信息(小程序)
+        """
+        try:
+            rst = cr.get_authinfo_by_token(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)

BIN
src/account/views.pyc


+ 12 - 0
src/asgi.py

@@ -0,0 +1,12 @@
+"""
+ASGI entrypoint. Configures Django and then runs the application
+defined in the ASGI_APPLICATION setting.
+"""
+
+import os
+import django
+import channels.asgi
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
+django.setup()
+application = channels.asgi.get_channel_layer()

+ 0 - 0
src/common/__init__.py


BIN
src/common/__init__.pyc


+ 89 - 0
src/common/captcha.py

@@ -0,0 +1,89 @@
+# coding:utf-8
+import base64
+import random
+
+import StringIO
+from PIL import ImageDraw, ImageFont, Image
+
+
+def create_idcode(mlen):
+    """
+    @attention: 生成验证码
+    @param mlen: 验证码长度
+    @return: [验证码字符串,验证码图片base64]
+    @note:
+    > 生成验证码
+    > 创建图片和画笔
+    > 准备验证码图片基本配置,包括
+    > 填充验证码
+    > 填充干扰线
+    > 添加滤镜/扭曲
+    """
+    code = get_random_code(mlen)
+    # 创建图片和画笔
+    width = 100
+    height = 40
+    size = (width, height)
+    #6CC4B3
+    image = Image.new("RGBA", size, "#F5F5F7")
+    draw = ImageDraw.Draw(image)
+    fill_code(code, mlen, draw, width, height)
+    draw_line(draw, width, height, 5)
+    draw_points(draw, 10, width, height)
+    #image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR)  #创建扭曲
+    #image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
+    buf = StringIO.StringIO()
+    image.save(buf, 'png', quality=70)
+    buf_str = base64.b64encode(buf.getvalue())
+    return ''.join(code), "data:image/png;base64,"+buf_str
+
+############## 辅助函数 ##############
+def rndColor():
+    """
+    随机颜色
+    :return:
+    """
+    return random.randint(32, 127), random.randint(32, 127), random.randint(32, 127)
+
+def get_random_code(number):
+    """
+    @attention: 获取随机码(排除难以识别的o,0,i,1,z,2等)
+    """
+    return random.sample("abcdefghjkmnpqrstuvwxyABCDEFGHJKMNPQRSTUVWXY3456789", number)
+
+
+def fill_code(code, number, draw, width, height):
+    """
+    @attention: 填充验证码
+    @param code: 验证码
+    @param draw: 画笔
+    """
+    font_path = "common/font/consola.ttf"
+    font = ImageFont.truetype(font_path, 34)  # 验证码的字体和字体大小
+    for t in xrange(number):
+        draw.text((20 * t + 10, 3 if(t%2) else -3),  code[t], font=font, fill=rndColor())
+
+
+def draw_line(draw, width, height, number=1):
+    for i in xrange(number):
+        begin = (random.randint(0, width / 2), random.randint(0, height))
+        end = (random.randint(width / 2, width), random.randint(0, height))
+        draw.line([begin, end], fill="#6CC4B3", width=3)
+
+
+def draw_points(draw, point_chance, width, height):
+    """
+    绘制干扰点
+    :param draw: 画笔
+    :param point_chance: 干扰点出现概率:0到100
+    :param width:
+    :param height:
+    :return:
+    """
+    chance = min(100, max(0, int(point_chance)))  # 大小限制在[0, 100]
+
+    for w in xrange(width):
+        for h in xrange(height):
+            tmp = random.randint(0, 100)
+            if tmp > 100 - chance:
+                draw.point((w, h), fill=(0, 0, 0))

BIN
src/common/captcha.pyc


+ 234 - 0
src/common/common_control.py

@@ -0,0 +1,234 @@
+# coding:utf-8
+import os,time,datetime
+import sys
+import django
+import json
+from django.core.paginator import Paginator
+from django.conf import settings
+from django_redis import get_redis_connection
+
+import common.models as cm
+import common.common_functions as ccf
+from utils.upload_to_oss import hnoss
+import redis_lock
+
+cache = get_redis_connection('data')
+pl = cache.pipeline() 
+
+class CusJSONEncoder(json.JSONEncoder):
+    """
+    JSONEncoder subclass that knows how to encode date/time, decimal types and UUIDs.
+    """
+    def default(self, o):
+        # See "Date Time String Format" in the ECMA-262 specification.
+        if isinstance(o, datetime.datetime):
+            r = datetime.datetime.strftime(o,'%Y-%m-%d %H:%M:%S')
+            return r
+        elif isinstance(o, datetime.date):
+            return o.isoformat()
+        elif isinstance(o, datetime.time):
+            if is_aware(o):
+                raise ValueError("JSON can't represent timezone-aware times.")
+            r = o.isoformat()
+            if o.microsecond:
+                r = r[:12]
+            return r
+        elif isinstance(o, datetime.timedelta):
+            return duration_iso_string(o)
+        elif isinstance(o, decimal.Decimal):
+            return str(o)
+        elif isinstance(o, uuid.UUID):
+            return str(o)
+        else:
+            return super(JSONEncoder, self).default(o)
+
+def cache_data(timeout=60*60):
+    def _wrapper(func):
+        def __wrapper(*args,**kwargs):
+            if args:
+                key = "cdata_{}_{}".format(func.__name__,str(args))
+            else:
+                key = "cdata_{}".format(func.__name__)
+            #if not kwargs.get("cache",True) or not cache.get(key):
+            if not cache.get(key):
+                res = func(*args,**kwargs)
+                if res:
+                    cache.set(key,json.dumps(res,cls=CusJSONEncoder),timeout)
+                #print u"不取缓存!!!!!!!!!"
+                return res
+            else:
+                #print u"取缓存"
+                res = cache.get(key)
+                return json.loads(res) if res else {}
+        return __wrapper
+    return _wrapper
+
+
+def no_cache(key="*"):
+    def _wrapper(func):
+        def __wrapper(*args,**kwargs):
+            res = func(*args,**kwargs)
+            print cache.delete_pattern("cdata_{}*".format(key))
+            return res
+        return __wrapper
+    return _wrapper
+
+
+def no_cache_list(keys=[]):
+    def _wrapper(func):
+        def __wrapper(*args,**kwargs):
+            res = func(*args,**kwargs)
+            for key in keys:
+                print cache.delete_pattern("cdata_{}*".format(key))
+            return res
+        return __wrapper
+    return _wrapper
+
+def del_cache(key):
+    """
+    """
+    print cache.delete(key)
+
+def get_page_qset(qset,page,page_size=20):
+    """
+    """
+    count = qset.count()
+    if page and page_size:
+        paginator = Paginator(qset,page_size)
+        object_list = paginator.page(page).object_list
+    else:
+        object_list = qset
+    return count,object_list
+
+def upload_file(request):
+    """
+    """
+    upload_file = request.FILES['file']
+    ext = os.path.splitext(upload_file.name)[-1]
+    timestamp = str(int(time.time()*1000))
+    #dest = settings.STATIC_ROOT + "/upload/"+str(int(time.time()*1000)) + upload_file.name
+    
+    ossfile = timestamp + ext
+    content = upload_file.read()
+    watermark = request.json.get("watermark")
+    url = hnoss.upload_from_str(content,ossfile,watermark)
+    rst = {"url":url,"type":request.POST.get("type"),"name":upload_file.name}
+    return rst
+
+    dest = settings.STATIC_ROOT + "/upload/"+ timestamp + ext
+    with open(dest,"wb+") as f:
+        for chunk in upload_file.chunks():
+            f.write(chunk)
+    f.close()
+    url = dest.replace(settings.STATIC_ROOT,settings.HOST)
+    rst = {"url":url,"type":request.POST.get("type"),"name":upload_file.name}
+    #
+    if ext == ".mp4":
+        imgpath = settings.STATIC_ROOT + "/upload/" + timestamp + ".png"
+        cmd = "ffmpeg  -i {}  -ss 1.000 -vframes 1 {}".format(dest,imgpath)
+        os.system(cmd)
+        imgurl = imgpath.replace(settings.STATIC_ROOT,settings.HOST)
+        rst["imgurl"] = imgurl
+    return rst
+
+def get_cur_match():
+    """获取当前赛事
+    """
+    now = datetime.datetime.now().strftime("%Y-%m-%d")
+    cur_match = cm.Match.objects.filter(match_status=3).order_by("-id").first()
+    return cur_match
+
+def get_signup_match():
+    """获取报名赛事
+    """
+    now = datetime.datetime.now().strftime("%Y-%m-%d")
+    #先查询开始报名的赛事
+    cur_match = cm.Match.objects.filter(match_status=2).order_by("-id").first()
+    if not cur_match:
+        cur_match = cm.Match.objects.filter(match_status=3).order_by("-id").first()
+    return cur_match
+
+def ueditor_to_oss(request):
+    """
+    """
+    upload_file = request.FILES['upfile']
+    ext = os.path.splitext(upload_file.name)[-1]
+    timestamp = str(int(time.time()*1000))
+    dest = "upload/"+ timestamp + ext
+
+    #from utils.upload_to_oss import TedOSS
+    #tedoss = TedOSS()
+    url = hnoss.upload_from_str(upload_file.chunks(),dest)
+    print url
+    return url
+
+
+@cache_data()
+def get_user_info(uid):
+    user = cm.UserInfo.objects.filter(id=uid).values().first()
+    if user:
+        user["style"] = []
+        if user["zq"]:
+            user["style"].append(user["zq"])
+        if user["cw"]:
+            user["style"].append(user["cw"])
+        if user["df"]:
+            user["style"].append(user["df"])
+    return user
+
+
+def get_today_date():
+    if datetime.datetime.now().strftime("%H:%M") < "15:00":
+        if datetime.datetime.now().weekday() in [5,6]:
+            today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
+        else:
+            if datetime.datetime.now().weekday()==0:
+                today = (datetime.datetime.now()-datetime.timedelta(days=3)).strftime("%Y-%m-%d")
+            else:
+                today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
+    else:
+        if datetime.datetime.now().weekday() in [5,6]:
+            today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
+        else:
+            today = datetime.datetime.now().strftime("%Y-%m-%d")
+    return today
+
+
+def get_today_record(user_id,match_id,match_group,today):
+    """
+    """
+    key = "%s_%s_%s_%s" % (user_id,match_id,match_group,today)
+    today_record = cache.get(key)
+    today_record = json.loads(today_record) if today_record else {}
+
+    #if match_id and not match_id==get_cur_match().id and not today_record:
+    #    #记得这里上线后要注释掉
+    #    today_record = cm.PlayerRecord.get_db_model(match_id).objects.filter(user_id=user_id,match_id=match_id,stock_date=today)
+    #    today_record = today_record.values().first()
+
+    try:
+        if today_record:
+            user_info = get_user_info(today_record["user_id"])
+            if user_info:
+                user_info.pop("id")
+                today_record.update(user_info)
+
+            #仓位
+            today_stock_total = 0
+            today_stock = json.loads(today_record["today_stock"]) if today_record.get("today_stock") else []
+            for ts in today_stock:
+                if ts["fund"]:
+                    try:
+                        today_stock_total += float(ts["fund"])
+                    except Exception as e:
+                        print e
+            today_record["cangwei"] = "{}%".format(round(today_stock_total/today_record["today_fund"],4)*100)
+            today_record["today_stock_total"] = today_stock_total
+    except Exception as e:
+        import traceback
+        traceback.print_exc()
+    return today_record
+
+if __name__ == "__main__":
+    #测试
+    print get_pparents_info(1550,[])

BIN
src/common/common_control.pyc


+ 221 - 0
src/common/common_functions.py

@@ -0,0 +1,221 @@
+# coding:utf-8
+import calendar
+import hashlib
+import datetime,time
+import re
+import M2Crypto
+from PIL import Image,ImageDraw
+import requests
+from pypinyin import pinyin,lazy_pinyin
+
+def get_month_dates(month="202008"):
+    """
+    """
+    dates = []
+    now = datetime.datetime.now().date()
+    now_date_str = now.strftime("%Y%m")
+    day_end = calendar.monthrange(int(now_date_str[0:4]),int(now_date_str[4:6]))[1]
+    for i in range(1,day_end):
+        dates.append(now_date_str+"%02d" % i)
+    return dates
+
+def check_password(new,old):
+    """
+    """
+    np = hashlib.md5(new).hexdigest().upper()
+    return np==old
+
+def make_password(pwd,isdefault=None):
+    """
+    """
+    return hashlib.md5(pwd).hexdigest().upper()
+
+def addText(orgpath,string,path):
+    img = Image.open(orgpath)
+    size = img.size
+    width = size[0] - 20
+    high = size[1] - 20
+    lenth = len(string)*3
+    draw = ImageDraw.Draw(img)
+    draw.text((width-lenth,high),string,fill='black')
+    img.save(path)
+
+def list_split(items, n):
+    return [items[i:i+n] for i in range(0, len(items), n)]
+
+def str_to_datetime(tm,format="%Y-%m-%d %H:%M:%S"):
+    """
+    """
+    datetimestr = datetime.datetime.strptime(tm,format)
+    return datetimestr
+
+def datetime_to_str(tm,format="%Y-%m-%d %H:%M:%S"):
+    """
+    """
+    datetimestr = datetime.datetime.strftime(tm,format)
+    return datetimestr
+
+def get_now_str(format="%Y-%m-%d %H:%M:%S"):
+    """获取当前时间并转化成制定格式字符串
+    """
+    now = datetime.datetime.now()
+    return datetime.datetime.strftime(now,format)
+
+def check_pub_key(pub_key):
+    """检查证书有效性
+    """
+    try:
+        pub_key = M2Crypto.X509.load_cert_string(str(pub_key)) 
+        return 1
+    except:
+        return 0
+
+def check_priv_key(priv_key):
+    """检查私钥有效性
+    """
+    try:
+        M2Crypto.RSA.load_key_string(str(priv_key)) 
+        return 1
+    except:
+        return 0
+
+
+def check_pub_priv_key(pub_key, priv_key):
+    if len(pub_key) == 0 and len(priv_key) == 0:
+        return 0
+    msg = "hello"
+    try:
+        cert = M2Crypto.X509.load_cert_string(str(pub_key))
+        key = M2Crypto.RSA.load_key_string(str(priv_key))
+        encrypted = cert.get_pubkey().get_rsa().public_encrypt(msg, M2Crypto.RSA.pkcs1_padding)
+        decrypted = key.private_decrypt(encrypted, M2Crypto.RSA.pkcs1_padding)
+        if msg != decrypted:
+            return 0
+            return errno.INVALID_CERT
+    except:
+        return 0
+        return errno.INVALID_CERT
+    return 1
+
+
+def get_day_range(yesterday):
+    """
+    @attention: 获取昨天数据
+    """
+    sd = ed = yesterday.strftime("%Y%m%d")
+    return sd,ed
+
+def get_week_range(yesterday):
+    """
+    @attention: 获取最近一周数据
+    """
+    ed = yesterday.strftime("%Y%m%d")
+    sd = yesterday - datetime.timedelta(days=6)
+    sd = sd.strftime("%Y%m%d")
+    return sd,ed
+
+def get_month_range(yesterday,today_month,days):
+    """
+    @attention: 获取最近一个月数据
+    """
+    ed = yesterday.strftime("%Y%m%d")
+    temp = datetime.datetime.strptime(today_month,"%Y%m")-datetime.timedelta(days=1)
+    last_month = temp.strftime("%Y%m")
+    sd = "%s%s"%(last_month,str(days).rjust(2,"0"))
+    return sd,ed
+
+
+def list_group_by(olist,key,sort=None):
+    """
+    """
+    nlist = []
+    tmp = {}
+    for ol in olist:
+        kkey = ol[key]
+        if not tmp.has_key(kkey):
+            tmp[kkey] = [0]
+        else:
+            tmp[kkey].append(ol)
+    for k,v in tmp.items():
+        dct = {key:k,"data":v,"count":len(v)}
+        nlist.append(dct)
+    if sort:
+        nlist = sorted(nlist,key=lambda x:x["count"])
+    return nlist
+
+def get_need_params(*need_parms,**kwargs):
+    """
+    """
+    newdct = {}
+    need_parms = set(need_parms).intersection(set(kwargs.keys()))
+    for k in need_parms:
+        newdct[k] = kwargs.get(k)
+    return newdct
+
+def check_params(*need_parms,**kwargs):
+    if not set(need_parms).issubset(set(kwargs.keys())):
+        miss = list(set(need_parms)-set(kwargs.keys()))
+        miss = ",".join(miss)
+        return "缺少参数:{}".format(miss)
+    for nk in need_parms:
+        if not kwargs.get(nk):
+            return "缺少参数值:{}!".format(nk)
+    return None
+
+def get_page_list(list,page,page_size=20):
+    """
+    """
+    page = int(page)
+    page_size = int(page_size)
+    if page and page_size:
+        start = (page - 1)*page_size
+        end = page * page_size
+        count = len(list)
+        list = list[start:end]
+    else:
+        count = len(list)
+    return count,list
+
+def get_ip(request):
+    if request.META.has_key('HTTP_X_REAL_IP'):
+        ip = request.META['HTTP_X_REAL_IP']
+    elif request.META.has_key('HTTP_X_FORWARDED_FOR'):
+        ip = request.META['HTTP_X_FORWARDED_FOR']
+    else:
+        ip = request.META['REMOTE_ADDR']
+    return ip
+
+def get_city_from_ip(ip):
+    url = "https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=%s&co=&resource_id=5809&t=%s" \
+        % (ip,str(int(time.time()*1000)))
+    try:
+        result = requests.get(url).json()
+        location = result.get("data")[0].get("location")
+        location = location.split("省")[-1].split("市")[0]
+    except Exception as e:
+        print(e)
+        location = None
+    return location
+
+
+def get_name_pinyin(name):
+    pinyin = lazy_pinyin(name)
+    if len(pinyin)>1:
+        return "".join([x[0] for x in pinyin]).upper()
+    else:
+        return pinyin[0].upper()
+
+def calc_age(birthday):
+    """
+    """
+    now = datetime.datetime.now()
+    birdate = str_to_datetime(birthday,"%Y-%m-%d")
+    years = (now - birdate).days/365
+    return years
+
+if __name__ == "__main__":
+    pass
+    print make_password("hnwz@2021")
+
+
+

BIN
src/common/common_functions.pyc


+ 70 - 0
src/common/common_notice.py

@@ -0,0 +1,70 @@
+# coding:utf-8
+import os
+import sys
+import django
+import json
+from django.core.cache import cache
+from django.core.paginator import Paginator
+
+import common.models as cm
+import common.common_functions as ccf
+
+def send_audit_notice(user_id,subject_item):
+    """发送审核通知
+    """
+    title = u"报名审核通过"
+    content = u"您好,你在巴中逸沣安全培训报名的{}已审核通过,请尽快去支付!".format(subject_item)
+    cm.SysNotice.objects.create(title=title,content=content,to=user_id)
+
+def send_unauthed_notice(user_id):
+    """审核不通过短信通知
+    """
+    title = u"报名审核不通过"
+    content = u"学员您好,您在巴中逸沣安全培训报名提交的资料不符合要求,请检查后重新上传。"
+    cm.SysNotice.objects.create(title=title,content=content,to=user_id)
+
+def send_update_notice(user_id,name,subject_item):
+    """证件复审通知
+    """
+    title = u"证件复审到期通知"
+    content = u"您好:{},您的{}证件即将到复审时间 ,为避免证件被注销,请尽快报名参加复审,为节约您的时间与费用可关注我公司微信公众号(BZYF2016)在线报名上传相关资料。".format(name,subject_item)
+    cm.SysNotice.objects.create(title=title,content=content,to=user_id)
+
+def send_expired_notice(user_id,name,subject_item):
+    """证件到期通知
+    """
+    title = u"证件换证到期通知"
+    content = u"您好:{},您的{}证件即将到期 ,为避免证件被注销,请您提前3个月报名参加培训,为节约您的时间与费用可关注我公司微信公众号(BZYF2016)在线报名上传相关资料,也请您在线报名成功后模拟练习题库试题。".format(name,subject_item)
+    cm.SysNotice.objects.create(title=title,content=content,to=user_id)
+
+def send_pay_notice(user_id):
+    """支付成功通知
+    """
+    title = u"报名支付成功通知"
+    content = u"学员您好:您已支付成功,请在您手机端完成线上学习课时后才能安排考试,考试时间会提前电话通知或查看在线报名页面消息栏。"
+    cm.SysNotice.objects.create(title=title,content=content,to=user_id)
+
+def send_training_notice(user_id,subject_item,begin_time,end_time):
+    """培训通知
+    """
+    title = u"负责人、安全员、从业人员培训通知"
+    content = u"培训名称:{} 开始时间:{} 结束时间:{} 培训地点:巴中市江北车站三楼 注意事项:(计算机考试工种:网上报名成功后,不用再提交纸质资料,考试时间另行通知),(纸张考试工种:需提交本人身份证复印件1张,蓝底1寸照片2张,毕业证书复印件1张或户口薄本人显示学历页复印件1张)。 联系电话:0827-8589103".format(subject_item,begin_time,end_time)
+    cm.SysNotice.objects.create(title=title,content=content,to=user_id)
+
+def send_training_notice_special(user_id,subject_item,begin_time):
+    """培训通知
+    """
+    title = u"特种作业人员培训通知"
+    content = u"培训名称:{} 培训时间:{} 培训地点:巴中市江北车站三楼 注意事项:携带本人身份证原件,(复审、换证)人员请带上以前老证 联系电话:0827-8589102".format(subject_item,begin_time)
+    cm.SysNotice.objects.create(title=title,content=content,to=user_id)
+
+def send_exam_notice(user_id,name,subject_item,exam_time):
+    """培训通知
+    """
+    title = u"特种作业人员培训通知"
+    content = u"您好,{},您参加的{}培训即将考试,请注意。考试时间:{} 9:30 考试地点:兴文东锦社区1500米处(巴中经开区人才大楼)2楼,地图导航输入(巴中市安全生产考试中心)联系电话:15884997924 请在考试当日携带本人身份证原件与口罩准时参加考试,切勿迟到!祝考试顺利!".format(name,subject_item,exam_time)
+    cm.SysNotice.objects.create(title=title,content=content,to=user_id)
+
+if __name__ == "__main__":
+    #测试
+    pass

BIN
src/common/common_notice.pyc


+ 3 - 0
src/common/constant.py

@@ -0,0 +1,3 @@
+#coding=utf-8
+
+ARTICLE_TYPE_LIST = [u"腰斩专场",u"冠军交割",u"牛人专场",u"游资列传",u"妖股列传"]

BIN
src/common/constant.pyc


+ 242 - 0
src/common/core_views.py

@@ -0,0 +1,242 @@
+#coding=utf-8
+'''
+'''
+import json
+import logging
+import re
+import traceback
+import datetime
+import hashlib
+from utils.aestool import aescbc
+
+import decimal
+import uuid
+from django import http
+from django.contrib.sessions.backends.cache import SessionStore
+from django.core.cache import cache
+from django.http import HttpResponse, JsonResponse
+from django.shortcuts import render
+from django.utils.decorators import method_decorator
+from django.views import View
+from django.views.decorators.csrf import csrf_exempt
+from django.core.serializers.json import DjangoJSONEncoder
+
+from common import error_info
+import common.models as cm
+import common.error_info as ce
+import common.common_functions as ccf
+import common.common_control as ccc
+
+logger = logging.getLogger(__name__)
+
+
+class CusDjangoJSONEncoder(json.JSONEncoder):
+    """
+    JSONEncoder subclass that knows how to encode date/time, decimal types and UUIDs.
+    """
+    def default(self, o):
+        # See "Date Time String Format" in the ECMA-262 specification.
+        if isinstance(o, datetime.datetime):
+            r = datetime.datetime.strftime(o,'%Y-%m-%d %H:%M:%S')
+            return r
+        elif isinstance(o, datetime.date):
+            return o.isoformat()
+        elif isinstance(o, datetime.time):
+            if is_aware(o):
+                raise ValueError("JSON can't represent timezone-aware times.")
+            r = o.isoformat()
+            if o.microsecond:
+                r = r[:12]
+            return r
+        elif isinstance(o, datetime.timedelta):
+            return duration_iso_string(o)
+        elif isinstance(o, decimal.Decimal):
+            return str(o)
+        elif isinstance(o, uuid.UUID):
+            return str(o)
+        elif isinstance(o, None):
+            return ""
+        else:
+            return super(DjangoJSONEncoder, self).default(o)
+
+
+class AuthView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        """
+        @attention: as_view()方法使用该方法来分发不同http method,添加异常处理及登陆校验
+        """
+        if request.method.lower() in self.http_method_names:
+            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
+        else:
+            handler = self.http_method_not_allowed
+        return api_wapper(handler, request, True, *args, **kwargs)
+
+class AdminView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        """
+        @attention: as_view()方法使用该方法来分发不同http method,添加异常处理及登陆校验
+        """
+        self.http_method_names.append("options")
+        if request.method.lower() in self.http_method_names:
+            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
+        else:
+            handler = self.http_method_not_allowed
+        return admin_handler(handler, request, True, *args, **kwargs)
+
+
+class BaseView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        """
+        @attention: as_view()方法使用该方法来分发不同http method,添加异常处理及登陆校验
+        """
+        if request.method.lower() in self.http_method_names:
+            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
+        else:
+            handler = self.http_method_not_allowed
+
+        return api_wapper(handler, request, False, *args, **kwargs)
+
+
+def api_wapper(handler, request, is_vauth, *args, **kwargs):
+    """
+    @attention: 调试API时使用的装饰器
+    """
+    req_path = request.META["PATH_INFO"]
+    ip = request.META.get("HTTP_X_REAL_IP","")
+    token = request.META.get("HTTP_AUTHORIZATION")
+    if is_vauth:
+        if token:
+            dec_name = aescbc.decrypt(token)
+            role = dec_name.split("_")[0]
+            id = dec_name.split("_")[1]
+            if role == "1":
+                user = cm.Doctors.objects.filter(id=id).values().first()
+                user["doctor_role"] = user.get("role")
+            else:
+                user = cm.Patients.objects.filter(id=id).values().first()
+
+            if not user:
+                return JsonResponse({"code":403,"data":{},"pass":0})
+            user["role"] = role
+            setattr(request, "ip", get_ip(request))
+            setattr(request, "user", user)
+
+            if request.method == "OPTIONS":
+                return JsonResponse({})
+        else:
+            return JsonResponse({"code":403,"data":{},"pass":0})
+
+    body = request.body if hasattr(request, "body") else ""
+    if "x-www-form-urlencoded" in request.content_type:
+        info = http.QueryDict(body).dict()
+        if not info:
+            info = request.GET.dict()
+    elif "application/json" in request.content_type:
+        info = json.loads(body) if body else {}
+        if not info:
+            info = request.GET.dict()
+    else:
+        try:
+            info = json.loads(body) if body else {}
+            if not info:
+                info = request.GET.dict()
+        except Exception as e:
+            info = {}
+
+    setattr(request, "json", info)
+
+    try:
+        ret = handler(request, *args, **kwargs)
+        return ret
+    except Exception as e:
+        return to_fail(e)
+
+def admin_handler(handler, request, is_vauth, *args, **kwargs):
+    """
+    登录session校验
+    """
+    req_path = request.META["PATH_INFO"]
+    ip = request.META.get("HTTP_X_REAL_IP","")
+    token = request.META.get("HTTP_AUTHORIZATION")
+    if is_vauth and not request.user.is_authenticated():
+        return HttpResponse(status=403)
+
+    body = request.body if hasattr(request, "body") else ""
+    if "x-www-form-urlencoded" in request.content_type:
+        info = http.QueryDict(body).dict()
+        if not info:
+            info = request.GET.dict()
+    elif "application/json" in request.content_type:
+        info = json.loads(body) if body else {}
+        if not info:
+            info = request.GET.dict()
+    else:
+        try:
+            info = json.loads(body) if body else {}
+            if not info:
+                info = request.GET.dict()
+        except:
+            info = {}
+
+    setattr(request, "json", info)
+    setattr(request, "ip", get_ip(request))
+    try:
+        ret = handler(request, *args, **kwargs)
+        return ret
+    except Exception as e:
+        return to_fail(e)
+
+def to_suc(data={},code=0):
+    info = {}
+    info["data"] = data
+    info["code"] = code
+    info = eval(str(info).replace("None",'""'))
+    return JsonResponse(info,encoder=CusDjangoJSONEncoder)
+
+def to_fail(e=None):
+    info = {}
+    info["code"] = 1000
+    if isinstance(e,ce.TipException):
+        info["message"] = e.msg
+    else:
+        info["message"] = str(e)
+    return JsonResponse(info)
+
+def tracefail():
+    traceback.print_exc()
+
+def stream_file(content, content_type, file_name):
+    """
+    输出文件
+    :param content: 内容 StringIO 类型
+    :param content_type: 类型  eg: "application/vnd.ms-excel"
+    :param file_name: 文件名(需指定后缀)
+    """
+    response = HttpResponse(content=content, content_type=content_type)
+    response['Content-Disposition'] = 'attachment; filename={}'.format(file_name)
+    return response
+
+def get_ip(request):
+    if request.META.has_key('HTTP_X_REAL_IP'):
+        ip = request.META['HTTP_X_REAL_IP']
+    elif request.META.has_key('HTTP_X_FORWARDED_FOR'):
+        ip = request.META['HTTP_X_FORWARDED_FOR']
+    else:
+        ip = request.META['REMOTE_ADDR']
+    return ip
+
+def to_response(data):
+    """
+    """
+    response = HttpResponse(data,content_type="application/json")
+    #response = HttpResponse(data)
+    print dir(response)
+    return response
+    #return HttpResponse(data)
+

BIN
src/common/core_views.pyc


+ 227 - 0
src/common/custom_tools.py

@@ -0,0 +1,227 @@
+#coding=utf-8
+'''
+Created on 2017年11月14日
+
+@author: bailiangjun
+'''
+def change_dict_p2m(item,p2m,ms=[],ems=[]):
+    """
+    @attention: 把指定信息的关键字换成对应的模型字段m
+    @param item: 默认为 {p:值}
+    @note: 
+    {p:值} ==> {m:值}
+    如果传入指定序列ps,则只取序列中的值
+    如果传入指定序列eps,则取除eps以外的值
+    """
+    if not item:
+        return {}
+    
+    if not ms:
+        ms = set(p2m.itervalues())
+    temp = {p:m for p,m in p2m.iteritems() if (m in ms) and (m not in ems)}
+    return {m:item.get(p,"") for p,m in temp.iteritems()}
+
+def change_dict_m2p(item,p2m,ms=[],ems=[]):
+    """
+    @attention: 把指定信息的关键字换成对应的api协议字段
+    @param item: 默认为 {m:值}
+    @note: 
+    {m:值} ==> {p:值}
+    如果传入指定序列ps,则只取序列中的值
+    如果传入指定序列eps,则取除eps以外的值
+    """
+    if not item:
+        return {}
+    
+    if not ms:
+        ms = set(p2m.itervalues())
+    
+    temp = {p:m for p,m in p2m.iteritems() if (m in ms) and (m not in ems)}
+    return {p:item.get(m,"") for p,m in temp.iteritems()}
+
+
+def change_list_p2m(item,p2m,ms=[],ems=[]):
+    """
+    @attention: 把指定信息的关键字换成对应的模型字段m,针对列表
+    @param item: 默认为 {p:值}
+    @note: 
+    {p:值} ==> {m:值}
+    如果传入指定序列ps,则只取序列中的值
+    如果传入指定序列eps,则取除eps以外的值
+    """
+    if not item:
+        return []
+    
+    if not ms:
+        ms = set(p2m.itervalues())
+    
+    temp = {p:m for p,m in p2m.iteritems() if (m in ms) and (m not in ems)}
+
+    return map(lambda x:{m:x.get(p,"") for p,m in temp.iteritems()}, item)
+
+
+def change_list_m2p(item,p2m,ms=[],ems=[]):
+    """
+    @attention: 把指定信息的关键字换成对应的api协议字段,针对列表
+    @param item: 默认为 {m:值}
+    @note: 
+    {m:值} ==> {p:值}
+    如果传入指定序列ps,则只取序列中的值
+    如果传入指定序列eps,则取除eps以外的值
+    """
+    if not item:
+        return []
+    
+    if not ms:
+        ms = set(p2m.itervalues())
+    
+    temp = {p:m for p,m in p2m.iteritems() if (m in ms) and (m not in ems)}
+    return map(lambda x:{p:x.get(m,"") for p,m in temp.iteritems()}, item)
+
+
+def change_node_m2p(item, p2m, ms=[], ems=[]):
+    """
+    @attention: 把指定信息的关键字换成对应的api协议字段,针对列表
+    @param item: 默认为 {m:值}
+    @note:
+    {m:值} ==> {p:值}
+    如果传入指定序列ps,则只取序列中的值
+    如果传入指定序列eps,则取除eps以外的值
+    """
+    if not item:
+        return []
+
+    if not ms:
+        ms = set(p2m.itervalues())
+
+    temp = {p: m for p, m in p2m.iteritems() if (m in ms) and (m not in ems)}
+    return map(lambda x: {p: x.get(m, "") for p, m in temp.iteritems()}, item)
+
+
+def transfer_top_info(info, lkey, tkey):
+    """
+    @attention: 转换top数据给前端
+    @note:
+            由 二维数组[[标签,值],[]]---> [{label:标签,"times":值}]
+    """
+    return [{"name": item[lkey], "value": item[tkey]} for item in info]
+
+
+def transfer_list_info(info, params):
+    """
+    @attention: 转换趋势数据给前端
+    """
+    if not info:
+        return {"axis_x": [], "axis_y": {}}
+
+    if isinstance(params, list):
+        params = {item: [item] for item in params}
+
+    print params
+
+    pkeys = params.keys()
+    if len(pkeys) == 1:
+        key = pkeys[0]
+        inkeys = params[key]
+        inkeys = inkeys if inkeys else [key]
+        v = info[key]
+        axis_x = [item["dt"] for item in v]
+        axis_y = {}
+        for ik in inkeys:
+            axis_y[ik] = [item[ik] for item in v]
+    else:
+        axis_y = {}
+        for key in pkeys:
+            inkeys = params[key]
+            inkeys = inkeys if inkeys else [key]
+            v = info[key]
+            axis_x = [item["dt"] for item in v]
+            for ik in inkeys:
+                axis_y[ik] = [item[ik] for item in v]
+
+    return {"axis_x": axis_x, "axis_y": axis_y}
+
+
+def classify_access_statistic_info(info):
+    """
+    @attention: 区分access统计数据项
+    """
+    total_values = []
+    list_values = []
+    top_values = {}
+    if info.has_key("total_hit_flow"):
+        total_values.append("hit_flow")
+
+    if info.has_key("total_hit_num"):
+        total_values.append("hit_total")
+
+    if info.has_key("total_req_flow"):
+        total_values.append("req_flow")
+
+    if info.has_key("total_req_num"):
+        total_values.append("req_total")
+
+    if info.has_key("tendency_pv"):
+        list_values.append("pageview")
+
+    if info.has_key("tendency_quote"):
+        list_values.append("search")
+
+    if info.has_key("tendency_req_flow"):
+        list_values.append("req_flow")
+        list_values.append("hit_flow")
+
+    if info.has_key("tendency_req_num"):
+        list_values.append("req_total")
+        list_values.append("hit_total")
+
+    if info.has_key("tendency_ip"):
+        list_values.append("ip_num")
+
+    if info.get("top_location"):
+        top_values["location"] = int(info["top_location"])
+    if info.get("top_location_flow"):
+        top_values["location"] = int(info["top_location_flow"])
+
+    return total_values, list_values, top_values
+
+
+def classify_waf_statistic_info(info):
+    """
+    @attention: 区分waf统计数据项
+    """
+    total_values = []
+    list_values = []
+    top_values = {}
+    if info.has_key("level"):
+        total_values.append("level")
+
+    if info.has_key("total_cc") or info.has_key("total_web"):
+        total_values.append("att_num")
+
+    if info.has_key("total_ip"):
+        total_values.append("ip_num")
+
+    if info.has_key("tendency_attack"):
+        list_values.append("att_num")
+
+    if info.get("top_ip"):
+        top_values["src_ip"] = int(info["top_ip"])
+
+    if info.get("top_location"):
+        top_values["location"] = int(info["top_location"])
+
+    if info.get("top_type"):
+        top_values["rule"] = int(info["top_type"])
+
+    if info.get("top_site"):
+        top_values["domain"] = int(info["top_site"])
+
+    return total_values, list_values, top_values
+
+
+def dict_unicode2str(**params):
+    item = {}
+    for k in params:
+        item[str(k)] = str(params[k])
+    return str(item)

+ 40 - 0
src/common/error_info.py

@@ -0,0 +1,40 @@
+#coding=utf-8
+'''
+@attention: 异常定义模块
+'''
+class TipException(Exception):
+    """
+    @attention: 提示类异常,用于业务阻断时,直接返回请求
+    """
+    def __init__(self,msg):
+        self.msg = msg
+        
+    def show_msg(self):
+        return self.msg
+
+class ReasonException(Exception):
+    """
+    只需要原因的日志
+    """
+
+    def __init__(self, msg, module_name, msg_template):
+        """
+
+        :param msg:
+        :param module_name:
+        :param msg_template:  必须接收 reason参数
+        """
+        self.msg = msg
+        self.module_name = module_name
+        self.msg_template = msg_template
+
+
+class SpecialReasonException(Exception):
+    """
+    特殊异常
+    """
+    def __init__(self, msg, module_name, msg_template, inner_info):
+        self.msg_template = msg_template
+        self.module_name = module_name
+        self.msg = msg
+        self.inner_info = inner_info

BIN
src/common/error_info.pyc


+ 33 - 0
src/common/excel_output.py

@@ -0,0 +1,33 @@
+# coding:utf-8
+import StringIO
+import xlwt
+import zipfile
+import datetime
+import random, string
+import os
+from ftplib import FTP
+
+def save2memory(en_cn_map, content):
+    """
+    保存内容到xls里面
+    :param en_cn_map:  英文中文对应字典 {"name": "名字"}, OrderedDict
+    :param content:
+    :return:
+    """
+    wb = xlwt.Workbook(encoding="utf-8")
+    sheet = wb.add_sheet('info')
+    sort_head = en_cn_map.keys()
+    for i, item in enumerate(en_cn_map):
+        sheet.write(0, i, en_cn_map.get(item))
+    for row, item in enumerate(content):
+        sort_key = item.keys()
+        for key in sort_key:
+            if key not in sort_head:
+                continue
+            sheet.write(row+1, sort_head.index(key), item.get(key, ''))
+    output = StringIO.StringIO()
+    wb.save(output)
+    return output.getvalue()
+
+if __name__ == '__main__':
+    pass

BIN
src/common/font/consola.ttf


+ 39 - 0
src/common/logger.py

@@ -0,0 +1,39 @@
+#coding=utf-8
+'''
+Created on 2017年10月24日
+
+@author: bailiangjun
+'''
+import logging
+
+import settings
+
+logger = logging.getLogger('cloudwaf_defense')
+
+# 设置logger的level为DEBUG
+if settings.DEBUG:
+    logger.setLevel(logging.DEBUG)
+else:
+    logger.setLevel(logging.WARN)
+
+# 创建一个输出日志到控制台的StreamHandler
+hdr = logging.StreamHandler()
+
+# str_info = ["name","levelno","levelname","pathname","filename","module","funcName","created","asctime","threadName","message"]
+# int_info = ["lineno","msecs","relativeCreated","thread","process"]
+
+formatter = logging.Formatter("[%(asctime)s %(levelname)s]<%(name)s %(pathname)s %(lineno)s>:%(message)s")
+hdr.setFormatter(formatter)
+# 给logger添加上handler
+logger.addHandler(hdr)
+    
+def critical(msg,*args):
+    """
+    @attention: 考虑添加邮件系统/短信系统通知
+    """
+    logger.critical(msg,*args)
+
+
+
+if __name__ == '__main__':
+    logger.critical("ss%s")

BIN
src/common/logger.pyc


+ 402 - 0
src/common/migrations/0001_initial.py

@@ -0,0 +1,402 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:41
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Article',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6807\u9898')),
+                ('type', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7c7b\u578b')),
+                ('img', models.TextField(blank=True, null=True, verbose_name='\u5c01\u9762\u56fe')),
+                ('content', models.TextField(blank=True, null=True, verbose_name='\u5185\u5bb9')),
+                ('status', models.SmallIntegerField(default=1, verbose_name='\u4e0b\u7ebf/\u4e0a\u7ebf/\u7f16\u8f91\u4e2d-1/2/1')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'article',
+                'verbose_name': '\u6587\u7ae0\u4fe1\u606f',
+            },
+        ),
+        migrations.CreateModel(
+            name='Comments',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('user_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('user_avatar', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u5934\u50cf')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('content', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u54a8\u8be2\u5185\u5bb9')),
+                ('record_id', models.IntegerField(blank=True, null=True, verbose_name='\u4f5c\u4e1aid')),
+                ('pid', models.IntegerField(blank=True, null=True, verbose_name='\u4e0a\u7ea7id')),
+                ('location', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5730\u7406\u4f4d\u7f6e')),
+                ('stock_id', models.IntegerField(blank=True, null=True, verbose_name='\u4f5c\u4e1aid')),
+                ('stock_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u80a1\u7968\u540d\u79f0')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'comments',
+                'verbose_name': '\u8bc4\u8bba',
+            },
+        ),
+        migrations.CreateModel(
+            name='HotStockSellCount',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('stock_id', models.IntegerField(blank=True, null=True, verbose_name='\u80a1\u7968id')),
+                ('stock_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u80a1\u7968\u540d\u79f0')),
+                ('stock_date', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6301\u80a1\u65e5\u671f')),
+                ('seller_ids', models.TextField(blank=True, null=True, verbose_name='\u6e05\u4ed3\u9009\u624bid')),
+                ('count', models.IntegerField(default=1, verbose_name='\u6e05\u4ed3\u4eba\u6570')),
+            ],
+            options={
+                'db_table': 'hot_stock_seller',
+                'verbose_name': '\u70ed\u95e8\u6e05\u4ed3',
+            },
+        ),
+        migrations.CreateModel(
+            name='Match',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u540d\u79f0')),
+                ('start_time', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5f00\u59cb\u65f6\u95f4')),
+                ('end_time', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7ed3\u675f\u65f6\u95f4')),
+                ('groups', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u7ed3\u675f\u65f6\u95f4')),
+                ('calendar', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u62a5\u5355\u65e5\u5386')),
+                ('valid_dates', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u6709\u6548\u62a5\u5355\u65f6\u95f4')),
+                ('player_price', models.FloatField(blank=True, null=True, verbose_name='\u9009\u624b\u4ef7\u683c')),
+                ('viewer_price', models.FloatField(blank=True, null=True, verbose_name='\u6e38\u5ba2\u4ef7\u683c')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'match',
+                'verbose_name': '\u6bd4\u8d5b\u6570\u636e',
+            },
+        ),
+        migrations.CreateModel(
+            name='MatchGroup',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('match_id', models.IntegerField(blank=True, null=True, verbose_name='\u6bd4\u8d5bid')),
+                ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u540d\u79f0')),
+                ('is_active', models.SmallIntegerField(default=1, verbose_name='\u662f\u5426\u663e\u793a')),
+                ('order', models.IntegerField(default=1, verbose_name='\u6392\u5e8f\u5b57\u6bb5')),
+                ('charge', models.IntegerField(default=1, verbose_name='\u662f\u5426\u6536\u8d391/\u6536\u8d390/\u514d\u8d39')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'match_group',
+                'verbose_name': '\u6bd4\u8d5b\u5206\u7ec4',
+            },
+        ),
+        migrations.CreateModel(
+            name='OperationLog',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('op_user_name', models.CharField(max_length=255, verbose_name='\u64cd\u4f5c\u5458\u540d\u79f0')),
+                ('op_user_realname', models.CharField(max_length=255, verbose_name='\u64cd\u4f5c\u5458\u59d3\u540d')),
+                ('op_user_id', models.IntegerField(verbose_name='\u64cd\u4f5c\u5458id')),
+                ('op_user_ip', models.CharField(max_length=100, verbose_name='\u64cd\u4f5c\u5458ip')),
+                ('op_request', models.TextField(default=b'', verbose_name='request body')),
+                ('is_suc', models.BooleanField(default=True, verbose_name='\u662f\u5426\u6210\u529f')),
+                ('error_msg', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u9519\u8bef\u4fe1\u606f')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'oplog',
+                'verbose_name': '\u64cd\u4f5c\u65e5\u5fd7',
+            },
+        ),
+        migrations.CreateModel(
+            name='OperationLogConfig',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('op_view', models.CharField(blank=True, max_length=100, null=True, verbose_name='\u64cd\u4f5c\u6a21\u5757')),
+                ('op_action_flag', models.CharField(max_length=50, verbose_name='\u64cd\u4f5c\u7c7b\u578b')),
+                ('op_module', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u64cd\u4f5c\u6a21\u5757')),
+                ('op_template', models.TextField(verbose_name='\u64cd\u4f5c\u65e5\u5fd7\u6a21\u677f')),
+                ('op_url', models.CharField(max_length=255, verbose_name='URL')),
+                ('op_response', models.TextField(blank=True, max_length=255, null=True, verbose_name='URL')),
+                ('order', models.IntegerField(blank=True, null=True, verbose_name='\u6392\u5e8f\u5b57\u6bb5')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'oplog_config',
+                'verbose_name': '\u64cd\u4f5c\u65e5\u5fd7\u914d\u7f6e',
+            },
+        ),
+        migrations.CreateModel(
+            name='Player',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('username', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('usercode', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u4ee3\u7801')),
+                ('match_id', models.IntegerField(blank=True, null=True, verbose_name='\u6bd4\u8d5bid')),
+                ('match_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6bd4\u8d5b\u540d\u79f0')),
+                ('match_group', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6bd4\u8d5b\u5206\u7ec4')),
+                ('match_group_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6bd4\u8d5b\u5206\u7ec4\u540d\u79f0')),
+                ('fund', models.FloatField(default=0.0, verbose_name='\u8d44\u91d1')),
+                ('match_status', models.SmallIntegerField(default=0, verbose_name='\u6bd4\u8d5b\u72b6\u6001,\u9000\u8d5b/\u6682\u505c/\u6bd4\u8d5b\u4e2d-1/0/1')),
+                ('badge', models.CharField(blank=True, default='\u9009\u624b', max_length=255, null=True, verbose_name='\u9009\u624b\u6807\u8bc6')),
+                ('role', models.SmallIntegerField(default=0, verbose_name='\u89d2\u8272')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'player',
+                'verbose_name': '\u53c2\u6570\u9009\u624b',
+            },
+        ),
+        migrations.CreateModel(
+            name='PlayerRecord',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('username', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('usercode', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u4ee3\u7801')),
+                ('match_id', models.IntegerField(blank=True, null=True, verbose_name='\u6bd4\u8d5bid')),
+                ('stock_date', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6301\u80a1\u65e5\u671f')),
+                ('match_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6bd4\u8d5b\u540d\u79f0')),
+                ('match_group', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6bd4\u8d5b\u5206\u7ec4')),
+                ('init_fund', models.FloatField(blank=True, null=True, verbose_name='\u521d\u59cb\u8d44\u91d1')),
+                ('yesterday_fund', models.FloatField(blank=True, null=True, verbose_name='\u6628\u65e5\u8d44\u91d1')),
+                ('today_fund', models.FloatField(blank=True, null=True, verbose_name='\u4eca\u65e5\u8d44\u91d1')),
+                ('yesterday_stock', models.TextField(blank=True, null=True, verbose_name='\u6628\u65e5\u6301\u80a1')),
+                ('today_stock', models.TextField(blank=True, null=True, verbose_name='\u4eca\u65e5\u6301\u80a1')),
+                ('yesterday_stock_img', models.TextField(blank=True, null=True, verbose_name='\u6628\u65e5\u6301\u80a1\u622a\u56fe')),
+                ('today_stock_img', models.TextField(blank=True, null=True, verbose_name='\u4eca\u65e5\u6301\u80a1\u622a\u56fe')),
+                ('today_income', models.FloatField(blank=True, null=True, verbose_name='\u4eca\u65e5\u6536\u76ca')),
+                ('total_income', models.FloatField(blank=True, null=True, verbose_name='\u603b\u6536\u76ca')),
+                ('rank', models.IntegerField(blank=True, null=True, verbose_name='\u6392\u540d')),
+                ('group_rank', models.IntegerField(blank=True, null=True, verbose_name='\u5206\u7ec4\u6392\u540d')),
+                ('is_markt', models.SmallIntegerField(default=0, verbose_name='\u662f\u5426\u5f00\u8d85\u5e02')),
+                ('yesterday_is_markt', models.SmallIntegerField(default=0, verbose_name='\u6628\u65e5\u662f\u5426\u5f00\u8d85\u5e02')),
+                ('auto_complete', models.SmallIntegerField(default=0, verbose_name='\u8bf7\u5047\u6b21\u6570')),
+                ('yesterday_auto_complete', models.SmallIntegerField(default=0, verbose_name='\u8bf7\u5047\u6b21\u6570')),
+                ('wanzhu_comment', models.TextField(blank=True, null=True, verbose_name='\u70b9\u8bc4')),
+                ('experience', models.TextField(blank=True, null=True, verbose_name='\u64cd\u76d8\u603b\u7ed3/\u4eca\u65e5\u53cd\u601d')),
+                ('zq', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5468\u671f')),
+                ('cw', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u4ed3\u4f4d')),
+                ('df', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6253\u6cd5')),
+                ('pz', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u54c1\u79cd')),
+                ('badge', models.CharField(blank=True, default='\u9009\u624b', max_length=255, null=True, verbose_name='\u9009\u624b\u6807\u8bc6')),
+                ('zans', models.IntegerField(blank=True, default=0, null=True, verbose_name='\u70b9\u8d5e\u6570')),
+                ('comments_count', models.IntegerField(blank=True, default=0, null=True, verbose_name='\u70b9\u8d5e\u6570')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'player_record',
+                'verbose_name': '\u53c2\u6570\u9009\u624b',
+            },
+        ),
+        migrations.CreateModel(
+            name='SignupOrder',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('user_name', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('match_id', models.IntegerField(blank=True, null=True, verbose_name='\u6bd4\u8d5bid')),
+                ('match_name', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u6bd4\u8d5b\u540d\u79f0')),
+                ('total_fee', models.FloatField(blank=True, null=True, verbose_name='\u4ef7\u683c')),
+                ('out_trade_no', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u8ba2\u5355\u53f7')),
+                ('order_status', models.SmallIntegerField(blank=True, default=0, null=True, verbose_name='\u8ba2\u5355\u72b6\u6001')),
+                ('pay_status', models.SmallIntegerField(blank=True, default=0, null=True, verbose_name='\u652f\u4ed8\u72b6\u6001')),
+                ('pay_time', models.DateTimeField(blank=True, null=True, verbose_name='\u652f\u4ed8\u65f6\u95f4')),
+                ('signup_type', models.SmallIntegerField(blank=True, null=True, verbose_name='\u62a5\u540d\u7c7b\u578b1/\u6e38\u5ba2,2/\u9009\u624b')),
+                ('transaction_id', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u4ea4\u6613id')),
+                ('remark', models.TextField(blank=True, max_length=50, null=True, verbose_name='\u5907\u6ce8')),
+                ('phone', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u624b\u673a\u53f7')),
+                ('match_group', models.IntegerField(blank=True, null=True, verbose_name='\u8d5b\u4e8b\u5206\u7ec4')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'signup_order',
+                'verbose_name': '\u62a5\u540d\u8ba2\u5355\u8868',
+            },
+        ),
+        migrations.CreateModel(
+            name='Stock',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u540d\u79f0')),
+                ('code', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u4ee3\u7801')),
+                ('img', models.TextField(blank=True, null=True, verbose_name='\u5c01\u9762\u56fe')),
+                ('desc', models.TextField(blank=True, null=True, verbose_name='\u5185\u5bb9')),
+                ('user_num', models.IntegerField(default=0, verbose_name='\u6392\u5e8f\u5b57\u6bb5')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'stock',
+                'verbose_name': '\u80a1\u7968',
+            },
+        ),
+        migrations.CreateModel(
+            name='SysUserInfo',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u540d\u5b57')),
+                ('phone', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u624b\u673a\u53f7')),
+                ('password', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5bc6\u7801')),
+                ('realname', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u771f\u5b9e\u540d\u79f0')),
+                ('permissions', models.TextField(blank=True, null=True, verbose_name='\u6743\u9650')),
+                ('is_active', models.SmallIntegerField(default=0, verbose_name='\u662f\u5426\u6fc0\u6d3b\u53ef\u7528')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+                ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'sys_users',
+                'verbose_name': '\u7cfb\u7edf\u7528\u6237\u4fe1\u606f',
+            },
+        ),
+        migrations.CreateModel(
+            name='test',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6807\u9898')),
+                ('group_rank', models.IntegerField(blank=True, null=True, verbose_name='\u6392\u540d')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'test',
+                'verbose_name': '\u6d4b\u8bd5\u8868',
+            },
+        ),
+        migrations.CreateModel(
+            name='UserChoice',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('user_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('user_avatar', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u5934\u50cf')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('stock_id', models.IntegerField(blank=True, null=True, verbose_name='\u80a1\u7968id')),
+                ('stock_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u80a1\u7968\u540d\u79f0')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'user_choice',
+                'verbose_name': '\u8ddf\u8e2a/\u81ea\u9009',
+            },
+        ),
+        migrations.CreateModel(
+            name='UserFollows',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('follow_id', models.IntegerField(blank=True, null=True, verbose_name='\u88ab\u5173\u6ce8\u9009\u624bid')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'user_follows',
+                'verbose_name': '\u7528\u6237\u5173\u6ce8\u8868',
+            },
+        ),
+        migrations.CreateModel(
+            name='UserInfo',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('username', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('usercode', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u4ee3\u7801')),
+                ('password', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5bc6\u7801')),
+                ('realname', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u771f\u5b9e\u540d\u79f0')),
+                ('openid', models.CharField(blank=True, max_length=64, null=True, verbose_name='\u5fae\u4fe1openid')),
+                ('avatar', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u624b\u673a\u53f7')),
+                ('nickname', models.CharField(blank=True, max_length=64, null=True, verbose_name='\u624b\u673a\u53f7')),
+                ('is_bind', models.SmallIntegerField(default=0, verbose_name='\u662f\u5426\u7ed1\u5b9a')),
+                ('utype', models.SmallIntegerField(default=0, verbose_name='\u662f\u5426\u6fc0\u6d3b\u53ef\u7528')),
+                ('zq', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5468\u671f')),
+                ('cw', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u4ed3\u4f4d')),
+                ('df', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6253\u6cd5')),
+                ('pz', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u54c1\u79cd')),
+                ('account_img', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u8d26\u53f7\u622a\u56fe')),
+                ('join_time', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5165\u5e02\u65f6\u95f4')),
+                ('badge', models.CharField(blank=True, default='\u9009\u624b', max_length=255, null=True, verbose_name='\u9009\u624b\u6807\u8bc6')),
+                ('phone', models.CharField(blank=True, max_length=64, null=True, verbose_name='\u624b\u673a\u53f7')),
+                ('role', models.SmallIntegerField(default=0, verbose_name='\u89d2\u8272')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'users',
+                'verbose_name': '\u7528\u6237\u4fe1\u606f',
+            },
+        ),
+        migrations.CreateModel(
+            name='UserStock',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('stock_id', models.IntegerField(blank=True, null=True, verbose_name='\u80a1\u7968id')),
+                ('stock_date', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6301\u80a1\u65e5\u671f')),
+                ('stock_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u80a1\u7968\u540d\u79f0')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'user_stock',
+                'verbose_name': '\u9009\u624b\u6301\u80a1',
+            },
+        ),
+        migrations.CreateModel(
+            name='WanzhuConsult',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('user_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('user_avatar', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u5934\u50cf')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('content', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u54a8\u8be2\u5185\u5bb9')),
+                ('reply_content', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u56de\u590d\u5185\u5bb9')),
+                ('reply_status', models.SmallIntegerField(blank=True, default=0, null=True, verbose_name='0/\u672a\u56de\u590d,1/\u5df2\u56de\u590d')),
+                ('pid', models.IntegerField(blank=True, null=True, verbose_name='\u4e0a\u7ea7id')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'wanzhu_consult',
+                'verbose_name': '\u987d\u4e3b\u54a8\u8be2',
+            },
+        ),
+        migrations.CreateModel(
+            name='WinDefendRank',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('match_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('match_group', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6bd4\u8d5b\u5206\u7ec4')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('username', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('today_fund', models.FloatField(blank=True, null=True, verbose_name='\u8d44\u4ea7')),
+                ('total_income', models.FloatField(blank=True, null=True, verbose_name='\u603b\u6536\u76ca')),
+                ('win_rate', models.FloatField(blank=True, null=True, verbose_name='\u80dc\u7387')),
+                ('badest_income', models.FloatField(blank=True, null=True, verbose_name='\u6700\u5927\u56de\u64a4')),
+                ('zq', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5468\u671f')),
+                ('cw', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u4ed3\u4f4d')),
+                ('df', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6253\u6cd5')),
+                ('pz', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u54c1\u79cd')),
+                ('auto_complete', models.SmallIntegerField(default=0, verbose_name='\u8bf7\u5047\u6b21\u6570')),
+                ('match_status', models.SmallIntegerField(default=1, verbose_name='\u6bd4\u8d5b\u72b6\u6001,\u9000\u8d5b/\u6682\u505c/\u6bd4\u8d5b\u4e2d-1/0/1')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'win_defend_rank',
+                'verbose_name': '\u80dc\u7387\u9632\u5b88\u699c',
+            },
+        ),
+        migrations.AddField(
+            model_name='operationlog',
+            name='op_config',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='common.OperationLogConfig'),
+        ),
+    ]

BIN
src/common/migrations/0001_initial.pyc


+ 47 - 0
src/common/migrations/0002_auto_20220620_2043.py

@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:43
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='match',
+            name='player_price',
+        ),
+        migrations.RemoveField(
+            model_name='match',
+            name='viewer_price',
+        ),
+        migrations.RemoveField(
+            model_name='player',
+            name='badge',
+        ),
+        migrations.RemoveField(
+            model_name='player',
+            name='role',
+        ),
+        migrations.RemoveField(
+            model_name='playerrecord',
+            name='comments_count',
+        ),
+        migrations.RemoveField(
+            model_name='playerrecord',
+            name='zans',
+        ),
+        migrations.RemoveField(
+            model_name='userinfo',
+            name='phone',
+        ),
+        migrations.RemoveField(
+            model_name='userinfo',
+            name='role',
+        ),
+    ]

BIN
src/common/migrations/0002_auto_20220620_2043.pyc


+ 27 - 0
src/common/migrations/0003_auto_20220620_2043.py

@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:43
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0002_auto_20220620_2043'),
+    ]
+
+    operations = [
+        migrations.DeleteModel(
+            name='Comments',
+        ),
+        migrations.DeleteModel(
+            name='SignupOrder',
+        ),
+        migrations.DeleteModel(
+            name='UserChoice',
+        ),
+        migrations.DeleteModel(
+            name='WanzhuConsult',
+        ),
+    ]

BIN
src/common/migrations/0003_auto_20220620_2043.pyc


+ 138 - 0
src/common/migrations/0004_auto_20220620_2044.py

@@ -0,0 +1,138 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:44
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0003_auto_20220620_2043'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Comments',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('user_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('user_avatar', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u5934\u50cf')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('content', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u54a8\u8be2\u5185\u5bb9')),
+                ('record_id', models.IntegerField(blank=True, null=True, verbose_name='\u4f5c\u4e1aid')),
+                ('pid', models.IntegerField(blank=True, null=True, verbose_name='\u4e0a\u7ea7id')),
+                ('location', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5730\u7406\u4f4d\u7f6e')),
+                ('stock_id', models.IntegerField(blank=True, null=True, verbose_name='\u4f5c\u4e1aid')),
+                ('stock_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u80a1\u7968\u540d\u79f0')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'comments',
+                'verbose_name': '\u8bc4\u8bba',
+            },
+        ),
+        migrations.CreateModel(
+            name='SignupOrder',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('user_name', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('match_id', models.IntegerField(blank=True, null=True, verbose_name='\u6bd4\u8d5bid')),
+                ('match_name', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u6bd4\u8d5b\u540d\u79f0')),
+                ('total_fee', models.FloatField(blank=True, null=True, verbose_name='\u4ef7\u683c')),
+                ('out_trade_no', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u8ba2\u5355\u53f7')),
+                ('order_status', models.SmallIntegerField(blank=True, default=0, null=True, verbose_name='\u8ba2\u5355\u72b6\u6001')),
+                ('pay_status', models.SmallIntegerField(blank=True, default=0, null=True, verbose_name='\u652f\u4ed8\u72b6\u6001')),
+                ('pay_time', models.DateTimeField(blank=True, null=True, verbose_name='\u652f\u4ed8\u65f6\u95f4')),
+                ('signup_type', models.SmallIntegerField(blank=True, null=True, verbose_name='\u62a5\u540d\u7c7b\u578b1/\u6e38\u5ba2,2/\u9009\u624b')),
+                ('transaction_id', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u4ea4\u6613id')),
+                ('remark', models.TextField(blank=True, max_length=50, null=True, verbose_name='\u5907\u6ce8')),
+                ('phone', models.CharField(blank=True, max_length=50, null=True, verbose_name='\u624b\u673a\u53f7')),
+                ('match_group', models.IntegerField(blank=True, null=True, verbose_name='\u8d5b\u4e8b\u5206\u7ec4')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'signup_order',
+                'verbose_name': '\u62a5\u540d\u8ba2\u5355\u8868',
+            },
+        ),
+        migrations.CreateModel(
+            name='UserChoice',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('user_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('user_avatar', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u5934\u50cf')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('stock_id', models.IntegerField(blank=True, null=True, verbose_name='\u80a1\u7968id')),
+                ('stock_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u80a1\u7968\u540d\u79f0')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'user_choice',
+                'verbose_name': '\u8ddf\u8e2a/\u81ea\u9009',
+            },
+        ),
+        migrations.CreateModel(
+            name='WanzhuConsult',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('user_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('user_avatar', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u5934\u50cf')),
+                ('player_id', models.IntegerField(blank=True, null=True, verbose_name='\u9009\u624bid')),
+                ('content', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u54a8\u8be2\u5185\u5bb9')),
+                ('reply_content', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u56de\u590d\u5185\u5bb9')),
+                ('reply_status', models.SmallIntegerField(blank=True, default=0, null=True, verbose_name='0/\u672a\u56de\u590d,1/\u5df2\u56de\u590d')),
+                ('pid', models.IntegerField(blank=True, null=True, verbose_name='\u4e0a\u7ea7id')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'wanzhu_consult',
+                'verbose_name': '\u987d\u4e3b\u54a8\u8be2',
+            },
+        ),
+        migrations.AddField(
+            model_name='match',
+            name='player_price',
+            field=models.FloatField(blank=True, null=True, verbose_name='\u9009\u624b\u4ef7\u683c'),
+        ),
+        migrations.AddField(
+            model_name='match',
+            name='viewer_price',
+            field=models.FloatField(blank=True, null=True, verbose_name='\u6e38\u5ba2\u4ef7\u683c'),
+        ),
+        migrations.AddField(
+            model_name='player',
+            name='badge',
+            field=models.CharField(blank=True, default='\u9009\u624b', max_length=255, null=True, verbose_name='\u9009\u624b\u6807\u8bc6'),
+        ),
+        migrations.AddField(
+            model_name='player',
+            name='role',
+            field=models.SmallIntegerField(default=0, verbose_name='\u89d2\u8272'),
+        ),
+        migrations.AddField(
+            model_name='playerrecord',
+            name='comments_count',
+            field=models.IntegerField(blank=True, default=0, null=True, verbose_name='\u70b9\u8d5e\u6570'),
+        ),
+        migrations.AddField(
+            model_name='playerrecord',
+            name='zans',
+            field=models.IntegerField(blank=True, default=0, null=True, verbose_name='\u70b9\u8d5e\u6570'),
+        ),
+        migrations.AddField(
+            model_name='userinfo',
+            name='phone',
+            field=models.CharField(blank=True, max_length=64, null=True, verbose_name='\u624b\u673a\u53f7'),
+        ),
+        migrations.AddField(
+            model_name='userinfo',
+            name='role',
+            field=models.SmallIntegerField(default=0, verbose_name='\u89d2\u8272'),
+        ),
+    ]

BIN
src/common/migrations/0004_auto_20220620_2044.pyc


+ 23 - 0
src/common/migrations/0005_auto_20220620_2046.py

@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:46
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0004_auto_20220620_2044'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='playerrecord',
+            name='comments_count',
+        ),
+        migrations.RemoveField(
+            model_name='playerrecord',
+            name='zans',
+        ),
+    ]

BIN
src/common/migrations/0005_auto_20220620_2046.pyc


+ 25 - 0
src/common/migrations/0006_auto_20220620_2047.py

@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:47
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0005_auto_20220620_2046'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='playerrecord',
+            name='comments_count',
+            field=models.IntegerField(blank=True, default=0, null=True, verbose_name='\u70b9\u8d5e\u6570'),
+        ),
+        migrations.AddField(
+            model_name='playerrecord',
+            name='zans',
+            field=models.IntegerField(blank=True, default=0, null=True, verbose_name='\u70b9\u8d5e\u6570'),
+        ),
+    ]

BIN
src/common/migrations/0006_auto_20220620_2047.pyc


+ 23 - 0
src/common/migrations/0007_auto_20220620_2048.py

@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:48
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0006_auto_20220620_2047'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='userinfo',
+            name='phone',
+        ),
+        migrations.RemoveField(
+            model_name='userinfo',
+            name='role',
+        ),
+    ]

BIN
src/common/migrations/0007_auto_20220620_2048.pyc


+ 25 - 0
src/common/migrations/0008_auto_20220620_2048.py

@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:48
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0007_auto_20220620_2048'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='userinfo',
+            name='phone',
+            field=models.CharField(blank=True, max_length=64, null=True, verbose_name='\u624b\u673a\u53f7'),
+        ),
+        migrations.AddField(
+            model_name='userinfo',
+            name='role',
+            field=models.SmallIntegerField(default=0, verbose_name='\u89d2\u8272'),
+        ),
+    ]

BIN
src/common/migrations/0008_auto_20220620_2048.pyc


+ 23 - 0
src/common/migrations/0009_auto_20220620_2052.py

@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:52
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0008_auto_20220620_2048'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='player',
+            name='match_group_name',
+        ),
+        migrations.RemoveField(
+            model_name='player',
+            name='role',
+        ),
+    ]

BIN
src/common/migrations/0009_auto_20220620_2052.pyc


+ 25 - 0
src/common/migrations/0010_auto_20220620_2053.py

@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:53
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0009_auto_20220620_2052'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='player',
+            name='match_group_name',
+            field=models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6bd4\u8d5b\u5206\u7ec4\u540d\u79f0'),
+        ),
+        migrations.AddField(
+            model_name='player',
+            name='role',
+            field=models.SmallIntegerField(default=0, verbose_name='\u89d2\u8272'),
+        ),
+    ]

BIN
src/common/migrations/0010_auto_20220620_2053.pyc


+ 19 - 0
src/common/migrations/0011_remove_matchgroup_charge.py

@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:54
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0010_auto_20220620_2053'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='matchgroup',
+            name='charge',
+        ),
+    ]

BIN
src/common/migrations/0011_remove_matchgroup_charge.pyc


+ 20 - 0
src/common/migrations/0012_matchgroup_charge.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-20 20:54
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0011_remove_matchgroup_charge'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='matchgroup',
+            name='charge',
+            field=models.IntegerField(default=1, verbose_name='\u662f\u5426\u6536\u8d391/\u6536\u8d390/\u514d\u8d39'),
+        ),
+    ]

BIN
src/common/migrations/0012_matchgroup_charge.pyc


+ 20 - 0
src/common/migrations/0013_match_match_status.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-22 18:02
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0012_matchgroup_charge'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='match',
+            name='match_status',
+            field=models.SmallIntegerField(blank=True, default=1, null=True, verbose_name='\u8d5b\u4e8b\u72b6\u60011/\u5f85\u53d1\u5e03,2/\u5f00\u59cb\u62a5\u540d,3/\u6bd4\u8d5b\u4e2d,4/\u6bd4\u8d5b\u7ed3\u675f'),
+        ),
+    ]

BIN
src/common/migrations/0013_match_match_status.pyc


+ 20 - 0
src/common/migrations/0014_player_player_type.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-23 22:15
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0013_match_match_status'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='player',
+            name='player_type',
+            field=models.SmallIntegerField(default=1, verbose_name='\u9009\u624b\u7c7b\u578b,0/\u6e38\u5ba2,1/\u666e\u901a\u9009\u624b,2/\u5f00\u6237\u9009\u624b,3/\u79cd\u5b50\u9009\u624b'),
+        ),
+    ]

BIN
src/common/migrations/0014_player_player_type.pyc


+ 25 - 0
src/common/migrations/0015_auto_20220623_2255.py

@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-23 22:55
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0014_player_player_type'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='player',
+            name='phone',
+            field=models.CharField(blank=True, max_length=50, null=True, verbose_name='\u624b\u673a\u53f7'),
+        ),
+        migrations.AlterField(
+            model_name='player',
+            name='player_type',
+            field=models.SmallIntegerField(default=1, verbose_name='\u9009\u624b\u7c7b\u578b,0/\u6e38\u5ba2,1/\u666e\u901a\u9009\u624b,2/\u79cd\u5b50\u9009\u624b,3/\u5f00\u6237\u9009\u624b'),
+        ),
+    ]

BIN
src/common/migrations/0015_auto_20220623_2255.pyc


+ 20 - 0
src/common/migrations/0016_userinfo_player_type.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-24 01:16
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0015_auto_20220623_2255'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='userinfo',
+            name='player_type',
+            field=models.SmallIntegerField(default=1, verbose_name='\u9009\u624b\u7c7b\u578b,0/\u6e38\u5ba2,1/\u666e\u901a\u9009\u624b,2/\u79cd\u5b50\u9009\u624b,3/\u5f00\u6237\u9009\u624b'),
+        ),
+    ]

BIN
src/common/migrations/0016_userinfo_player_type.pyc


+ 25 - 0
src/common/migrations/0017_auto_20220624_1038.py

@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-24 10:38
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0016_userinfo_player_type'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='match',
+            name='signup_end_time',
+            field=models.CharField(blank=True, max_length=255, null=True, verbose_name='\u62a5\u540d\u7ed3\u675f\u65f6\u95f4'),
+        ),
+        migrations.AddField(
+            model_name='match',
+            name='signup_start_time',
+            field=models.CharField(blank=True, max_length=255, null=True, verbose_name='\u62a5\u540d\u5f00\u59cb\u65f6\u95f4'),
+        ),
+    ]

BIN
src/common/migrations/0017_auto_20220624_1038.pyc


+ 20 - 0
src/common/migrations/0018_auto_20220624_1058.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-06-24 10:58
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0017_auto_20220624_1038'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='userinfo',
+            name='player_type',
+            field=models.SmallIntegerField(default=0, verbose_name='\u9009\u624b\u7c7b\u578b,0/\u6e38\u5ba2,1/\u666e\u901a\u9009\u624b,2/\u79cd\u5b50\u9009\u624b,3/\u5f00\u6237\u9009\u624b'),
+        ),
+    ]

BIN
src/common/migrations/0018_auto_20220624_1058.pyc


+ 61 - 0
src/common/migrations/0019_auto_20220705_1444.py

@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-07-05 14:44
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0018_auto_20220624_1058'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='FundInOut',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('fundin', models.FloatField(default=0.0, verbose_name='\u8d44\u91d1\u5165')),
+                ('fundout', models.FloatField(default=0.0, verbose_name='\u8d44\u91d1\u51fa')),
+                ('stock_date', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6301\u80a1\u65e5\u671f')),
+                ('account_img', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u8d26\u53f7\u622a\u56fe')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'fund_inout',
+                'verbose_name': '\u8d44\u91d1\u51fa\u5165',
+            },
+        ),
+        migrations.AddField(
+            model_name='comments',
+            name='ip',
+            field=models.CharField(blank=True, max_length=255, null=True, verbose_name='ip\u5730\u5740'),
+        ),
+        migrations.AddField(
+            model_name='comments',
+            name='istop',
+            field=models.IntegerField(blank=True, default=0, null=True, verbose_name='\u7f6e\u9876'),
+        ),
+        migrations.AddField(
+            model_name='comments',
+            name='rank',
+            field=models.IntegerField(blank=True, default=1, null=True, verbose_name='\u6392\u5e8f'),
+        ),
+        migrations.AddField(
+            model_name='signuporder',
+            name='signup_name',
+            field=models.CharField(blank=True, max_length=50, null=True, verbose_name='\u53c2\u8d5b\u540d'),
+        ),
+        migrations.AddField(
+            model_name='userinfo',
+            name='comment_status',
+            field=models.SmallIntegerField(default=1, verbose_name='1/\u6b63\u5e38,0/\u62c9\u9ed1'),
+        ),
+        migrations.AddField(
+            model_name='wanzhuconsult',
+            name='reply_user_id',
+            field=models.IntegerField(blank=True, null=True, verbose_name='\u56de\u590d\u7528\u6237id'),
+        ),
+    ]

BIN
src/common/migrations/0019_auto_20220705_1444.pyc


+ 33 - 0
src/common/migrations/0020_consult.py

@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-07-05 15:45
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0019_auto_20220705_1444'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Consult',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('user_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u7528\u6237\u540d')),
+                ('user_avatar', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u5934\u50cf')),
+                ('content', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u54a8\u8be2\u5185\u5bb9')),
+                ('reply_content', models.TextField(blank=True, max_length=255, null=True, verbose_name='\u56de\u590d\u5185\u5bb9')),
+                ('reply_status', models.SmallIntegerField(blank=True, default=0, null=True, verbose_name='0/\u672a\u56de\u590d,1/\u5df2\u56de\u590d')),
+                ('view_status', models.SmallIntegerField(blank=True, default=0, null=True, verbose_name='0/\u672a\u8bfb,1/\u5df2\u8bfb')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'consult',
+                'verbose_name': '\u987d\u4e3b\u54a8\u8be2',
+            },
+        ),
+    ]

BIN
src/common/migrations/0020_consult.pyc


+ 46 - 0
src/common/migrations/0021_auto_20220725_0942.py

@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-07-25 09:42
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0020_consult'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='UserMatch',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('signup_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u53c2\u8d5b\u540d')),
+                ('match_id', models.IntegerField(blank=True, null=True, verbose_name='\u6bd4\u8d5bid')),
+                ('match_group', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6bd4\u8d5b\u5206\u7ec4')),
+                ('match_status', models.SmallIntegerField(default=0, verbose_name='\u6bd4\u8d5b\u72b6\u6001,\u9000\u8d5b/\u6682\u505c/\u6bd4\u8d5b\u4e2d-1/0/1')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'user_match',
+                'verbose_name': '\u7528\u6237\u53c2\u8d5b\u4fe1\u606f(\u9009\u624b\u4fe1\u606f)',
+            },
+        ),
+        migrations.AddField(
+            model_name='stock',
+            name='choice_num',
+            field=models.IntegerField(default=0, verbose_name='\u81ea\u9009\u4eba\u6570'),
+        ),
+        migrations.AddField(
+            model_name='stock',
+            name='comments_num',
+            field=models.IntegerField(default=0, verbose_name='\u7559\u8a00\u6761\u6570'),
+        ),
+        migrations.AlterField(
+            model_name='stock',
+            name='user_num',
+            field=models.IntegerField(default=0, verbose_name='\u6301\u80a1\u4eba\u6570'),
+        ),
+    ]

BIN
src/common/migrations/0021_auto_20220725_0942.pyc


+ 20 - 0
src/common/migrations/0022_usermatch_fund.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-07-25 09:47
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0021_auto_20220725_0942'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='usermatch',
+            name='fund',
+            field=models.FloatField(default=0.0, verbose_name='\u521d\u59cb\u8d44\u91d1'),
+        ),
+    ]

BIN
src/common/migrations/0022_usermatch_fund.pyc


+ 18 - 0
src/common/migrations/0023_delete_usermatch.py

@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-07-25 09:48
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0022_usermatch_fund'),
+    ]
+
+    operations = [
+        migrations.DeleteModel(
+            name='UserMatch',
+        ),
+    ]

BIN
src/common/migrations/0023_delete_usermatch.pyc


+ 32 - 0
src/common/migrations/0024_usermatch.py

@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-07-25 09:48
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0023_delete_usermatch'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='UserMatch',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user_id', models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id')),
+                ('signup_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u53c2\u8d5b\u540d')),
+                ('match_id', models.IntegerField(blank=True, null=True, verbose_name='\u6bd4\u8d5bid')),
+                ('match_group', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u6bd4\u8d5b\u5206\u7ec4')),
+                ('match_status', models.SmallIntegerField(default=0, verbose_name='\u6bd4\u8d5b\u72b6\u6001,\u9000\u8d5b/\u6682\u505c/\u6bd4\u8d5b\u4e2d-1/0/1')),
+                ('fund', models.FloatField(default=0.0, verbose_name='\u521d\u59cb\u8d44\u91d1')),
+                ('ctime', models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')),
+            ],
+            options={
+                'db_table': 'user_match',
+                'verbose_name': '\u7528\u6237\u53c2\u8d5b\u4fe1\u606f(\u9009\u624b\u4fe1\u606f)',
+            },
+        ),
+    ]

BIN
src/common/migrations/0024_usermatch.pyc


+ 20 - 0
src/common/migrations/0025_userstock_user_id.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-07-25 17:15
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0024_usermatch'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='userstock',
+            name='user_id',
+            field=models.IntegerField(blank=True, null=True, verbose_name='\u7528\u6237id'),
+        ),
+    ]

BIN
src/common/migrations/0025_userstock_user_id.pyc


+ 19 - 0
src/common/migrations/0026_remove_signuporder_signup_name.py

@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-11-29 11:13
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0025_userstock_user_id'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='signuporder',
+            name='signup_name',
+        ),
+    ]

BIN
src/common/migrations/0026_remove_signuporder_signup_name.pyc


+ 20 - 0
src/common/migrations/0027_signuporder_signup_name.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2022-11-29 11:13
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0026_remove_signuporder_signup_name'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='signuporder',
+            name='signup_name',
+            field=models.CharField(blank=True, max_length=50, null=True, verbose_name='\u53c2\u8d5b\u540d'),
+        ),
+    ]

BIN
src/common/migrations/0027_signuporder_signup_name.pyc


+ 24 - 0
src/common/migrations/0028_auto_20230103_1724.py

@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2023-01-03 17:24
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0027_signuporder_signup_name'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='wanzhuconsult',
+            name='reply_user_id',
+        ),
+        migrations.AlterField(
+            model_name='userinfo',
+            name='role',
+            field=models.SmallIntegerField(default=0, verbose_name='\u89d2\u82720/\u6e38\u5ba2,1/\u666e\u901a\u9009\u624b,2/\u514d\u8d39\u53c2\u8d5b\u9009\u624b'),
+        ),
+    ]

BIN
src/common/migrations/0028_auto_20230103_1724.pyc


+ 20 - 0
src/common/migrations/0029_wanzhuconsult_reply_user_id.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2023-01-03 17:25
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0028_auto_20230103_1724'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='wanzhuconsult',
+            name='reply_user_id',
+            field=models.IntegerField(blank=True, null=True, verbose_name='\u56de\u590d\u7528\u6237id'),
+        ),
+    ]

BIN
src/common/migrations/0029_wanzhuconsult_reply_user_id.pyc


+ 19 - 0
src/common/migrations/0030_auto_20230105_1513.py

@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2023-01-05 15:13
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0029_wanzhuconsult_reply_user_id'),
+    ]
+
+    operations = [
+        migrations.AlterModelTable(
+            name='playerrecord',
+            table='player_record_11',
+        ),
+    ]

BIN
src/common/migrations/0030_auto_20230105_1513.pyc


+ 0 - 0
src/common/migrations/0031_auto_20230105_1514.py


Деякі файли не було показано, через те що забагато файлів було змінено