Gogs 2 سال پیش
والد
کامیت
43bcb0c406

+ 67 - 4
src/common/common_control.py

@@ -3,7 +3,6 @@ import os,time,datetime
 import sys
 import django
 import json
-#from django.core.cache import cache
 from django.core.paginator import Paginator
 from django.conf import settings
 from django_redis import get_redis_connection
@@ -16,8 +15,6 @@ import redis_lock
 cache = get_redis_connection('data')
 pl = cache.pipeline() 
 
-#redis_lock.reset_all(cache)
-
 class CusJSONEncoder(json.JSONEncoder):
     """
     JSONEncoder subclass that knows how to encode date/time, decimal types and UUIDs.
@@ -138,7 +135,6 @@ def get_cur_match():
     """获取当前赛事
     """
     now = datetime.datetime.now().strftime("%Y-%m-%d")
-    #cur_match = cm.Match.objects.filter(start_time__lte=now,end_time__gte=now).order_by("-id").first()
     cur_match = cm.Match.objects.filter(match_status=3).order_by("-id").first()
     return cur_match
 
@@ -166,6 +162,73 @@ def ueditor_to_oss(request):
     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:
+        #记得这里上线后要注释掉
+        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"])
+            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,[])

+ 4 - 17
src/common/core_views.py

@@ -109,34 +109,21 @@ def api_wapper(handler, request, is_vauth, *args, **kwargs):
     req_path = request.META["PATH_INFO"]
     ip = request.META.get("HTTP_X_REAL_IP","")
     token = request.META.get("HTTP_AUTHORIZATION")
-    _pass = int(request.GET.get("pass",0))
-    _pass1 = int(request.POST.get("pass",0))
     if is_vauth:
-        #if token or _pass or _pass1:
         if token:
             dec_name = aescbc.decrypt(token)
-            id = 7796
-            #if _pass == 1 or _pass1==1:
-            #    user = cm.UserInfo.objects.filter(id=id).first()
-            #else:
-            #    id = dec_name.split("_")[0]
-            #    user = cm.UserInfo.objects.filter(id=id).first()
-
             id = dec_name.split("_")[0]
-            user = cm.UserInfo.objects.filter(id=id).first()
+            #user = ccc.get_user_info(id)
+            user = cm.UserInfo.objects.filter(id=id).values().first()
 
             if not user:
                 return JsonResponse({"code":403,"data":{},"pass":0})
-
-            #选手
             cur_match_id = ccc.get_cur_match().id
-            player = cm.Player.objects.filter(user_id=id,match_id=cur_match_id).order_by("-id").first()
-            if not player:
-                player = cm.Player.objects.filter(user_id=id).order_by("-id").first()
 
             setattr(request, "ip", get_ip(request))
             setattr(request, "user", user)
-            setattr(request, "player", player)
+            setattr(request, "cur_match_id", cur_match_id)
+
             if request.method == "OPTIONS":
                 return JsonResponse({})
         else:

+ 81 - 5
src/common/models.py

@@ -24,9 +24,10 @@ class UserInfo(models.Model):
     join_time = models.CharField(u"入市时间", max_length=255, blank=True, null=True)
     badge = models.CharField(u"选手标识", max_length=255,blank=True,null=True,default=u"选手")
     phone = models.CharField(u"手机号", max_length=64, blank=True,null=True)
-    role = models.SmallIntegerField(u"角色",default=0)
+    role = models.SmallIntegerField(u"角色0/游客,1/普通选手,2/免费参赛选手",default=0)
     player_type = models.SmallIntegerField(u"选手类型,0/游客,1/普通选手,2/种子选手,3/开户选手",default=0)
     comment_status = models.SmallIntegerField(u"1/正常,0/拉黑",default=1)
+    unionid = models.CharField(u"微信unionid", max_length=64, blank=True,null=True)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -111,14 +112,33 @@ class PlayerRecord(models.Model):
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
-    class Meta:
-        db_table = "player_record"
-        verbose_name = u"参数选手"
-        app_label = "common"
+    #class Meta:
+    #    db_table = "player_record"
+    #    verbose_name = u"参数选手"
+    #    app_label = "common"
 
     def __str__(self):
         return u"{}){}".format(self.id, self.username)
 
+    @classmethod
+    def get_db_model(cls,match_id):
+        table_name = "player_record_%s" % match_id
+        if table_name in cls._db_model_dict:
+            return cls._db_model_dict[table_name]
+        class Meta:
+            db_table = table_name
+
+        attrs = {
+            "__module__":cls.__module__,     
+            "Meta":Meta
+        }
+        db_model = type(str(table_name),(cls,),attrs)
+        cls._db_model_dict[table_name] = db_model
+        return db_model
+    _db_model_dict = {}
+    
+    class Meta:
+        abstract = True
 
 class Match(models.Model):
     """比赛数据
@@ -134,6 +154,7 @@ class Match(models.Model):
     match_status = models.SmallIntegerField(u"赛事状态1/待发布,2/开始报名,3/比赛中,4/比赛结束", blank=True,null=True,default=1)
     signup_start_time = models.CharField(u"报名开始时间", max_length=255, blank=True,null=True)
     signup_end_time = models.CharField(u"报名结束时间", max_length=255, blank=True,null=True)
+    post_start_time = models.CharField(u"交作业开始时间", max_length=255, blank=True,null=True)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -258,6 +279,7 @@ class Article(models.Model):
     img = models.TextField(u"封面图",blank=True,null=True)                       
     content = models.TextField(u"内容",blank=True,null=True)                       
     status = models.SmallIntegerField(u"下线/上线/编辑中-1/2/1",default=1)
+    isbanner = models.SmallIntegerField(u"是否banner",default=0)
                                                                                    
     ctime = models.DateTimeField(u"创建时间",auto_now_add=True)                    
     class Meta:                                                                    
@@ -299,6 +321,7 @@ class UserFollows(models.Model):
 class UserStock(models.Model):
     """选手持股情况
     """
+    user_id = models.IntegerField(u"用户id", blank=True,null=True)
     player_id = models.IntegerField(u"选手id", blank=True,null=True)
     stock_id = models.IntegerField(u"股票id", blank=True,null=True)
     stock_date = models.CharField(u"持股日期", max_length=255,blank=True,null=True)
@@ -491,3 +514,56 @@ class FundInOut(models.Model):
         db_table = "fund_inout"
         verbose_name = u"资金出入"
         app_label = "common"
+
+
+class UserMatch(models.Model):
+    """用户参赛信息
+    """
+    user_id = models.IntegerField(u"用户id", blank=True,null=True)
+    signup_name = models.CharField(u"参赛名", max_length=255,blank=True,null=True)
+    match_id = models.IntegerField(u"比赛id", blank=True,null=True)
+    match_group = models.CharField(u"比赛分组", max_length=255,blank=True,null=True)
+    match_status = models.SmallIntegerField(u"比赛状态,退赛/暂停/比赛中-1/0/1",default=0)
+    fund = models.FloatField(u"初始资金",default=0.0)
+
+    ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
+
+    class Meta:
+        db_table = "user_match"
+        verbose_name = u"用户参赛信息(选手信息)"
+        app_label = "common"
+
+    def __str__(self):
+        return u"{}){}".format(self.id, self.signup_name)
+
+
+class PlayerRecordBase(models.Model):
+    """参数选手数据
+    """
+    user_id = models.IntegerField(u"用户id", blank=True,null=True)
+    player_id = models.IntegerField(u"用户id", blank=True,null=True)
+
+    @classmethod
+    def get_db_model(cls,match_id):
+        table_name = "player_record_%s" % match_id
+        if table_name in cls._db_model_dict:
+            return cls._db_model_dict[table_name]
+        class Meta:
+            db_table = table_name
+
+        attrs = {
+            "__module__":cls.__module__,     
+            "Meta":Meta
+        }
+        db_model = type(table_name,(cls,),attrs)
+        cls._db_model_dict[table_name] = db_model
+        return db_model
+    _db_model_dict = {}
+    
+    class Meta:
+        abstract = True
+
+
+
+
+

+ 72 - 32
src/manage/controls.py

@@ -119,7 +119,7 @@ def add_model(cls,**kwargs):
             raise ce.TipException(u"该比赛已结束!")
 
         #yesterday_date = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
-        yesterday = cm.PlayerRecord.objects.filter(
+        yesterday = cm.PlayerRecord.get_db_model(match_id).objects.filter(
                         match_id=match_id,player_id=player_id).order_by("-stock_date").first()
         if yesterday:
             yesterday_fund = yesterday.today_fund
@@ -131,7 +131,7 @@ def add_model(cls,**kwargs):
             yesterday_stock = ""
             yesterday_stock_img = "" 
             yesterday_is_markt = 0
-        obj,flag = cm.PlayerRecord.objects.get_or_create(
+        obj,flag = cm.PlayerRecord.get_db_model(match_id).objects.get_or_create(
                         player_id=player_id,
                         match_id=match_id,
                         stock_date=stock_date)
@@ -160,8 +160,11 @@ def add_model(cls,**kwargs):
         #更新group_rank
 
         return obj.id
-
-    obj = model.objects.create(**kwargs)
+    if model_name == "PlayerRecord":
+        match_id = kwargs.get("match_id")
+        obj = model.get_db_model(match_id).objects.create(**kwargs)
+    else:
+        obj = model.objects.create(**kwargs)
     #
     if model_name == "Match":
         cm.MatchGroup.objects.create(
@@ -210,10 +213,15 @@ def update_model(cls,**kwargs):
         kwargs["today_stock"] = json.dumps(kwargs.get("today_stock"))
         kwargs["today_stock_img"] = json.dumps(kwargs.get("today_stock_img"))
 
-    rst = model.objects.filter(id=id).update(**kwargs)
+    if model_name == "PlayerRecord":
+        match_id = kwargs.get("match_id")
+        rst = model.get_db_model(match_id).objects.filter(id=id).update(**kwargs)
+    else:
+        rst = model.objects.filter(id=id).update(**kwargs)
 
     if model_name == "PlayerRecord":
-        obj = cm.PlayerRecord.objects.filter(id=id).first()
+        match_id = kwargs.get("match_id")
+        obj = cm.PlayerRecord.get_db_model(match_id).objects.filter(id=id).first()
         today_fund = obj.today_fund
         yesterday_fund = obj.yesterday_fund
         init_fund = obj.init_fund
@@ -251,7 +259,14 @@ def delete_model(cls,**kwargs):
     if model_name == "WanzhuConsult":
         cm.WanzhuConsult.objects.filter(Q(user_id__in=ids)|Q(reply_user_id__in=ids)).delete()
     else:
-        rst = model.objects.filter(id__in=ids).delete()
+        if model_name == "PlayerRecord":
+            match_id = kwargs.get("match_id")
+            obj = cm.PlayerRecord.get_db_model(match_id).objects.filter(id__in=ids).first()
+            ##更新group_rank
+            update_group_rank(obj.stock_date,obj.match_group,obj.match_id)
+            rst = model.get_db_model(match_id).objects.filter(id__in=ids).delete()
+        else:
+            rst = model.objects.filter(id__in=ids).delete()
         if model_name == "UserInfo":
             cm.Player.objects.filter(user_id__in=ids).delete()
             cm.PlayerRecord.objects.filter(user_id__in=ids).delete()
@@ -264,10 +279,7 @@ def delete_model(cls,**kwargs):
         if model_name == "MatchGroup":
             cm.PlayerRecord.objects.filter(match_group__in=ids).delete()
             cm.Player.objects.filter(match_group__in=ids).delete()
-        if model_name == "PlayerRecord":
-            obj = cm.PlayerRecord.objects.filter(id__in=ids).first()
-            ##更新group_rank
-            update_group_rank(obj.stock_date,obj.match_group,obj.match_id)
+
     return ids
 
 
@@ -306,7 +318,11 @@ def get_detail_info(cls,**kwargs):
     model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
     model = getattr(cm,model_name)
     id = kwargs.get("id")
-    rst = list(model.objects.filter(id=id).values())
+    if model_name == "PlayerRecord":
+        match_id = kwargs.get("match_id")
+        rst = list(model.get_db_model(match_id).objects.filter(id=id).values())
+    else:
+        rst = list(model.objects.filter(id=id).values())
     rst = rst[0] if rst else {}
     if model_name == "Player":
         user = get_user_info(rst["user_id"])
@@ -347,7 +363,11 @@ def get_list_info(cls,**kwargs):
     """
     model_name = re.search(r'.*\.(\w+)ListView',str(cls.__class__)).groups()[0]
     model = getattr(cm,model_name)
-    qset = model.objects.all()
+    if model_name == "PlayerRecord":
+        match_id = kwargs.get("match_id",0)
+        qset = model.get_db_model(match_id).objects.all()
+    else:
+        qset = model.objects.all()
     if kwargs.get("name"):
         qset = qset.filter(name__icontains=kwargs.get("name"))
     if model_name == "UserInfo":
@@ -500,8 +520,9 @@ def download_records(request):
     """
     kwargs = request.json
     header = [u"排名",u"选手",u"初始资产(万)",u"昨日资产(万)",u"今日资产",u"今日盈亏",u"总盈亏",u"昨日持股",u"今日持股"]
-    
-    qset = cm.PlayerRecord.objects.all()
+
+    match_id = kwargs.get("match_id") 
+    qset = cm.PlayerRecord.get_db_model(match_id).objects.all()
 
     if kwargs.get("match_id"):
         qset = qset.filter(match_id=kwargs.get("match_id"))
@@ -590,26 +611,29 @@ def fast_save_player(**kwargs):
 def update_player_latest(record):
     """更新选手最后一次数据
     """
-    player_id = record["player_id"]
+    user_id = record["user_id"]
     match_id = record["match_id"]
     stock_date = record["stock_date"]
     match_group = record["match_group"]
+    wincnt = record["wincnt"]
+    total = record["totalcnt"]
 
+    key = "PLAYER_LATEST_{}".format(user_id)
     if record:
-        key = "PLAYER_LATEST_{}".format(player_id)
         ccc.cache.hset(key,"stock_date",stock_date)
         ccc.cache.hset(key,"match_id",match_id)
         ccc.cache.hset(key,"match_group",match_group)
+
         #更新胜率
-        qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id)
-        win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
+        qset = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,user_id=user_id)
+        #win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
+        win_rate = wincnt/float(total) if total else 0.0
         win_rate = round(win_rate,3)
         ccc.cache.hset(key,"win_rate",win_rate)
 
-    badest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("today_income").first()
-    if badest:
-        key = "PLAYER_LATEST_{}".format(player_id)
-        ccc.cache.hset(key,"badest_income",badest.today_income)
+    #badest = cm.PlayerRecord.get_db_model(match_id).objects.filter(user_id=user_id,match_id=match_id).order_by("today_income").first()
+    #if badest:
+    #    ccc.cache.hset(key,"badest_income",badest.today_income)
 
 
 def update_group_rank(stock_date=None,match_id=None,group_id=None):
@@ -624,12 +648,7 @@ def update_group_rank(stock_date=None,match_id=None,group_id=None):
     for gp in groups:
         match_id = gp.match_id
         match_group = gp.id
-        delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
-        #del_keys = ccc.cache.keys(delkey)
-        #if del_keys:
-        #    for key in del_keys:
-        #        ccc.cache.delete(key)
-        prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
+        prset = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
         if prset:
             records = prset.values()
             case_id = " case id "
@@ -640,10 +659,31 @@ def update_group_rank(stock_date=None,match_id=None,group_id=None):
                 cases.append(case)
                 where.append(str(pr["id"]))
                 #
-                key = "%s_%s_%s_%s" % (pr["player_id"],match_id,match_group,stock_date)
+                key = "%s_%s_%s_%s" % (pr["user_id"],match_id,match_group,stock_date)
                 pr.update({"group_rank":index+1})
                 ccc.pl.set(key,json.dumps(pr,cls=ccc.CusJSONEncoder))
+
             ccc.pl.execute()
+
+            winset = cm.PlayerRecord.get_db_model(match_id).objects.filter(
+                match_id=match_id,match_group=match_group,today_income__gte=0)\
+                .values("user_id").annotate(wincnt=Count("user_id")).values("user_id","match_id","match_group","wincnt")
+            totalset = cm.PlayerRecord.get_db_model(match_id).objects.filter(
+                match_id=match_id,match_group=match_group)\
+                .values("user_id").annotate(totalcnt=Count("user_id")).values("user_id","totalcnt")
+            totallist = list(totalset)
+            for item in winset:
+                item["stock_date"] = stock_date
+                user_id = item["user_id"]
+                total = filter(lambda x:x["user_id"]==user_id,totallist)
+                if total:
+                    item.update(total[0])
+                else:
+                    item.update({"totalcnt":0})
+
+                #更新最后一次数据
+                update_player_latest(item)
+
             if cases and where:
                 case = case_id + " ".join(cases)
                 where = ",".join(where)
@@ -652,8 +692,8 @@ def update_group_rank(stock_date=None,match_id=None,group_id=None):
                 cursor.execute(sql)
                 cursor.close()
 
-            #更新最后一次数据
-            update_player_latest(pr)
+            ##更新最后一次数据
+            #update_player_latest(pr)
 
 
 def update_comment(**kwargs):

+ 5 - 4
src/manage/views.py

@@ -286,7 +286,7 @@ class MatchView(cv.AdminView):
         if mse:
             raise ce.TipException(mse)
         try:
-            need_params.extend(["calendar","valid_dates","player_price","viewer_price","match_status","signup_start_time","signup_end_time"])
+            need_params.extend(["calendar","valid_dates","player_price","viewer_price","match_status","signup_start_time","signup_end_time","post_start_time"])
             vals = ccf.get_need_params(*need_params,**qdata)
             vals["valid_dates"] = json.dumps(vals["valid_dates"])
             rst = ctl.add_model(self,**vals)
@@ -308,7 +308,7 @@ class MatchView(cv.AdminView):
         if mse:
             raise ce.TipException(mse)
         try:
-            need_params.extend(["calendar","valid_dates","signup_start_time","signup_end_time","match_status"])
+            need_params.extend(["calendar","valid_dates","signup_start_time","signup_end_time","match_status","post_start_time"])
             vals = ccf.get_need_params(*need_params,**qdata)
             vals["valid_dates"] = json.dumps(vals["valid_dates"])
             rst = ctl.update_model(self,**vals)
@@ -448,7 +448,7 @@ class PlayerRecordView(cv.AdminView):
         @id:1
         """
         qdata = request.json
-        need_params = ["id"]
+        need_params = ["id","match_id"]
         mse = ccf.check_params(*need_params,**qdata)
         if mse:
             raise ce.TipException(mse)
@@ -512,7 +512,7 @@ class PlayerRecordView(cv.AdminView):
         @id:"1",多个逗号分隔
         """
         qdata = request.json
-        need_params = ["id"]
+        need_params = ["id","match_id"]
         mse = ccf.check_params(*need_params,**qdata)
         if mse:
             raise ce.TipException(mse)
@@ -657,6 +657,7 @@ class PlayerAutoRecordView(cv.AdminView):
     def post(self,request):
         """#自动补全数据(平台管理后台)
         """
+        return cv.to_suc()
         qdata = request.json
         stock_date = qdata.get("stock_date")
         from tools.autocomplete_record import auto_gen_record

+ 11 - 9
src/oplog/OpLogMiddleware.py

@@ -29,7 +29,7 @@ class OpLogMiddleware(object):
             op_view = "testview"
         op_action_flag = request.method
         op_url = request.path.strip()
-        #op_url = op_url.split("?")[0]
+
         if request.META.get("CONTENT_TYPE","") == "application/json":
             reqdata = request.body if request.body else {}
         else:
@@ -41,13 +41,16 @@ class OpLogMiddleware(object):
                 reqdata = request.body if request.body else {}
         reqdata = json.dumps(reqdata)
         try:
-            op_user_name = request.user.name if request.user and request.user.id else reqdata.get("name",u"匿名")
-            op_user_realname = request.user.realname if request.user and request.user.id else reqdata.get("realname",u"匿名")
+            op_user_name = request.user["name"] if request.user and request.user["id"] else reqdata.get("name",u"匿名")
+            op_user_realname = request.user["realname"] if request.user and request.user["id"] else reqdata.get("realname",u"匿名")
         except:
             op_user_name = ""
             op_user_realname = ""
-        op_user_id = request.user.id if request.user else 0 
-        op_user_id = op_user_id if op_user_id else 0
+        try:
+            op_user_id = request.user["id"] if request.user and request.user["id"] else 0 
+            op_user_id = op_user_id if op_user_id else 0
+        except:
+            op_user_id = 0
         op_user_ip = cv.get_ip(request)
         op_request = json.dumps(reqdata)
         try:
@@ -60,20 +63,19 @@ class OpLogMiddleware(object):
         else:
             is_suc = 0
             error_msg = response_data.get("message")
-        #
+
         last = cm.OperationLogConfig.objects.order_by("order").last()
         last_order = last.order if last else 0
         obj,flag = cm.OperationLogConfig.objects\
                 .get_or_create(**{"op_view":op_view,"op_action_flag":op_action_flag,"op_url":op_url})
         if flag:
             obj.order = last_order
+
         if not obj.op_response:
             if response_data.get("status") == "suc" or response_data.get("code") == 0:
                 obj.op_response = json.dumps(response_data)
                 obj.save()
-        #if not obj.op_request:
-        #        obj.op_request = json.dumps(request.json)
-        #        obj.save()
+
         cm.OperationLog.objects.create(
             op_user_name = op_user_name,
             op_user_realname = op_user_realname,

+ 1 - 1
src/settings/__init__.py

@@ -1,3 +1,3 @@
 #coding=utf-8
-from .settings_online import *
+from .settings_dev import *
 

+ 15 - 0
src/settings/database_router.py

@@ -0,0 +1,15 @@
+# coding:utf-8
+
+class DatabaseRouter(object):
+    def db_for_read(self,model,**hints):
+        print(model,11111111111111)
+        print(hints,2222222222222)
+        print(dir(model.objects))
+        print(model.objects)
+        pass
+
+    def db_for_write(self,model,**hints):
+        pass
+
+    def allow_migrate(self,db,app_label,model=None,**hints):
+        pass

+ 14 - 0
src/settings/settings_dev.py

@@ -34,9 +34,23 @@ DATABASES = {
             'init_command':'SET sql_mode="STRICT_TRANS_TABLES"',
             'charset':'utf8mb4'
         }
+    },
+    'coldDB': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': 'wanzb',
+        'USER': 'root',
+        'PASSWORD': 'xjc890*()',
+        'HOST': '127.0.0.1',
+        'PORT': '3306',
+        'OPTIONS':{
+            'init_command':'SET sql_mode="STRICT_TRANS_TABLES"',
+            'charset':'utf8mb4'
+        }
     }
 }
 
+#DATABASE_ROUTERS = ["settings.database_router.DatabaseRouter"]
+
 # 验证码字体库位置
 FONT_PATH = os.path.join(BASE_DIR, "../static/font", "consola.ttf")
 

+ 49 - 0
src/tools/player_to_usermatch.py

@@ -0,0 +1,49 @@
+#coding:utf-8
+import os
+import time
+import datetime
+import sys
+import django
+from django.core.cache import cache
+from django.db import connection
+
+sys.path.append('/mnt/wzbapi/src')
+os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
+django.setup()
+
+import common.models as cm
+import common.common_control as ccc
+import common.common_functions as ccf
+
+def player_to_usermatch():
+    """选手转用户赛事关联
+    """
+    players = cm.Player.objects.all()
+    for item in players:
+        user_id = item.user_id
+        signup_name = item.username
+        match_id = item.match_id
+        match_group = item.match_group
+        fund = item.fund
+        match_status = item.match_status
+
+        obj,flag = cm.UserMatch.objects.get_or_create(
+            user_id = user_id,
+            match_id = match_id,
+            match_group = match_group
+        )
+        obj.signup_name = signup_name
+        obj.fund = fund
+        obj.match_status = match_status
+        obj.save()
+
+if __name__ == "__main__":
+    print "start update group rank..."
+    st = time.time()
+    player_to_usermatch()
+    print "time cost:",time.time()-st
+
+
+
+
+

+ 7 - 50
src/tools/rank_server.py

@@ -28,8 +28,8 @@ def rank_server():
             stock_date = record.stock_date
             username = record.username
             usercode = record.usercode
-            player_id = record.player_id
-            print(player_id,match_id,match_group,usercode,stock_date)
+            user_id = record.user_id
+            print(user_id,match_id,match_group,usercode,stock_date)
             if "15:00"<datetime.datetime.now().strftime("%H:%M") < "15:30":
                 update_cache_rank(match_id,match_group,stock_date)
             else:
@@ -89,12 +89,10 @@ def update_cache_rank(match_id,match_group,stock_date):
     """更新redis排名数据
     """
     print "update cache rank..."
-    delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
-    del_keys = ccc.cache.keys(delkey)
     prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
     records = prset.values()
     for index,pr in enumerate(records):
-        key = "%s_%s_%s_%s" % (pr["player_id"],match_id,match_group,stock_date)
+        key = "%s_%s_%s" % (pr["user_id"],match_id,stock_date)
         pr.update({"group_rank":index+1})
         ccc.pl.set(key,json.dumps(pr,cls=ccc.CusJSONEncoder))
     ccc.pl.execute()
@@ -103,9 +101,6 @@ def sync_group_rank(match_id,match_group,stock_date):
     """更新数据库排名数据
     """
     print "sync group rank..."
-    delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
-    del_keys = ccc.cache.keys(delkey)
-
     prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
     records = prset.values()
     case_id = " case id "
@@ -116,7 +111,7 @@ def sync_group_rank(match_id,match_group,stock_date):
         cases.append(case)
         where.append(str(pr["id"]))
         #
-        key = "%s_%s_%s_%s" % (pr["player_id"],match_id,match_group,stock_date)
+        key = "%s_%s_%s" % (pr["user_id"],match_id,stock_date)
         pr.update({"group_rank":index+1})
         ccc.pl.set(key,json.dumps(pr,cls=ccc.CusJSONEncoder))
     ccc.pl.execute()
@@ -129,63 +124,25 @@ def sync_group_rank(match_id,match_group,stock_date):
         cursor.execute(sql)
         cursor.close()
 
-def update_hot_seller(record):
-    """更新热门清仓
-    """
-    stock_date = record.stock_date
-
-    stock_date_time = ccf.str_to_datetime(stock_date,"%Y-%m-%d")
-    yesterday = (stock_date_time - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
-    #昨天所有持股id
-    all_stock_ids = list(cm.UserStock.objects.filter(stock_date=yesterday).values_list("stock_id",flat=True))
-    all_stock_ids = list(set(all_stock_ids))
-    for stock_id in all_stock_ids:
-        print stock_date,stock_id
-        stock = cm.Stock.objects.filter(id=stock_id).first()
-        #昨天持股选手
-        yes_players = list(cm.UserStock.objects.filter(stock_date=yesterday,stock_id=stock_id).values_list("player_id",flat=True))
-        #今天持股选手
-        td_players = list(cm.UserStock.objects.filter(stock_date=stock_date,stock_id=stock_id).values_list("player_id",flat=True))
-
-        if yes_players and td_players:
-            #清仓选手
-            sell_players = list(set(yes_players)-set(td_players))
-            if sell_players:
-                seller_ids = json.dumps(sell_players)
-                count = len(sell_players)
-
-                obj,flag = cm.HotStockSellCount.objects.get_or_create(
-                    stock_id = stock_id, 
-                    stock_name = stock.name, 
-                    stock_date = stock_date
-                )
-                obj.seller_ids = seller_ids
-                obj.count = count
-                obj.save()
-
 def update_player_latest(record):
     """更新选手最后一次数据
     """
-    player_id = record.player_id
+    user_id = record.user_id
     match_id = record.match_id
     stock_date = record.stock_date
     match_group = record.match_group
 
     if record:
-        key = "PLAYER_LATEST_{}".format(player_id)
+        key = "PLAYER_LATEST_{}".format(user_id)
         ccc.cache.hset(key,"stock_date",stock_date)
         ccc.cache.hset(key,"match_id",match_id)
         ccc.cache.hset(key,"match_group",match_group)
         #更新胜率
-        qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id)
+        qset = cm.PlayerRecord.objects.filter(match_id=match_id,user_id=user_id)
         win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
         win_rate = round(win_rate,3)
         ccc.cache.hset(key,"win_rate",win_rate)
 
-        #badest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("today_income").first()
-        #if badest:
-        #    key = "PLAYER_LATEST_{}".format(player_id)
-        #    ccc.cache.hset(key,"badest_income",badest.today_income)
         print("rank done!")
 
 if __name__ == "__main__":

+ 225 - 0
src/tools/split_table.py

@@ -0,0 +1,225 @@
+#coding:utf-8
+import os
+import time
+import datetime
+import sys
+import django
+from django.core.cache import cache
+from django.db import connection
+import pymysql
+import torndb
+import json
+
+sys.path.append('/mnt/wzbapi/src')
+os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
+django.setup()
+
+import common.models as cm
+import common.common_control as ccc
+
+def create_table(match_id):
+    sql = """
+      SET NAMES utf8mb4;
+      SET FOREIGN_KEY_CHECKS = 0;
+      DROP TABLE IF EXISTS `player_record_%s`;
+      CREATE TABLE `player_record_%s`  (
+          `id` int(11) NOT NULL AUTO_INCREMENT,
+          `user_id` int(11) NULL DEFAULT NULL,
+          `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `usercode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `match_id` int(11) NULL DEFAULT NULL,
+          `match_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `match_group` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `init_fund` double NULL DEFAULT NULL,
+          `yesterday_fund` double NULL DEFAULT NULL,
+          `today_fund` double NULL DEFAULT NULL,
+          `yesterday_stock` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
+          `today_stock` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
+          `yesterday_stock_img` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
+          `today_stock_img` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
+          `ctime` datetime(6) NULL,
+          `player_id` int(11) NULL DEFAULT NULL,
+          `stock_date` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `today_income` double NULL DEFAULT NULL,
+          `total_income` double NULL DEFAULT NULL,
+          `rank` int(11) NULL DEFAULT NULL,
+          `is_markt` smallint(6) NOT NULL,
+          `yesterday_is_markt` smallint(6) NOT NULL,
+          `auto_complete` smallint(6) NOT NULL,
+          `yesterday_auto_complete` smallint(6) NOT NULL,
+          `group_rank` int(11) NULL DEFAULT NULL,
+          `badge` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `cw` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `df` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `experience` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
+          `pz` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `wanzhu_comment` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
+          `zq` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+          `comments_count` int(11) NULL DEFAULT NULL,
+          `zans` int(11) NULL DEFAULT NULL,
+          PRIMARY KEY (`id`) USING BTREE
+	) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; 
+    SET FOREIGN_KEY_CHECKS = 1;
+    """ % (match_id,match_id)
+
+    db = torndb.Connection(
+                '127.0.0.1:3306',
+                'wanzb',
+                user='root',
+                password='xjc890*()',
+                charset='utf8mb4')
+    try:
+        db.execute(sql)
+    except Exception as e:
+        print(e)
+    db.close()
+
+
+def insert_data(record):
+    sql = """
+       INSERT INTO `player_record_%s`(
+			 `id`,
+			 `user_id`,
+			 `username`,
+			 `usercode`,
+			 `match_id`,
+			 `match_name`,
+			 `match_group`,
+			 `init_fund`,
+			 `yesterday_fund`,
+			 `today_fund`,
+			 `yesterday_stock`,
+			 `today_stock`,
+			 `yesterday_stock_img`,
+			 `today_stock_img`,
+			 `ctime`,
+			 `player_id`,
+			 `stock_date`,
+			 `today_income`,
+			 `total_income`,
+			 `rank`,
+			 `is_markt`,
+			 `yesterday_is_markt`,
+			 `auto_complete`,
+			 `yesterday_auto_complete`,
+			 `group_rank`,
+			 `badge`,
+			 `cw`,
+			 `df`,
+			 `experience`,
+			 `pz`,
+			 `wanzhu_comment`,
+			 `zq`,
+			 `comments_count`,
+			 `zans`
+		 )VALUES (
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s",
+			 "%s"
+		 ); 
+    """ % (
+		 record["match_id"],
+		 record["id"],
+		 record["user_id"],
+		 record["username"],
+		 record["usercode"],
+		 record["match_id"],
+		 record["match_name"] if record["match_name"] else "",
+		 record["match_group"],
+		 record["init_fund"],
+		 record["yesterday_fund"],
+		 record["today_fund"],
+		 record["yesterday_stock"].replace('"','\\"') if record["yesterday_stock"] else "[]",
+		 record["today_stock"].replace('"','\\"') if record["today_stock"] else "[]",
+		 record["yesterday_stock_img"].replace('"','\\"') if record["yesterday_stock_img"] else "[]",
+		 record["today_stock_img"].replace('"','\\"') if record["today_stock_img"] else "[]",
+		 record["ctime"],
+		 record["player_id"],
+		 record["stock_date"],
+		 record["today_income"],
+		 record["total_income"],
+		 record["rank"] if record["rank"] else 0,
+		 record["is_markt"],
+		 record["yesterday_is_markt"],
+		 record["auto_complete"],
+		 record["yesterday_auto_complete"],
+		 record["group_rank"],
+		 record["badge"],
+		 record["cw"] if record["cw"] else "",
+		 record["df"] if record["df"] else "",
+		 record["experience"] if record["experience"] else "",
+		 record["pz"] if record["pz"] else "",
+		 record["wanzhu_comment"] if record["wanzhu_comment"] else "",
+		 record["zq"] if record["zq"] else "",
+		 record["comments_count"] if record["comments_count"] else 0,
+		 record["zans"] if record["zans"] else 0
+	)
+    db = torndb.Connection(
+                '127.0.0.1:3306',
+                'wanzb',
+                user='root',
+                password='xjc890*()',
+                charset='utf8mb4')
+    try:
+        #print(sql,22222222222222222222)
+        sql = sql.replace("\n","").replace("\t","")
+        #print(sql,33333333333333333333)
+        db.execute(sql)
+    except Exception as e:
+        print(e)
+        print(sql)
+    #db.close()
+
+
+def split_table():
+    """
+    """
+    qset = cm.Match.objects.filter(id=13)
+    for obj in qset:
+        match_id = obj.id
+        create_table(match_id)
+
+def migrate_data():
+    #qset = cm.Match.objects.all()
+    qset = cm.Match.objects.filter(id=11)
+    for obj in qset:
+        match_id = obj.id
+        record_set = cm.PlayerRecord.objects.filter(match_id=match_id,stock_date='2022-07-20')
+        data = list(record_set.values())
+        for item in data:
+            insert_data(item)
+
+if __name__ == "__main__":
+    split_table()
+    #migrate_data()

+ 21 - 73
src/weixin/control_auth.py

@@ -3,6 +3,7 @@
 '''
 import json,time,random
 from django.db import transaction
+from django.db.models import Q
 import common.models as cm
 import common.error_info as ce
 import common.common_functions as ccf
@@ -26,8 +27,6 @@ def add_wxauth_info(request):
     """
     qdata = request.json
     need_params = ["nickname","avatar","openid"]
-    print qdata
-    print need_params
     mse = ccf.check_params(*need_params,**qdata)
     if mse:
         raise ce.TipException(mse)
@@ -42,54 +41,11 @@ def add_wxauth_info(request):
 def get_wxauth_info(request):
     """
     """
-    #
-    uid = request.user.id if request.user else 0
-    openid = request.user.openid
-    player = request.player if request.player else None
-    user = cm.UserInfo.objects.filter(id=uid,openid=openid).order_by("-id").values().first()
-    match_id = ccc.get_cur_match().id
-    player = cm.Player.objects.filter(user_id=user["id"],match_id=match_id).first()
-
-    if player:
-        user["role"] = player.role
-        user["match_id"] = player.match_id
-    else:
-        user["role"] = 0
-        user["match_id"] = 0
-
-    user["free"] = 1
-
+    user = request.user
+    uid = user.get("id")
+    user = cm.UserInfo.objects.filter(id=uid).values().first()
     return user
 
-    #if not player:
-    #    #生产游客选手
-    #    cur_match = ccc.get_cur_match()
-    #    visit_group = cm.MatchGroup.objects.filter(match_id=cur_match.id,charge=0).first()
-    #    player,flag = cm.Player.objects.get_or_create(
-    #        user_id = uid, 
-    #        match_id = cur_match.id,
-    #        match_name = cur_match.name,
-    #        match_group = visit_group.id,
-    #        match_group_name = visit_group.name
-    #    )
-    #    player.username = request.user.nickname
-    #    player.usercode = request.user.usercode
-    #    player.save()
-
-    #if uid and player:
-    #    user = cm.UserInfo.objects.filter(id=uid).values().first()
-    #    user["nickname"] = user["username"]
-    #    if player and not player.fund:                                                            
-    #        user["need_fill"] = 0
-    #    else:                                                                          
-    #        user["need_fill"] = 0                                                      
-    #    user["role"] = player.role
-    #    return user
-    #else:
-    #    return {"role":0}
-
-
-
 def update_wxauth_info(request):
     """
     """
@@ -136,16 +92,17 @@ def login_user_v3(request):
     openid = info.get('openid')
     avatar = info.get('avatarUrl')
     nickname = info.get('nickName')
-    phone = info.get('phone')
+    phone = info.get('phone','11111111111')
     phcode = info.get('phcode')
+    unionid = info.get('unionid')
 
-    if not openid:
+    if not openid and not unionid:
         raise ce.TipException(u"缺少openid!")
 
-    if not ccc.cache.get(openid):
-        raise ce.TipException(u"缺少openid!")
+    #if not ccc.cache.get(openid):
+    #    raise ce.TipException(u"非法openid!")
 
-    user = cm.UserInfo.objects.filter(openid=openid).first()
+    user = cm.UserInfo.objects.filter(Q(openid=openid)|Q(phone=phone)).first()
     if not user:
         #新用户
         usercode = gen_code()
@@ -158,32 +115,23 @@ def login_user_v3(request):
         user.usercode = usercode
         user.is_bind = 1
         user.username = nickname
+        user.unionid = unionid
         user.save()
 
         tstr = "{}_{}{}".format(user.id,time.time(),random.randint(100000,999999))
         token = aescbc.encrypt(tstr)
         return {"id":user.id,"token":token,"status":1,"role":user.role}
     else:
-        role = user.role
-        if cm.Player.objects.filter(user_id=user.id).exists():
-            player = cm.Player.objects.filter(user_id=user.id).first()
-            role = player.role
-
-        if user.is_bind:
-            if not openid == user.openid:
-                raise ce.TipException(u"微信号与用户代码不配!")
-        if not user.phone:
-            user.phone = phone
-            user.save()
-            tstr = "{}_{}{}".format(user.id,time.time(),random.randint(100000,999999))
-            token = aescbc.encrypt(tstr)
-            #老用户未绑定手机
-            return {"id":user.id,"token":token,"status":2,"role":role}
-        else:
-            tstr = "{}_{}{}".format(user.id,time.time(),random.randint(100000,999999))
-            token = aescbc.encrypt(tstr)
-            #老用户已绑定手机
-            return {"id":user.id,"token":token,"status":3,"role":role}
+        user.avatar  = avatar
+        user.nickname = nickname
+        user.is_bind = 1
+        user.username = nickname
+        user.unionid = unionid
+        user.save()
+
+        tstr = "{}_{}{}".format(user.id,time.time(),random.randint(100000,999999))
+        token = aescbc.encrypt(tstr)
+        return {"id":user.id,"token":token,"status":1,"role":user.role}
 
 def bind_user_phone(request):
     """

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 383 - 349
src/weixin/controls.py


+ 4 - 0
src/weixin/urls_backstage.py

@@ -26,6 +26,7 @@ urlpatterns = [
     url(r'^player/currecord$', views.PlayerCurRecordView.as_view()),
     url(r'^article$', views.ArticleView.as_view()),
     url(r'^player/fund$', views.PlayerFundView.as_view()),
+    url(r'^user/info$', views.UserInfoView.as_view()),
     #2.0
     url(r'^v2/user/follow$', views.FollowUserView.as_view()),
     url(r'^v2/user/follow/list$', views.FollowUserListView.as_view()),
@@ -68,6 +69,9 @@ urlpatterns = [
     url(r'^v3/user/choice/list$', views.V3UserChoiceListView.as_view()),
     url(r'^v3/user/choice$', views.V3UserChoiceView.as_view()),
     url(r'^v3/user/follower/list$', views.FollowerUserListView.as_view()),
+    url(r'^v3/user/match/list$', views.UserMatchListView.as_view()),
+    url(r'^v3/stock/user/list$', views.StockUserListView.as_view()),
+    url(r'^v3/user/inout/list$', views.UserInOutListView.as_view()),
 
 ]
 

+ 62 - 24
src/weixin/views.py

@@ -56,11 +56,6 @@ class UploadFileView(cv.BaseView):
         ts = str(int(time.time()))
         dest = settings.STATIC_ROOT + "/upload/"+ ts + upload_file.name
 
-        #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)
         content = upload_file.read()
         ossfile = ts + upload_file.name
         url = hnoss.upload_from_str(content,ossfile)
@@ -78,11 +73,6 @@ class UploadAvatarView(cv.BaseView):
         ts = str(int(time.time()))
         dest = settings.STATIC_ROOT + "/upload/"+ ts + upload_file.name
 
-        #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)
         content = upload_file.read()
         ossfile = ts + upload_file.name
         url = hnoss.upload_from_str(content,ossfile,None)
@@ -196,12 +186,8 @@ class PlayerRecordView(cv.AuthView):
         @today_stock:[{name:"江苏国泰",code:121221}]
         @today_stock_img:["http://test.png"]
         """
-        #return cv.to_fail(u"系统升级维护请稍后再试....")
         qdata = request.json
-        player = request.player
         now = datetime.datetime.now()
-        #if not now.isoweekday() in [1,2,3,4,5] or not "09:30"<now.strftime("%H:%S")<"15:30":
-        #    raise ce.TipException(u"只有每周一至周五 9:30 - 15:30 之间才可以提交数据!")
         need_params = ["stock_date","today_fund"]
         mse = ccf.check_params(*need_params,**qdata)
         if mse:
@@ -209,8 +195,8 @@ class PlayerRecordView(cv.AuthView):
         try:
             need_params.extend(["is_markt","today_stock","today_stock_img","experience"])
             vals = ccf.get_need_params(*need_params,**qdata)
-            vals["player_id"] = player.id
-            vals["match_id"] = player.match_id
+            vals["user_id"] = request.user.get("id",0)
+            vals["match_id"] = ccc.get_cur_match().id
             vals["today_fund"] = round(float(vals["today_fund"]),4)
             rst = ctl.add_model(self,**vals)
             return cv.to_suc(rst)
@@ -389,7 +375,7 @@ class FollowUserView(cv.AuthView):
         try:                                                                       
             need_params.extend(["action"])
             vals = ccf.get_need_params(*need_params,**qdata)                       
-            vals["user_id"] = request.user.id
+            vals["user_id"] = request.user.get("id")
             rst = ctl.follow_player(**vals)
             return cv.to_suc(rst)                                                  
         except Exception as e:                                                     
@@ -620,7 +606,7 @@ class PlayerListView(cv.AuthView):
         try:                                                                       
             need_params.extend(["name","zq","cw","df"])
             vals = ccf.get_need_params(*need_params,**qdata)                       
-            vals["match_id"] = request.player.match_id
+            vals["match_id"] = qdata.get("match_id")
             total,rst = ctl.get_player_list(**vals)                                 
             return cv.to_suc({"total":total,"list":rst})
         except Exception as e:                                                     
@@ -657,8 +643,8 @@ class MineStyleView(cv.AuthView):
         try:                                                                       
             need_params.extend(["init_fund","account_img","username","avatar"])
             vals = ccf.get_need_params(*need_params,**qdata)                       
-            vals["user_id"] = request.user.id
-            vals["player_id"] = request.player.id if request.player else None
+            vals["user_id"] = request.user["id"]
+            #vals["player_id"] = request.player.id if request.player else None
             rst = ctl.update_user_style(**vals)
             return cv.to_suc(rst)
         except Exception as e:                                                     
@@ -702,8 +688,8 @@ class StockView(cv.AuthView):
         try:
             need_params.extend(["page","page_size","stock_date"])
             vals = ccf.get_need_params(*need_params,**qdata)
-            vals["user_id"] = request.user.id
-            vals["player_id"] = request.player.id if request.player else None
+            vals["user_id"] = request.user.get("id")
+            #vals["player_id"] = request.player.id if request.player else None
             rst = ctl.get_detail_info(self,**vals)
             vals["stock_id"] = rst["id"]
             rst["list"] = ctl.get_stock_players(**vals)
@@ -744,11 +730,11 @@ class PlayerMatchCalendarView(cv.AuthView):
     def get(self, request):
         """#获取日历收益(2.0小程序)
         @match_id:1
-        @player_id:1
+        @user_id:1
         @month:2021-12
         """
         qdata = request.json
-        need_params = ["player_id","match_id","month"]
+        need_params = ["user_id","match_id","month"]
         mse = ccf.check_params(*need_params,**qdata)
         if mse:
             raise ce.TipException(mse)
@@ -805,6 +791,8 @@ class V3LoginView(cv.BaseView):
         @nickanme:"微信昵称"
         @avatar:"微信头像"
         @openid:"openid"
+        @phone:"15982456282"
+        @phcode:"2345"
         """
         try:
             rst = ca.login_user_v3(request)
@@ -914,6 +902,7 @@ class V3ZanCountView(cv.AuthView):
             rst = ctl.get_user_zans(request)
             return cv.to_suc(rst)
         except Exception as e: 
+            cv.tracefail()
             return cv.to_fail(e)
 
 
@@ -1050,3 +1039,52 @@ class V3UserChoiceView(cv.AuthView):
         except Exception as e:
             cv.tracefail()
             return cv.to_fail(e)
+
+
+class UserMatchListView(cv.AuthView):
+    def get(self, request):
+        """#用户参赛列表v3(3.0小程序)
+        """
+        try:
+            total,rst = ctl.get_user_match_list(request)
+            return cv.to_suc({"total":total,"list":rst})
+        except Exception as e: 
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class UserInfoView(cv.AuthView):
+    def get(self, request):
+        """#用户信息(公共)
+        """
+        try:
+            rst = ctl.get_format_user_info(request)
+            return cv.to_suc(rst)
+        except Exception as e: 
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class StockUserListView(cv.AuthView):
+    def get(self, request):
+        """#股票持仓选手数据(3.0小程序)
+        """
+        try:
+            qdata = request.json
+            total,rst = ctl.get_stock_players(**qdata)
+            return cv.to_suc({"total":total,"list":rst})
+        except Exception as e: 
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class UserInOutListView(cv.AuthView):
+    def get(self, request):
+        """#每日盈亏(3.0小程序)
+        """
+        try:
+            total,rst = ctl.get_day_inout_rank_list(request)
+            return cv.to_suc({"total":total,"list":rst})
+        except Exception as e: 
+            cv.tracefail()
+            return cv.to_fail(e)

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
templates/index.html