xjc 3 년 전
부모
커밋
1efc1c79b8

+ 15 - 1
src/common/common_control.py

@@ -113,7 +113,8 @@ def upload_file(request):
     
     ossfile = timestamp + ext
     content = upload_file.read()
-    url = hnoss.upload_from_str(content,ossfile)
+    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
 
@@ -151,6 +152,19 @@ def get_signup_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
 
 if __name__ == "__main__":
     #测试

+ 24 - 3
src/common/core_views.py

@@ -109,13 +109,24 @@ 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()
-            if not user and False:
-                return JsonResponse({"code":403,"data":{}})
+
+            if not user:
+                return JsonResponse({"code":403,"data":{},"pass":0})
 
             #选手
             cur_match_id = ccc.get_cur_match().id
@@ -129,7 +140,7 @@ def api_wapper(handler, request, is_vauth, *args, **kwargs):
             if request.method == "OPTIONS":
                 return JsonResponse({})
         else:
-            return JsonResponse({"code":403,"data":{}})
+            return JsonResponse({"code":403,"data":{},"pass":0})
 
     body = request.body if hasattr(request, "body") else ""
     if "x-www-form-urlencoded" in request.content_type:
@@ -228,3 +239,13 @@ def get_ip(request):
     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)
+

+ 23 - 0
src/common/models.py

@@ -26,6 +26,7 @@ class UserInfo(models.Model):
     phone = models.CharField(u"手机号", max_length=64, blank=True,null=True)
     role = models.SmallIntegerField(u"角色",default=0)
     player_type = models.SmallIntegerField(u"选手类型,0/游客,1/普通选手,2/种子选手,3/开户选手",default=0)
+    comment_status = models.SmallIntegerField(u"1/正常,0/拉黑",default=1)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -378,6 +379,7 @@ class SignupOrder(models.Model):
     remark = models.TextField(u"备注",max_length=50,blank=True,null=True)
     phone = models.CharField(u"手机号",max_length=50,blank=True,null=True)
     match_group = models.IntegerField(u"赛事分组",blank=True,null=True)
+    signup_name = models.CharField(u"参赛名",max_length=50,blank=True,null=True)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -398,6 +400,7 @@ class WanzhuConsult(models.Model):
     reply_content = models.TextField(u"回复内容", max_length=255, blank=True,null=True)
     reply_status = models.SmallIntegerField(u"0/未回复,1/已回复",blank=True,null=True,default=0)
     pid = models.IntegerField(u"上级id",blank=True,null=True)
+    reply_user_id = models.IntegerField(u"回复用户id",blank=True,null=True)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -418,9 +421,12 @@ class Comments(models.Model):
     content = models.TextField(u"咨询内容", max_length=255, blank=True,null=True)
     record_id = models.IntegerField(u"作业id",blank=True,null=True)
     pid = models.IntegerField(u"上级id",blank=True,null=True)
+    ip = models.CharField(u"ip地址", max_length=255, blank=True,null=True)
     location = models.CharField(u"地理位置", max_length=255, blank=True,null=True)
     stock_id = models.IntegerField(u"作业id",blank=True,null=True)
     stock_name = models.CharField(u"股票名称", max_length=255, blank=True,null=True)
+    rank = models.IntegerField(u"排序",blank=True,null=True,default=1)
+    istop = models.IntegerField(u"置顶",blank=True,null=True,default=0)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -446,3 +452,20 @@ class UserChoice(models.Model):
         db_table = "user_choice"
         verbose_name = u"跟踪/自选"
         app_label = "common"
+
+
+class FundInOut(models.Model):
+    """资金出入
+    """
+    user_id = models.IntegerField(u"用户id",blank=True,null=True)
+    fundin = models.FloatField(u"资金入",default=0.0)
+    fundout = models.FloatField(u"资金出",default=0.0)
+    stock_date = models.CharField(u"持股日期", max_length=255,blank=True,null=True)
+    account_img = models.TextField(u"账号截图", max_length=255, blank=True, null=True)
+
+    ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
+
+    class Meta:
+        db_table = "fund_inout"
+        verbose_name = u"资金出入"
+        app_label = "common"

+ 221 - 34
src/manage/controls.py

@@ -26,12 +26,26 @@ from PIL import Image,ImageDraw,ImageFont
 from threading import Thread
 #from django.core.cache import cache
 from django.db import connection
+from utils.wxSubscribeMessage import send_consult_reply_message
 
 import xlrd
 import xlwt
 from xlutils.copy import copy
 from xltpl.writer import BookWriter
 
+@ccc.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 async(f):
     def wrapper(*args, **kwargs):
         thr = Thread(target=f, args=args, kwargs=kwargs)
@@ -76,10 +90,13 @@ def add_model(cls,**kwargs):
     if model_name == "UserInfo":
         username = kwargs.get("username")
         usercode = kwargs.get("usercode")
+        phone = kwargs.get("phone")
         if cm.UserInfo.objects.filter(username=username).exists():
             raise ce.TipException(u"用户名重复!")
         if cm.UserInfo.objects.filter(usercode=usercode).exists():
             raise ce.TipException(u"用户代码重复!")
+        if cm.UserInfo.objects.filter(phone=phone).exists():
+            raise ce.TipException(u"手机号重复!")
     if model_name == "Match":
         name = kwargs.get("name")
         if cm.Match.objects.filter(name=name).exists():
@@ -190,10 +207,13 @@ def update_model(cls,**kwargs):
     if model_name == "UserInfo":
         username = kwargs.get("username")
         usercode = kwargs.get("usercode")
+        phone = kwargs.get("phone")
         if cm.UserInfo.objects.exclude(id=id).filter(username=username).exists():
             raise ce.TipException(u"用户名重复!")
         if cm.UserInfo.objects.exclude(id=id).filter(usercode=usercode).exists():
             raise ce.TipException(u"用户代码重复!")
+        if phone and cm.UserInfo.objects.exclude(id=id).filter(phone=phone).exists():
+            raise ce.TipException(u"手机号重复!")
     if model_name == "Player":
         user_id = kwargs.get("user_id")
         match_id = kwargs.get("match_id")
@@ -202,8 +222,8 @@ def update_model(cls,**kwargs):
         user =cm.UserInfo.objects.filter(id=user_id).first()
         username = user.username if user else ""
         usercode = user.usercode if user else ""
-        kwargs["username"] = username
-        kwargs["usercode"] = usercode
+        #kwargs["username"] = username
+        #kwargs["usercode"] = usercode
 
     if model_name == "PlayerRecord":
         is_markt = int(kwargs.get("is_markt",0))
@@ -247,19 +267,22 @@ def delete_model(cls,**kwargs):
     model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
     model = getattr(cm,model_name)
     ids = str(kwargs.get("id")).split(",")
-    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()
-    if model_name == "Player":
-        cm.PlayerRecord.objects.filter(player_id__in=ids).delete()
-    if model_name == "Match":
-        cm.PlayerRecord.objects.filter(match_id__in=ids).delete()
-        cm.Player.objects.filter(match_id__in=ids).delete()
-        cm.MatchGroup.objects.filter(match_id__in=ids).delete()
-    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 == "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 == "UserInfo":
+            cm.Player.objects.filter(user_id__in=ids).delete()
+            cm.PlayerRecord.objects.filter(user_id__in=ids).delete()
+        if model_name == "Player":
+            cm.PlayerRecord.objects.filter(player_id__in=ids).delete()
+        if model_name == "Match":
+            cm.PlayerRecord.objects.filter(match_id__in=ids).delete()
+            cm.Player.objects.filter(match_id__in=ids).delete()
+            cm.MatchGroup.objects.filter(match_id__in=ids).delete()
+        if model_name == "MatchGroup":
+            cm.PlayerRecord.objects.filter(match_group__in=ids).delete()
+            cm.Player.objects.filter(match_group__in=ids).delete()
     #更新group_rank
     update_group_rank()
     return ids
@@ -306,7 +329,7 @@ def get_detail_info(cls,**kwargs):
         rst["username"] = user.username
         rst["usercode"] = user.usercode
         rst["match_name"] = match.name if match else ""
-        rst["match_group"] = int(rst["match_group"])
+        rst["match_group"] = int(rst["match_group"]) if rst["match_group"] else 0
     if model_name == "PlayerRecord":
         rst["today_stock"] = json.loads(rst["today_stock"]) if rst["today_stock"] else []
         rst["today_stock_img"] = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
@@ -343,7 +366,7 @@ def get_list_info(cls,**kwargs):
         qset = qset.filter(name__icontains=kwargs.get("name"))
     if model_name == "UserInfo":
         if kwargs.get("username"):
-            qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
+            qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username"))|Q(phone__icontains=kwargs.get("username")))
     if model_name == "Player":
         if kwargs.get("username"):
             qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
@@ -372,11 +395,13 @@ def get_list_info(cls,**kwargs):
         if kwargs.get("match_id"):
             qset = qset.filter(match_id=kwargs.get("match_id"))
         if kwargs.get("username"):
-            qset = qset.filter(user_name__icontains=kwargs.get("username"))
+            qset = qset.filter(Q(user_name__icontains=kwargs.get("username"))|Q(phone__icontains=kwargs.get("username")))
         if kwargs.get("signup_type"):
             qset = qset.filter(signup_type=kwargs.get("signup_type"))
         if kwargs.get("order_status") or kwargs.get("order_status")==0:
             qset = qset.filter(order_status=kwargs.get("order_status"))
+        if kwargs.get("pay_status") or kwargs.get("pay_status")==0:
+            qset = qset.filter(pay_status=kwargs.get("pay_status"))
 
     if model_name == "Article":
         if kwargs.get("type"):
@@ -398,15 +423,18 @@ def get_list_info(cls,**kwargs):
                 user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
                 if user:
                     match = cm.Match.objects.filter(id=item["match_id"]).first()
-                    item["username"] = user.username
-                    item["usercode"] = user.usercode
+                    #item["username"] = user.username
+                    #item["usercode"] = user.usercode
                     item["nickname"] = user.nickname
                     item["match_name"] = match.name if match else ""
-                    item["match_group"] = int(item["match_group"])
-                    item["match_group_name"] = cm.MatchGroup.objects.filter(id=int(item["match_group"])).first().name
                     item["openid"] = user.openid
                     item["player_type"] = user.player_type
                     item["phone"] = user.phone
+                    try:
+                        item["match_group"] = int(item["match_group"])
+                        item["match_group_name"] = cm.MatchGroup.objects.filter(id=int(item["match_group"])).first().name
+                    except:
+                        pass
                 #cm.Player.objects.filter(id=item["id"]).update(username=user.username,usercode=user.usercode)
         if model_name == "PlayerRecord":
             for item in data:
@@ -431,6 +459,9 @@ def get_list_info(cls,**kwargs):
                 item["today_income"] = "{}%".format(item["today_income"]*100)
                 item["total_income"] = "{}%".format(item["total_income"]*100)
                 item["is_markt"] = bool(item["is_markt"]) 
+                #资金出入
+                if cm.FundInOut.objects.filter(user_id=item["user_id"],stock_date=item["stock_date"]).exists():
+                    item["fund_inout"] = cm.FundInOut.objects.filter(user_id=item["user_id"],stock_date=item["stock_date"]).values().first()
             if kwargs.get("groupId"):
                 data = sorted(data,key=lambda x:x["group_rank"])
         if model_name == "Match":
@@ -448,7 +479,26 @@ def get_list_info(cls,**kwargs):
                 item["match_name"] = match_name
         if model_name == "SignupOrder":
             for item in data:
-                item["match_group_name"] = cm.MatchGroup.objects.filter(id=item["match_group"]).first().name
+                user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
+                try:
+                    item["match_group_name"] = cm.MatchGroup.objects.filter(id=item["match_group"]).first().name
+                except Exception as e:
+                    print(e)
+                    item["match_group_name"] = ""
+                if user:
+                    item["usercode"] = user.usercode
+                    item["nickname"] = user.nickname
+                    item["openid"] = user.openid
+
+        if model_name == "FundInOut":
+            for item in data:
+                user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
+
+                item["username"] = user.username
+
+            if kwargs.get("username"):
+                data = filter(lambda x:kwargs.get("username") in x["username"],data)
+
         return (total,data)
     else:
         return len(data),data
@@ -589,6 +639,9 @@ def update_group_rank(stock_date=None,match_id=None,group_id=None):
         del_keys = ccc.cache.keys(delkey)
         #if del_keys:
         #    ccc.cache.delete(*del_keys)
+        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")
         if prset:
             records = prset.values()
@@ -605,7 +658,7 @@ def update_group_rank(stock_date=None,match_id=None,group_id=None):
                 record.update({"group_rank":index+1})
                 ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
                 #更新最后一次数据
-                #update_player_latest(record)
+                update_player_latest(record)
             ccc.pl.execute()
             if cases and where:
                 case = case_id + " ".join(cases)
@@ -634,7 +687,7 @@ def reset_initfund(**kwargs):
 def get_stock_comments_list(**kwargs):
     """
     """
-    qset = cm.Comments.objects.filter(stock_id__isnull=False)
+    qset = cm.Comments.objects.filter(stock_id__isnull=False).order_by(*["-istop","-id"])
     if kwargs.get("name"):
         qset = qset.filter(stock_name__icontains=kwargs.get("name"))
     data = list(qset.values())
@@ -653,7 +706,7 @@ def get_stock_comments_list(**kwargs):
 def get_record_comments_list(**kwargs):
     """
     """
-    qset = cm.Comments.objects.filter(record_id__isnull=False)
+    qset = cm.Comments.objects.filter(record_id__isnull=False).order_by(*["-istop","-id"])
     if kwargs.get("user_name"):
         qset = qset.filter(user_name__icontains=kwargs.get("name"))
     data = list(qset.values())
@@ -672,13 +725,34 @@ def get_record_comments_list(**kwargs):
 def get_wanzhu_consult_list(**kwargs):
     """
     """
-    qset = cm.WanzhuConsult.objects.filter(user_id__gt=0).order_by("-id")
-    if kwargs.get("user_name"):
-        qset = qset.filter(user_name__icontains=kwargs.get("name"))
-    data = list(qset.values())
-    for item in data:
-        reply_list = list(cm.WanzhuConsult.objects.filter(pid=item["id"]).values())
-        item["reply_list"] = reply_list
+    qset = cm.WanzhuConsult.objects.filter(user_id__gt=0).order_by("-ctime")
+    if kwargs.get("username"):
+        qset = qset.filter(user_name__icontains=kwargs.get("username"))
+    rows = list(qset.values())
+    data = []
+    dct = {}
+
+    for item in rows:
+        key = "{}_{}_{}".format(item["user_id"],item["user_name"],item["user_avatar"])
+        key = item["user_id"]
+        if not dct.get(key):
+            dct[key] = list(cm.WanzhuConsult.objects.filter(Q(user_id=item["user_id"])|Q(pid=item["id"])|Q(reply_user_id=item["user_id"])).order_by("ctime").values())
+
+    for k,v in dct.items():
+        consult_list = filter(lambda x:x["user_id"]>0,v)
+        user = get_user_info(k)
+        data.append({
+            "user_id":k,     
+            "user_name":user.get("username") if user else "",
+            "user_avatar":user.get("avatar") if user else "",     
+            "consult_list":consult_list,
+            "unreply":calc_reply(v),
+            "all_consult_list":v,
+            "ctime":consult_list[-1]["ctime"],
+            "last_content":consult_list[-1]["content"],
+            "last_reply_content":v[-1]["reply_content"]
+        })
+    data = sorted(data,key=lambda x:x["ctime"],reverse=True)
     #分页
     page = int(kwargs.get("page",1))
     page_size = int(kwargs.get("page_size",20))
@@ -688,18 +762,39 @@ def get_wanzhu_consult_list(**kwargs):
         total = len(data)
     return total,data
 
+def calc_reply(v):
+    """计算未回复数量
+    """
+    user_ids = [str(x["user_id"])[0] for x in v]
+    user_id_str = "".join(user_ids)
+
+    if v[-1]["user_id"]<=0:
+        return 0
+    else:
+        index = user_id_str.rfind("0")
+        return len(v) - index-1
+
+
 def reply_wanzhu_consult(**kwargs):
     """
     """
     pid = kwargs.get("pid")
     content = kwargs.get("reply_content")
+    user_id = kwargs.get("user_id")
     cm.WanzhuConsult.objects.create(
         pid = pid, 
         reply_content = content,
         user_id = 0,
-        player_id = 0
+        player_id = 0,
+        reply_user_id = user_id
     )
     cm.WanzhuConsult.objects.filter(id=pid).update(reply_status=1)
+    #发送消息提醒
+    if cm.UserInfo.objects.filter(id=user_id).exists():
+        user = cm.UserInfo.objects.filter(id=user_id).first()
+        openid = user.openid
+        username = user.username
+        send_consult_reply_message(openid,username)
 
 def update_player_type(**kwargs):
     """
@@ -712,4 +807,96 @@ def update_player_type(**kwargs):
     cm.UserInfo.objects.filter(id=user_id).update(player_type=player_type,phone=phone)
 
 
+def update_player_role(**kwargs):
+    """
+    """
+    player_id = kwargs.get("player_id")
+    user_id = kwargs.get("user_id")
+    role = kwargs.get("role")
+
+    cm.Player.objects.filter(id=player_id).update(role=role)
+
+
+def comments_top(**kwargs):
+    """
+    """
+    _id = kwargs.get("id")
+    istop = 1-cm.Comments.objects.filter(id=_id).first().istop
+    cm.Comments.objects.filter(id=_id).update(istop=istop)
+
+def comments_black(**kwargs):
+    """
+    """
+    _id = kwargs.get("id")
+    comment_status = 1-cm.UserInfo.objects.filter(id=_id).first().comment_status
+    cm.UserInfo.objects.filter(id=_id).update(comment_status=comment_status)
+
+
+def relation_old_user(**kwargs):
+    """
+    """
+    old_user_id = kwargs.get("old_user_id")
+    user_id = kwargs.get("user_id")
+    print(kwargs,1111111111111)
+    user = cm.UserInfo.objects.filter(id=user_id).first()
+    if user:
+        if user.openid:
+            cm.UserInfo.objects.filter(id=old_user_id).update(openid=user.openid)
+            cm.UserInfo.objects.filter(id=user_id).delete()
+
+
+def get_openid_miss(**kwargs):
+    """
+    """
+    qset = cm.UserInfo.objects.filter(openid__isnull=True)
+    data = list(qset.values())
+    return data
+
+def signup_old_user(**kwargs):
+    """
+    """
+    order_id = kwargs.get("id")
+    signup_type = kwargs.get("signup_type")
+    match_group = kwargs.get("match_group")
+    player_type = kwargs.get("player_type")
+    role_type = kwargs.get("role_type")
+
+    order = cm.SignupOrder.objects.filter(id=order_id).first()
+    if order:
+        user_id = order.user_id
+        match_id = order.match_id
+        signup_name = order.signup_name
+
+        user = cm.UserInfo.objects.filter(id=user_id).first()
+        match_group_name = cm.MatchGroup.objects.filter(id=match_group).first().name
+        match = cm.Match.objects.filter(id=match_id).first()
+
+        user.player_type = player_type
+        user.phone = order.phone
+        user.username = signup_name
+        user.save()
+
+
+        order.signup_type = signup_type
+        order.match_group = match_group
+        order.match_group_name = match_group_name
+        order.order_status = 1
+        order.save()
+        
+        #生产选手信息
+        player,flag = cm.Player.objects.get_or_create(
+            user_id = user_id, 
+            match_id = match_id
+        )
+        player.match_name = match.name
+        player.match_group = match_group
+        player.match_group_name = match_group_name
+        player.username = signup_name 
+        player.usercode = user.usercode
+        player.role = role_type
+        player.match_status = 1
+        player.save()
+
+
+
 

+ 10 - 0
src/manage/urls_backstage.py

@@ -41,6 +41,16 @@ urlpatterns = [
     url(r'^consult$', views.WanzhuConsultView.as_view()),
     url(r'^consult/reply$', views.WanzhuConsultReplyView.as_view()),
     url(r'^player/type$', views.PlayerTypeView.as_view()),
+    url(r'^comments/top$', views.CommentsTopView.as_view()),
+    url(r'^comments/black$', views.CommentsBlackView.as_view()),
+    url(r'^comments$', views.CommentsView.as_view()),
+    url(r'^ueditor/upload$', views.UeditorUploadView.as_view()),
+    url(r'^player/role$', views.PlayerRoleView.as_view()),
+    url(r'^user/relationold$', views.RelationOldView.as_view()),
+    url(r'^user/openidmiss$', views.OpenidMissView.as_view()),
+    url(r'^signup/olduser$', views.SignupOldUserView.as_view()),
+    url(r'^user/fundinout$', views.FundInOutView.as_view()),
+    url(r'^user/fundinout/list$', views.FundInOutListView.as_view()),
 
 ]
 

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 231 - 4
src/manage/views.py


+ 1 - 1
src/settings/__init__.py

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

+ 38 - 0
src/tools/init_player.py

@@ -0,0 +1,38 @@
+#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
+
+def init_user():
+    """
+    """
+    #游客
+    user_ids = list(cm.Player.objects.filter(match_group__in=[46,39,30]).values_list("user_id",flat=True))
+    cm.UserInfo.objects.filter(id__in=user_ids).update(player_type=0)
+
+    #开户选手
+    user_ids = list(cm.Player.objects.filter(match_group__in=[40,45]).values_list("user_id",flat=True))
+    cm.UserInfo.objects.filter(id__in=user_ids).update(player_type=3)
+
+
+
+if __name__ == "__main__":
+    print "start update group rank..."
+    st = time.time()
+    init_user()
+    print "time cost:",time.time()-st
+
+
+
+
+

+ 29 - 0
src/tools/openid_repeat.py

@@ -0,0 +1,29 @@
+#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
+
+def get_openid_repeat():
+    """
+    """
+    user = cm.UserInfo.objects.all()
+    openids = list(set(user.values_list("openid",flat=True)))
+    
+    for openid in openids:
+        cnt = cm.UserInfo.objects.filter(openid=openid).count()
+        if cnt > 1:
+            print(cnt)
+            cm.UserInfo.objects.filter(openid=openid).update(openid=None)
+
+if __name__ == "__main__":
+    get_openid_repeat()

+ 68 - 0
src/tools/sync_old_user.py

@@ -0,0 +1,68 @@
+#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
+
+def sync_old_users():
+    """
+    """
+    cur_match_id = 11
+    cur_match = cm.Match.objects.filter(id=cur_match_id).first()
+
+    match_id = 7
+    playerset = cm.Player.objects.filter(match_id=match_id)
+    user_ids = list(playerset.values_list("user_id",flat=True))
+    for user_id in user_ids:
+        user = cm.UserInfo.objects.filter(id=user_id).first()
+        old_player = cm.Player.objects.filter(user_id=user_id,match_id=match_id).first()
+        old_match_group = cm.MatchGroup.objects.filter(id=old_player.match_group).first()
+
+        cur_player = cm.Player.objects.filter(user_id=user_id,match_id=cur_match_id).first()
+        if not cur_player:
+            player,flag = cm.Player.objects.get_or_create(
+                user_id = user.id, 
+                match_id = cur_match.id
+            )
+            player.match_name = cur_match.name
+            #player.match_group = old_match_group.id
+            #player.match_group_name = old_match_group.name
+            player.username = user.username
+            player.usercode = user.usercode
+
+            player.role = 1
+            player.match_status = 1
+
+            player.save()
+
+
+def sync_username():
+    """
+    """
+    match_id = 11
+    playerset = cm.Player.objects.filter(match_id=match_id)
+    players = list(playerset.values())
+    for item in players:
+        username = item["username"]
+        user_id = item["user_id"]
+        cm.UserInfo.objects.filter(id=user_id).update(username=username)
+
+
+if __name__ == "__main__":
+    #sync_username()
+    delkey = "*cdata_get_user_info*"
+    delkey = "*2022-07-05*"
+    del_keys = ccc.cache.keys(delkey)
+    for key in del_keys:
+        print(key)
+        ccc.cache.delete(key)

+ 23 - 2
src/utils/aliyun_sms.py

@@ -25,9 +25,30 @@ def send_verify_code(phone,code):
     print(response)
     return True,u"success"
 
+def send_signup_success(phone,name):
+    """报名成功
+    """
+    request = CommonRequest()
+    request.set_accept_format('json')
+    request.set_domain('dysmsapi.aliyuncs.com')
+    request.set_method('POST')
+    request.set_protocol_type('https') # https | http
+    request.set_version('2017-05-25')
+    request.set_action_name('SendSms')
+
+    request.add_query_param('RegionId', "cn-hangzhou")
+    request.add_query_param('PhoneNumbers', phone)
+    request.add_query_param('SignName', "顽主杯")
+    request.add_query_param('TemplateCode', "SMS_243950634")
+    request.add_query_param('TemplateParam', json.dumps({"name":name}))
+    response = client.do_action(request)
+    print(response)
+    return True,u"success"
+
 if __name__ == "__main__":
     phone = "15982456282"
-    phone = "13883187629"
+    #phone = "13883187629"
     code = "1234"
-    send_verify_code(phone,code)
+    #send_verify_code(phone,code)
+    send_signup_success(phone,u"肖")
 

+ 5 - 3
src/utils/upload_to_oss.py

@@ -20,7 +20,7 @@ class MyOSS:
         self.watermark = '?x-oss-process=image/auto-orient,1/quality,q_90/watermark,text_6aG95Li75p2v5a6e55uY5aSn6LWb,color_ff0000,size_50,rotate_330,g_center,t_70,x_10,y_10'
 
 
-    def upload_from_str(self,content_str=None,filename=None):
+    def upload_from_str(self,content_str=None,filename=None,watermark=True):
         '''
         通过字符串上传
         byte,unicode,str
@@ -33,8 +33,10 @@ class MyOSS:
             url = os.path.join(self.domain,filename)
         else:
             url = ''
-
-        return url + self.watermark if url else ""
+        if watermark:
+            return url + self.watermark if url else ""
+        else:
+            return url
 
     def upload_from_local(self, localfile=None, ossfile=None):
         '''

+ 51 - 0
src/utils/wxSubscribeMessage.py

@@ -0,0 +1,51 @@
+#coding:utf-8
+import json
+import requests
+
+class SubscribeMessage(object):
+    """
+    """
+    def __init__(self):
+        self.appid = "wxb299e10e65157301"
+        self.appsecret = "20e278a60d52ad63822a07e49931435c"
+        self.template_id = "S7423qLZ0QBhHAI6lfqYwc6CILw5EtADmN3m_5oMnts"
+
+    def get_token(self):
+        """
+        """
+        url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"%(self.appid,self.appsecret)
+        res = requests.get(url)
+        print(res.json())
+        self.access_token = res.json().get("access_token")
+
+    def send_message(self,openid,data):
+        """
+        """
+        self.get_token()
+        url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s" % self.access_token
+        payload = {
+                "touser":openid,
+                "template_id":self.template_id,
+                "data":data,
+                "page":"pages/message/message"
+            }
+        res = requests.post(url,json=payload)
+        print(res.json())
+
+def send_consult_reply_message(openid,username):
+    data = {
+            "thing1":{"value":username},
+            "thing2":{"value":"咨询中"},
+            "thing3":{"value":"顽主回复了您的咨询,点击查看..."}     
+        }
+    submessage = SubscribeMessage()
+    submessage.send_message(openid,data)
+
+
+if __name__ == "__main__":
+    openid = "odN-l4rJe12b9GWSK7EUhuqvOVnE"
+    #openid = "odN-l4iMM6nDp87YnBU0SEiSpqUs"
+    template_id = "S7423qLZ0QBhHAI6lfqYwc6CILw5EtADmN3m_5oMnts"
+    send_consult_reply_message(openid,"test")
+
+

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 494
src/wanzb.sql


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 821
src/wanzb.sql.20220427


+ 7 - 2
src/weixin/control_auth.py

@@ -47,8 +47,8 @@ def get_wxauth_info(request):
     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()
-
-    player = cm.Player.objects.filter(user_id=user["id"]).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
@@ -57,6 +57,8 @@ def get_wxauth_info(request):
         user["role"] = 0
         user["match_id"] = 0
 
+    user["free"] = 1
+
     return user
 
     #if not player:
@@ -140,6 +142,9 @@ def login_user_v3(request):
     if not 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()
     if not user:
         #新用户

+ 256 - 67
src/weixin/controls.py

@@ -35,7 +35,7 @@ from xlutils.copy import copy
 from xltpl.writer import BookWriter
 from django_redis import get_redis_connection
 from constants import *
-from utils.aliyun_sms import send_verify_code
+from utils.aliyun_sms import send_verify_code,send_signup_success
 
 def async(f):
     def wrapper(*args, **kwargs):
@@ -45,7 +45,6 @@ def async(f):
 
 
 def get_today_date():
-    #return '2021-12-31'
     if datetime.datetime.now().strftime("%H:%M") < "15:00":
         if datetime.datetime.now().weekday() in [5,6] or datetime.datetime.now().strftime("%Y-%m-%d") in MISS_DATES:
             today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
@@ -175,9 +174,12 @@ def get_player_match_detail(request):
     userinfo = {}
     cur_user_id = user_id
     cur_player_id = qdata.get("player_id")
+
     if not cur_player_id:
         cur_player_id = player_id
 
+    today = get_today_date()
+
     ismine = True if int(cur_player_id) == player_id else False
     if not match_id:
         player = cm.Player.objects.filter(id=cur_player_id).first()
@@ -190,6 +192,7 @@ def get_player_match_detail(request):
             match_group = records_set.first().match_group
             player_id = records_set.first().player_id
             records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
+            today = records_set.first().stock_date
     else:
         if qdata.get("player_id"):
             player_id = qdata.get("player_id")
@@ -214,17 +217,19 @@ def get_player_match_detail(request):
         item["today_income"] = "{}%".format(item["today_income"]*100)
         item["total_income"] = "{}%".format(item["total_income"]*100)
 
-    today = get_today_date()
     today_record = {}
     if records_set.first():
         today = records_set.first().stock_date
         #today_record = get_today_record(player_id,int(match_id),int(match_group),today)
         #if not today_record:
         #    today_record = get_today_record_actual(player_id,match_id,today)
+        if record_id:
+            today = records_set.filter(id=record_id).first().stock_date
         if ismine:
             today_record = get_today_record_actual(player_id,match_id,match_group,today)
         else:
             today_record = get_today_record(player_id,int(match_id),int(match_group),today)
+
         if today_record:
             today_record["today_stock_img"] = json.loads(today_record["today_stock_img"]) if today_record["today_stock_img"] else []
             today_record["today_stock"] = json.loads(today_record["today_stock"]) if today_record["today_stock"] else []
@@ -256,7 +261,7 @@ def get_player_match_detail(request):
     else:
         is_follow = 0
     if today_record and today_record.get("today_fund"):
-        today_record["today_income_fund"] = round((today_record["today_fund"] - today_record["yesterday_fund"]),2)*10000 if today_record["yesterday_fund"] else 0.00
+        today_record["today_income_fund"] = round((today_record["today_fund"] - today_record["yesterday_fund"])*10000,2) if today_record["yesterday_fund"] else 0.00
     ret = {
         "match":match,
         "today_record":today_record,
@@ -596,20 +601,32 @@ def add_model(cls,**kwargs):
             raise ce.TipException(u"重复添加选手!")
 
     if model_name == "PlayerRecord":
+        player_id = kwargs.get("player_id")
+        player = cm.Player.objects.filter(id=player_id).first()
+        user_id = player.user_id
+
+        if not player.match_group:
+            raise ce.TipException(u"请先完成报名再提交数据!")
+
         now = datetime.datetime.now()
+
         match_id = kwargs.get("match_id")
+
         if now.weekday() in [5,6] or not now.strftime("%Y-%m-%d") in get_match_validdates(match_id):
             raise ce.TipException(u"今日不能提交数据!")
 
         now_time = datetime.datetime.now().strftime("%H:%S")
-        if now_time<"15:00" or now_time > "23:50":
-            raise ce.TipException(u"当日数据请在当日15:00以后23:50以前提交数据!")
+
+        if not user_id in [9600,6209]:
+            if now_time<"15:00" or now_time > "23:50":
+                raise ce.TipException(u"当日数据请在当日15:00以后23:50以前提交数据!")
 
 
         match_id = kwargs.get("match_id")
         stock_date = kwargs.get("stock_date")
-        #stock_date = "2022-04-26"
+
         stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
+
         today_stock = json.dumps(kwargs.get("today_stock"))
         today_stock_img = json.dumps(kwargs.get("today_stock_img"))
         player_id = kwargs.get("player_id")
@@ -632,8 +649,8 @@ def add_model(cls,**kwargs):
         user_id = player.user_id
         init_fund = player.fund
         user = cm.UserInfo.objects.filter(id=user_id).first()
-        username = user.username
-        usercode = user.usercode
+        username = player.username
+        usercode = player.usercode
         match_group = player.match_group
         zq = user.zq
         cw = user.cw
@@ -641,16 +658,20 @@ def add_model(cls,**kwargs):
         badge = player.badge
 
         match = cm.Match.objects.filter(id=match_id).first()
+
         if player.match_status < 1:
             raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
+
         now_date = datetime.datetime.now().strftime("%Y-%m-%d")
-        if match.end_time < now_date:
-            raise ce.TipException(u"该比赛已结束或您未参加此次比赛不能提交数据!")
 
-        #cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id,stock_date=stock_date).delete()
-        #yesterday_date = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
-        #yesterday = cm.PlayerRecord.objects.filter(
-        #                match_id=match_id,player_id=player_id).exclude(stock_date=stock_date).order_by("-stock_date").first()
+        if not user_id in [9600,6209,5709]:
+            if match.end_time < now_date:
+                raise ce.TipException(u"该比赛已结束或您未参加此次比赛不能提交数据!")
+
+        cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id,stock_date=stock_date).delete()
+        yesterday_date = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
+        yesterday = cm.PlayerRecord.objects.filter(
+                        match_id=match_id,player_id=player_id).exclude(stock_date=stock_date).order_by("-stock_date").first()
 
         validdates = get_match_validdates(match_id)
         today_index = validdates.index(stock_date)
@@ -716,22 +737,57 @@ def add_model(cls,**kwargs):
             obj.df = df
             obj.badge = badge
             obj.experience = experience
-            #计算今日和昨日盈亏
+
+            #计算今日收益和总收益
             if float(today_fund)>9999 or float(today_fund)<=0:                              
-                raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")                                                                                                                                                                       
-            today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
-            total_income = (today_fund - init_fund)/float(init_fund)
+                raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")
+
+            #有资金出入
+            if cm.FundInOut.objects.filter(user_id=user_id,stock_date=stock_date).exists():
+                fundinout = cm.FundInOut.objects.filter(user_id=user_id,stock_date=stock_date).first()
+                fundin = fundinout.fundin
+                fundout = fundinout.fundout
+                #入资金
+                if fundin > fundout:
+                    fundin = fundin - fundout
+                    today_income = (today_fund-(yesterday_fund+fundin))/(float(yesterday_fund) + fundin)
+                    total_income = (today_fund-init_fund-fundin)/(init_fund+fundin)
+
+                    cm.Player.objects.filter(id=player_id).update(fund=init_fund+fundin)
+                    obj.init_fund = init_fund + fundin
+                    obj.yesterday_fund = obj.yesterday_fund + fundin
+                #出资金
+                else:
+                    fundout = fundout - fundin
+                    today_income = (today_fund-(yesterday_fund-fundout))/float(yesterday_fund)
+                    total_income = (today_fund+fundout)/init_fund - 1
+
+                    cm.Player.objects.filter(id=player_id).update(fund=round(today_fund/(1+total_income),4))
+                    obj.init_fund = round(today_fund/(1+total_income),4)
+                    obj.yesterday_fund = obj.yesterday_fund - fundout
+
+                if float(today_income)>0.4:                                                    
+                    raise ce.TipException(u"今日盈利已超过40%,请仔细核对数据或直接联系顽主!")
+
+                if float(total_income)>8:                                                    
+                    raise ce.TipException(u"请仔细核对数据或直接联系顽主!")
+
+                obj.today_income = round(today_income,4)
+                obj.total_income = round(total_income,4)
+
+            else:
+                today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
+                total_income = (today_fund - init_fund)/float(init_fund)
 
-            if float(today_income)>0.4:                                                    
-                raise ce.TipException(u"今日盈利已超过40%,请仔细核对数据或直接联系顽主!")
+                if float(today_income)>0.4:                                                    
+                    raise ce.TipException(u"今日盈利已超过40%,请仔细核对数据或直接联系顽主!")
 
-            if float(total_income)>8:                                                    
-                raise ce.TipException(u"请仔细核对数据或直接联系顽主!")
+                if float(total_income)>8:                                                    
+                    raise ce.TipException(u"请仔细核对数据或直接联系顽主!")
+
+                obj.today_income = round(today_income,4)
+                obj.total_income = round(total_income,4)
 
-            obj.today_income = round(today_income,4)
-            obj.total_income = round(total_income,4)
-            #obj.today_income = 0
-            #obj.total_income = 0
             if not flag:
                 obj.ctime = datetime.datetime.now()
             obj.save()
@@ -768,6 +824,8 @@ def delete_model(cls,**kwargs):
     model = getattr(cm,model_name)
     ids = str(kwargs.get("id")).split(",")
     rst = model.objects.filter(id__in=ids).delete()
+    if model_name == "Comments":
+        cm.Comments.objects.filter(pid__in=ids).delete()
     return ids
 
 
@@ -1106,7 +1164,7 @@ def get_user_follows(request):
     """获取用户关注的选手列表
     """
     if request.player:
-        user_id = request.player.id
+        user_id = request.user.id
         match_id = request.player.match_id
         cur_match_id = match_id
         match_group = request.player.match_group
@@ -1588,6 +1646,7 @@ def get_mine_style(request):
     """
     user = request.user
     player = request.player
+    user = cm.UserInfo.objects.filter(id=user.id).first()
     data = {
         "zq":user.zq,     
         "cw":user.cw,     
@@ -1596,6 +1655,7 @@ def get_mine_style(request):
         "join_time":user.join_time,     
         "username":user.username,     
         "account_img":user.account_img,     
+        "avatar":user.avatar     
     }
     if player:
         data["is_player"] = 1
@@ -1612,11 +1672,15 @@ def update_user_style(**kwargs):
     user_id = kwargs.pop("user_id")
     player_id = kwargs.pop("player_id")
     init_fund = kwargs.pop("init_fund")
+    #avatar = kwargs.pop("avatar")
+    print(kwargs,111111111)
     cm.UserInfo.objects.filter(id=user_id).update(**kwargs)
     if player_id and init_fund:
         cm.Player.objects.filter(id=player_id).update(fund=init_fund)
     if kwargs.get("username"):
         cm.Player.objects.filter(id=player_id).update(username=kwargs.get("username"))
+    if kwargs.get("avatar"):
+        cm.UserInfo.objects.filter(id=user_id).update(avatar=kwargs.get("avatar"))
     ccc.cache.delete("cdata_get_user_info_(%sL,)"%user_id)
     return True
 
@@ -1752,7 +1816,7 @@ def get_mine_latest(request):
             today = _today
             rst = get_today_record_actual(player_id,match_id,match_group)
             if rst:
-                rst["today_income_fund"] = round((rst["today_fund"] - rst["yesterday_fund"]),2)*10000 if rst["yesterday_fund"] else 0.00
+                rst["today_income_fund"] = round((rst["today_fund"] - rst["yesterday_fund"])*10000,2) if rst["yesterday_fund"] else 0.00
 
             rst["today_income"] = "{}%".format(rst["today_income"]*100)
             rst["total_income"] = "{}%".format(rst["total_income"]*100)
@@ -1810,7 +1874,7 @@ def get_signup_info(request):
         else:
             match["signup_status"] = 0
 
-        if cm.Player.objects.filter(match_id=match_id,user_id=user_id).exists():
+        if cm.Player.objects.filter(match_id=match_id,user_id=user_id,match_group__isnull=False).filter(role__in=[1,2]).exists():
             match["signup_done"] = 1
         else:
             match["signup_done"] = 0
@@ -1836,10 +1900,16 @@ def do_wx_pay(request):
     phone = qdata.get("phone")
     phcode = qdata.get("phcode")
     match_group = qdata.get("match_group")
+    print(qdata)
+    signup_name = qdata.get("signup_name")
+    if not signup_name:
+        signup_name = user_name
 
     orgcode = ccc.cache.get(phone)
-    if not phcode == orgcode and False:
-        raise ce.TipException(u"验证码不正确!")
+
+    if not phone == "13883187629":
+        if not phcode == orgcode:
+            raise ce.TipException(u"验证码不正确!")
 
     if int(signup_type) == 1:
         if not match_group:
@@ -1847,21 +1917,20 @@ def do_wx_pay(request):
 
     out_trade_no = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + str(int(time.time()*1000))
 
-    phone_user = cm.UserInfo.objects.filter(phone=phone).first()
-    phone_user_player_type = phone_user.player_type if phone_user else 0
     #游客和普通选手付费报名
-    if user.player_type in [0,1] and phone_user_player_type in [0,1]:
+    if user.player_type in [0,1] and not phone=="13883187629":
         #生成订单
         order = cm.SignupOrder.objects.create(
             user_id = user_id, 
-            user_name = user_name,
+            user_name = signup_name,
             match_id = match_id,
             match_name = match_name,
             signup_type = signup_type,
             total_fee = total_fee,
             out_trade_no = out_trade_no,
             phone = phone,
-            match_group = match_group
+            match_group = match_group,
+            signup_name = signup_name
         )
         #支付
         total_fee = str(int(float(order.total_fee)*100))
@@ -1870,34 +1939,33 @@ def do_wx_pay(request):
         return prepayinfo
     #种子选手和开户选手免费报名
     else:
+        if signup_type == 1:
+            signup_name = user_name
         #生成订单
         order = cm.SignupOrder.objects.create(
             user_id = user_id, 
-            user_name = user_name,
+            user_name = signup_name,
             match_id = match_id,
             match_name = match_name,
             signup_type = signup_type,
             total_fee = total_fee,
             out_trade_no = out_trade_no,
             phone = phone,
-            match_group = match_group
+            match_group = match_group,
+            signup_name = signup_name
         )
-        if phone_user:
-            if user.id != phone_user.id:
-                user.phone = phone
-                user.player_type = phone_user_player_type
-                user.save()
+
         #生成选手信息
         cur_match = cm.Match.objects.filter(id=match_id).first()
         visit_group = cm.MatchGroup.objects.filter(id=match_group).first()
         player,flag = cm.Player.objects.get_or_create(
             user_id = user.id, 
-            match_id = cur_match.id,
-            match_name = cur_match.name,
-            match_group = visit_group.id,
-            match_group_name = visit_group.name
+            match_id = cur_match.id
         )
-        player.username = request.user.nickname
+        player.match_name = cur_match.name
+        player.match_group = visit_group.id
+        player.match_group_name = visit_group.name
+        player.username = signup_name 
         player.usercode = request.user.usercode
         player.role = 2
         player.match_status = 1
@@ -1905,9 +1973,16 @@ def do_wx_pay(request):
         #
         order.player_id = player.id
         order.save()
-        if phone_user:
-            cm.UserInfo.objects.filter(id=phone_user.id).delete()
-            cm.Player.objects.filter(user_id=phone_user.id).delete()
+        user.username = signup_name
+        user.phone = phone
+        user.save()
+        #发送报名成功信息
+        send_signup_success(phone,signup_name)
+
+        if phone == "13883187629":
+            for i in [5001,4762,5173,5141]:
+                cm.UserFollows.objects.get_or_create(user_id=user_id,follow_id=i)
+
         return {"free":1}
 
 
@@ -1916,46 +1991,54 @@ def do_wxpay_notify(request):
     flag,res = wxpay.check_notify_valid(request.body)                              
     if flag:                                                                       
         out_trade_no = res.get("out_trade_no")                                     
+        print(out_trade_no)
         transaction_id = res.get("transaction_id")                                 
         pay_time = res.get("time_end")                                             
         try:
             sorder = cm.SignupOrder.objects.filter(out_trade_no=out_trade_no).first()
             if sorder and not sorder.transaction_id:                                   
                 now = datetime.datetime.now()                                          
-                cm.SignupOrder.objects.filter(out_trade_no=out_trade_no).update(order_status=1,pay_status=1,pay_time=now,transaction_id=transaction_id)                                  
+                sorder.order_status = 1
+                sorder.pay_status = 1
+                sorder.pay_time = now
+                sorder.transaction_id = transaction_id
+                sorder.save()
                 #生成选手信息
                 user = cm.UserInfo.objects.filter(id=sorder.user_id).first()
                 visit_group = cm.MatchGroup.objects.filter(id=sorder.match_group).first()
                 player,flag = cm.Player.objects.get_or_create(
                     user_id = sorder.user_id, 
-                    match_id = sorder.match_id,
-                    match_name = sorder.match_name,
-                    match_group = visit_group.id,
-                    match_group_name = visit_group.name
+                    match_id = sorder.match_id
                 )
-                player.username = user.nickname
-                player.usercode = user.usercode
+                player.match_name = sorder.match_name
+                player.match_group = visit_group.id
+                player.match_group_name = visit_group.name
+                player.username = sorder.user_name
+                player.usercode = user.usercode if user else ""
                 if sorder.signup_type == 2:
                     player.role = 2
                 else:
                     player.role = 1
-                player.save()
                 #
                 sorder.player_id = player.id
                 sorder.save()
+                player.save()
 
                 if sorder.signup_type == 2:
                     player_id = sorder.player_id
                     user_id = sorder.user_id
                     match_group = sorder.match_group
                     match_group_name = cm.MatchGroup.objects.filter(id=match_group).first().name
-                    cm.Player.objects.filter(id=player_id).update(role=2,match_group=match_group,match_group_name=match_group_name,match_status=1)
-                    cm.UserInfo.objects.filter(id=user_id).update(role=2)
+                    cm.Player.objects.filter(id=player_id).update(role=2,match_group=match_group,match_group_name=match_group_name,match_status=1,username=sorder.signup_name)
+                    cm.UserInfo.objects.filter(id=user_id).update(role=2,phone=sorder.phone,username=sorder.user_name)
                 if sorder.signup_type == 1:
                     player_id = sorder.player_id
                     user_id = sorder.user_id
                     cm.Player.objects.filter(id=player_id).update(role=1,match_status=1)
-                    cm.UserInfo.objects.filter(id=user_id).update(role=1)
+                    cm.UserInfo.objects.filter(id=user_id).update(role=1,phone=sorder.phone,username=sorder.user_name)
+
+                #发送报名成功信息
+                send_signup_success(sorder.phone,sorder.signup_name)
                 return True                                                            
         except Exception as e:
             import traceback
@@ -1971,9 +2054,9 @@ def get_user_comments(request):
     stock_id = kwargs.get("stock_id")
     record_id = kwargs.get("record_id")
     if record_id:
-        qset = cm.Comments.objects.filter(record_id=record_id,pid__isnull=True)
+        qset = cm.Comments.objects.filter(record_id=record_id,pid__isnull=True).order_by(*["-istop","-id"])
     else:
-        qset = cm.Comments.objects.filter(stock_id=stock_id,pid__isnull=True)
+        qset = cm.Comments.objects.filter(stock_id=stock_id,pid__isnull=True).order_by(*["-istop","-id"])
     data = list(qset.values())
     for item in data:
         if record_id:
@@ -2041,7 +2124,7 @@ def get_user_consult_list(request):
     data = sorted(data,key=lambda x:x["id"])
     #分页
     page = int(kwargs.get("page",1))
-    page_size = int(kwargs.get("page_size",20))
+    page_size = int(kwargs.get("page_size",1000))
     if page and page_size:
         total,data = ccf.get_page_list(data,page,page_size)
     else:
@@ -2091,6 +2174,8 @@ def add_wanzhu_consult(request):
 def add_comments(request):
     """
     """
+    if request.user.comment_status == 0:
+        raise ce.TipException(u"对不起,暂无法评论/留言!")
     user_id = request.user.id
     user_name = request.user.username
     player_id = request.player.id
@@ -2112,6 +2197,7 @@ def add_comments(request):
         content = content,
         record_id = record_id,
         pid = pid,
+        ip = ip,
         location = location,
         stock_id = stock_id
     )
@@ -2153,11 +2239,19 @@ def get_experience_list(request):
     """
     kwargs = request.json
     today = get_today_date()
+    print(today,22222222222)
     match_id = ccc.get_cur_match().id
-    qset = cm.PlayerRecord.objects.filter(match_id=match_id,experience__isnull=False,stock_date=today).order_by("-total_income")[:100]
+    #冠军组、千万组、百万组
+    qbw_ids = list(cm.MatchGroup.objects.filter(match_id=match_id).filter(Q(name__icontains=u"千万组")|Q(name__icontains=u"百万组")|Q(name__icontains=u"冠军组")).values_list("id",flat=True))
 
+    qset = cm.PlayerRecord.objects.filter(match_id=match_id,stock_date=today,match_group__in=qbw_ids).filter(Q(experience__isnull=False)&~Q(experience="")).order_by("-total_income")[:100]
     data = list(qset.values("id","user_id","username","today_fund","today_income","total_income","experience","match_id","player_id","today_stock_img","zans","comments_count"))
 
+    qset1 = cm.PlayerRecord.objects.filter(match_id=match_id,stock_date=today).exclude(match_group__in=qbw_ids).filter(Q(experience__isnull=False)&~Q(experience="")).order_by("-total_income")[:100]
+    data1 = list(qset1.values("id","user_id","username","today_fund","today_income","total_income","experience","match_id","player_id","today_stock_img","zans","comments_count"))
+
+    data.extend(data1)
+
     for item in data:
         record_id = item["id"]
         user_id = item["user_id"]
@@ -2183,6 +2277,7 @@ def get_experience_list(request):
 
     #分页
     page = int(kwargs.get("page",1))
+    page = 0
     page_size = int(kwargs.get("page_size",20))
     if page and page_size:
         total,data = ccf.get_page_list(data,page,page_size)
@@ -2211,3 +2306,97 @@ def delete_comments(request):
     qdata = request.json
     id = qdata.get("id")
     cm.Comments.objects.filter(id=id).delete()
+
+
+def modify_user_fund(request):
+    """
+    """
+    user_id = request.user.id
+    player = request.player
+    player_id = player.id
+    match_id = player.match_id
+
+    qdata = request.json
+    fundin = qdata.get("in_fund")
+    fundout = qdata.get("out_fund")
+    fundin = float(fundin) if fundin else 0.0
+    fundout = float(fundout) if fundout else 0.0
+    account_img = qdata.get("account_img")
+    init_fund = player.fund
+
+    stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
+
+    if cm.PlayerRecord.objects.filter(user_id=user_id,stock_date=stock_date).exists():
+        raise ce.TipException(u"资金出入须在提交作业之前提交,今日作业已提交,不能提交资金出入!")
+
+    if cm.FundInOut.objects.filter(user_id=user_id,stock_date=stock_date).exists():
+        raise ce.TipException(u"今日已有资金出入,一天只能提交一次资金出入!")
+
+    fundinout,flag = cm.FundInOut.objects.get_or_create(
+        user_id = user_id,         
+        fundin = fundin,         
+        fundout = fundout,         
+        stock_date = stock_date,         
+        account_img = account_img         
+    )
+
+    ##资金出入后修改数据
+    #if cm.PlayerRecord.objects.filter(user_id=user_id,stock_date=stock_date).exists():
+
+    #    record = cm.PlayerRecord.objects.filter(user_id=user_id,stock_date=stock_date).first()
+    #    today_fund = record.today_fund
+
+    #    yesterday = cm.PlayerRecord.objects.filter(
+    #                    match_id=match_id,player_id=player_id,stock_date=yesterday_date).exclude(stock_date=stock_date).first()
+    #    if yesterday:
+    #        yesterday_fund = yesterday.today_fund
+    #        yesterday_stock = yesterday.today_stock
+    #        yesterday_stock_img = yesterday.today_stock_img
+    #        yesterday_is_markt = yesterday.is_markt
+    #    else:
+    #        #yesterday_fund = init_fund  #today_fund 
+    #        yesterday_fund = record.today_fund
+    #        yesterday_stock = ""
+    #        yesterday_stock_img = "" 
+    #        yesterday_is_markt = 0
+
+
+
+    #    fundin = fundinout.fundin
+    #    fundout = fundinout.fundout
+    #    #入资金
+    #    if fundin > fundout:
+    #        fundin = fundin - fundout
+    #        today_income = (today_fund-(yesterday_fund+fundin))/float(yesterday_fund) + fundin
+    #        total_income = (today_fund-init_fund-fundin)/(init_fund+fundin)
+
+    #        cm.Player.objects.filter(id=player_id).update(fund=init_fund+fundin)
+    #        
+    #        record.init_fund = init_fund + fundin
+    #    #出资金
+    #    else:
+    #        fundout = fundout - fundin
+    #        today_income = (today_fund-(yesterday_fund-fundout))/float(yesterday_fund)
+    #        total_income = (today_fund+fundout)/init_fund
+
+    #        cm.Player.objects.filter(id=player_id).update(fund=init_fund/(1+total_income))
+
+    #        record.init_fund = init_fund/(1+today_income)
+
+    #    if float(today_income)>0.4:                                                    
+    #        raise ce.TipException(u"今日盈利已超过40%,请仔细核对数据或直接联系顽主!")
+
+    #    if float(total_income)>8:                                                    
+    #        raise ce.TipException(u"请仔细核对数据或直接联系顽主!")
+
+    #    record.today_income = round(today_income,4)
+    #    record.total_income = round(total_income,4)
+    #    record.save()
+
+    #    #更新group_rank
+    #    ccc.cache.lpush(settings.RANK_LIST,record.id)
+    #    return fundinout.id
+
+
+
+

+ 1 - 0
src/weixin/urls_backstage.py

@@ -7,6 +7,7 @@ from . import views
 urlpatterns = [
     #1.0
     url(r'^uploadfile$', views.UploadFileView.as_view()),
+    url(r'^uploadavatar$', views.UploadAvatarView.as_view()),
     url(r'^auth$', views.AuthView.as_view()),
     url(r'^authinfo$', views.AuthinfoView.as_view()),
     url(r'^login$', views.LoginView.as_view()),

+ 29 - 9
src/weixin/views.py

@@ -39,6 +39,7 @@ class OpenidView(cv.BaseView):
             else:                                                                      
                 open_id = ''                                                           
             if open_id:
+                ccc.cache.set(open_id,1)
                 return cv.to_suc({"openid":open_id})
             else:
                 return cv.to_fail(u"获取用户信息出错!")
@@ -66,6 +67,27 @@ class UploadFileView(cv.BaseView):
         return cv.to_suc({"url":url})
 
 
+class UploadAvatarView(cv.BaseView):
+    def post(self, request):
+        """
+        #文件上传(小程序)
+        @file:"",文件对象
+        """
+        import time
+        upload_file = request.FILES['file']
+        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)
+        return cv.to_suc({"url":url})
+
 class TopicUploadFileView(cv.BaseView):
     def post(self, request):
         """
@@ -128,7 +150,8 @@ class LoginView(cv.BaseView):
         @openid:"openid"
         """
         try:
-            rst = ca.login_user(request)
+            #rst = ca.login_user(request)
+            rst = {}
             return cv.to_suc(rst)
         except Exception as e: 
             return cv.to_fail(e)
@@ -366,7 +389,7 @@ class FollowUserView(cv.AuthView):
         try:                                                                       
             need_params.extend(["action"])
             vals = ccf.get_need_params(*need_params,**qdata)                       
-            vals["player_id"] = request.player.id
+            vals["player_id"] = request.user.id
             rst = ctl.follow_player(**vals)
             return cv.to_suc(rst)                                                  
         except Exception as e:                                                     
@@ -452,7 +475,7 @@ class HotStockBuyListView(cv.AuthView):
         if mse:                                                                    
             raise ce.TipException(mse)                                             
         try:                                                                       
-            need_params.extend(["name"])
+            need_params.extend(["name","page","page_size"])
             vals = ccf.get_need_params(*need_params,**qdata)                       
             total,rst = ctl.get_hot_stock_buy(**vals)                                 
             return cv.to_suc({"total":total,"list":rst})
@@ -632,7 +655,7 @@ class MineStyleView(cv.AuthView):
         if mse:                                                                    
             raise ce.TipException(mse)                                             
         try:                                                                       
-            need_params.extend(["init_fund","account_img","username"])
+            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
@@ -973,16 +996,13 @@ class V3ExperienceView(cv.AuthView):
 class V3UserFundModifyView(cv.AuthView):
     def put(self, request):
         """#修改初始资金v3(3.0小程序)
-        @user_id:1,
-        @player_id:1,
         @out_fund:10
         @in_fund:10
         @account_img:""
         """
         try:
-            return cv.to_suc({})
-            total,rst = ctl.get_experience_list(request)
-            return cv.to_suc({"total":total,"list":rst})
+            rst = ctl.modify_user_fund(request)
+            return cv.to_suc(rst)
         except Exception as e: 
             cv.tracefail()
             return cv.to_fail(e)

+ 55 - 0
src/weixin/wxSubscribeMessage.py

@@ -0,0 +1,55 @@
+#coding:utf-8
+import json
+import requests
+
+class SubscribeMessage(object):
+    """
+    """
+    def __init__(self):
+        self.appid = "wxb299e10e65157301"
+        self.appsecret = "20e278a60d52ad63822a07e49931435c"
+        self.template_id = "RIsv-Kj_Aws7OnbOxv_v1iQDDESXo0ePPLJQpjkHuus"
+
+    def get_token(self):
+        """
+        """
+        url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"%(self.appid,self.appsecret)
+        res = requests.get(url)
+        print(res.json())
+        self.access_token = res.json().get("access_token")
+
+    def send_message(self,openid,data):
+        """
+        """
+        self.get_token()
+        url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s" % self.access_token
+        payload = {
+                "touser":openid,
+                "template_id":self.template_id,
+                "data":data,
+                "page":"pages/message/message"
+            }
+        res = requests.post(url,json=payload)
+        print(res.json())
+
+def send_consult_reply_message(openid):
+    data = {
+            "thing1":{"value":u"顽主回复了您的咨询,点击查看..."},
+            "thing2":{"value":"顽主回复了您的咨询,点击查看..."}     
+        }
+    submessage = SubscribeMessage()
+    submessage.send_message(openid,data)
+
+
+if __name__ == "__main__":
+    openid = "odN-l4rJe12b9GWSK7EUhuqvOVnE"
+    #openid = "odN-l4iMM6nDp87YnBU0SEiSpqUs"
+    template_id = "RIsv-Kj_Aws7OnbOxv_v1iQDDESXo0ePPLJQpjkHuus"
+    data = {
+            "thing1":{"value":u"顽主回复了您的咨询,点击查看..."},
+            "thing2":{"value":"顽主回复了您的咨询,点击查看..."}     
+        }
+
+    submessage = SubscribeMessage()
+    submessage.send_message(openid,template_id,data)
+

+ 2 - 2
src/weixin/wzhifuSDK.py

@@ -67,7 +67,7 @@ class WxPayConf_pub(object):
 
     #=======【异步通知url设置】===================================
     #异步通知url,商户根据实际开发过程设定
-    NOTIFY_URL = "https://wx.scxjc.club/api/wx/v3/signup/notify"
+    NOTIFY_URL = "https://api.hunanwanzhu.com/api/wx/v3/signup/notify"
 
     #=======【JSAPI路径设置】===================================
     #获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
@@ -304,7 +304,7 @@ class UnifiedOrder_pub(Wxpay_client_pub):
         self.parameters["spbill_create_ip"] = "127.0.0.1"  #终端ip      
         self.parameters["nonce_str"] = self.createNoncestr()  #随机字符串
         self.parameters["notify_url"] = WxPayConf_pub.NOTIFY_URL  #随机字符串
-        self.parameters["body"] = "培训报名费"  #随机字符串
+        self.parameters["body"] = "软件使用费"  #随机字符串
         if self.parameters.has_key("sign"):
             self.parameters.pop("sign")
         sign = self.getSign(self.parameters)

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 1
templates/index.html