瀏覽代碼

Merge branch 'v3.0-app' of http://118.190.145.217:3000/xiaojincai/wanzb_v3_api into v3.0-app

xjconline 2 年之前
父節點
當前提交
1953851d2c

+ 3 - 0
src/common/core_views.py

@@ -55,6 +55,8 @@ class CusDjangoJSONEncoder(json.JSONEncoder):
             return str(o)
         elif isinstance(o, uuid.UUID):
             return str(o)
+        elif isinstance(o, None):
+            return ""
         else:
             return super(DjangoJSONEncoder, self).default(o)
 
@@ -193,6 +195,7 @@ def to_suc(data={},code=0):
     info = {}
     info["data"] = data
     info["code"] = code
+    info = eval(str(info).replace("None",'""'))
     return JsonResponse(info,encoder=CusDjangoJSONEncoder)
 
 def to_fail(e=None):

+ 38 - 2
src/common/models.py

@@ -327,6 +327,7 @@ class UserStock(models.Model):
     stock_id = models.IntegerField(u"股票id", blank=True,null=True)
     stock_date = models.CharField(u"持股日期", max_length=255,blank=True,null=True)
     stock_name = models.CharField(u"股票名称", max_length=255,blank=True,null=True)
+    fund = models.FloatField(u"持股金额",blank=True,null=True)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -425,6 +426,8 @@ class Consult(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)
     view_status = models.SmallIntegerField(u"0/未读,1/已读",blank=True,null=True,default=0)
+    width = models.IntegerField(u"宽度",blank=True,null=True)
+    height = models.IntegerField(u"高度",blank=True,null=True)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -447,6 +450,8 @@ class WanzhuConsult(models.Model):
     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)
+    width = models.IntegerField(u"宽度",blank=True,null=True)
+    height = models.IntegerField(u"高度",blank=True,null=True)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -565,6 +570,37 @@ class UserMatch(models.Model):
 #        abstract = True
 
 
-
-
+class BaikeCategory(models.Model):                                                                                                                                                                                                                                                
+    """百科分类                                                                    
+    """                                                                            
+    name = models.CharField(u"政府名称", max_length=255, blank=True,null=True)  
+    parent_id = models.IntegerField(u"父级id",blank=True,null=True)                
+    parent_name = models.CharField(u"父级名称",blank=True,null=True,max_length=255)
+                                                                                   
+    ctime = models.DateTimeField(u"创建时间",auto_now_add=True)                    
+                                                                                   
+    class Meta:                                                                    
+        db_table = "baike_category"                                                     
+        verbose_name = u"百科分类"                                                 
+        app_label = "common"     
+
+
+class BaikeDetail(models.Model):                                                                                                                                                                                                                                                
+    """百科词条详情                                                                    
+    """                                                                            
+    category_id = models.IntegerField(u"父级id",blank=True,null=True)                
+    category_name = models.CharField(u"父级名称", max_length=255, blank=True,null=True)  
+    name = models.CharField(u"词条名称", max_length=255, blank=True,null=True)  
+    intro = models.CharField(u"词条简介", max_length=255, blank=True,null=True)  
+    content = models.TextField(u"词条详情", max_length=255, blank=True,null=True)  
+    cid = models.IntegerField(u"创建人id",blank=True,null=True)                
+    cname = models.CharField(u"创建人名称", max_length=255, blank=True,null=True)  
+    status = models.SmallIntegerField(u"0/待发布,1/已发布",default=0)
+                                                                                   
+    ctime = models.DateTimeField(u"创建时间",auto_now_add=True)                    
+                                                                                   
+    class Meta:                                                                    
+        db_table = "baike_detail"                                                     
+        verbose_name = u"百科词条详情"                                                 
+        app_label = "common"     
 

+ 36 - 11
src/manage/controls.py

@@ -280,6 +280,8 @@ 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 == "BaikeCategory":
+            cm.BaikeDetail.objects.filter(category_id__in=ids).delete()
 
     return ids
 
@@ -401,7 +403,6 @@ 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(Q(user_name__icontains=kwargs.get("username"))|Q(phone__icontains=kwargs.get("username"))|Q(transaction_id__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"))
@@ -417,6 +418,14 @@ def get_list_info(cls,**kwargs):
         if kwargs.get("username"):
             qset = qset.filter(name__icontains=kwargs.get("username"))
 
+    if model_name == "BaikeDetail":
+        if kwargs.get("name"):
+            qset = qset.filter(name__icontains=kwargs.get("name"))
+        if kwargs.get("status"):
+            qset = qset.filter(status=kwargs.get("status"))
+        if kwargs.get("category_id"):
+            qset = qset.filter(category_id=kwargs.get("category_id"))
+
     if model_name == "PlayerRecord":
         data = list(qset.order_by("-total_income").values())
     else:
@@ -435,12 +444,6 @@ def get_list_info(cls,**kwargs):
                     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:
                 user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
@@ -504,11 +507,7 @@ def get_list_info(cls,**kwargs):
                 item["usercode"] = user.usercode
 
             if kwargs.get("username"):
-                print(111111111111111111)
-                print(data)
-                print(kwargs.get("username"))
                 data = filter(lambda x:x["username"] == str(kwargs.get("username")) or kwargs.get("username") ==x["usercode"],data)
-                print(data,22222222222222)
 
         return (total,data)
     else:
@@ -968,3 +967,29 @@ def batch_update_player_latest(record):
         #win_rate = wincnt/float(total) if total else 0.0
         #win_rate = round(win_rate,3)
         #ccc.cache.hset(key,"win_rate",win_rate)
+
+def get_sub_category(pid):
+    """
+    """
+    qset = cm.BaikeCategory.objects.filter(parent_id=pid)
+    qdata = list(qset.values())
+    if qdata:
+        for subitem in qdata:
+            subitem["type"] = "ent"
+            subitem["children"] = get_sub_category(subitem["id"])                                                                    
+    return qdata
+
+def get_baike_category_tree(**kwargs):
+	"""
+	"""
+	parents = list(cm.BaikeCategory.objects.filter(parent_id__isnull=True).values())
+	for item in parents:
+		item["children"] = get_sub_category(item["id"])
+	return parents
+
+
+def get_baike_list_by_category(**kwargs):
+    category_id = kwargs.get("category_id")
+    qset = cm.BaikeDetail.objects.filter(category_id=category_id)
+    data = list(qset.values("id","name"))
+    return data

+ 4 - 0
src/manage/urls_backstage.py

@@ -52,6 +52,10 @@ urlpatterns = [
     url(r'^user/fundinout$', views.FundInOutView.as_view()),
     url(r'^user/fundinout/list$', views.FundInOutListView.as_view()),
     url(r'^user/consult/detail$', views.UserConsultDetailView.as_view()),
+    url(r'^baike/category$', views.BaikeCategoryView.as_view()),
+    url(r'^baike/category/list$', views.BaikeCategoryListView.as_view()),
+    url(r'^baike/detail$', views.BaikeDetailView.as_view()),
+    url(r'^baike/detail/list$', views.BaikeDetailListView.as_view()),
 
 ]
 

+ 191 - 0
src/manage/views.py

@@ -1342,3 +1342,194 @@ class UserConsultDetailView(cv.AdminView):
         except Exception as e:
             cv.tracefail()
             return cv.to_fail(e)
+
+
+class BaikeCategoryListView(cv.AdminView):
+    def get(self, request):
+        """#百科词条分类列表(平台管理后台)
+        @name:"股票名称"
+        @page:1
+        @page_size:20
+        """
+        qdata = request.json
+        try:
+            rst = ctl.get_baike_category_tree(**qdata)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class BaikeDetailView(cv.AdminView):
+    def get(self, request):
+        """#词条详情(平台管理后台)
+        @id:1
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.get_detail_info(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def post(self,request):
+        """#新增词条(平台管理后台)
+        @user_id:"用户id"
+        @fund:"资金"
+        @match_id:"比赛id"
+        @match_group:"比赛分组"
+        """
+        qdata = request.json
+        need_params = ["name","content","category_id","category_name"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            vals["cid"] = 0
+            vals["cname"] = u"系统管理员"
+            if qdata.get("action") == "publish":
+                vals["status"] = 1
+            rst = ctl.add_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def put(self,request):
+        """#修改词条(平台管理后台)
+        @id:"1"
+        @fund:"资金"
+        @match_id:"比赛id"
+        @match_group:"比赛分组"
+        """
+        qdata = request.json
+        need_params = ["id","name","content","category_id","category_name"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            if qdata.get("action") == "publish":
+                vals["status"] = 1
+            rst = ctl.update_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def delete(self,request):
+        """#删除词条(平台管理后台)
+        @id:"1",多个逗号分隔
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.delete_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+class BaikeDetailListView(cv.AdminView):
+    def get(self, request):
+        """#百科词条列表(平台管理后台)
+        @name:""
+        @page:1
+        @page_size:20
+        """
+        qdata = request.json
+        try:
+            total,rst = ctl.get_list_info(self,**qdata)
+            return cv.to_suc({"total":total,"list":rst})
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class BaikeCategoryView(cv.AdminView):
+    def get(self, request):
+        """#词条分类详情(平台管理后台)
+        @id:1
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.get_detail_info(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def post(self,request):
+        """#新增词条分类(平台管理后台)
+        @user_id:"用户id"
+        @fund:"资金"
+        @match_id:"比赛id"
+        @match_group:"比赛分组"
+        """
+        qdata = request.json
+        need_params = ["name"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            need_params.extend(["parent_id","parent_name"])
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.add_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def put(self,request):
+        """#修改词条分类(平台管理后台)
+        @id:"1"
+        @fund:"资金"
+        @match_id:"比赛id"
+        @match_group:"比赛分组"
+        """
+        qdata = request.json
+        need_params = ["id","name"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            need_params.extend(["parent_id","parent_name"])
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.update_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def delete(self,request):
+        """#删除词条分类(平台管理后台)
+        @id:"1",多个逗号分隔
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.delete_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)

文件差異過大導致無法顯示
+ 1083 - 0
src/nohup.out


+ 40 - 0
src/utils/aliyunpush.py

@@ -0,0 +1,40 @@
+#-*-coding:utf-8 -*-
+
+from aliyunsdkcore.client import AcsClient
+from aliyunsdkcore.acs_exception.exceptions import ClientException
+from aliyunsdkcore.acs_exception.exceptions import ServerException
+from aliyunsdkpush.request.v20160801.PushRequest import PushRequest
+
+class AliyunPush(object):
+    def __init__(self):
+        self.ACCESSKEYID = "LTAI5t8bioQxGXB1jtVugJcU"
+        self.ACCESSKEYSECRET = "OdGWSBRjkJxaPjgmE38eQ8nzkI6nRk"
+        self.REGIONID = "cn-shenzhen"
+        self.client = AcsClient(self.ACCESSKEYID,self.ACCESSKEYSECRET,self.REGIONID)
+        self.request = PushRequest()
+        self.request.set_accept_format("json")
+        self.request.set_iOSApnsEnv('DEV')
+        self.request.set_AppKey("333793060")
+
+    def push_notice_by_userid(self,user_id,title,body,params):
+        self.request.set_PushType("NOTICE")
+        self.request.set_DeviceType("ALL")
+        self.request.set_Target("ACCOUNT")
+        self.request.set_TargetValue(str(user_id))
+        self.request.set_Body(title)
+        self.request.set_Title(body)
+        self.request.set_iOSExtParameters(params)
+        response = self.client.do_action_with_exception(self.request)
+        return response
+
+aliyunpush = AliyunPush()
+
+
+if __name__ == "__main__":
+    user_id = 6209
+    title = "测试"
+    body = "测试"
+    params = {"type":"message","id":user_id}
+    res = aliyunpush.push_notice_by_userid(user_id,title,body,params)
+    print(params,res)
+

+ 11 - 4
src/weixin/control_auth.py

@@ -104,17 +104,24 @@ def login_user_v3(request):
     openid = info.get('openid')
     avatar = info.get('avatarUrl')
     nickname = info.get('nickName')
-    phone = info.get('phone','11111111111')
+    phone = info.get('phone','')
     phcode = info.get('phcode')
-    unionid = info.get('unionid')
+    unionid = info.get('unionid','')
 
-    if not openid and not unionid:
+    #if not openid and not unionid:
+    #    raise ce.TipException(u"缺少openid!")
+    if not openid and not phone:
         raise ce.TipException(u"缺少openid!")
 
     #if not ccc.cache.get(openid):
     #    raise ce.TipException(u"非法openid!")
 
-    user = cm.UserInfo.objects.filter(Q(openid=openid)|Q(phone=phone)).first()
+    print(phone,openid)
+    if phone:
+        user = cm.UserInfo.objects.filter(Q(phone=phone)).order_by("-id").first()
+    else:
+        user = cm.UserInfo.objects.filter(Q(openid=openid)).order_by("-id").first()
+    print(user.id)
     if not user:
         #新用户
         usercode = gen_code()

+ 226 - 14
src/weixin/controls.py

@@ -219,6 +219,7 @@ def get_player_match_detail(request):
         item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
         item["today_income"] = "{}%".format(item["today_income"]*100)
         item["total_income"] = "{}%".format(item["total_income"]*100)
+        item["avatar"] = get_user_info(item["user_id"])["avatar"]
 
     today_record = {}
     if records_set:
@@ -571,8 +572,6 @@ def get_group_rank_list(request):
     else:
         new_players = sorted(new_players,key=lambda x:x["org_total_income"],reverse=True)
 
-    #new_players = []
-
     #分页
     page = int(kwargs.get("page",0))
     page_size = int(kwargs.get("page_size",50))
@@ -733,6 +732,8 @@ def add_model(cls,**kwargs):
                             player_id = player.id,
                             stock_date = stock_date
                         )
+                        usobj.fund = ts["fund"]
+                        usobj.save()
                         ts["stock_id"] = stock_id
                         new_stock_list.append(ts)
                     except Exception as e:
@@ -773,21 +774,27 @@ def add_model(cls,**kwargs):
                 #入资金
                 if fundin > fundout:
                     fundin = fundin - fundout
-                    today_income = (today_fund-(yesterday_fund+fundin))/(float(yesterday_fund) + fundin)
+                    if yesterday:
+                        today_income = (today_fund-(yesterday_fund+fundin))/(float(yesterday_fund) + fundin)
+                        obj.yesterday_fund = obj.yesterday_fund + fundin
+                    else:
+                        today_income = 0.0
                     total_income = (today_fund-init_fund-fundin)/(init_fund+fundin)
 
                     cm.Player.objects.filter(user_id=user_id,match_id=match_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)
+                    if yesterday:
+                        today_income = (today_fund-(yesterday_fund-fundout))/float(yesterday_fund)
+                        obj.yesterday_fund = round(today_fund/(1+today_income),4)
+                    else:
+                        today_income = 0.0
                     total_income = (today_fund+fundout-init_fund)/init_fund
 
                     cm.Player.objects.filter(user_id=user_id,match_id=match_id).update(fund=round(today_fund/(1+total_income),4))
                     obj.init_fund = round(today_fund/(1+total_income),4)
-                    obj.yesterday_fund = round(today_fund/(1+today_income),4)
 
                 if float(today_income)>0.6:                                                    
                     raise ce.TipException(u"今日盈利已超过60%,请仔细核对数据或直接联系顽主!")
@@ -1293,19 +1300,20 @@ def get_hot_stock_buy(**kwargs):
     qset = cm.UserStock.objects.filter(stock_date=stock_date)
     if kwargs.get("name"):
         qset = cm.UserStock.objects.filter(stock_name__icontains=kwargs.get("name"))
-    qset = qset.values("stock_id","stock_name").annotate(count=Count("stock_id")).order_by("-count")
+    qset = qset.values("stock_id","stock_name").annotate(count=Count("stock_id"),total_fund=Sum("fund")).order_by("-count")
     data = []
     for q in qset:
         stock_id = q["stock_id"]
         count = q["count"]
         stock_name = q.get("stock_name")
+        total_fund = q["total_fund"]
 
         comments_count = ccc.cache.get("%s_comments" % stock_id)
         choice_count = ccc.cache.get("%s_choices" % stock_id)
         comments_count = comments_count if comments_count else 0
         choice_count = choice_count if choice_count else 0
 
-        data.append({"stock_name":stock_name,"id":stock_id,"count":count,"comments_count":comments_count,"choice_count":choice_count})
+        data.append({"stock_name":stock_name,"id":stock_id,"count":count,"comments_count":comments_count,"choice_count":choice_count,"total_fund":total_fund})
 
 
     page = int(kwargs.get("page",1))
@@ -1725,7 +1733,7 @@ def update_user_style(**kwargs):
     """
     user_id = kwargs.pop("user_id")
     #player_id = kwargs.pop("player_id")
-    init_fund = kwargs.pop("init_fund")
+    #init_fund = kwargs.pop("init_fund")
     #avatar = kwargs.pop("avatar")
 
     cm.UserInfo.objects.filter(id=user_id).update(**kwargs)
@@ -2237,15 +2245,21 @@ def add_wanzhu_consult(request):
     openid = request.user.get("openid")
     qdata = request.json
     content = qdata.get("cotent")
+    width = qdata.get("width")
+    height = qdata.get("height")
     pid = qdata.get("pid")
 
-    obj = cm.WanzhuConsult.objects.create(
+    wanzhu_obj = cm.WanzhuConsult.objects.create(
         user_id = user_id, 
         user_name = user_name, 
         user_avatar = user_avatar, 
         content = content,
         pid = pid
     )
+    wanzhu_obj.width = width
+    wanzhu_obj.height = height
+    wanzhu_obj.save()
+
     obj,flag = cm.Consult.objects.get_or_create(
         user_id = user_id, 
     )
@@ -2254,6 +2268,8 @@ def add_wanzhu_consult(request):
     obj.content = content
     obj.view_status = 0
     obj.reply_status = 0
+    obj.width = width
+    obj.height = height
     obj.ctime = datetime.datetime.now()
     obj.save()
     #自动回复
@@ -2455,19 +2471,25 @@ def modify_user_fund(request):
         #入资金
         if fundin > fundout:
             fundin = fundin - fundout
-            today_income = round((today_fund-(yesterday_fund+fundin))/(float(yesterday_fund) + fundin),4)
+            if yesterday:
+                today_income = round((today_fund-(yesterday_fund+fundin))/(float(yesterday_fund) + fundin),4)
+                yesterday_fund = yesterday_fund + fundin
+            else:
+                today_income = 0.0
             total_income = round((today_fund-init_fund-fundin)/(init_fund+fundin),4)
 
             init_fund = init_fund + fundin
-            yesterday_fund = yesterday_fund + fundin
         #出资金
         else:
             fundout = fundout - fundin
-            today_income = round((today_fund-(yesterday_fund-fundout))/float(yesterday_fund),4)
+            if yesterday:
+                today_income = round((today_fund-(yesterday_fund-fundout))/float(yesterday_fund),4)
+                yesterday_fund = round(today_fund/(1+today_income),4)
+            else:
+                today_income = 0.0
             total_income = round((today_fund+fundout-init_fund)/init_fund,4)
 
             init_fund = round(today_fund/(1+total_income),4)
-            yesterday_fund = round(today_fund/(1+today_income),4)
 
         today_income = "{}%".format(today_income*100)
         total_income = "{}%".format(total_income*100)
@@ -2639,3 +2661,193 @@ def get_user_follows_v3(request):
         return total,data
     else:
         return len(data),data
+
+
+def get_latest_match_info(request):
+    """
+    """
+    cur_match = cm.Match.objects.filter(match_status=3).order_by("-id").values().first()
+    cur_match_id = cur_match.get("id")
+    groups = list(cm.MatchGroup.objects.filter(match_id=cur_match_id,is_active=1).order_by("order").values())
+    cur_match["groups"] = groups
+    return cur_match
+
+def get_article_info(**kwargs):
+    """
+    """
+    _id = kwargs.get("id")
+    rst = cm.Article.objects.filter(id=_id).values().first()
+    rst["url"] = "https://www.hunanwanzhu.com/topic/article.html?id="+str(_id)
+    return rst
+
+
+def get_profit_list(**kwargs):
+    """盈亏列表
+    """
+    stock_date = kwargs.get("stock_date")
+    match_id = kwargs.get("match_id")
+    _type = kwargs.get("type")
+
+    if not stock_date:
+        stock_date = get_today_date()
+
+    qset = cm.PlayerRecord.get_db_model(match_id).objects.filter(stock_date=stock_date)
+
+    #if _type == "win":
+    #    qset = qset.filter(today_income__gte=0).order_by("-today_income")
+    #if _type == "loss":
+    #    qset = qset.filter(today_income__lt=0).order_by("today_income")
+
+    data = list(qset.values())
+    for item in data:
+        item["win_loss"] = item["today_fund"] - item["yesterday_fund"]
+        item["total_win_loss"] = item["today_fund"] - item["init_fund"]
+    if _type == "win":
+        data = sorted(data,key=lambda x:x["win_loss"],reverse=True)
+    if _type == "loss":
+        data = sorted(data,key=lambda x:x["win_loss"])
+    if _type == "total_win":
+        data = sorted(data,key=lambda x:x["total_win_loss"],reverse=True)
+    if _type == "total_loss":
+        data = sorted(data,key=lambda x:x["total_win_loss"])
+
+    page = int(kwargs.get("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)
+    else:
+        total = len(data)
+    #data = list(qset.values())
+
+    return total,data
+
+
+def get_group_rank_list_v3(request):
+    """排名列表
+    """
+    qdata = request.json
+    kwargs = qdata
+
+    group_id = qdata.get("id")
+    match_id = qdata.get("match_id")
+
+    match_id = cm.MatchGroup.objects.filter(id=group_id).first().match_id
+
+    today = qdata.get("stock_date")
+    if not today:
+        today = get_today_date()
+
+    match = get_match_info(match_id)
+    group = get_group_info(group_id)
+    players = get_match_group_users(match_id,group_id)
+    new_players = []
+    for player in players:
+        user_id = player["user_id"]
+        username = player["username"]
+        match_group = group_id
+        today_record = ccc.get_today_record(user_id,match_id,match_group,today)
+
+        if today_record:
+            player.update(today_record)
+            player["username"] = username
+            player["org_today_income"] = player["today_income"]
+            player["org_total_income"] = player["total_income"]
+            player["total_income"] = "{}%".format(player["total_income"]*100)
+            player["today_income"] = "{}%".format(player["today_income"]*100)
+            player["fund"] = round(player["fund"],4)
+            player["init_fund"] = round(player["init_fund"],4)
+            player["today_fund"] = round(player["today_fund"],4)
+            player["today_stock_img"] = json.loads(player["today_stock_img"]) if player["today_stock_img"] else []
+            #player["win_rate"] = calc_win_rate(user_id,match_id)
+            player["zan_count"] = player["zans"]
+            new_players.append(player)
+
+    if kwargs.get("order_by") == "today_income__asc":
+        new_players = sorted(new_players,key=lambda x:x["org_today_income"])
+    elif kwargs.get("order_by") == "today_income__desc" :
+        new_players = sorted(new_players,key=lambda x:x["org_today_income"],reverse=True)
+    elif kwargs.get("order_by") == "total_income__asc": 
+        new_players = sorted(new_players,key=lambda x:x["org_total_income"])
+    elif kwargs.get("order_by") == "total_income__desc": 
+        new_players = sorted(new_players,key=lambda x:x["org_total_income"],reverse=True)
+    else:
+        new_players = sorted(new_players,key=lambda x:x["org_total_income"],reverse=True)
+
+    #分页
+    page = int(kwargs.get("page",0))
+    page_size = int(kwargs.get("page_size",50))
+    if page and page_size:
+        total,new_players = ccf.get_page_list(new_players,page,page_size)
+    else:
+        total = len(new_players)
+    return total,new_players
+
+
+def get_article_type_list(**kwargs):
+    rst = [u"每日点评",u"冠军心得",u"腰斩心得",u"牛人专访"]
+    return rst
+
+
+def get_wanzhu_consult_list(**kwargs):
+    """
+    """
+    qset = cm.Consult.objects.all().order_by("-ctime")
+    if kwargs.get("username"):
+        qset = qset.filter(user_name__icontains=kwargs.get("username"))
+    if kwargs.get("reply_status"):
+        qset = qset.filter(reply_status=kwargs.get("reply_status"))
+    if kwargs.get("content"):
+        qset = qset.filter(Q(content__icontains=kwargs.get("content"))|Q(reply_content__icontains=kwargs.get("content")))
+    data = list(qset.values())
+    for item in data:
+        user_id = item["user_id"]
+        userinfo = get_user_info(user_id)
+        if userinfo:
+            item["user_code"] = userinfo.get("usercode")
+
+    #分页
+    page = int(kwargs.get("page",1))
+    page_size = int(kwargs.get("page_size",20))
+    if page and page_size:
+        total,data = ccf.get_page_list(data,page,page_size)
+    else:
+        total = len(data)
+    return total,data
+
+
+def get_sub_category(pid):
+    """
+    """
+    qset = cm.BaikeCategory.objects.filter(parent_id=pid)
+    qdata = list(qset.values())
+    if qdata:
+        for subitem in qdata:
+            subitem["type"] = "ent"
+            subitem["children"] = get_sub_category(subitem["id"])                                                                    
+    return qdata
+
+
+def get_baike_category_tree(**kwargs):
+	"""
+	"""
+	parents = list(cm.BaikeCategory.objects.filter(parent_id__isnull=True).values())
+	for item in parents:
+		item["children"] = get_sub_category(item["id"])
+	return parents
+
+
+def get_baike_list_by_category(**kwargs):
+    category_id = kwargs.get("category_id")
+    qset = cm.BaikeDetail.objects.filter(category_id=category_id)
+    data = list(qset.values("id","name"))
+    return data
+
+
+def get_baike_detail(**kwargs):
+    #_id = kwargs.get("id")
+    category_id = kwargs.get("category_id")
+    data = list(cm.BaikeDetail.objects.filter(category_id=category_id).values())
+    return data
+
+

+ 12 - 0
src/weixin/urls_backstage.py

@@ -73,6 +73,18 @@ urlpatterns = [
     url(r'^v3/stock/user/list$', views.StockUserListView.as_view()),
     url(r'^v3/user/inout/list$', views.UserInOutListView.as_view()),
     url(r'^v3/user/follow/list$', views.V3FollowUserListView.as_view()),
+    #3.0app
+    url(r'^v3/match/latest$', views.V3LatestMatchView.as_view()),
+    url(r'^v3/stock$', views.V3StockView.as_view()),
+    url(r'^v3/stock/players/list$', views.V3StockPlayersListView.as_view()),
+    url(r'^v3/article/detail$', views.V3ArticleDetailView.as_view()),
+    url(r'^v3/profit/rank/list$', views.ProfitRankListView.as_view()),
+    url(r'^v3/group/rank$', views.V3GroupRankView.as_view()),
+    url(r'^v3/article/type/list$', views.V3ArticleTypeListView.as_view()),
+    url(r'^v3/consult/list$', views.ConsultListView.as_view()),
+    url(r'^v3/baike/category/list$', views.BaikeCategoryListView.as_view()),
+    url(r'^v3/baike/list$', views.BaikeListView.as_view()),
+    url(r'^v3/baike/detail$', views.BaikeDetailView.as_view()),
 
 ]
 

+ 196 - 0
src/weixin/views.py

@@ -1100,3 +1100,199 @@ class V3FollowUserListView(cv.AuthView):
         except Exception as e:                                                     
             cv.tracefail()                                                         
             return cv.to_fail(e)
+
+
+class V3LatestMatchView(cv.AuthView):
+    def get(self, request):
+        """#最新赛事与分组信息(3.0app)
+        """
+        try:
+            rst = ctl.get_latest_match_info(request)
+            return cv.to_suc(rst)
+        except Exception as e: 
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class V3StockView(cv.AuthView):
+    def get(self, request):
+        """#股票詳情(3.0小程序)
+        @id:1
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            #vals["user_id"] = request.user.get("id")
+            stock_id = vals.get("id")
+            rst = ctl.get_stock_info(stock_id)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class V3StockPlayersListView(cv.AuthView):
+    def get(self, request):
+        """#股票持仓列表(3.0小程序)
+        @id:1
+        @page:1
+        @page_size:1
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            need_params.extend(["page","page_size","stock_date"])
+            vals = ccf.get_need_params(*need_params,**qdata)
+            vals["user_id"] = request.user.get("id")
+            vals["stock_id"] = vals.get("id")
+            rst = ctl.get_stock_players(**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class V3ArticleDetailView(cv.BaseView):                                                    
+    def get(self, request):                                                        
+        """#文章详情(APP)                                                       
+        @id:1                                                                      
+        """                                                                        
+        qdata = request.json                                                       
+        need_params = ["id"]                                                       
+        mse = ccf.check_params(*need_params,**qdata)                               
+        if mse:                                                                    
+            raise ce.TipException(mse)                                             
+        try:                                                                       
+            vals = ccf.get_need_params(*need_params,**qdata)                       
+            rst = ctl.get_article_info(**vals)                                 
+            return cv.to_suc(rst)                                                  
+        except Exception as e:                                                     
+            cv.tracefail()                                                         
+            return cv.to_fail(e)
+
+
+class ProfitRankListView(cv.BaseView):                                                    
+    def get(self, request):                                                        
+        """#盈亏列表(小程序)                                                       
+        @id:1                                                                      
+        """                                                                        
+        qdata = request.json                                                       
+        try:                                                                       
+            total,rst = ctl.get_profit_list(**qdata)                                 
+            return cv.to_suc({"total":total,"list":rst})
+        except Exception as e:                                                     
+            cv.tracefail()                                                         
+            return cv.to_fail(e)
+
+
+class V3GroupRankView(cv.AuthView):
+    def get(self, request):
+        """#分组排名(小程序)
+        """
+        try:
+            total,rst = ctl.get_group_rank_list_v3(request)
+            return cv.to_suc({"total":total,"list":rst})
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class V3ArticleTypeListView(cv.BaseView):                                                    
+    def get(self, request):                                                        
+        """#盈亏列表(小程序)                                                       
+        @id:1                                                                      
+        """                                                                        
+        qdata = request.json                                                       
+        try:                                                                       
+            rst = ctl.get_article_type_list(**qdata)                                 
+            return cv.to_suc(rst)
+        except Exception as e:                                                     
+            cv.tracefail()                                                         
+            return cv.to_fail(e)
+
+
+class ConsultListView(cv.AuthView):
+    def get(self, request):
+        """#顽主咨询列表(平台管理后台)
+        @name:"股票名称"
+        @page:1
+        @page_size:20
+        """
+        qdata = request.json
+        try:
+            total,rst = ctl.get_wanzhu_consult_list(**qdata)
+            return cv.to_suc({"total":total,"list":rst})
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class BaikeCategoryListView(cv.AuthView):
+    def get(self, request):
+        """#百科词条分类列表(平台管理后台)
+        @name:"股票名称"
+        @page:1
+        @page_size:20
+        """
+        qdata = request.json
+        try:
+            rst = ctl.get_baike_category_tree(**qdata)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class BaikeListView(cv.AuthView):
+    def get(self, request):
+        """#百科词条列表(平台管理后台)
+        @category_id:1,分类id
+        """
+        qdata = request.json
+        try:
+            rst = ctl.get_baike_list_by_category(**qdata)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class BaikeDetailView(cv.AuthView):
+    def get(self, request):
+        """#百科词条列表(平台管理后台)
+        @id:1,百科id
+        """
+        qdata = request.json
+        try:
+            rst = ctl.get_baike_detail(**qdata)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+    def post(self, request):
+        """#新增百科词条(3.0小程序)
+        """
+        qdata = request.json
+        now = datetime.datetime.now()
+        need_params = ["name","content"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            vals["cid"] = request.user.get("id",0)
+            vals["cname"] = request.user.get("username","")
+            rst = ctl.add_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)